wiki-plugin-mech 0.1.31 → 0.1.33-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client/mech.js CHANGED
@@ -1,24 +1,30 @@
1
- /* wiki-plugin-mech - 0.1.31 - Tue, 15 Jul 2025 18:23:04 GMT */
2
- (()=>{function B(e,o){let i=[];for(let n of document.querySelectorAll(".item"))if(n.classList.contains(`${o}-source`)&&i.unshift(n),n===e)break;return i.map(n=>{let t=n[`${o}Data`],s=t?t():null;return{div:n,result:s}})}function z(e){let o=t=>Object.entries(t).filter(s=>s[1]).map(s=>`${s[0]}: ${s[1]}`).join("\\n"),i=e.nodes.map((t,s)=>{let r=t.type?`${t.type}\\n${t.props.name}`:t.props.name;return`${s} [label="${r}" ${t.props.url||t.props.tick?`URL="${t.props.url||"#"}" target="_blank"`:""} tooltip="${o(t.props)}"]`}),n=e.rels.map(t=>`${t.from}->${t.to} [label="${t.type}" labeltooltip="${o(t.props)}"]`);return["digraph {","rankdir=LR","node [shape=box style=filled fillcolor=palegreen]",...i,...n,"}"].join(`
3
- `)}function J(e,o="steps",i,n={}){let t=(f,k)=>i.find(y=>y.slug==f&&(!k||y.domain==k)),s=f=>f?f.map(k=>t(k)):null,r=f=>Math.floor(f*Math.abs(Math.random()-Math.random())),c=f=>f[r(f.length)],l=f=>f.links&&Object.keys(f.links).length<10,p=f=>i.filter(k=>l(k)&&f in k.links),a=(f,k,y)=>y.findIndex(x=>x.slug==f.slug)===k,u=f=>f.toSorted((k,y)=>y.date-k.date).filter(a).slice(0,3),g=i.map(f=>f.domain).filter(_);function m(f){let k=new K,y=h=>k.addUniqNode("",{name:h.title.replaceAll(/ /g,`
4
- `),title:h.title,site:h.domain}),x=h=>s(h?.patterns?.up)??u(p(h.slug)),E=h=>h?.patterns?.down??Object.keys(h.links||{}),w=y(f);for(let h of x(f))k.addRel("",y(h),w);for(let h of E(f)){let v=t(h);if(v){let A=y(v);k.addRel("",w,A);for(let D of x(v))k.addRel("",y(D),A)}}return k}switch(o){case"steps":return d(e);case"days":return S(o,1,e);case"weeks":return S(o,7,e);case"months":return S(o,30,e);case"hubs":return O(e);case"references":return C();case"lineup":return I()}function d(f=5){return g.map(k=>{let y=k.split(".").slice(0,3).join("."),x=new Set,E=new K,w=0,h=i.filter(L=>L.domain==k&&"links"in L);if(!h.length)return{name:y,graph:null};let v=L=>(w=E.addNode("",{name:L.title.replaceAll(/ /g,`
5
- `),title:L.title,site:k,links:Object.keys(L.links||{}).filter(T=>t(T))}),w),A=(L,T)=>E.addRel("",L,T),D=L=>E.nodes[L].props.links.filter(T=>!x.has(T)),N=c(h);x.add(N.slug),v(N);for(let L=5;L>0;L--)try{let T=D(w),j=c(T);x.add(j);let W=t(j);A(w,v(W))}catch{}return{name:y,graph:E}})}function S(f,k,y=12){let x=k*24*60*60*1e3,w=[...Array(Number(y)).keys()].map(v=>Date.now()-v*x),h=[];for(let v of w){let A=v-x,D=`${f.replace(/s$/,"")} ${new Date(A).toLocaleDateString()}`,N=i.filter(L=>L.date<v&&L.date>=A).filter(L=>!(L.links&&Object.keys(L.links).length>5));if(N.length){let L=N.reduce((T,j)=>(T.add(j.domain),T),new Set);for(let T of L){let j=new K,W=H=>j.addUniqNode("",{name:H.title.replaceAll(/ /g,`
6
- `),title:H.title,site:H.domain,date:H.date}),oe=T.split(/\.|\:/)[0];for(let H of N.filter(F=>F.domain==T)){let F=W(H);for(let ie in H.links||{}){let U=t(ie);U&&j.addRel("",F,W(U))}}h.push({name:`${D} ${oe}`,graph:j})}}}return h}function O(f=12){let k=[],y=new Set,x={};for(let w of i)if(w.links)if(Object.keys(w.links).length<=15)for(let h in w.links)t(h)&&(x[h]=(x[h]||0)+1);else y.add(w.slug);y.size>0&&console.log("hub links ignored for large pages:",[...y]);let E=Object.entries(x).sort((w,h)=>h[1]-w[1]).slice(0,f);console.log({hits:x,hubs:E});for(let w of E){let h=`hub ${w[1]} ${w[0]}`,v=m(t(w[0]));k.push({name:h,graph:v})}return k}function I(){let f=[],k=n.lineup();console.log({lineup:k});for(let y of k){let x=wiki.lineup.atKey(y.dataset.key),E=x.getSlug(),w=x.getRemoteSite(location.host),h=t(E,w);console.log({div:y,pageObject:x,site:w,slug:E,info:h}),f.push({name:x.getTitle(),graph:m(h)})}return f}function C(){let f=[],k=n.references();console.log({items:k});for(let y of k){let{title:x,site:E,slug:w}=y,h=t(w,E);console.log({site:E,slug:w,info:h}),f.push({name:x,graph:m(h)})}return console.log({aspects:f}),f}}function V(e,o,i){let n=o.filter(c=>c.match(/\t/)).map(r).flat().sort((c,l)=>c.word<l.word?-1:1),t="zzz".slice(0,e),s=[];for(let c of n){let l=c.word.toLowerCase().slice(0,e);l!=t&&(s.push({group:l,quotes:[]}),t=l),s[s.length-1].quotes.push(c)}return s;function r(c){let[l,p]=c.split(/\t/);return p.replaceAll(/'t\b/g,"t").replaceAll(/'s\b/g,"s").split(/[^a-zA-Z]+/).filter(u=>u.length>3&&!i.has(u.toLowerCase())).map(u=>({word:u,line:c,key:l}))}}var K=class{constructor(o=[],i=[]){this.nodes=o,this.rels=i}addNode(o,i={}){let n={type:o,in:[],out:[],props:i};return this.nodes.push(n),this.nodes.length-1}addUniqNode(o,i={}){let n=this.nodes.findIndex(t=>t.type==o&&t.props?.name==i?.name);return n>=0?n:this.addNode(o,i)}addRel(o,i,n,t={}){let s={type:o,from:i,to:n,props:t};this.rels.push(s);let r=this.rels.length-1;return this.nodes[i].out.push(r),this.nodes[n].in.push(r),r}stringify(...o){let i={nodes:this.nodes,rels:this.rels};return JSON.stringify(i,...o)}};function Z(e,o){let i=()=>(e.story||[]).map(s=>s?.id),n=(s,r)=>{let c=i().indexOf(s)+1;e.story.splice(c,0,r)},t=()=>{let s=i().indexOf(o.id);s!==-1&&e.story.splice(s,1)};switch(e.story=e.story||[],o.type){case"create":o.item&&(o.item.title!=null&&(e.title=o.item.title),o.item.story!=null&&(e.story=o.item.story.slice()));break;case"add":n(o.after,o.item);break;case"edit":let s=i().indexOf(o.id);s!==-1?e.story.splice(s,1,o.item):e.story.push(o.item);break;case"move":let r=o.order.indexOf(o.id),c=o.order[r-1],l=e.story[i().indexOf(o.id)];t(),n(c,l);break;case"remove":t();break}e.journal=e.journal||[],o.fork&&e.journal.push({type:"fork",site:o.fork,date:o.date-1}),e.journal.push(o)}function q(e){if(!e.data)return;let{data:o}=e;if(o?.action=="publishSourceData"&&o?.name=="aspect"){wiki.debug&&console.log("soloListener - source update",{event:e,data:o});return}if(!e.source.opener||e.source.location.pathname!=="/plugins/solo/dialog/"){wiki.debug&&console.log("soloListener - not for us",{event:e});return}wiki.debug&&console.log("soloListener - ours",{event:e});let{action:i,keepLineup:n=!1,pageKey:t=null,title:s=null,context:r=null,page:c=null}=o,l=null;switch(t!=null&&(l=n?null:$(".page").filter((p,a)=>$(a).data("key")==t)),i){case"doInternalLink":wiki.pageHandler.context=r,wiki.doInternalLink(s,l);break;case"showResult":let p=n?{}:{$page:l};wiki.showResult(wiki.newPage(c),p);break;default:console.error({where:"soloListener",message:"unknown action",data:o})}}var se=Number.MAX_SAFE_INTEGER;function G(e,o=1e3,i=se){let n=!1,t=Date.now(),s={stop:c,remainingTicks:i,minMS:o,ticksSoFar:0,timeSinceLastTick:0},r=l();return r.api=s,r;function c(){n=!0}async function l(){if(n||s.remainingTicks<1)return;s.remainingTicks-=1,s.ticksSoFar+=1,s.timeSinceLastTick=Date.now()-t,t=Date.now();let p=new Promise(a=>setTimeout(a,s.minMS));return await e(s),await p,l()}}var Q={trouble:b,inspect:R,response:Y,button:re,element:ce,jfetch:le,status:ae,sourceData:ue,showResult:de,neighborhood:fe,publishSourceData:pe,newSVG:ge,SVGline:he,ticker:G};function b(e,o){e.innerText.match(/✖︎/)||(e.innerHTML+='<button style="border-width:0;color:red;">\u2716\uFE0E</button>',e.querySelector("button").addEventListener("click",i=>{e.outerHTML+=`<span style="width:80%;color:gray;">${o}</span>`}))}function R(e,o,i){let n=e.previousElementSibling;if(i.debug){let t=i[o];n.innerHTML=`${o} \u21D2 `,n.addEventListener("click",s=>{console.log({key:o,value:t});let r=n.previousElementSibling;if(!r?.classList.contains("look")){let p=document.createElement("div");p.classList.add("look"),n.insertAdjacentElement("beforebegin",p),r=n.previousElementSibling}let c=JSON.stringify(t,null,1);c.length>300&&(c=c.substring(0,400)+"...");let l="border:1px solid black; background-color:#f8f8f8; padding:8px; color:gray; word-break: break-all;";r.innerHTML=`<div style="${l}">${c}</div>`})}else n.innerHTML=""}function Y(e,o){e.innerHTML+=o}function re(e,o,i){e.innerHTML.match(/button/)||(Y(e,`<button style="border-width:0;">${o}</button>`),e.querySelector("button").addEventListener("click",i))}function ce(e){return document.getElementById(e)}async function le(e){return fetch(e).then(o=>o.ok?o.json():null)}function ae(e,o,i){e.innerHTML=o+i}function ue(e,o){let i=e.closest(".item"),n=B(i,o).map(({div:t,result:s})=>({classList:[...t.classList],id:t.dataset.id,result:s}));return n.length?n:(b(e,`Expected source for "${o}" in the lineup.`),null)}function pe(e,o,i){let n=e.closest(".item");n.classList.add(`${o}-source`),n[`${o}Data`]=()=>i}function de(e,o){let i={$page:$(e.closest(".page"))};wiki.showResult(wiki.newPage(o),i)}function fe(e){return Object.entries(wiki.neighborhoodObject.sites).filter(([o,i])=>!i.sitemapRequestInflight&&(!e||o.includes(e))).map(([o,i])=>(i.sitemap||[]).map(n=>Object.assign({domain:o},n)))}function ge(e){let o=document.createElement("div");return e.closest(".item").firstElementChild.prepend(o),o.outerHTML=`
1
+ /* wiki-plugin-mech - 0.1.33-0 - Thu, 20 Nov 2025 17:18:17 GMT */
2
+ (()=>{function tt(t,o){let i=[];for(let n of document.querySelectorAll(".item"))if(n.classList.contains(`${o}-source`)&&i.unshift(n),n===t)break;return i.map(n=>{let e=n[`${o}Data`],s=e?e():null;return{div:n,result:s}})}function et(t){let o=e=>Object.entries(e).filter(s=>s[1]).map(s=>`${s[0]}: ${s[1]}`).join("\\n"),i=t.nodes.map((e,s)=>{let r=e.type?`${e.type}\\n${e.props.name}`:e.props.name;return`${s} [label="${r}" ${e.props.url||e.props.tick?`URL="${e.props.url||"#"}" target="_blank"`:""} tooltip="${o(e.props)}"]`}),n=t.rels.map(e=>`${e.from}->${e.to} [label="${e.type}" labeltooltip="${o(e.props)}"]`);return["digraph {","rankdir=LR","node [shape=box style=filled fillcolor=palegreen]",...i,...n,"}"].join(`
3
+ `)}function nt(t,o="steps",i,n={}){let e=(g,k)=>i.find(L=>L.slug==g&&(!k||L.domain==k)),s=g=>g?g.map(k=>e(k)):null,r=g=>Math.floor(g*Math.abs(Math.random()-Math.random())),c=g=>g[r(g.length)],l=g=>g.links&&Object.keys(g.links).length<10,u=g=>i.filter(k=>l(k)&&g in k.links),a=(g,k,L)=>L.findIndex(E=>E.slug==g.slug)===k,p=g=>g.toSorted((k,L)=>L.date-k.date).filter(a).slice(0,3),m=i.map(g=>g.domain).filter(B);function w(g){let k=new G,L=b=>k.addUniqNode("",{name:b.title.replaceAll(/ /g,`
4
+ `),title:b.title,site:b.domain}),E=b=>s(b?.patterns?.up)??p(u(b.slug)),M=b=>b?.patterns?.down??Object.keys(b.links||{}),x=L(g);for(let b of E(g))k.addRel("",L(b),x);for(let b of M(g)){let A=e(b);if(A){let W=L(A);k.addRel("",x,W);for(let R of E(A))k.addRel("",L(R),W)}}return k}switch(o){case"steps":return d(t);case"days":return T(o,1,t);case"weeks":return T(o,7,t);case"months":return T(o,30,t);case"hubs":return H(t);case"references":return V();case"lineup":return F();case"topics":return Z(t)}function d(g=5){return m.map(k=>{let L=k.split(".").slice(0,3).join("."),E=new Set,M=new G,x=0,b=i.filter(f=>f.domain==k&&"links"in f);if(!b.length)return{name:L,graph:null};let A=f=>(x=M.addNode("",{name:f.title.replaceAll(/ /g,`
5
+ `),title:f.title,site:k,links:Object.keys(f.links||{}).filter(h=>e(h))}),x),W=(f,h)=>M.addRel("",f,h),R=f=>M.nodes[f].props.links.filter(h=>!E.has(h)),j=c(b);E.add(j.slug),A(j);for(let f=5;f>0;f--)try{let h=R(x),O=c(h);E.add(O);let I=e(O);W(x,A(I))}catch{}return{name:L,graph:M}})}function T(g,k,L=12){let E=k*24*60*60*1e3,x=[...Array(Number(L)).keys()].map(A=>Date.now()-A*E),b=[];for(let A of x){let W=A-E,R=`${g.replace(/s$/,"")} ${new Date(W).toLocaleDateString()}`,j=i.filter(f=>f.date<A&&f.date>=W).filter(f=>!(f.links&&Object.keys(f.links).length>5));if(j.length){let f=j.reduce((h,O)=>(h.add(O.domain),h),new Set);for(let h of f){let O=new G,I=N=>O.addUniqNode("",{name:N.title.replaceAll(/ /g,`
6
+ `),title:N.title,site:N.domain,date:N.date}),C=h.split(/\.|\:/)[0];for(let N of j.filter(K=>K.domain==h)){let K=I(N);for(let q in N.links||{}){let _=e(q);_&&O.addRel("",K,I(_))}}b.push({name:`${R} ${C}`,graph:O})}}}return b}function H(g=12){let k=[],L=new Set,E={};for(let x of i)if(x.links)if(Object.keys(x.links).length<=15)for(let b in x.links)e(b)&&(E[b]=(E[b]||0)+1);else L.add(x.slug);L.size>0&&console.log("hub links ignored for large pages:",[...L]);let M=Object.entries(E).sort((x,b)=>b[1]-x[1]).slice(0,g);console.log({hits:E,hubs:M});for(let x of M){let b=`hub ${x[1]} ${x[0]}`,A=w(e(x[0]));k.push({name:b,graph:A})}return k}function F(){let g=[],k=n.lineup();console.log({lineup:k});for(let L of k){let E=wiki.lineup.atKey(L.dataset.key),M=E.getSlug(),x=E.getRemoteSite(location.host),b=e(M,x);console.log({div:L,pageObject:E,site:x,slug:M,info:b}),g.push({name:E.getTitle(),graph:w(b)})}return g}function V(){let g=[],k=n.references();console.log({items:k});for(let L of k){let{title:E,site:M,slug:x}=L,b=e(x,M);console.log({site:M,slug:x,info:b}),g.push({name:E,graph:w(b)})}return console.log({aspects:g}),g}function Z(g=10){let k=[],M=R=>Date.now()-R*6048e5,x=0;for(;k.length<g&&x<g;){let R=M(x++),j=M(x),f=i.filter(h=>h.date>j&&h.date<=R).filter(h=>!!h.links).filter(h=>!h.title.endsWith(" Survey"));if(f.length){let h=b(f),O=new Date(R).toLocaleDateString();k.push(...W({name:O,graph:h},j,R))}}return k;function b(R){let j=new G,f=h=>{let O="",I=i.find(v=>v.slug==h),C=i.filter(v=>v.slug==h).length,N=I.title,K=I.domain,q=I.date,_=N.replaceAll(" ",`
7
+ `),J=j.nodes.findIndex(v=>v.type==O&&v.props.name==_),S=J>=0?J:j.addNode(O,{name:_,site:K,date:q});return C>1&&(j.nodes[S].props.twins=C),S};for(let h of R){let O=f(h.slug);for(let I of A(Object.keys(h.links)))j.addRel("",O,f(I))}return j}function A(R){let j=f=>i.filter(h=>h.slug==f);return R.map(f=>[f,j(f)]).filter(f=>f[1].length).map(f=>[f[0],f[1].sort((h,O)=>O.date-h.date)[0]]).sort((f,h)=>h[1].date-f[1].date).map(f=>f[0]).slice(0,3)}function W(R,j,f){let h=R.graph,O=[],I={},C=h.nodes,N=h.rels,K=[...Array(C.length).keys()].map(S=>[S,Math.random()]).sort((S,v)=>S[1]-v[1]).map(S=>S[0]),q=S=>{if(S in I)return;K.splice(K.indexOf(S),1);let v=C[S];I[S]=O[0].addNode(v.type,v.props);for(let U of v.out)q(N[U].to);for(let U of v.in)q(N[U].from);for(let U of v.out)O[0].addRel("",I[S],I[N[U].to],{})};for(;K.length;){let S=K.shift();if(S in I)continue;let v=C[S],U=v.props.name.replaceAll(`
8
+ `," ");v.in.length+v.out.length&&(O.unshift(new G),I={},q(S))}let _=S=>S.props.date||0,J=S=>{let v=S.nodes.slice(0).sort((z,ut)=>_(ut)-_(z)).filter(z=>_(z)>=j&&_(z)<=f)[0];return console.log({node:v,nodes:S.nodes,name:R.name}),v?v.props.name.split(/\s+/).slice(0,3).join(" "):R.name};return O.reverse().map((S,v)=>({name:J(S),graph:S}))}}}function ot(t,o,i){let n=o.filter(c=>c.match(/\t/)).map(r).flat().sort((c,l)=>c.word<l.word?-1:1),e="zzz".slice(0,t),s=[];for(let c of n){let l=c.word.toLowerCase().slice(0,t);l!=e&&(s.push({group:l,quotes:[]}),e=l),s[s.length-1].quotes.push(c)}return s;function r(c){let[l,u]=c.split(/\t/);return u.replaceAll(/'t\b/g,"t").replaceAll(/'s\b/g,"s").split(/[^a-zA-Z]+/).filter(p=>p.length>3&&!i.has(p.toLowerCase())).map(p=>({word:p,line:c,key:l}))}}var G=class{constructor(o=[],i=[]){this.nodes=o,this.rels=i}addNode(o,i={}){let n={type:o,in:[],out:[],props:i};return this.nodes.push(n),this.nodes.length-1}addUniqNode(o,i={}){let n=this.nodes.findIndex(e=>e.type==o&&e.props?.name==i?.name);return n>=0?n:this.addNode(o,i)}addRel(o,i,n,e={}){let s={type:o,from:i,to:n,props:e};this.rels.push(s);let r=this.rels.length-1;return this.nodes[i].out.push(r),this.nodes[n].in.push(r),r}stringify(...o){let i={nodes:this.nodes,rels:this.rels};return JSON.stringify(i,...o)}};function it(t,o){let i=()=>(t.story||[]).map(s=>s?.id),n=(s,r)=>{let c=i().indexOf(s)+1;t.story.splice(c,0,r)},e=()=>{let s=i().indexOf(o.id);s!==-1&&t.story.splice(s,1)};switch(t.story=t.story||[],o.type){case"create":o.item&&(o.item.title!=null&&(t.title=o.item.title),o.item.story!=null&&(t.story=o.item.story.slice()));break;case"add":n(o.after,o.item);break;case"edit":let s=i().indexOf(o.id);s!==-1?t.story.splice(s,1,o.item):t.story.push(o.item);break;case"move":let r=o.order.indexOf(o.id),c=o.order[r-1],l=t.story[i().indexOf(o.id)];e(),n(c,l);break;case"remove":e();break}t.journal=t.journal||[],o.fork&&t.journal.push({type:"fork",site:o.fork,date:o.date-1}),t.journal.push(o)}function X(t){if(!t.data)return;let{data:o}=t;if(o?.action=="publishSourceData"&&o?.name=="aspect"){wiki.debug&&console.log("soloListener - source update",{event:t,data:o});return}if(!t.source.opener||t.source.location.pathname!=="/plugins/solo/dialog/"){wiki.debug&&console.log("soloListener - not for us",{event:t});return}wiki.debug&&console.log("soloListener - ours",{event:t});let{action:i,keepLineup:n=!1,pageKey:e=null,title:s=null,context:r=null,page:c=null}=o,l=null;switch(e!=null&&(l=n?null:$(".page").filter((u,a)=>$(a).data("key")==e)),i){case"doInternalLink":wiki.pageHandler.context=r,wiki.doInternalLink(s,l);break;case"showResult":let u=n?{}:{$page:l};wiki.showResult(wiki.newPage(c),u);break;default:console.error({where:"soloListener",message:"unknown action",data:o})}}var dt=Number.MAX_SAFE_INTEGER;function Q(t,o=1e3,i=dt){let n=!1,e=Date.now(),s={stop:c,remainingTicks:i,minMS:o,ticksSoFar:0,timeSinceLastTick:0},r=l();return r.api=s,r;function c(){n=!0}async function l(){if(n||s.remainingTicks<1)return;s.remainingTicks-=1,s.ticksSoFar+=1,s.timeSinceLastTick=Date.now()-e,e=Date.now();let u=new Promise(a=>setTimeout(a,s.minMS));return await t(s),await u,l()}}var rt={trouble:y,inspect:P,response:ct,button:ft,element:gt,jfetch:ht,status:mt,sourceData:kt,showResult:wt,neighborhood:yt,publishSourceData:bt,newSVG:xt,SVGline:$t,ticker:Q};function y(t,o){t.innerText.match(/✖︎/)||(t.innerHTML+='<button style="border-width:0;color:red;">\u2716\uFE0E</button>',t.querySelector("button").addEventListener("click",i=>{t.outerHTML+=`<span style="width:80%;color:gray;">${o}</span>`}))}function P(t,o,i){let n=t.previousElementSibling;if(i.debug){let e=i[o];n.innerHTML=`${o} \u21D2 `,n.addEventListener("click",s=>{console.log({key:o,value:e});let r=n.previousElementSibling;if(!r?.classList.contains("look")){let u=document.createElement("div");u.classList.add("look"),n.insertAdjacentElement("beforebegin",u),r=n.previousElementSibling}let c=JSON.stringify(e,null,1);c.length>300&&(c=c.substring(0,400)+"...");let l="border:1px solid black; background-color:#f8f8f8; padding:8px; color:gray; word-break: break-all;";r.innerHTML=`<div style="${l}">${c}</div>`})}else n.innerHTML=""}function ct(t,o){t.innerHTML+=o}function ft(t,o,i){t.innerHTML.match(/button/)||(ct(t,`<button style="border-width:0;">${o}</button>`),t.querySelector("button").addEventListener("click",i))}function gt(t){return document.getElementById(t)}async function ht(t){return fetch(t).then(o=>o.ok?o.json():null)}function mt(t,o,i){t.innerHTML=o+i}function kt(t,o){let i=t.closest(".item"),n=tt(i,o).map(({div:e,result:s})=>({classList:[...e.classList],id:e.dataset.id,result:s}));return n.length?n:(y(t,`Expected source for "${o}" in the lineup.`),null)}function bt(t,o,i){let n=t.closest(".item");n.classList.add(`${o}-source`),n[`${o}Data`]=()=>i}function wt(t,o){let i={$page:$(t.closest(".page"))};wiki.showResult(wiki.newPage(o),i)}function yt(t){return Object.entries(wiki.neighborhoodObject.sites).filter(([o,i])=>!i.sitemapRequestInflight&&(!t||o.includes(t))).map(([o,i])=>(i.sitemap||[]).map(n=>Object.assign({domain:o},n)))}function xt(t){let o=document.createElement("div");return t.closest(".item").firstElementChild.prepend(o),o.outerHTML=`
7
9
  <div style="border:1px solid black; background-color:#f8f8f8; margin-bottom:16px;">
8
10
  <svg viewBox="0 0 400 400" width=100% height=400>
9
11
  <circle id=dot r=5 cx=200 cy=200 stroke="#ccc"></circle>
10
12
  </svg>
11
- </div>`,e.closest(".item").getElementsByTagName("svg")[0]}function he(e,[o,i],[n,t]){let s=document.createElementNS("http://www.w3.org/2000/svg","line"),r=(l,p)=>s.setAttribute(l,Math.round(p));r("x1",o),r("y1",400-i),r("x2",n),r("y2",400-t),s.style.stroke="black",s.style.strokeWidth="2px",e.appendChild(s);let c=e.getElementById("dot");c.setAttribute("cx",Math.round(n)),c.setAttribute("cy",Math.round(400-t))}async function M(e,o){let i=e.slice();for(;i.length;){let n=i.shift();if("command"in n){let t=n.command,s=o.api?o.api.element(n.key):document.getElementById(n.key),[r,...c]=n.command.split(/ +/),l=i[0],p=l&&"command"in l?null:i.shift(),a={command:t,op:r,args:c,body:p,elem:s,state:o};o.debug&&console.log(a),X[r]?await X[r].emit.apply(null,[a]):r.match(/^[A-Z]+$/)?o.api.trouble(s,`${r} doesn't name a block we know.`):n.command.match(/\S/)&&o.api.trouble(s,"Expected line to begin with all-caps keyword.")}}}function me({elem:e,body:o,state:i}){if(!o?.length)return i.api.trouble(e,"CLICK expects indented blocks to follow.");i.api.button(e,"\u25B6",n=>{i.debug=n.shiftKey,M(o,i)})}function ke({elem:e,args:o,state:i}){let n=o[0]=="world"?" \u{1F30E}":" \u{1F600}";for(let t of Object.keys(i))i.api.inspect(e,t,i);i.api.response(e,n)}async function be({elem:e,args:o,body:i,state:n}){if(!i?.length)return n.api.trouble(e,"FROM expects indented blocks to follow.");let t=o[0];n.api.response(e," \u23F3"),n.page=await n.api.jfetch(`//${t}.json`),n.api.response(e," \u231B"),M(i,n)}function we({elem:e,command:o,args:i,body:n,state:t}){if(t.api.status(e,o,""),!("page"in t))return t.api.trouble(e,'Expect "page" as with FROM.');t.api.inspect(e,"page",t);let s=t.page.story.find(u=>u.type=="datalog");if(!s)return t.api.trouble(e,"Expect Datalog plugin in the page.");let r=i[0];if(!r)return t.api.trouble(e,"SENSOR needs a sensor name.");let c=s.text.split(/\n/).map(u=>u.split(/ +/)).filter(u=>u[0]=="SENSOR").find(u=>u[1]==r);if(!c)return t.api.trouble(e,`Expect to find "${r}" in Datalog.`);let l=c[2],p=u=>9/5*(u/16)+32,a=u=>u.reduce((g,m)=>g+m,0)/u.length;t.api.status(e,o," \u23F3"),t.api.jfetch(l).then(u=>{t.debug&&console.log({sensor:c,data:u}),t.api.status(e,o," \u231B");let g=p(a(Object.values(u)));t.temperature=`${g.toFixed(2)}\xB0F`,M(n,t)})}function ye({elem:e,command:o,state:i}){let n=i?.temperature;if(!n)return i.api.trouble(e,"Expect data, as from SENSOR.");i.api.inspect(e,"temperature",i),i.api.response(e,`<br><font face=Arial size=32>${n}</font>`)}function xe({elem:e,command:o,args:i,body:n,state:t}){if(!(i&&i.length))return t.api.trouble(e,'Expected Source topic, like "markers" for Map markers.');let s=i[0],r=t.api.sourceData(e,s);if(!r)return;t.debug&&console.log({topic:s,sources:r});let c=p=>{let a=r.filter(u=>u.classList.includes(p)).length;return a?`${a} ${p}`:null},l=[c("map"),c("image"),c("frame"),c("assets")].filter(p=>p).join(", ");t.api.status(e,o," \u21D2 "+l),t[s]=r.map(({id:p,result:a})=>({id:p,result:a})),n&&M(n,t)}function $e({elem:e,command:o,args:i,state:n}){let t=u=>(+u).toFixed(7),s=[],r=i;for(let u of r)switch(u){case"map":if(!("marker"in n))return n.api.trouble(e,'"map" preview expects "marker" state, like from "SOURCE marker".');n.api.inspect(e,"marker",n);let g=n.marker.map(d=>[d.result]).flat(2).map(d=>`${t(d.lat)}, ${t(d.lon)} ${d.label||""}`).filter(_).join(`
12
- `);s.push({type:"map",text:g});break;case"graph":if(!("aspect"in n))return n.api.trouble(e,'"graph" preview expects "aspect" state, like from "SOURCE aspect".');n.api.inspect(e,"aspect",n);for(let{div:d,result:S}of n.aspect){for(let{name:O,graph:I}of S)n.debug&&console.log({div:d,result:S,name:O,graph:I}),s.push({type:"paragraph",text:O}),s.push({type:"graphviz",text:z(I)});s.push({type:"pagefold",text:"."})}break;case"items":if(!("items"in n))return n.api.trouble(e,'"graph" preview expects "items" state, like from "KWIC".');n.api.inspect(e,"items",n),s.push(...n.items);break;case"page":if(!("page"in n))return n.api.trouble(e,'"page" preview expects "page" state, like from "FROM".');n.api.inspect(e,"page",n),s.push(...n.page.story);break;case"synopsis":let m=`This page created with Mech command: "${o}". See [[${n.context.title}]].`;s.push({type:"paragraph",text:m,id:n.context.itemId});break;default:return n.api.trouble(e,`"${u}" doesn't name an item we can preview`)}let l={title:"Mech Preview"+(n.tick?` ${n.tick}`:""),story:s};for(let u of l.story)u.id||=(Math.random()*10**20).toFixed(0);let p=JSON.parse(JSON.stringify(l)),a=Date.now();l.journal=[{type:"create",date:a,item:p}],n.api.showResult(e,l)}async function Le({elem:e,command:o,args:i,body:n,state:t}){let s=l=>t.api.element(l.key),r=i[0],c=t.api.neighborhood(r);for(let l of n||[]){if(!l.command.endsWith(" Survey")){t.api.trouble(s(l),"NEIGHBORS expects a Site Survey title, like Pattern Link Survey");continue}let p=c.filter(a=>a.find(u=>u.title==l.command));t.api.status(s(l),l.command,`\u21D2 ${p.length} sites`);for(let a of p){let u=`//${a[0].domain}/${te(l.command)}.json`,g=await t.api.jfetch(u);if(!g)continue;let m=g.story.find(d=>d.type=="frame")?.survey;if(m){for(let d of a){let S=Object.assign({},m.find(O=>O.slug==d.slug),d);Object.assign(d,S)}console.log({url:u,page:g,survey:m,todo:a})}}}t.neighborhood=c.flat().sort((l,p)=>p.date-l.date),t.api.status(e,o,`\u21D2 ${t.neighborhood.length} pages, ${c.length} sites`)}function Se({elem:e,command:o,args:i,state:n}){if(!("neighborhood"in n))return n.api.trouble(e,"WALK expects state.neighborhood, like from NEIGHBORS.");n.api.inspect(e,"neighborhood",n);let[,t,s]=o.match(/\b(\d+)? *(steps|days|weeks|months|hubs|lineup|references)\b/)||[];if(!s&&o!="WALK")return tate.api.trouble(e,"WALK can't understand rest of this block.");let r={lineup(){let a=[...document.querySelectorAll(".page")],u=a.indexOf(e.closest(".page"));return a.slice(0,u)},references(){let a=e.closest(".page"),u=wiki.lineup.atKey(a.dataset.key),g=u.getRawPage().story;return console.log({div:a,pageObject:u,story:g}),g.filter(m=>m.type=="reference")}},c=J(t,s,n.neighborhood,r),l=c.filter(({graph:a})=>a);n.debug&&console.log({steps:c});let p=l.map(({graph:a})=>a.nodes).flat();if(n.api.status(e,o,` \u21D2 ${l.length} aspects, ${p.length} nodes`),c.find(({graph:a})=>!a)&&n.api.trouble(e,"WALK skipped sites with no links in sitemaps"),l.length){n.aspect=n.aspect||[];let a=n.aspect.find(u=>u.id==e.id);a?a.result=l:n.aspect.push({id:e.id,result:l,source:o}),n.api.publishSourceData(e,"aspect",n.aspect.map(u=>u.result).flat()),n.debug&&console.log({command:o,state:n.aspect,item:item.aspectData()})}}function Ee({elem:e,command:o,args:i,body:n,state:t}){if(console.log({command:o,args:i,body:n,state:t}),!n?.length)return t.api.trouble(e,"TICK expects indented blocks to follow.");let s=i[0]||"1";if(!s.match(/^[1-9][0-9]?$/))return t.api.trouble(e,"TICK expects a count from 1 to 99");let r,c;if(t.tick!=null)return c=t.tick,a({shiftKey:t.debug}),r;l();function l(){t.api.button(e,"\u25B6",a)}function p(u){t.api.status(e,o,` \u21D2 ${u} remaining`)}function a(u){t.debug=u.shiftKey,t.tick=+s,p(t.tick),r=t.api.ticker(async()=>{t.debug&&console.log({tick:t.tick,count:s}),"tick"in t&&--t.tick>=0?(p(t.tick),await M(n,t)):(r=r.api.stop(),t.tick=c,t.api.status(e,o,""),l())})}}function Te({elem:e,command:o,args:i,body:n,state:t}){if(!i.length)return b(e,"UNTIL expects an argument, a word to stop running.");if(!t.tick)return b(e,"UNTIL expects to indented below an iterator, like TICKS.");if(!t.aspect)return b(e,'UNTIL expects "aspect", like from WALK.');R(e,"aspect",t),e.innerHTML=o+` \u21D2 ${t.tick}`;let s=i[0];for(let{div:r,result:c}of t.aspect)for(let{name:l,graph:p}of c)for(let a of p.nodes)if(a.type.includes(s)||a.props.name.includes(s)){t.debug&&console.log({div:r,result:c,name:l,graph:p,node:a}),delete t.tick,e.innerHTML+=" done",n&&M(n,t);return}}function ve({elem:e,command:o,args:i,state:n}){if(i.length<1)return n.api.trouble(e,'FORWARD expects an argument, the number of steps to move a "turtle".');n.turtle??={svg:n.api.newSVG(e),position:[200,200],direction:0};let t=i[0],s=n.turtle.direction*2*Math.PI/360,[r,c]=n.turtle.position;n.turtle.position=[r+t*Math.sin(s),c+t*Math.cos(s)],n.api.SVGline(n.turtle.svg,[r,c],n.turtle.position),n.api.status(e,o,` \u21D2 ${n.turtle.position.map(l=>(l-200).toFixed(1)).join(", ")}`)}function Oe({elem:e,command:o,args:i,state:n}){if(i.length<1)return n.api.trouble(e,'TURN expects an argument, the number of degrees to turn a "turtle".');n.turtle??={svg:n.api.newSVG(e),position:[200,200],direction:0};let t=+i[0];n.turtle.direction+=t,n.api.status(e,o,` \u21D2 ${n.turtle.direction}\xB0`)}function Me({elem:e,command:o,args:i,body:n,state:t}){if(!("assets"in t))return b(e,"FILE expects state.assets, like from SOURCE assets.");R(e,"assets",t);let s="//"+window.location.host,r=t.assets.map(({id:a,result:u})=>Object.entries(u).map(([g,m])=>Object.entries(m).map(([d,S])=>S.map(O=>{let I=d.startsWith("//")?d:`${s}${d}`,C=I.replace(/\/assets$/,""),f=`${I}/${g}/${O}`;return{id:a,dir:g,path:d,host:C,file:O,url:f}})))).flat(3);if(t.debug&&console.log({assets:r}),i.length<1)return b(e,"FILE expects an argument, the dot suffix for desired files.");if(!n?.length)return b(e,"FILE expects indented blocks to follow.");let c=i[0],l=r.filter(a=>a.file.endsWith(c)),p=a=>`<img width=12 src=${l[a].host+"/favicon.png"}>`;if(!l)return b(e,`FILE expects to find an asset with "${c}" suffix.`);e.innerHTML=o+`<br><div class=choices style="border:1px solid black; background-color:#f8f8f8; padding:8px;" >${l.map((a,u)=>`<span data-choice=${u} style="cursor:pointer;">
13
- ${p(u)}
13
+ </div>`,t.closest(".item").getElementsByTagName("svg")[0]}function $t(t,[o,i],[n,e]){let s=document.createElementNS("http://www.w3.org/2000/svg","line"),r=(l,u)=>s.setAttribute(l,Math.round(u));r("x1",o),r("y1",400-i),r("x2",n),r("y2",400-e),s.style.stroke="black",s.style.strokeWidth="2px",t.appendChild(s);let c=t.getElementById("dot");c.setAttribute("cx",Math.round(n)),c.setAttribute("cy",Math.round(400-e))}async function D(t,o){let i=t.slice();for(;i.length;){let n=i.shift();if("command"in n){let e=n.command,s=o.api?o.api.element(n.key):document.getElementById(n.key),[r,...c]=n.command.split(/ +/),l=i[0],u=l&&"command"in l?null:i.shift(),a={command:e,op:r,args:c,body:u,elem:s,state:o};o.debug&&console.log(a),st[r]?await st[r].emit.apply(null,[a]):r.match(/^[A-Z]+$/)?o.api.trouble(s,`${r} doesn't name a block we know.`):n.command.match(/\S/)&&o.api.trouble(s,"Expected line to begin with all-caps keyword.")}}}function Lt({elem:t,body:o,state:i}){if(!o?.length)return i.api.trouble(t,"CLICK expects indented blocks to follow.");i.api.button(t,"\u25B6",n=>{i.debug=n.shiftKey,D(o,i)})}function St({elem:t,args:o,state:i}){let n=o[0]=="world"?" \u{1F30E}":" \u{1F600}";for(let e of Object.keys(i))i.api.inspect(t,e,i);i.api.response(t,n)}async function Et({elem:t,args:o,body:i,state:n}){if(!i?.length)return n.api.trouble(t,"FROM expects indented blocks to follow.");let e=o[0];n.api.response(t," \u23F3"),n.page=await n.api.jfetch(`//${e}.json`),n.api.response(t," \u231B"),D(i,n)}function vt({elem:t,command:o,args:i,body:n,state:e}){if(e.api.status(t,o,""),!("page"in e))return e.api.trouble(t,'Expect "page" as with FROM.');e.api.inspect(t,"page",e);let s=e.page.story.find(p=>p.type=="datalog");if(!s)return e.api.trouble(t,"Expect Datalog plugin in the page.");let r=i[0];if(!r)return e.api.trouble(t,"SENSOR needs a sensor name.");let c=s.text.split(/\n/).map(p=>p.split(/ +/)).filter(p=>p[0]=="SENSOR").find(p=>p[1]==r);if(!c)return e.api.trouble(t,`Expect to find "${r}" in Datalog.`);let l=c[2],u=p=>9/5*(p/16)+32,a=p=>p.reduce((m,w)=>m+w,0)/p.length;e.api.status(t,o," \u23F3"),e.api.jfetch(l).then(p=>{e.debug&&console.log({sensor:c,data:p}),e.api.status(t,o," \u231B");let m=u(a(Object.values(p)));e.temperature=`${m.toFixed(2)}\xB0F`,D(n,e)})}function Ot({elem:t,command:o,state:i}){let n=i?.temperature;if(!n)return i.api.trouble(t,"Expect data, as from SENSOR.");i.api.inspect(t,"temperature",i),i.api.response(t,`<br><font face=Arial size=32>${n}</font>`)}function Tt({elem:t,command:o,args:i,body:n,state:e}){if(!(i&&i.length))return e.api.trouble(t,'Expected Source topic, like "markers" for Map markers.');let s=i[0],r=e.api.sourceData(t,s);if(!r)return;e.debug&&console.log({topic:s,sources:r});let c=u=>{let a=r.filter(p=>p.classList.includes(u)).length;return a?`${a} ${u}`:null},l=[c("map"),c("image"),c("frame"),c("assets")].filter(u=>u).join(", ");e.api.status(t,o," \u21D2 "+l),e[s]=r.map(({id:u,result:a})=>({id:u,result:a})),n&&D(n,e)}function Mt({elem:t,command:o,args:i,state:n}){let e=p=>(+p).toFixed(7),s=[],r=i;for(let p of r)switch(p){case"map":if(!("marker"in n))return n.api.trouble(t,'"map" preview expects "marker" state, like from "SOURCE marker".');n.api.inspect(t,"marker",n);let m=n.marker.map(d=>[d.result]).flat(2).map(d=>`${e(d.lat)}, ${e(d.lon)} ${d.label||""}`).filter(B).join(`
14
+ `);s.push({type:"map",text:m});break;case"graph":if(!("aspect"in n))return n.api.trouble(t,'"graph" preview expects "aspect" state, like from "SOURCE aspect".');n.api.inspect(t,"aspect",n);for(let{div:d,result:T}of n.aspect){for(let{name:H,graph:F}of T)n.debug&&console.log({div:d,result:T,name:H,graph:F}),s.push({type:"paragraph",text:H}),s.push({type:"graphviz",text:et(F)});s.push({type:"pagefold",text:"."})}break;case"items":if(!("items"in n))return n.api.trouble(t,'"graph" preview expects "items" state, like from "KWIC".');n.api.inspect(t,"items",n),s.push(...n.items);break;case"page":if(!("page"in n))return n.api.trouble(t,'"page" preview expects "page" state, like from "FROM".');n.api.inspect(t,"page",n),s.push(...n.page.story);break;case"synopsis":let w=`This page created with Mech command: "${o}". See [[${n.context.title}]].`;s.push({type:"paragraph",text:w,id:n.context.itemId});break;default:return n.api.trouble(t,`"${p}" doesn't name an item we can preview`)}let l={title:"Mech Preview"+(n.tick?` ${n.tick}`:""),story:s};for(let p of l.story)p.id||=(Math.random()*10**20).toFixed(0);let u=JSON.parse(JSON.stringify(l)),a=Date.now();l.journal=[{type:"create",date:a,item:u}],n.api.showResult(t,l)}async function Rt({elem:t,command:o,args:i,body:n,state:e}){let s=l=>e.api.element(l.key),r=i[0],c=e.api.neighborhood(r);for(let l of n||[]){if(!l.command.endsWith(" Survey")){e.api.trouble(s(l),"NEIGHBORS expects a Site Survey title, like Pattern Link Survey");continue}let u=c.filter(a=>a.find(p=>p.title==l.command));e.api.status(s(l),l.command,`\u21D2 ${u.length} sites`);for(let a of u){let p=`//${a[0].domain}/${at(l.command)}.json`,m=await e.api.jfetch(p);if(!m)continue;let w=m.story.find(d=>d.type=="frame")?.survey;if(w){for(let d of a){let T=Object.assign({},w.find(H=>H.slug==d.slug),d);Object.assign(d,T)}console.log({url:p,page:m,survey:w,todo:a})}}}e.neighborhood=c.flat().sort((l,u)=>u.date-l.date),e.api.status(t,o,`\u21D2 ${e.neighborhood.length} pages, ${c.length} sites`)}function jt({elem:t,command:o,args:i,state:n}){if(!("neighborhood"in n))return n.api.trouble(t,"WALK expects state.neighborhood, like from NEIGHBORS.");n.api.inspect(t,"neighborhood",n);let[,e,s]=o.match(/\b(\d+)? *(steps|days|weeks|months|hubs|lineup|references|topics)\b/)||[];if(!s&&o!="WALK")return n.api.trouble(t,"WALK can't understand rest of this block.");let r={lineup(){let a=[...document.querySelectorAll(".page")],p=a.indexOf(t.closest(".page"));return a.slice(0,p)},references(){let a=t.closest(".page"),p=wiki.lineup.atKey(a.dataset.key),m=p.getRawPage().story;return console.log({div:a,pageObject:p,story:m}),m.filter(w=>w.type=="reference")}},c=nt(e,s,n.neighborhood,r),l=c.filter(({graph:a})=>a);n.debug&&console.log({steps:c});let u=l.map(({graph:a})=>a.nodes).flat();if(n.api.status(t,o,` \u21D2 ${l.length} aspects, ${u.length} nodes`),c.find(({graph:a})=>!a)&&n.api.trouble(t,"WALK skipped sites with no links in sitemaps"),l.length){n.aspect=n.aspect||[];let a=n.aspect.find(p=>p.id==t.id);a?a.result=l:n.aspect.push({id:t.id,result:l,source:o}),n.api.publishSourceData(t,"aspect",n.aspect.map(p=>p.result).flat()),n.debug&&console.log({command:o,state:n.aspect,item:item.aspectData()})}}function It({elem:t,command:o,args:i,body:n,state:e}){if(console.log({command:o,args:i,body:n,state:e}),!n?.length)return e.api.trouble(t,"TICK expects indented blocks to follow.");let s=i[0]||"1";if(!s.match(/^[1-9][0-9]?$/))return e.api.trouble(t,"TICK expects a count from 1 to 99");let r,c;if(e.tick!=null)return c=e.tick,a({shiftKey:e.debug}),r;l();function l(){e.api.button(t,"\u25B6",a)}function u(p){e.api.status(t,o,` \u21D2 ${p} remaining`)}function a(p){e.debug=p.shiftKey,e.tick=+s,u(e.tick),r=e.api.ticker(async()=>{e.debug&&console.log({tick:e.tick,count:s}),"tick"in e&&--e.tick>=0?(u(e.tick),await D(n,e)):(r=r.api.stop(),e.tick=c,e.api.status(t,o,""),l())})}}function At({elem:t,command:o,args:i,body:n,state:e}){if(!i.length)return y(t,"UNTIL expects an argument, a word to stop running.");if(!e.tick)return y(t,"UNTIL expects to indented below an iterator, like TICKS.");if(!e.aspect)return y(t,'UNTIL expects "aspect", like from WALK.');P(t,"aspect",e),t.innerHTML=o+` \u21D2 ${e.tick}`;let s=i[0];for(let{div:r,result:c}of e.aspect)for(let{name:l,graph:u}of c)for(let a of u.nodes)if(a.type.includes(s)||a.props.name.includes(s)){e.debug&&console.log({div:r,result:c,name:l,graph:u,node:a}),delete e.tick,t.innerHTML+=" done",n&&D(n,e);return}}function Nt({elem:t,command:o,args:i,state:n}){if(i.length<1)return n.api.trouble(t,'FORWARD expects an argument, the number of steps to move a "turtle".');n.turtle??={svg:n.api.newSVG(t),position:[200,200],direction:0};let e=i[0],s=n.turtle.direction*2*Math.PI/360,[r,c]=n.turtle.position;n.turtle.position=[r+e*Math.sin(s),c+e*Math.cos(s)],n.api.SVGline(n.turtle.svg,[r,c],n.turtle.position),n.api.status(t,o,` \u21D2 ${n.turtle.position.map(l=>(l-200).toFixed(1)).join(", ")}`)}function Ht({elem:t,command:o,args:i,state:n}){if(i.length<1)return n.api.trouble(t,'TURN expects an argument, the number of degrees to turn a "turtle".');n.turtle??={svg:n.api.newSVG(t),position:[200,200],direction:0};let e=+i[0];n.turtle.direction+=e,n.api.status(t,o,` \u21D2 ${n.turtle.direction}\xB0`)}function Dt({elem:t,command:o,args:i,body:n,state:e}){if(!("assets"in e))return y(t,"FILE expects state.assets, like from SOURCE assets.");P(t,"assets",e);let s="//"+window.location.host,r=e.assets.map(({id:a,result:p})=>Object.entries(p).map(([m,w])=>Object.entries(w).map(([d,T])=>T.map(H=>{let F=d.startsWith("//")?d:`${s}${d}`,V=F.replace(/\/assets$/,""),Z=`${F}/${m}/${H}`;return{id:a,dir:m,path:d,host:V,file:H,url:Z}})))).flat(3);if(e.debug&&console.log({assets:r}),i.length<1)return y(t,"FILE expects an argument, the dot suffix for desired files.");if(!n?.length)return y(t,"FILE expects indented blocks to follow.");let c=i[0],l=r.filter(a=>a.file.endsWith(c)),u=a=>`<img width=12 src=${l[a].host+"/favicon.png"}>`;if(!l)return y(t,`FILE expects to find an asset with "${c}" suffix.`);t.innerHTML=o+`<br><div class=choices style="border:1px solid black; background-color:#f8f8f8; padding:8px;" >${l.map((a,p)=>`<span data-choice=${p} style="cursor:pointer;">
15
+ ${u(p)}
14
16
  ${a.file} \u25B6
15
17
  </span>`).join(`<br>
16
- `)}</div>`,e.querySelector(".choices").addEventListener("click",a=>{if(!("choice"in a.target.dataset))return;let u=l[a.target.dataset.choice].url;fetch(u).then(g=>g.text()).then(g=>{e.innerHTML=o+` \u21D2 ${g.length} bytes`,t.tsv=g,console.log({text:g}),M(n,t)})})}function Re({elem:e,command:o,args:i,body:n,state:t}){let s=n&&n[0]?.command;if(s&&!s.match(/\$[KW]/))return b(e,"KWIK expects $K or $W in link prototype.");if(!("tsv"in t))return b(e,"KWIC expects a .tsv file, like from ASSETS .tsv.");R(e,"tsv",t);let r=i[0]||1,c=t.tsv.trim().split(/\n/),l=new Set(["of","and","in","at"]),p=$(e.closest(".page")).data("data"),a=p.story.findIndex(m=>m.type=="pagefold"&&m.text=="stop");if(a>=0){let m=p.story.findIndex((d,S)=>S>a&&d.type=="pagefold");p.story.slice(a+1,m).map(d=>d.text.trim().split(/\s+/)).flat().forEach(d=>l.add(d))}let u=V(r,c,l);e.innerHTML=o+` \u21D2 ${c.length} lines, ${u.length} groups`;let g=m=>{let d=m.line;if(s){let S=s.replaceAll(/\$K\+/g,m.key.replaceAll(/ /g,"+")).replaceAll(/\$K/g,m.key).replaceAll(/\$W/g,m.word),O=s.match(/\$W/)?m.word:m.key;d=d.replace(O,S)}return d};t.items=u.map(m=>({type:"markdown",text:`# ${m.group}
18
+ `)}</div>`,t.querySelector(".choices").addEventListener("click",a=>{if(!("choice"in a.target.dataset))return;let p=l[a.target.dataset.choice].url;fetch(p).then(m=>m.text()).then(m=>{t.innerHTML=o+` \u21D2 ${m.length} bytes`,e.tsv=m,console.log({text:m}),D(n,e)})})}function Kt({elem:t,command:o,args:i,body:n,state:e}){let s=n&&n[0]?.command;if(s&&!s.match(/\$[KW]/))return y(t,"KWIK expects $K or $W in link prototype.");if(!("tsv"in e))return y(t,"KWIC expects a .tsv file, like from ASSETS .tsv.");P(t,"tsv",e);let r=i[0]||1,c=e.tsv.trim().split(/\n/),l=new Set(["of","and","in","at"]),u=$(t.closest(".page")).data("data"),a=u.story.findIndex(w=>w.type=="pagefold"&&w.text=="stop");if(a>=0){let w=u.story.findIndex((d,T)=>T>a&&d.type=="pagefold");u.story.slice(a+1,w).map(d=>d.text.trim().split(/\s+/)).flat().forEach(d=>l.add(d))}let p=ot(r,c,l);t.innerHTML=o+` \u21D2 ${c.length} lines, ${p.length} groups`;let m=w=>{let d=w.line;if(s){let T=s.replaceAll(/\$K\+/g,w.key.replaceAll(/ /g,"+")).replaceAll(/\$K/g,w.key).replaceAll(/\$W/g,w.word),H=s.match(/\$W/)?w.word:w.key;d=d.replace(H,T)}return d};e.items=p.map(w=>({type:"markdown",text:`# ${w.group}
17
19
 
18
- ${m.quotes.map(S=>g(S)).join(`
19
- `)}`}))}function je({elem:e,command:o,args:i,state:n}){e.innerHTML=o;let t,s;if(i.length<1)if(n.info)R(e,"info",n),t=n.info.domain,s=n.info.slug,e.innerHTML=o+` \u21D2 ${n.info.title}`;else return b(e,"SHOW expects a slug or site/slug to open in the lineup.");else{let l=i[0];[t,s]=l.includes("/")?l.split(/\//):[null,l]}if([...document.querySelectorAll(".page")].map(l=>l.id).includes(s))return b(e,"SHOW expects a page not already in the lineup.");let c=e.closest(".page");wiki.doInternalLink(s,c,t)}function Ie({elem:e,command:o,state:i}){if(!i.neighborhood)return b(e,"RANDOM expected a neighborhood, like from NEIGHBORS.");R(e,"neighborhood",i);let n=i.neighborhood,t=n.length,s=Math.floor(Math.random()*t);e.innerHTML=o+` \u21D2 ${s} of ${t}`,i.info=n[s]}function Ae({elem:e,command:o,args:i,body:n,state:t}){let s=i[0]||"1";return s.match(/^[1-9][0-9]?$/)?new Promise(r=>{n&&M(n,t).then(l=>{t.debug&&console.log(o,"children",l)}),e.innerHTML=o+` \u21D2 ${s} remain`;let c=setInterval(()=>{--s>0?e.innerHTML=o+` \u21D2 ${s} remain`:(clearInterval(c),e.innerHTML=o+" \u21D2 done",t.debug&&console.log(o,"done"),r())},1e3)}):b(e,"SLEEP expects seconds from 1 to 99")}function He({elem:e,command:o,args:i,body:n,state:t}){if(!n)return b(e,"TOGETHER expects indented commands to run together.");let s=n.map(r=>M([r],t));return Promise.all(s)}async function Ne({elem:e,command:o,args:i,body:n,state:t}){if(!n)return b(e,"GET expects indented commands to run on the server.");let s={},r=t.context.site;if(i.length)for(let d of i)if(d in t)R(e,d,t),s[d]=t[d];else if(d.match(/\./))r=d;else return b(e,`GET expected "${d}" to name state or site.`);let c=t.context.slug,l=t.context.itemId,p=`mech=${btoa(JSON.stringify(n))}&state=${btoa(JSON.stringify(s))}`,a=`//${r}/plugin/mech/run/${c}/${l}?${p}`;e.innerHTML=o+" \u21D2 in progress";let u=Date.now(),g;try{if(g=await fetch(a).then(d=>d.ok?d.json():d.status),"err"in g)return b(e,`RUN received error "${g.err}"`)}catch(d){return b(e,`RUN failed with "${d.message}"`)}t.result=g;for(let d of g.mech.flat(9)){let S=document.getElementById(d.key);"status"in d&&(S.innerHTML=d.command+` \u21D2 ${d.status}`),"trouble"in d&&b(S,d.trouble)}"debug"in g.state&&delete g.state.debug,Object.assign(t,g.state);let m=((Date.now()-u)/1e3).toFixed(3);e.innerHTML=o+` \u21D2 ${m} seconds`}function De({elem:e,command:o,args:i,body:n,state:t}){let s=c=>JSON.parse(JSON.stringify(c)),r=c=>JSON.stringify(c).length;if(i.length<1)return b(e,'DELTA expects argument, "have" or "apply" on client.');if(n)return b(e,"DELTA doesn't expect indented input.");switch(i[0]){case"have":let c=t.context.page.journal.filter(u=>u.type!="fork");t.recent=c[c.length-1].date,e.innerHTML=o+` \u21D2 ${new Date(t.recent).toLocaleString()}`;break;case"apply":if(!("actions"in t))return b(e,'DELTA apply expect "actions" as input.');R(e,"actions",t);let l=s(t.context.page),p=r(l);for(let u of t.actions)Z(l,u);t.page=l;let a=r(l);e.innerHTML=o+` \u21D2 \u2206 ${((a-p)/p*100).toFixed(1)}%`;break;default:b(e,`DELTA doesn't know "${i[0]}".`)}}function Ke({elem:e,command:o,state:i}){if(!i.neighborhood)return b(e,"ROSTER expected a neighborhood, like from NEIGHBORS.");R(e,"neighborhood",i);let n=i.neighborhood,t=n.map(c=>c.domain).filter(_),s=c=>c[Math.floor(Math.random()*c.length)];i.debug&&console.log(n);let r=[{type:"roster",text:`Mech
20
- `+t.join(`
20
+ ${w.quotes.map(T=>m(T)).join(`
21
+ `)}`}))}function _t({elem:t,command:o,args:i,state:n}){t.innerHTML=o;let e,s;if(i.length<1)if(n.info)P(t,"info",n),e=n.info.domain,s=n.info.slug,t.innerHTML=o+` \u21D2 ${n.info.title}`;else return y(t,"SHOW expects a slug or site/slug to open in the lineup.");else{let l=i[0];[e,s]=l.includes("/")?l.split(/\//):[null,l]}if([...document.querySelectorAll(".page")].map(l=>l.id).includes(s))return y(t,"SHOW expects a page not already in the lineup.");let c=t.closest(".page");wiki.doInternalLink(s,c,e)}function Pt({elem:t,command:o,state:i}){if(!i.neighborhood)return y(t,"RANDOM expected a neighborhood, like from NEIGHBORS.");P(t,"neighborhood",i);let n=i.neighborhood,e=n.length,s=Math.floor(Math.random()*e);t.innerHTML=o+` \u21D2 ${s} of ${e}`,i.info=n[s]}function Wt({elem:t,command:o,args:i,body:n,state:e}){let s=i[0]||"1";return s.match(/^[1-9][0-9]?$/)?new Promise(r=>{n&&D(n,e).then(l=>{e.debug&&console.log(o,"children",l)}),t.innerHTML=o+` \u21D2 ${s} remain`;let c=setInterval(()=>{--s>0?t.innerHTML=o+` \u21D2 ${s} remain`:(clearInterval(c),t.innerHTML=o+" \u21D2 done",e.debug&&console.log(o,"done"),r())},1e3)}):y(t,"SLEEP expects seconds from 1 to 99")}function Ct({elem:t,command:o,args:i,body:n,state:e}){if(!n)return y(t,"TOGETHER expects indented commands to run together.");let s=n.map(r=>D([r],e));return Promise.all(s)}async function Ft({elem:t,command:o,args:i,body:n,state:e}){if(!n)return y(t,"GET expects indented commands to run on the server.");let s={},r=e.context.site;if(i.length)for(let d of i)if(d in e)P(t,d,e),s[d]=e[d];else if(d.match(/\./))r=d;else return y(t,`GET expected "${d}" to name state or site.`);let c=e.context.slug,l=e.context.itemId,u=`mech=${btoa(JSON.stringify(n))}&state=${btoa(JSON.stringify(s))}`,a=`//${r}/plugin/mech/run/${c}/${l}?${u}`;t.innerHTML=o+" \u21D2 in progress";let p=Date.now(),m;try{if(m=await fetch(a).then(d=>d.ok?d.json():d.status),"err"in m)return y(t,`RUN received error "${m.err}"`)}catch(d){return y(t,`RUN failed with "${d.message}"`)}e.result=m;for(let d of m.mech.flat(9)){let T=document.getElementById(d.key);"status"in d&&(T.innerHTML=d.command+` \u21D2 ${d.status}`),"trouble"in d&&y(T,d.trouble)}"debug"in m.state&&delete m.state.debug,Object.assign(e,m.state);let w=((Date.now()-p)/1e3).toFixed(3);t.innerHTML=o+` \u21D2 ${w} seconds`}function qt({elem:t,command:o,args:i,body:n,state:e}){let s=c=>JSON.parse(JSON.stringify(c)),r=c=>JSON.stringify(c).length;if(i.length<1)return y(t,'DELTA expects argument, "have" or "apply" on client.');if(n)return y(t,"DELTA doesn't expect indented input.");switch(i[0]){case"have":let c=e.context.page.journal.filter(p=>p.type!="fork");e.recent=c[c.length-1].date,t.innerHTML=o+` \u21D2 ${new Date(e.recent).toLocaleString()}`;break;case"apply":if(!("actions"in e))return y(t,'DELTA apply expect "actions" as input.');P(t,"actions",e);let l=s(e.context.page),u=r(l);for(let p of e.actions)it(l,p);e.page=l;let a=r(l);t.innerHTML=o+` \u21D2 \u2206 ${((a-u)/u*100).toFixed(1)}%`;break;default:y(t,`DELTA doesn't know "${i[0]}".`)}}function Ut({elem:t,command:o,state:i}){if(!i.neighborhood)return y(t,"ROSTER expected a neighborhood, like from NEIGHBORS.");P(t,"neighborhood",i);let n=i.neighborhood,e=n.map(c=>c.domain).filter(B),s=c=>c[Math.floor(Math.random()*c.length)];i.debug&&console.log(n);let r=[{type:"roster",text:`Mech
22
+ `+e.join(`
21
23
  `)},{type:"activity",text:`ROSTER Mech
22
- SINCE 30 days`}];e.innerHTML=o+` \u21D2 ${t.length} sites`,i.items=r}function _e({elem:e,command:o,state:i}){let n=[...document.querySelectorAll(".page")].map(t=>{let s=$(t),r=s.data("data"),c=s.data("site")||location.host,l=s.attr("id").split("_")[0],p=r.title||"Empty",a=r.story[0]?.text||"empty";return{type:"reference",site:c,slug:l,title:p,text:a}});e.innerHTML=o+` \u21D2 ${n.length} pages`,i.items=n}function We({elem:e,command:o,args:i,state:n}){if(i.length<1)return b(e,"LISTEN expects argument, an action.");let t=i[0],s=Date.now(),r=0,c=l;c.action="publishSourceData",c.id=e.id,window.addEventListener("message",l),$(".main").on("thumb",(p,a)=>console.log("jquery",{evt:p,thumb:a})),e.innerHTML=o+" \u21D2 ready";function l(p){console.log({event:p});let{data:a}=p;if(a.action=="publishSourceData"&&(a.name==t||a.topic==t))if(r++,c.count=r,n.debug&&console.log({count:r,data:a}),r<=100){let u=Date.now(),g=u-s;s=u,e.innerHTML=o+` \u21D2 ${r} events, ${g} ms`}else window.removeEventListener("message",l)}}function Ce({elem:e,command:o,args:i,state:n}){if(i.length<1)return b(e,"MESSAGE expects argument, an action.");let t=i[0],s={action:"publishSourceData",topic:t,name:t};window.postMessage(s,"*"),e.innerHTML=o+" \u21D2 sent"}async function Fe({elem:e,command:o,state:i}){if(!("aspect"in i))return b(e,'"SOLO" expects "aspect" state, like from "WALK".');R(e,"aspect",i),e.innerHTML=o;let n=i.aspect.map(l=>({source:l.source||l.id,aspects:l.result})),t=n.reduce((l,p)=>l+p.aspects.length,0);e.innerHTML+=` \u21D2 ${n.length} sources, ${t} aspects`;let s=e.closest(".page").dataset.key,r={type:"batch",sources:n,pageKey:s};console.log({pageKey:s,doing:r}),(typeof window.soloListener>"u"||window.soloListener==null)&&(console.log("**** Adding solo listener"),window.soloListener=q,window.addEventListener("message",q)),await ee(750);let c=window.open("/plugins/solo/dialog/#","solo","popup,height=720,width=1280");c.location.pathname!="/plugins/solo/dialog/"?(console.log("launching new dialog"),c.addEventListener("load",l=>{console.log("launched and loaded"),c.postMessage(r,window.origin)})):(console.log("reusing existing dialog"),c.postMessage(r,window.origin))}var X={CLICK:{emit:me},HELLO:{emit:ke},FROM:{emit:be},SENSOR:{emit:we},REPORT:{emit:ye},SOURCE:{emit:xe},PREVIEW:{emit:$e},NEIGHBORS:{emit:Le},WALK:{emit:Se},TICK:{emit:Ee},UNTIL:{emit:Te},FORWARD:{emit:ve},TURN:{emit:Oe},FILE:{emit:Me},KWIC:{emit:Re},SHOW:{emit:je},RANDOM:{emit:Ie},SLEEP:{emit:Ae},TOGETHER:{emit:He},GET:{emit:Ne},DELTA:{emit:De},ROSTER:{emit:Ke},LINEUP:{emit:_e},LISTEN:{emit:We},MESSAGE:{emit:Ce},SOLO:{emit:Fe}};function qe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function P(e,o,i){for(;e.length;){let t=e[0].match(/( *)(.*)/),s=t[1].length,r=t[2];if(s==i)o.push({command:r}),e.shift();else if(s>i){var n=[];o.push(n),P(e,n,s)}else return o}return o}function ne(e){let o=Math.floor(Math.random()*1e6),i=(n,t)=>{let s=[];for(let r of n){let c=`${o}.${t.join(".")}`;r.key=c,"command"in r?s.push(`<font color=gray size=small></font><span style="display: block;" id=${c}>${qe(r.command)}</span>`):s.push(`<div id=${c} style="padding-left:15px">${i(r,[...t,0])}</div>`),t[t.length-1]++}return s.join(`
23
- `)};return i(e,[0])}var _=(e,o,i)=>i.indexOf(e)===o,ee=e=>new Promise(o=>setTimeout(o,e)),te=e=>e.replace(/\s/g,"-").replace(/[^A-Za-z0-9-]/g,"").toLowerCase();function lt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Ge(e,o){let i=o.text.split(/\n/),n=P(i,[],0),t=ne(n),s=e.parents(".page"),r=s.data("key"),l={context:{item:o,itemId:o.id,pageKey:r,page:wiki.lineup.atKey(r).getRawPage(),origin:window.origin,site:s.data("site")||window.location.host,slug:s.attr("id"),title:s.data("data").title},api:Q};e.append(`<div style="background-color:#eee;padding:15px;border-top:8px;">${t}</div>`),M(n,l)}function Pe(e,o){return e.dblclick(()=>wiki.textEditor(e,o))}typeof window<"u"&&window!==null&&(window.plugins.mech={emit:Ge,bind:Pe});})();
24
+ SINCE 30 days`}];t.innerHTML=o+` \u21D2 ${e.length} sites`,i.items=r}function Gt({elem:t,command:o,state:i}){let n=[...document.querySelectorAll(".page")].map(e=>{let s=$(e),r=s.data("data"),c=s.data("site")||location.host,l=s.attr("id").split("_")[0],u=r.title||"Empty",a=r.story[0]?.text||"empty";return{type:"reference",site:c,slug:l,title:u,text:a}});t.innerHTML=o+` \u21D2 ${n.length} pages`,i.items=n}function Bt({elem:t,command:o,args:i,state:n}){if(i.length<1)return y(t,"LISTEN expects argument, an action.");let e=i[0],s=Date.now(),r=0,c=l;c.action="publishSourceData",c.id=t.id,window.addEventListener("message",l),$(".main").on("thumb",(u,a)=>console.log("jquery",{evt:u,thumb:a})),t.innerHTML=o+" \u21D2 ready";function l(u){console.log({event:u});let{data:a}=u;if(a.action=="publishSourceData"&&(a.name==e||a.topic==e))if(r++,c.count=r,n.debug&&console.log({count:r,data:a}),r<=100){let p=Date.now(),m=p-s;s=p,t.innerHTML=o+` \u21D2 ${r} events, ${m} ms`}else window.removeEventListener("message",l)}}function Jt({elem:t,command:o,args:i,state:n}){if(i.length<1)return y(t,"MESSAGE expects argument, an action.");let e=i[0],s={action:"publishSourceData",topic:e,name:e};window.postMessage(s,"*"),t.innerHTML=o+" \u21D2 sent"}async function zt({elem:t,command:o,state:i}){if(!("aspect"in i))return y(t,'"SOLO" expects "aspect" state, like from "WALK".');P(t,"aspect",i),t.innerHTML=o;let n=i.aspect.map(l=>({source:l.source||l.id,aspects:l.result})),e=n.reduce((l,u)=>l+u.aspects.length,0);t.innerHTML+=` \u21D2 ${n.length} sources, ${e} aspects`;let s=t.closest(".page").dataset.key,r={type:"batch",sources:n,pageKey:s};console.log({pageKey:s,doing:r}),(typeof window.soloListener>"u"||window.soloListener==null)&&(console.log("**** Adding solo listener"),window.soloListener=X,window.addEventListener("message",X)),await lt(750);let c=window.open("/plugins/solo/dialog/#","solo","popup,height=720,width=1280");c.location.pathname!="/plugins/solo/dialog/"?(console.log("launching new dialog"),c.addEventListener("load",l=>{console.log("launched and loaded"),c.postMessage(r,window.origin)})):(console.log("reusing existing dialog"),c.postMessage(r,window.origin))}function Vt({elem:t,args:o,state:i}){let n=[];switch(o[0]){case"state":for(let s in i)n.push(`<details>
25
+ <summary>${s}</summary>
26
+ <pre>${JSON.stringify(i[s],null,2)}</pre>
27
+ </details>`);break;case"images":if(!i.commons)return y(t,'POPUP images expects "commons" state, like from "GET" "COMMONS"');let e=o[1]=="all"?i.commons.all:i.commons.here;for(let s of e.items)n.push(`<span><img height=200 src=/assets/plugins/image/${s}></span>`);break;default:return y(t,`POPUP doesn't know "${o[0]}".`)}wiki.dialog(t.innerText,n.join(`
28
+ `))}var st={CLICK:{emit:Lt},HELLO:{emit:St},FROM:{emit:Et},SENSOR:{emit:vt},REPORT:{emit:Ot},SOURCE:{emit:Tt},PREVIEW:{emit:Mt},NEIGHBORS:{emit:Rt},WALK:{emit:jt},TICK:{emit:It},UNTIL:{emit:At},FORWARD:{emit:Nt},TURN:{emit:Ht},FILE:{emit:Dt},KWIC:{emit:Kt},SHOW:{emit:_t},RANDOM:{emit:Pt},SLEEP:{emit:Wt},TOGETHER:{emit:Ct},GET:{emit:Ft},DELTA:{emit:qt},ROSTER:{emit:Ut},LINEUP:{emit:Gt},LISTEN:{emit:Bt},MESSAGE:{emit:Jt},SOLO:{emit:zt},POPUP:{emit:Vt}};function Zt(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Y(t,o,i){for(;t.length;){let e=t[0].match(/( *)(.*)/),s=e[1].length,r=e[2];if(s==i)o.push({command:r}),t.shift();else if(s>i){var n=[];o.push(n),Y(t,n,s)}else return o}return o}function pt(t){let o=Math.floor(Math.random()*1e6),i=(n,e)=>{let s=[];for(let r of n){let c=`${o}.${e.join(".")}`;r.key=c,"command"in r?s.push(`<font color=gray size=small></font><span style="display: block;" id=${c}>${Zt(r.command)}</span>`):s.push(`<div id=${c} style="padding-left:15px">${i(r,[...e,0])}</div>`),e[e.length-1]++}return s.join(`
29
+ `)};return i(t,[0])}var B=(t,o,i)=>i.indexOf(t)===o,lt=t=>new Promise(o=>setTimeout(o,t)),at=t=>t.replace(/\s/g,"-").replace(/[^A-Za-z0-9-]/g,"").toLowerCase();function me(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Xt(t,o){let i=o.text.split(/\n/),n=Y(i,[],0),e=pt(n),s=t.parents(".page"),r=s.data("key"),l={context:{item:o,itemId:o.id,pageKey:r,page:wiki.lineup.atKey(r).getRawPage(),origin:window.origin,site:s.data("site")||window.location.host,slug:s.attr("id"),title:s.data("data").title},api:rt};t.append(`<div style="background-color:#eee;padding:15px;border-top:8px;">${e}</div>`),D(n,l)}function Qt(t,o){return t.dblclick(()=>wiki.textEditor(t,o))}typeof window<"u"&&window!==null&&(window.plugins.mech={emit:Xt,bind:Qt});})();
24
30
  //# sourceMappingURL=mech.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/library.js", "../node_modules/universal-ticker/index.js", "../src/client/blocks.js", "../src/client/interpreter.js", "../src/client/mech.js"],
4
- "sourcesContent": ["import { uniq, delay, asSlug } from './mech.js'\n\n// L I B R A R Y\n\n// adapted from wiki-plugin-frame/client/frame.js\nexport function requestSourceData(item, topic) {\n let sources = []\n for (let div of document.querySelectorAll(`.item`)) {\n if (div.classList.contains(`${topic}-source`)) {\n sources.unshift(div)\n }\n if (div === item) {\n break\n }\n }\n\n return sources.map(div => {\n let getData = div[`${topic}Data`]\n let result = getData ? getData() : null\n return { div, result }\n })\n}\n\n// adapted from super-collaborator/dotify.js\nexport function dotify(graph) {\n const tip = props =>\n Object.entries(props)\n .filter(e => e[1])\n .map(e => `${e[0]}: ${e[1]}`)\n .join('\\\\n')\n const nodes = graph.nodes.map((node, id) => {\n const label = node.type ? `${node.type}\\\\n${node.props.name}` : node.props.name\n return `${id} [label=\"${label}\" ${node.props.url || node.props.tick ? `URL=\"${node.props.url || '#'}\" target=\"_blank\"` : ''} tooltip=\"${tip(node.props)}\"]`\n })\n const edges = graph.rels.map(rel => {\n return `${rel.from}->${rel.to} [label=\"${rel.type}\" labeltooltip=\"${tip(rel.props)}\"]`\n })\n return ['digraph {', 'rankdir=LR', 'node [shape=box style=filled fillcolor=palegreen]', ...nodes, ...edges, '}'].join(\n '\\n',\n )\n}\n\n// inspired by aspects-of-recent-changes/roster-graphs.html\nexport function walks(count, way = 'steps', neighborhood, scope = {}) {\n const find = (slug, site) => neighborhood.find(info => info.slug == slug && (!site || info.domain == site))\n const finds = slugs => (slugs ? slugs.map(slug => find(slug)) : null)\n const prob = n => Math.floor(n * Math.abs(Math.random() - Math.random()))\n const rand = a => a[prob(a.length)]\n const good = info => info.links && Object.keys(info.links).length < 10\n const back = slug => neighborhood.filter(info => good(info) && slug in info.links)\n // const uniq = (value, index, self) => self.indexOf(value) === index\n const dedup = (value, index, self) => self.findIndex(info => info.slug == value.slug) === index\n const newr = infos =>\n infos\n .toSorted((a, b) => b.date - a.date)\n .filter(dedup)\n .slice(0, 3)\n const domains = neighborhood.map(info => info.domain).filter(uniq)\n\n function blanket(info) {\n // hub[0] => slug\n // find(slug) => info\n // node(info) => nid\n // back(slug) => infos\n // newr(infos) => infos\n\n const graph = new Graph()\n const node = info => {\n return graph.addUniqNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n })\n }\n const up = info => finds(info?.patterns?.up) ?? newr(back(info.slug))\n const down = info => info?.patterns?.down ?? Object.keys(info.links || {})\n\n // hub\n const nid = node(info)\n\n // parents of hub\n for (const parent of up(info)) {\n graph.addRel('', node(parent), nid)\n }\n\n // children of hub\n for (const link of down(info)) {\n const child = find(link)\n if (child) {\n const cid = node(child)\n graph.addRel('', nid, cid)\n\n // parents of children of hub\n for (const parent of up(child)) {\n graph.addRel('', node(parent), cid)\n }\n }\n }\n return graph\n }\n\n switch (way) {\n case 'steps':\n return steps(count)\n case 'days':\n return periods(way, 1, count)\n case 'weeks':\n return periods(way, 7, count)\n case 'months':\n return periods(way, 30, count)\n case 'hubs':\n return hubs(count)\n case 'references':\n return references()\n case 'lineup':\n return lineup()\n }\n\n function steps(count = 5) {\n return domains.map(domain => {\n const name = domain.split('.').slice(0, 3).join('.')\n const done = new Set()\n const graph = new Graph()\n let nid = 0\n const here = neighborhood.filter(info => info.domain == domain && 'links' in info)\n if (!here.length) return { name, graph: null }\n const node = info => {\n nid = graph.addNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: domain,\n links: Object.keys(info.links || {}).filter(slug => find(slug)),\n })\n return nid\n }\n const rel = (here, there) => graph.addRel('', here, there)\n const links = nid => graph.nodes[nid].props.links.filter(slug => !done.has(slug))\n const start = rand(here)\n // const start = find('welcome-visitors')\n done.add(start.slug)\n node(start)\n for (let n = 5; n > 0; n--) {\n try {\n const slugs = links(nid)\n const slug = rand(slugs)\n done.add(slug)\n const info = find(slug)\n rel(nid, node(info))\n } catch (e) {}\n }\n return { name, graph }\n })\n }\n\n function periods(way, days, count = 12) {\n const interval = days * 24 * 60 * 60 * 1000\n const iota = [...Array(Number(count)).keys()]\n const dates = iota.map(n => Date.now() - n * interval)\n const aspects = []\n for (const stop of dates) {\n const start = stop - interval\n const name = `${way.replace(/s$/, '')} ${new Date(start).toLocaleDateString()}`\n const here = neighborhood\n .filter(info => info.date < stop && info.date >= start)\n .filter(info => !(info.links && Object.keys(info.links).length > 5))\n if (here.length) {\n const domains = here.reduce((set, info) => {\n set.add(info.domain)\n return set\n }, new Set())\n for (const domain of domains) {\n const graph = new Graph()\n const node = info => {\n return graph.addUniqNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n date: info.date,\n })\n }\n const author = domain.split(/\\.|\\:/)[0]\n for (const info of here.filter(info => info.domain == domain)) {\n const nid = node(info)\n for (const link in info.links || {}) {\n const linked = find(link)\n if (linked) graph.addRel('', nid, node(linked))\n }\n }\n aspects.push({ name: `${name} ${author}`, graph })\n }\n }\n }\n return aspects\n }\n\n function hubs(count = 12) {\n const aspects = []\n const ignored = new Set()\n const hits = {}\n for (const info of neighborhood)\n if (info.links)\n if (Object.keys(info.links).length <= 15) {\n for (const link in info.links) if (find(link)) hits[link] = (hits[link] || 0) + 1\n } else {\n ignored.add(info.slug)\n }\n if (ignored.size > 0) console.log('hub links ignored for large pages:', [...ignored])\n const hubs = Object.entries(hits)\n .sort((a, b) => b[1] - a[1])\n .slice(0, count)\n console.log({ hits, hubs })\n\n for (const hub of hubs) {\n const name = `hub ${hub[1]} ${hub[0]}`\n const graph = blanket(find(hub[0]))\n aspects.push({ name, graph })\n }\n return aspects\n }\n\n function lineup() {\n const aspects = []\n const lineup = scope.lineup()\n console.log({ lineup })\n for (const div of lineup) {\n const pageObject = wiki.lineup.atKey(div.dataset.key)\n const slug = pageObject.getSlug()\n const site = pageObject.getRemoteSite(location.host)\n const info = find(slug, site)\n console.log({ div, pageObject, site, slug, info })\n aspects.push({ name: pageObject.getTitle(), graph: blanket(info) })\n }\n return aspects\n }\n\n function references() {\n const aspects = []\n const items = scope.references()\n console.log({ items })\n for (const item of items) {\n const { title, site, slug } = item\n const info = find(slug, site)\n console.log({ site, slug, info })\n aspects.push({ name: title, graph: blanket(info) })\n }\n console.log({ aspects })\n return aspects\n }\n}\n\n// adapted from testing-file-mech/testing-kwic.html\nexport function kwic(prefix, lines, stop) {\n const quotes = lines\n .filter(line => line.match(/\\t/))\n .map(quote)\n .flat()\n .sort((a, b) => (a.word < b.word ? -1 : 1))\n let current = 'zzz'.slice(0, prefix)\n const groups = []\n for (const quote of quotes) {\n const group = quote.word.toLowerCase().slice(0, prefix)\n if (group != current) {\n groups.push({ group, quotes: [] })\n current = group\n }\n groups[groups.length - 1].quotes.push(quote)\n }\n return groups\n\n function quote(line) {\n const [key, text] = line.split(/\\t/)\n const words = text\n .replaceAll(/'t\\b/g, 't')\n .replaceAll(/'s\\b/g, 's')\n .split(/[^a-zA-Z]+/)\n .filter(word => word.length > 3 && !stop.has(word.toLowerCase()))\n return words.map(word => ({ word, line, key }))\n }\n}\n\n// adapted from graph/src/graph.js\nexport class Graph {\n constructor(nodes = [], rels = []) {\n this.nodes = nodes\n this.rels = rels\n }\n\n addNode(type, props = {}) {\n const obj = { type, in: [], out: [], props }\n this.nodes.push(obj)\n return this.nodes.length - 1\n }\n\n addUniqNode(type, props = {}) {\n const nid = this.nodes.findIndex(node => node.type == type && node.props?.name == props?.name)\n return nid >= 0 ? nid : this.addNode(type, props)\n }\n\n addRel(type, from, to, props = {}) {\n const obj = { type, from, to, props }\n this.rels.push(obj)\n const rid = this.rels.length - 1\n this.nodes[from].out.push(rid)\n this.nodes[to].in.push(rid)\n return rid\n }\n\n stringify(...args) {\n const obj = { nodes: this.nodes, rels: this.rels }\n return JSON.stringify(obj, ...args)\n }\n}\n\n// adapted from wiki-client/lib/revision.coffee\n\n// This module interprets journal actions in order to update\n// a story or even regenerate a complete story from some or\n// all of a journal.\n\nexport function apply(page, action) {\n const order = () => {\n return (page.story || []).map(item => item?.id)\n }\n\n const add = (after, item) => {\n const index = order().indexOf(after) + 1\n page.story.splice(index, 0, item)\n }\n\n const remove = () => {\n const index = order().indexOf(action.id)\n if (index !== -1) {\n page.story.splice(index, 1)\n }\n }\n\n page.story = page.story || []\n\n switch (action.type) {\n case 'create':\n if (action.item) {\n if (action.item.title != null) {\n page.title = action.item.title\n }\n if (action.item.story != null) {\n page.story = action.item.story.slice()\n }\n }\n break\n case 'add':\n add(action.after, action.item)\n break\n case 'edit':\n const index = order().indexOf(action.id)\n if (index !== -1) {\n page.story.splice(index, 1, action.item)\n } else {\n page.story.push(action.item)\n }\n break\n case 'move':\n // construct relative addresses from absolute order\n const moveIndex = action.order.indexOf(action.id)\n const after = action.order[moveIndex - 1]\n const item = page.story[order().indexOf(action.id)]\n remove()\n add(after, item)\n break\n case 'remove':\n remove()\n break\n }\n\n page.journal = page.journal || []\n if (action.fork) {\n // implicit fork\n page.journal.push({ type: 'fork', site: action.fork, date: action.date - 1 })\n }\n page.journal.push(action)\n}\n\n// adapted from Solo client\n\nexport function soloListener(event) {\n if (!event.data) return\n const { data } = event\n if (data?.action == 'publishSourceData' && data?.name == 'aspect') {\n if (wiki.debug) console.log('soloListener - source update', { event, data })\n return\n }\n\n // only continue if event is from a solo popup.\n // events from a popup window will have an opener\n // ensure that the popup window is one of ours\n\n if (!event.source.opener || event.source.location.pathname !== '/plugins/solo/dialog/') {\n if (wiki.debug) {\n console.log('soloListener - not for us', { event })\n }\n return\n }\n if (wiki.debug) {\n console.log('soloListener - ours', { event })\n }\n\n const { action, keepLineup = false, pageKey = null, title = null, context = null, page = null } = data\n\n let $page = null\n if (pageKey != null) {\n $page = keepLineup ? null : $('.page').filter((i, el) => $(el).data('key') == pageKey)\n }\n\n switch (action) {\n case 'doInternalLink':\n wiki.pageHandler.context = context\n wiki.doInternalLink(title, $page)\n break\n case 'showResult':\n const options = keepLineup ? {} : { $page }\n wiki.showResult(wiki.newPage(page), options)\n break\n default:\n console.error({ where: 'soloListener', message: 'unknown action', data })\n }\n}\n\nexport function create(revIndex, data) {\n revIndex = +revIndex\n const revJournal = data.journal.slice(0, revIndex + 1)\n const revPage = { title: data.title, story: [] }\n for (const action of revJournal) {\n apply(revPage, action || {})\n }\n return revPage\n}\n", "let max = Number.MAX_SAFE_INTEGER\n\nexport default function makeTicker (fn, minMS=1000, remainingTicks=max) {\n let hardstop = false\n let lastTickTime = Date.now()\n let api = {\n stop,\n remainingTicks,\n minMS,\n ticksSoFar: 0,\n timeSinceLastTick: 0\n }\n let r = run()\n r.api = api\n return r\n\n function stop () {\n hardstop = true\n }\n\n async function run () {\n if (hardstop || api.remainingTicks < 1) return\n api.remainingTicks -= 1\n api.ticksSoFar += 1\n api.timeSinceLastTick = Date.now() - lastTickTime\n lastTickTime = Date.now()\n\n const minTickBuffer = new Promise((resolve) => setTimeout(resolve, api.minMS))\n\n await fn(api)\n\n await minTickBuffer\n\n return run()\n }\n}", "import { soloListener, apply, requestSourceData, dotify, walks, kwic } from './library.js'\nimport { uniq, delay, asSlug } from './mech.js'\nimport ticker from 'universal-ticker'\n\nexport const api = {\n trouble,\n inspect,\n response,\n button,\n element,\n jfetch,\n status,\n sourceData,\n showResult,\n neighborhood,\n publishSourceData,\n newSVG,\n SVGline,\n ticker,\n}\n\nexport function trouble(elem, message) {\n if (elem.innerText.match(/\u2716\uFE0E/)) return\n elem.innerHTML += `<button style=\"border-width:0;color:red;\">\u2716\uFE0E</button>`\n elem.querySelector('button').addEventListener('click', event => {\n elem.outerHTML += `<span style=\"width:80%;color:gray;\">${message}</span>`\n })\n}\n\nexport function inspect(elem, key, state) {\n const tap = elem.previousElementSibling\n if (state.debug) {\n const value = state[key]\n tap.innerHTML = `${key} \u21D2 `\n tap.addEventListener('click', event => {\n console.log({ key, value })\n let look = tap.previousElementSibling\n if (!look?.classList.contains('look')) {\n const div = document.createElement('div')\n div.classList.add('look')\n tap.insertAdjacentElement('beforebegin', div)\n look = tap.previousElementSibling\n }\n let text = JSON.stringify(value, null, 1)\n if (text.length > 300) text = text.substring(0, 400) + '...'\n const css = `border:1px solid black; background-color:#f8f8f8; padding:8px; color:gray; word-break: break-all;`\n look.innerHTML = `<div style=\"${css}\">${text}</div>`\n })\n } else {\n tap.innerHTML = ''\n }\n}\n\nexport function response(elem, html) {\n elem.innerHTML += html\n}\n\nexport function button(elem, label, handler) {\n if (!elem.innerHTML.match(/button/)) {\n response(elem, `<button style=\"border-width:0;\">${label}</button>`)\n elem.querySelector('button').addEventListener('click', handler)\n }\n}\n\nexport function element(key) {\n return document.getElementById(key)\n}\n\nexport async function jfetch(url) {\n return fetch(url).then(res => (res.ok ? res.json() : null))\n}\n\nexport function status(elem, command, text) {\n elem.innerHTML = command + text\n}\n\nexport function sourceData(elem, topic) {\n const item = elem.closest('.item')\n const sources = requestSourceData(item, topic).map(({ div, result }) => ({\n classList: [...div.classList],\n id: div.dataset.id,\n result,\n }))\n if (sources.length) return sources\n trouble(elem, `Expected source for \"${topic}\" in the lineup.`)\n return null\n}\n\nexport function publishSourceData(elem, topic, data) {\n const item = elem.closest('.item')\n item.classList.add(`${topic}-source`)\n item[`${topic}Data`] = () => data\n}\n\nexport function showResult(elem, page) {\n const options = { $page: $(elem.closest('.page')) }\n wiki.showResult(wiki.newPage(page), options)\n}\n\nexport function neighborhood(want) {\n return Object.entries(wiki.neighborhoodObject.sites)\n .filter(([domain, site]) => !site.sitemapRequestInflight && (!want || domain.includes(want)))\n .map(([domain, site]) => (site.sitemap || []).map(info => Object.assign({ domain }, info)))\n}\n\nexport function newSVG(elem) {\n const div = document.createElement('div')\n elem.closest('.item').firstElementChild.prepend(div)\n div.outerHTML = `\n <div style=\"border:1px solid black; background-color:#f8f8f8; margin-bottom:16px;\">\n <svg viewBox=\"0 0 400 400\" width=100% height=400>\n <circle id=dot r=5 cx=200 cy=200 stroke=\"#ccc\"></circle>\n </svg>\n </div>`\n const svg = elem.closest('.item').getElementsByTagName('svg')[0]\n return svg\n}\n\nexport function SVGline(svg, [x1, y1], [x2, y2]) {\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n const set = (k, v) => line.setAttribute(k, Math.round(v))\n set('x1', x1)\n set('y1', 400 - y1)\n set('x2', x2)\n set('y2', 400 - y2)\n line.style.stroke = 'black'\n line.style.strokeWidth = '2px'\n svg.appendChild(line)\n const dot = svg.getElementById('dot')\n dot.setAttribute('cx', Math.round(x2))\n dot.setAttribute('cy', Math.round(400 - y2))\n}\n\n// export function ticker(handler) {\n// const interval = setInterval(handler, 1000)\n// const stop = () => clearInterval(interval)\n// return { stop }\n// }\n\nexport async function run(nest, state) {\n const scope = nest.slice()\n while (scope.length) {\n const code = scope.shift()\n if ('command' in code) {\n const command = code.command\n const elem = state.api ? state.api.element(code.key) : document.getElementById(code.key)\n const [op, ...args] = code.command.split(/ +/)\n const next = scope[0]\n const body = next && 'command' in next ? null : scope.shift()\n const stuff = { command, op, args, body, elem, state }\n if (state.debug) console.log(stuff)\n if (blocks[op]) await blocks[op].emit.apply(null, [stuff])\n else if (op.match(/^[A-Z]+$/)) state.api.trouble(elem, `${op} doesn't name a block we know.`)\n else if (code.command.match(/\\S/)) state.api.trouble(elem, `Expected line to begin with all-caps keyword.`)\n }\n }\n}\n\n// B L O C K S\n\nfunction click_emit({ elem, body, state }) {\n if (!body?.length) return state.api.trouble(elem, `CLICK expects indented blocks to follow.`)\n state.api.button(elem, '\u25B6', event => {\n state.debug = event.shiftKey\n run(body, state)\n })\n}\n\nfunction hello_emit({ elem, args, state }) {\n const world = args[0] == 'world' ? ' \uD83C\uDF0E' : ' \uD83D\uDE00'\n for (const key of Object.keys(state)) state.api.inspect(elem, key, state)\n state.api.response(elem, world)\n}\n\nasync function from_emit({ elem, args, body, state }) {\n if (!body?.length) return state.api.trouble(elem, `FROM expects indented blocks to follow.`)\n const url = args[0]\n state.api.response(elem, ' \u23F3')\n state.page = await state.api.jfetch(`//${url}.json`)\n state.api.response(elem, ' \u231B')\n run(body, state)\n}\n\nfunction sensor_emit({ elem, command, args, body, state }) {\n state.api.status(elem, command, '')\n if (!('page' in state)) return state.api.trouble(elem, `Expect \"page\" as with FROM.`)\n state.api.inspect(elem, 'page', state)\n const datalog = state.page.story.find(item => item.type == 'datalog')\n if (!datalog) return state.api.trouble(elem, `Expect Datalog plugin in the page.`)\n const device = args[0]\n if (!device) return state.api.trouble(elem, `SENSOR needs a sensor name.`)\n const sensor = datalog.text\n .split(/\\n/)\n .map(line => line.split(/ +/))\n .filter(fields => fields[0] == 'SENSOR')\n .find(fields => fields[1] == device)\n if (!sensor) return state.api.trouble(elem, `Expect to find \"${device}\" in Datalog.`)\n const url = sensor[2]\n\n const f = c => (9 / 5) * (c / 16) + 32\n const avg = a => a.reduce((s, e) => s + e, 0) / a.length\n state.api.status(elem, command, ' \u23F3')\n state.api.jfetch(url).then(data => {\n if (state.debug) console.log({ sensor, data })\n state.api.status(elem, command, ' \u231B')\n const value = f(avg(Object.values(data)))\n state.temperature = `${value.toFixed(2)}\u00B0F`\n run(body, state)\n })\n}\n\nfunction report_emit({ elem, command, state }) {\n const value = state?.temperature\n if (!value) return state.api.trouble(elem, `Expect data, as from SENSOR.`)\n state.api.inspect(elem, 'temperature', state)\n state.api.response(elem, `<br><font face=Arial size=32>${value}</font>`)\n}\n\nfunction source_emit({ elem, command, args, body, state }) {\n if (!(args && args.length)) return state.api.trouble(elem, `Expected Source topic, like \"markers\" for Map markers.`)\n const topic = args[0]\n const sources = state.api.sourceData(elem, topic)\n if (!sources) return\n if (state.debug) console.log({ topic, sources })\n const count = type => {\n const count = sources.filter(source => source.classList.includes(type)).length\n return count ? `${count} ${type}` : null\n }\n const counts = [count('map'), count('image'), count('frame'), count('assets')].filter(count => count).join(', ')\n state.api.status(elem, command, ' \u21D2 ' + counts)\n state[topic] = sources.map(({ id, result }) => ({ id, result }))\n if (body) run(body, state)\n}\n\nfunction preview_emit({ elem, command, args, state }) {\n const round = digits => (+digits).toFixed(7)\n const story = []\n const types = args\n for (const type of types) {\n switch (type) {\n case 'map':\n if (!('marker' in state))\n return state.api.trouble(elem, `\"map\" preview expects \"marker\" state, like from \"SOURCE marker\".`)\n state.api.inspect(elem, 'marker', state)\n const text = state.marker\n .map(marker => [marker.result])\n .flat(2)\n .map(latlon => `${round(latlon.lat)}, ${round(latlon.lon)} ${latlon.label || ''}`)\n .filter(uniq)\n .join('\\n')\n story.push({ type: 'map', text })\n break\n case 'graph':\n if (!('aspect' in state))\n return state.api.trouble(elem, `\"graph\" preview expects \"aspect\" state, like from \"SOURCE aspect\".`)\n state.api.inspect(elem, 'aspect', state)\n for (const { div, result } of state.aspect) {\n for (const { name, graph } of result) {\n if (state.debug) console.log({ div, result, name, graph })\n story.push({ type: 'paragraph', text: name })\n story.push({ type: 'graphviz', text: dotify(graph) })\n }\n story.push({ type: 'pagefold', text: '.' })\n }\n break\n case 'items':\n if (!('items' in state))\n return state.api.trouble(elem, `\"graph\" preview expects \"items\" state, like from \"KWIC\".`)\n state.api.inspect(elem, 'items', state)\n story.push(...state.items)\n break\n case 'page':\n if (!('page' in state)) return state.api.trouble(elem, `\"page\" preview expects \"page\" state, like from \"FROM\".`)\n state.api.inspect(elem, 'page', state)\n story.push(...state.page.story)\n break\n case 'synopsis':\n const text2 = `This page created with Mech command: \"${command}\". See [[${state.context.title}]].`\n story.push({ type: 'paragraph', text: text2, id: state.context.itemId })\n break\n default:\n return state.api.trouble(elem, `\"${type}\" doesn't name an item we can preview`)\n }\n }\n const title = 'Mech Preview' + (state.tick ? ` ${state.tick}` : '')\n const page = { title, story }\n for (const item of page.story) item.id ||= (Math.random() * 10 ** 20).toFixed(0)\n const item = JSON.parse(JSON.stringify(page))\n const date = Date.now()\n page.journal = [{ type: 'create', date, item }]\n state.api.showResult(elem, page)\n}\n\nasync function neighbors_emit({ elem, command, args, body, state }) {\n const belem = probe => state.api.element(probe.key)\n const want = args[0]\n const have = state.api.neighborhood(want)\n for (const probe of body || []) {\n if (!probe.command.endsWith(' Survey')) {\n state.api.trouble(belem(probe), `NEIGHBORS expects a Site Survey title, like Pattern Link Survey`)\n continue\n }\n const todos = have.filter(sitemap => sitemap.find(info => info.title == probe.command))\n state.api.status(belem(probe), probe.command, `\u21D2 ${todos.length} sites`)\n for (const todo of todos) {\n const url = `//${todo[0].domain}/${asSlug(probe.command)}.json`\n const page = await state.api.jfetch(url)\n if (!page) continue\n const survey = page.story.find(item => item.type == 'frame')?.survey\n if (!survey) continue\n for (const info of todo) {\n const extra = Object.assign(\n {},\n survey.find(inf => inf.slug == info.slug),\n info,\n )\n Object.assign(info, extra)\n }\n console.log({ url, page, survey, todo })\n }\n }\n state.neighborhood = have.flat().sort((a, b) => b.date - a.date)\n state.api.status(elem, command, `\u21D2 ${state.neighborhood.length} pages, ${have.length} sites`)\n}\n\nfunction walk_emit({ elem, command, args, state }) {\n if (!('neighborhood' in state))\n return state.api.trouble(elem, `WALK expects state.neighborhood, like from NEIGHBORS.`)\n state.api.inspect(elem, 'neighborhood', state)\n const [, count, way] = command.match(/\\b(\\d+)? *(steps|days|weeks|months|hubs|lineup|references)\\b/) || []\n if (!way && command != 'WALK') return tate.api.trouble(elem, `WALK can't understand rest of this block.`)\n const scope = {\n lineup() {\n const items = [...document.querySelectorAll('.page')]\n const index = items.indexOf(elem.closest('.page'))\n return items.slice(0, index)\n },\n references() {\n const div = elem.closest('.page')\n const pageObject = wiki.lineup.atKey(div.dataset.key)\n const story = pageObject.getRawPage().story\n console.log({ div, pageObject, story })\n return story.filter(item => item.type == 'reference')\n },\n }\n const steps = walks(count, way, state.neighborhood, scope)\n const aspects = steps.filter(({ graph }) => graph)\n if (state.debug) console.log({ steps })\n const nodes = aspects.map(({ graph }) => graph.nodes).flat()\n state.api.status(elem, command, ` \u21D2 ${aspects.length} aspects, ${nodes.length} nodes`)\n if (steps.find(({ graph }) => !graph)) state.api.trouble(elem, `WALK skipped sites with no links in sitemaps`)\n if (aspects.length) {\n state.aspect = state.aspect || []\n const obj = state.aspect.find(obj => obj.id == elem.id)\n if (obj) obj.result = aspects\n else state.aspect.push({ id: elem.id, result: aspects, source: command })\n // const item = elem.closest('.item')\n // item.classList.add('aspect-source')\n // item.aspectData = () => state.aspect.map(obj => obj.result).flat()\n state.api.publishSourceData(elem, 'aspect', state.aspect.map(obj => obj.result).flat())\n if (state.debug) console.log({ command, state: state.aspect, item: item.aspectData() })\n }\n}\n\nfunction tick_emit({ elem, command, args, body, state }) {\n console.log({ command, args, body, state })\n if (!body?.length) return state.api.trouble(elem, `TICK expects indented blocks to follow.`)\n const count = args[0] || '1'\n if (!count.match(/^[1-9][0-9]?$/)) return state.api.trouble(elem, `TICK expects a count from 1 to 99`)\n let clock, outertick\n if (state.tick != null) {\n outertick = state.tick\n start({ shiftKey: state.debug })\n return clock\n } else ready()\n\n function ready() {\n state.api.button(elem, '\u25B6', start)\n }\n function status(ticks) {\n state.api.status(elem, command, ` \u21D2 ${ticks} remaining`)\n }\n\n function start(event) {\n state.debug = event.shiftKey\n state.tick = +count\n status(state.tick)\n clock = state.api.ticker(async () => {\n if (state.debug) console.log({ tick: state.tick, count })\n if ('tick' in state && --state.tick >= 0) {\n status(state.tick)\n await run(body, state)\n } else {\n clock = clock.api.stop()\n state.tick = outertick\n state.api.status(elem, command, '')\n ready()\n }\n })\n }\n}\n\nfunction until_emit({ elem, command, args, body, state }) {\n if (!args.length) return trouble(elem, `UNTIL expects an argument, a word to stop running.`)\n if (!state.tick) return trouble(elem, `UNTIL expects to indented below an iterator, like TICKS.`)\n if (!state.aspect) return trouble(elem, `UNTIL expects \"aspect\", like from WALK.`)\n inspect(elem, 'aspect', state)\n elem.innerHTML = command + ` \u21D2 ${state.tick}`\n const word = args[0]\n for (const { div, result } of state.aspect)\n for (const { name, graph } of result)\n for (const node of graph.nodes)\n if (node.type.includes(word) || node.props.name.includes(word)) {\n if (state.debug) console.log({ div, result, name, graph, node })\n delete state.tick\n elem.innerHTML += ' done'\n if (body) run(body, state)\n return\n }\n}\n\nfunction forward_emit({ elem, command, args, state }) {\n if (args.length < 1)\n return state.api.trouble(elem, `FORWARD expects an argument, the number of steps to move a \"turtle\".`)\n state.turtle ??= { svg: state.api.newSVG(elem), position: [200, 200], direction: 0 }\n const steps = args[0]\n const theta = (state.turtle.direction * 2 * Math.PI) / 360\n const [x1, y1] = state.turtle.position\n state.turtle.position = [x1 + steps * Math.sin(theta), y1 + steps * Math.cos(theta)]\n state.api.SVGline(state.turtle.svg, [x1, y1], state.turtle.position)\n state.api.status(elem, command, ` \u21D2 ${state.turtle.position.map(n => (n - 200).toFixed(1)).join(', ')}`)\n}\n\nfunction turn_emit({ elem, command, args, state }) {\n if (args.length < 1)\n return state.api.trouble(elem, `TURN expects an argument, the number of degrees to turn a \"turtle\".`)\n state.turtle ??= { svg: state.api.newSVG(elem), position: [200, 200], direction: 0 }\n const degrees = +args[0]\n state.turtle.direction += degrees\n state.api.status(elem, command, ` \u21D2 ${state.turtle.direction}\u00B0`)\n}\n\nfunction file_emit({ elem, command, args, body, state }) {\n if (!('assets' in state)) return trouble(elem, `FILE expects state.assets, like from SOURCE assets.`)\n inspect(elem, 'assets', state)\n\n // [ { \"id\": \"b2d5831168b4706b\", \"result\":\n // { \"pages/testing-file-mech\":\n // { \"//ward.dojo.fed.wiki/assets\":\n // [ \"KWIC-list+axe-files.txt\", \"KWIC-list-axe-files.tsv\" ] } } } ]\n\n const origin = '//' + window.location.host\n const assets = state.assets\n .map(({ id, result }) =>\n Object.entries(result).map(([dir, paths]) =>\n Object.entries(paths).map(([path, files]) =>\n files.map(file => {\n const assets = path.startsWith('//') ? path : `${origin}${path}`\n const host = assets.replace(/\\/assets$/, '')\n const url = `${assets}/${dir}/${file}`\n return { id, dir, path, host, file, url }\n }),\n ),\n ),\n )\n .flat(3)\n if (state.debug) console.log({ assets })\n\n if (args.length < 1) return trouble(elem, `FILE expects an argument, the dot suffix for desired files.`)\n if (!body?.length) return trouble(elem, 'FILE expects indented blocks to follow.')\n const suffix = args[0]\n const choices = assets.filter(asset => asset.file.endsWith(suffix))\n const flag = choice => `<img width=12 src=${choices[choice].host + '/favicon.png'}>`\n if (!choices) return trouble(elem, `FILE expects to find an asset with \"${suffix}\" suffix.`)\n elem.innerHTML =\n command +\n `<br><div class=choices style=\"border:1px solid black; background-color:#f8f8f8; padding:8px;\" >${choices\n .map(\n (choice, i) =>\n `<span data-choice=${i} style=\"cursor:pointer;\">\n ${flag(i)}\n ${choice.file} \u25B6\n </span>`,\n )\n .join('<br>\\n')}</div>`\n elem.querySelector('.choices').addEventListener('click', event => {\n if (!('choice' in event.target.dataset)) return\n const url = choices[event.target.dataset.choice].url\n // console.log(event.target)\n // console.log(event.target.dataset.file)\n // const url = 'http://ward.dojo.fed.wiki/assets/pages/testing-file-mech/KWIC-list-axe-files.tsv'\n fetch(url)\n .then(res => res.text())\n .then(text => {\n elem.innerHTML = command + ` \u21D2 ${text.length} bytes`\n state.tsv = text\n console.log({ text })\n run(body, state)\n })\n })\n}\n\nfunction kwic_emit({ elem, command, args, body, state }) {\n const template = body && body[0]?.command\n if (template && !template.match(/\\$[KW]/)) return trouble(elem, `KWIK expects $K or $W in link prototype.`)\n if (!('tsv' in state)) return trouble(elem, `KWIC expects a .tsv file, like from ASSETS .tsv.`)\n inspect(elem, 'tsv', state)\n const prefix = args[0] || 1\n const lines = state.tsv.trim().split(/\\n/)\n\n const stop = new Set(['of', 'and', 'in', 'at'])\n const page = $(elem.closest('.page')).data('data')\n const start = page.story.findIndex(item => item.type == 'pagefold' && item.text == 'stop')\n if (start >= 0) {\n const finish = page.story.findIndex((item, i) => i > start && item.type == 'pagefold')\n page.story\n .slice(start + 1, finish)\n .map(item => item.text.trim().split(/\\s+/))\n .flat()\n .forEach(word => stop.add(word))\n }\n\n const groups = kwic(prefix, lines, stop)\n elem.innerHTML = command + ` \u21D2 ${lines.length} lines, ${groups.length} groups`\n const link = quote => {\n let line = quote.line\n if (template) {\n const substitute = template\n .replaceAll(/\\$K\\+/g, quote.key.replaceAll(/ /g, '+'))\n .replaceAll(/\\$K/g, quote.key)\n .replaceAll(/\\$W/g, quote.word)\n const target = template.match(/\\$W/) ? quote.word : quote.key\n line = line.replace(target, substitute)\n }\n return line\n }\n\n state.items = groups.map(group => {\n const text = `# ${group.group}\\n\\n${group.quotes.map(quote => link(quote)).join('\\n')}`\n return { type: 'markdown', text }\n })\n}\n\nfunction show_emit({ elem, command, args, state }) {\n elem.innerHTML = command\n let site, slug\n if (args.length < 1) {\n if (state.info) {\n inspect(elem, 'info', state)\n site = state.info.domain\n slug = state.info.slug\n elem.innerHTML = command + ` \u21D2 ${state.info.title}`\n } else {\n return trouble(elem, `SHOW expects a slug or site/slug to open in the lineup.`)\n }\n } else {\n const info = args[0]\n ;[site, slug] = info.includes('/') ? info.split(/\\//) : [null, info]\n }\n const lineup = [...document.querySelectorAll('.page')].map(e => e.id)\n if (lineup.includes(slug)) return trouble(elem, `SHOW expects a page not already in the lineup.`)\n const page = elem.closest('.page')\n wiki.doInternalLink(slug, page, site)\n}\n\nfunction random_emit({ elem, command, state }) {\n if (!state.neighborhood) return trouble(elem, `RANDOM expected a neighborhood, like from NEIGHBORS.`)\n inspect(elem, 'neighborhood', state)\n const infos = state.neighborhood\n const many = infos.length\n const one = Math.floor(Math.random() * many)\n elem.innerHTML = command + ` \u21D2 ${one} of ${many}`\n state.info = infos[one]\n}\n\nfunction sleep_emit({ elem, command, args, body, state }) {\n let count = args[0] || '1'\n if (!count.match(/^[1-9][0-9]?$/)) return trouble(elem, `SLEEP expects seconds from 1 to 99`)\n return new Promise(resolve => {\n if (body)\n run(body, state).then(result => {\n if (state.debug) console.log(command, 'children', result)\n })\n elem.innerHTML = command + ` \u21D2 ${count} remain`\n let clock = setInterval(() => {\n if (--count > 0) elem.innerHTML = command + ` \u21D2 ${count} remain`\n else {\n clearInterval(clock)\n elem.innerHTML = command + ` \u21D2 done`\n if (state.debug) console.log(command, 'done')\n resolve()\n }\n }, 1000)\n })\n}\n\nfunction together_emit({ elem, command, args, body, state }) {\n if (!body) return trouble(elem, `TOGETHER expects indented commands to run together.`)\n const children = body.map(child => run([child], state))\n return Promise.all(children)\n}\n\n// http://localhost:3000/plugin/mech/run/testing-mechs-synchronization/5e269010fc81aebe?args=WyJoZWxsbyIsIndvcmxkIl0\nasync function get_emit({ elem, command, args, body, state }) {\n if (!body) return trouble(elem, `GET expects indented commands to run on the server.`)\n let share = {}\n let where = state.context.site\n if (args.length) {\n for (const arg of args) {\n if (arg in state) {\n inspect(elem, arg, state)\n share[arg] = state[arg]\n } else if (arg.match(/\\./)) where = arg\n else {\n return trouble(elem, `GET expected \"${arg}\" to name state or site.`)\n }\n }\n }\n // const site = state.context.site\n const slug = state.context.slug\n const itemId = state.context.itemId\n const query = `mech=${btoa(JSON.stringify(body))}&state=${btoa(JSON.stringify(share))}`\n const url = `//${where}/plugin/mech/run/${slug}/${itemId}?${query}`\n elem.innerHTML = command + ` \u21D2 in progress`\n const start = Date.now()\n let result\n try {\n result = await fetch(url).then(res => (res.ok ? res.json() : res.status))\n if ('err' in result) return trouble(elem, `RUN received error \"${result.err}\"`)\n } catch (err) {\n return trouble(elem, `RUN failed with \"${err.message}\"`)\n }\n state.result = result\n for (const arg of result.mech.flat(9)) {\n const elem = document.getElementById(arg.key)\n if ('status' in arg) elem.innerHTML = arg.command + ` \u21D2 ${arg.status}`\n if ('trouble' in arg) trouble(elem, arg.trouble)\n }\n if ('debug' in result.state) delete result.state.debug\n Object.assign(state, result.state)\n const elapsed = ((Date.now() - start) / 1000).toFixed(3)\n elem.innerHTML = command + ` \u21D2 ${elapsed} seconds`\n}\n\nfunction delta_emit({ elem, command, args, body, state }) {\n const copy = obj => JSON.parse(JSON.stringify(obj))\n const size = obj => JSON.stringify(obj).length\n if (args.length < 1) return trouble(elem, `DELTA expects argument, \"have\" or \"apply\" on client.`)\n if (body) return trouble(elem, `DELTA doesn't expect indented input.`)\n switch (args[0]) {\n case 'have':\n const edits = state.context.page.journal.filter(item => item.type != 'fork')\n state.recent = edits[edits.length - 1].date\n elem.innerHTML = command + ` \u21D2 ${new Date(state.recent).toLocaleString()}`\n break\n case 'apply':\n if (!('actions' in state)) return trouble(elem, `DELTA apply expect \"actions\" as input.`)\n inspect(elem, 'actions', state)\n const page = copy(state.context.page)\n const before = size(page)\n for (const action of state.actions) apply(page, action)\n state.page = page\n const after = size(page)\n elem.innerHTML = command + ` \u21D2 \u2206 ${(((after - before) / before) * 100).toFixed(1)}%`\n break\n default:\n trouble(elem, `DELTA doesn't know \"${args[0]}\".`)\n }\n}\n\nfunction roster_emit({ elem, command, state }) {\n if (!state.neighborhood) return trouble(elem, `ROSTER expected a neighborhood, like from NEIGHBORS.`)\n inspect(elem, 'neighborhood', state)\n const infos = state.neighborhood\n const sites = infos.map(info => info.domain).filter(uniq)\n const any = array => array[Math.floor(Math.random() * array.length)]\n if (state.debug) console.log(infos)\n const items = [\n { type: 'roster', text: 'Mech\\n' + sites.join('\\n') },\n { type: 'activity', text: `ROSTER Mech\\nSINCE 30 days` },\n ]\n elem.innerHTML = command + ` \u21D2 ${sites.length} sites`\n state.items = items\n}\n\nfunction lineup_emit({ elem, command, state }) {\n const items = [...document.querySelectorAll('.page')].map(div => {\n const $page = $(div)\n const page = $page.data('data')\n const site = $page.data('site') || location.host\n const slug = $page.attr('id').split('_')[0]\n const title = page.title || 'Empty'\n const text = page.story[0]?.text || 'empty'\n return { type: 'reference', site, slug, title, text }\n })\n elem.innerHTML = command + ` \u21D2 ${items.length} pages`\n state.items = items\n}\n\nfunction listen_emit({ elem, command, args, state }) {\n if (args.length < 1) return trouble(elem, `LISTEN expects argument, an action.`)\n const topic = args[0]\n let recent = Date.now()\n let count = 0\n const handler = listen\n handler.action = 'publishSourceData'\n handler.id = elem.id\n window.addEventListener('message', listen)\n $('.main').on('thumb', (evt, thumb) => console.log('jquery', { evt, thumb }))\n elem.innerHTML = command + ` \u21D2 ready`\n\n // window.listeners = (action=null) => {\n // return getEventListeners(window).message\n // .map(t => t.listener)\n // .filter(f => f.name == 'listen')\n // .map(f => ({action:f.action,elem:document.getElementById(f.id),count:f.count}))\n // }\n\n function listen(event) {\n console.log({ event })\n const { data } = event\n if (data.action == 'publishSourceData' && (data.name == topic || data.topic == topic)) {\n count++\n handler.count = count\n if (state.debug) console.log({ count, data })\n if (count <= 100) {\n const now = Date.now()\n const elapsed = now - recent\n recent = now\n elem.innerHTML = command + ` \u21D2 ${count} events, ${elapsed} ms`\n } else {\n window.removeEventListener('message', listen)\n }\n }\n }\n}\n\nfunction message_emit({ elem, command, args, state }) {\n if (args.length < 1) return trouble(elem, `MESSAGE expects argument, an action.`)\n const topic = args[0]\n const message = {\n action: 'publishSourceData',\n topic,\n name: topic,\n }\n window.postMessage(message, '*')\n elem.innerHTML = command + ` \u21D2 sent`\n}\n\nasync function solo_emit({ elem, command, state }) {\n if (!('aspect' in state)) return trouble(elem, `\"SOLO\" expects \"aspect\" state, like from \"WALK\".`)\n inspect(elem, 'aspect', state)\n elem.innerHTML = command\n const todo = state.aspect.map(each => ({\n source: each.source || each.id,\n aspects: each.result,\n }))\n const aspects = todo.reduce((sum, each) => sum + each.aspects.length, 0)\n elem.innerHTML += ` \u21D2 ${todo.length} sources, ${aspects} aspects`\n\n // from Solo plugin, client/solo.js\n const pageKey = elem.closest('.page').dataset.key\n const doing = { type: 'batch', sources: todo, pageKey }\n console.log({ pageKey, doing })\n\n if (typeof window.soloListener == 'undefined' || window.soloListener == null) {\n console.log('**** Adding solo listener')\n window.soloListener = soloListener\n window.addEventListener('message', soloListener)\n }\n\n await delay(750)\n const popup = window.open('/plugins/solo/dialog/#', 'solo', 'popup,height=720,width=1280')\n if (popup.location.pathname != '/plugins/solo/dialog/') {\n console.log('launching new dialog')\n popup.addEventListener('load', event => {\n console.log('launched and loaded')\n popup.postMessage(doing, window.origin)\n })\n } else {\n console.log('reusing existing dialog')\n popup.postMessage(doing, window.origin)\n }\n}\n\n// C A T A L O G\n\nexport const blocks = {\n CLICK: { emit: click_emit },\n HELLO: { emit: hello_emit },\n FROM: { emit: from_emit },\n SENSOR: { emit: sensor_emit },\n REPORT: { emit: report_emit },\n SOURCE: { emit: source_emit },\n PREVIEW: { emit: preview_emit },\n NEIGHBORS: { emit: neighbors_emit },\n WALK: { emit: walk_emit },\n TICK: { emit: tick_emit },\n UNTIL: { emit: until_emit },\n FORWARD: { emit: forward_emit },\n TURN: { emit: turn_emit },\n FILE: { emit: file_emit },\n KWIC: { emit: kwic_emit },\n SHOW: { emit: show_emit },\n RANDOM: { emit: random_emit },\n SLEEP: { emit: sleep_emit },\n TOGETHER: { emit: together_emit },\n GET: { emit: get_emit },\n DELTA: { emit: delta_emit },\n ROSTER: { emit: roster_emit },\n LINEUP: { emit: lineup_emit },\n LISTEN: { emit: listen_emit },\n MESSAGE: { emit: message_emit },\n SOLO: { emit: solo_emit },\n}\n", "import { blocks, trouble, inspect, run } from './blocks.js'\n\nfunction expand(text) {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\n// I N T E R P R E T E R\n\n// https://github.com/dobbs/wiki-plugin-graphviz/blob/main/client/graphviz.js#L86-L103\nexport function tree(lines, here, indent) {\n while (lines.length) {\n let m = lines[0].match(/( *)(.*)/)\n let spaces = m[1].length\n let command = m[2]\n if (spaces == indent) {\n here.push({ command })\n lines.shift()\n } else if (spaces > indent) {\n var more = []\n here.push(more)\n tree(lines, more, spaces)\n } else {\n return here\n }\n }\n return here\n}\n\nexport function format(nest) {\n const unique = Math.floor(Math.random() * 1000000)\n const block = (more, path) => {\n const html = []\n for (const part of more) {\n const key = `${unique}.${path.join('.')}`\n part.key = key\n if ('command' in part)\n html.push(\n `<font color=gray size=small></font><span style=\"display: block;\" id=${key}>${expand(part.command)}</span>`,\n )\n else html.push(`<div id=${key} style=\"padding-left:15px\">${block(part, [...path, 0])}</div>`)\n path[path.length - 1]++\n }\n return html.join('\\n')\n }\n return block(nest, [0])\n}\n", "import { tree, format } from './interpreter.js'\nimport { api, run } from './blocks.js'\n;('use strict')\nexport const uniq = (value, index, self) => self.indexOf(value) === index\nexport const delay = time => new Promise(res => setTimeout(res, time))\nexport const asSlug = title =>\n title\n .replace(/\\s/g, '-')\n .replace(/[^A-Za-z0-9-]/g, '')\n .toLowerCase()\n\nfunction expand(text) {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\n// P L U G I N\n\nfunction emit($item, item) {\n const lines = item.text.split(/\\n/)\n const nest = tree(lines, [], 0)\n const html = format(nest)\n const $page = $item.parents('.page')\n const pageKey = $page.data('key')\n const context = {\n item,\n itemId: item.id,\n pageKey,\n page: wiki.lineup.atKey(pageKey).getRawPage(),\n origin: window.origin,\n site: $page.data('site') || window.location.host,\n slug: $page.attr('id'),\n title: $page.data('data').title,\n }\n const state = { context, api }\n $item.append(`<div style=\"background-color:#eee;padding:15px;border-top:8px;\">${html}</div>`)\n run(nest, state)\n}\n\nfunction bind($item, item) {\n return $item.dblclick(() => {\n return wiki.textEditor($item, item)\n })\n}\n\nif (typeof window !== 'undefined' && window !== null) {\n window.plugins.mech = { emit, bind }\n}\n\nexport { expand, tree, format, run }\nexport { emit, bind }\n"],
5
- "mappings": "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",
6
- "names": ["requestSourceData", "item", "topic", "sources", "div", "getData", "result", "dotify", "graph", "tip", "props", "e", "nodes", "node", "id", "label", "edges", "rel", "walks", "count", "way", "neighborhood", "scope", "find", "slug", "site", "info", "finds", "slugs", "prob", "n", "rand", "a", "good", "back", "dedup", "value", "index", "self", "newr", "infos", "b", "domains", "uniq", "blanket", "Graph", "up", "down", "nid", "parent", "link", "child", "cid", "steps", "periods", "hubs", "references", "lineup", "domain", "name", "done", "here", "there", "links", "start", "days", "interval", "dates", "aspects", "stop", "set", "author", "linked", "ignored", "hits", "hub", "pageObject", "items", "title", "kwic", "prefix", "lines", "quotes", "line", "quote", "current", "groups", "group", "key", "text", "word", "rels", "type", "obj", "from", "to", "rid", "args", "apply", "page", "action", "order", "add", "after", "remove", "moveIndex", "soloListener", "event", "data", "keepLineup", "pageKey", "context", "$page", "i", "el", "options", "max", "makeTicker", "fn", "minMS", "remainingTicks", "hardstop", "lastTickTime", "api", "stop", "run", "minTickBuffer", "resolve", "api", "trouble", "inspect", "response", "button", "element", "jfetch", "status", "sourceData", "showResult", "neighborhood", "publishSourceData", "newSVG", "SVGline", "makeTicker", "elem", "message", "event", "key", "state", "tap", "value", "look", "div", "text", "css", "html", "label", "handler", "url", "res", "command", "topic", "item", "sources", "requestSourceData", "result", "data", "page", "options", "want", "domain", "site", "info", "svg", "x1", "y1", "x2", "y2", "line", "set", "k", "v", "dot", "run", "nest", "scope", "code", "op", "args", "next", "body", "stuff", "blocks", "click_emit", "hello_emit", "world", "from_emit", "sensor_emit", "datalog", "device", "sensor", "fields", "f", "c", "avg", "a", "s", "e", "report_emit", "source_emit", "count", "type", "source", "counts", "id", "preview_emit", "round", "digits", "story", "types", "marker", "latlon", "uniq", "name", "graph", "dotify", "text2", "date", "neighbors_emit", "belem", "probe", "have", "todos", "sitemap", "todo", "asSlug", "survey", "extra", "inf", "b", "walk_emit", "way", "items", "index", "pageObject", "steps", "walks", "aspects", "nodes", "obj", "tick_emit", "clock", "outertick", "start", "ready", "ticks", "until_emit", "word", "node", "forward_emit", "theta", "n", "turn_emit", "degrees", "file_emit", "origin", "assets", "dir", "paths", "path", "files", "file", "host", "suffix", "choices", "asset", "flag", "choice", "i", "kwic_emit", "template", "prefix", "lines", "stop", "finish", "groups", "kwic", "link", "quote", "substitute", "target", "group", "show_emit", "slug", "random_emit", "infos", "many", "one", "sleep_emit", "resolve", "together_emit", "children", "child", "get_emit", "share", "where", "arg", "itemId", "query", "err", "elapsed", "delta_emit", "copy", "size", "edits", "before", "action", "apply", "after", "roster_emit", "sites", "any", "array", "lineup_emit", "$page", "title", "listen_emit", "recent", "listen", "evt", "thumb", "now", "message_emit", "solo_emit", "each", "sum", "pageKey", "doing", "soloListener", "delay", "popup", "expand", "text", "tree", "lines", "here", "indent", "m", "spaces", "command", "more", "format", "nest", "unique", "block", "path", "html", "part", "key", "uniq", "value", "index", "self", "delay", "time", "res", "asSlug", "title", "expand", "text", "emit", "$item", "item", "lines", "nest", "tree", "html", "format", "$page", "pageKey", "state", "api", "run", "bind"]
4
+ "sourcesContent": ["import { uniq, delay, asSlug } from './mech.js'\n\n// L I B R A R Y\n\n// adapted from wiki-plugin-frame/client/frame.js\nexport function requestSourceData(item, topic) {\n let sources = []\n for (let div of document.querySelectorAll(`.item`)) {\n if (div.classList.contains(`${topic}-source`)) {\n sources.unshift(div)\n }\n if (div === item) {\n break\n }\n }\n\n return sources.map(div => {\n let getData = div[`${topic}Data`]\n let result = getData ? getData() : null\n return { div, result }\n })\n}\n\n// adapted from super-collaborator/dotify.js\nexport function dotify(graph) {\n const tip = props =>\n Object.entries(props)\n .filter(e => e[1])\n .map(e => `${e[0]}: ${e[1]}`)\n .join('\\\\n')\n const nodes = graph.nodes.map((node, id) => {\n const label = node.type ? `${node.type}\\\\n${node.props.name}` : node.props.name\n return `${id} [label=\"${label}\" ${node.props.url || node.props.tick ? `URL=\"${node.props.url || '#'}\" target=\"_blank\"` : ''} tooltip=\"${tip(node.props)}\"]`\n })\n const edges = graph.rels.map(rel => {\n return `${rel.from}->${rel.to} [label=\"${rel.type}\" labeltooltip=\"${tip(rel.props)}\"]`\n })\n return ['digraph {', 'rankdir=LR', 'node [shape=box style=filled fillcolor=palegreen]', ...nodes, ...edges, '}'].join(\n '\\n',\n )\n}\n\n// inspired by aspects-of-recent-changes/roster-graphs.html\nexport function walks(count, way = 'steps', neighborhood, scope = {}) {\n const find = (slug, site) => neighborhood.find(info => info.slug == slug && (!site || info.domain == site))\n const finds = slugs => (slugs ? slugs.map(slug => find(slug)) : null)\n const prob = n => Math.floor(n * Math.abs(Math.random() - Math.random()))\n const rand = a => a[prob(a.length)]\n const good = info => info.links && Object.keys(info.links).length < 10\n const back = slug => neighborhood.filter(info => good(info) && slug in info.links)\n // const uniq = (value, index, self) => self.indexOf(value) === index\n const dedup = (value, index, self) => self.findIndex(info => info.slug == value.slug) === index\n const newr = infos =>\n infos\n .toSorted((a, b) => b.date - a.date)\n .filter(dedup)\n .slice(0, 3)\n const domains = neighborhood.map(info => info.domain).filter(uniq)\n\n function blanket(info) {\n // hub[0] => slug\n // find(slug) => info\n // node(info) => nid\n // back(slug) => infos\n // newr(infos) => infos\n\n const graph = new Graph()\n const node = info => {\n return graph.addUniqNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n })\n }\n const up = info => finds(info?.patterns?.up) ?? newr(back(info.slug))\n const down = info => info?.patterns?.down ?? Object.keys(info.links || {})\n\n // hub\n const nid = node(info)\n\n // parents of hub\n for (const parent of up(info)) {\n graph.addRel('', node(parent), nid)\n }\n\n // children of hub\n for (const link of down(info)) {\n const child = find(link)\n if (child) {\n const cid = node(child)\n graph.addRel('', nid, cid)\n\n // parents of children of hub\n for (const parent of up(child)) {\n graph.addRel('', node(parent), cid)\n }\n }\n }\n return graph\n }\n\n switch (way) {\n case 'steps':\n return steps(count)\n case 'days':\n return periods(way, 1, count)\n case 'weeks':\n return periods(way, 7, count)\n case 'months':\n return periods(way, 30, count)\n case 'hubs':\n return hubs(count)\n case 'references':\n return references()\n case 'lineup':\n return lineup()\n case 'topics':\n return topics(count)\n }\n\n function steps(count = 5) {\n return domains.map(domain => {\n const name = domain.split('.').slice(0, 3).join('.')\n const done = new Set()\n const graph = new Graph()\n let nid = 0\n const here = neighborhood.filter(info => info.domain == domain && 'links' in info)\n if (!here.length) return { name, graph: null }\n const node = info => {\n nid = graph.addNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: domain,\n links: Object.keys(info.links || {}).filter(slug => find(slug)),\n })\n return nid\n }\n const rel = (here, there) => graph.addRel('', here, there)\n const links = nid => graph.nodes[nid].props.links.filter(slug => !done.has(slug))\n const start = rand(here)\n // const start = find('welcome-visitors')\n done.add(start.slug)\n node(start)\n for (let n = 5; n > 0; n--) {\n try {\n const slugs = links(nid)\n const slug = rand(slugs)\n done.add(slug)\n const info = find(slug)\n rel(nid, node(info))\n } catch (e) {}\n }\n return { name, graph }\n })\n }\n\n function periods(way, days, count = 12) {\n const interval = days * 24 * 60 * 60 * 1000\n const iota = [...Array(Number(count)).keys()]\n const dates = iota.map(n => Date.now() - n * interval)\n const aspects = []\n for (const stop of dates) {\n const start = stop - interval\n const name = `${way.replace(/s$/, '')} ${new Date(start).toLocaleDateString()}`\n const here = neighborhood\n .filter(info => info.date < stop && info.date >= start)\n .filter(info => !(info.links && Object.keys(info.links).length > 5))\n if (here.length) {\n const domains = here.reduce((set, info) => {\n set.add(info.domain)\n return set\n }, new Set())\n for (const domain of domains) {\n const graph = new Graph()\n const node = info => {\n return graph.addUniqNode('', {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n date: info.date,\n })\n }\n const author = domain.split(/\\.|\\:/)[0]\n for (const info of here.filter(info => info.domain == domain)) {\n const nid = node(info)\n for (const link in info.links || {}) {\n const linked = find(link)\n if (linked) graph.addRel('', nid, node(linked))\n }\n }\n aspects.push({ name: `${name} ${author}`, graph })\n }\n }\n }\n return aspects\n }\n\n function hubs(count = 12) {\n const aspects = []\n const ignored = new Set()\n const hits = {}\n for (const info of neighborhood)\n if (info.links)\n if (Object.keys(info.links).length <= 15) {\n for (const link in info.links) if (find(link)) hits[link] = (hits[link] || 0) + 1\n } else {\n ignored.add(info.slug)\n }\n if (ignored.size > 0) console.log('hub links ignored for large pages:', [...ignored])\n const hubs = Object.entries(hits)\n .sort((a, b) => b[1] - a[1])\n .slice(0, count)\n console.log({ hits, hubs })\n\n for (const hub of hubs) {\n const name = `hub ${hub[1]} ${hub[0]}`\n const graph = blanket(find(hub[0]))\n aspects.push({ name, graph })\n }\n return aspects\n }\n\n function lineup() {\n const aspects = []\n const lineup = scope.lineup()\n console.log({ lineup })\n for (const div of lineup) {\n const pageObject = wiki.lineup.atKey(div.dataset.key)\n const slug = pageObject.getSlug()\n const site = pageObject.getRemoteSite(location.host)\n const info = find(slug, site)\n console.log({ div, pageObject, site, slug, info })\n aspects.push({ name: pageObject.getTitle(), graph: blanket(info) })\n }\n return aspects\n }\n\n function references() {\n const aspects = []\n const items = scope.references()\n console.log({ items })\n for (const item of items) {\n const { title, site, slug } = item\n const info = find(slug, site)\n console.log({ site, slug, info })\n aspects.push({ name: title, graph: blanket(info) })\n }\n console.log({ aspects })\n return aspects\n }\n\n // adapted from aspects-of-recent-changes/roster-temporal-topics.html\n function topics(count=10) {\n const aspects = []\n const days = 7\n const interval = days * 24 * 60 * 60 * 1000\n const msec = n => Date.now() - n * interval\n let week = 0\n while(aspects.length < count && week < count) {\n const stop = msec(week++)\n const start = msec(week)\n const nodes = neighborhood\n .filter(info => info.date > start && info.date <= stop)\n .filter(info => !!info.links)\n .filter(info => !info.title.endsWith(' Survey'))\n if (nodes.length) {\n const graph = linked(nodes)\n const name = new Date(stop).toLocaleDateString()\n // aspects.push({name,graph})\n aspects.push(...partitions({name,graph}, start, stop))\n }\n }\n return aspects\n\n function linked(infos) {\n const graph = new Graph()\n const node = slug => {\n // const type = slug.includes('-and-') ? 'Prompt' : 'Page'\n const type = ''\n const info = neighborhood.find(info => info.slug==slug)\n const twins = neighborhood.filter(info => info.slug==slug).length\n const title = info.title\n const site = info.domain\n const date = info.date\n const name = title.replaceAll(' ',\"\\n\")\n const nid = graph.nodes.findIndex(node => node.type==type && node.props.name==name)\n const result = (nid>=0) ? nid : graph.addNode(type,{name,site,date})\n if(twins>1) graph.nodes[result].props.twins = twins\n return result\n }\n for (const info of infos) {\n const nid = node(info.slug)\n for (const name of newest(Object.keys(info.links))) {\n graph.addRel('',nid,node(name))\n }\n }\n return graph\n }\n\n function newest(slugs) {\n const recent = slug => neighborhood\n .filter(info => info.slug == slug)\n return slugs\n .map(slug => [slug,recent(slug)])\n .filter(pair => pair[1].length)\n .map(pair => [pair[0],pair[1].sort((a,b) => b.date - a.date)[0]])\n .sort((a,b) => b[1].date - a[1].date)\n .map(pair => pair[0])\n .slice(0,3)\n }\n\n function partitions(aspect,from,until) {\n const input = aspect.graph\n const output = [] // graphs\n let doing = {} // nid => new nid\n // const checkpoint = () => {\n // window.progress.innerText = output\n // .map(graph => `${print(graph.nodes)}\\n\\n${print(graph.rels)}`)\n // .join(\"\\n\\n\")\n // }\n const nodes = input.nodes\n const rels = input.rels\n const todo = [...Array(nodes.length).keys()]\n .map(n => [n,Math.random()])\n .sort((a,b)=>a[1]-b[1])\n .map(v=>v[0])\n\n const copy = nid => {\n if(nid in doing) {\n // console.log('copied before', nid, 'doing', doing)\n return}\n // console.log('copy start', nid, 'doing', doing)\n todo.splice(todo.indexOf(nid),1)\n const node = nodes[nid]\n doing[nid] = output[0].addNode(node.type,node.props)\n for (const rid of node.out) copy(rels[rid].to)\n for (const rid of node.in) copy(rels[rid].from)\n // console.log('linking',nid,'to',node.out.map(rid => rels[rid].to))\n for (const rid of node.out) output[0].addRel('',doing[nid],doing[rels[rid].to],{})\n // checkpoint()\n }\n\n // console.log('order todo',todo)\n while(todo.length) {\n const nid = todo.shift()\n // for (let nid of todo) {\n if (nid in doing) {\n // console.log('did',nid,'already')\n continue\n }\n const node = nodes[nid]\n const title = node.props.name.replaceAll(\"\\n\",\" \")\n if (node.in.length + node.out.length) {\n // console.log('doing',nid,title)\n output.unshift(new Graph())\n doing = {}\n copy(nid) \n }\n // else\n // console.log('skipping',nid,title)\n }\n\n const when = node => node.props.date || 0\n const topic = graph => {\n const node = graph.nodes.slice(0)\n .sort((a,b) => when(b)-when(a))\n .filter(a => when(a)>=from && when(a)<=until)\n [0]\n console.log({node,nodes:graph.nodes,name:aspect.name})\n if(!node) return aspect.name\n const words = node.props.name.split(/\\s+/)\n return words.slice(0,3).join(' ')\n }\n\n return output.reverse()\n .map((graph,i) => ({name:topic(graph),graph}))\n }\n }\n}\n\n// adapted from testing-file-mech/testing-kwic.html\nexport function kwic(prefix, lines, stop) {\n const quotes = lines\n .filter(line => line.match(/\\t/))\n .map(quote)\n .flat()\n .sort((a, b) => (a.word < b.word ? -1 : 1))\n let current = 'zzz'.slice(0, prefix)\n const groups = []\n for (const quote of quotes) {\n const group = quote.word.toLowerCase().slice(0, prefix)\n if (group != current) {\n groups.push({ group, quotes: [] })\n current = group\n }\n groups[groups.length - 1].quotes.push(quote)\n }\n return groups\n\n function quote(line) {\n const [key, text] = line.split(/\\t/)\n const words = text\n .replaceAll(/'t\\b/g, 't')\n .replaceAll(/'s\\b/g, 's')\n .split(/[^a-zA-Z]+/)\n .filter(word => word.length > 3 && !stop.has(word.toLowerCase()))\n return words.map(word => ({ word, line, key }))\n }\n}\n\n// adapted from graph/src/graph.js\nexport class Graph {\n constructor(nodes = [], rels = []) {\n this.nodes = nodes\n this.rels = rels\n }\n\n addNode(type, props = {}) {\n const obj = { type, in: [], out: [], props }\n this.nodes.push(obj)\n return this.nodes.length - 1\n }\n\n addUniqNode(type, props = {}) {\n const nid = this.nodes.findIndex(node => node.type == type && node.props?.name == props?.name)\n return nid >= 0 ? nid : this.addNode(type, props)\n }\n\n addRel(type, from, to, props = {}) {\n const obj = { type, from, to, props }\n this.rels.push(obj)\n const rid = this.rels.length - 1\n this.nodes[from].out.push(rid)\n this.nodes[to].in.push(rid)\n return rid\n }\n\n stringify(...args) {\n const obj = { nodes: this.nodes, rels: this.rels }\n return JSON.stringify(obj, ...args)\n }\n}\n\n// adapted from wiki-client/lib/revision.coffee\n\n// This module interprets journal actions in order to update\n// a story or even regenerate a complete story from some or\n// all of a journal.\n\nexport function apply(page, action) {\n const order = () => {\n return (page.story || []).map(item => item?.id)\n }\n\n const add = (after, item) => {\n const index = order().indexOf(after) + 1\n page.story.splice(index, 0, item)\n }\n\n const remove = () => {\n const index = order().indexOf(action.id)\n if (index !== -1) {\n page.story.splice(index, 1)\n }\n }\n\n page.story = page.story || []\n\n switch (action.type) {\n case 'create':\n if (action.item) {\n if (action.item.title != null) {\n page.title = action.item.title\n }\n if (action.item.story != null) {\n page.story = action.item.story.slice()\n }\n }\n break\n case 'add':\n add(action.after, action.item)\n break\n case 'edit':\n const index = order().indexOf(action.id)\n if (index !== -1) {\n page.story.splice(index, 1, action.item)\n } else {\n page.story.push(action.item)\n }\n break\n case 'move':\n // construct relative addresses from absolute order\n const moveIndex = action.order.indexOf(action.id)\n const after = action.order[moveIndex - 1]\n const item = page.story[order().indexOf(action.id)]\n remove()\n add(after, item)\n break\n case 'remove':\n remove()\n break\n }\n\n page.journal = page.journal || []\n if (action.fork) {\n // implicit fork\n page.journal.push({ type: 'fork', site: action.fork, date: action.date - 1 })\n }\n page.journal.push(action)\n}\n\n// adapted from Solo client\n\nexport function soloListener(event) {\n if (!event.data) return\n const { data } = event\n if (data?.action == 'publishSourceData' && data?.name == 'aspect') {\n if (wiki.debug) console.log('soloListener - source update', { event, data })\n return\n }\n\n // only continue if event is from a solo popup.\n // events from a popup window will have an opener\n // ensure that the popup window is one of ours\n\n if (!event.source.opener || event.source.location.pathname !== '/plugins/solo/dialog/') {\n if (wiki.debug) {\n console.log('soloListener - not for us', { event })\n }\n return\n }\n if (wiki.debug) {\n console.log('soloListener - ours', { event })\n }\n\n const { action, keepLineup = false, pageKey = null, title = null, context = null, page = null } = data\n\n let $page = null\n if (pageKey != null) {\n $page = keepLineup ? null : $('.page').filter((i, el) => $(el).data('key') == pageKey)\n }\n\n switch (action) {\n case 'doInternalLink':\n wiki.pageHandler.context = context\n wiki.doInternalLink(title, $page)\n break\n case 'showResult':\n const options = keepLineup ? {} : { $page }\n wiki.showResult(wiki.newPage(page), options)\n break\n default:\n console.error({ where: 'soloListener', message: 'unknown action', data })\n }\n}\n\nexport function create(revIndex, data) {\n revIndex = +revIndex\n const revJournal = data.journal.slice(0, revIndex + 1)\n const revPage = { title: data.title, story: [] }\n for (const action of revJournal) {\n apply(revPage, action || {})\n }\n return revPage\n}\n", "let max = Number.MAX_SAFE_INTEGER\n\nexport default function makeTicker (fn, minMS=1000, remainingTicks=max) {\n let hardstop = false\n let lastTickTime = Date.now()\n let api = {\n stop,\n remainingTicks,\n minMS,\n ticksSoFar: 0,\n timeSinceLastTick: 0\n }\n let r = run()\n r.api = api\n return r\n\n function stop () {\n hardstop = true\n }\n\n async function run () {\n if (hardstop || api.remainingTicks < 1) return\n api.remainingTicks -= 1\n api.ticksSoFar += 1\n api.timeSinceLastTick = Date.now() - lastTickTime\n lastTickTime = Date.now()\n\n const minTickBuffer = new Promise((resolve) => setTimeout(resolve, api.minMS))\n\n await fn(api)\n\n await minTickBuffer\n\n return run()\n }\n}", "import { soloListener, apply, requestSourceData, dotify, walks, kwic } from './library.js'\nimport { uniq, delay, asSlug } from './mech.js'\nimport ticker from 'universal-ticker'\n\nexport const api = {\n trouble,\n inspect,\n response,\n button,\n element,\n jfetch,\n status,\n sourceData,\n showResult,\n neighborhood,\n publishSourceData,\n newSVG,\n SVGline,\n ticker,\n}\n\nexport function trouble(elem, message) {\n if (elem.innerText.match(/\u2716\uFE0E/)) return\n elem.innerHTML += `<button style=\"border-width:0;color:red;\">\u2716\uFE0E</button>`\n elem.querySelector('button').addEventListener('click', event => {\n elem.outerHTML += `<span style=\"width:80%;color:gray;\">${message}</span>`\n })\n}\n\nexport function inspect(elem, key, state) {\n const tap = elem.previousElementSibling\n if (state.debug) {\n const value = state[key]\n tap.innerHTML = `${key} \u21D2 `\n tap.addEventListener('click', event => {\n console.log({ key, value })\n let look = tap.previousElementSibling\n if (!look?.classList.contains('look')) {\n const div = document.createElement('div')\n div.classList.add('look')\n tap.insertAdjacentElement('beforebegin', div)\n look = tap.previousElementSibling\n }\n let text = JSON.stringify(value, null, 1)\n if (text.length > 300) text = text.substring(0, 400) + '...'\n const css = `border:1px solid black; background-color:#f8f8f8; padding:8px; color:gray; word-break: break-all;`\n look.innerHTML = `<div style=\"${css}\">${text}</div>`\n })\n } else {\n tap.innerHTML = ''\n }\n}\n\nexport function response(elem, html) {\n elem.innerHTML += html\n}\n\nexport function button(elem, label, handler) {\n if (!elem.innerHTML.match(/button/)) {\n response(elem, `<button style=\"border-width:0;\">${label}</button>`)\n elem.querySelector('button').addEventListener('click', handler)\n }\n}\n\nexport function element(key) {\n return document.getElementById(key)\n}\n\nexport async function jfetch(url) {\n return fetch(url).then(res => (res.ok ? res.json() : null))\n}\n\nexport function status(elem, command, text) {\n elem.innerHTML = command + text\n}\n\nexport function sourceData(elem, topic) {\n const item = elem.closest('.item')\n const sources = requestSourceData(item, topic).map(({ div, result }) => ({\n classList: [...div.classList],\n id: div.dataset.id,\n result,\n }))\n if (sources.length) return sources\n trouble(elem, `Expected source for \"${topic}\" in the lineup.`)\n return null\n}\n\nexport function publishSourceData(elem, topic, data) {\n const item = elem.closest('.item')\n item.classList.add(`${topic}-source`)\n item[`${topic}Data`] = () => data\n}\n\nexport function showResult(elem, page) {\n const options = { $page: $(elem.closest('.page')) }\n wiki.showResult(wiki.newPage(page), options)\n}\n\nexport function neighborhood(want) {\n return Object.entries(wiki.neighborhoodObject.sites)\n .filter(([domain, site]) => !site.sitemapRequestInflight && (!want || domain.includes(want)))\n .map(([domain, site]) => (site.sitemap || []).map(info => Object.assign({ domain }, info)))\n}\n\nexport function newSVG(elem) {\n const div = document.createElement('div')\n elem.closest('.item').firstElementChild.prepend(div)\n div.outerHTML = `\n <div style=\"border:1px solid black; background-color:#f8f8f8; margin-bottom:16px;\">\n <svg viewBox=\"0 0 400 400\" width=100% height=400>\n <circle id=dot r=5 cx=200 cy=200 stroke=\"#ccc\"></circle>\n </svg>\n </div>`\n const svg = elem.closest('.item').getElementsByTagName('svg')[0]\n return svg\n}\n\nexport function SVGline(svg, [x1, y1], [x2, y2]) {\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n const set = (k, v) => line.setAttribute(k, Math.round(v))\n set('x1', x1)\n set('y1', 400 - y1)\n set('x2', x2)\n set('y2', 400 - y2)\n line.style.stroke = 'black'\n line.style.strokeWidth = '2px'\n svg.appendChild(line)\n const dot = svg.getElementById('dot')\n dot.setAttribute('cx', Math.round(x2))\n dot.setAttribute('cy', Math.round(400 - y2))\n}\n\n// export function ticker(handler) {\n// const interval = setInterval(handler, 1000)\n// const stop = () => clearInterval(interval)\n// return { stop }\n// }\n\nexport async function run(nest, state) {\n const scope = nest.slice()\n while (scope.length) {\n const code = scope.shift()\n if ('command' in code) {\n const command = code.command\n const elem = state.api ? state.api.element(code.key) : document.getElementById(code.key)\n const [op, ...args] = code.command.split(/ +/)\n const next = scope[0]\n const body = next && 'command' in next ? null : scope.shift()\n const stuff = { command, op, args, body, elem, state }\n if (state.debug) console.log(stuff)\n if (blocks[op]) await blocks[op].emit.apply(null, [stuff])\n else if (op.match(/^[A-Z]+$/)) state.api.trouble(elem, `${op} doesn't name a block we know.`)\n else if (code.command.match(/\\S/)) state.api.trouble(elem, `Expected line to begin with all-caps keyword.`)\n }\n }\n}\n\n// B L O C K S\n\nfunction click_emit({ elem, body, state }) {\n if (!body?.length) return state.api.trouble(elem, `CLICK expects indented blocks to follow.`)\n state.api.button(elem, '\u25B6', event => {\n state.debug = event.shiftKey\n run(body, state)\n })\n}\n\nfunction hello_emit({ elem, args, state }) {\n const world = args[0] == 'world' ? ' \uD83C\uDF0E' : ' \uD83D\uDE00'\n for (const key of Object.keys(state)) state.api.inspect(elem, key, state)\n state.api.response(elem, world)\n}\n\nasync function from_emit({ elem, args, body, state }) {\n if (!body?.length) return state.api.trouble(elem, `FROM expects indented blocks to follow.`)\n const url = args[0]\n state.api.response(elem, ' \u23F3')\n state.page = await state.api.jfetch(`//${url}.json`)\n state.api.response(elem, ' \u231B')\n run(body, state)\n}\n\nfunction sensor_emit({ elem, command, args, body, state }) {\n state.api.status(elem, command, '')\n if (!('page' in state)) return state.api.trouble(elem, `Expect \"page\" as with FROM.`)\n state.api.inspect(elem, 'page', state)\n const datalog = state.page.story.find(item => item.type == 'datalog')\n if (!datalog) return state.api.trouble(elem, `Expect Datalog plugin in the page.`)\n const device = args[0]\n if (!device) return state.api.trouble(elem, `SENSOR needs a sensor name.`)\n const sensor = datalog.text\n .split(/\\n/)\n .map(line => line.split(/ +/))\n .filter(fields => fields[0] == 'SENSOR')\n .find(fields => fields[1] == device)\n if (!sensor) return state.api.trouble(elem, `Expect to find \"${device}\" in Datalog.`)\n const url = sensor[2]\n\n const f = c => (9 / 5) * (c / 16) + 32\n const avg = a => a.reduce((s, e) => s + e, 0) / a.length\n state.api.status(elem, command, ' \u23F3')\n state.api.jfetch(url).then(data => {\n if (state.debug) console.log({ sensor, data })\n state.api.status(elem, command, ' \u231B')\n const value = f(avg(Object.values(data)))\n state.temperature = `${value.toFixed(2)}\u00B0F`\n run(body, state)\n })\n}\n\nfunction report_emit({ elem, command, state }) {\n const value = state?.temperature\n if (!value) return state.api.trouble(elem, `Expect data, as from SENSOR.`)\n state.api.inspect(elem, 'temperature', state)\n state.api.response(elem, `<br><font face=Arial size=32>${value}</font>`)\n}\n\nfunction source_emit({ elem, command, args, body, state }) {\n if (!(args && args.length)) return state.api.trouble(elem, `Expected Source topic, like \"markers\" for Map markers.`)\n const topic = args[0]\n const sources = state.api.sourceData(elem, topic)\n if (!sources) return\n if (state.debug) console.log({ topic, sources })\n const count = type => {\n const count = sources.filter(source => source.classList.includes(type)).length\n return count ? `${count} ${type}` : null\n }\n const counts = [count('map'), count('image'), count('frame'), count('assets')].filter(count => count).join(', ')\n state.api.status(elem, command, ' \u21D2 ' + counts)\n state[topic] = sources.map(({ id, result }) => ({ id, result }))\n if (body) run(body, state)\n}\n\nfunction preview_emit({ elem, command, args, state }) {\n const round = digits => (+digits).toFixed(7)\n const story = []\n const types = args\n for (const type of types) {\n switch (type) {\n case 'map':\n if (!('marker' in state))\n return state.api.trouble(elem, `\"map\" preview expects \"marker\" state, like from \"SOURCE marker\".`)\n state.api.inspect(elem, 'marker', state)\n const text = state.marker\n .map(marker => [marker.result])\n .flat(2)\n .map(latlon => `${round(latlon.lat)}, ${round(latlon.lon)} ${latlon.label || ''}`)\n .filter(uniq)\n .join('\\n')\n story.push({ type: 'map', text })\n break\n case 'graph':\n if (!('aspect' in state))\n return state.api.trouble(elem, `\"graph\" preview expects \"aspect\" state, like from \"SOURCE aspect\".`)\n state.api.inspect(elem, 'aspect', state)\n for (const { div, result } of state.aspect) {\n for (const { name, graph } of result) {\n if (state.debug) console.log({ div, result, name, graph })\n story.push({ type: 'paragraph', text: name })\n story.push({ type: 'graphviz', text: dotify(graph) })\n }\n story.push({ type: 'pagefold', text: '.' })\n }\n break\n case 'items':\n if (!('items' in state))\n return state.api.trouble(elem, `\"graph\" preview expects \"items\" state, like from \"KWIC\".`)\n state.api.inspect(elem, 'items', state)\n story.push(...state.items)\n break\n case 'page':\n if (!('page' in state)) return state.api.trouble(elem, `\"page\" preview expects \"page\" state, like from \"FROM\".`)\n state.api.inspect(elem, 'page', state)\n story.push(...state.page.story)\n break\n case 'synopsis':\n const text2 = `This page created with Mech command: \"${command}\". See [[${state.context.title}]].`\n story.push({ type: 'paragraph', text: text2, id: state.context.itemId })\n break\n default:\n return state.api.trouble(elem, `\"${type}\" doesn't name an item we can preview`)\n }\n }\n const title = 'Mech Preview' + (state.tick ? ` ${state.tick}` : '')\n const page = { title, story }\n for (const item of page.story) item.id ||= (Math.random() * 10 ** 20).toFixed(0)\n const item = JSON.parse(JSON.stringify(page))\n const date = Date.now()\n page.journal = [{ type: 'create', date, item }]\n state.api.showResult(elem, page)\n}\n\nasync function neighbors_emit({ elem, command, args, body, state }) {\n const belem = probe => state.api.element(probe.key)\n const want = args[0]\n const have = state.api.neighborhood(want)\n for (const probe of body || []) {\n if (!probe.command.endsWith(' Survey')) {\n state.api.trouble(belem(probe), `NEIGHBORS expects a Site Survey title, like Pattern Link Survey`)\n continue\n }\n const todos = have.filter(sitemap => sitemap.find(info => info.title == probe.command))\n state.api.status(belem(probe), probe.command, `\u21D2 ${todos.length} sites`)\n for (const todo of todos) {\n const url = `//${todo[0].domain}/${asSlug(probe.command)}.json`\n const page = await state.api.jfetch(url)\n if (!page) continue\n const survey = page.story.find(item => item.type == 'frame')?.survey\n if (!survey) continue\n for (const info of todo) {\n const extra = Object.assign(\n {},\n survey.find(inf => inf.slug == info.slug),\n info,\n )\n Object.assign(info, extra)\n }\n console.log({ url, page, survey, todo })\n }\n }\n state.neighborhood = have.flat().sort((a, b) => b.date - a.date)\n state.api.status(elem, command, `\u21D2 ${state.neighborhood.length} pages, ${have.length} sites`)\n}\n\nfunction walk_emit({ elem, command, args, state }) {\n if (!('neighborhood' in state))\n return state.api.trouble(elem, `WALK expects state.neighborhood, like from NEIGHBORS.`)\n state.api.inspect(elem, 'neighborhood', state)\n const [, count, way] = command.match(/\\b(\\d+)? *(steps|days|weeks|months|hubs|lineup|references|topics)\\b/) || []\n if (!way && command != 'WALK') return state.api.trouble(elem, `WALK can't understand rest of this block.`)\n const scope = {\n lineup() {\n const items = [...document.querySelectorAll('.page')]\n const index = items.indexOf(elem.closest('.page'))\n return items.slice(0, index)\n },\n references() {\n const div = elem.closest('.page')\n const pageObject = wiki.lineup.atKey(div.dataset.key)\n const story = pageObject.getRawPage().story\n console.log({ div, pageObject, story })\n return story.filter(item => item.type == 'reference')\n },\n }\n const steps = walks(count, way, state.neighborhood, scope)\n const aspects = steps.filter(({ graph }) => graph)\n if (state.debug) console.log({ steps })\n const nodes = aspects.map(({ graph }) => graph.nodes).flat()\n state.api.status(elem, command, ` \u21D2 ${aspects.length} aspects, ${nodes.length} nodes`)\n if (steps.find(({ graph }) => !graph)) state.api.trouble(elem, `WALK skipped sites with no links in sitemaps`)\n if (aspects.length) {\n state.aspect = state.aspect || []\n const obj = state.aspect.find(obj => obj.id == elem.id)\n if (obj) obj.result = aspects\n else state.aspect.push({ id: elem.id, result: aspects, source: command })\n // const item = elem.closest('.item')\n // item.classList.add('aspect-source')\n // item.aspectData = () => state.aspect.map(obj => obj.result).flat()\n state.api.publishSourceData(elem, 'aspect', state.aspect.map(obj => obj.result).flat())\n if (state.debug) console.log({ command, state: state.aspect, item: item.aspectData() })\n }\n}\n\nfunction tick_emit({ elem, command, args, body, state }) {\n console.log({ command, args, body, state })\n if (!body?.length) return state.api.trouble(elem, `TICK expects indented blocks to follow.`)\n const count = args[0] || '1'\n if (!count.match(/^[1-9][0-9]?$/)) return state.api.trouble(elem, `TICK expects a count from 1 to 99`)\n let clock, outertick\n if (state.tick != null) {\n outertick = state.tick\n start({ shiftKey: state.debug })\n return clock\n } else ready()\n\n function ready() {\n state.api.button(elem, '\u25B6', start)\n }\n function status(ticks) {\n state.api.status(elem, command, ` \u21D2 ${ticks} remaining`)\n }\n\n function start(event) {\n state.debug = event.shiftKey\n state.tick = +count\n status(state.tick)\n clock = state.api.ticker(async () => {\n if (state.debug) console.log({ tick: state.tick, count })\n if ('tick' in state && --state.tick >= 0) {\n status(state.tick)\n await run(body, state)\n } else {\n clock = clock.api.stop()\n state.tick = outertick\n state.api.status(elem, command, '')\n ready()\n }\n })\n }\n}\n\nfunction until_emit({ elem, command, args, body, state }) {\n if (!args.length) return trouble(elem, `UNTIL expects an argument, a word to stop running.`)\n if (!state.tick) return trouble(elem, `UNTIL expects to indented below an iterator, like TICKS.`)\n if (!state.aspect) return trouble(elem, `UNTIL expects \"aspect\", like from WALK.`)\n inspect(elem, 'aspect', state)\n elem.innerHTML = command + ` \u21D2 ${state.tick}`\n const word = args[0]\n for (const { div, result } of state.aspect)\n for (const { name, graph } of result)\n for (const node of graph.nodes)\n if (node.type.includes(word) || node.props.name.includes(word)) {\n if (state.debug) console.log({ div, result, name, graph, node })\n delete state.tick\n elem.innerHTML += ' done'\n if (body) run(body, state)\n return\n }\n}\n\nfunction forward_emit({ elem, command, args, state }) {\n if (args.length < 1)\n return state.api.trouble(elem, `FORWARD expects an argument, the number of steps to move a \"turtle\".`)\n state.turtle ??= { svg: state.api.newSVG(elem), position: [200, 200], direction: 0 }\n const steps = args[0]\n const theta = (state.turtle.direction * 2 * Math.PI) / 360\n const [x1, y1] = state.turtle.position\n state.turtle.position = [x1 + steps * Math.sin(theta), y1 + steps * Math.cos(theta)]\n state.api.SVGline(state.turtle.svg, [x1, y1], state.turtle.position)\n state.api.status(elem, command, ` \u21D2 ${state.turtle.position.map(n => (n - 200).toFixed(1)).join(', ')}`)\n}\n\nfunction turn_emit({ elem, command, args, state }) {\n if (args.length < 1)\n return state.api.trouble(elem, `TURN expects an argument, the number of degrees to turn a \"turtle\".`)\n state.turtle ??= { svg: state.api.newSVG(elem), position: [200, 200], direction: 0 }\n const degrees = +args[0]\n state.turtle.direction += degrees\n state.api.status(elem, command, ` \u21D2 ${state.turtle.direction}\u00B0`)\n}\n\nfunction file_emit({ elem, command, args, body, state }) {\n if (!('assets' in state)) return trouble(elem, `FILE expects state.assets, like from SOURCE assets.`)\n inspect(elem, 'assets', state)\n\n // [ { \"id\": \"b2d5831168b4706b\", \"result\":\n // { \"pages/testing-file-mech\":\n // { \"//ward.dojo.fed.wiki/assets\":\n // [ \"KWIC-list+axe-files.txt\", \"KWIC-list-axe-files.tsv\" ] } } } ]\n\n const origin = '//' + window.location.host\n const assets = state.assets\n .map(({ id, result }) =>\n Object.entries(result).map(([dir, paths]) =>\n Object.entries(paths).map(([path, files]) =>\n files.map(file => {\n const assets = path.startsWith('//') ? path : `${origin}${path}`\n const host = assets.replace(/\\/assets$/, '')\n const url = `${assets}/${dir}/${file}`\n return { id, dir, path, host, file, url }\n }),\n ),\n ),\n )\n .flat(3)\n if (state.debug) console.log({ assets })\n\n if (args.length < 1) return trouble(elem, `FILE expects an argument, the dot suffix for desired files.`)\n if (!body?.length) return trouble(elem, 'FILE expects indented blocks to follow.')\n const suffix = args[0]\n const choices = assets.filter(asset => asset.file.endsWith(suffix))\n const flag = choice => `<img width=12 src=${choices[choice].host + '/favicon.png'}>`\n if (!choices) return trouble(elem, `FILE expects to find an asset with \"${suffix}\" suffix.`)\n elem.innerHTML =\n command +\n `<br><div class=choices style=\"border:1px solid black; background-color:#f8f8f8; padding:8px;\" >${choices\n .map(\n (choice, i) =>\n `<span data-choice=${i} style=\"cursor:pointer;\">\n ${flag(i)}\n ${choice.file} \u25B6\n </span>`,\n )\n .join('<br>\\n')}</div>`\n elem.querySelector('.choices').addEventListener('click', event => {\n if (!('choice' in event.target.dataset)) return\n const url = choices[event.target.dataset.choice].url\n // console.log(event.target)\n // console.log(event.target.dataset.file)\n // const url = 'http://ward.dojo.fed.wiki/assets/pages/testing-file-mech/KWIC-list-axe-files.tsv'\n fetch(url)\n .then(res => res.text())\n .then(text => {\n elem.innerHTML = command + ` \u21D2 ${text.length} bytes`\n state.tsv = text\n console.log({ text })\n run(body, state)\n })\n })\n}\n\nfunction kwic_emit({ elem, command, args, body, state }) {\n const template = body && body[0]?.command\n if (template && !template.match(/\\$[KW]/)) return trouble(elem, `KWIK expects $K or $W in link prototype.`)\n if (!('tsv' in state)) return trouble(elem, `KWIC expects a .tsv file, like from ASSETS .tsv.`)\n inspect(elem, 'tsv', state)\n const prefix = args[0] || 1\n const lines = state.tsv.trim().split(/\\n/)\n\n const stop = new Set(['of', 'and', 'in', 'at'])\n const page = $(elem.closest('.page')).data('data')\n const start = page.story.findIndex(item => item.type == 'pagefold' && item.text == 'stop')\n if (start >= 0) {\n const finish = page.story.findIndex((item, i) => i > start && item.type == 'pagefold')\n page.story\n .slice(start + 1, finish)\n .map(item => item.text.trim().split(/\\s+/))\n .flat()\n .forEach(word => stop.add(word))\n }\n\n const groups = kwic(prefix, lines, stop)\n elem.innerHTML = command + ` \u21D2 ${lines.length} lines, ${groups.length} groups`\n const link = quote => {\n let line = quote.line\n if (template) {\n const substitute = template\n .replaceAll(/\\$K\\+/g, quote.key.replaceAll(/ /g, '+'))\n .replaceAll(/\\$K/g, quote.key)\n .replaceAll(/\\$W/g, quote.word)\n const target = template.match(/\\$W/) ? quote.word : quote.key\n line = line.replace(target, substitute)\n }\n return line\n }\n\n state.items = groups.map(group => {\n const text = `# ${group.group}\\n\\n${group.quotes.map(quote => link(quote)).join('\\n')}`\n return { type: 'markdown', text }\n })\n}\n\nfunction show_emit({ elem, command, args, state }) {\n elem.innerHTML = command\n let site, slug\n if (args.length < 1) {\n if (state.info) {\n inspect(elem, 'info', state)\n site = state.info.domain\n slug = state.info.slug\n elem.innerHTML = command + ` \u21D2 ${state.info.title}`\n } else {\n return trouble(elem, `SHOW expects a slug or site/slug to open in the lineup.`)\n }\n } else {\n const info = args[0]\n ;[site, slug] = info.includes('/') ? info.split(/\\//) : [null, info]\n }\n const lineup = [...document.querySelectorAll('.page')].map(e => e.id)\n if (lineup.includes(slug)) return trouble(elem, `SHOW expects a page not already in the lineup.`)\n const page = elem.closest('.page')\n wiki.doInternalLink(slug, page, site)\n}\n\nfunction random_emit({ elem, command, state }) {\n if (!state.neighborhood) return trouble(elem, `RANDOM expected a neighborhood, like from NEIGHBORS.`)\n inspect(elem, 'neighborhood', state)\n const infos = state.neighborhood\n const many = infos.length\n const one = Math.floor(Math.random() * many)\n elem.innerHTML = command + ` \u21D2 ${one} of ${many}`\n state.info = infos[one]\n}\n\nfunction sleep_emit({ elem, command, args, body, state }) {\n let count = args[0] || '1'\n if (!count.match(/^[1-9][0-9]?$/)) return trouble(elem, `SLEEP expects seconds from 1 to 99`)\n return new Promise(resolve => {\n if (body)\n run(body, state).then(result => {\n if (state.debug) console.log(command, 'children', result)\n })\n elem.innerHTML = command + ` \u21D2 ${count} remain`\n let clock = setInterval(() => {\n if (--count > 0) elem.innerHTML = command + ` \u21D2 ${count} remain`\n else {\n clearInterval(clock)\n elem.innerHTML = command + ` \u21D2 done`\n if (state.debug) console.log(command, 'done')\n resolve()\n }\n }, 1000)\n })\n}\n\nfunction together_emit({ elem, command, args, body, state }) {\n if (!body) return trouble(elem, `TOGETHER expects indented commands to run together.`)\n const children = body.map(child => run([child], state))\n return Promise.all(children)\n}\n\n// http://localhost:3000/plugin/mech/run/testing-mechs-synchronization/5e269010fc81aebe?args=WyJoZWxsbyIsIndvcmxkIl0\nasync function get_emit({ elem, command, args, body, state }) {\n if (!body) return trouble(elem, `GET expects indented commands to run on the server.`)\n let share = {}\n let where = state.context.site\n if (args.length) {\n for (const arg of args) {\n if (arg in state) {\n inspect(elem, arg, state)\n share[arg] = state[arg]\n } else if (arg.match(/\\./)) where = arg\n else {\n return trouble(elem, `GET expected \"${arg}\" to name state or site.`)\n }\n }\n }\n // const site = state.context.site\n const slug = state.context.slug\n const itemId = state.context.itemId\n const query = `mech=${btoa(JSON.stringify(body))}&state=${btoa(JSON.stringify(share))}`\n const url = `//${where}/plugin/mech/run/${slug}/${itemId}?${query}`\n elem.innerHTML = command + ` \u21D2 in progress`\n const start = Date.now()\n let result\n try {\n result = await fetch(url).then(res => (res.ok ? res.json() : res.status))\n if ('err' in result) return trouble(elem, `RUN received error \"${result.err}\"`)\n } catch (err) {\n return trouble(elem, `RUN failed with \"${err.message}\"`)\n }\n state.result = result\n for (const arg of result.mech.flat(9)) {\n const elem = document.getElementById(arg.key)\n if ('status' in arg) elem.innerHTML = arg.command + ` \u21D2 ${arg.status}`\n if ('trouble' in arg) trouble(elem, arg.trouble)\n }\n if ('debug' in result.state) delete result.state.debug\n Object.assign(state, result.state)\n const elapsed = ((Date.now() - start) / 1000).toFixed(3)\n elem.innerHTML = command + ` \u21D2 ${elapsed} seconds`\n}\n\nfunction delta_emit({ elem, command, args, body, state }) {\n const copy = obj => JSON.parse(JSON.stringify(obj))\n const size = obj => JSON.stringify(obj).length\n if (args.length < 1) return trouble(elem, `DELTA expects argument, \"have\" or \"apply\" on client.`)\n if (body) return trouble(elem, `DELTA doesn't expect indented input.`)\n switch (args[0]) {\n case 'have':\n const edits = state.context.page.journal.filter(item => item.type != 'fork')\n state.recent = edits[edits.length - 1].date\n elem.innerHTML = command + ` \u21D2 ${new Date(state.recent).toLocaleString()}`\n break\n case 'apply':\n if (!('actions' in state)) return trouble(elem, `DELTA apply expect \"actions\" as input.`)\n inspect(elem, 'actions', state)\n const page = copy(state.context.page)\n const before = size(page)\n for (const action of state.actions) apply(page, action)\n state.page = page\n const after = size(page)\n elem.innerHTML = command + ` \u21D2 \u2206 ${(((after - before) / before) * 100).toFixed(1)}%`\n break\n default:\n trouble(elem, `DELTA doesn't know \"${args[0]}\".`)\n }\n}\n\nfunction roster_emit({ elem, command, state }) {\n if (!state.neighborhood) return trouble(elem, `ROSTER expected a neighborhood, like from NEIGHBORS.`)\n inspect(elem, 'neighborhood', state)\n const infos = state.neighborhood\n const sites = infos.map(info => info.domain).filter(uniq)\n const any = array => array[Math.floor(Math.random() * array.length)]\n if (state.debug) console.log(infos)\n const items = [\n { type: 'roster', text: 'Mech\\n' + sites.join('\\n') },\n { type: 'activity', text: `ROSTER Mech\\nSINCE 30 days` },\n ]\n elem.innerHTML = command + ` \u21D2 ${sites.length} sites`\n state.items = items\n}\n\nfunction lineup_emit({ elem, command, state }) {\n const items = [...document.querySelectorAll('.page')].map(div => {\n const $page = $(div)\n const page = $page.data('data')\n const site = $page.data('site') || location.host\n const slug = $page.attr('id').split('_')[0]\n const title = page.title || 'Empty'\n const text = page.story[0]?.text || 'empty'\n return { type: 'reference', site, slug, title, text }\n })\n elem.innerHTML = command + ` \u21D2 ${items.length} pages`\n state.items = items\n}\n\nfunction listen_emit({ elem, command, args, state }) {\n if (args.length < 1) return trouble(elem, `LISTEN expects argument, an action.`)\n const topic = args[0]\n let recent = Date.now()\n let count = 0\n const handler = listen\n handler.action = 'publishSourceData'\n handler.id = elem.id\n window.addEventListener('message', listen)\n $('.main').on('thumb', (evt, thumb) => console.log('jquery', { evt, thumb }))\n elem.innerHTML = command + ` \u21D2 ready`\n\n // window.listeners = (action=null) => {\n // return getEventListeners(window).message\n // .map(t => t.listener)\n // .filter(f => f.name == 'listen')\n // .map(f => ({action:f.action,elem:document.getElementById(f.id),count:f.count}))\n // }\n\n function listen(event) {\n console.log({ event })\n const { data } = event\n if (data.action == 'publishSourceData' && (data.name == topic || data.topic == topic)) {\n count++\n handler.count = count\n if (state.debug) console.log({ count, data })\n if (count <= 100) {\n const now = Date.now()\n const elapsed = now - recent\n recent = now\n elem.innerHTML = command + ` \u21D2 ${count} events, ${elapsed} ms`\n } else {\n window.removeEventListener('message', listen)\n }\n }\n }\n}\n\nfunction message_emit({ elem, command, args, state }) {\n if (args.length < 1) return trouble(elem, `MESSAGE expects argument, an action.`)\n const topic = args[0]\n const message = {\n action: 'publishSourceData',\n topic,\n name: topic,\n }\n window.postMessage(message, '*')\n elem.innerHTML = command + ` \u21D2 sent`\n}\n\nasync function solo_emit({ elem, command, state }) {\n if (!('aspect' in state)) return trouble(elem, `\"SOLO\" expects \"aspect\" state, like from \"WALK\".`)\n inspect(elem, 'aspect', state)\n elem.innerHTML = command\n const todo = state.aspect.map(each => ({\n source: each.source || each.id,\n aspects: each.result,\n }))\n const aspects = todo.reduce((sum, each) => sum + each.aspects.length, 0)\n elem.innerHTML += ` \u21D2 ${todo.length} sources, ${aspects} aspects`\n\n // from Solo plugin, client/solo.js\n const pageKey = elem.closest('.page').dataset.key\n const doing = { type: 'batch', sources: todo, pageKey }\n console.log({ pageKey, doing })\n\n if (typeof window.soloListener == 'undefined' || window.soloListener == null) {\n console.log('**** Adding solo listener')\n window.soloListener = soloListener\n window.addEventListener('message', soloListener)\n }\n\n await delay(750)\n const popup = window.open('/plugins/solo/dialog/#', 'solo', 'popup,height=720,width=1280')\n if (popup.location.pathname != '/plugins/solo/dialog/') {\n console.log('launching new dialog')\n popup.addEventListener('load', event => {\n console.log('launched and loaded')\n popup.postMessage(doing, window.origin)\n })\n } else {\n console.log('reusing existing dialog')\n popup.postMessage(doing, window.origin)\n }\n}\n\nfunction popup_emit({ elem, args, state }) {\n const html = []\n switch (args[0]) {\n case 'state':\n for (const key in state) {\n html.push(\n `<details>\n <summary>${key}</summary>\n <pre>${JSON.stringify(state[key],null,2)}</pre>\n </details>`)}\n break\n case 'images':\n if(!state.commons) return trouble(elem, `POPUP images expects \"commons\" state, like from \"GET\" \"COMMONS\"`)\n const where = args[1] == 'all' ? state.commons.all : state.commons.here\n for (const item of where.items) {\n html.push(`<span><img height=200 src=/assets/plugins/image/${item}></span>`)}\n break\n default:\n return trouble(elem, `POPUP doesn't know \"${args[0]}\".`)\n }\n wiki.dialog(elem.innerText,html.join(\"\\n\"))\n}\n\n\n\n// C A T A L O G\n\nexport const blocks = {\n CLICK: { emit: click_emit },\n HELLO: { emit: hello_emit },\n FROM: { emit: from_emit },\n SENSOR: { emit: sensor_emit },\n REPORT: { emit: report_emit },\n SOURCE: { emit: source_emit },\n PREVIEW: { emit: preview_emit },\n NEIGHBORS: { emit: neighbors_emit },\n WALK: { emit: walk_emit },\n TICK: { emit: tick_emit },\n UNTIL: { emit: until_emit },\n FORWARD: { emit: forward_emit },\n TURN: { emit: turn_emit },\n FILE: { emit: file_emit },\n KWIC: { emit: kwic_emit },\n SHOW: { emit: show_emit },\n RANDOM: { emit: random_emit },\n SLEEP: { emit: sleep_emit },\n TOGETHER: { emit: together_emit },\n GET: { emit: get_emit },\n DELTA: { emit: delta_emit },\n ROSTER: { emit: roster_emit },\n LINEUP: { emit: lineup_emit },\n LISTEN: { emit: listen_emit },\n MESSAGE: { emit: message_emit },\n SOLO: { emit: solo_emit },\n POPUP: { emit: popup_emit },\n}\n", "import { blocks, trouble, inspect, run } from './blocks.js'\n\nfunction expand(text) {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\n// I N T E R P R E T E R\n\n// https://github.com/dobbs/wiki-plugin-graphviz/blob/main/client/graphviz.js#L86-L103\nexport function tree(lines, here, indent) {\n while (lines.length) {\n let m = lines[0].match(/( *)(.*)/)\n let spaces = m[1].length\n let command = m[2]\n if (spaces == indent) {\n here.push({ command })\n lines.shift()\n } else if (spaces > indent) {\n var more = []\n here.push(more)\n tree(lines, more, spaces)\n } else {\n return here\n }\n }\n return here\n}\n\nexport function format(nest) {\n const unique = Math.floor(Math.random() * 1000000)\n const block = (more, path) => {\n const html = []\n for (const part of more) {\n const key = `${unique}.${path.join('.')}`\n part.key = key\n if ('command' in part)\n html.push(\n `<font color=gray size=small></font><span style=\"display: block;\" id=${key}>${expand(part.command)}</span>`,\n )\n else html.push(`<div id=${key} style=\"padding-left:15px\">${block(part, [...path, 0])}</div>`)\n path[path.length - 1]++\n }\n return html.join('\\n')\n }\n return block(nest, [0])\n}\n", "import { tree, format } from './interpreter.js'\nimport { api, run } from './blocks.js'\n;('use strict')\nexport const uniq = (value, index, self) => self.indexOf(value) === index\nexport const delay = time => new Promise(res => setTimeout(res, time))\nexport const asSlug = title =>\n title\n .replace(/\\s/g, '-')\n .replace(/[^A-Za-z0-9-]/g, '')\n .toLowerCase()\n\nfunction expand(text) {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\n// P L U G I N\n\nfunction emit($item, item) {\n const lines = item.text.split(/\\n/)\n const nest = tree(lines, [], 0)\n const html = format(nest)\n const $page = $item.parents('.page')\n const pageKey = $page.data('key')\n const context = {\n item,\n itemId: item.id,\n pageKey,\n page: wiki.lineup.atKey(pageKey).getRawPage(),\n origin: window.origin,\n site: $page.data('site') || window.location.host,\n slug: $page.attr('id'),\n title: $page.data('data').title,\n }\n const state = { context, api }\n $item.append(`<div style=\"background-color:#eee;padding:15px;border-top:8px;\">${html}</div>`)\n run(nest, state)\n}\n\nfunction bind($item, item) {\n return $item.dblclick(() => {\n return wiki.textEditor($item, item)\n })\n}\n\nif (typeof window !== 'undefined' && window !== null) {\n window.plugins.mech = { emit, bind }\n}\n\nexport { expand, tree, format, run }\nexport { emit, bind }\n"],
5
+ "mappings": "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",
6
+ "names": ["requestSourceData", "item", "topic", "sources", "div", "getData", "result", "dotify", "graph", "tip", "props", "e", "nodes", "node", "id", "label", "edges", "rel", "walks", "count", "way", "neighborhood", "scope", "find", "slug", "site", "info", "finds", "slugs", "prob", "n", "rand", "a", "good", "back", "dedup", "value", "index", "self", "newr", "infos", "b", "domains", "uniq", "blanket", "Graph", "up", "down", "nid", "parent", "link", "child", "cid", "steps", "periods", "hubs", "references", "lineup", "topics", "domain", "name", "done", "here", "there", "links", "start", "days", "interval", "dates", "aspects", "stop", "set", "author", "linked", "ignored", "hits", "hub", "pageObject", "items", "title", "msec", "week", "partitions", "type", "twins", "date", "newest", "recent", "pair", "aspect", "from", "until", "input", "output", "doing", "rels", "todo", "v", "copy", "rid", "when", "i", "kwic", "prefix", "lines", "quotes", "line", "quote", "current", "groups", "group", "key", "text", "word", "obj", "to", "args", "apply", "page", "action", "order", "add", "after", "remove", "moveIndex", "soloListener", "event", "data", "keepLineup", "pageKey", "context", "$page", "el", "options", "max", "makeTicker", "fn", "minMS", "remainingTicks", "hardstop", "lastTickTime", "api", "stop", "run", "minTickBuffer", "resolve", "api", "trouble", "inspect", "response", "button", "element", "jfetch", "status", "sourceData", "showResult", "neighborhood", "publishSourceData", "newSVG", "SVGline", "makeTicker", "elem", "message", "event", "key", "state", "tap", "value", "look", "div", "text", "css", "html", "label", "handler", "url", "res", "command", "topic", "item", "sources", "requestSourceData", "result", "data", "page", "options", "want", "domain", "site", "info", "svg", "x1", "y1", "x2", "y2", "line", "set", "k", "v", "dot", "run", "nest", "scope", "code", "op", "args", "next", "body", "stuff", "blocks", "click_emit", "hello_emit", "world", "from_emit", "sensor_emit", "datalog", "device", "sensor", "fields", "f", "c", "avg", "a", "s", "e", "report_emit", "source_emit", "count", "type", "source", "counts", "id", "preview_emit", "round", "digits", "story", "types", "marker", "latlon", "uniq", "name", "graph", "dotify", "text2", "date", "neighbors_emit", "belem", "probe", "have", "todos", "sitemap", "todo", "asSlug", "survey", "extra", "inf", "b", "walk_emit", "way", "items", "index", "pageObject", "steps", "walks", "aspects", "nodes", "obj", "tick_emit", "clock", "outertick", "start", "ready", "ticks", "until_emit", "word", "node", "forward_emit", "theta", "n", "turn_emit", "degrees", "file_emit", "origin", "assets", "dir", "paths", "path", "files", "file", "host", "suffix", "choices", "asset", "flag", "choice", "i", "kwic_emit", "template", "prefix", "lines", "stop", "finish", "groups", "kwic", "link", "quote", "substitute", "target", "group", "show_emit", "slug", "random_emit", "infos", "many", "one", "sleep_emit", "resolve", "together_emit", "children", "child", "get_emit", "share", "where", "arg", "itemId", "query", "err", "elapsed", "delta_emit", "copy", "size", "edits", "before", "action", "apply", "after", "roster_emit", "sites", "any", "array", "lineup_emit", "$page", "title", "listen_emit", "recent", "listen", "evt", "thumb", "now", "message_emit", "solo_emit", "each", "sum", "pageKey", "doing", "soloListener", "delay", "popup", "popup_emit", "expand", "text", "tree", "lines", "here", "indent", "m", "spaces", "command", "more", "format", "nest", "unique", "block", "path", "html", "part", "key", "uniq", "value", "index", "self", "delay", "time", "res", "asSlug", "title", "expand", "text", "emit", "$item", "item", "lines", "nest", "tree", "html", "format", "$page", "pageKey", "state", "api", "run", "bind"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wiki-plugin-mech",
3
3
  "type": "module",
4
- "version": "0.1.31",
4
+ "version": "0.1.33-0",
5
5
  "description": "Federated Wiki - Mechanism Scripting Plugin",
6
6
  "keywords": [
7
7
  "mech",
package/server/server.js CHANGED
@@ -18,7 +18,7 @@ function startServer(params) {
18
18
  console.log(req.params)
19
19
  try {
20
20
  const slug = req.params.slug
21
- if(!slug.match(/^[a-z-]+$/)) return next()
21
+ if (!slug.match(/^[a-z-]+$/)) return next()
22
22
  const itemId = req.params.itemId
23
23
  const mech = JSON.parse(atob(req.query.mech || 'W10='))
24
24
  const share = JSON.parse(atob(req.query.state || 'W10='))
@@ -103,15 +103,16 @@ async function commons_emit({ elem, args, state }) {
103
103
  const readdir = dir => new Promise((res, rej) => fs.readdir(dir, (e, v) => (e ? rej(e) : res(v))))
104
104
  const stat = file => new Promise((res, rej) => fs.stat(file, (e, v) => (e ? rej(e) : res(v))))
105
105
  const tally = async dir => {
106
- const count = { files: 0, bytes: 0 }
106
+ const count = { files: 0, bytes: 0, items: [] }
107
107
  const items = await readdir(dir)
108
108
  for (const item of items) {
109
109
  const itemPath = path.join(dir, item)
110
110
  const stats = await stat(itemPath)
111
111
  if (state.debug) console.log({ itemPath, stats })
112
- if (stats.isFile()) {
112
+ if (stats.isFile() && !item.startsWith('.')) {
113
113
  count.files++
114
114
  count.bytes += stats.size
115
+ count.items.push(item)
115
116
  }
116
117
  }
117
118
  return count
@@ -119,7 +120,8 @@ async function commons_emit({ elem, args, state }) {
119
120
  const all = await tally(state.context.argv.commons)
120
121
  const here = await tally(path.join(state.context.argv.data, 'assets', 'plugins', 'image'))
121
122
  state.commons = { all, here }
122
- status(elem, `${(all.bytes / 1000000).toFixed(3)} mb in ${all.files} files`)
123
+ const mb = count => (count.bytes / 1000000).toFixed(1)
124
+ status(elem, `${mb(here)} / ${mb(all)} mb in ${here.files} / ${all.files} files`)
123
125
  }
124
126
 
125
127
  async function delta_emit({ elem, args, state }) {