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