| 1 | // Copyright 2012 The Go Authors. All rights reserved. |
|---|---|
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | function initPlayground(transport) { |
| 6 | 'use strict'; |
| 7 | |
| 8 | function text(node) { |
| 9 | var s = ''; |
| 10 | for (var i = 0; i < node.childNodes.length; i++) { |
| 11 | var n = node.childNodes[i]; |
| 12 | if (n.nodeType === 1) { |
| 13 | if (n.tagName === 'BUTTON') continue; |
| 14 | if (n.tagName === 'SPAN' && n.className === 'number') continue; |
| 15 | if (n.tagName === 'DIV' || n.tagName === 'BR' || n.tagName === 'PRE') { |
| 16 | s += '\n'; |
| 17 | } |
| 18 | s += text(n); |
| 19 | continue; |
| 20 | } |
| 21 | if (n.nodeType === 3) { |
| 22 | s += n.nodeValue; |
| 23 | } |
| 24 | } |
| 25 | return s.replace('\xA0', ' '); // replace non-breaking spaces |
| 26 | } |
| 27 | |
| 28 | // When presenter notes are enabled, the index passed |
| 29 | // here will identify the playground to be synced |
| 30 | function init(code, index) { |
| 31 | var output = document.createElement('div'); |
| 32 | var outpre = document.createElement('pre'); |
| 33 | var running; |
| 34 | |
| 35 | if ($ && $(output).resizable) { |
| 36 | $(output).resizable({ |
| 37 | handles: 'n,w,nw', |
| 38 | minHeight: 27, |
| 39 | minWidth: 135, |
| 40 | maxHeight: 608, |
| 41 | maxWidth: 990, |
| 42 | }); |
| 43 | } |
| 44 | |
| 45 | function onKill() { |
| 46 | if (running) running.Kill(); |
| 47 | if (window.notesEnabled) updatePlayStorage('onKill', index); |
| 48 | } |
| 49 | |
| 50 | function onRun(e) { |
| 51 | var sk = e.shiftKey || localStorage.getItem('play-shiftKey') === 'true'; |
| 52 | if (running) running.Kill(); |
| 53 | output.style.display = 'block'; |
| 54 | outpre.textContent = ''; |
| 55 | run1.style.display = 'none'; |
| 56 | var options = { Race: sk }; |
| 57 | running = transport.Run(text(code), PlaygroundOutput(outpre), options); |
| 58 | if (window.notesEnabled) updatePlayStorage('onRun', index, e); |
| 59 | } |
| 60 | |
| 61 | function onClose() { |
| 62 | if (running) running.Kill(); |
| 63 | output.style.display = 'none'; |
| 64 | run1.style.display = 'inline-block'; |
| 65 | if (window.notesEnabled) updatePlayStorage('onClose', index); |
| 66 | } |
| 67 | |
| 68 | if (window.notesEnabled) { |
| 69 | playgroundHandlers.onRun.push(onRun); |
| 70 | playgroundHandlers.onClose.push(onClose); |
| 71 | playgroundHandlers.onKill.push(onKill); |
| 72 | } |
| 73 | |
| 74 | var run1 = document.createElement('button'); |
| 75 | run1.textContent = 'Run'; |
| 76 | run1.className = 'run'; |
| 77 | run1.addEventListener('click', onRun, false); |
| 78 | var run2 = document.createElement('button'); |
| 79 | run2.className = 'run'; |
| 80 | run2.textContent = 'Run'; |
| 81 | run2.addEventListener('click', onRun, false); |
| 82 | var kill = document.createElement('button'); |
| 83 | kill.className = 'kill'; |
| 84 | kill.textContent = 'Kill'; |
| 85 | kill.addEventListener('click', onKill, false); |
| 86 | var close = document.createElement('button'); |
| 87 | close.className = 'close'; |
| 88 | close.textContent = 'Close'; |
| 89 | close.addEventListener('click', onClose, false); |
| 90 | |
| 91 | var button = document.createElement('div'); |
| 92 | button.classList.add('buttons'); |
| 93 | button.appendChild(run1); |
| 94 | // Hack to simulate insertAfter |
| 95 | code.parentNode.insertBefore(button, code.nextSibling); |
| 96 | |
| 97 | var buttons = document.createElement('div'); |
| 98 | buttons.classList.add('buttons'); |
| 99 | buttons.appendChild(run2); |
| 100 | buttons.appendChild(kill); |
| 101 | buttons.appendChild(close); |
| 102 | |
| 103 | output.classList.add('output'); |
| 104 | output.appendChild(buttons); |
| 105 | output.appendChild(outpre); |
| 106 | output.style.display = 'none'; |
| 107 | code.parentNode.insertBefore(output, button.nextSibling); |
| 108 | } |
| 109 | |
| 110 | var play = document.querySelectorAll('div.playground'); |
| 111 | for (var i = 0; i < play.length; i++) { |
| 112 | init(play[i], i); |
| 113 | } |
| 114 | } |
| 115 |
Members