diff --git a/web/build.mjs b/web/build.mjs index 9b6f94c..13e9e30 100644 --- a/web/build.mjs +++ b/web/build.mjs @@ -86,7 +86,7 @@ function buildPages(){ const push=(srcPath, url, extra)=>{ const {fm,body}=frontmatter(read(srcPath)); pages.push({ srcPath, url, body, title:fm.title||path.basename(srcPath,".md"), - weight:parseInt(fm.weight)||999, ...extra }); + description:fm.description||"", weight:parseInt(fm.weight)||999, ...extra }); }; // docs/** for(const p of walk(path.join(CONTENT,"docs"))){ @@ -155,10 +155,10 @@ function link(pg,active,cls){ } // ---------- template ---------- -function shell({title, navHtml, bodyHtml, breadcrumb, wide, headExtra="", scripts="", contentClass="prose"}){ +function shell({title, description, navHtml, bodyHtml, breadcrumb, wide, headExtra="", scripts="", contentClass="prose"}){ return ` -${esc(title)} · Http11Probe +${esc(title)} · Http11Probe${description?`\n`:""} ${headExtra} @@ -204,7 +204,7 @@ function breadcrumbFor(pg){ } // ---------- landing (matrix) ---------- -function landing(navHtml){ +function landing(navHtml, description){ const body=`

HTTP/1.1 behaviour, measured

Every framework, every probe, one grid. Green passes, amber warns (the RFC permits either), red fails. @@ -222,7 +222,7 @@ function landing(navHtml){

`; - return shell({ title:"Results", navHtml, bodyHtml:body, wide:true, contentClass:"matrix-page", + return shell({ title:"Results", description, navHtml, bodyHtml:body, wide:true, contentClass:"matrix-page", scripts:`\n\n\n\n\n` }); } @@ -251,7 +251,8 @@ function entropyPage(navHtml){
`; - return shell({ title:"Entropy", navHtml, bodyHtml:body, wide:true, contentClass:"matrix-page", + return shell({ title:"Entropy", description:"Which HTTP/1.1 MUST-level compliance, smuggling, and malformed-input tests frameworks disagree on most, ranked by Shannon entropy of verdicts across servers.", + navHtml, bodyHtml:body, wide:true, contentClass:"matrix-page", scripts:`\n\n\n\n\n\n` }); } @@ -290,12 +291,14 @@ function main(){ const out=path.join(DIST, outRel.replace(/^\//,"")); ensure(out); const nav=buildNav(pages, pg.url); - const html=shell({ title:pg.forceTitle||pg.title, navHtml:nav, bodyHtml:renderMarkdown(pg), + const html=shell({ title:pg.forceTitle||pg.title, description:pg.description, navHtml:nav, bodyHtml:renderMarkdown(pg), breadcrumb:breadcrumbFor(pg), wide:pg.url==="/docs/rfc-requirement-dashboard.html" }); fs.writeFileSync(out, html); } // landing + entropy study - fs.writeFileSync(path.join(DIST,"index.html"), landing(buildNav(pages,"/"))); + const homeIdx=path.join(CONTENT,"_index.md"); + const homeDescription=exists(homeIdx)?frontmatter(read(homeIdx)).fm.description||"":""; + fs.writeFileSync(path.join(DIST,"index.html"), landing(buildNav(pages,"/"), homeDescription)); fs.writeFileSync(path.join(DIST,"entropy.html"), entropyPage(buildNav(pages,"/entropy.html"))); // search index