Skip to content

Commit 2a0ca38

Browse files
author
prima
committed
feat: JS and HTML execution code
1 parent 98b50a1 commit 2a0ca38

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

klite.embd

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)