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