-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathrunme.js
More file actions
108 lines (103 loc) · 3.32 KB
/
runme.js
File metadata and controls
108 lines (103 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"use strict";
let runme_out;
let curl_module;
let repl;
async function run_runmes() {
const stash = document.createElement("div");
const cellmenu = document.createElement("div");
cellmenu.classList.add("cellmenu");
cellmenu.innerHTML = `<div class="cellmenukid"><div id="cellmenubuttons">
</div> </div>`;
repl = await mkRepl();
let prom = undefined;
curl_module = function(url) { prom = repl.fetch_module(url); }
repl.runCount = 0;
async function run(runme) {
const s = runme.getElementsByClassName("incode")[0].innerText;
const oe = runme.getElementsByClassName("output")[0];
oe.innerHTML = "";
runme_out = oe;
if (prom) {
await prom;
prom = undefined;
}
const r = repl.run("chat", ["Main"], s + '\n');
if (r.buf[0] == "error") {
oe.innerHTML = "<div class='errmsg'></div>";
oe.getElementsByClassName("errmsg")[0].textContent = r.out;
return 1;
} else if (r.buf[0] == "ok") {
repl.runCount++;
runme.getElementsByClassName("runcounter")[0].innerText = repl.runCount;
if (r.out != "") {
const div = document.createElement("div");
div.style.display = "flex";
div.innerHTML = `<span class="outlabel">[<span class="runcounter">` + repl.runCount + `</span>]:</span>
<pre class="outtext"></pre>`;
oe.appendChild(div);
oe.getElementsByClassName("outtext")[0].textContent = r.out;
}
}
return 0;
}
async function interpret(runme) {
const s = runme.innerText;
runme.innerHTML = `<div style="display:flex;">
<span class="inlabel">[<span class="runcounter"> </span>]:</span>
<div class="incode" contenteditable="plaintext-only" spellcheck="false"></div>
</div>
<div class="output"></div>
`;
function init_incode(runme, s) {
const inco = runme.getElementsByClassName("incode")[0];
inco.innerText = s;
inco.addEventListener('focus', ev => {
runme.before(cellmenu);
document.getElementById("cellmenubuttons").innerHTML =
`<span class='topbutton' id='playbutton'>▶</span>`;
document.getElementById("playbutton").addEventListener('click', ev => {
stash.appendChild(cellmenu);
run(runme);
ev.preventDefault();
});
});
inco.addEventListener('keydown', ev => {
switch(ev.keyCode) {
case 13:
if (ev.ctrlKey) {
ev.preventDefault();
run(runme);
/*
} else if (ev.shiftKey) {
// Shift + Enter
ev.preventDefault();
*/
} else if (ev.altKey) {
run(runme).then((status) => {if (!status) {
const x = runme.cloneNode(true);
x.getElementsByClassName("output")[0].innerHTML = "";
x.getElementsByClassName("runcounter")[0].innerText = " ";
init_incode(x, "");
runme.after(x);
x.getElementsByClassName("incode")[0].focus();
}});
ev.preventDefault();
}
break;
}
});
}
init_incode(runme, s);
await run(runme);
}
let runmeClass = "runme";
for(;;) {
const runthese = document.getElementsByClassName(runmeClass);
if (runthese.length == 0) {
break;
}
for (const runme of runthese) await interpret(runme);
runmeClass += "'";
}
}
run_runmes();