code wiki / _hdl_build / nx_float_test.nx

nx_float_test.nx source

↩ module page · 127 lines · 7598 B

1// nx_float_test.nx -- ISOLATION TEST for R5 rung 1 (float:left/right). Runs the REAL render pipeline 2// prefix (from_dom -> box<->element map -> rh_cascade -> nx_layout_block_layout) on a controlled 3// fixture and dumps per-box geometry, so float placement is PROVEN before trusting it on real pages. 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_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" 18 19func ps(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 } 20func 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 } 21func emit(src: *u8, off: i64, len: i64) -> i64 { sys_write(1, ((src as i64)+off) as *u8, len); return 0 } 22 23func run(html: *u8, css: *u8, vw: i64) -> i64 { 24 var hlen: i64 = 0 25 while html[hlen]!=(0 as u8) { hlen=hlen+1 } 26 var clen: i64 = 0 27 while css[clen]!=(0 as u8) { clen=clen+1 } 28 let total: i64 = hlen + clen 29 let buf: *u8 = sys_mmap(total + 16) 30 var i: i64 = 0 31 while i < hlen { buf[i]=html[i]; i=i+1 } 32 var j: i64 = 0 33 while j < clen { buf[hlen+j]=css[j]; j=j+1 } 34 ps("=== HTML: \x00" as *u8); sys_write(1, html, hlen); ps(" CSS: \x00" as *u8); sys_write(1, css, clen); ps(" vw=\x00" as *u8); pn(vw); ps("\n\x00" as *u8) 35 36 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES*1024+16)) as *LayoutBox 37 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree 38 nx_layout_tree_init(tree, boxes, 1024) 39 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES+8)) as *LayoutFromDomStack 40 let sidx: *i64 = (sys_mmap(8*64)) as *i64 41 nx_layout_from_dom_stack_init(stk, sidx, 64) 42 nx_layout_from_dom(buf, hlen, tree, stk) 43 44 let ext: *CssElement = (sys_mmap(NX_CSS_ELEMENT_BYTES*1024 as nx_size)) as *CssElement 45 let n_ext: i64 = rh_extract(buf, hlen, ext, 1024) 46 let boxel: *CssElement = (sys_mmap((NX_CSS_ELEMENT_BYTES*(tree.count+1)) as nx_size)) as *CssElement 47 var k: i64 = 0 48 i = 0 49 while i < tree.count { 50 let bb: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox 51 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement 52 e.src = buf 53 var mapped: i64 = 0 54 if rh_is_elem(bb.kind)==1 { if bb.parent_idx != (0-1) { if k < n_ext { 55 let s: *CssElement = ((ext as i64)+k*NX_CSS_ELEMENT_BYTES) as *CssElement 56 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 57 k=k+1; mapped=1 58 } } } 59 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 } 60 i=i+1 61 } 62 63 let cur: *CssCursor = (sys_mmap(NX_CSS_CURSOR_BYTES) as nx_size) as *CssCursor 64 nx_css_cursor_init(cur, buf, total); cur.pos = hlen 65 let tok: *CssToken = (sys_mmap(NX_CSS_TOKEN_BYTES) as nx_size) as *CssToken 66 let rules: *CssRule = (sys_mmap(NX_CSS_RULE_BYTES*512 as nx_size)) as *CssRule 67 let decls: *CssDeclaration = (sys_mmap(NX_CSS_DECLARATION_BYTES*512 as nx_size)) as *CssDeclaration 68 let st: *CssParseState = (sys_mmap(128) as nx_size) as *CssParseState 69 nx_css_parse_state_init(st, cur, tok, rules, 512, decls, 512) 70 nx_css_parse(st) 71 let computed: *CssComputedDecl = (sys_mmap(NX_CSS_COMPUTED_DECL_BYTES*4096 as nx_size)) as *CssComputedDecl 72 let cb: *i64 = (sys_mmap(8)) as *i64 73 rh_cascade(buf, rules, st.rule_count, decls, st.decl_count, boxel, tree.count, tree, computed, 4096, cb) 74 let ncomp: i64 = cb[0] 75 ps("rules=\x00" as *u8); pn(st.rule_count); ps(" ncomp=\x00" as *u8); pn(ncomp); ps("\n\x00" as *u8) 76 77 let pbuf: *u8 = sys_mmap(256) 78 let ltable: *LayoutPropTable = (sys_mmap(NX_LAYOUT_PROP_TABLE_BYTES)) as *LayoutPropTable 79 nx_layout_prop_table_init(ltable, pbuf) 80 let resolve: *CssResolveCtx = (sys_mmap(NX_CSS_RESOLVE_CTX_BYTES)) as *CssResolveCtx 81 resolve.root_font_size_px = 16; resolve.parent_font_size_px = 16; resolve.parent_dimension_px = vw 82 let lctx: *LayoutCtx = (sys_mmap(NX_LAYOUT_CTX_BYTES)) as *LayoutCtx 83 nx_layout_ctx_init(lctx, tree, computed, ncomp, buf, vw, resolve) 84 let ph: i64 = nx_layout_block_layout(lctx, ltable, 0) 85 ps("page_h=\x00" as *u8); pn(ph); ps("\n\x00" as *u8) 86 87 i = 0 88 while i < tree.count { 89 let bb: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox 90 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement 91 ps(" box\x00" as *u8); pn(i); ps(" kind=\x00" as *u8); pn(bb.kind) 92 if e.tag_len>0 { ps(" <\x00" as *u8); emit(buf,e.tag_off,e.tag_len); ps(">\x00" as *u8) } 93 if e.id_len>0 { ps(" #\x00" as *u8); emit(buf,e.id_off,e.id_len) } 94 if bb.kind==NX_LAYOUT_BOX_TEXT { ps(" '\x00" as *u8); emit(buf,bb.text_off,bb.text_len); ps("'\x00" as *u8) } 95 ps(" x=\x00" as *u8); pn(bb.x); ps(" y=\x00" as *u8); pn(bb.y); ps(" w=\x00" as *u8); pn(bb.w); ps(" h=\x00" as *u8); pn(bb.h); ps("\n\x00" as *u8) 96 i=i+1 97 } 98 ps("\n\x00" as *u8) 99 return 0 100} 101 102func main() -> i64 { 103 // float:left -> #f pinned x=0 w=200; #m (normal block) flows BESIDE -> x=200 w=600 104 run("<div id=\"c\"><div id=\"sb\">S</div><div id=\"m\">main content here</div></div>\x00" as *u8, 105 "#sb{float:left;width:200px}\x00" as *u8, 800) 106 // float:right -> #f pinned to the right edge (x=600 w=200); #m at x=0 narrowed to w=600 107 run("<div id=\"c\"><div id=\"sb\">S</div><div id=\"m\">main content here</div></div>\x00" as *u8, 108 "#sb{float:right;width:200px}\x00" as *u8, 800) 109 // NO float (control) -> #sb and #m stack vertically, both full width 110 run("<div id=\"c\"><div id=\"sb\">S</div><div id=\"m\">main content here</div></div>\x00" as *u8, 111 "#sb{width:200px}\x00" as *u8, 800) 112 // HEX-ISH id (#f): the selector parser tokenized #f as HEXCOLOR and DROPPED the rule (rules=0). 113 // The nx_css_parse robustness fix should now PARSE it (rules=1) and float:left should work. 114 run("<div id=\"c\"><div id=\"f\">S</div><div id=\"m\">main content here</div></div>\x00" as *u8, 115 "#f{float:left;width:200px}\x00" as *u8, 800) 116 // BASIC TABLE via tr{display:flex} (reuse flex-row): rows STACK, cells go SIDE-BY-SIDE (equal share). 117 run("<table><tr><td>A</td><td>B</td></tr><tr><td>CC</td><td>DD</td></tr></table>\x00" as *u8, 118 "tr{display:flex}\x00" as *u8, 800) 119 // FLOAT a TABLE right: does #tbl float (x=600 w=200) with #m flowing beside (x=0 w=600)? 120 run("<div id=\"c\"><table id=\"tbl\"><tr><td>X</td><td>Y</td></tr></table><div id=\"m\">beside</div></div>\x00" as *u8, 121 "#tbl{float:right;width:200px}tr{display:flex}\x00" as *u8, 800) 122 // DECL-RECOVERY: `border:1px solid black` (multi-value) used to ABORT the sheet (rules=0); now it's 123 // skipped and float:left/width STILL parse (rules=1, #sb floats x=0 w=200). 124 run("<div id=\"c\"><div id=\"sb\">S</div><div id=\"m\">beside</div></div>\x00" as *u8, 125 "#sb{border:1px solid black;float:left;width:200px}\x00" as *u8, 800) 126 return 0 127}