| // 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') { |
| 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); |
| } |
| } |