let luaStdout = null; let luaStderr = null; async function run_lua_code(elem) { let result; if (!elem.nextElementSibling) { result = document.createElement('code'); result.classList.add('result', 'hljs', 'language-bash'); elem.after(result) } else { result = elem.nextElementSibling; } result.innerHTML = ''; if (window.luaInstance === undefined) { let wasm; try { wasm = await import(window.rootPath + '/lua-playground.js'); } catch (e) { result.innerText = 'Failed to load wasm module: ' + e.toString(); return; } const module = { print(msg) { if (luaStdout) luaStdout(msg) }, printErr(msg) { if (luaStderr) luaStderr(msg) } } const luaPlayground = await wasm.default(module); window.luaInstance = luaPlayground.ccall('lua_new', 'number', [], []); window.luaExecute = luaPlayground.cwrap('lua_execute', null, ['number', 'string']); } luaStdout = (msg) => result.innerHTML += msg + '
'; luaStderr = (msg) => result.innerHTML += msg + '
'; window.luaExecute(window.luaInstance, ace.edit(elem).getValue()); luaStdout = null; luaStderr = null; } function main() { const inputElements = document.querySelectorAll('.language-lua.editable'); for (const inputElem of inputElements) { const editor = ace.edit(inputElem); /* adds the run and reset button */ const buttons = inputElem.previousElementSibling; const resetButton = document.createElement('button'); resetButton.classList.add('fa', 'fa-history', 'reset-button'); resetButton.title = 'Undo changes'; resetButton.ariaLabel = 'Undo changes'; resetButton.onclick = () => editor.setValue(editor.originalCode.trim(), -1); buttons.prepend(resetButton); const runButton = document.createElement('button'); runButton.classList.add('fa', 'fa-play', 'play-button'); runButton.title = 'Run this code'; runButton.ariaLabel = 'Run this code'; runButton.onclick = () => run_lua_code(inputElem); buttons.append(runButton); /* i don't know why, but the editor always has an extra newline. when selecting it and trimming it, the newline gets removed */ editor.setValue(editor.originalCode.trim(), -1); } } function reloadES6() { window.rootPath = document.currentScript.src.replace(/lua-playground\/lua-playground-loader\.js.*/, '') const injectScript = document.createElement('script'); injectScript.type = 'module'; injectScript.src = document.currentScript.src; document.body.append(injectScript); } // this script is not loaded as es6 module, so it has to "elevate" itself to an es6 module by re-injecting itself with // the `reloadES6` function if (window.rootPath) { main() } else { reloadES6() }