code wiki / (root) / nx_docpub_tree.nx

nx_docpub_tree.nx source

↩ module page · 112 lines · 8259 B

1// nx_docpub_tree.nx -- R1-scale-2: generate the documentation site for a WHOLE DIRECTORY of organs (not a 2// curated handful) by walking it struct-free via getdents64 -- the "Javadoc for the ecosystem" payoff. For each 3// <name>.nx it renders a REFERENCE page from source (shared nx_docgen_lib core: header + signatures + imports + 4// syntax-highlight + cross-links) and builds a section index. Demonstrated on runtime/wiki (the wiki engine 5// documenting itself); the dir is the one knob -> reusable for any subtree. JPL discipline: bounded loop, LOUD 6// on cap. Sovereign, zero third-party. license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_docgen_lib.nx" 9import "nx_docpub_render.nx" // dgw/dgn/dg_cat/dg_catn/dg_catb_esc/dg_rdfile/dg_writefile/dg_contains/ 10 // dg_first_doc_line/dg_render. nx_docgen_lib is legal-clause templating 11 // and never carried these -- verified unwritten, not deleted. 12 13func dgt_ends_nx(nm: *u8) -> i64 { 14 var n: i64 = 0; while nm[n] != (0 as u8) { n = n + 1 } 15 if n < 3 { return 0 } 16 if nm[n-3] == (46 as u8) { if nm[n-2] == (110 as u8) { if nm[n-1] == (120 as u8) { return 1 } } } 17 return 0 18} 19func dgt_base(nm: *u8, out: *u8) -> i64 { 20 var n: i64 = 0; while nm[n] != (0 as u8) { n = n + 1 } 21 var e: i64 = n 22 if n >= 3 { if nm[n-3] == (46 as u8) { if nm[n-2] == (110 as u8) { if nm[n-1] == (120 as u8) { e = n - 3 } } } } 23 var i: i64 = 0; while i < e { out[i] = nm[i]; i = i + 1 } out[e] = 0 as u8 24 return e 25} 26 27func main(argc: i64, argv: *i64) -> i64 { 28 dgw("=== NX-DOCPUB-TREE -- self-generate docs for a whole organ directory (getdents walk) ===\n" as *u8) 29 __syscall(83, "web_assets" as i64, 493, 0, 0, 0, 0) 30 __syscall(83, "web_assets/docgen" as i64, 493, 0, 0, 0, 0) 31 let cap: i64 = 1048576 32 33 // THE DIR IS THE ONE KNOB -- the header promised that and then hardcoded it, which broke the organ 34 // the moment build cwd and run cwd diverged (built from buildroot/, deployed to nishihost/, where 35 // `runtime/wiki` does not exist -> fd=-2). Taking it from argv keeps the promise AND makes the path 36 // the caller's to supply rather than an assumption baked at author time. 37 var dir: *u8 = "buildroot/runtime/wiki" as *u8 38 if argc >= 2 { dir = argv[1] as *u8 } 39 let dfd: i64 = sys_openat_rd(dir) 40 if dfd < 0 { dgw("FATAL: cannot open dir runtime/wiki (fd="); dgn(dfd); dgw(")\n"); sys_exit(2); return 2 } 41 let dirbuf: *u8 = sys_mmap(65536) 42 let src: *u8 = sys_mmap(cap) 43 let out: *u8 = sys_mmap(cap) 44 let cnt: *i64 = sys_mmap(16) as *i64 45 let idx: *u8 = sys_mmap(cap) 46 let base: *u8 = sys_mmap(256) 47 let srcp: *u8 = sys_mmap(512) 48 let outp: *u8 = sys_mmap(512) 49 50 var io: i64 = 0 51 io = dg_cat(idx, io, "<!doctype html><html lang=en><head><meta charset=utf-8><meta name=viewport content='width=device-width,initial-scale=1'><title>Nishi Wiki engine &mdash; reference</title><style>*{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;margin:0;color:#1a2330;background:#fbfcfe;line-height:1.55}header.top{background:#0b2545;color:#fff;padding:11px 24px;font-size:.92rem;font-weight:600}header.top a{color:#fff;text-decoration:none}main{max-width:880px;margin:0 auto;padding:30px 24px 70px}h1{font-size:1.9rem;margin:.1em 0;letter-spacing:-.015em}p.lead{color:#475468;font-size:1.06rem;margin:.3em 0 1.8em;max-width:660px}ul.cards{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(255px,1fr));gap:13px}ul.cards li{background:#fff;border:1px solid #e6ebf3;border-radius:8px;padding:13px 15px;transition:box-shadow .12s,border-color .12s}ul.cards li:hover{border-color:#2a6fb0;box-shadow:0 3px 12px rgba(11,37,69,.09)}ul.cards a{color:#0b2545;text-decoration:none;font-weight:600;font-size:1rem}ul.cards a:hover{color:#2a6fb0}ul.cards .meta{color:#8493a8;font-size:.78rem;margin:3px 0 0}ul.cards .desc{color:#46566b;font-size:.85rem;margin:7px 0 0;line-height:1.45}@media(max-width:600px){main{padding:20px 16px 50px}h1{font-size:1.5rem}}</style></head><body>" as *u8) 52 io = dg_cat(idx, io, "<header class=top><a href=index.html>&#9776; Nishi Docs</a> <span>/ Wiki engine</span></header><main>" as *u8) 53 io = dg_cat(idx, io, "<h1>Wiki engine reference</h1><p class=lead>One page per organ in <code>runtime/wiki</code>, auto-generated from source by nx_docgen_lib &mdash; sovereign, via a getdents directory walk.</p><ul class=cards>" as *u8) 54 55 var pages: i64 = 0 56 var found: i64 = 0 57 var done: i64 = 0 58 while done == 0 { 59 let nb: i64 = sys_getdents64(dfd, dirbuf, 65536) 60 if nb <= 0 { done = 1 } 61 else { 62 var off: i64 = 0 63 while off < nb { 64 let rec: *u8 = (dirbuf as i64 + off) as *u8 65 let rl: i64 = dirent_reclen(rec) 66 if rl <= 0 { off = nb } 67 else { 68 let nm: *u8 = dirent_name(rec) 69 if dgt_ends_nx(nm) == 1 { 70 found = found + 1 71 var sp: i64 = 0 72 sp = dg_cat(srcp, sp, dir); srcp[sp] = 47 as u8; sp = sp + 1; sp = dg_cat(srcp, sp, nm); srcp[sp] = 0 as u8 73 dgt_base(nm, base) 74 let sn: i64 = dg_rdfile(srcp, src, cap) 75 if sn > 0 { 76 let olen: i64 = dg_render(src, sn, base, out, cnt) 77 var op: i64 = 0 78 op = dg_cat(outp, op, "web_assets/docgen/" as *u8); op = dg_cat(outp, op, base); op = dg_cat(outp, op, ".html" as *u8); outp[op] = 0 as u8 79 dg_writefile(outp, out, olen) 80 let tg2: *u8 = sys_mmap(2048); let tl2: i64 = dg_first_doc_line(src, sn, tg2) 81 io = dg_cat(idx, io, "<li><a href=" as *u8); io = dg_cat(idx, io, base); io = dg_cat(idx, io, ".html>" as *u8); io = dg_cat(idx, io, base); io = dg_cat(idx, io, "</a><div class=meta>" as *u8); io = dg_catn(idx, io, cnt[0]); io = dg_cat(idx, io, " funcs</div>" as *u8) 82 if tl2 > 0 { io = dg_cat(idx, io, "<p class=desc>" as *u8); io = dg_catb_esc(idx, io, tg2, 0, tl2); io = dg_cat(idx, io, "</p>" as *u8) } 83 io = dg_cat(idx, io, "</li>" as *u8) 84 pages = pages + 1 85 } 86 } 87 if found > 5000 { off = nb; done = 1 } 88 off = off + rl 89 } 90 } 91 } 92 } 93 sys_close(dfd) 94 io = dg_cat(idx, io, "</ul></main></body></html>" as *u8) 95 dg_writefile("web_assets/docgen/wiki_index.html" as *u8, idx, io) 96 dgw(" dir="); dgw(dir); dgw(" .nx found="); dgn(found); dgw(" pages generated="); dgn(pages); dgw(" index bytes="); dgn(io); dgw("\n") 97 dgw(" artifact: web_assets/docgen/wiki_index.html\n" as *u8) 98 99 let pass: *i64 = sys_mmap(16) as *i64; pass[0] = 0 100 let t1: i64 = (pages > 0) as i64 101 if t1 == 1 { dgw(" T1 walked the dir + generated organ pages: PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dgw(" T1 generated organ pages: FAIL\n" as *u8) } 102 let t2: i64 = (found == pages) as i64 103 if t2 == 1 { dgw(" T2 every .nx organ rendered (no silent drop): PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dgw(" T2 found != pages (a drop): FAIL\n" as *u8) } 104 let chk: *u8 = sys_mmap(cap) 105 let cn: i64 = dg_rdfile("web_assets/docgen/nx_wiki_status.html" as *u8, chk, cap) 106 let t3: i64 = ((cn > 0) as i64) & (dg_contains(chk, cn, "<div class=fn " as *u8)) & (1 - dg_contains(chk, cn, "<script" as *u8)) & (dg_contains(idx, io, "nx_wiki_status.html" as *u8)) 107 if t3 == 1 { dgw(" T3 a real organ page (nx_wiki_status) generated + linked + zero-JS: PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dgw(" T3 real organ page generated + linked: FAIL\n" as *u8) } 108 109 dgw("NX-DOCPUB-TREE "); dgn(pass[0]); dgw("/3 ") 110 if pass[0] == 3 { dgw("verdict=GREEN (whole-directory self-generated reference, sovereign getdents walk)\n" as *u8); sys_exit(0); return 0 } 111 dgw("verdict=RED\n" as *u8); sys_exit(1); return 1 112}