--- /dev/null
+// 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 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' || n.tagName === 'PRE') {
+ 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.textContent = '';
+ 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.textContent = 'Run';
+ run1.className = 'run';
+ run1.addEventListener('click', onRun, false);
+ var run2 = document.createElement('button');
+ run2.className = 'run';
+ run2.textContent = 'Run';
+ run2.addEventListener('click', onRun, false);
+ var kill = document.createElement('button');
+ kill.className = 'kill';
+ kill.textContent = 'Kill';
+ kill.addEventListener('click', onKill, false);
+ var close = document.createElement('button');
+ close.className = 'close';
+ close.textContent = '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);
+ }
+}