forked from ktye/ktye.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjs.html
More file actions
71 lines (61 loc) · 4.23 KB
/
Copy pathjs.html
File metadata and controls
71 lines (61 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<head><meta charset="utf-8"><title>j</title></head>
<link rel=icon href='data:;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABSSURBVDhPY/wPBAwUACYozcDAyAjBhACaOoQBZAKCBjACbQNhXID2LgCFMb5wHgJeIARoYwAhfyMD2nqBGFdgNQA93slKB7AEhE8zCFCYnRkYAOS/HR/UGSYjAAAAAElFTkSuQmCC'>
<style>
html{font-family:monospace;}
body{overflow:hidden}
textarea{background:black;color:#cccccc;resize:none;border:none}textarea:focus{color:white;}
#term{position:absolute;width:40%;height:100%;left:0;top:0;background:#ffffea;color:black}
#run{position:absolute;top:0;right:60%;font-family:monospace}
#cnv{position:absolute;width:60%;height:70%;right:0;top:0}
#deb{position:absolute;width:60%;height:30%;right:0;bottom:0}
</style>
<script src=pako.min.js></script><!--zip/unzip url-->
<script>
var J,JJ,C,U,I,B,jj,ctx,ani
function ge(x){return document.getElementById(x)};
function us(s){return new TextEncoder("utf-8").encode(s)}
function su(u){return new TextDecoder("utf-8").decode(u)}
function sy(x,u){u=[];x>>>=2;while(x>0){u.push(96+x%32);x>>>=5};return su(new Uint8Array(u.reverse()))}
function ys(s,y,i){y=0;for(i=0;i<s.length;i++){y*=32;y+=s.charCodeAt(i)-96};return 2+4*y}
function input(t,a,b,s){a=t.selectionStart;b=t.selectionEnd;s=t.value;return (b-a)>0?s.substring(a,b):s}
function surl(){window.location.hash=btoa(c1(pako.deflate(us(term.value))))}
function gurl(x){x=window.location.hash.slice(1);try{return x?su(pako.inflate(c0(atob(x)))):''}catch(x){return''}}
function c1(x,r,i){r='';for(i=0;i<x.length;i++)r+=chr(x[i]);return r};var chr=String.fromCharCode;
function c0(x,r,i){r=new Uint8Array(x.length);for(i=0;i<x.length;i++)r[i]=x.charCodeAt(i);return r}
function start(w,h){surl();w=cnv.clientWidth;h=cnv.clientHeight;cnv.width=w;cnv.height=h;jtry(us(input(term).replaceAll("\n"," ")),w,h)}
function stop(){window.cancelAnimationFrame(ani);run.innerText="run";run.onclick=start}
function started(){run.innerText="stop";run.onclick=stop}
function jtry(u,w,h){C.set(B);asi("w",w);asi("h",h);jju(jj);
try {jju(u);JJ(33);JJ(10);ani=window.requestAnimationFrame(animate)}
catch(e){console.log(e);deb.value="!"}}
function jju(u){for(var i=0;i<u.length;i++)JJ(u[i])}
function stk(x){deb.value=X(U[1])}
function X(x){return(x==0)?"!!":(!(x&7))?LX(x):(x&1)?(x>>1).toString():(x&2)?sy(x):(x&4)?chr(33+(x>>>3)):"!!!"}
function LX(x,n){n=nn(x);x=2+(x>>>2);var r=new Array(n);for(var i=0;i<n;i++)r[i]=X(U[x+i]);return "["+r.join(" ")+"]"}
function SX(x,n){n=nn(x);x=2+(x>>>2);var r=new Uint8Array(n);for(var i=0;i<n;i++)r[i]=U[x+i]>>1;return su(r)}
function AX(x,n,u){n=nn(x);x=2+(x>>>2);var r=new Array(n);for(var i=0;i<n;i++){u=U[x+i];r[i]=(u&1)?u>>1:sy(u)};return r}
function nn(x){return U[1+(x>>>2)]}
function asi(s,v){JJ(91);jju(us((v).toString()));JJ(93);JJ(91);jju(us(s));JJ(93);JJ(58)}
function draw(x,y){if((0!=(x&7))||(0!=(y&7)))return;var a=AX(x);var s=SX(y);a=rad(s,a)
if(typeof(ctx[s])==="function")ctx[s](...a);else ctx[s]=a}
function rad(s,a){var r=function(...i){for(var k=0;k<i.length;k++){a[i[k]]*=Math.PI/180};return a};
return(s=="arc")?r(3,4):(s=="ellipse")?r(4,5,6):(s=="rotate")?r(0):a} //degree to radians (j has only ints)
function animate(t){
try {JJ(102);JJ(114);JJ(97);JJ(109);JJ(101);JJ(10);ani=window.requestAnimationFrame(animate);started()}
catch(e){window.cancelAnimationFrame(ani)}}
</script>
<body>
<textarea id="term" class="term" wrap="off" spellcheck="false"></textarea>
<button id="run">run</button>
<canvas id="cnv"></canvas>
<textarea id="deb" class="term" wrap="off" spellcheck="false" readonly></textarea>
<script>term=ge("term");cnv=ge("cnv");deb=ge("deb");ctx=cnv.getContext('2d');run=ge("run")
function jload(){fetch('j.j').then(r=>r.arrayBuffer()).then(u=>jj=new Uint8Array(u))}
function msl(b){J.exports.mem.grow(3);b=J.exports.mem.buffer;C=new Uint8Array(b);U=new Uint32Array(b);I=new Int32Array(b);JJ=J.exports.j;JJ(18);B=C.slice(0);jload()}
fetch('j.wasm').then(r=>r.arrayBuffer()).then(r=>WebAssembly.instantiate(r,{"ext":{"stk":stk,"draw":draw} })).then(r=>{J=r.instance;msl();})
cnv.addEventListener('click', function(e){jju(us(" ["+String(e.pageX-cnv.offsetLeft)+" "+String(e.clientY)+"]click "));JJ(10)}, true)
term.value=gurl()
deb.value=""
run.onclick=start
</script>
</body></html>