wiki-plugin-mech 0.1.45-0 → 0.1.46-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 +3 -3
- package/client/mech.js.map +2 -2
- package/package.json +1 -1
package/client/mech.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* wiki-plugin-mech - 0.1.
|
|
1
|
+
/* wiki-plugin-mech - 0.1.46-0 - Thu, 30 Apr 2026 03:49:22 GMT */
|
|
2
2
|
(()=>{function ct(n,o=()=>{}){let i={},t={},e="",s=n,c=[],r=[c];i.match=()=>t.sp()&&t.term("match")&&t.node()&&t.chain()&&t.eot(),i.node=()=>t.ch("(")&&t.elem()&&t.ch(")"),i.chain=()=>u(()=>t.rel()&&t.node()&&t.chain()),i.rel=()=>h(()=>t.in(),()=>t.out(),()=>t.both()),i.in=()=>t.term("<-")&&f(()=>t.ch("[")&&t.elem()&&t.ch("]"))&&t.ch("-"),i.out=()=>t.ch("-")&&f(()=>t.ch("[")&&t.elem()&&t.ch("]"))&&t.term("->"),i.both=()=>t.ch("-")&&f(()=>t.ch("[")&&t.elem()&&t.ch("]"))&&t.ch("-"),i.elem=()=>f(()=>t.bind())&&f(()=>t.ch(":")&&t.type())&&f(()=>t.prop()),i.prop=()=>t.ch("{")&&t.word()&&t.ch(":")&&t.expr()&&t.ch("}"),i.expr=()=>t.strn(),i.bind=()=>t.word(),i.type=()=>t.word(),i.word=()=>l(/^[A-Za-z][A-Za-z0-9_]*/)&&t.sp(),i.term=d=>s.startsWith(d)&&a(d.length)&&p(d)&&t.sp(),i.strn=()=>t.ch('"')&&l(/^[^"]{0,20}/)&&t.ch('"')&&t.sp(),i.ch=d=>s.startsWith(d)&&a(1)&&p(d)&&t.sp(),i.sp=()=>l(/^\s*/),i.eot=()=>!s.length;for(let d in i)t[d]=(...O)=>{o(`${e}%c${d}%c${s}`,"color:red","color:black");let L=c;c=[d];let M=i[d](...O);return M&&L.push(c),c=L,M};function l(d){let O=s.match(d);return O&&a(O[0].length)&&p(O[0]),!!O}function p(d){return c.push(d),!0}function a(d){return e+=s.substring(0,d),s=s.substring(d),!0}function u(d){let O=[e,s];return d()?u(d):[e,s]=O,!0}function f(d){let O=[e,s];return d()||([e,s]=O),!0}function h(...d){let O=[e,s];for(let L of d){if(L())return!0;[e,s]=O}}return t.match(),r}function V(n,o,i,t=()=>{}){let e=()=>" |".repeat(n);switch(o[0]){case"sp":case"ch":case"term":break;case"bind":case"type":t(e(),o[0],`"${o[1][1]}"`),i[o[0]]=o[1][1];break;case"prop":t(e(),o[0],`"${o[2][1]}"`,o[4][1][2]),i[o[0]]=[o[2][1],o[4][1][2]];break;case"node":case"rel":case"chain":t(e(),o[0]);{let s={};i[o[0]]=s;for(let c of o.slice(1))V(n+1,c,s,t)}break;case"in":case"out":case"both":t(e(),o[0]),i.dir=o[0];for(let s of o.slice(1))V(n+1,s,i,t);break;case"match":case"elem":t(e(),o[0]);for(let s of o.slice(1))V(n+1,s,i,t);break;case"eot":t(e(),"end");break;default:t(e(),"unknown",o[0])}return i}function ot(n,o,i){o?.node?.type&&i&&(n.nodes[o.node.type]||i.push(`No node of type "${o.node.type}" in the graph.`)),o?.rel?.type&&i&&(n.rels[o.rel.type]||i.push(`No relation of type "${o.rel.type}" in the graph.`)),Object.keys(o.chain).length&&ot(n,o.chain,i)}function lt(n,o){let i=n.nodes,t=n.rels,e=[];for(let c of i)s(c,o,{});return e;function s(c,r,l){(!r.node.type||c.type==r.node.type)&&(!r.node.prop||c.props[r.node.prop[0]]==r.node.prop[1])&&(r.node.bind&&(l[r.node.bind]=c),r.chain.rel?(["in","both"].includes(r.chain.rel.dir)&&p(c.in,"from"),["out","both"].includes(r.chain.rel.dir)&&p(c.out,"to")):e.push(l));function p(a,u){a.forEach(f=>{(!r.chain.rel.type||t[f].type==r.chain.rel.type)&&(!r.chain.rel.prop||t[f].props[r.chain.rel.prop[0]]==r.chain.rel.prop[1])&&(l={...l},r.chain.rel.bind&&(l[r.chain.rel.bind]=t[f]),s(i[t[f][u]],r.chain,l))})}}}var z=(n,o,i)=>i.indexOf(n)===o,q=class n{constructor(o=[],i=[]){this.nodes=o,this.rels=i}addNode(o,i={}){let t={type:o,in:[],out:[],props:i};return this.nodes.push(t),this.nodes.length-1}addUniqNode(o,i={}){let t=this.nodes.findIndex(e=>e.type==o&&e.props?.name==i?.name);return t>=0?t:this.addNode(o,i)}addRel(o,i,t,e={}){if(i==null||t==null)return null;let s={type:o,from:i,to:t,props:e};this.rels.push(s);let c=this.rels.length-1;return this.nodes[i].out.push(c),this.nodes[t].in.push(c),c}tally(){let o=i=>i.reduce((t,e)=>(t[e.type]=t[e.type]?t[e.type]+1:1,t),{});return{nodes:o(this.nodes),rels:o(this.rels)}}size(){return this.nodes.length+this.rels.length}static load(o){return new n(o.nodes,o.rels)}static async fetch(o){let i=await fetch(o).then(t=>t.json());return n.load(i)}static async read(o){let i=await Deno.readTextFile(o),t=JSON.parse(i);return n.load(t)}copy(o,i){let t={},e=[],s=c=>{if(c in t)return;e.push(c);let r=this.nodes[c];t[c]=i.addNode(r.type,r.props);for(let l of r.out)s(this.rels[l].to);for(let l of r.in)s(this.rels[l].from);for(let l of r.out)i.addRel("",t[c],t[this.rels[l].to],{})};return s(o),e}clusters(){let o=[],i=[...this.nodes.keys()],t=e=>{let s=new n,c=this.copy(e,s);for(let r of c){let l=i.indexOf(r);i.splice(l,1)}return s};for(;i.length;)o.push(t(i[0]));return o}n(o=null,i={}){let t=Object.keys(this.nodes).map(e=>+e);o&&(t=t.filter(e=>this.nodes[e].type==o));for(let e in i)t=t.filter(s=>this.nodes[s].props[e]==i[e]);return new Z(this,t)}stringify(...o){let i={nodes:this.nodes,rels:this.rels};return JSON.stringify(i,...o)}search(o,i={}){let t=ct(o),e=V(0,t[0][0],{});return ot(this.tally(),e,i.errors),lt(this,e)}},Z=class n{constructor(o,i){this.graph=o,this.nids=i}i(o=null,i={}){let t=this.nids.map(e=>this.graph.nodes[e].in).flat().filter(z);o&&(t=t.filter(e=>this.graph.rels[e].type==o));for(let e in i)t=t.filter(s=>this.graph.rels[s].props[e]==i[e]);return new et(this.graph,t)}o(o=null,i={}){let t=this.nids.map(e=>this.graph.nodes[e].out).flat().filter(z);o&&(t=t.filter(e=>this.graph.rels[e].type==o));for(let e in i)t=t.filter(s=>this.graph.rels[s].props[e]==i[e]);return new et(this.graph,t)}props(o="name"){return this.nids.map(i=>this.graph.nodes[i].props[o]).filter(z).sort()}types(){return this.nids.map(o=>this.graph.nodes[o].type).filter(z).sort()}tally(){return{nodes:(i=>i.reduce((t,e)=>(t[e.type]=t[e.type]?t[e.type]+1:1,t),{}))(this.nids.map(i=>this.graph.nodes[i]))}}size(){return this.nids.length}filter(o){let i=this.graph.nodes,t=this.nids.filter(e=>{let s=i[e];return o(s.type,s.props)});return new n(this.graph,t)}map(o){let i=this.graph.nodes;return this.nids.map(e=>{let s=i[e];return o(s)})}},et=class n{constructor(o,i){this.graph=o,this.rids=i}f(o=null,i={}){let t=this.rids.map(e=>this.graph.rels[e].from).filter(z);o&&(t=t.filter(e=>this.graph.nodes[e].type==o));for(let e in i)t=t.filter(s=>this.graph.nodes[s].props[e]==i[e]);return new Z(this.graph,t)}t(o=null,i={}){let t=this.rids.map(e=>this.graph.rels[e].to).filter(z);o&&(t=t.filter(e=>this.graph.nodes[e].type==o));for(let e in i)t=t.filter(s=>this.graph.nodes[s].props[e]==i[e]);return new Z(this.graph,t)}props(o="name"){return this.rids.map(i=>this.graph.rels[i].props[o]).filter(z).sort()}types(){return this.rids.map(o=>this.graph.rels[o].type).filter(z).sort()}tally(){return{rels:(i=>i.reduce((t,e)=>(t[e.type]=t[e.type]?t[e.type]+1:1,t),{}))(this.rids.map(i=>this.graph.rels[i]))}}size(){return this.rids.length}filter(o){let i=this.graph.rels,t=this.rids.filter(e=>{let s=i[e];return o(s.type,s.props)});return new n(this.graph,t)}map(o){let i=this.graph.rels;return this.rids.map(e=>{let s=i[e];return o(s)})}};function at(n,o){let i=[];for(let t of document.querySelectorAll(".item"))if(t.classList.contains(`${o}-source`)&&i.unshift(t),t===n)break;return i.map(t=>{let e=t[`${o}Data`],s=e?e():null;return{div:t,result:s}})}function pt(n){let o=e=>Object.entries(e).filter(s=>s[1]).map(s=>`${s[0]}: ${s[1]}`).join("\\n"),i=n.nodes.map((e,s)=>{let c=e.type?`${e.type}\\n${e.props.name}`:e.props.name;return`${s} [label="${c}" ${e.props.url||e.props.tick?`URL="${e.props.url||"#"}" target="_blank"`:""} tooltip="${o(e.props)}"]`}),t=n.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,...t,"}"].join(`
|
|
3
3
|
`)}function ut(n,o="steps",i,t={}){let e=(m,y)=>i.find(v=>v.slug==m&&(!y||v.domain==y)),s=m=>m?m.map(y=>e(y)):null,c=m=>Math.floor(m*Math.abs(Math.random()-Math.random())),r=m=>m[c(m.length)],l=m=>m.links&&Object.keys(m.links).length<10,p=m=>i.filter(y=>l(y)&&m in y.links),a=(m,y,v)=>v.findIndex(E=>E.slug==m.slug)===y,u=m=>m.toSorted((y,v)=>v.date-y.date).filter(a).slice(0,3),f=i.map(m=>m.domain).filter(X);function h(m){let y=new q,v=g=>y.addUniqNode("",{name:g.title.replaceAll(/ /g,`
|
|
4
4
|
`),title:g.title,site:g.domain}),E=g=>s(g?.patterns?.up)??u(p(g.slug)),w=g=>g?.patterns?.down??Object.keys(g.links||{}),b=v(m);for(let g of E(m))y.addRel("",v(g),b);for(let g of w(m)){let S=e(g);if(S){let D=v(S);y.addRel("",b,D);for(let R of E(S))y.addRel("",v(R),D)}}return y}switch(o){case"steps":return d(n);case"days":return O(o,1,n);case"weeks":return O(o,7,n);case"months":return O(o,30,n);case"hubs":return L(n);case"references":return K();case"lineup":return M();case"topics":return G(n);case"clicks":return j(n)}function d(m=5){return f.map(y=>{let v=y.split(".").slice(0,3).join("."),E=new Set,w=new q,b=0,g=i.filter(k=>k.domain==y&&"links"in k);if(!g.length)return{name:v,graph:null};let S=k=>(b=w.addNode("",{name:k.title.replaceAll(/ /g,`
|
|
@@ -36,7 +36,7 @@ ${p[j]||""}`,id:v(m)}),E[0].match(/\.\w+\.\w+$/)&&h.push({type:"roster",text:E.j
|
|
|
36
36
|
`)})}},h=[{type:"paragraph",text:`From ${new Date().toString().replace(/ *\(.*\)/,"")}`},{type:"solo",text:"INCLUDED",aspects:s[0].result}];r.push("<h1>Story</h1>");let d=s.find(j=>j.source.match(/^WALK.*clicks/));if(!d)return t.api.trouble(n,"PRINT needs aspect from WALK clicks");let O=d.result.map(j=>j.name);await G(O,"story"),r.push("<h1>Garden</h1>");let L=d.result.map(j=>j.graph.nodes.map(m=>m.props)).flat(),M=(j,m,y)=>y.indexOf(j)===m,K=L.map(j=>Q(j.name.replaceAll(`
|
|
37
37
|
`," "))).filter(M).filter(j=>!O.includes(j)).sort();await G(K,"garden"),console.log({tally:l,explain:p}),u("domains","Sourced Sites"),u("missing","Missing Pages"),u("omitted","Omitted Links"),u("forks","Omitted Forks"),u("wishes","Unusual Plugins"),u("errors","Program Errors"),h.length&&(t.items=h),t.api.status(n,o,` \u21D2 ${O.length} story, ${K.length} garden`),t.api.download(r.join(`
|
|
38
38
|
`),`print-${e}.html`,"text/html");async function G(j,m){let y='style="width:640px"',v=E=>E.replaceAll(/\[\[(.*?)\]\]/g,(w,b)=>`<a href="#${Q(b)}">${b}</a>`).replaceAll(/\[.*? (.*?)\]/g,(w,b)=>`<i>${b}</i>`);for(let E of j){let w=c.find(b=>b.slug==E);if(!w){a(l.missing,m,E),p.missing="These pages weren't found in PRINT's neighborhood.";continue}if(a(l.domains,w.domain,w.slug),p.domains="Pages have been retrieved from these sites. Remove sites from the PRINT neighborhood if these should be found elsewhere.",m=="garden"){for(let b in w.links)j.includes(b)||a(l.omitted,E,b);p.omitted="Garden pages with links to pages omitted from the garden. These may show up with a deeper WALK into the garden'"}if(e=="outline")r.push(`<p id="${w.slug}" ${y}"><b title="${w.domain}">${w.title}</b> -- ${v(w.synopsis)}</p>`);else{let b=j.indexOf(E)+1;t.api.status(n,o,` \u21D2 ${b} of ${j.length} from ${m}`);try{console.log(w.domain,w.title);let g=await t.api.jfetch(`//${w.domain}/${w.slug}.json`);r.push(`<section id="${w.slug}"><h3 title="${w.domain}">${w.title}</h3>`);for(let S of g.story)switch(S.type!="paragraph"&&a(l.wishes,S.type,E),p.wishes='Items of type "paragraph" are expected. Types "markdown" and "html" may show without revision. The remainder appear as only a one-line note.',S.type){case"paragraph":case"markdown":r.push(`<p ${y}>${v(S.text)}</p>`);break;case"html":r.push(`<p ${y}>${v(t.api.closeTags(S.text))}</p>`);break;default:r.push(`<p ${y}>Item type "${S.type}" omitted.</p>`)}for(let S of g.journal)S.site&&!c.find(D=>D.domain==S.site)&&a(l.forks,S.site,E),p.forks="Wiki remembers where pages may once have lived but PRINT only looks for pages in the neighborhoods prvided.";r.push("</section>")}catch(g){a(l.errors,g.message,w.slug),p.errors="Any pages that lead to program errors should be explored by developers. Until then they will be ignored."}}}}}async function he({elem:n,command:o,args:i,state:t}){let e=t.api.thisLineupKey(n),r=t.api.lineupAtKey(e).getRawPage().story.filter(f=>f.type=="code");if(!r)return t.api.trouble(n,"CODE expects the Code plugin in use on this page.");let l=r.map(f=>f.text).join(`
|
|
39
|
-
`),p=i.length?i[0]:"default",a={trouble(f){t.api.trouble(n,f)},response(f){t.api.response(n,f)},status(f){t.api.status(n,o,f)},report(f){t.api.report(n,o,f)},graph(f=[],h=[]){return new q(f,h)}},u={get(f,h){return h=="api"?a:(t.api.inspect(n,h,f),f[h])}};try{let f=await import(`data:text/javascript;base64,${btoa(l)}`)
|
|
40
|
-
`),O=f.message,L=f.line??f.lineNumber,M=f.columnNumber;if(L){let K=h[L-1];M?O+=`<span class=code>${K.substring(0,M-1)}<font color=red
|
|
39
|
+
`),p=i.length?i[0]:"default",a={trouble(f){t.api.trouble(n,f)},response(f){t.api.response(n,f)},status(f){t.api.status(n,o,f)},report(f){t.api.report(n,o,f)},graph(f=[],h=[]){return new q(f,h)}},u={get(f,h){return h=="api"?a:(t.api.inspect(n,h,f),f[h])}};try{let f=await import(`data:text/javascript;base64,${btoa(l)}`);if(!(p in f))return a.trouble(`Expected export of function "${p}".`);let h=new Proxy(t,u),d=await f[p].apply(h,i.slice(1));typeof d<"u"&&t.api.status(n,o,` \u21D2 ${d}`)}catch(f){let h=l.split(/\n/),d=h.map((K,G)=>`${G+1} ${K}`).join(`
|
|
40
|
+
`),O=f.message,L=f.line??f.lineNumber,M=f.columnNumber;if(L){let K=h[L-1];M?O+=`<span class=code>${K.substring(0,M-1)}<font color=red>\u2716\uFE0E</font>${K.substring(M-1)}</span>`:O+=`<span class=code>${K}</span>`}return t.api.trouble(n,O)}}async function ge({elem:n,command:o,args:i,state:t}){let e={txt:"text/plain",html:"text/html",csv:"text/csv",tsv:"text/tsv",json:"application/json"};if(!i.length)return t.api.trouble(n,"DOWNLOAD expects an argument, a file name to use when downloaded.");let s=i[0].match(/^.+\.(txt|html|csv|tsv|json)$/);if(console.log(s),!s)return t.api.trouble(n,"DOWNLOAD expects a familiar suffix, one of txt, html, csv, tsv, or json.");let[c,r]=s;if(!(r in t))return t.api.trouble(n,`DOWNLOAD expects to find "${r}" in state.`);let l=r=="json"?JSON.stringify(t.json):t[r];t.api.status(n,o,` \u21D2 ${l.length} bytes`),t.api.download(l,c,e[r])}var nt={CLICK:{emit:Ct},HELLO:{emit:_t},FROM:{emit:Ft},SENSOR:{emit:Ut},REPORT:{emit:Gt},SOURCE:{emit:Ht},PREVIEW:{emit:zt},NEIGHBORS:{emit:Bt},WALK:{emit:Jt},TICK:{emit:Vt},UNTIL:{emit:Zt},FORWARD:{emit:Xt},TURN:{emit:Qt},FILE:{emit:Yt},KWIC:{emit:te},SHOW:{emit:ee},RANDOM:{emit:ne},SLEEP:{emit:oe},TOGETHER:{emit:ie},GET:{emit:se},DELTA:{emit:re},ROSTER:{emit:ce},LINEUP:{emit:le},LISTEN:{emit:ae},MESSAGE:{emit:pe},SOLO:{emit:ue},POPUP:{emit:de},PRINT:{emit:fe},CODE:{emit:he},DOWNLOAD:{emit:ge}};function me(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function rt(n,o,i){for(;n.length;){let e=n[0].match(/( *)(.*)/),s=e[1].length,c=e[2];if(s==i)o.push({command:c}),n.shift();else if(s>i){var t=[];o.push(t),rt(n,t,s)}else return o}return o}function kt(n){let o=Math.floor(Math.random()*1e6),i=(t,e)=>{let s=[];for(let c of t){let r=`${o}.${e.join(".")}`;c.key=r,"command"in c?s.push(`<div></div><span id=${r} class=block >${me(c.command)}</span>`):s.push(`<div id=${r} class=body>${i(c,[...e,0])}</div>`),e[e.length-1]++}return s.join(`
|
|
41
41
|
`)};return i(n,[0])}var X=(n,o,i)=>i.indexOf(n)===o,bt=n=>new Promise(o=>setTimeout(o,n)),Q=n=>n.replace(/\s/g,"-").replace(/[^A-Za-z0-9-]/g,"").toLowerCase();function qe(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function ye(n,o){$("link[href='/plugins/mech/mech.css']").length||$('<link rel="stylesheet" href="/plugins/mech/mech.css" type="text/css">').appendTo("head");let i=o.text.split(/\n/),t=rt(i,[],0),e=kt(t),s=n.parents(".page"),c=s.data("key"),l={context:{item:o,itemId:o.id,pageKey:c,page:wiki.lineup.atKey(c).getRawPage(),origin:window.origin,site:s.data("site")||window.location.host,slug:s.attr("id"),title:s.data("data").title,blocks:Object.keys(nt)},api:ht};n.append(`<div style="background-color:#eee;padding:15px;border-top:8px;">${e}</div>`),C(t,l)}function be(n,o){return n.dblclick(()=>wiki.textEditor(n,o))}typeof window<"u"&&window!==null&&(window.plugins.mech={emit:ye,bind:be});})();
|
|
42
42
|
//# sourceMappingURL=mech.js.map
|
package/client/mech.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/graph/cypher.js", "../src/client/graph/graph.js", "../src/client/library.js", "../node_modules/universal-ticker/index.js", "../src/client/blocks.js", "../src/client/interpreter.js", "../src/client/mech.js"],
|
|
4
|
-
"sourcesContent": ["export function parse(text, log = () => {}) {\n const r = {},\n x = {} // rules defined and traced\n let left = '',\n right = text // text parsed and pending\n let branch = [] // abstract syntax tree in progress\n const tree = [branch]\n\n // Non-Terminal Symbols\n\n r.match = () => x.sp() && x.term('match') && x.node() && x.chain() && x.eot()\n r.node = () => x.ch('(') && x.elem() && x.ch(')')\n r.chain = () => any(() => x.rel() && x.node() && x.chain())\n r.rel = () =>\n one(\n () => x.in(),\n () => x.out(),\n () => x.both(),\n )\n r.in = () => x.term('<-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.ch('-')\n r.out = () => x.ch('-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.term('->')\n r.both = () => x.ch('-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.ch('-')\n r.elem = () => opt(() => x.bind()) && opt(() => x.ch(':') && x.type()) && opt(() => x.prop())\n r.prop = () => x.ch('{') && x.word() && x.ch(':') && x.expr() && x.ch('}')\n r.expr = () => x.strn()\n r.bind = () => x.word()\n r.type = () => x.word()\n\n // Terminal Symbols\n\n r.word = () => match(/^[A-Za-z][A-Za-z0-9_]*/) && x.sp()\n r.term = want => right.startsWith(want) && accept(want.length) && keep(want) && x.sp()\n r.strn = () => x.ch('\"') && match(/^[^\"]{0,20}/) && x.ch('\"') && x.sp()\n r.ch = char => right.startsWith(char) && accept(1) && keep(char) && x.sp()\n r.sp = () => match(/^\\s*/)\n r.eot = () => !right.length\n\n // Parse Instrumentation\n\n for (const op in r) {\n x[op] = (...args) => {\n log(`${left}%c${op}%c${right}`, 'color:red', 'color:black')\n const here = branch\n branch = [op]\n const success = r[op](...args)\n if (success) here.push(branch)\n branch = here\n return success\n }\n }\n\n // Parser State Updates\n\n function match(regex) {\n const m = right.match(regex)\n m && accept(m[0].length) && keep(m[0])\n return !!m\n }\n\n function keep(text) {\n branch.push(text)\n return true\n }\n\n function accept(n) {\n left += right.substring(0, n)\n right = right.substring(n)\n return true\n }\n\n // Backtracking Operators\n\n function any(rule) {\n // rule zero or more times\n const save = [left, right]\n if (rule()) {\n any(rule)\n } else {\n ;[left, right] = save\n }\n return true\n }\n\n function opt(rule) {\n // rule zero or one times\n const save = [left, right]\n if (!rule()) {\n ;[left, right] = save\n }\n return true\n }\n\n function one(...rules) {\n // first rule of many\n const save = [left, right]\n for (const rule of rules) {\n if (rule()) {\n return true\n }\n ;[left, right] = save\n }\n false\n }\n\n x.match()\n return tree\n}\n\nexport function gen(level, tree, code, log = () => {}) {\n const tab = () => ' |'.repeat(level)\n switch (tree[0]) {\n case 'sp':\n case 'ch':\n case 'term':\n break\n case 'bind':\n case 'type':\n log(tab(), tree[0], `\"${tree[1][1]}\"`)\n code[tree[0]] = tree[1][1]\n break\n case 'prop':\n log(tab(), tree[0], `\"${tree[2][1]}\"`, tree[4][1][2])\n code[tree[0]] = [tree[2][1], tree[4][1][2]]\n break\n case 'node':\n case 'rel':\n case 'chain':\n log(tab(), tree[0])\n {\n const sub = {}\n code[tree[0]] = sub\n for (const branch of tree.slice(1)) gen(level + 1, branch, sub, log)\n }\n break\n case 'in':\n case 'out':\n case 'both':\n log(tab(), tree[0])\n code['dir'] = tree[0]\n for (const branch of tree.slice(1)) gen(level + 1, branch, code, log)\n break\n case 'match':\n case 'elem':\n log(tab(), tree[0])\n for (const branch of tree.slice(1)) gen(level + 1, branch, code, log)\n break\n case 'eot':\n log(tab(), 'end')\n break\n default:\n log(tab(), 'unknown', tree[0])\n }\n return code\n}\n\nexport function check(tally, code, errors) {\n if (code?.node?.type && errors) {\n if (!tally.nodes[code.node.type]) {\n errors.push(`No node of type \"${code.node.type}\" in the graph.`)\n }\n }\n if (code?.rel?.type && errors) {\n if (!tally.rels[code.rel.type]) {\n errors.push(`No relation of type \"${code.rel.type}\" in the graph.`)\n }\n }\n if (Object.keys(code.chain).length) {\n check(tally, code.chain, errors)\n }\n}\n\nexport function apply(graph, code) {\n const nodes = graph.nodes\n const rels = graph.rels\n const results = []\n for (const node of nodes) {\n chain(node, code, {})\n }\n return results\n\n function chain(node, code, maybe) {\n if (\n (!code.node.type || node.type == code.node.type) &&\n (!code.node.prop || node.props[code.node.prop[0]] == code.node.prop[1])\n ) {\n if (code.node.bind) maybe[code.node.bind] = node\n if (code.chain.rel) {\n if (['in', 'both'].includes(code.chain.rel.dir)) links(node.in, 'from')\n if (['out', 'both'].includes(code.chain.rel.dir)) links(node.out, 'to')\n } else {\n results.push(maybe)\n }\n }\n\n function links(rids, dir) {\n rids.forEach(rid => {\n if (\n (!code.chain.rel.type || rels[rid].type == code.chain.rel.type) &&\n (!code.chain.rel.prop || rels[rid].props[code.chain.rel.prop[0]] == code.chain.rel.prop[1])\n ) {\n maybe = { ...maybe }\n if (code.chain.rel.bind) maybe[code.chain.rel.bind] = rels[rid]\n chain(nodes[rels[rid][dir]], code.chain, maybe)\n }\n })\n }\n }\n}\n", "'use strict'\n\nimport * as cypher from './cypher.js'\n\nconst uniq = (value, index, self) => self.indexOf(value) === index\n\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 if (from == null || to == null) return null\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 tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { nodes: tally(this.nodes), rels: tally(this.rels) }\n }\n\n size() {\n return this.nodes.length + this.rels.length\n }\n\n static load(obj) {\n // let obj = await fetch(url).then(res => res.json())\n return new Graph(obj.nodes, obj.rels)\n }\n\n static async fetch(url) {\n const obj = await fetch(url).then(res => res.json())\n return Graph.load(obj)\n }\n\n static async read(path) {\n const json = await Deno.readTextFile(path)\n const obj = JSON.parse(json)\n return Graph.load(obj)\n }\n\n // static async import(path) {\n // let module = await import(path, {assert: {type: \"json\"}})\n // return Graph.load(module.default)\n // }\n\n copy(nid, output) {\n const doing = {}\n const done = []\n\n const nodecopy = nid => {\n if (nid in doing) return\n done.push(nid)\n const node = this.nodes[nid]\n doing[nid] = output.addNode(node.type, node.props)\n for (const rid of node.out) nodecopy(this.rels[rid].to)\n for (const rid of node.in) nodecopy(this.rels[rid].from)\n for (const rid of node.out) output.addRel('', doing[nid], doing[this.rels[rid].to], {})\n }\n\n nodecopy(nid)\n return done\n }\n\n clusters() {\n const result = []\n const todo = [...this.nodes.keys()]\n const doit = nid => {\n const graph = new Graph()\n const done = this.copy(nid, graph)\n for (const nid of done) {\n const index = todo.indexOf(nid)\n todo.splice(index, 1)\n }\n return graph\n }\n while (todo.length) {\n result.push(doit(todo[0]))\n }\n return result\n }\n\n n(type = null, props = {}) {\n let nids = Object.keys(this.nodes).map(key => +key)\n if (type) nids = nids.filter(nid => this.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.nodes[nid].props[key] == props[key])\n return new Nodes(this, nids)\n }\n\n /**\n * Converts a graph to a JavaScript Object Notation (JSON) string using JSON.stringify.\n @param - replacer A function that transforms the results.\n @param - space Adds indentation, white space, and line break characters to the return-\n * @returns {string} JSON string containing serialized graph\n */\n stringify(...args) {\n const obj = { nodes: this.nodes, rels: this.rels }\n return JSON.stringify(obj, ...args)\n }\n\n search(query, opt = {}) {\n const tree = cypher.parse(query)\n // console.dir(tree, {depth:15})\n const code = cypher.gen(0, tree[0][0], {})\n // console.log(code)\n cypher.check(this.tally(), code, opt.errors)\n return cypher.apply(this, code)\n }\n}\n\n// Fluent Interface (deprecated?)\n\nexport class Nodes {\n constructor(graph, nids) {\n // console.log('Nodes',{graph:graph.size(),type,nids})\n this.graph = graph\n this.nids = nids\n }\n\n // n(type=null, props={}) {\n // // console.log('Nodes.n',{type,props})\n // let nids = this.nids\n // if (type) nids = nids.filter(nid => this.nodes[nid].type == type)\n // for (let key in props) nids = nids.filter(nid => this.nodes[nid].props[key] == props[key])\n // return new Nodes(this.graph, type, nids)\n // }\n\n i(type = null, props = {}) {\n // console.log('Nodes.i',{type,props})\n let rids = this.nids\n .map(nid => this.graph.nodes[nid].in)\n .flat()\n .filter(uniq)\n if (type) rids = rids.filter(rid => this.graph.rels[rid].type == type)\n for (const key in props) rids = rids.filter(rid => this.graph.rels[rid].props[key] == props[key])\n return new Rels(this.graph, rids)\n }\n\n o(type = null, props = {}) {\n // console.log('Nodes.o',{type,props})\n let rids = this.nids\n .map(nid => this.graph.nodes[nid].out)\n .flat()\n .filter(uniq)\n if (type) rids = rids.filter(rid => this.graph.rels[rid].type == type)\n for (const key in props) rids = rids.filter(rid => this.graph.rels[rid].props[key] == props[key])\n return new Rels(this.graph, rids)\n }\n\n props(key = 'name') {\n // console.log('Nodes.p',{key})\n return this.nids\n .map(nid => this.graph.nodes[nid].props[key])\n .filter(uniq)\n .sort()\n }\n\n types() {\n return this.nids\n .map(nid => this.graph.nodes[nid].type)\n .filter(uniq)\n .sort()\n }\n\n tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { nodes: tally(this.nids.map(nid => this.graph.nodes[nid])) }\n }\n\n size() {\n return this.nids.length\n }\n\n filter(f) {\n const nodes = this.graph.nodes\n const nids = this.nids.filter(nid => {\n const node = nodes[nid]\n return f(node.type, node.props)\n })\n return new Nodes(this.graph, nids)\n }\n\n map(f) {\n const nodes = this.graph.nodes\n const result = this.nids.map(nid => {\n const node = nodes[nid]\n return f(node)\n })\n return result\n }\n}\n\nexport class Rels {\n constructor(graph, rids) {\n // console.log('Rels',{graph:graph.size(),type,rids})\n this.graph = graph\n this.rids = rids\n }\n\n f(type = null, props = {}) {\n // console.log('Rels.f',{type,props})\n let nids = this.rids.map(rid => this.graph.rels[rid].from).filter(uniq)\n if (type) nids = nids.filter(nid => this.graph.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.graph.nodes[nid].props[key] == props[key])\n return new Nodes(this.graph, nids)\n }\n\n t(type = null, props = {}) {\n // console.log('Rels.t',{type,props})\n let nids = this.rids.map(rid => this.graph.rels[rid].to).filter(uniq)\n if (type) nids = nids.filter(nid => this.graph.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.graph.nodes[nid].props[key] == props[key])\n return new Nodes(this.graph, nids)\n }\n\n props(key = 'name') {\n // console.log('Rels.p',{key})\n return this.rids\n .map(rid => this.graph.rels[rid].props[key])\n .filter(uniq)\n .sort()\n }\n\n types() {\n return this.rids\n .map(rid => this.graph.rels[rid].type)\n .filter(uniq)\n .sort()\n }\n\n tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { rels: tally(this.rids.map(nid => this.graph.rels[nid])) }\n }\n\n size() {\n return this.rids.length\n }\n\n filter(f) {\n const rels = this.graph.rels\n const rids = this.rids.filter(rid => {\n const rel = rels[rid]\n return f(rel.type, rel.props)\n })\n return new Rels(this.graph, rids)\n }\n\n map(f) {\n const rels = this.graph.rels\n const result = this.rids.map(rid => {\n const rel = rels[rid]\n return f(rel)\n })\n return result\n }\n}\n", "import { uniq, delay, asSlug } from './mech.js'\nimport { Graph } from './graph/graph.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 case 'clicks':\n return clicks(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 pageObjects = scope.lineup()\n console.log('library lineup', { scope, pageObjects })\n for (const pageObject of pageObjects) {\n const slug = pageObject.getSlug()\n const site = pageObject.getRemoteSite(scope.host())\n const info = find(slug, site)\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('library references', { items })\n for (const item of items) {\n const { title, site, slug } = item\n const info = find(slug, site)\n if (info) aspects.push({ name: title, graph: blanket(info) })\n }\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.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 }\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\n .slice(0)\n .sort((a, b) => when(b) - when(a))\n .filter(a => when(a) >= from && when(a) <= until)[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().map((graph, i) => ({ name: topic(graph), graph }))\n }\n }\n\n function clicks(count = 1) {\n const node = (graph, info, props = {}) => {\n return graph.addUniqNode(\n '',\n Object.assign(\n {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n date: info.date,\n },\n props,\n ),\n )\n }\n\n const aspects = []\n const items = scope.page().story\n const story = items.filter(item => item.type == 'reference').map(item => item.slug)\n // const infos = neighborhood.filter(info => info.slug == slug)\n // for (const info of infos) {\n // story = new Set(Object.keys(info.links))\n // console.log('story', story.keys())\n for (const slug of story) {\n const here = neighborhood.find(info => info.slug == slug)\n const graph = new Graph()\n if (here) {\n const nid = node(graph, here, { color: 'lightblue' })\n more(graph, count, nid, here)\n } else graph.addNode('', { name: slug.replaceAll(/-/g, '\\n'), color: 'white' })\n aspects.push({ name: slug, graph })\n }\n // }\n return aspects\n\n function more(graph, num, nid, info) {\n if (num < 1) return\n for (const slug in info.links) {\n if (story.includes(slug)) return\n const here = neighborhood.find(info => info.slug == slug)\n if (here) {\n const nnid = node(graph, here)\n graph.addRel('', nid, nnid, {})\n more(graph, num - 1, nnid, here)\n } else {\n const nnid = graph.addUniqNode('', { name: slug.replaceAll(/-/g, '\\n'), color: 'white' })\n graph.addRel('', nid, nnid, {})\n }\n }\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 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 { Graph } from './graph/graph.js'\n\n// https://github.com/nrn/universal-ticker\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 lineupAtKey,\n thisLineupKey,\n lineupPages,\n host,\n download,\n closeTags,\n reset,\n report,\n}\n\nexport function trouble(elem, message) {\n if (elem.innerText.match(/\u2716\uFE0E/)) return\n elem.innerHTML += `<button class=trouble>\u2716\uFE0E</button>`\n elem.querySelector('button').addEventListener('click', event => {\n elem.outerHTML += `<span class=trouble>${message}</span>`\n })\n}\n\nexport function inspect(elem, key, state) {\n const div = elem.previousElementSibling\n if (state.debug) {\n elem['sample-' + key] = state[key] // proper lifetime and indirection\n let look = div.querySelector(`.look[data-key=\"${key}\"]`)\n if (!look) {\n look = document.createElement('div')\n look.classList.add('look')\n look.dataset.key = key\n look.innerHTML = `<font color=gray size=small>${key} \u21D2</font>`\n div.insertAdjacentElement('beforeend', look)\n look.querySelector('font').addEventListener('click', event => {\n let see = look.querySelector('.see')\n if (!see) {\n see = document.createElement('div')\n see.classList.add('see')\n look.insertAdjacentElement('beforeend', see)\n see.innerText = JSON.stringify(elem['sample-' + key]).substring(0, 400) + ' ...'\n } else {\n see.remove()\n }\n })\n }\n }\n}\n\nexport function response(elem, html) {\n elem.innerHTML += html\n}\n\nexport function button(elem, label, handler) {\n if (!elem.querySelector('button')) {\n response(elem, `<button class=button>${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 + `<span class=status>${text}</span>`\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 function lineupAtKey(key) {\n return wiki.lineup.atKey(key)\n}\n\nexport function thisLineupKey(elem) {\n return elem.closest('.page').dataset.key\n}\n\nexport function lineupPages(elem) {\n const items = [...document.querySelectorAll('.page')]\n const index = items.indexOf(elem.closest('.page'))\n const pages = items.slice(0, index)\n return pages.map(div => lineupAtKey(div.dataset.key))\n}\n\nexport function host() {\n location.host\n}\n\nexport function download(string, file, mime = 'text/json') {\n // const blob = new Blob([string], { type: mimeType }); // untested alternative?\n // const data = URL.createObjectURL(blob);\n var data = `data:${mime};charset=utf-8,` + encodeURIComponent(string)\n var anchor = document.createElement('a')\n anchor.setAttribute('href', data)\n anchor.setAttribute('download', file)\n document.body.appendChild(anchor) // required for firefox\n anchor.click()\n anchor.remove()\n}\n\nexport function closeTags(html) {\n const div = document.createElement('div')\n div.innerHTML = html\n return div.innerHTML\n}\n\nexport function reset(elem) {\n const div = elem.nextElementSibling\n div.querySelectorAll('div.look').forEach(e => (e.outerText = ''))\n div.querySelectorAll('.trouble').forEach(e => (e.outerText = ''))\n div.querySelectorAll('button.button').forEach(e => (e.outerText = ''))\n div.querySelectorAll('span.status').forEach(e => (e.outerText = ''))\n div.querySelectorAll('div.report').forEach(e => (e.outerText = ''))\n}\n\nexport function report(elem, command, html) {\n elem.innerHTML = command + html\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.api.reset(elem)\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 const keys = Object.keys(state).filter(key => !['context', 'api', 'debug'].includes(key))\n for (const key of keys) state.api.inspect(elem, key, state)\n state.api.response(elem, world)\n}\n\nasync function from_emit({ elem, command, args, body, state }) {\n if (!args[0]) return state.api.trouble(elem, `FROM expects site/slug as way to federated wiki page.`)\n if (!body?.length) return state.api.trouble(elem, `FROM expects indented blocks to follow.`)\n const url = args[0]\n state.api.status(elem, command, ' \u23F3')\n const page = await state.api.jfetch(`//${url}.json`)\n if (!page) return state.api.trouble(elem, `FROM could not fetch \"${url}\" `)\n state.page = page\n state.api.status(elem, command, ' \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, args, state }) {\n const key = args[0] || 'temperature'\n if (!(key in state)) return state.api.trouble(elem, `Expect \"${key}\" in state`)\n const value = state[key]\n const type = typeof value\n if (!['string', 'number'].includes(type))\n return state.api.trouble(elem, `Expect state.${key} to be a string or number`)\n state.api.inspect(elem, key, state)\n state.api.report(elem, command, `<div class=report>${value}</div>`)\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 { result } of state.aspect) {\n for (const { name, graph } of result) {\n if (state.debug) console.log({ 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, `\"items\" preview expects \"items\" state, like from \"KWIC\".`)\n state.api.inspect(elem, 'items', state)\n const beit = item => {\n switch (typeof item) {\n case 'object':\n if ('type' in item) return item\n else return beit(item.toString())\n case 'function':\n return beit(item())\n case 'string':\n if (item.charAt(0) == '<') return { type: 'html', text: item }\n if (item.match(/^https?:/i)) return { type: 'frame', text: item }\n default:\n return { type: 'paragraph', text: item.toString() }\n }\n }\n const items = state.items.map(beit)\n story.push(...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 if (args.length == 1) return state.api.showResult(elem, state.page)\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 let have = state.api.neighborhood(args[0])\n for (let i = 1; i < args.length; i++) have.push(...state.api.neighborhood(args[i]))\n have = have.filter((s, i) => s.length && !have.slice(0, i).find(e => e[0]?.domain == s[0]?.domain))\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()\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] =\n command.match(/\\b(\\d+)? *(steps|days|weeks|months|hubs|lineup|references|topics|clicks)\\b/) || []\n if (!way && command != 'WALK') return state.api.trouble(elem, `WALK can't understand rest of this block.`)\n const scope = {\n host() {\n return state.api.host()\n },\n lineup() {\n return state.api.lineupPages(elem)\n },\n references() {\n const key = state.api.thisLineupKey(elem)\n const pageObject = state.api.lineupAtKey(key)\n const story = pageObject.getRawPage().story\n // console.log('walk references', { key, pageObject, story })\n return story.filter(item => item.type == 'reference')\n },\n page() {\n if (!state.page) state.api.trouble(elem, 'WALK expects a page, like from FROM')\n state.api.inspect(elem, 'page', state)\n return state.page\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 })\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.api.reset(elem)\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 state.api.trouble(elem, `UNTIL expects an argument, a word to stop running.`)\n if (!state.tick) return state.api.trouble(elem, `UNTIL expects to indented below an iterator, like TICKS.`)\n if (!state.aspect) return state.api.trouble(elem, `UNTIL expects \"aspect\", like from WALK.`)\n inspect(elem, 'aspect', state)\n // elem.innerHTML = command + ` \u21D2 ${state.tick}`\n state.api.status(elem, 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 state.api.response(elem, ' 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 state.api.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 state.api.trouble(elem, `FILE expects an argument, the dot suffix for desired files.`)\n if (!body?.length) return state.api.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 state.api.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.api.status(elem, command, ` \u21D2 ${text.length} bytes`)\n const prop = {}\n prop[suffix] = text\n run(body, Object.assign(prop, 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 state.api.trouble(elem, `KWIK expects $K or $W in link prototype.`)\n if (!('tsv' in state)) return state.api.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 state.api.status(elem, 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 state.api.status(elem, 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 state.api.status(elem, command, ` \u21D2 ${state.info.title}`)\n } else {\n return state.api.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 state.api.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 state.api.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.api.status(elem, 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 state.api.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 state.api.status(elem, command, ` \u21D2 ${count} remain`)\n let clock = setInterval(() => {\n // if (--count > 0) elem.innerHTML = command + ` \u21D2 ${count} remain`\n if (--count > 0) state.api.status(elem, command, ` \u21D2 ${count} remain`)\n else {\n clearInterval(clock)\n // elem.innerHTML = command +\n state.api.status(elem, 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 state.api.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 state.api.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 state.api.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 +\n state.api.status(elem, 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 state.api.trouble(elem, `RUN received error \"${result.err}\"`)\n } catch (err) {\n return state.api.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 ('status' in arg) state.api.status(elem, arg.command, ` \u21D2 ${arg.status}`)\n if ('trouble' in arg) state.api.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 state.api.status(elem, 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 state.api.trouble(elem, `DELTA expects argument, \"have\" or \"apply\" on client.`)\n if (body) return state.api.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 state.api.status(elem, command, ` \u21D2 ${new Date(state.recent).toLocaleString()}`)\n break\n case 'apply':\n if (!('actions' in state)) return state.api.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 state.api.status(elem, command, ` \u21D2 \u2206 ${(((after - before) / before) * 100).toFixed(1)}%`)\n break\n default:\n state.api.trouble(elem, `DELTA doesn't know \"${args[0]}\".`)\n }\n}\n\nfunction roster_emit({ elem, command, state }) {\n if (!state.neighborhood) return state.api.trouble(elem, `ROSTER expected a neighborhood, like from NEIGHBORS.`)\n state.api.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 state.api.status(elem, command, ` \u21D2 ${sites.length} sites`)\n state.items = items\n}\n\nfunction lineup_emit({ elem, command, state }) {\n const items = state.api.lineupPages(elem).map(pageObject => {\n const page = pageObject.getRawPage()\n const site = pageObject.getRemoteSite(state.api.host())\n const title = page.title || 'Empty'\n const slug = asSlug(title)\n const text = page.story[0]?.text || 'empty'\n return { type: 'reference', site, slug, title, text }\n })\n state.api.status(elem, command, ` \u21D2 ${items.length} pages`)\n state.items = items\n}\n\nfunction listen_emit({ elem, command, args, state }) {\n if (args.length < 1) return state.api.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 state.api.status(elem, command, ` \u21D2 ready`)\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 state.api.status(elem, 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 state.api.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 state.api.status(elem, command, ` \u21D2 sent`)\n}\n\nasync function solo_emit({ elem, command, state }) {\n if (!('aspect' in state)) return state.api.trouble(elem, `\"SOLO\" expects \"aspect\" state, like from \"WALK\".`)\n inspect(elem, 'aspect', state)\n // elem.innerHTML = command\n state.api.status(elem, 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 state.api.status(elem, command, ` \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 expand = text => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n const html = []\n switch (args[0]) {\n case 'state':\n for (const key in state) {\n let value = state[key]\n if (value == null) continue\n if (typeof value != 'string') value = JSON.stringify(state[key], null, 2)\n html.push(\n `<details>\n <summary>${key}</summary>\n <pre style=\"white-space: pre-wrap;\">${expand(value)}</pre>\n </details>`,\n )\n }\n break\n case 'images':\n if (!state.commons)\n return state.api.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 }\n break\n default:\n return state.api.trouble(elem, `POPUP doesn't know \"${args[0]}\".`)\n }\n wiki.dialog(elem.innerText, html.join('\\n'))\n}\n\nasync function print_emit({ elem, command, args, state }) {\n if (!['outline', 'draft'].includes(args[0])) return state.api.trouble(elem, 'Expects PRINT outline or PRINT draft.')\n const way = args[0]\n if (!state.aspect) return state.api.trouble(elem, `PRINT expects \"aspect\", like from WALK clicks.`)\n state.api.inspect(elem, 'aspect', state)\n if (!state.neighborhood) return state.api.trouble(elem, `PRINT expectes \"neighborhood\", like from NEIGHBORS.`)\n state.api.inspect(elem, 'neighborhood', state)\n const aspect = state.aspect\n const neighborhood = state.neighborhood\n console.log('print', { aspect, neighborhood })\n const print = []\n const tally = { missing: [], omitted: [], domains: [], forks: [], wishes: [], errors: [] }\n const explain = {}\n const count = (hits, what, slug) => {\n if (!(what in hits)) hits[what] = []\n hits[what].push(slug)\n }\n const report = (counter, heading) => {\n const hits = tally[counter]\n console.log('explain', counter, explain[counter])\n const hash = s => Math.abs(s.split('').reduce((h, c) => c.charCodeAt(0) + (h << 6) + (h << 16) - h, 0)).toString(16)\n const keys = Object.keys(hits).toSorted((a, b) => hits[b].length - hits[a].length)\n if (keys.length) {\n const details = []\n for (const what of keys) {\n const list = hits[what]\n .filter(uniq)\n .sort()\n .map(slug => `[[${slug}]]`)\n .join('\\n')\n details.push(`<details><summary>${what} \u00D7 ${hits[what].length}</summary>\n <pre>${list}</pre></details>`)\n }\n items.push({ type: 'markdown', text: `# ${heading}\\n${explain[counter] || ''}`, id: hash(heading) })\n if (keys[0].match(/\\.\\w+\\.\\w+$/)) items.push({ type: 'roster', text: keys.join('\\n') })\n items.push({ type: 'html', text: details.join('\\n ') })\n }\n }\n const timestamp = new Date().toString().replace(/ *\\(.*\\)/, '')\n const items = [\n { type: 'paragraph', text: `From ${timestamp}` },\n { type: 'solo', text: 'INCLUDED', aspects: aspect[0].result },\n ]\n\n print.push(`<h1>Story</h1>`)\n const clicks = aspect.find(each => each.source.match(/^WALK.*clicks/))\n if (!clicks) return state.api.trouble(elem, `PRINT needs aspect from WALK clicks`)\n const story = clicks.result.map(each => each.name)\n await output(story, 'story')\n\n print.push(`<h1>Garden</h1>`)\n const garden = clicks.result.map(each => each.graph.nodes.map(node => node.props)).flat()\n const uniq = (value, index, self) => self.indexOf(value) === index\n const slugs = garden\n .map(props => asSlug(props.name.replaceAll('\\n', ' ')))\n .filter(uniq)\n .filter(slug => !story.includes(slug))\n .sort()\n await output(slugs, 'garden')\n\n console.log({ tally, explain })\n report('domains', 'Sourced Sites')\n report('missing', 'Missing Pages')\n report('omitted', 'Omitted Links')\n report('forks', 'Omitted Forks')\n report('wishes', 'Unusual Plugins')\n report('errors', 'Program Errors')\n if (items.length) state.items = items\n\n state.api.status(elem, command, ` \u21D2 ${story.length} story, ${slugs.length} garden`)\n state.api.download(print.join('\\n'), `print-${way}.html`, 'text/html')\n\n async function output(slugs, section) {\n const style = `style=\"width:640px\"`\n const expand = text => {\n return text\n .replaceAll(/\\[\\[(.*?)\\]\\]/g, (m, p1) => `<a href=\"#${asSlug(p1)}\">${p1}</a>`)\n .replaceAll(/\\[.*? (.*?)\\]/g, (m, p1) => `<i>${p1}</i>`)\n }\n for (const slug of slugs) {\n const info = neighborhood.find(info => info.slug == slug)\n if (!info) {\n count(tally.missing, section, slug)\n explain.missing = `These pages weren't found in PRINT's neighborhood.`\n continue\n }\n count(tally.domains, info.domain, info.slug)\n explain.domains = `Pages have been retrieved from these sites. Remove sites from the PRINT neighborhood if these should be found elsewhere.`\n if (section == 'garden') {\n for (const link in info.links) if (!slugs.includes(link)) count(tally.omitted, slug, link)\n explain.omitted = `Garden pages with links to pages omitted from the garden. These may show up with a deeper WALK into the garden'`\n }\n if (way == 'outline')\n print.push(\n `<p id=\"${info.slug}\" ${style}\"><b title=\"${info.domain}\">${info.title}</b> -- ${expand(info.synopsis)}</p>`,\n )\n else {\n const where = slugs.indexOf(slug) + 1\n state.api.status(elem, command, ` \u21D2 ${where} of ${slugs.length} from ${section}`)\n try {\n console.log(info.domain, info.title)\n const page = await state.api.jfetch(`//${info.domain}/${info.slug}.json`)\n print.push(`<section id=\"${info.slug}\"><h3 title=\"${info.domain}\">${info.title}</h3>`)\n for (const item of page.story) {\n if (item.type != 'paragraph') count(tally.wishes, item.type, slug)\n explain.wishes =\n 'Items of type \"paragraph\" are expected. Types \"markdown\" and \"html\" may show without revision. The remainder appear as only a one-line note.'\n switch (item.type) {\n case 'paragraph':\n case 'markdown':\n print.push(`<p ${style}>${expand(item.text)}</p>`)\n break\n case 'html':\n print.push(`<p ${style}>${expand(state.api.closeTags(item.text))}</p>`)\n break\n default:\n print.push(`<p ${style}>Item type \"${item.type}\" omitted.</p>`)\n }\n }\n for (const action of page.journal) {\n if (action.site && !neighborhood.find(info => info.domain == action.site))\n count(tally.forks, action.site, slug)\n explain.forks =\n 'Wiki remembers where pages may once have lived but PRINT only looks for pages in the neighborhoods prvided.'\n }\n print.push(`</section>`)\n } catch (err) {\n count(tally.errors, err.message, info.slug)\n explain.errors =\n 'Any pages that lead to program errors should be explored by developers. Until then they will be ignored.'\n }\n }\n }\n }\n}\n\nasync function code_emit({ elem, command, args, state }) {\n const key = state.api.thisLineupKey(elem)\n const pageObject = state.api.lineupAtKey(key)\n const story = pageObject.getRawPage().story\n const codes = story.filter(item => item.type == 'code')\n if (!codes) return state.api.trouble(elem, `CODE expects the Code plugin in use on this page.`)\n const code = codes.map(item => item.text).join('\\n')\n const way = args.length ? args[0] : 'default'\n const api = {\n trouble(message) {\n state.api.trouble(elem, message)\n },\n response(text) {\n state.api.response(elem, text)\n },\n status(text) {\n state.api.status(elem, command, text)\n },\n report(text) {\n state.api.report(elem, command, text)\n },\n graph(nodes = [], rels = []) {\n return new Graph(nodes, rels)\n },\n }\n const handler = {\n get(target, prop) {\n if (prop == 'api') return api\n state.api.inspect(elem, prop, target)\n return target[prop]\n },\n }\n try {\n const module = await import(`data:text/javascript;base64,${btoa(code)}`)\n const proxy = new Proxy(state, handler)\n const result = await module[way].apply(proxy, args.slice(1))\n if (typeof result != 'undefined') state.api.status(elem, command, ` \u21D2 ${result}`)\n } catch (err) {\n let lines = code.split(/\\n/)\n let listing = lines.map((line, i) => `${i + 1} ${line}`).join('\\n')\n let message = err.message\n let ln = err.line ?? err.lineNumber\n let cn = err.columnNumber\n if (ln) {\n let line = lines[ln - 1]\n if (cn)\n message += `<span class=code>${line.substring(0, cn - 1)}<font color=red>x</font>${line.substring(cn - 1)}</span>`\n else message += `<span class=code>${line}</span>`\n }\n return state.api.trouble(elem, message)\n }\n}\n\nasync function download_emit({ elem, command, args, state }) {\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n const types = {\n txt: 'text/plain',\n html: 'text/html',\n csv: 'text/csv',\n tsv: 'text/tsv',\n json: 'application/json',\n }\n if (!args.length) return state.api.trouble(elem, `DOWNLOAD expects an argument, a file name to use when downloaded.`)\n const m = args[0].match(/^.+\\.(txt|html|csv|tsv|json)$/)\n console.log(m)\n if (!m) return state.api.trouble(elem, `DOWNLOAD expects a familiar suffix, one of txt, html, csv, tsv, or json.`)\n const [file, suffix] = m\n if (!(suffix in state)) return state.api.trouble(elem, `DOWNLOAD expects to find \"${suffix}\" in state.`)\n const string = suffix == 'json' ? JSON.stringify(state.json) : state[suffix]\n state.api.status(elem, command, ` \u21D2 ${string.length} bytes`)\n state.api.download(string, file, types[suffix])\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 PRINT: { emit: print_emit },\n CODE: { emit: code_emit },\n DOWNLOAD: { emit: download_emit },\n}\n", "import { blocks, trouble, inspect, run } from './blocks.js'\n\nfunction expand(text) {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\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) html.push(`<div></div><span id=${key} class=block >${expand(part.command)}</span>`)\n else html.push(`<div id=${key} class=body>${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, blocks } 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, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\n// P L U G I N\n\nfunction emit($item, item) {\n if (!$(\"link[href='/plugins/mech/mech.css']\").length) {\n $('<link rel=\"stylesheet\" href=\"/plugins/mech/mech.css\" type=\"text/css\">').appendTo('head')\n }\n\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 blocks: Object.keys(blocks),\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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",
|
|
4
|
+
"sourcesContent": ["export function parse(text, log = () => {}) {\n const r = {},\n x = {} // rules defined and traced\n let left = '',\n right = text // text parsed and pending\n let branch = [] // abstract syntax tree in progress\n const tree = [branch]\n\n // Non-Terminal Symbols\n\n r.match = () => x.sp() && x.term('match') && x.node() && x.chain() && x.eot()\n r.node = () => x.ch('(') && x.elem() && x.ch(')')\n r.chain = () => any(() => x.rel() && x.node() && x.chain())\n r.rel = () =>\n one(\n () => x.in(),\n () => x.out(),\n () => x.both(),\n )\n r.in = () => x.term('<-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.ch('-')\n r.out = () => x.ch('-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.term('->')\n r.both = () => x.ch('-') && opt(() => x.ch('[') && x.elem() && x.ch(']')) && x.ch('-')\n r.elem = () => opt(() => x.bind()) && opt(() => x.ch(':') && x.type()) && opt(() => x.prop())\n r.prop = () => x.ch('{') && x.word() && x.ch(':') && x.expr() && x.ch('}')\n r.expr = () => x.strn()\n r.bind = () => x.word()\n r.type = () => x.word()\n\n // Terminal Symbols\n\n r.word = () => match(/^[A-Za-z][A-Za-z0-9_]*/) && x.sp()\n r.term = want => right.startsWith(want) && accept(want.length) && keep(want) && x.sp()\n r.strn = () => x.ch('\"') && match(/^[^\"]{0,20}/) && x.ch('\"') && x.sp()\n r.ch = char => right.startsWith(char) && accept(1) && keep(char) && x.sp()\n r.sp = () => match(/^\\s*/)\n r.eot = () => !right.length\n\n // Parse Instrumentation\n\n for (const op in r) {\n x[op] = (...args) => {\n log(`${left}%c${op}%c${right}`, 'color:red', 'color:black')\n const here = branch\n branch = [op]\n const success = r[op](...args)\n if (success) here.push(branch)\n branch = here\n return success\n }\n }\n\n // Parser State Updates\n\n function match(regex) {\n const m = right.match(regex)\n m && accept(m[0].length) && keep(m[0])\n return !!m\n }\n\n function keep(text) {\n branch.push(text)\n return true\n }\n\n function accept(n) {\n left += right.substring(0, n)\n right = right.substring(n)\n return true\n }\n\n // Backtracking Operators\n\n function any(rule) {\n // rule zero or more times\n const save = [left, right]\n if (rule()) {\n any(rule)\n } else {\n ;[left, right] = save\n }\n return true\n }\n\n function opt(rule) {\n // rule zero or one times\n const save = [left, right]\n if (!rule()) {\n ;[left, right] = save\n }\n return true\n }\n\n function one(...rules) {\n // first rule of many\n const save = [left, right]\n for (const rule of rules) {\n if (rule()) {\n return true\n }\n ;[left, right] = save\n }\n false\n }\n\n x.match()\n return tree\n}\n\nexport function gen(level, tree, code, log = () => {}) {\n const tab = () => ' |'.repeat(level)\n switch (tree[0]) {\n case 'sp':\n case 'ch':\n case 'term':\n break\n case 'bind':\n case 'type':\n log(tab(), tree[0], `\"${tree[1][1]}\"`)\n code[tree[0]] = tree[1][1]\n break\n case 'prop':\n log(tab(), tree[0], `\"${tree[2][1]}\"`, tree[4][1][2])\n code[tree[0]] = [tree[2][1], tree[4][1][2]]\n break\n case 'node':\n case 'rel':\n case 'chain':\n log(tab(), tree[0])\n {\n const sub = {}\n code[tree[0]] = sub\n for (const branch of tree.slice(1)) gen(level + 1, branch, sub, log)\n }\n break\n case 'in':\n case 'out':\n case 'both':\n log(tab(), tree[0])\n code['dir'] = tree[0]\n for (const branch of tree.slice(1)) gen(level + 1, branch, code, log)\n break\n case 'match':\n case 'elem':\n log(tab(), tree[0])\n for (const branch of tree.slice(1)) gen(level + 1, branch, code, log)\n break\n case 'eot':\n log(tab(), 'end')\n break\n default:\n log(tab(), 'unknown', tree[0])\n }\n return code\n}\n\nexport function check(tally, code, errors) {\n if (code?.node?.type && errors) {\n if (!tally.nodes[code.node.type]) {\n errors.push(`No node of type \"${code.node.type}\" in the graph.`)\n }\n }\n if (code?.rel?.type && errors) {\n if (!tally.rels[code.rel.type]) {\n errors.push(`No relation of type \"${code.rel.type}\" in the graph.`)\n }\n }\n if (Object.keys(code.chain).length) {\n check(tally, code.chain, errors)\n }\n}\n\nexport function apply(graph, code) {\n const nodes = graph.nodes\n const rels = graph.rels\n const results = []\n for (const node of nodes) {\n chain(node, code, {})\n }\n return results\n\n function chain(node, code, maybe) {\n if (\n (!code.node.type || node.type == code.node.type) &&\n (!code.node.prop || node.props[code.node.prop[0]] == code.node.prop[1])\n ) {\n if (code.node.bind) maybe[code.node.bind] = node\n if (code.chain.rel) {\n if (['in', 'both'].includes(code.chain.rel.dir)) links(node.in, 'from')\n if (['out', 'both'].includes(code.chain.rel.dir)) links(node.out, 'to')\n } else {\n results.push(maybe)\n }\n }\n\n function links(rids, dir) {\n rids.forEach(rid => {\n if (\n (!code.chain.rel.type || rels[rid].type == code.chain.rel.type) &&\n (!code.chain.rel.prop || rels[rid].props[code.chain.rel.prop[0]] == code.chain.rel.prop[1])\n ) {\n maybe = { ...maybe }\n if (code.chain.rel.bind) maybe[code.chain.rel.bind] = rels[rid]\n chain(nodes[rels[rid][dir]], code.chain, maybe)\n }\n })\n }\n }\n}\n", "'use strict'\n\nimport * as cypher from './cypher.js'\n\nconst uniq = (value, index, self) => self.indexOf(value) === index\n\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 if (from == null || to == null) return null\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 tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { nodes: tally(this.nodes), rels: tally(this.rels) }\n }\n\n size() {\n return this.nodes.length + this.rels.length\n }\n\n static load(obj) {\n // let obj = await fetch(url).then(res => res.json())\n return new Graph(obj.nodes, obj.rels)\n }\n\n static async fetch(url) {\n const obj = await fetch(url).then(res => res.json())\n return Graph.load(obj)\n }\n\n static async read(path) {\n const json = await Deno.readTextFile(path)\n const obj = JSON.parse(json)\n return Graph.load(obj)\n }\n\n // static async import(path) {\n // let module = await import(path, {assert: {type: \"json\"}})\n // return Graph.load(module.default)\n // }\n\n copy(nid, output) {\n const doing = {}\n const done = []\n\n const nodecopy = nid => {\n if (nid in doing) return\n done.push(nid)\n const node = this.nodes[nid]\n doing[nid] = output.addNode(node.type, node.props)\n for (const rid of node.out) nodecopy(this.rels[rid].to)\n for (const rid of node.in) nodecopy(this.rels[rid].from)\n for (const rid of node.out) output.addRel('', doing[nid], doing[this.rels[rid].to], {})\n }\n\n nodecopy(nid)\n return done\n }\n\n clusters() {\n const result = []\n const todo = [...this.nodes.keys()]\n const doit = nid => {\n const graph = new Graph()\n const done = this.copy(nid, graph)\n for (const nid of done) {\n const index = todo.indexOf(nid)\n todo.splice(index, 1)\n }\n return graph\n }\n while (todo.length) {\n result.push(doit(todo[0]))\n }\n return result\n }\n\n n(type = null, props = {}) {\n let nids = Object.keys(this.nodes).map(key => +key)\n if (type) nids = nids.filter(nid => this.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.nodes[nid].props[key] == props[key])\n return new Nodes(this, nids)\n }\n\n /**\n * Converts a graph to a JavaScript Object Notation (JSON) string using JSON.stringify.\n @param - replacer A function that transforms the results.\n @param - space Adds indentation, white space, and line break characters to the return-\n * @returns {string} JSON string containing serialized graph\n */\n stringify(...args) {\n const obj = { nodes: this.nodes, rels: this.rels }\n return JSON.stringify(obj, ...args)\n }\n\n search(query, opt = {}) {\n const tree = cypher.parse(query)\n // console.dir(tree, {depth:15})\n const code = cypher.gen(0, tree[0][0], {})\n // console.log(code)\n cypher.check(this.tally(), code, opt.errors)\n return cypher.apply(this, code)\n }\n}\n\n// Fluent Interface (deprecated?)\n\nexport class Nodes {\n constructor(graph, nids) {\n // console.log('Nodes',{graph:graph.size(),type,nids})\n this.graph = graph\n this.nids = nids\n }\n\n // n(type=null, props={}) {\n // // console.log('Nodes.n',{type,props})\n // let nids = this.nids\n // if (type) nids = nids.filter(nid => this.nodes[nid].type == type)\n // for (let key in props) nids = nids.filter(nid => this.nodes[nid].props[key] == props[key])\n // return new Nodes(this.graph, type, nids)\n // }\n\n i(type = null, props = {}) {\n // console.log('Nodes.i',{type,props})\n let rids = this.nids\n .map(nid => this.graph.nodes[nid].in)\n .flat()\n .filter(uniq)\n if (type) rids = rids.filter(rid => this.graph.rels[rid].type == type)\n for (const key in props) rids = rids.filter(rid => this.graph.rels[rid].props[key] == props[key])\n return new Rels(this.graph, rids)\n }\n\n o(type = null, props = {}) {\n // console.log('Nodes.o',{type,props})\n let rids = this.nids\n .map(nid => this.graph.nodes[nid].out)\n .flat()\n .filter(uniq)\n if (type) rids = rids.filter(rid => this.graph.rels[rid].type == type)\n for (const key in props) rids = rids.filter(rid => this.graph.rels[rid].props[key] == props[key])\n return new Rels(this.graph, rids)\n }\n\n props(key = 'name') {\n // console.log('Nodes.p',{key})\n return this.nids\n .map(nid => this.graph.nodes[nid].props[key])\n .filter(uniq)\n .sort()\n }\n\n types() {\n return this.nids\n .map(nid => this.graph.nodes[nid].type)\n .filter(uniq)\n .sort()\n }\n\n tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { nodes: tally(this.nids.map(nid => this.graph.nodes[nid])) }\n }\n\n size() {\n return this.nids.length\n }\n\n filter(f) {\n const nodes = this.graph.nodes\n const nids = this.nids.filter(nid => {\n const node = nodes[nid]\n return f(node.type, node.props)\n })\n return new Nodes(this.graph, nids)\n }\n\n map(f) {\n const nodes = this.graph.nodes\n const result = this.nids.map(nid => {\n const node = nodes[nid]\n return f(node)\n })\n return result\n }\n}\n\nexport class Rels {\n constructor(graph, rids) {\n // console.log('Rels',{graph:graph.size(),type,rids})\n this.graph = graph\n this.rids = rids\n }\n\n f(type = null, props = {}) {\n // console.log('Rels.f',{type,props})\n let nids = this.rids.map(rid => this.graph.rels[rid].from).filter(uniq)\n if (type) nids = nids.filter(nid => this.graph.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.graph.nodes[nid].props[key] == props[key])\n return new Nodes(this.graph, nids)\n }\n\n t(type = null, props = {}) {\n // console.log('Rels.t',{type,props})\n let nids = this.rids.map(rid => this.graph.rels[rid].to).filter(uniq)\n if (type) nids = nids.filter(nid => this.graph.nodes[nid].type == type)\n for (const key in props) nids = nids.filter(nid => this.graph.nodes[nid].props[key] == props[key])\n return new Nodes(this.graph, nids)\n }\n\n props(key = 'name') {\n // console.log('Rels.p',{key})\n return this.rids\n .map(rid => this.graph.rels[rid].props[key])\n .filter(uniq)\n .sort()\n }\n\n types() {\n return this.rids\n .map(rid => this.graph.rels[rid].type)\n .filter(uniq)\n .sort()\n }\n\n tally() {\n const tally = list =>\n list.reduce((s, e) => {\n s[e.type] = s[e.type] ? s[e.type] + 1 : 1\n return s\n }, {})\n return { rels: tally(this.rids.map(nid => this.graph.rels[nid])) }\n }\n\n size() {\n return this.rids.length\n }\n\n filter(f) {\n const rels = this.graph.rels\n const rids = this.rids.filter(rid => {\n const rel = rels[rid]\n return f(rel.type, rel.props)\n })\n return new Rels(this.graph, rids)\n }\n\n map(f) {\n const rels = this.graph.rels\n const result = this.rids.map(rid => {\n const rel = rels[rid]\n return f(rel)\n })\n return result\n }\n}\n", "import { uniq, delay, asSlug } from './mech.js'\nimport { Graph } from './graph/graph.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 case 'clicks':\n return clicks(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 pageObjects = scope.lineup()\n console.log('library lineup', { scope, pageObjects })\n for (const pageObject of pageObjects) {\n const slug = pageObject.getSlug()\n const site = pageObject.getRemoteSite(scope.host())\n const info = find(slug, site)\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('library references', { items })\n for (const item of items) {\n const { title, site, slug } = item\n const info = find(slug, site)\n if (info) aspects.push({ name: title, graph: blanket(info) })\n }\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.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 }\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\n .slice(0)\n .sort((a, b) => when(b) - when(a))\n .filter(a => when(a) >= from && when(a) <= until)[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().map((graph, i) => ({ name: topic(graph), graph }))\n }\n }\n\n function clicks(count = 1) {\n const node = (graph, info, props = {}) => {\n return graph.addUniqNode(\n '',\n Object.assign(\n {\n name: info.title.replaceAll(/ /g, '\\n'),\n title: info.title,\n site: info.domain,\n date: info.date,\n },\n props,\n ),\n )\n }\n\n const aspects = []\n const items = scope.page().story\n const story = items.filter(item => item.type == 'reference').map(item => item.slug)\n // const infos = neighborhood.filter(info => info.slug == slug)\n // for (const info of infos) {\n // story = new Set(Object.keys(info.links))\n // console.log('story', story.keys())\n for (const slug of story) {\n const here = neighborhood.find(info => info.slug == slug)\n const graph = new Graph()\n if (here) {\n const nid = node(graph, here, { color: 'lightblue' })\n more(graph, count, nid, here)\n } else graph.addNode('', { name: slug.replaceAll(/-/g, '\\n'), color: 'white' })\n aspects.push({ name: slug, graph })\n }\n // }\n return aspects\n\n function more(graph, num, nid, info) {\n if (num < 1) return\n for (const slug in info.links) {\n if (story.includes(slug)) return\n const here = neighborhood.find(info => info.slug == slug)\n if (here) {\n const nnid = node(graph, here)\n graph.addRel('', nid, nnid, {})\n more(graph, num - 1, nnid, here)\n } else {\n const nnid = graph.addUniqNode('', { name: slug.replaceAll(/-/g, '\\n'), color: 'white' })\n graph.addRel('', nid, nnid, {})\n }\n }\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 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 { Graph } from './graph/graph.js'\n\n// https://github.com/nrn/universal-ticker\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 lineupAtKey,\n thisLineupKey,\n lineupPages,\n host,\n download,\n closeTags,\n reset,\n report,\n}\n\nexport function trouble(elem, message) {\n if (elem.innerText.match(/\u2716\uFE0E/)) return\n elem.innerHTML += `<button class=trouble>\u2716\uFE0E</button>`\n elem.querySelector('button').addEventListener('click', event => {\n elem.outerHTML += `<span class=trouble>${message}</span>`\n })\n}\n\nexport function inspect(elem, key, state) {\n const div = elem.previousElementSibling\n if (state.debug) {\n elem['sample-' + key] = state[key] // proper lifetime and indirection\n let look = div.querySelector(`.look[data-key=\"${key}\"]`)\n if (!look) {\n look = document.createElement('div')\n look.classList.add('look')\n look.dataset.key = key\n look.innerHTML = `<font color=gray size=small>${key} \u21D2</font>`\n div.insertAdjacentElement('beforeend', look)\n look.querySelector('font').addEventListener('click', event => {\n let see = look.querySelector('.see')\n if (!see) {\n see = document.createElement('div')\n see.classList.add('see')\n look.insertAdjacentElement('beforeend', see)\n see.innerText = JSON.stringify(elem['sample-' + key]).substring(0, 400) + ' ...'\n } else {\n see.remove()\n }\n })\n }\n }\n}\n\nexport function response(elem, html) {\n elem.innerHTML += html\n}\n\nexport function button(elem, label, handler) {\n if (!elem.querySelector('button')) {\n response(elem, `<button class=button>${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 + `<span class=status>${text}</span>`\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 function lineupAtKey(key) {\n return wiki.lineup.atKey(key)\n}\n\nexport function thisLineupKey(elem) {\n return elem.closest('.page').dataset.key\n}\n\nexport function lineupPages(elem) {\n const items = [...document.querySelectorAll('.page')]\n const index = items.indexOf(elem.closest('.page'))\n const pages = items.slice(0, index)\n return pages.map(div => lineupAtKey(div.dataset.key))\n}\n\nexport function host() {\n location.host\n}\n\nexport function download(string, file, mime = 'text/json') {\n // const blob = new Blob([string], { type: mimeType }); // untested alternative?\n // const data = URL.createObjectURL(blob);\n var data = `data:${mime};charset=utf-8,` + encodeURIComponent(string)\n var anchor = document.createElement('a')\n anchor.setAttribute('href', data)\n anchor.setAttribute('download', file)\n document.body.appendChild(anchor) // required for firefox\n anchor.click()\n anchor.remove()\n}\n\nexport function closeTags(html) {\n const div = document.createElement('div')\n div.innerHTML = html\n return div.innerHTML\n}\n\nexport function reset(elem) {\n const div = elem.nextElementSibling\n div.querySelectorAll('div.look').forEach(e => (e.outerText = ''))\n div.querySelectorAll('.trouble').forEach(e => (e.outerText = ''))\n div.querySelectorAll('button.button').forEach(e => (e.outerText = ''))\n div.querySelectorAll('span.status').forEach(e => (e.outerText = ''))\n div.querySelectorAll('div.report').forEach(e => (e.outerText = ''))\n}\n\nexport function report(elem, command, html) {\n elem.innerHTML = command + html\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.api.reset(elem)\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 const keys = Object.keys(state).filter(key => !['context', 'api', 'debug'].includes(key))\n for (const key of keys) state.api.inspect(elem, key, state)\n state.api.response(elem, world)\n}\n\nasync function from_emit({ elem, command, args, body, state }) {\n if (!args[0]) return state.api.trouble(elem, `FROM expects site/slug as way to federated wiki page.`)\n if (!body?.length) return state.api.trouble(elem, `FROM expects indented blocks to follow.`)\n const url = args[0]\n state.api.status(elem, command, ' \u23F3')\n const page = await state.api.jfetch(`//${url}.json`)\n if (!page) return state.api.trouble(elem, `FROM could not fetch \"${url}\" `)\n state.page = page\n state.api.status(elem, command, ' \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, args, state }) {\n const key = args[0] || 'temperature'\n if (!(key in state)) return state.api.trouble(elem, `Expect \"${key}\" in state`)\n const value = state[key]\n const type = typeof value\n if (!['string', 'number'].includes(type))\n return state.api.trouble(elem, `Expect state.${key} to be a string or number`)\n state.api.inspect(elem, key, state)\n state.api.report(elem, command, `<div class=report>${value}</div>`)\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 { result } of state.aspect) {\n for (const { name, graph } of result) {\n if (state.debug) console.log({ 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, `\"items\" preview expects \"items\" state, like from \"KWIC\".`)\n state.api.inspect(elem, 'items', state)\n const beit = item => {\n switch (typeof item) {\n case 'object':\n if ('type' in item) return item\n else return beit(item.toString())\n case 'function':\n return beit(item())\n case 'string':\n if (item.charAt(0) == '<') return { type: 'html', text: item }\n if (item.match(/^https?:/i)) return { type: 'frame', text: item }\n default:\n return { type: 'paragraph', text: item.toString() }\n }\n }\n const items = state.items.map(beit)\n story.push(...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 if (args.length == 1) return state.api.showResult(elem, state.page)\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 let have = state.api.neighborhood(args[0])\n for (let i = 1; i < args.length; i++) have.push(...state.api.neighborhood(args[i]))\n have = have.filter((s, i) => s.length && !have.slice(0, i).find(e => e[0]?.domain == s[0]?.domain))\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()\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] =\n command.match(/\\b(\\d+)? *(steps|days|weeks|months|hubs|lineup|references|topics|clicks)\\b/) || []\n if (!way && command != 'WALK') return state.api.trouble(elem, `WALK can't understand rest of this block.`)\n const scope = {\n host() {\n return state.api.host()\n },\n lineup() {\n return state.api.lineupPages(elem)\n },\n references() {\n const key = state.api.thisLineupKey(elem)\n const pageObject = state.api.lineupAtKey(key)\n const story = pageObject.getRawPage().story\n // console.log('walk references', { key, pageObject, story })\n return story.filter(item => item.type == 'reference')\n },\n page() {\n if (!state.page) state.api.trouble(elem, 'WALK expects a page, like from FROM')\n state.api.inspect(elem, 'page', state)\n return state.page\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 })\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.api.reset(elem)\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 state.api.trouble(elem, `UNTIL expects an argument, a word to stop running.`)\n if (!state.tick) return state.api.trouble(elem, `UNTIL expects to indented below an iterator, like TICKS.`)\n if (!state.aspect) return state.api.trouble(elem, `UNTIL expects \"aspect\", like from WALK.`)\n inspect(elem, 'aspect', state)\n // elem.innerHTML = command + ` \u21D2 ${state.tick}`\n state.api.status(elem, 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 state.api.response(elem, ' 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 state.api.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 state.api.trouble(elem, `FILE expects an argument, the dot suffix for desired files.`)\n if (!body?.length) return state.api.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 state.api.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.api.status(elem, command, ` \u21D2 ${text.length} bytes`)\n const prop = {}\n prop[suffix] = text\n run(body, Object.assign(prop, 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 state.api.trouble(elem, `KWIK expects $K or $W in link prototype.`)\n if (!('tsv' in state)) return state.api.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 state.api.status(elem, 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 state.api.status(elem, 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 state.api.status(elem, command, ` \u21D2 ${state.info.title}`)\n } else {\n return state.api.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 state.api.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 state.api.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.api.status(elem, 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 state.api.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 state.api.status(elem, command, ` \u21D2 ${count} remain`)\n let clock = setInterval(() => {\n // if (--count > 0) elem.innerHTML = command + ` \u21D2 ${count} remain`\n if (--count > 0) state.api.status(elem, command, ` \u21D2 ${count} remain`)\n else {\n clearInterval(clock)\n // elem.innerHTML = command +\n state.api.status(elem, 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 state.api.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 state.api.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 state.api.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 +\n state.api.status(elem, 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 state.api.trouble(elem, `RUN received error \"${result.err}\"`)\n } catch (err) {\n return state.api.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 ('status' in arg) state.api.status(elem, arg.command, ` \u21D2 ${arg.status}`)\n if ('trouble' in arg) state.api.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 state.api.status(elem, 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 state.api.trouble(elem, `DELTA expects argument, \"have\" or \"apply\" on client.`)\n if (body) return state.api.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 state.api.status(elem, command, ` \u21D2 ${new Date(state.recent).toLocaleString()}`)\n break\n case 'apply':\n if (!('actions' in state)) return state.api.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 state.api.status(elem, command, ` \u21D2 \u2206 ${(((after - before) / before) * 100).toFixed(1)}%`)\n break\n default:\n state.api.trouble(elem, `DELTA doesn't know \"${args[0]}\".`)\n }\n}\n\nfunction roster_emit({ elem, command, state }) {\n if (!state.neighborhood) return state.api.trouble(elem, `ROSTER expected a neighborhood, like from NEIGHBORS.`)\n state.api.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 state.api.status(elem, command, ` \u21D2 ${sites.length} sites`)\n state.items = items\n}\n\nfunction lineup_emit({ elem, command, state }) {\n const items = state.api.lineupPages(elem).map(pageObject => {\n const page = pageObject.getRawPage()\n const site = pageObject.getRemoteSite(state.api.host())\n const title = page.title || 'Empty'\n const slug = asSlug(title)\n const text = page.story[0]?.text || 'empty'\n return { type: 'reference', site, slug, title, text }\n })\n state.api.status(elem, command, ` \u21D2 ${items.length} pages`)\n state.items = items\n}\n\nfunction listen_emit({ elem, command, args, state }) {\n if (args.length < 1) return state.api.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 state.api.status(elem, command, ` \u21D2 ready`)\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 state.api.status(elem, 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 state.api.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 state.api.status(elem, command, ` \u21D2 sent`)\n}\n\nasync function solo_emit({ elem, command, state }) {\n if (!('aspect' in state)) return state.api.trouble(elem, `\"SOLO\" expects \"aspect\" state, like from \"WALK\".`)\n inspect(elem, 'aspect', state)\n // elem.innerHTML = command\n state.api.status(elem, 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 state.api.status(elem, command, ` \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 expand = text => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n const html = []\n switch (args[0]) {\n case 'state':\n for (const key in state) {\n let value = state[key]\n if (value == null) continue\n if (typeof value != 'string') value = JSON.stringify(state[key], null, 2)\n html.push(\n `<details>\n <summary>${key}</summary>\n <pre style=\"white-space: pre-wrap;\">${expand(value)}</pre>\n </details>`,\n )\n }\n break\n case 'images':\n if (!state.commons)\n return state.api.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 }\n break\n default:\n return state.api.trouble(elem, `POPUP doesn't know \"${args[0]}\".`)\n }\n wiki.dialog(elem.innerText, html.join('\\n'))\n}\n\nasync function print_emit({ elem, command, args, state }) {\n if (!['outline', 'draft'].includes(args[0])) return state.api.trouble(elem, 'Expects PRINT outline or PRINT draft.')\n const way = args[0]\n if (!state.aspect) return state.api.trouble(elem, `PRINT expects \"aspect\", like from WALK clicks.`)\n state.api.inspect(elem, 'aspect', state)\n if (!state.neighborhood) return state.api.trouble(elem, `PRINT expectes \"neighborhood\", like from NEIGHBORS.`)\n state.api.inspect(elem, 'neighborhood', state)\n const aspect = state.aspect\n const neighborhood = state.neighborhood\n console.log('print', { aspect, neighborhood })\n const print = []\n const tally = { missing: [], omitted: [], domains: [], forks: [], wishes: [], errors: [] }\n const explain = {}\n const count = (hits, what, slug) => {\n if (!(what in hits)) hits[what] = []\n hits[what].push(slug)\n }\n const report = (counter, heading) => {\n const hits = tally[counter]\n console.log('explain', counter, explain[counter])\n const hash = s => Math.abs(s.split('').reduce((h, c) => c.charCodeAt(0) + (h << 6) + (h << 16) - h, 0)).toString(16)\n const keys = Object.keys(hits).toSorted((a, b) => hits[b].length - hits[a].length)\n if (keys.length) {\n const details = []\n for (const what of keys) {\n const list = hits[what]\n .filter(uniq)\n .sort()\n .map(slug => `[[${slug}]]`)\n .join('\\n')\n details.push(`<details><summary>${what} \u00D7 ${hits[what].length}</summary>\n <pre>${list}</pre></details>`)\n }\n items.push({ type: 'markdown', text: `# ${heading}\\n${explain[counter] || ''}`, id: hash(heading) })\n if (keys[0].match(/\\.\\w+\\.\\w+$/)) items.push({ type: 'roster', text: keys.join('\\n') })\n items.push({ type: 'html', text: details.join('\\n ') })\n }\n }\n const timestamp = new Date().toString().replace(/ *\\(.*\\)/, '')\n const items = [\n { type: 'paragraph', text: `From ${timestamp}` },\n { type: 'solo', text: 'INCLUDED', aspects: aspect[0].result },\n ]\n\n print.push(`<h1>Story</h1>`)\n const clicks = aspect.find(each => each.source.match(/^WALK.*clicks/))\n if (!clicks) return state.api.trouble(elem, `PRINT needs aspect from WALK clicks`)\n const story = clicks.result.map(each => each.name)\n await output(story, 'story')\n\n print.push(`<h1>Garden</h1>`)\n const garden = clicks.result.map(each => each.graph.nodes.map(node => node.props)).flat()\n const uniq = (value, index, self) => self.indexOf(value) === index\n const slugs = garden\n .map(props => asSlug(props.name.replaceAll('\\n', ' ')))\n .filter(uniq)\n .filter(slug => !story.includes(slug))\n .sort()\n await output(slugs, 'garden')\n\n console.log({ tally, explain })\n report('domains', 'Sourced Sites')\n report('missing', 'Missing Pages')\n report('omitted', 'Omitted Links')\n report('forks', 'Omitted Forks')\n report('wishes', 'Unusual Plugins')\n report('errors', 'Program Errors')\n if (items.length) state.items = items\n\n state.api.status(elem, command, ` \u21D2 ${story.length} story, ${slugs.length} garden`)\n state.api.download(print.join('\\n'), `print-${way}.html`, 'text/html')\n\n async function output(slugs, section) {\n const style = `style=\"width:640px\"`\n const expand = text => {\n return text\n .replaceAll(/\\[\\[(.*?)\\]\\]/g, (m, p1) => `<a href=\"#${asSlug(p1)}\">${p1}</a>`)\n .replaceAll(/\\[.*? (.*?)\\]/g, (m, p1) => `<i>${p1}</i>`)\n }\n for (const slug of slugs) {\n const info = neighborhood.find(info => info.slug == slug)\n if (!info) {\n count(tally.missing, section, slug)\n explain.missing = `These pages weren't found in PRINT's neighborhood.`\n continue\n }\n count(tally.domains, info.domain, info.slug)\n explain.domains = `Pages have been retrieved from these sites. Remove sites from the PRINT neighborhood if these should be found elsewhere.`\n if (section == 'garden') {\n for (const link in info.links) if (!slugs.includes(link)) count(tally.omitted, slug, link)\n explain.omitted = `Garden pages with links to pages omitted from the garden. These may show up with a deeper WALK into the garden'`\n }\n if (way == 'outline')\n print.push(\n `<p id=\"${info.slug}\" ${style}\"><b title=\"${info.domain}\">${info.title}</b> -- ${expand(info.synopsis)}</p>`,\n )\n else {\n const where = slugs.indexOf(slug) + 1\n state.api.status(elem, command, ` \u21D2 ${where} of ${slugs.length} from ${section}`)\n try {\n console.log(info.domain, info.title)\n const page = await state.api.jfetch(`//${info.domain}/${info.slug}.json`)\n print.push(`<section id=\"${info.slug}\"><h3 title=\"${info.domain}\">${info.title}</h3>`)\n for (const item of page.story) {\n if (item.type != 'paragraph') count(tally.wishes, item.type, slug)\n explain.wishes =\n 'Items of type \"paragraph\" are expected. Types \"markdown\" and \"html\" may show without revision. The remainder appear as only a one-line note.'\n switch (item.type) {\n case 'paragraph':\n case 'markdown':\n print.push(`<p ${style}>${expand(item.text)}</p>`)\n break\n case 'html':\n print.push(`<p ${style}>${expand(state.api.closeTags(item.text))}</p>`)\n break\n default:\n print.push(`<p ${style}>Item type \"${item.type}\" omitted.</p>`)\n }\n }\n for (const action of page.journal) {\n if (action.site && !neighborhood.find(info => info.domain == action.site))\n count(tally.forks, action.site, slug)\n explain.forks =\n 'Wiki remembers where pages may once have lived but PRINT only looks for pages in the neighborhoods prvided.'\n }\n print.push(`</section>`)\n } catch (err) {\n count(tally.errors, err.message, info.slug)\n explain.errors =\n 'Any pages that lead to program errors should be explored by developers. Until then they will be ignored.'\n }\n }\n }\n }\n}\n\nasync function code_emit({ elem, command, args, state }) {\n const key = state.api.thisLineupKey(elem)\n const pageObject = state.api.lineupAtKey(key)\n const story = pageObject.getRawPage().story\n const codes = story.filter(item => item.type == 'code')\n if (!codes) return state.api.trouble(elem, `CODE expects the Code plugin in use on this page.`)\n const code = codes.map(item => item.text).join('\\n')\n const way = args.length ? args[0] : 'default'\n const api = {\n trouble(message) {\n state.api.trouble(elem, message)\n },\n response(text) {\n state.api.response(elem, text)\n },\n status(text) {\n state.api.status(elem, command, text)\n },\n report(text) {\n state.api.report(elem, command, text)\n },\n graph(nodes = [], rels = []) {\n return new Graph(nodes, rels)\n },\n }\n const handler = {\n get(target, prop) {\n if (prop == 'api') return api\n state.api.inspect(elem, prop, target)\n return target[prop]\n },\n }\n try {\n const module = await import(`data:text/javascript;base64,${btoa(code)}`)\n if (!(way in module)) return api.trouble(`Expected export of function \"${way}\".`)\n const proxy = new Proxy(state, handler)\n const result = await module[way].apply(proxy, args.slice(1))\n if (typeof result != 'undefined') state.api.status(elem, command, ` \u21D2 ${result}`)\n } catch (err) {\n let lines = code.split(/\\n/)\n let listing = lines.map((line, i) => `${i + 1} ${line}`).join('\\n')\n let message = err.message\n let ln = err.line ?? err.lineNumber\n let cn = err.columnNumber\n if (ln) {\n let line = lines[ln - 1]\n if (cn)\n message += `<span class=code>${line.substring(0, cn - 1)}<font color=red>\u2716\uFE0E</font>${line.substring(cn - 1)}</span>`\n else message += `<span class=code>${line}</span>`\n }\n return state.api.trouble(elem, message)\n }\n}\n\nasync function download_emit({ elem, command, args, state }) {\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n const types = {\n txt: 'text/plain',\n html: 'text/html',\n csv: 'text/csv',\n tsv: 'text/tsv',\n json: 'application/json',\n }\n if (!args.length) return state.api.trouble(elem, `DOWNLOAD expects an argument, a file name to use when downloaded.`)\n const m = args[0].match(/^.+\\.(txt|html|csv|tsv|json)$/)\n console.log(m)\n if (!m) return state.api.trouble(elem, `DOWNLOAD expects a familiar suffix, one of txt, html, csv, tsv, or json.`)\n const [file, suffix] = m\n if (!(suffix in state)) return state.api.trouble(elem, `DOWNLOAD expects to find \"${suffix}\" in state.`)\n const string = suffix == 'json' ? JSON.stringify(state.json) : state[suffix]\n state.api.status(elem, command, ` \u21D2 ${string.length} bytes`)\n state.api.download(string, file, types[suffix])\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 PRINT: { emit: print_emit },\n CODE: { emit: code_emit },\n DOWNLOAD: { emit: download_emit },\n}\n", "import { blocks, trouble, inspect, run } from './blocks.js'\n\nfunction expand(text) {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\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) html.push(`<div></div><span id=${key} class=block >${expand(part.command)}</span>`)\n else html.push(`<div id=${key} class=body>${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, blocks } 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, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\n// P L U G I N\n\nfunction emit($item, item) {\n if (!$(\"link[href='/plugins/mech/mech.css']\").length) {\n $('<link rel=\"stylesheet\" href=\"/plugins/mech/mech.css\" type=\"text/css\">').appendTo('head')\n }\n\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 blocks: Object.keys(blocks),\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
6
|
"names": ["parse", "text", "log", "r", "x", "left", "right", "branch", "tree", "any", "one", "opt", "match", "want", "accept", "keep", "char", "op", "args", "here", "success", "regex", "m", "n", "rule", "save", "rules", "gen", "level", "code", "tab", "sub", "check", "tally", "errors", "apply", "graph", "nodes", "rels", "results", "node", "chain", "maybe", "links", "rids", "dir", "rid", "uniq", "value", "index", "self", "Graph", "_Graph", "nodes", "rels", "type", "props", "obj", "nid", "node", "from", "to", "rid", "tally", "list", "s", "url", "res", "path", "json", "output", "doing", "done", "nodecopy", "result", "todo", "doit", "graph", "nids", "key", "Nodes", "args", "query", "opt", "tree", "parse", "code", "gen", "check", "apply", "_Nodes", "rids", "Rels", "f", "_Rels", "rel", "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", "clicks", "domain", "name", "done", "here", "there", "links", "start", "days", "interval", "dates", "aspects", "stop", "set", "author", "linked", "ignored", "hits", "hub", "pageObjects", "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", "story", "more", "num", "nnid", "kwic", "prefix", "lines", "quotes", "line", "quote", "current", "groups", "group", "key", "text", "word", "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", "r", "run", "minTickBuffer", "resolve", "api", "trouble", "inspect", "response", "button", "element", "jfetch", "status", "sourceData", "showResult", "neighborhood", "publishSourceData", "newSVG", "SVGline", "makeTicker", "lineupAtKey", "thisLineupKey", "lineupPages", "host", "download", "closeTags", "reset", "report", "elem", "message", "event", "key", "state", "div", "look", "see", "html", "label", "handler", "url", "res", "command", "text", "topic", "item", "sources", "requestSourceData", "result", "data", "page", "options", "want", "domain", "site", "info", "svg", "x1", "y1", "x2", "y2", "line", "set", "k", "v", "dot", "items", "index", "string", "file", "mime", "anchor", "e", "run", "nest", "scope", "code", "op", "args", "next", "body", "stuff", "blocks", "click_emit", "hello_emit", "world", "keys", "from_emit", "sensor_emit", "datalog", "device", "sensor", "fields", "f", "c", "avg", "a", "s", "value", "report_emit", "type", "source_emit", "count", "source", "counts", "id", "preview_emit", "round", "digits", "story", "types", "marker", "latlon", "uniq", "name", "graph", "dotify", "beit", "text2", "date", "neighbors_emit", "belem", "probe", "have", "i", "todos", "sitemap", "todo", "asSlug", "survey", "extra", "inf", "walk_emit", "way", "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", "suffix", "choices", "asset", "flag", "choice", "prop", "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", "pageObject", "title", "listen_emit", "recent", "listen", "evt", "thumb", "now", "message_emit", "solo_emit", "each", "sum", "pageKey", "doing", "soloListener", "delay", "popup", "popup_emit", "expand", "print_emit", "aspect", "print", "tally", "explain", "hits", "what", "counter", "heading", "hash", "h", "details", "list", "clicks", "output", "garden", "self", "slugs", "props", "section", "style", "m", "p1", "code_emit", "codes", "rels", "Graph", "module", "proxy", "listing", "ln", "cn", "download_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", "blocks", "api", "run", "bind"]
|
|
7
7
|
}
|