145 строки
4.2 KiB
JavaScript
145 строки
4.2 KiB
JavaScript
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
function playStart() {
|
|
// Insert line numbers for all playground elements.
|
|
$('.playground > pre.numbers, .code > pre.numbers').each(function() {
|
|
var $spans = $(this).find('> span');
|
|
|
|
// Compute width of number column (including trailing space).
|
|
var max = 0;
|
|
$spans.each(function() {
|
|
var n = $(this).attr('num')*1;
|
|
if (n > max) max = n;
|
|
});
|
|
var width = 2;
|
|
while (max > 10) {
|
|
max = max / 10;
|
|
width++;
|
|
}
|
|
|
|
// Insert line numbers with space padding.
|
|
$spans.each(function() {
|
|
var n = $(this).attr('num')+' ';
|
|
while (n.length < width) n = ' '+n;
|
|
$('<span class="ln">').text(n).insertBefore(this);
|
|
});
|
|
});
|
|
|
|
initPlayground(new HTTPTransport());
|
|
}
|
|
|
|
function initPlayground(transport) {
|
|
'use strict';
|
|
|
|
function text(node) {
|
|
var s = '';
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
var n = node.childNodes[i];
|
|
if (n.nodeType === 1) {
|
|
if (n.tagName === 'BUTTON') continue;
|
|
if (n.tagName === 'SPAN' && n.className === 'number') continue;
|
|
if (n.tagName === 'DIV' || n.tagName == 'BR') {
|
|
s += '\n';
|
|
}
|
|
s += text(n);
|
|
continue;
|
|
}
|
|
if (n.nodeType === 3) {
|
|
s += n.nodeValue;
|
|
}
|
|
}
|
|
return s.replace('\xA0', ' '); // replace non-breaking spaces
|
|
}
|
|
|
|
// When presenter notes are enabled, the index passed
|
|
// here will identify the playground to be synced
|
|
function init(code, index) {
|
|
var output = document.createElement('div');
|
|
var outpre = document.createElement('pre');
|
|
var running;
|
|
|
|
if ($ && $(output).resizable) {
|
|
$(output).resizable({
|
|
handles: 'n,w,nw',
|
|
minHeight: 27,
|
|
minWidth: 135,
|
|
maxHeight: 608,
|
|
maxWidth: 990,
|
|
});
|
|
}
|
|
|
|
function onKill() {
|
|
if (running) running.Kill();
|
|
if (window.notesEnabled) updatePlayStorage('onKill', index);
|
|
}
|
|
|
|
function onRun(e) {
|
|
var sk = e.shiftKey || localStorage.getItem('play-shiftKey') === 'true';
|
|
if (running) running.Kill();
|
|
output.style.display = 'block';
|
|
outpre.innerHTML = '';
|
|
run1.style.display = 'none';
|
|
var options = { Race: sk };
|
|
running = transport.Run(text(code), PlaygroundOutput(outpre), options);
|
|
if (window.notesEnabled) updatePlayStorage('onRun', index, e);
|
|
}
|
|
|
|
function onClose() {
|
|
if (running) running.Kill();
|
|
output.style.display = 'none';
|
|
run1.style.display = 'inline-block';
|
|
if (window.notesEnabled) updatePlayStorage('onClose', index);
|
|
}
|
|
|
|
if (window.notesEnabled) {
|
|
playgroundHandlers.onRun.push(onRun);
|
|
playgroundHandlers.onClose.push(onClose);
|
|
playgroundHandlers.onKill.push(onKill);
|
|
}
|
|
|
|
var run1 = document.createElement('button');
|
|
run1.innerHTML = 'Run';
|
|
run1.className = 'run';
|
|
run1.addEventListener('click', onRun, false);
|
|
var run2 = document.createElement('button');
|
|
run2.className = 'run';
|
|
run2.innerHTML = 'Run';
|
|
run2.addEventListener('click', onRun, false);
|
|
var kill = document.createElement('button');
|
|
kill.className = 'kill';
|
|
kill.innerHTML = 'Kill';
|
|
kill.addEventListener('click', onKill, false);
|
|
var close = document.createElement('button');
|
|
close.className = 'close';
|
|
close.innerHTML = 'Close';
|
|
close.addEventListener('click', onClose, false);
|
|
|
|
var button = document.createElement('div');
|
|
button.classList.add('buttons');
|
|
button.appendChild(run1);
|
|
// Hack to simulate insertAfter
|
|
code.parentNode.insertBefore(button, code.nextSibling);
|
|
|
|
var buttons = document.createElement('div');
|
|
buttons.classList.add('buttons');
|
|
buttons.appendChild(run2);
|
|
buttons.appendChild(kill);
|
|
buttons.appendChild(close);
|
|
|
|
output.classList.add('output');
|
|
output.appendChild(buttons);
|
|
output.appendChild(outpre);
|
|
output.style.display = 'none';
|
|
code.parentNode.insertBefore(output, button.nextSibling);
|
|
}
|
|
|
|
var play = document.querySelectorAll('div.playground');
|
|
for (var i = 0; i < play.length; i++) {
|
|
init(play[i], i);
|
|
}
|
|
}
|
|
|
|
window.initFuncs.push(playStart);
|