diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-08-20 17:30:00 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-08-20 17:30:00 -0400 |
| commit | 7700a768e9b96f784249f4bbafb381ae91ee9df3 (patch) | |
| tree | 3780e17f1092c0fc37cf078deddb1ddd6e2070ee | |
| parent | 1cb804a87b394416cc1f8b6cc85e6bda163030bd (diff) | |
Move REPL code to a script
| -rw-r--r-- | docs/repl.js | 76 | ||||
| -rw-r--r-- | docs/try.html | 79 |
2 files changed, 77 insertions, 78 deletions
diff --git a/docs/repl.js b/docs/repl.js new file mode 100644 index 00000000..02863de9 --- /dev/null +++ b/docs/repl.js @@ -0,0 +1,76 @@ +let body = document.body; +let doc={}; // html elements with a class +body.querySelectorAll('[class]').forEach(e=>doc[e.classList[0]]=e); +let repl = ()=>{ + try { + let s=doc.code.value; + doc.rslt.classList.remove('err'); + doc.rslt.textContent=fmt(bqn(s)); + } catch(e) { + //if (console&&console.error) console.error(e.stack); + doc.rslt.classList.add('err'); + doc.rslt.textContent=e; + } +} +doc.run.onclick = repl; + +let keymode=0; // 1 for backslash +doc.code.onkeydown = ev => { + let k = ev.which; + if (16<=k && k<=20) { + return; + } if (k==13 && (ev.shiftKey||ev.ctrlKey||ev.altKey||ev.metaKey)) { // *-enter + repl(); return false; + } if (keymode) { + keymode = 0; + doc.kb.classList.remove('backslash'); + let c = keys[ev.key]; + if (c) return typeChar(ev.target, c, ev); + } else if (k===220) { // \ + keymode = 1; + doc.kb.classList.add('backslash'); + ev.preventDefault(); + } +} +let typeChar = (t, c, ev) => { + ev.preventDefault(); + let v = t.value; + let i = t.selectionStart; + t.value = v.slice(0,i)+c+v.slice(t.selectionEnd); + t.selectionStart = t.selectionEnd = i+c.length; + return false; +} + +let syncls={ v:"Value", f:"Function", m:"Modifier", d:"Modifier2", n:"Number", g:"Gets", p:"Paren", b:"Bracket", k:"Brace", l:"Ligature", n:"Nothing", s:"Separator", c:"Comment" }; +let keydesc='f+Conjugate;Add_f-Negate;Subtract_f×Sign;Multiply_f÷Reciprocal;Divide_f⋆Exponential;Power_f√Square Root;Root_f⌊Floor;Minimum_f⌈Ceiling;Maximum_f∧Sort Up;And_f∨Sort Down;Or_f¬Not;Span_f|Absolute Value;Modulus_f≤Less Than or Equal to_f<Enclose;Less Than_f>Merge;Greater Than_f≥Greater Than or Equal to_f=Rank;Equals_f≠Length;Not Equals_f≡Depth;Match_f≢Shape;Not Match_f⊣Identity;Left_f⊢Identity;Right_f⥊Deshape;Reshape_f∾Join;Join to_f≍Solo;Couple_f↑Prefixes;Take_f↓Suffixes;Drop_f↕Range;Windows_f⌽Reverse;Rotate_f⍉Transpose;Reorder axes_f/Indices;Replicate_f⍋Grade Up;Bins Up_f⍒Grade Down;Bins Down_f⊏First Cell;Select_f⊑First;Pick_f⊐Index of_f⊒Occurrence Count;Progressive Index of_f∊Unique Mask;Member of_f⍷Deduplicate;Find_f⊔Group Indices;Group_f!Assert;Assert with message_m˜Self/Swap_d∘Atop_d○Over_d⊸Before/Bind_d⟜After/Bind_d⌾Under_d⊘Valences_d◶Choose_d⎉Rank_m˘Cells_d⚇Depth_m¨Each_m⌜Table_d⍟Repeat_m⁼Undo_m´Fold_m˝Insert_m`Scan_b←Define_b↩Change_b→Return_s⋄Separator_s,Separator_p(Begin expression_p)End expression_k{Begin block_k}End block_b⟨Begin list_b⟩End list_l‿Strand_n·Nothing_v•System_v𝕨Left argument_f𝕎Left argument (as function)_v𝕩Right argument_f𝕏Right argument (as function)_v𝕗Modifier left operand (as subject)_f𝔽Modifier left operand_v𝕘2-modifier right operand (as subject)_f𝔾2-modifier right operand_v𝕤Current function (as subject)_f𝕊Current function_m𝕣Current modifier_n¯Minus_nπPi_n∞Infinity_c#Comment'.split(/[\n_]/); +let kk=Array.from('`123456890-=~!@#$%^&*()_+qwertuiop[]QWERTIOP{}asdfghjkl;ASFGK:"zxcvbm,./XVBM<> \''); +let kv=Array.from('˜˘¨⁼⌜´˝∞¯•÷׬⎉⚇⍟◶⊘⎊⍎⍕⟨⟩√⋆⌽𝕨∊↑∧⊔⊏⊐π←→↙𝕎⍷𝕣⍋⊑⊒⍳⊣⊢⍉𝕤↕𝕗𝕘⊸∘○⟜⋄↖𝕊𝔽𝔾⌾·˙⥊𝕩↓∨⌊≡∾≍≠𝕏⍒⌈≢≤≥‿↩'); +let keys={}, revkeys={}; +kk.map((k,i)=>{keys[k]=kv[i];revkeys[kv[i]]=k;}); +doc.kb.innerHTML = keydesc.map(d=>{ + let s = syncls[d[0]]; + let c = Array.from(d)[1]; + let t = d.slice(1+c.length).replace(';','\n'); + let k = revkeys[c]; if (k) t += '\n\\ '+k; + return '<span title="'+t+'" class="'+s+'">'+c+'</span>' +}).join("​"); // zero-width space +doc.kb.onmousedown = ev => { + let t = ev.target; + if (t.nodeName === 'SPAN') { + return typeChar(doc.code, t.textContent, ev); + } +} + +doc.perm.onmouseover = doc.perm.onfocus = () => { + doc.perm.href='#code='+escape(doc.code.value) +} + +if (location.hash) { + let hp={}; + location.hash.substring(1).split(',').map(s=>{ + let[k,v]=s.split('=');hp[k]=unescape(v) + }); + doc.code.value = hp.code||''; + if (hp.run) repl(); +} +doc.code.focus(); diff --git a/docs/try.html b/docs/try.html index 3d91e728..a0bcd4bf 100644 --- a/docs/try.html +++ b/docs/try.html @@ -32,83 +32,6 @@ </p> <script src="bqn.js"></script> -<script> -let body = document.body; -let doc={}; // html elements with a class -body.querySelectorAll('[class]').forEach(e=>doc[e.classList[0]]=e); -let repl = ()=>{ - try { - let s=doc.code.value; - doc.rslt.classList.remove('err'); - doc.rslt.textContent=fmt(bqn(s)); - } catch(e) { - //if (console&&console.error) console.error(e.stack); - doc.rslt.classList.add('err'); - doc.rslt.textContent=e; - } -} -doc.run.onclick = repl; - -let keymode=0; // 1 for backslash -doc.code.onkeydown = ev => { - let k = ev.which; - if (16<=k && k<=20) { - return; - } if (k==13 && (ev.shiftKey||ev.ctrlKey||ev.altKey||ev.metaKey)) { // *-enter - repl(); return false; - } if (keymode) { - keymode = 0; - doc.kb.classList.remove('backslash'); - let c = keys[ev.key]; - if (c) return typeChar(ev.target, c, ev); - } else if (k===220) { // \ - keymode = 1; - doc.kb.classList.add('backslash'); - ev.preventDefault(); - } -} -let typeChar = (t, c, ev) => { - ev.preventDefault(); - let v = t.value; - let i = t.selectionStart; - t.value = v.slice(0,i)+c+v.slice(t.selectionEnd); - t.selectionStart = t.selectionEnd = i+c.length; - return false; -} - -let syncls={ v:"Value", f:"Function", m:"Modifier", d:"Modifier2", n:"Number", g:"Gets", p:"Paren", b:"Bracket", k:"Brace", l:"Ligature", n:"Nothing", s:"Separator", c:"Comment" }; -let keydesc='f+Conjugate;Add_f-Negate;Subtract_f×Sign;Multiply_f÷Reciprocal;Divide_f⋆Exponential;Power_f√Square Root;Root_f⌊Floor;Minimum_f⌈Ceiling;Maximum_f∧Sort Up;And_f∨Sort Down;Or_f¬Not;Span_f|Absolute Value;Modulus_f≤Less Than or Equal to_f<Enclose;Less Than_f>Merge;Greater Than_f≥Greater Than or Equal to_f=Rank;Equals_f≠Length;Not Equals_f≡Depth;Match_f≢Shape;Not Match_f⊣Identity;Left_f⊢Identity;Right_f⥊Deshape;Reshape_f∾Join;Join to_f≍Solo;Couple_f↑Prefixes;Take_f↓Suffixes;Drop_f↕Range;Windows_f⌽Reverse;Rotate_f⍉Transpose;Reorder axes_f/Indices;Replicate_f⍋Grade Up;Bins Up_f⍒Grade Down;Bins Down_f⊏First Cell;Select_f⊑First;Pick_f⊐Index of_f⊒Occurrence Count;Progressive Index of_f∊Unique Mask;Member of_f⍷Deduplicate;Find_f⊔Group Indices;Group_f!Assert;Assert with message_m˜Self/Swap_d∘Atop_d○Over_d⊸Before/Bind_d⟜After/Bind_d⌾Under_d⊘Valences_d◶Choose_d⎉Rank_m˘Cells_d⚇Depth_m¨Each_m⌜Table_d⍟Repeat_m⁼Undo_m´Fold_m˝Insert_m`Scan_b←Define_b↩Change_b→Return_s⋄Separator_s,Separator_p(Begin expression_p)End expression_k{Begin block_k}End block_b⟨Begin list_b⟩End list_l‿Strand_n·Nothing_v•System_v𝕨Left argument_f𝕎Left argument (as function)_v𝕩Right argument_f𝕏Right argument (as function)_v𝕗Modifier left operand (as subject)_f𝔽Modifier left operand_v𝕘2-modifier right operand (as subject)_f𝔾2-modifier right operand_v𝕤Current function (as subject)_f𝕊Current function_m𝕣Current modifier_n¯Minus_nπPi_n∞Infinity_c#Comment'.split(/[\n_]/); -let kk=Array.from('`123456890-=~!@#$%^&*()_+qwertuiop[]QWERTIOP{}asdfghjkl;ASFGK:"zxcvbm,./XVBM<> \''); -let kv=Array.from('˜˘¨⁼⌜´˝∞¯•÷׬⎉⚇⍟◶⊘⎊⍎⍕⟨⟩√⋆⌽𝕨∊↑∧⊔⊏⊐π←→↙𝕎⍷𝕣⍋⊑⊒⍳⊣⊢⍉𝕤↕𝕗𝕘⊸∘○⟜⋄↖𝕊𝔽𝔾⌾·˙⥊𝕩↓∨⌊≡∾≍≠𝕏⍒⌈≢≤≥‿↩'); -let keys={}, revkeys={}; -kk.map((k,i)=>{keys[k]=kv[i];revkeys[kv[i]]=k;}); -doc.kb.innerHTML = keydesc.map(d=>{ - let s = syncls[d[0]]; - let c = Array.from(d)[1]; - let t = d.slice(1+c.length).replace(';','\n'); - let k = revkeys[c]; if (k) t += '\n\\ '+k; - return '<span title="'+t+'" class="'+s+'">'+c+'</span>' -}).join("​"); // zero-width space -doc.kb.onmousedown = ev => { - let t = ev.target; - if (t.nodeName === 'SPAN') { - return typeChar(doc.code, t.textContent, ev); - } -} - -doc.perm.onmouseover = doc.perm.onfocus = () => { - doc.perm.href='#code='+escape(doc.code.value) -} - -if (location.hash) { - let hp={}; - location.hash.substring(1).split(',').map(s=>{ - let[k,v]=s.split('=');hp[k]=unescape(v) - }); - doc.code.value = hp.code||''; - if (hp.run) repl(); -} -doc.code.focus(); -</script> +<script src="repl.js"></script> </body> </html> |
