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 — 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>☰ 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 — 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}