nx_html_entities.nx source
↩ module page · 350 lines · 34246 B
1// nx_html_entities.nx -- data-driven HTML named-entity table for the
2// sovereign browser's text renderer (X-HTML-ENT-001 follow-on: the
3// named half). 110 common-on-the-web entities, codepoints sourced
4// AUTHORITATIVELY from python html.entities.html5 (verified, not from
5// memory). Single-responsibility organ (rule 9) so the table has ONE
6// home and is KAT-testable on its own; nx_html_to_text imports it.
7// expect_exit: 0
8// license_tier: ORIGINAL
9// genealogy_id: international-research-sources/whatwg/html5-named-charrefs
10
11import "nx_syscalls.nx"
12
13// Inline byte-compare per entity: NO internal function calls (avoids the
14// 21-same-fn-call-sites nxasm rc=6 landmine), early-out on length + first byte.
15func nx_html_entity_lookup(name: *u8, nlen: i64, out_cp: *i64) -> i64 {
16 if nlen == 3 { if (name[0]&0xff)==97 { if (name[1]&0xff)==109 { if (name[2]&0xff)==112 { out_cp[0] = 0x26; return 1 }}} } // &
17 if nlen == 2 { if (name[0]&0xff)==108 { if (name[1]&0xff)==116 { out_cp[0] = 0x3c; return 1 }} } // <
18 if nlen == 2 { if (name[0]&0xff)==103 { if (name[1]&0xff)==116 { out_cp[0] = 0x3e; return 1 }} } // >
19 if nlen == 4 { if (name[0]&0xff)==113 { if (name[1]&0xff)==117 { if (name[2]&0xff)==111 { if (name[3]&0xff)==116 { out_cp[0] = 0x22; return 1 }}}} } // "
20 if nlen == 4 { if (name[0]&0xff)==97 { if (name[1]&0xff)==112 { if (name[2]&0xff)==111 { if (name[3]&0xff)==115 { out_cp[0] = 0x27; return 1 }}}} } // '
21 if nlen == 4 { if (name[0]&0xff)==110 { if (name[1]&0xff)==98 { if (name[2]&0xff)==115 { if (name[3]&0xff)==112 { out_cp[0] = 0xa0; return 1 }}}} } //
22 if nlen == 4 { if (name[0]&0xff)==99 { if (name[1]&0xff)==111 { if (name[2]&0xff)==112 { if (name[3]&0xff)==121 { out_cp[0] = 0xa9; return 1 }}}} } // ©
23 if nlen == 3 { if (name[0]&0xff)==114 { if (name[1]&0xff)==101 { if (name[2]&0xff)==103 { out_cp[0] = 0xae; return 1 }}} } // ®
24 if nlen == 5 { if (name[0]&0xff)==116 { if (name[1]&0xff)==114 { if (name[2]&0xff)==97 { if (name[3]&0xff)==100 { if (name[4]&0xff)==101 { out_cp[0] = 0x2122; return 1 }}}}} } // ™
25 if nlen == 6 { if (name[0]&0xff)==104 { if (name[1]&0xff)==101 { if (name[2]&0xff)==108 { if (name[3]&0xff)==108 { if (name[4]&0xff)==105 { if (name[5]&0xff)==112 { out_cp[0] = 0x2026; return 1 }}}}}} } // …
26 if nlen == 5 { if (name[0]&0xff)==109 { if (name[1]&0xff)==100 { if (name[2]&0xff)==97 { if (name[3]&0xff)==115 { if (name[4]&0xff)==104 { out_cp[0] = 0x2014; return 1 }}}}} } // —
27 if nlen == 5 { if (name[0]&0xff)==110 { if (name[1]&0xff)==100 { if (name[2]&0xff)==97 { if (name[3]&0xff)==115 { if (name[4]&0xff)==104 { out_cp[0] = 0x2013; return 1 }}}}} } // –
28 if nlen == 5 { if (name[0]&0xff)==108 { if (name[1]&0xff)==115 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x2018; return 1 }}}}} } // ‘
29 if nlen == 5 { if (name[0]&0xff)==114 { if (name[1]&0xff)==115 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x2019; return 1 }}}}} } // ’
30 if nlen == 5 { if (name[0]&0xff)==108 { if (name[1]&0xff)==100 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x201c; return 1 }}}}} } // “
31 if nlen == 5 { if (name[0]&0xff)==114 { if (name[1]&0xff)==100 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x201d; return 1 }}}}} } // ”
32 if nlen == 5 { if (name[0]&0xff)==115 { if (name[1]&0xff)==98 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x201a; return 1 }}}}} } // ‚
33 if nlen == 5 { if (name[0]&0xff)==98 { if (name[1]&0xff)==100 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0x201e; return 1 }}}}} } // „
34 if nlen == 6 { if (name[0]&0xff)==100 { if (name[1]&0xff)==97 { if (name[2]&0xff)==103 { if (name[3]&0xff)==103 { if (name[4]&0xff)==101 { if (name[5]&0xff)==114 { out_cp[0] = 0x2020; return 1 }}}}}} } // †
35 if nlen == 6 { if (name[0]&0xff)==68 { if (name[1]&0xff)==97 { if (name[2]&0xff)==103 { if (name[3]&0xff)==103 { if (name[4]&0xff)==101 { if (name[5]&0xff)==114 { out_cp[0] = 0x2021; return 1 }}}}}} } // ‡
36 if nlen == 4 { if (name[0]&0xff)==98 { if (name[1]&0xff)==117 { if (name[2]&0xff)==108 { if (name[3]&0xff)==108 { out_cp[0] = 0x2022; return 1 }}}} } // •
37 if nlen == 6 { if (name[0]&0xff)==109 { if (name[1]&0xff)==105 { if (name[2]&0xff)==100 { if (name[3]&0xff)==100 { if (name[4]&0xff)==111 { if (name[5]&0xff)==116 { out_cp[0] = 0xb7; return 1 }}}}}} } // ·
38 if nlen == 3 { if (name[0]&0xff)==100 { if (name[1]&0xff)==101 { if (name[2]&0xff)==103 { out_cp[0] = 0xb0; return 1 }}} } // °
39 if nlen == 6 { if (name[0]&0xff)==112 { if (name[1]&0xff)==108 { if (name[2]&0xff)==117 { if (name[3]&0xff)==115 { if (name[4]&0xff)==109 { if (name[5]&0xff)==110 { out_cp[0] = 0xb1; return 1 }}}}}} } // ±
40 if nlen == 5 { if (name[0]&0xff)==116 { if (name[1]&0xff)==105 { if (name[2]&0xff)==109 { if (name[3]&0xff)==101 { if (name[4]&0xff)==115 { out_cp[0] = 0xd7; return 1 }}}}} } // ×
41 if nlen == 6 { if (name[0]&0xff)==100 { if (name[1]&0xff)==105 { if (name[2]&0xff)==118 { if (name[3]&0xff)==105 { if (name[4]&0xff)==100 { if (name[5]&0xff)==101 { out_cp[0] = 0xf7; return 1 }}}}}} } // ÷
42 if nlen == 6 { if (name[0]&0xff)==102 { if (name[1]&0xff)==114 { if (name[2]&0xff)==97 { if (name[3]&0xff)==99 { if (name[4]&0xff)==49 { if (name[5]&0xff)==50 { out_cp[0] = 0xbd; return 1 }}}}}} } // ½
43 if nlen == 6 { if (name[0]&0xff)==102 { if (name[1]&0xff)==114 { if (name[2]&0xff)==97 { if (name[3]&0xff)==99 { if (name[4]&0xff)==49 { if (name[5]&0xff)==52 { out_cp[0] = 0xbc; return 1 }}}}}} } // ¼
44 if nlen == 6 { if (name[0]&0xff)==102 { if (name[1]&0xff)==114 { if (name[2]&0xff)==97 { if (name[3]&0xff)==99 { if (name[4]&0xff)==51 { if (name[5]&0xff)==52 { out_cp[0] = 0xbe; return 1 }}}}}} } // ¾
45 if nlen == 4 { if (name[0]&0xff)==115 { if (name[1]&0xff)==117 { if (name[2]&0xff)==112 { if (name[3]&0xff)==49 { out_cp[0] = 0xb9; return 1 }}}} } // ¹
46 if nlen == 4 { if (name[0]&0xff)==115 { if (name[1]&0xff)==117 { if (name[2]&0xff)==112 { if (name[3]&0xff)==50 { out_cp[0] = 0xb2; return 1 }}}} } // ²
47 if nlen == 4 { if (name[0]&0xff)==115 { if (name[1]&0xff)==117 { if (name[2]&0xff)==112 { if (name[3]&0xff)==51 { out_cp[0] = 0xb3; return 1 }}}} } // ³
48 if nlen == 5 { if (name[0]&0xff)==109 { if (name[1]&0xff)==105 { if (name[2]&0xff)==99 { if (name[3]&0xff)==114 { if (name[4]&0xff)==111 { out_cp[0] = 0xb5; return 1 }}}}} } // µ
49 if nlen == 4 { if (name[0]&0xff)==112 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { out_cp[0] = 0xb6; return 1 }}}} } // ¶
50 if nlen == 4 { if (name[0]&0xff)==115 { if (name[1]&0xff)==101 { if (name[2]&0xff)==99 { if (name[3]&0xff)==116 { out_cp[0] = 0xa7; return 1 }}}} } // §
51 if nlen == 5 { if (name[0]&0xff)==108 { if (name[1]&0xff)==97 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0xab; return 1 }}}}} } // «
52 if nlen == 5 { if (name[0]&0xff)==114 { if (name[1]&0xff)==97 { if (name[2]&0xff)==113 { if (name[3]&0xff)==117 { if (name[4]&0xff)==111 { out_cp[0] = 0xbb; return 1 }}}}} } // »
53 if nlen == 6 { if (name[0]&0xff)==114 { if (name[1]&0xff)==115 { if (name[2]&0xff)==97 { if (name[3]&0xff)==113 { if (name[4]&0xff)==117 { if (name[5]&0xff)==111 { out_cp[0] = 0x203a; return 1 }}}}}} } // ›
54 if nlen == 6 { if (name[0]&0xff)==108 { if (name[1]&0xff)==115 { if (name[2]&0xff)==97 { if (name[3]&0xff)==113 { if (name[4]&0xff)==117 { if (name[5]&0xff)==111 { out_cp[0] = 0x2039; return 1 }}}}}} } // ‹
55 if nlen == 5 { if (name[0]&0xff)==105 { if (name[1]&0xff)==101 { if (name[2]&0xff)==120 { if (name[3]&0xff)==99 { if (name[4]&0xff)==108 { out_cp[0] = 0xa1; return 1 }}}}} } // ¡
56 if nlen == 6 { if (name[0]&0xff)==105 { if (name[1]&0xff)==113 { if (name[2]&0xff)==117 { if (name[3]&0xff)==101 { if (name[4]&0xff)==115 { if (name[5]&0xff)==116 { out_cp[0] = 0xbf; return 1 }}}}}} } // ¿
57 if nlen == 4 { if (name[0]&0xff)==99 { if (name[1]&0xff)==101 { if (name[2]&0xff)==110 { if (name[3]&0xff)==116 { out_cp[0] = 0xa2; return 1 }}}} } // ¢
58 if nlen == 5 { if (name[0]&0xff)==112 { if (name[1]&0xff)==111 { if (name[2]&0xff)==117 { if (name[3]&0xff)==110 { if (name[4]&0xff)==100 { out_cp[0] = 0xa3; return 1 }}}}} } // £
59 if nlen == 6 { if (name[0]&0xff)==99 { if (name[1]&0xff)==117 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { if (name[4]&0xff)==101 { if (name[5]&0xff)==110 { out_cp[0] = 0xa4; return 1 }}}}}} } // ¤
60 if nlen == 3 { if (name[0]&0xff)==121 { if (name[1]&0xff)==101 { if (name[2]&0xff)==110 { out_cp[0] = 0xa5; return 1 }}} } // ¥
61 if nlen == 4 { if (name[0]&0xff)==101 { if (name[1]&0xff)==117 { if (name[2]&0xff)==114 { if (name[3]&0xff)==111 { out_cp[0] = 0x20ac; return 1 }}}} } // €
62 if nlen == 6 { if (name[0]&0xff)==98 { if (name[1]&0xff)==114 { if (name[2]&0xff)==118 { if (name[3]&0xff)==98 { if (name[4]&0xff)==97 { if (name[5]&0xff)==114 { out_cp[0] = 0xa6; return 1 }}}}}} } // ¦
63 if nlen == 3 { if (name[0]&0xff)==117 { if (name[1]&0xff)==109 { if (name[2]&0xff)==108 { out_cp[0] = 0xa8; return 1 }}} } // ¨
64 if nlen == 4 { if (name[0]&0xff)==111 { if (name[1]&0xff)==114 { if (name[2]&0xff)==100 { if (name[3]&0xff)==102 { out_cp[0] = 0xaa; return 1 }}}} } // ª
65 if nlen == 4 { if (name[0]&0xff)==111 { if (name[1]&0xff)==114 { if (name[2]&0xff)==100 { if (name[3]&0xff)==109 { out_cp[0] = 0xba; return 1 }}}} } // º
66 if nlen == 3 { if (name[0]&0xff)==110 { if (name[1]&0xff)==111 { if (name[2]&0xff)==116 { out_cp[0] = 0xac; return 1 }}} } // ¬
67 if nlen == 3 { if (name[0]&0xff)==115 { if (name[1]&0xff)==104 { if (name[2]&0xff)==121 { out_cp[0] = 0xad; return 1 }}} } // ­
68 if nlen == 4 { if (name[0]&0xff)==109 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==114 { out_cp[0] = 0xaf; return 1 }}}} } // ¯
69 if nlen == 5 { if (name[0]&0xff)==97 { if (name[1]&0xff)==99 { if (name[2]&0xff)==117 { if (name[3]&0xff)==116 { if (name[4]&0xff)==101 { out_cp[0] = 0xb4; return 1 }}}}} } // ´
70 if nlen == 5 { if (name[0]&0xff)==99 { if (name[1]&0xff)==101 { if (name[2]&0xff)==100 { if (name[3]&0xff)==105 { if (name[4]&0xff)==108 { out_cp[0] = 0xb8; return 1 }}}}} } // ¸
71 if nlen == 6 { if (name[0]&0xff)==97 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xe0; return 1 }}}}}} } // à
72 if nlen == 6 { if (name[0]&0xff)==97 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xe1; return 1 }}}}}} } // á
73 if nlen == 5 { if (name[0]&0xff)==97 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xe2; return 1 }}}}} } // â
74 if nlen == 6 { if (name[0]&0xff)==97 { if (name[1]&0xff)==116 { if (name[2]&0xff)==105 { if (name[3]&0xff)==108 { if (name[4]&0xff)==100 { if (name[5]&0xff)==101 { out_cp[0] = 0xe3; return 1 }}}}}} } // ã
75 if nlen == 4 { if (name[0]&0xff)==97 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xe4; return 1 }}}} } // ä
76 if nlen == 5 { if (name[0]&0xff)==97 { if (name[1]&0xff)==114 { if (name[2]&0xff)==105 { if (name[3]&0xff)==110 { if (name[4]&0xff)==103 { out_cp[0] = 0xe5; return 1 }}}}} } // å
77 if nlen == 5 { if (name[0]&0xff)==97 { if (name[1]&0xff)==101 { if (name[2]&0xff)==108 { if (name[3]&0xff)==105 { if (name[4]&0xff)==103 { out_cp[0] = 0xe6; return 1 }}}}} } // æ
78 if nlen == 6 { if (name[0]&0xff)==99 { if (name[1]&0xff)==99 { if (name[2]&0xff)==101 { if (name[3]&0xff)==100 { if (name[4]&0xff)==105 { if (name[5]&0xff)==108 { out_cp[0] = 0xe7; return 1 }}}}}} } // ç
79 if nlen == 6 { if (name[0]&0xff)==101 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xe8; return 1 }}}}}} } // è
80 if nlen == 6 { if (name[0]&0xff)==101 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xe9; return 1 }}}}}} } // é
81 if nlen == 5 { if (name[0]&0xff)==101 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xea; return 1 }}}}} } // ê
82 if nlen == 4 { if (name[0]&0xff)==101 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xeb; return 1 }}}} } // ë
83 if nlen == 6 { if (name[0]&0xff)==105 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xec; return 1 }}}}}} } // ì
84 if nlen == 6 { if (name[0]&0xff)==105 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xed; return 1 }}}}}} } // í
85 if nlen == 5 { if (name[0]&0xff)==105 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xee; return 1 }}}}} } // î
86 if nlen == 4 { if (name[0]&0xff)==105 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xef; return 1 }}}} } // ï
87 if nlen == 6 { if (name[0]&0xff)==110 { if (name[1]&0xff)==116 { if (name[2]&0xff)==105 { if (name[3]&0xff)==108 { if (name[4]&0xff)==100 { if (name[5]&0xff)==101 { out_cp[0] = 0xf1; return 1 }}}}}} } // ñ
88 if nlen == 6 { if (name[0]&0xff)==111 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xf2; return 1 }}}}}} } // ò
89 if nlen == 6 { if (name[0]&0xff)==111 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xf3; return 1 }}}}}} } // ó
90 if nlen == 5 { if (name[0]&0xff)==111 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xf4; return 1 }}}}} } // ô
91 if nlen == 6 { if (name[0]&0xff)==111 { if (name[1]&0xff)==116 { if (name[2]&0xff)==105 { if (name[3]&0xff)==108 { if (name[4]&0xff)==100 { if (name[5]&0xff)==101 { out_cp[0] = 0xf5; return 1 }}}}}} } // õ
92 if nlen == 4 { if (name[0]&0xff)==111 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xf6; return 1 }}}} } // ö
93 if nlen == 6 { if (name[0]&0xff)==111 { if (name[1]&0xff)==115 { if (name[2]&0xff)==108 { if (name[3]&0xff)==97 { if (name[4]&0xff)==115 { if (name[5]&0xff)==104 { out_cp[0] = 0xf8; return 1 }}}}}} } // ø
94 if nlen == 6 { if (name[0]&0xff)==117 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xf9; return 1 }}}}}} } // ù
95 if nlen == 6 { if (name[0]&0xff)==117 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xfa; return 1 }}}}}} } // ú
96 if nlen == 5 { if (name[0]&0xff)==117 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xfb; return 1 }}}}} } // û
97 if nlen == 4 { if (name[0]&0xff)==117 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xfc; return 1 }}}} } // ü
98 if nlen == 6 { if (name[0]&0xff)==121 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xfd; return 1 }}}}}} } // ý
99 if nlen == 4 { if (name[0]&0xff)==121 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xff; return 1 }}}} } // ÿ
100 if nlen == 5 { if (name[0]&0xff)==115 { if (name[1]&0xff)==122 { if (name[2]&0xff)==108 { if (name[3]&0xff)==105 { if (name[4]&0xff)==103 { out_cp[0] = 0xdf; return 1 }}}}} } // ß
101 if nlen == 6 { if (name[0]&0xff)==65 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xc0; return 1 }}}}}} } // À
102 if nlen == 6 { if (name[0]&0xff)==65 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xc1; return 1 }}}}}} } // Á
103 if nlen == 5 { if (name[0]&0xff)==65 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xc2; return 1 }}}}} } // Â
104 if nlen == 4 { if (name[0]&0xff)==65 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xc4; return 1 }}}} } // Ä
105 if nlen == 5 { if (name[0]&0xff)==65 { if (name[1]&0xff)==114 { if (name[2]&0xff)==105 { if (name[3]&0xff)==110 { if (name[4]&0xff)==103 { out_cp[0] = 0xc5; return 1 }}}}} } // Å
106 if nlen == 5 { if (name[0]&0xff)==65 { if (name[1]&0xff)==69 { if (name[2]&0xff)==108 { if (name[3]&0xff)==105 { if (name[4]&0xff)==103 { out_cp[0] = 0xc6; return 1 }}}}} } // Æ
107 if nlen == 6 { if (name[0]&0xff)==67 { if (name[1]&0xff)==99 { if (name[2]&0xff)==101 { if (name[3]&0xff)==100 { if (name[4]&0xff)==105 { if (name[5]&0xff)==108 { out_cp[0] = 0xc7; return 1 }}}}}} } // Ç
108 if nlen == 6 { if (name[0]&0xff)==69 { if (name[1]&0xff)==103 { if (name[2]&0xff)==114 { if (name[3]&0xff)==97 { if (name[4]&0xff)==118 { if (name[5]&0xff)==101 { out_cp[0] = 0xc8; return 1 }}}}}} } // È
109 if nlen == 6 { if (name[0]&0xff)==69 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xc9; return 1 }}}}}} } // É
110 if nlen == 5 { if (name[0]&0xff)==69 { if (name[1]&0xff)==99 { if (name[2]&0xff)==105 { if (name[3]&0xff)==114 { if (name[4]&0xff)==99 { out_cp[0] = 0xca; return 1 }}}}} } // Ê
111 if nlen == 4 { if (name[0]&0xff)==69 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xcb; return 1 }}}} } // Ë
112 if nlen == 6 { if (name[0]&0xff)==73 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xcd; return 1 }}}}}} } // Í
113 if nlen == 6 { if (name[0]&0xff)==78 { if (name[1]&0xff)==116 { if (name[2]&0xff)==105 { if (name[3]&0xff)==108 { if (name[4]&0xff)==100 { if (name[5]&0xff)==101 { out_cp[0] = 0xd1; return 1 }}}}}} } // Ñ
114 if nlen == 6 { if (name[0]&0xff)==79 { if (name[1]&0xff)==97 { if (name[2]&0xff)==99 { if (name[3]&0xff)==117 { if (name[4]&0xff)==116 { if (name[5]&0xff)==101 { out_cp[0] = 0xd3; return 1 }}}}}} } // Ó
115 if nlen == 4 { if (name[0]&0xff)==79 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xd6; return 1 }}}} } // Ö
116 if nlen == 4 { if (name[0]&0xff)==85 { if (name[1]&0xff)==117 { if (name[2]&0xff)==109 { if (name[3]&0xff)==108 { out_cp[0] = 0xdc; return 1 }}}} } // Ü
117 if nlen == 4 { if (name[0]&0xff)==108 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { out_cp[0] = 0x2190; return 1 }}}} } // ←
118 if nlen == 4 { if (name[0]&0xff)==114 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { out_cp[0] = 0x2192; return 1 }}}} } // →
119 if nlen == 4 { if (name[0]&0xff)==117 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { out_cp[0] = 0x2191; return 1 }}}} } // ↑
120 if nlen == 4 { if (name[0]&0xff)==100 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { out_cp[0] = 0x2193; return 1 }}}} } // ↓
121 if nlen == 4 { if (name[0]&0xff)==104 { if (name[1]&0xff)==97 { if (name[2]&0xff)==114 { if (name[3]&0xff)==114 { out_cp[0] = 0x2194; return 1 }}}} } // ↔
122 if nlen == 2 { if (name[0]&0xff)==108 { if (name[1]&0xff)==101 { out_cp[0] = 0x2264; return 1 }} } // ≤
123 if nlen == 2 { if (name[0]&0xff)==103 { if (name[1]&0xff)==101 { out_cp[0] = 0x2265; return 1 }} } // ≥
124 if nlen == 2 { if (name[0]&0xff)==110 { if (name[1]&0xff)==101 { out_cp[0] = 0x2260; return 1 }} } // ≠
125 if nlen == 5 { if (name[0]&0xff)==101 { if (name[1]&0xff)==113 { if (name[2]&0xff)==117 { if (name[3]&0xff)==105 { if (name[4]&0xff)==118 { out_cp[0] = 0x2261; return 1 }}}}} } // ≡
126 if nlen == 5 { if (name[0]&0xff)==105 { if (name[1]&0xff)==110 { if (name[2]&0xff)==102 { if (name[3]&0xff)==105 { if (name[4]&0xff)==110 { out_cp[0] = 0x221e; return 1 }}}}} } // ∞
127 if nlen == 5 { if (name[0]&0xff)==97 { if (name[1]&0xff)==115 { if (name[2]&0xff)==121 { if (name[3]&0xff)==109 { if (name[4]&0xff)==112 { out_cp[0] = 0x2248; return 1 }}}}} } // ≈
128 return 0
129}
130
131// UTF-8 encode codepoint `cp` into out[o..], bounded by cap; returns the new write offset.
132func _ent_utf8(out: *u8, o0: i64, cap: i64, cp: i64) -> i64 {
133 var o: i64 = o0
134 if cp < 0x80 {
135 if o < cap { out[o] = cp as u8; o = o + 1 }
136 } else {
137 if cp < 0x800 {
138 if o + 1 < cap { out[o] = (0xC0 | (cp >> 6)) as u8; out[o+1] = (0x80 | (cp & 0x3F)) as u8; o = o + 2 }
139 } else {
140 if cp < 0x10000 {
141 if o + 2 < cap { out[o] = (0xE0 | (cp >> 12)) as u8; out[o+1] = (0x80 | ((cp >> 6) & 0x3F)) as u8; out[o+2] = (0x80 | (cp & 0x3F)) as u8; o = o + 3 }
142 } else {
143 if o + 3 < cap { out[o] = (0xF0 | (cp >> 18)) as u8; out[o+1] = (0x80 | ((cp >> 12) & 0x3F)) as u8; out[o+2] = (0x80 | ((cp >> 6) & 0x3F)) as u8; out[o+3] = (0x80 | (cp & 0x3F)) as u8; o = o + 4 }
144 }
145 }
146 }
147 return o
148}
149
150// Fold a Unicode codepoint to a single rendering ASCII byte for the ASCII-only 5x7 font: ASCII passes
151// through; accented Latin (Latin-1 Supplement + common Latin Extended-A/B for cs/pl/tr/ro/sk/hu/...) ->
152// its BASE letter (é->e, ñ->n, ç->c, š->s, ğ->g, ț->t, ...) so language names + accented words are
153// READABLE instead of blank gaps; any other codepoint (Cyrillic/CJK/Arabic) -> 0 = skipped. Returns
154// the ASCII byte, or 0 to emit nothing.
155func _fold_cp(cp: i64) -> i64 {
156 if cp == 0 { return 0 }
157 if cp < 128 { return cp }
158 // Latin-1 Supplement
159 if cp >= 0xC0 { if cp <= 0xC6 { return 65 } } // A
160 if cp == 0xC7 { return 67 } // C
161 if cp >= 0xC8 { if cp <= 0xCB { return 69 } } // E
162 if cp >= 0xCC { if cp <= 0xCF { return 73 } } // I
163 if cp == 0xD0 { return 68 } // D
164 if cp == 0xD1 { return 78 } // N
165 if cp >= 0xD2 { if cp <= 0xD6 { return 79 } } // O
166 if cp == 0xD8 { return 79 } // O
167 if cp >= 0xD9 { if cp <= 0xDC { return 85 } } // U
168 if cp == 0xDD { return 89 } // Y
169 if cp == 0xDF { return 115 } // ß -> s
170 if cp >= 0xE0 { if cp <= 0xE6 { return 97 } } // a
171 if cp == 0xE7 { return 99 } // c
172 if cp >= 0xE8 { if cp <= 0xEB { return 101 } } // e
173 if cp >= 0xEC { if cp <= 0xEF { return 105 } } // i
174 if cp == 0xF0 { return 100 } // d
175 if cp == 0xF1 { return 110 } // n
176 if cp >= 0xF2 { if cp <= 0xF6 { return 111 } } // o
177 if cp == 0xF8 { return 111 } // o
178 if cp >= 0xF9 { if cp <= 0xFC { return 117 } } // u
179 if cp == 0xFD { return 121 } // y
180 if cp == 0xFF { return 121 } // y
181 // Latin Extended-A/B common (upper even / lower odd in most pairs); base letter.
182 if cp == 0x100 { return 65 } if cp == 0x101 { return 97 } // A a (macron)
183 if cp == 0x102 { return 65 } if cp == 0x103 { return 97 } // A a (breve)
184 if cp == 0x104 { return 65 } if cp == 0x105 { return 97 } // A a (ogonek)
185 if cp == 0x106 { return 67 } if cp == 0x107 { return 99 } // C c (acute)
186 if cp == 0x10C { return 67 } if cp == 0x10D { return 99 } // C c (caron)
187 if cp == 0x10E { return 68 } if cp == 0x10F { return 100 } // D d
188 if cp == 0x110 { return 68 } if cp == 0x111 { return 100 } // D d (stroke)
189 if cp == 0x118 { return 69 } if cp == 0x119 { return 101 } // E e (ogonek)
190 if cp == 0x11A { return 69 } if cp == 0x11B { return 101 } // E e (caron)
191 if cp == 0x11E { return 71 } if cp == 0x11F { return 103 } // G g (breve)
192 if cp == 0x130 { return 73 } if cp == 0x131 { return 105 } // I i (dot/dotless)
193 if cp == 0x139 { return 76 } if cp == 0x13A { return 108 } // L l
194 if cp == 0x141 { return 76 } if cp == 0x142 { return 108 } // L l (stroke)
195 if cp == 0x143 { return 78 } if cp == 0x144 { return 110 } // N n (acute)
196 if cp == 0x147 { return 78 } if cp == 0x148 { return 110 } // N n (caron)
197 if cp == 0x150 { return 79 } if cp == 0x151 { return 111 } // O o (double acute)
198 if cp == 0x152 { return 79 } if cp == 0x153 { return 111 } // OE oe -> O o
199 if cp == 0x158 { return 82 } if cp == 0x159 { return 114 } // R r (caron)
200 if cp == 0x15A { return 83 } if cp == 0x15B { return 115 } // S s (acute)
201 if cp == 0x15E { return 83 } if cp == 0x15F { return 115 } // S s (cedilla)
202 if cp == 0x160 { return 83 } if cp == 0x161 { return 115 } // S s (caron)
203 if cp == 0x162 { return 84 } if cp == 0x163 { return 116 } // T t (cedilla)
204 if cp == 0x164 { return 84 } if cp == 0x165 { return 116 } // T t (caron)
205 if cp == 0x16E { return 85 } if cp == 0x16F { return 117 } // U u (ring)
206 if cp == 0x170 { return 85 } if cp == 0x171 { return 117 } // U u (double acute)
207 if cp == 0x178 { return 89 } // Y (diaeresis)
208 if cp == 0x179 { return 90 } if cp == 0x17A { return 122 } // Z z (acute)
209 if cp == 0x17B { return 90 } if cp == 0x17C { return 122 } // Z z (dot)
210 if cp == 0x17D { return 90 } if cp == 0x17E { return 122 } // Z z (caron)
211 if cp == 0x218 { return 83 } if cp == 0x219 { return 115 } // S s (comma) Romanian
212 if cp == 0x21A { return 84 } if cp == 0x21B { return 116 } // T t (comma) Romanian
213 // Typographic punctuation + common symbols -> single ASCII fallback so — · ’
214 // › … arrows etc. render as SOMETHING readable in the 5x7 ASCII font instead of
215 // vanishing to blank gaps (the sub-0xC0 and non-Latin punctuation all fell through to skip).
216 if cp == 0xA0 { return 32 } // nbsp -> space
217 if cp == 0xA1 { return 33 } // inverted !
218 if cp == 0xAB { return 60 } // << -> <
219 if cp == 0xB7 { return 42 } // middot -> *
220 if cp == 0xBB { return 62 } // >> -> >
221 if cp == 0xBF { return 63 } // inverted ?
222 if cp == 0xD7 { return 120 } // times -> x
223 if cp == 0xF7 { return 47 } // divide -> /
224 if cp == 0x2013 { return 45 } // en-dash -> -
225 if cp == 0x2014 { return 45 } // em-dash -> -
226 if cp == 0x2018 { return 39 } // ' -> '
227 if cp == 0x2019 { return 39 } // ' -> '
228 if cp == 0x201A { return 44 } // low quote -> ,
229 if cp == 0x201C { return 34 } // " -> "
230 if cp == 0x201D { return 34 } // " -> "
231 if cp == 0x2022 { return 42 } // bullet -> *
232 if cp == 0x2026 { return 46 } // ellipsis -> .
233 if cp == 0x2039 { return 60 } // single << -> <
234 if cp == 0x203A { return 62 } // single >> -> >
235 if cp == 0x2190 { return 60 } // left arrow -> <
236 if cp == 0x2191 { return 94 } // up arrow -> ^
237 if cp == 0x2192 { return 62 } // right arrow -> >
238 if cp == 0x2193 { return 118 } // down arrow -> v
239 if cp == 0x2194 { return 45 } // left-right arrow -> -
240 if cp == 0x2260 { return 33 } // not-equal -> !
241 if cp == 0x2264 { return 60 } // <= -> <
242 if cp == 0x2265 { return 62 } // >= -> >
243 return 0 // non-Latin -> skip
244}
245
246// UTF-8 decode src[off..off+len) and fold each codepoint to a render-ready ASCII byte (see _fold_cp).
247// Output is ASCII (the 5x7 font's domain); non-Latin runs collapse to nothing instead of byte-gaps.
248func nx_fold_ascii(src: *u8, off: i64, len: i64, out: *u8, out_cap: i64) -> i64 {
249 var i: i64 = 0
250 var o: i64 = 0
251 while i < len {
252 let c: i64 = src[off + i] & 0xff
253 var cp: i64 = c
254 var adv: i64 = 1
255 if c >= 0x80 {
256 if c < 0xE0 {
257 if i + 1 < len { cp = ((c & 0x1F) << 6) | (src[off+i+1] & 0x3F); adv = 2 }
258 } else {
259 if c < 0xF0 {
260 if i + 2 < len { cp = ((c & 0x0F) << 12) | ((src[off+i+1] & 0x3F) << 6) | (src[off+i+2] & 0x3F); adv = 3 }
261 } else {
262 if i + 3 < len { cp = ((c & 0x07) << 18) | ((src[off+i+1] & 0x3F) << 12) | ((src[off+i+2] & 0x3F) << 6) | (src[off+i+3] & 0x3F); adv = 4 }
263 }
264 }
265 }
266 let a: i64 = _fold_cp(cp)
267 if a > 0 { if o < out_cap { out[o] = a as u8; o = o + 1 } }
268 i = i + adv
269 }
270 return o
271}
272
273// Decode HTML character references in src[off..off+len) into out (out_cap bytes); returns decoded
274// byte length. Named refs via nx_html_entity_lookup, numeric &#dec; / &#xHEX;, output as UTF-8.
275// Unknown name / no terminating ';' within bound -> the '&' passes through LITERALLY (scan resumes
276// after it, so "&bogus;" and a bare "&" survive un-eaten). out_cap should be >= len (output <= input
277// since every entity is >=4 source bytes and encodes to <=4 UTF-8 bytes). The reusable render-side
278// twin of the engine's je_decode_entities (DRY across the text-render + JS-DOM paths).
279func nx_html_decode_entities(src: *u8, off: i64, len: i64, out: *u8, out_cap: i64) -> i64 {
280 let cpp: *i64 = (sys_mmap(8)) as *i64
281 var i: i64 = 0
282 var o: i64 = 0
283 while i < len {
284 let c: i64 = src[off + i] & 0xff
285 if c != 38 {
286 if o < out_cap { out[o] = c as u8; o = o + 1 }
287 i = i + 1
288 } else {
289 var semi: i64 = 0 - 1
290 var j: i64 = i + 1
291 let maxj: i64 = i + 12
292 var look: i64 = 1
293 while look == 1 {
294 if j >= len { look = 0 }
295 else {
296 if j > maxj { look = 0 }
297 else {
298 let cj: i64 = src[off + j] & 0xff
299 if cj == 59 { semi = j; look = 0 }
300 else { if cj == 38 { look = 0 } else { j = j + 1 } }
301 }
302 }
303 }
304 if semi < 0 {
305 if o < out_cap { out[o] = 38 as u8; o = o + 1 }
306 i = i + 1
307 } else {
308 let body_off: i64 = off + i + 1
309 let body_len: i64 = semi - (i + 1)
310 var cp: i64 = 0 - 1
311 if body_len >= 1 {
312 if (src[body_off] & 0xff) == 35 {
313 if body_len >= 2 {
314 let c1: i64 = src[body_off + 1] & 0xff
315 var base: i64 = 10
316 var ks: i64 = 1
317 if c1 == 120 { base = 16; ks = 2 }
318 if c1 == 88 { base = 16; ks = 2 }
319 var val: i64 = 0
320 var k: i64 = ks
321 var good: i64 = 1
322 while k < body_len {
323 let d: i64 = src[body_off + k] & 0xff
324 var dv: i64 = 0 - 1
325 if d >= 48 { if d <= 57 { dv = d - 48 } }
326 if base == 16 {
327 if d >= 97 { if d <= 102 { dv = d - 87 } }
328 if d >= 65 { if d <= 70 { dv = d - 55 } }
329 }
330 if dv < 0 { good = 0; k = body_len }
331 else { val = val * base + dv; k = k + 1 }
332 }
333 if good == 1 { if body_len > ks { cp = val } }
334 }
335 } else {
336 if nx_html_entity_lookup(((src as i64) + body_off) as *u8, body_len, cpp) == 1 { cp = cpp[0] }
337 }
338 }
339 if cp >= 0 {
340 o = _ent_utf8(out, o, out_cap, cp)
341 i = semi + 1
342 } else {
343 if o < out_cap { out[o] = 38 as u8; o = o + 1 }
344 i = i + 1
345 }
346 }
347 }
348 }
349 return o
350}