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}