code wiki / _hdl_build / nx_wiki_boxdump.nx
nx_wiki_boxdump.nx source
↩ module page · 147 lines · 9365 B
1// nx_wiki_boxdump.nx -- DIAGNOSTIC: run the real render pipeline on the SAVED Wikipedia HTML
2// (knowledge/fetched/last_browse.html, written by nx_browse) and dump the first N boxes' geometry +
3// tag/text, so the actual header-overlap root cause is MEASURED, not guessed. No verdict (diagnostic).
4import "nx_syscalls.nx"
5import "nx_css_tokenize.nx"
6import "nx_css_parse.nx"
7import "nx_css_apply.nx"
8import "nx_css_color_decode.nx"
9import "nx_css_dimension_to_px.nx"
10import "nx_css_selector_match.nx"
11import "nx_html_tokenizer.nx"
12import "nx_html_entities.nx"
13import "nx_dom_query.nx"
14import "nx_layout_box.nx"
15import "nx_layout_default_display.nx"
16import "nx_layout_from_dom.nx"
17import "nx_layout_block.nx"
18import "nx_render_html.nx"
19const K_MAGIC_262144: i64 = 262144
20const K_MAGIC_16384: i64 = 16384
21const K_MAGIC_8192: i64 = 8192
22const K_MAGIC_32768: i64 = 32768
23
24func ps(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
25func pn(v0: i64) -> i64 { var v: i64=v0; if v<0 { let m: *u8=sys_mmap(8); m[0]=45 as u8; sys_write(1,m,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48;k=1} while v>0 {b[k]=(48+(v%10)) as u8; v=v/10; k=k+1} let o: *u8=sys_mmap(24); var j: i64=0; while j<k {o[j]=b[k-1-j];j=j+1} sys_write(1,o,k); return 0 }
26func emit(src: *u8, off: i64, len: i64) -> i64 { var n: i64=len; if n>40 { n=40 } sys_write(1, ((src as i64)+off) as *u8, n); return 0 }
27
28func main() -> i64 {
29 let lp: *i64 = sys_mmap(8) as *i64
30 let raw: *u8 = sys_read_file("knowledge/fetched/last_browse.html\x00" as *u8, lp)
31 let hlen: i64 = lp[0]
32 if hlen <= 0 { ps("no last_browse.html -- run nx_browse first\n\x00" as *u8); return 1 }
33 ps("=== WIKI BOX DUMP (real fetched HTML, first 44 boxes) === bytes=\x00" as *u8); pn(hlen); ps("\n\x00" as *u8)
34
35 // mirror _rh_to_fb's pipeline prefix EXACTLY (the SAME UA css string incl. the .vector-* display:none
36 // chrome-hiding rules) so the diagnostic is FAITHFUL to the real render.
37 let css: *u8 = "h1{background-color:#a8c8ff;margin-top:10px;margin-bottom:4px;font-size:40px}h2{background-color:#d0d0d0;margin-top:10px;margin-bottom:3px;font-size:28px}h3{background-color:#e4e4e4;margin-top:6px;margin-bottom:2px;font-size:24px}body{background-color:#ffffff;padding-left:8px;padding-top:6px}p{margin-top:6px;margin-bottom:5px}ul{padding-left:16px;margin-top:3px;margin-bottom:3px}ol{padding-left:24px;margin-top:3px;margin-bottom:3px}li{margin-bottom:2px}tr{display:flex}th{font-weight:bold;padding-left:4px;padding-right:4px}td{padding-left:4px;padding-right:4px}a{color:#3366cc}b{font-weight:bold}strong{font-weight:bold}i{font-style:italic}em{font-style:italic}.vector-menu-content-list{display:none}.vector-dropdown{display:none}.mw-interlanguage-selector{display:none}.wbc-editpage{display:none}.infobox{float:right;width:300px;margin-left:8px;background-color:#f8f8f8}\x00" as *u8
38 var clen: i64 = 0
39 while css[clen]!=(0 as u8) { clen=clen+1 }
40 let STYCAP: i64 = K_MAGIC_262144
41 let buf: *u8 = sys_mmap(hlen + STYCAP + clen + 16)
42 var i: i64 = 0
43 while i < hlen { buf[i]=raw[i]; i=i+1 }
44 let rawsty: *u8 = sys_mmap(STYCAP)
45 let rawstylen: i64 = rh_extract_styles(raw, hlen, rawsty, STYCAP)
46 let stylen: i64 = rh_filter_media(rawsty, 0, rawstylen, ((buf as i64)+hlen) as *u8, STYCAP, 800)
47 i = 0
48 while i < clen { buf[hlen + stylen + i] = css[i]; i=i+1 }
49 let total: i64 = hlen + stylen + clen
50
51 let VW: i64 = 800
52 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES*K_MAGIC_16384+16)) as *LayoutBox
53 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree
54 nx_layout_tree_init(tree, boxes, K_MAGIC_16384)
55 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES+8)) as *LayoutFromDomStack
56 let sidx: *i64 = (sys_mmap(8*128)) as *i64
57 nx_layout_from_dom_stack_init(stk, sidx, 128)
58 nx_layout_from_dom(buf, hlen, tree, stk)
59 ps("tree.count=\x00" as *u8); pn(tree.count); ps("\n\x00" as *u8)
60
61 let ext: *CssElement = (sys_mmap(NX_CSS_ELEMENT_BYTES*K_MAGIC_16384 as nx_size)) as *CssElement
62 let n_ext: i64 = rh_extract(buf, hlen, ext, K_MAGIC_16384)
63 let boxel: *CssElement = (sys_mmap((NX_CSS_ELEMENT_BYTES*(tree.count+1)) as nx_size)) as *CssElement
64 var k: i64 = 0
65 i = 0
66 while i < tree.count {
67 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
68 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
69 e.src = buf
70 var mapped: i64 = 0
71 if rh_is_elem(b.kind)==1 { if b.parent_idx != (0-1) { if k < n_ext {
72 let s: *CssElement = ((ext as i64)+k*NX_CSS_ELEMENT_BYTES) as *CssElement
73 e.tag_off=s.tag_off; e.tag_len=s.tag_len; e.id_off=s.id_off; e.id_len=s.id_len; e.class_off=s.class_off; e.class_len=s.class_len
74 k=k+1; mapped=1
75 } } }
76 if mapped==0 { e.tag_off=0; e.tag_len=0; e.id_off=0; e.id_len=0; e.class_off=0; e.class_len=0 }
77 i = i + 1
78 }
79
80 let cur: *CssCursor = (sys_mmap(NX_CSS_CURSOR_BYTES) as nx_size) as *CssCursor
81 nx_css_cursor_init(cur, buf, total); cur.pos = hlen
82 let tok: *CssToken = (sys_mmap(NX_CSS_TOKEN_BYTES) as nx_size) as *CssToken
83 let rules: *CssRule = (sys_mmap(NX_CSS_RULE_BYTES*K_MAGIC_8192 as nx_size)) as *CssRule
84 let decls: *CssDeclaration = (sys_mmap(NX_CSS_DECLARATION_BYTES*K_MAGIC_32768 as nx_size)) as *CssDeclaration
85 let st: *CssParseState = (sys_mmap(128) as nx_size) as *CssParseState
86 nx_css_parse_state_init(st, cur, tok, rules, K_MAGIC_8192, decls, K_MAGIC_32768)
87 nx_css_parse(st)
88 let computed: *CssComputedDecl = (sys_mmap(NX_CSS_COMPUTED_DECL_BYTES*K_MAGIC_262144 as nx_size)) as *CssComputedDecl
89 let cb: *i64 = (sys_mmap(8)) as *i64
90 rh_cascade(buf, rules, st.rule_count, decls, st.decl_count, boxel, tree.count, tree, computed, K_MAGIC_262144, cb)
91 let ncomp: i64 = cb[0]
92 ps("rules=\x00" as *u8); pn(st.rule_count); ps(" ncomp=\x00" as *u8); pn(ncomp); ps("\n\x00" as *u8)
93
94 let pbuf: *u8 = sys_mmap(256)
95 let ltable: *LayoutPropTable = (sys_mmap(NX_LAYOUT_PROP_TABLE_BYTES)) as *LayoutPropTable
96 nx_layout_prop_table_init(ltable, pbuf)
97 let resolve: *CssResolveCtx = (sys_mmap(NX_CSS_RESOLVE_CTX_BYTES)) as *CssResolveCtx
98 resolve.root_font_size_px = 16; resolve.parent_font_size_px = 16; resolve.parent_dimension_px = VW
99 let lctx: *LayoutCtx = (sys_mmap(NX_LAYOUT_CTX_BYTES)) as *LayoutCtx
100 nx_layout_ctx_init(lctx, tree, computed, ncomp, buf, VW, resolve)
101 let ph: i64 = nx_layout_block_layout(lctx, ltable, 0)
102 ps("page_h=\x00" as *u8); pn(ph); ps("\n\x00" as *u8)
103
104 // locate <main> and .infobox (the crop target + the float) and report their geometry
105 var main_idx: i64 = 0 - 1
106 var ib_idx: i64 = 0 - 1
107 i = 0
108 while i < tree.count {
109 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
110 if main_idx < 0 { if e.tag_len==4 { if (buf[e.tag_off]&0xff)==109 { if (buf[e.tag_off+1]&0xff)==97 { if (buf[e.tag_off+2]&0xff)==105 { if (buf[e.tag_off+3]&0xff)==110 { main_idx=i } } } } } }
111 if ib_idx < 0 { if e.class_len>=7 {
112 // class contains "infobox"?
113 var p: i64 = e.class_off; var pe: i64 = e.class_off+e.class_len; var hit: i64 = 0
114 while p+7 <= pe { if (buf[p]&0xff)==105 { if (buf[p+1]&0xff)==110 { if (buf[p+2]&0xff)==102 { if (buf[p+3]&0xff)==111 { if (buf[p+4]&0xff)==98 { if (buf[p+5]&0xff)==111 { if (buf[p+6]&0xff)==120 { hit=1; p=pe } } } } } } } p=p+1 }
115 if hit==1 { ib_idx=i }
116 } }
117 i = i + 1
118 }
119 ps("MAIN idx=\x00" as *u8); pn(main_idx)
120 if main_idx>=0 { let mb: *LayoutBox=((tree.boxes as i64)+main_idx*NX_LAYOUT_BOX_BYTES) as *LayoutBox; ps(" y=\x00" as *u8); pn(mb.y); ps(" h=\x00" as *u8); pn(mb.h) }
121 ps("\nINFOBOX idx=\x00" as *u8); pn(ib_idx)
122 if ib_idx>=0 { let ibb: *LayoutBox=((tree.boxes as i64)+ib_idx*NX_LAYOUT_BOX_BYTES) as *LayoutBox; ps(" x=\x00" as *u8); pn(ibb.x); ps(" y=\x00" as *u8); pn(ibb.y); ps(" w=\x00" as *u8); pn(ibb.w); ps(" h=\x00" as *u8); pn(ibb.h) }
123 ps("\n\x00" as *u8)
124
125 // dump every TEXT box painting in the title band (y in [30,92]) -- to find what overlaps the title
126 var shown: i64 = 0
127 i = 0
128 while i < tree.count {
129 if shown < 40 {
130 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
131 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
132 var interesting: i64 = 0
133 if b.kind==NX_LAYOUT_BOX_TEXT { if b.text_len>0 { if b.y >= 30 { if b.y <= 92 { interesting=1 } } } }
134 if interesting==1 {
135 ps(" box\x00" as *u8); pn(i); ps(" k=\x00" as *u8); pn(b.kind)
136 if e.tag_len>0 { ps(" <\x00" as *u8); emit(buf,e.tag_off,e.tag_len); ps(">\x00" as *u8) }
137 if e.class_len>0 { ps(" .\x00" as *u8); emit(buf,e.class_off,e.class_len) }
138 ps(" x=\x00" as *u8); pn(b.x); ps(" y=\x00" as *u8); pn(b.y); ps(" w=\x00" as *u8); pn(b.w); ps(" h=\x00" as *u8); pn(b.h)
139 if b.kind==NX_LAYOUT_BOX_TEXT { ps(" '\x00" as *u8); emit(buf,b.text_off,b.text_len); ps("'\x00" as *u8) }
140 ps("\n\x00" as *u8)
141 shown = shown + 1
142 }
143 }
144 i = i + 1
145 }
146 return 0
147}