code wiki / _hdl_build / nx_layout_debug.nx
nx_layout_debug.nx source
↩ module page · 113 lines · 5808 B
1// nx_layout_debug.nx -- GROUND-TRUTH check of the box<->element MAPPING on the real last_fetch.html.
2// Runs the exact from_dom + rh_extract + mapping that _rh_to_fb uses, then reports whether <main> and
3// the .vector-menu-content-list <ul>s map to the RIGHT boxes (tag+class). If they don't, the two-walk
4// mapping is drifting -- which is what breaks <main>-crop and display:none on the live render.
5import "nx_syscalls.nx"
6import "nx_css_tokenize.nx"
7import "nx_css_parse.nx"
8import "nx_css_apply.nx"
9import "nx_css_color_decode.nx"
10import "nx_css_selector_match.nx"
11import "nx_html_tokenizer.nx"
12import "nx_dom_query.nx"
13import "nx_layout_box.nx"
14import "nx_layout_default_display.nx"
15import "nx_layout_from_dom.nx"
16import "nx_layout_block.nx"
17import "nx_render_html.nx"
18const K_MAGIC_16384: i64 = 16384
19
20func ps(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
21func 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 }
22func emit(src: *u8, off: i64, len: i64) -> i64 { sys_write(1, ((src as i64)+off) as *u8, len); return 0 }
23func dx_contains(src: *u8, off: i64, len: i64, pat: *u8, patlen: i64) -> i64 {
24 if len < patlen { return 0 }
25 var i: i64 = 0
26 while i <= len - patlen {
27 var j: i64 = 0; var ok: i64 = 1
28 while j < patlen { if (src[off+i+j]&0xff) != (pat[j]&0xff) { ok=0; j=patlen } else { j=j+1 } }
29 if ok==1 { return 1 }
30 i=i+1
31 }
32 return 0
33}
34func tag_is(src: *u8, e: *CssElement, m: *u8, ml: i64) -> i64 {
35 if e.tag_len != ml { return 0 }
36 var j: i64 = 0
37 while j < ml { if (src[e.tag_off+j]&0xff) != (m[j]&0xff) { return 0 } j=j+1 }
38 return 1
39}
40
41func main() -> i64 {
42 let lp: *i64 = sys_mmap(16) as *i64
43 let html: *u8 = sys_read_file("knowledge/fetched/last_fetch.html\x00" as *u8, lp)
44 let hlen: i64 = *lp
45 if hlen <= 0 { ps("ERR no last_fetch.html\n\x00" as *u8); return 1 }
46 ps("html bytes=\x00" as *u8); pn(hlen); ps("\n\x00" as *u8)
47
48 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES*K_MAGIC_16384+16)) as *LayoutBox
49 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree
50 nx_layout_tree_init(tree, boxes, K_MAGIC_16384)
51 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES+8)) as *LayoutFromDomStack
52 let sidx: *i64 = (sys_mmap(8*128)) as *i64
53 nx_layout_from_dom_stack_init(stk, sidx, 128)
54 nx_layout_from_dom(html, hlen, tree, stk)
55
56 let ext: *CssElement = (sys_mmap(NX_CSS_ELEMENT_BYTES*K_MAGIC_16384 as nx_size)) as *CssElement
57 let n_ext: i64 = rh_extract(html, hlen, ext, K_MAGIC_16384)
58 let boxel: *CssElement = (sys_mmap((NX_CSS_ELEMENT_BYTES*(tree.count+1)) as nx_size)) as *CssElement
59 var k: i64 = 0
60 var i: i64 = 0
61 while i < tree.count {
62 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
63 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
64 e.src = html
65 var mapped: i64 = 0
66 if rh_is_elem(b.kind)==1 { if b.parent_idx != (0-1) { if k < n_ext {
67 let s: *CssElement = ((ext as i64)+k*NX_CSS_ELEMENT_BYTES) as *CssElement
68 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
69 k=k+1; mapped=1
70 } } }
71 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 }
72 i=i+1
73 }
74 ps("tree.count=\x00" as *u8); pn(tree.count); ps(" n_ext=\x00" as *u8); pn(n_ext); ps(" mapped_elems(k)=\x00" as *u8); pn(k); ps("\n\x00" as *u8)
75
76 let vmcl: *u8 = "vector-menu-content-list\x00" as *u8
77 var main_idx: i64 = 0-1
78 var vmcl_boxes: i64 = 0
79 var vmcl_first: i64 = 0-1
80 i = 0
81 while i < tree.count {
82 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
83 if tag_is(html, e, "main\x00" as *u8, 4)==1 { if main_idx<0 { main_idx=i } }
84 if dx_contains(html, e.class_off, e.class_len, vmcl, 24)==1 { vmcl_boxes=vmcl_boxes+1; if vmcl_first<0 { vmcl_first=i } }
85 i=i+1
86 }
87 ps("MAIN box idx=\x00" as *u8); pn(main_idx)
88 if main_idx>=0 { let e: *CssElement = ((boxel as i64)+main_idx*NX_CSS_ELEMENT_BYTES) as *CssElement; ps(" tag=\x00" as *u8); emit(html,e.tag_off,e.tag_len); ps(" class=\x00" as *u8); emit(html,e.class_off,e.class_len) }
89 ps("\n\x00" as *u8)
90 ps("VMCL boxes=\x00" as *u8); pn(vmcl_boxes); ps(" first idx=\x00" as *u8); pn(vmcl_first)
91 if vmcl_first>=0 { let e: *CssElement = ((boxel as i64)+vmcl_first*NX_CSS_ELEMENT_BYTES) as *CssElement; ps(" tag=\x00" as *u8); emit(html,e.tag_off,e.tag_len) }
92 ps("\n\x00" as *u8)
93
94 // first 36 mapped element boxes: index:tag.class -- eyeball whether tags track document order
95 ps("--- first 36 element boxes (idx:tag) ---\n\x00" as *u8)
96 var shown: i64 = 0
97 i = 0
98 while i < tree.count {
99 if shown < 36 {
100 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
101 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
102 if rh_is_elem(b.kind)==1 { if b.parent_idx != (0-1) { if e.tag_len>0 {
103 pn(i); ps(":\x00" as *u8); emit(html,e.tag_off,e.tag_len)
104 if e.class_len>0 { ps(".\x00" as *u8); var cl: i64=e.class_len; if cl>14 { cl=14 } emit(html,e.class_off,cl) }
105 ps(" \x00" as *u8)
106 shown=shown+1
107 } } }
108 }
109 i=i+1
110 }
111 ps("\n\x00" as *u8)
112 return 0
113}