Created
March 15, 2013 02:55
-
-
Save ibdknox/5167176 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(window) { | |
var fromMessage = function(message) { | |
return {client: message[0], | |
command: message[1], | |
data: message[2]}; | |
} | |
var toMessage = function(prev, command, data) { | |
return [prev.client, | |
command, | |
data]; | |
} | |
var cache = []; | |
function replacer(key, value) { | |
if(cache.length > 20) { | |
return; | |
} | |
if(window.jQuery && value instanceof jQuery) { | |
return "[jQuery $(" + value.selector + ")]"; | |
} | |
if(value instanceof Element) { | |
return "[Element " + value.tagName.toLowerCase() + (value.id != "" ? "#" : "") + value.id + "]"; | |
} | |
if(typeof(value) == "object") { | |
if(cache.indexOf(value) > -1) { | |
return "circular"; | |
} | |
cache.push(value); | |
return value; | |
} | |
return value; | |
} | |
function safeStringify(res) { | |
cache = []; | |
return JSON.stringify(res, replacer); | |
} | |
var thisScript = document.getElementById("lt_ws"); | |
var parts = thisScript.src.split(":"); | |
if(parts.length > 2) { | |
var host = parts[0]+":"+parts[1]; | |
var port = parts[2].split("/")[0]; | |
} else { | |
var host = parts[0]; | |
var port = parts[1].split("/")[0]; | |
} | |
function init() { | |
var socket = io.connect(host + ':' + port); | |
socket.on("connect", function() { | |
socket.emit("init", {name: window.location.host, | |
types: ["js","css","html"], | |
commands: ["editor.eval.js", | |
"editor.eval.cljs.exec", | |
"editor.eval.html", | |
"editor.eval.css"]}); | |
}); | |
socket.on('client.close', function(message) { | |
socket.disconnect(); | |
}); | |
socket.on('editor.eval.css', function (message) { | |
var prev = fromMessage(message); | |
var name = prev.data.name.replace(".", "-"); | |
var existing = document.querySelector("#" + name); | |
if(existing) { | |
existing.parentNode.removeChild(existing); | |
} | |
var neue = document.createElement("style"); | |
neue.id = name; | |
neue.type = "text/css"; | |
neue.innerHTML = prev.data.code; | |
document.head.appendChild(neue); | |
socket.emit("result", toMessage(prev, "editor.eval.css.result", {result: name})); | |
}); | |
socket.on('editor.eval.js', function (message) { | |
var prev = fromMessage(message); | |
try { | |
var res = eval.call(window, prev.data.code); | |
socket.emit("result", toMessage(prev,"editor.eval.js.result", {result: safeStringify(res), meta: prev.data.meta, "no-inspect": true})); | |
} catch (e) { | |
var ex = e.toString(); | |
if(e.stack) { | |
ex = e.stack; | |
} | |
socket.emit("result", toMessage(prev, "editor.eval.js.exception", {ex: ex, meta: prev.data.meta})); | |
} | |
}); | |
socket.on('editor.eval.cljs.exec', function (message) { | |
var prev = fromMessage(message); | |
for(var i = 0; i < prev.data.results.length; i++) { | |
var data = prev.data.results[i]; | |
try { | |
var res = eval.call(window, prev.data.results[i].code); | |
socket.emit("result", toMessage(prev, "editor.eval.cljs.result", {result: cljs.core.pr_str(res), meta: prev.data.results[i].meta})); | |
} catch (e) { | |
socket.emit("result", toMessage(prev, "editor.eval.cljs.exception", {ex: e.stack, meta: prev.data.results[i].meta})); | |
} | |
} | |
}); | |
} | |
function loadScript(sScriptSrc,callbackfunction) { | |
var oHead = document.getElementsByTagName('head')[0]; | |
var oScript = document.createElement('script'); | |
oScript.setAttribute('src',sScriptSrc); | |
oScript.setAttribute('type','text/javascript'); | |
var loadFunction = function() { | |
if (this.readyState == 'complete' || this.readyState == 'loaded') { | |
callbackfunction(); | |
} | |
}; | |
oScript.onreadystatechange = loadFunction; | |
oScript.onload = callbackfunction; | |
oHead.appendChild(oScript); | |
} | |
if(window.io) { | |
init(); | |
} else { | |
loadScript(host + ":" + port + "/socket.io/socket.io.js", init); | |
} | |
})(window); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment