@@ -36550,4 +36550,107 @@ flowchart TD\n${treeToViewOutput.outputText.trim()}`
3655036550 treeViewer.showOpenButton()
3655136551 })
3655236552</script>
36553+ <script>
36554+ // Exec code block usermod
36555+
36556+ let extractCodeFromElem = (el) => {
36557+ const codeContainer = el.parentElement.querySelector('pre code');
36558+ let innercode = codeContainer.innerText;
36559+ //remove common language descriptiors from the start
36560+ let langsmatched = ["javascript", "js", "html", "xhtml"];
36561+ for (let i = 0; i < langsmatched.length; ++i) {
36562+ let matcher = langsmatched[i] + "\n";
36563+ if (innercode.startsWith(matcher)) {
36564+ innercode = innercode.substring(matcher.length);
36565+ return {
36566+ elem: el,
36567+ lang: langsmatched[i],
36568+ code: innercode
36569+ }
36570+ }
36571+ }
36572+ return null
36573+ }
36574+
36575+ let execJS = (code) => {
36576+ window.outPipe = (type = "Log:", ...args) => {
36577+ console.groupCollapsed(type, ...args);
36578+ console.groupEnd();
36579+ };
36580+ window.outPipeLog = (...args) => {
36581+ outPipe("Log:", ...args)
36582+ };
36583+ window.outPipeInfo = (...args) => {
36584+ outPipe("Info:", ...args)
36585+ };
36586+ window.outPipeWarn = (...args) => {
36587+ outPipe("Warn:", ...args)
36588+ };
36589+ window.outPipeError = (...args) => {
36590+ outPipe("Error:", ...args)
36591+ };
36592+ console.groupCollapsed("Preparing to execute script")
36593+ console.log(code)
36594+ console.groupEnd()
36595+
36596+ console.groupCollapsed("Executing script");
36597+ let evalResult = null;
36598+ try {
36599+ let scriptBody = code.trim().replace(/^javascript|^js/, "").replace(/console\.log\(/gi, "outPipeLog(").replace(/console\.info\(/gi, "outPipeInfo(").replace(/console\.warn\(/gi, "outPipeWarn(").replace(/console\.error\(/gi, "outPipeError(");
36600+ evalResult = eval?.(`${scriptBody}`);
36601+ } catch (e) {
36602+ evalResult = e;
36603+ }
36604+ if (!!evalResult) {
36605+ outPipeLog(`Eval result: ${evalResult}`);
36606+ }
36607+ console.groupEnd()
36608+ }
36609+
36610+ let execHTML = (code) => {
36611+ const newWindow = window.open('about:blank', '_blank');
36612+ newWindow.document.write(code);
36613+ newWindow.document.close()
36614+ }
36615+
36616+ let handleExecCode = (meta) => {
36617+ let {
36618+ elem,
36619+ lang,
36620+ code
36621+ } = meta;
36622+
36623+ switch (lang) {
36624+ case "javascript":
36625+ case "js":
36626+ execJS(code);
36627+ break;
36628+ case "html":
36629+ case "xhtml":
36630+ execHTML(code);
36631+ break;
36632+ }
36633+ }
36634+
36635+ let updateExecScriptButtons = () => {
36636+ let scripts = [...document.querySelectorAll("button.unselectable[title=Copy]")].filter(el => el.checkVisibility() && !el.classList.contains("execScriptAdded")).map(el => extractCodeFromElem(el))
36637+
36638+ scripts.forEach(meta => {
36639+ let elem = meta.elem
36640+ let button = document.createElement("button")
36641+ button.title = "Execute code block"
36642+ button.classList.add("unselectable")
36643+ button.onclick = () => handleExecCode(meta)
36644+ button.style.color = "black"
36645+ button.style.display = "flex"
36646+ button.style.float = "right"
36647+ button.innerText = "⚡"
36648+ elem.classList.add("execScriptAdded")
36649+ elem.parentElement.prepend(button)
36650+ })
36651+ }
36652+
36653+ setInterval(updateExecScriptButtons, 15*1000);
36654+ setTimeout(updateExecScriptButtons, 5*1000);
36655+ </script>
3655336656</html>
0 commit comments