diff options
Diffstat (limited to 'virtual-programs/web-editor.folk')
| -rw-r--r-- | virtual-programs/web-editor.folk | 188 |
1 files changed, 96 insertions, 92 deletions
diff --git a/virtual-programs/web-editor.folk b/virtual-programs/web-editor.folk index 6669d9fa..ae14f9b4 100644 --- a/virtual-programs/web-editor.folk +++ b/virtual-programs/web-editor.folk @@ -1,117 +1,121 @@ Wish the web server handles route {/page/(.*)$} with handler { if {[regexp -all {/page/(\d*)$} $path whole_match program_id]} { - set filename "../folk-printed-programs/$program_id.folk" + set filename "../folk-printed-programs/$program_id.folk" set fp [open $filename r] set file_data [read $fp] close $fp } elseif {[regexp -all {/page/(.*)$} $path whole_match program_id]} { - set filename "virtual-programs/$program_id.folk" + set filename "virtual-programs/$program_id.folk" set fp [open $filename r] set file_data [read $fp] close $fp } html [string map [list file_data [htmlEscape $file_data] program_id $program_id file_name $filename] { - <html> - <body> - <div> - <span id="status">Status</span> - <button onclick="handleSave()">Save</button> - <button id="print" onclick="handlePrint()">Print</button> - </div> - <textarea id="code" style="width: 100%;height: 95vh;">file_data</textarea> - <pre id="error"></pre> - <script> - const isVirtualProgram = 'file_name'.includes('virtual-programs'); + <html> + <body> + <div> + <span id="status">Status</span> + <button onclick="handleSave()">Save</button> + <button id="print" onclick="handlePrint()">Print</button> + </div> + <textarea id="code" style="width: 100%;height: 95vh;">file_data</textarea> + <pre id="error"></pre> + <script> + const isVirtualProgram = 'file_name'.includes('virtual-programs'); - if (isVirtualProgram) { - document.getElementById("print").disabled = true; - } + if (isVirtualProgram) { + document.getElementById("print").disabled = true; + } - const codeEle = document.getElementById("code"); - function uuidv4() { - return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => - (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) - ); - } + const codeEle = document.getElementById("code"); + function uuidv4() { + return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => + (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) + ); + } - // Cmd + S || Ctrl + S => Save - document.addEventListener('keydown', function(e) { - if ((window.navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey) && e.keyCode == 83) { - e.preventDefault(); - handleSave(); - } - }, false); - // Cmd + P || Ctrl + P => Print - document.addEventListener('keydown', function(e) { - if ((window.navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey) && e.keyCode == 80) { - e.preventDefault(); - handlePrint(); - } - }, false); + // Cmd + S || Ctrl + S => Save + document.addEventListener('keydown', function(e) { + if ((window.navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey) && e.keyCode == 83) { + e.preventDefault(); + handleSave(); + } + }, false); + // Cmd + P || Ctrl + P => Print + document.addEventListener('keydown', function(e) { + if ((window.navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey) && e.keyCode == 80) { + e.preventDefault(); + handlePrint(); + } + }, false); - let ws; - let send; - function wsConnect() { - ws = new WebSocket(window.location.origin.replace("http", "ws") + "/ws"); - send = function(s) { ws.send(s); } + let ws; + let send; + function wsConnect() { + ws = new WebSocket(window.location.origin.replace("http", "ws") + "/ws"); + send = function(s) { ws.send(s); } - ws.onopen = () => { - document.getElementById('status').innerHTML = "<span style=background-color:seagreen;color:white;>Connnected</span>"; - }; - ws.onclose = window.onbeforeunload = () => { - document.getElementById('status').innerHTML = "<span style=background-color:red;color:white;>Disconnnected</span>"; - setTimeout(() => { wsConnect(); }, 1000); - }; - ws.onerror = (err) => { - document.getElementById('status').innerText = "Error"; - console.error('Socket encountered error: ', err.message, 'Closing socket'); - ws.close(); - } - ws.onmessage = (msg) => { - if (msg.data.startsWith("ERROR:")) { - const errorEl = document.getElementById("error"); - if (msg.data == "ERROR: {}") { - errorEl.style.backgroundColor = ""; - errorEl.innerText = ""; - } else { - errorEl.style.backgroundColor = "#f55"; - errorEl.innerText = msg.data; - } - } - } - }; - wsConnect(); + ws.onopen = () => { + document.getElementById('status').innerHTML = "<span style=background-color:seagreen;color:white;>Connnected</span>"; + }; + ws.onclose = window.onbeforeunload = () => { + document.getElementById('status').innerHTML = "<span style=background-color:red;color:white;>Disconnnected</span>"; + setTimeout(() => { wsConnect(); }, 1000); + }; + ws.onerror = (err) => { + document.getElementById('status').innerText = "Error"; + console.error('Socket encountered error: ', err.message, 'Closing socket'); + ws.close(); + } + ws.onmessage = (msg) => { + if (msg.data.startsWith("Error:")) { + const errorEl = document.getElementById("error"); + if (msg.data === "Error:") { + errorEl.style.backgroundColor = ""; + errorEl.innerText = ""; + } else { + errorEl.style.backgroundColor = "#f55"; + errorEl.innerText = msg.data; + } + } + } + }; + wsConnect(); - function handleSave() { - const code = document.getElementById("code").value; - send(` - set fp [open file_name w] - puts -nonewline $fp {${code}} - close $fp - puts "Saved program_id.folk" - `); + function handleSave() { + const code = document.getElementById("code").value; + send(` + set fp [open file_name w] + puts -nonewline $fp {${code}} + close $fp + puts "Saved program_id.folk" + `); if (isVirtualProgram) { send(`EditVirtualProgram file_name {${code}}`) - } + } - setTimeout(() => { - send(`list ERROR: [Statements::findMatches [list program_id has error /err/ with info /errorInfo/]]`); - }, 500); - } - let jobid; - function handlePrint() { - const code = document.getElementById("code").value; - jobid = String(Math.random()); - send(`Assert web wishes to print program program_id with code {${code}} with job id {${jobid}}`); - setTimeout(500, () => { - send(`Retract web wishes to print program program_id with code {${code}} with job id {${jobid}}`); - }); - } - </script> - </body> - </html> + setTimeout(() => { + send(` +set errors [Statements::findMatches [list program_id has error /err/ with info /errorInfo/]] +join [list "Error:" {*}[lmap e $errors {dict get $e errorInfo}]] "\n" +`); + }, 500); + } + + let jobid; + function handlePrint() { + const code = document.getElementById("code").value; + jobid = String(Math.random()); + send(`Assert web wishes to print program program_id with code {${code}} with job id {${jobid}}`); + setTimeout(500, () => { + send(`Retract web wishes to print program program_id with code {${code}} with job id {${jobid}}`); + }); + } + </script> + </body> + </html> }] } |
