charlang/example/editFile.char
Copy
global argsG global inputG global guiG guiStatusT := guiG.init() if isErr(guiStatusT) { pl("GUI mode not supported") return } fileNameT := trim(getSwitch(argsG, "-fromFile=", "")) fromClipT := ifSwitchExists(argsG, "-fromClip") fromInputT := ifSwitchExists(argsG, "-fromInput") fromUrlT := trim(getSwitch(argsG, "-fromUrl=", "")) fcT := "TXERROR:empty" if fromClipT { fcT = getClipText() } else if fromUrlT != "" { fcT = getWeb(fromUrlT) } else if fromInputT { fcT = spr("%v", inputG) } else if fileNameT != "" { fileNameT = getFileAbs(fileNameT) fcT = loadText(fileNameT) setProcessVar("editFileNameG", fileNameT) } htmlT := ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <script> window.onload = function (){ var mainTextAreaT = document.getElementById('mainTextID'); mainTextAreaT.dispatchEvent(new Event('input')); document.onkeydown = function(e) { if (e.ctrlKey) { if (e.keyCode == 83) { console.log("ctrl-s"); saveIt(); // e.stopPropagation(); e.preventDefault(); e.returnValue = false; return false; } return true; } return true; }; mainTextAreaT.addEventListener("keydown", function (e) { if (e.key === "Tab" || e.code === "Tab") { e.preventDefault(); const textT = mainTextAreaT.value; const cursorPos = e.target.selectionStart; if (e.shiftKey === true && (cursorPos - 1) > -1) { const precChar = textT.substr(cursorPos - 1, 1) if (precChar === "\t" || precChar === " ") { const textFinalT = textT.substr(0, cursorPos - 1) + textT.substr(cursorPos, textT.length) mainTextAreaT.value = textFinalT; e.target.selectionEnd = cursorPos - 1; } } else { const textFinalT = textT.substr(0, cursorPos) + "\t" + textT.substr(cursorPos, textT.length); mainTextAreaT.value = textFinalT; e.target.selectionEnd = cursorPos + 1; } } }); mainTextAreaT.addEventListener("input", function (e) { delegateDo("setModified", "*"); }); var rs; rs = delegateDo("initContent"); rs.then(res => { console.log("res: ", res); if (res.startsWith("TXERROR:")) { if (res == "TXERROR:empty") { return; } alert(res.substr(8)); return; } document.getElementById('mainTextID').value = res; document.getElementById('mainTextID').dispatchEvent(new Event('input')); delegateDo("setModified", ""); document.getElementById("mainTextID").focus(); }); document.getElementById("mainTextID").focus(); }; function copyIt() { delegateDo("setClipText", document.getElementById('mainTextID').value); } function saveIt() { var rs = delegateDo("saveText", document.getElementById('mainTextID').value); rs.then(res => { if (res.trim() == "") { // alert("Successfully saved.") } else { if (res.indexOf("TXERROR:") == 0) { res = res.substring(8); } alert("failed to save: " + res); } }); } function saveAsIt() { var rs = delegateDo("saveTextAs", document.getElementById('mainTextID').value); rs.then(res => { if (res.trim() == "") { // alert("Successfully saved.") } else { if (res.indexOf("TXERROR:") == 0) { res = res.substring(8); } alert("failed to save: " + res); } }); } function quickRunIt() { var rs = delegateDo("quickRun", document.getElementById('mainTextID').value); rs.then(res => { if (!(!res)) { alert("quick run result: " + JSON.stringify(res)); } }); } function evalIt() { var rs = delegateDo("eval", document.getElementById('mainTextID').value); rs.then(res => { if (!(!res)) { alert("eval result: " + JSON.stringify(res)); } }); } function consoleRunIt() { delegateDo("consoleRun", document.getElementById('mainTextID').value); } function compileIt() { var rs = delegateDo("compile", document.getElementById('mainTextID').value); rs.then(res => { if (!(!res)) { alert("compile result: " + JSON.stringify(res)); } }); } function setModifiedIt(strA) { } function loadIt() { var rs = delegateDo("loadText"); rs.then(res => { if (res.indexOf("TXERROR:") == 0) { alert("failed to load: " + res.substring(8)); return; } document.getElementById('mainTextID').value = res; document.getElementById('mainTextID').dispatchEvent(new Event('input')); delegateDo("setModified", ""); document.getElementById("mainTextID").focus(); }); } function pasteIt() { var rs = delegateDo("getClipText"); rs.then(res => { document.getElementById('mainTextID').value = res; document.getElementById('mainTextID').dispatchEvent(new Event('input')); document.getElementById("mainTextID").focus(); }); } function clearIt() { document.getElementById('mainTextID').value = ""; } function checkJSON() { var codeT = document.getElementById('mainTextID').value; var objT; try { objT = JSON.parse(codeT); } catch (error) { alert(error); return; } alert("check passed"); } </script> </head> <body style="font-size: 16px;"> <div id="div1" style="height: 20px;"> <button onclick="javascript:clearIt();">Clear</button> <button onclick="javascript:copyIt();">Copy</button> <button onclick="javascript:pasteIt();">Paste</button> <button onclick="javascript:checkJSON();">Check JSON</button> <button onclick="javascript:loadIt();">Load</button> <button onclick="javascript:saveIt();">Save</button> <button onclick="javascript:saveAsIt();">Save as...</button> <button onclick="javascript:compileIt();">Compile</button> <button onclick="javascript:quickRunIt();">Quick Run</button> <button onclick="javascript:evalIt();">Eval</button> <button onclick="javascript:consoleRunIt();">Console Run</button> <button onclick="javascript:runIt();" style="display: none;">Run</button> <button onclick="javascript:setParamIt();" style="display: none;">Param</button> </div> <div id="div3" style="margin-top: 10px; text-align: left;"> <div style="text-align: center;"> <textarea id="mainTextID" style="width: 96%; height: 92vh; font-size: 16px; text-align: left;"></textarea> </div> </div> </body> </html> ` vmT := evalMachine() windowT := guiG.newWindow("-title=Tmp Editor - " + fileNameT, "-width=1280", "-height=928", "-center", "-debug") // plo(windowT) dele1 := delegate(strReplace(` param ...vargs global inputG // pln(vargs) // pl("inputG: %#v", inputG) guiG := inputG[1] fcT := inputG[2] cmdT := vargs[0] if cmdT == "showResult" { idT := trim(vargs[1]) pl("id: %v", idT) return idT } else if cmdT == "closeWindow" { windowT := inputG[0] windowT("close") return cmdT } else if cmdT == "initContent" { return fcT } else if cmdT == "getClipText" { return getClipText() } else if cmdT == "setClipText" { v1 := trim(vargs[1]) setClipText(toStr(v1)) return "" } else if cmdT == "loadText" { rs1 := guiG.selectFile("-title=Select file...", ~~~-filter=[{"Name": "Charlang Script Files", "Patterns": ["*.char"], "CaseFold": false}, {"Name": "Plain Text Files", "Patterns": ["*.txt"], "CaseFold": false}, {"Name": "All Files", "Patterns": ["*"], "CaseFold": false}]~~~) if isErr(rs1) { return spr("TXERROR:failed to select file: %v", rs1) } if !rs1 { return spr("TXERROR:no file selected") } rs2 := loadText(rs1) if isErr(rs2) { return spr("TXERROR:%v", rs2) } windowT := inputG[0] setProcessVar("editFileNameG", getFileAbs(rs1)) setProcessVar("editFileModifiedG", "") windowT("setTitle", "Tmp Editor - " + trim(getProcessVar("editFileModifiedG")) + trim(getProcessVar("editFileNameG"))) return rs2 } else if cmdT == "saveText" { v1 := trim(vargs[1]) fnT := trim(getProcessVar("editFileNameG")) // pl("current file path: %v", fnT) if fnT == "" { fnT = guiG.selectFileToSave("-confirmOverwrite", "-title=Save file to...", "-default="+trim(getProcessVar("editFileNameG"))) if isErr(fnT) { return spr("TXERROR:failed to select file: %v", fnT) } if !fnT { return spr("TXERROR:no file selected") } } rs2 := saveText(v1, fnT) if isErr(rs2) { return spr("TXERROR:%v", rs2) } windowT := inputG[0] setProcessVar("editFileNameG", getFileAbs(fnT)) setProcessVar("editFileModifiedG", "") windowT("setTitle", "Tmp Editor - " + trim(getProcessVar("editFileModifiedG")) + trim(getProcessVar("editFileNameG"))) return "" } else if cmdT == "saveTextAs" { v1 := trim(vargs[1]) // pl("current file path: %v", getProcessVar("editFileNameG")) rs1 := guiG.selectFileToSave("-confirmOverwrite", "-title=Save file to...", "-default="+trim(getProcessVar("editFileNameG"))) if isErr(rs1) { return spr("TXERROR:failed to select file: %v", rs1) } if !rs1 { return spr("TXERROR:no file selected") } rs2 := saveText(v1, rs1) if isErr(rs2) { return spr("TXERROR:%v", rs2) } windowT := inputG[0] setProcessVar("editFileNameG", getFileAbs(rs1)) setProcessVar("editFileModifiedG", "") windowT("setTitle", "Tmp Editor - " + trim(getProcessVar("editFileModifiedG")) + trim(getProcessVar("editFileNameG"))) return "" } else if cmdT == "quickRun" { v1 := trim(vargs[1]) // pl("code: %v", v1) c1 := charCode(v1) if isErr(c1) { return spr("TXERROR:failed to create charCode: %v", c1) } crs := c1.compile() if isErr(crs) { return spr("TXERROR:failed to compile code: %v", crs) } // plv(c1) rs := c1.run(...(vargs[2:])) // plv(rs) if isUndef(rs) { return "" } return toStr(rs) } else if cmdT == "eval" { v1 := trim(vargs[1]) vmT := inputG[3] rs := vmT.eval(v1) if isErr(rs) { return spr("TXERROR:failed to eval: %v", rs) } if isUndef(rs) { return "TXERROR:no result" } return toStr(rs) } else if cmdT == "consoleRun" { v1 := trim(vargs[1]) modifiedT := trim(getProcessVar("editFileModifiedG")) if modifiedT != "" { rs := guiG.getConfirm("Code modified, save first?") if rs != "" { return "" } if rs == "" { rs1 := trim(getProcessVar("editFileNameG")) if rs != "" { rs1 = guiG.selectFileToSave("-confirmOverwrite", "-title=Save file to...", "-default="+trim(getProcessVar("editFileNameG"))) if isErr(rs1) { return spr("TXERROR:failed to select file: %v", rs1) } if !rs1 { return spr("TXERROR:no file selected") } } rs2 := saveText(v1, rs1) if isErr(rs2) { return spr("TXERROR:%v", rs2) } setProcessVar("editFileNameG", rs1) setProcessVar("editFileModifiedG", "") windowT := inputG[0] windowT("setTitle", "Tmp Editor - " + trim(getProcessVar("editFileModifiedG")) + trim(getProcessVar("editFileNameG"))) } } fnT := trim(getProcessVar("editFileNameG")) //rs := systemCmd("cmd.exe", "/K", "start", "char.exe", fnT) rs := systemCmdDetached("cmd.exe", "/K", "start", "cmd.exe", "/K", "char.exe", fnT) // plv(rs) return toStr(rs) } else if cmdT == "setModified" { setProcessVar("editFileModifiedG", trim(vargs[1])) windowT := inputG[0] windowT("setTitle", "Tmp Editor - " + trim(getProcessVar("editFileModifiedG")) + trim(getProcessVar("editFileNameG"))) return "" } else if cmdT == "compile" { v1 := trim(vargs[1]) // pl("code: %v", v1) c1 := charCode(v1) if isErr(c1) { return spr("TXERROR:failed to create charCode: %v", c1) } crs := c1.compile() if isErr(crs) { return spr("TXERROR:failed to compile code: %v", crs) } return "successfully compiled" } pl("cmd: %v", cmdT) return cmdT `, "~~~", "`")) checkErr(dele1) rs := dele1.compile(windowT, guiG, fcT, vmT) checkErr(rs) rs = windowT.setDelegate(dele1) checkErr(rs) rs = windowT.setHtml(htmlT) checkErr(rs) rs = windowT("show") checkErr(rs) rs = windowT("close") checkErr(rs)