1
0
mirror of https://github.com/golang/go synced 2024-11-18 07:44:51 -07:00
go/godoc/static/play.js
Muhammad Hamza Farrukh 76a6aac657 present: fix newline parsing for go present
Pressing enter on editable go present code adds a new 'pre' html tag
which isn't being handled properly. This fix in play.js adds a newline
to the html is being parsed whenever it sees a 'pre' tag.

Fixes golang/go#41139

Change-Id: I042d13999f4a8518fb282c4c5bfb3a5197215449
Reviewed-on: https://go-review.googlesource.com/c/tools/+/251697
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
2020-09-03 15:36:55 +00:00

115 lines
3.5 KiB
JavaScript

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