2016-08-09 11:36:52 -05:00
|
|
|
function updateResults(elem) {
|
2016-08-10 10:38:20 -05:00
|
|
|
if ($(elem).length ===0){return false;}
|
2016-08-09 23:17:35 -05:00
|
|
|
|
2016-08-09 11:36:52 -05:00
|
|
|
var resultsContainer = $(elem).find('[data-id="results"]')[0];
|
2016-08-02 13:49:03 -05:00
|
|
|
var codeHtml = $(elem).find('.code-html')[0].value.trim();
|
|
|
|
var codeCss = $(elem).find('.code-css')[0].value.trim();
|
|
|
|
var codeJs = $(elem).find('.code-js')[0].value.trim();
|
2016-07-29 08:57:28 -05:00
|
|
|
|
|
|
|
resultsContainer.innerHTML = "";
|
|
|
|
var iDoc = document.createElement('html');
|
|
|
|
var iHead = document.createElement('head');
|
|
|
|
var iBody = document.createElement('body');
|
|
|
|
|
|
|
|
var codeFrame = document.createElement('iframe');
|
|
|
|
codeFrame.setAttribute("width", "100%");
|
|
|
|
codeFrame.setAttribute("height", "100%");
|
|
|
|
resultsContainer.appendChild(codeFrame);
|
|
|
|
|
2016-08-04 08:54:38 -05:00
|
|
|
var jqueryNode = document.createElement("script");
|
|
|
|
jqueryNode.setAttribute("type", "text/javascript");
|
2016-08-09 11:36:52 -05:00
|
|
|
// TODO: fix eslint runner to handle erb snippets
|
|
|
|
// jqueryNode.setAttribute("src", "<%= "//#{ENV['full_app_url']}#{javascript_path "jquery"}" %>");
|
|
|
|
jqueryNode.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js");
|
2016-08-04 08:54:38 -05:00
|
|
|
iHead.appendChild(jqueryNode);
|
|
|
|
|
2016-07-29 08:57:28 -05:00
|
|
|
var codeStyle = document.createElement("style");
|
|
|
|
codeStyle.setAttribute("type", "text/css");
|
|
|
|
var rulesNode = document.createTextNode(codeCss);
|
|
|
|
codeStyle.appendChild(rulesNode);
|
|
|
|
iHead.appendChild(codeStyle);
|
|
|
|
|
2016-08-04 08:54:38 -05:00
|
|
|
iDoc.appendChild(iHead);
|
2016-07-29 08:57:28 -05:00
|
|
|
iBody.innerHTML = codeHtml;
|
|
|
|
iDoc.appendChild(iBody);
|
|
|
|
|
2016-08-02 13:49:03 -05:00
|
|
|
var codeScript = document.createElement("script");
|
|
|
|
codeScript.setAttribute("type", "text/javascript");
|
2016-08-04 08:54:38 -05:00
|
|
|
var scriptNode = document.createTextNode("setTimeout(function(){ " + codeJs + "}, 800);");
|
2016-08-02 13:49:03 -05:00
|
|
|
codeScript.appendChild(scriptNode);
|
|
|
|
iDoc.appendChild(codeScript);
|
2016-07-29 08:57:28 -05:00
|
|
|
|
|
|
|
codeFrame.contentWindow.document.open();
|
|
|
|
codeFrame.contentWindow.document.appendChild(iDoc);
|
|
|
|
codeFrame.contentWindow.document.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
function indentSelection(e){
|
|
|
|
if(e.keyCode === 9){
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
var indent = " ";
|
|
|
|
var cursor = e.target.selectionStart;
|
|
|
|
var val = e.target.value;
|
|
|
|
var valStart = val.substring(0, e.target.selectionStart);
|
|
|
|
var valEnd = val.substring(e.target.selectionEnd, val.length);
|
|
|
|
var selected = val.substring(e.target.selectionStart, e.target.selectionEnd);
|
|
|
|
|
|
|
|
var resetCursor = function(start, end){
|
|
|
|
e.target.selectionStart = start;
|
|
|
|
e.target.selectionEnd = end;
|
|
|
|
};
|
|
|
|
|
|
|
|
var indented;
|
|
|
|
if(e.shiftKey){ //de-indent
|
|
|
|
if(selected.length > 0 && (/\n/.test(selected))){ //multi line
|
|
|
|
indented = selected.split(/\n/).map(function(line){
|
|
|
|
if(line.length > 0 && line.substring(0, indent.length) === indent){
|
|
|
|
line = line.substring(indent.length, line.length);
|
|
|
|
}
|
|
|
|
return line;
|
|
|
|
}).join("\n");
|
|
|
|
e.target.value = valStart + indented + val.substring(e.target.selectionEnd, val.length);
|
|
|
|
resetCursor(cursor, cursor + indented.length);
|
|
|
|
} else {
|
|
|
|
if(valStart.substring(valStart.length - indent.length) === indent){
|
|
|
|
e.target.value = valStart.substring(0, valStart.length - indent.length) + valEnd;
|
|
|
|
resetCursor(cursor, cursor - indent.length);
|
|
|
|
} else if(valEnd.substring(0, indent.length) === indent) {
|
|
|
|
e.target.value = valStart + valEnd.substring(indent.length, valEnd.length);
|
|
|
|
resetCursor(cursor, cursor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else { //indent
|
|
|
|
if(selected.length > 0 && (/\n/.test(selected))){ //multi line
|
|
|
|
indented = selected.split(/\n/).map(function(line){
|
|
|
|
if(line.length > 0){ line = indent + line; }
|
|
|
|
return line;
|
|
|
|
}).join("\n");
|
|
|
|
e.target.value = valStart + indented + val.substring(e.target.selectionEnd, val.length);
|
|
|
|
resetCursor(cursor, cursor + indented.length);
|
|
|
|
} else {
|
|
|
|
e.target.value = valStart + indent + selected + valEnd;
|
|
|
|
resetCursor(cursor + indent.length, cursor + indent.length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-02 13:49:03 -05:00
|
|
|
|
2016-08-09 11:36:52 -05:00
|
|
|
var timer = 0;
|
2016-07-29 08:57:28 -05:00
|
|
|
$(function(){
|
|
|
|
// wait a half second before updating results
|
|
|
|
// restart the timer if they resume typing
|
|
|
|
$('html').on('keyup', '.code-input textarea', function(){
|
2016-08-09 23:17:35 -05:00
|
|
|
var elem = $(this).closest("[data-id=live-coder-answer]");
|
2016-07-29 08:57:28 -05:00
|
|
|
if (timer) { clearTimeout(timer); }
|
2016-08-02 13:49:03 -05:00
|
|
|
timer = setTimeout(updateResults(elem), 500);
|
2016-07-29 08:57:28 -05:00
|
|
|
});
|
|
|
|
|
2016-08-08 17:08:20 -05:00
|
|
|
$("[data-id=live-coder-answer]").each(function(){
|
|
|
|
updateResults(this);
|
2016-07-29 08:57:28 -05:00
|
|
|
});
|
|
|
|
|
2016-08-08 17:08:20 -05:00
|
|
|
$("html").on('keydown', "textarea[data-id^=code-]", function(e){
|
|
|
|
indentSelection(e);
|
2016-07-29 08:57:28 -05:00
|
|
|
});
|
|
|
|
|
2016-08-08 17:08:20 -05:00
|
|
|
$(".code-input textarea").linedtextarea();
|
2016-07-29 08:57:28 -05:00
|
|
|
});
|