X-Git-Url: https://dreyeck.freedombox.rocks/gitweb/idiomatic.git/blobdiff_plain/f0a44e8482fdfa29b5a32d6a407509efe9984e3c..da0744c9c33ae9440765aecde2faf00f7187032f:/index.js?ds=inline diff --git a/index.js b/index.js index 020a168..76c9158 100644 --- a/index.js +++ b/index.js @@ -22,21 +22,22 @@ async function load(file) { // P A G E S -const style = title => ` +const style = (title,here='') => ` - — ${title} —` +
— ${title}  ${escape(here)}  —
` const app = express() app.get('/index', async (req,res,next) => { console.log(new Date().toLocaleTimeString(), 'index') const reductions = counter() const doit = branch => {reductions.count(branch.type)} - visitor.wander(mods,doit) + visitor.walk(mods,doit) const result = `

${reductions.size()} non-terminals
${reductions.total()} reductions @@ -58,43 +59,49 @@ app.get('/terminal', (req,res) => { const {type,field} = req.query const lits = counter() const doit = branch => {if(branch.type==type) lits.count(branch[field])} - visitor.wander(mods,doit) - const result = style('terminal')+` + visitor.walk(mods,doit) + const result = style('terminal',type)+`

${lits.size()} uniques
${lits.total()} total

${lits.tally() - .map(([k,v]) => `
${v}${escape(k)}`) + .map(([k,v]) => `
${v}${escape(k)}`) .join("\n")}
` res.send(result) }) app.get('/usage', (req,res) => { - const {type,field,key,up,see} = req.query + const {type,field,key,width,depth} = req.query const list = [] const files = counter() const doit = (branch,stack) => { if(branch.type==type && branch[field]==key)list.push(` - + ${stack.at(-1)} - ${sxpr(stack[up ?? 2], see ?? 3)}`) + ${sxpr(stack[width ?? 2], depth ?? 3)}`) } - visitor.wander(mods,doit) - const vis = row => row.split(/\n/)[3].trim().replaceAll(/<.*?>/g,'').replaceAll(/\.\.+/g,'..') + visitor.walk(mods,doit) list.sort((a,b) => vis(a)>vis(b) ? 1 : -1) - res.send(style('usage')+` -

${files.tally().map(([k,v]) => `
${v}${k}`).join("\n")}
+ const q = (id,delta) => Object.entries(req.query) + .map(([k,v]) => k == id ? `${k}=${+v+delta}` : `${k}=${v}`) + .join('&') + const p = id => ` + ` + const m = id => ` − ` + const d = id => `${id} ${p(id)} ${m(id)}` + res.send(style('usage',key)+` +

${files.total()} uses in ${files.size()} files + ${files.tally().map(([k,v]) => `
${v}${k}`).join("\n")}
+

— ${d('width')} ${d('depth')} —

${list.join("\n")}
`) }) app.get('/nesting', (req,res) => { - const {file,type,start,end} = req.query + const {file,type,key,start,end} = req.query const result = [] const doit = (branch,stack) => { if(stack.at(-1)==file && branch.type==type && branch.start==start && branch.end==end) { - const file = stack.at(-1) const path = stack.slice(0,-1).map((n,i) => ` - ${n.type}: + ${n.type}: ${sxpr(n,3,null,stack[i-1])}`).reverse() const hit = stack[1] result.push(` @@ -102,8 +109,28 @@ app.get('/nesting', (req,res) => {

${escape(JSON.stringify(hit,omit,2))}
`) } } - visitor.wander(mods,doit) - res.send(style('nesting')+`${result.join("
")}`) + visitor.walk(mods,doit) + res.send(style('nesting',key)+`${result.join("
")}`) +}) + +app.get('/similar', (req,res) => { + const {file,type,key,start,end,nest} = req.query + let nested + visitor.walk(mods,(branch,stack) => { + if(stack.at(-1)==file && branch.type==type && branch.start==start && branch.end==end) + nested = stack[nest] + }) + const norm = node => vis(`\n\n\n${sxpr(node,3,null)}`) + const source = (file,node) => mods.find(mod => mod.file == file).text.substring(+node.start,+node.end) + const want = norm(nested) + const result = [] + visitor.walk(mods,(branch,stack) => { + if(norm(branch) == want) result.push(`
${escape(source(stack.at(-1),branch))}

`) + }) + res.send(style('similar',key)+ + `

${want}


` + + result.join("\n") + ) }) @@ -177,4 +204,17 @@ function elipsis(obj) { return `(${dots})` } +function vis(row) { + return row.split(/\n/)[3].trim() + .replaceAll(/<.*?>/g,'') + .replaceAll(/\.\.+/g,'..') +} + + +function query(obj,adj={}) { + return Object.entries(obj) + .map(([k,v]) => k in adj ? `${k}=${adj[k](v)}` : `${k}=${v}`) + .join('&') +} + app.listen(1954) \ No newline at end of file