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}