@fleetagent/pi-tui 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -7
- package/dist/autocomplete.d.ts +17 -23
- package/dist/autocomplete.d.ts.map +1 -1
- package/dist/autocomplete.js +129 -195
- package/dist/autocomplete.js.map +1 -1
- package/dist/components/alt-screen-flash.d.ts +13 -0
- package/dist/components/alt-screen-flash.d.ts.map +1 -0
- package/dist/components/alt-screen-flash.js +37 -0
- package/dist/components/alt-screen-flash.js.map +1 -0
- package/dist/components/editor.d.ts +47 -4
- package/dist/components/editor.d.ts.map +1 -1
- package/dist/components/editor.js +615 -585
- package/dist/components/editor.js.map +1 -1
- package/dist/components/h-stack.d.ts +7 -0
- package/dist/components/h-stack.d.ts.map +1 -0
- package/dist/components/h-stack.js +43 -0
- package/dist/components/h-stack.js.map +1 -0
- package/dist/components/image.d.ts +4 -0
- package/dist/components/image.d.ts.map +1 -1
- package/dist/components/image.js +38 -51
- package/dist/components/image.js.map +1 -1
- package/dist/components/input.d.ts +9 -0
- package/dist/components/input.d.ts.map +1 -1
- package/dist/components/input.js +121 -147
- package/dist/components/input.js.map +1 -1
- package/dist/components/markdown.d.ts +34 -0
- package/dist/components/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +491 -429
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/scroll-view.d.ts +53 -0
- package/dist/components/scroll-view.d.ts.map +1 -0
- package/dist/components/scroll-view.js +173 -0
- package/dist/components/scroll-view.js.map +1 -0
- package/dist/components/select-list.d.ts.map +1 -1
- package/dist/components/select-list.js.map +1 -1
- package/dist/components/settings-list.d.ts +2 -0
- package/dist/components/settings-list.d.ts.map +1 -1
- package/dist/components/settings-list.js +31 -29
- package/dist/components/settings-list.js.map +1 -1
- package/dist/components/stack.d.ts +32 -0
- package/dist/components/stack.d.ts.map +1 -0
- package/dist/components/stack.js +122 -0
- package/dist/components/stack.js.map +1 -0
- package/dist/components/v-stack.d.ts +8 -0
- package/dist/components/v-stack.d.ts.map +1 -0
- package/dist/components/v-stack.js +27 -0
- package/dist/components/v-stack.js.map +1 -0
- package/dist/fuzzy.d.ts.map +1 -1
- package/dist/fuzzy.js +37 -46
- package/dist/fuzzy.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/keybindings.d.ts +54 -4
- package/dist/keybindings.d.ts.map +1 -1
- package/dist/keybindings.js +39 -4
- package/dist/keybindings.js.map +1 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +359 -479
- package/dist/keys.js.map +1 -1
- package/dist/kill-ring.d.ts +6 -4
- package/dist/kill-ring.d.ts.map +1 -1
- package/dist/kill-ring.js +0 -7
- package/dist/kill-ring.js.map +1 -1
- package/dist/latex.d.ts +10 -0
- package/dist/latex.d.ts.map +1 -0
- package/dist/latex.js +1406 -0
- package/dist/latex.js.map +1 -0
- package/dist/layout-node.d.ts +43 -0
- package/dist/layout-node.d.ts.map +1 -0
- package/dist/layout-node.js +6 -0
- package/dist/layout-node.js.map +1 -0
- package/dist/layout.d.ts +40 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +386 -0
- package/dist/layout.js.map +1 -0
- package/dist/stdin-buffer.d.ts +8 -0
- package/dist/stdin-buffer.d.ts.map +1 -1
- package/dist/stdin-buffer.js +116 -159
- package/dist/stdin-buffer.js.map +1 -1
- package/dist/terminal-image.d.ts +41 -19
- package/dist/terminal-image.d.ts.map +1 -1
- package/dist/terminal-image.js +171 -32
- package/dist/terminal-image.js.map +1 -1
- package/dist/terminal.d.ts +3 -0
- package/dist/terminal.d.ts.map +1 -1
- package/dist/terminal.js +27 -23
- package/dist/terminal.js.map +1 -1
- package/dist/tui-alt-screen.d.ts +114 -0
- package/dist/tui-alt-screen.d.ts.map +1 -0
- package/dist/tui-alt-screen.js +950 -0
- package/dist/tui-alt-screen.js.map +1 -0
- package/dist/tui-main-screen.d.ts +52 -0
- package/dist/tui-main-screen.d.ts.map +1 -0
- package/dist/tui-main-screen.js +511 -0
- package/dist/tui-main-screen.js.map +1 -0
- package/dist/tui.d.ts +112 -44
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +489 -699
- package/dist/tui.js.map +1 -1
- package/dist/utils.d.ts +29 -17
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +605 -528
- package/dist/utils.js.map +1 -1
- package/dist/word-navigation.d.ts.map +1 -1
- package/dist/word-navigation.js +37 -39
- package/dist/word-navigation.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latex.js","sourceRoot":"","sources":["../src/latex.ts"],"names":[],"mappings":"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","sourcesContent":["import { visibleWidth } from \"./utils.ts\";\n\nconst SYMBOLS: Readonly<Record<string, string>> = {\n\talpha: \"α\",\n\tbeta: \"β\",\n\tgamma: \"γ\",\n\tdelta: \"δ\",\n\tepsilon: \"ϵ\",\n\tvarepsilon: \"ε\",\n\tzeta: \"ζ\",\n\teta: \"η\",\n\ttheta: \"θ\",\n\tvartheta: \"ϑ\",\n\tiota: \"ι\",\n\tkappa: \"κ\",\n\tvarkappa: \"ϰ\",\n\tlambda: \"λ\",\n\tmu: \"μ\",\n\tnu: \"ν\",\n\txi: \"ξ\",\n\tpi: \"π\",\n\tvarpi: \"ϖ\",\n\trho: \"ρ\",\n\tvarrho: \"ϱ\",\n\tsigma: \"σ\",\n\tvarsigma: \"ς\",\n\ttau: \"τ\",\n\tupsilon: \"υ\",\n\tphi: \"ϕ\",\n\tvarphi: \"φ\",\n\tchi: \"χ\",\n\tpsi: \"ψ\",\n\tomega: \"ω\",\n\tGamma: \"Γ\",\n\tDelta: \"Δ\",\n\tTheta: \"Θ\",\n\tLambda: \"Λ\",\n\tXi: \"Ξ\",\n\tPi: \"Π\",\n\tSigma: \"Σ\",\n\tUpsilon: \"Υ\",\n\tPhi: \"Φ\",\n\tPsi: \"Ψ\",\n\tOmega: \"Ω\",\n\tpm: \"±\",\n\tmp: \"∓\",\n\ttimes: \"×\",\n\tdiv: \"÷\",\n\tcdot: \"·\",\n\tast: \"∗\",\n\tstar: \"⋆\",\n\tcirc: \"∘\",\n\tbullet: \"•\",\n\toplus: \"⊕\",\n\tominus: \"⊖\",\n\totimes: \"⊗\",\n\toslash: \"⊘\",\n\todot: \"⊙\",\n\tbigcirc: \"○\",\n\tdagger: \"†\",\n\tddagger: \"‡\",\n\tamalg: \"⨿\",\n\tuplus: \"⊎\",\n\tsqcap: \"⊓\",\n\tsqcup: \"⊔\",\n\ttriangleleft: \"◁\",\n\ttriangleright: \"▷\",\n\twr: \"≀\",\n\tcap: \"∩\",\n\tcup: \"∪\",\n\tbigcap: \"⋂\",\n\tbigcup: \"⋃\",\n\tbigwedge: \"⋀\",\n\tbigvee: \"⋁\",\n\tbigsqcup: \"⨆\",\n\tbiguplus: \"⨄\",\n\tbigoplus: \"⨁\",\n\tbigotimes: \"⨂\",\n\tbigodot: \"⨀\",\n\tsetminus: \"∖\",\n\tin: \"∈\",\n\tnotin: \"∉\",\n\tni: \"∋\",\n\tsubset: \"⊂\",\n\tsupset: \"⊃\",\n\tsubseteq: \"⊆\",\n\tsupseteq: \"⊇\",\n\tsqsubset: \"⊏\",\n\tsqsupset: \"⊐\",\n\tsqsubseteq: \"⊑\",\n\tsqsupseteq: \"⊒\",\n\tprec: \"≺\",\n\tpreceq: \"≼\",\n\tsucc: \"≻\",\n\tsucceq: \"≽\",\n\tll: \"≪\",\n\tgg: \"≫\",\n\tle: \"≤\",\n\tleq: \"≤\",\n\tleqslant: \"≤\",\n\tge: \"≥\",\n\tgeq: \"≥\",\n\tgeqslant: \"≥\",\n\tne: \"≠\",\n\tneq: \"≠\",\n\tequiv: \"≡\",\n\tapprox: \"≈\",\n\tsim: \"∼\",\n\tsimeq: \"≃\",\n\tcong: \"≅\",\n\tasymp: \"≍\",\n\tdoteq: \"≐\",\n\tpropto: \"∝\",\n\tparallel: \"∥\",\n\tperp: \"⊥\",\n\tmid: \"∣\",\n\tvdash: \"⊢\",\n\tdashv: \"⊣\",\n\tmodels: \"⊨\",\n\tVdash: \"⊩\",\n\tVvdash: \"⊪\",\n\tnvdash: \"⊬\",\n\tnvDash: \"⊭\",\n\tforall: \"∀\",\n\texists: \"∃\",\n\tnexists: \"∄\",\n\tneg: \"¬\",\n\tland: \"∧\",\n\twedge: \"∧\",\n\tlor: \"∨\",\n\tvee: \"∨\",\n\tto: \"→\",\n\trightarrow: \"→\",\n\tlongrightarrow: \"→\",\n\tleftarrow: \"←\",\n\tlongleftarrow: \"←\",\n\tgets: \"←\",\n\tleftrightarrow: \"↔\",\n\tlongleftrightarrow: \"↔\",\n\thookleftarrow: \"↩\",\n\thookrightarrow: \"↪\",\n\ttwoheadleftarrow: \"↞\",\n\ttwoheadrightarrow: \"↠\",\n\tleftharpoonup: \"↼\",\n\tleftharpoondown: \"↽\",\n\trightharpoonup: \"⇀\",\n\trightharpoondown: \"⇁\",\n\trightleftharpoons: \"⇌\",\n\tleftrightharpoons: \"⇋\",\n\tnearrow: \"↗\",\n\tsearrow: \"↘\",\n\tswarrow: \"↙\",\n\tnwarrow: \"↖\",\n\trightsquigarrow: \"⇝\",\n\tleadsto: \"⇝\",\n\tRightarrow: \"⇒\",\n\tLongrightarrow: \"⇒\",\n\tLeftarrow: \"⇐\",\n\tLongleftarrow: \"⇐\",\n\tLeftrightarrow: \"⇔\",\n\tLongleftrightarrow: \"⇔\",\n\timplies: \"⇒\",\n\tiff: \"⇔\",\n\tmapsto: \"↦\",\n\tlongmapsto: \"↦\",\n\tuparrow: \"↑\",\n\tdownarrow: \"↓\",\n\tpartial: \"∂\",\n\tnabla: \"∇\",\n\tint: \"∫\",\n\tiint: \"∬\",\n\tiiint: \"∭\",\n\toint: \"∮\",\n\tsum: \"∑\",\n\tprod: \"∏\",\n\tcoprod: \"∐\",\n\tinfty: \"∞\",\n\temptyset: \"∅\",\n\tvarnothing: \"∅\",\n\tangle: \"∠\",\n\ttherefore: \"∴\",\n\tbecause: \"∵\",\n\taleph: \"ℵ\",\n\tbeth: \"ℶ\",\n\tgimel: \"ℷ\",\n\tdaleth: \"ℸ\",\n\ttop: \"⊤\",\n\tbot: \"⊥\",\n\ttriangle: \"△\",\n\tsquare: \"□\",\n\tlozenge: \"◊\",\n\tcheckmark: \"✓\",\n\tcomplement: \"∁\",\n\twp: \"℘\",\n\tprime: \"′\",\n\tldots: \"…\",\n\tdots: \"…\",\n\tcdots: \"⋯\",\n\tvdots: \"⋮\",\n\tddots: \"⋱\",\n\tell: \"ℓ\",\n\thbar: \"ℏ\",\n\tIm: \"ℑ\",\n\tRe: \"ℜ\",\n\tlangle: \"⟨\",\n\trangle: \"⟩\",\n\tvert: \"|\",\n\tlvert: \"|\",\n\trvert: \"|\",\n\tVert: \"‖\",\n\tlVert: \"‖\",\n\trVert: \"‖\",\n\tlbrace: \"{\",\n\trbrace: \"}\",\n\tbackslash: \"\\\\\",\n\tlfloor: \"⌊\",\n\trfloor: \"⌋\",\n\tlceil: \"⌈\",\n\trceil: \"⌉\",\n\tcolon: \":\",\n};\n\nconst NAMED_OPERATORS = new Set([\n\t\"arccos\",\n\t\"arcsin\",\n\t\"arctan\",\n\t\"arg\",\n\t\"cos\",\n\t\"cosh\",\n\t\"cot\",\n\t\"coth\",\n\t\"csc\",\n\t\"deg\",\n\t\"det\",\n\t\"dim\",\n\t\"exp\",\n\t\"gcd\",\n\t\"hom\",\n\t\"inf\",\n\t\"ker\",\n\t\"lg\",\n\t\"lim\",\n\t\"liminf\",\n\t\"limsup\",\n\t\"ln\",\n\t\"log\",\n\t\"max\",\n\t\"min\",\n\t\"Pr\",\n\t\"sec\",\n\t\"sin\",\n\t\"sinh\",\n\t\"sup\",\n\t\"tan\",\n\t\"tanh\",\n]);\n\nconst LIMIT_OPERATORS = new Set([\n\t\"argmax\",\n\t\"argmin\",\n\t\"inf\",\n\t\"injlim\",\n\t\"lim\",\n\t\"liminf\",\n\t\"limsup\",\n\t\"max\",\n\t\"min\",\n\t\"projlim\",\n\t\"sup\",\n]);\n\nconst DISPLAY_LIMIT_SYMBOLS = new Set([\n\t\"bigcap\",\n\t\"bigcup\",\n\t\"bigodot\",\n\t\"bigoplus\",\n\t\"bigotimes\",\n\t\"bigsqcup\",\n\t\"biguplus\",\n\t\"bigvee\",\n\t\"bigwedge\",\n\t\"coprod\",\n\t\"int\",\n\t\"iint\",\n\t\"iiint\",\n\t\"oint\",\n\t\"prod\",\n\t\"sum\",\n]);\n\nconst RELATION_COMMANDS = new Set([\n\t\"Leftarrow\",\n\t\"Leftrightarrow\",\n\t\"Longleftarrow\",\n\t\"Longleftrightarrow\",\n\t\"Longrightarrow\",\n\t\"Rightarrow\",\n\t\"Vdash\",\n\t\"Vvdash\",\n\t\"approx\",\n\t\"asymp\",\n\t\"cong\",\n\t\"dashv\",\n\t\"doteq\",\n\t\"downarrow\",\n\t\"equiv\",\n\t\"ge\",\n\t\"geq\",\n\t\"geqslant\",\n\t\"gets\",\n\t\"gg\",\n\t\"hookleftarrow\",\n\t\"hookrightarrow\",\n\t\"iff\",\n\t\"implies\",\n\t\"in\",\n\t\"leadsto\",\n\t\"le\",\n\t\"leftarrow\",\n\t\"leftharpoondown\",\n\t\"leftharpoonup\",\n\t\"leftrightarrow\",\n\t\"leftrightharpoons\",\n\t\"leq\",\n\t\"leqslant\",\n\t\"ll\",\n\t\"longleftarrow\",\n\t\"longleftrightarrow\",\n\t\"longmapsto\",\n\t\"longrightarrow\",\n\t\"mapsto\",\n\t\"mid\",\n\t\"models\",\n\t\"ne\",\n\t\"nearrow\",\n\t\"neq\",\n\t\"ni\",\n\t\"notin\",\n\t\"nvdash\",\n\t\"nvDash\",\n\t\"nwarrow\",\n\t\"parallel\",\n\t\"perp\",\n\t\"prec\",\n\t\"preceq\",\n\t\"propto\",\n\t\"rightharpoondown\",\n\t\"rightharpoonup\",\n\t\"rightleftharpoons\",\n\t\"rightarrow\",\n\t\"rightsquigarrow\",\n\t\"searrow\",\n\t\"sim\",\n\t\"simeq\",\n\t\"sqsubset\",\n\t\"sqsubseteq\",\n\t\"sqsupset\",\n\t\"sqsupseteq\",\n\t\"subset\",\n\t\"subseteq\",\n\t\"succ\",\n\t\"succeq\",\n\t\"supset\",\n\t\"supseteq\",\n\t\"swarrow\",\n\t\"to\",\n\t\"triangleleft\",\n\t\"triangleright\",\n\t\"twoheadleftarrow\",\n\t\"twoheadrightarrow\",\n\t\"uparrow\",\n\t\"vdash\",\n]);\n\nconst NEGATED_SYMBOLS: Readonly<Record<string, string>> = {\n\t\"<\": \"≮\",\n\t\">\": \"≯\",\n\t\"=\": \"≠\",\n\t\"∈\": \"∉\",\n\t\"∋\": \"∌\",\n\t\"∣\": \"∤\",\n\t\"∥\": \"∦\",\n\t\"∼\": \"≁\",\n\t\"≃\": \"≄\",\n\t\"≅\": \"≇\",\n\t\"≈\": \"≉\",\n\t\"≡\": \"≢\",\n\t\"≤\": \"≰\",\n\t\"≥\": \"≱\",\n\t\"≺\": \"⊀\",\n\t\"≻\": \"⊁\",\n\t\"⊂\": \"⊄\",\n\t\"⊃\": \"⊅\",\n\t\"⊆\": \"⊈\",\n\t\"⊇\": \"⊉\",\n\t\"⊢\": \"⊬\",\n\t\"⊨\": \"⊭\",\n\t\"↔\": \"↮\",\n\t\"←\": \"↚\",\n\t\"→\": \"↛\",\n\t\"⇒\": \"⇏\",\n\t\"⇐\": \"⇍\",\n\t\"⇔\": \"⇎\",\n\t\"≼\": \"⋠\",\n\t\"≽\": \"⋡\",\n};\n\nconst BLACKBOARD: Readonly<Record<string, string>> = {\n\tC: \"ℂ\",\n\tH: \"ℍ\",\n\tN: \"ℕ\",\n\tP: \"ℙ\",\n\tQ: \"ℚ\",\n\tR: \"ℝ\",\n\tZ: \"ℤ\",\n};\n\nconst SUPERSCRIPTS: Readonly<Record<string, string>> = {\n\t\"0\": \"⁰\",\n\t\"1\": \"¹\",\n\t\"2\": \"²\",\n\t\"3\": \"³\",\n\t\"4\": \"⁴\",\n\t\"5\": \"⁵\",\n\t\"6\": \"⁶\",\n\t\"7\": \"⁷\",\n\t\"8\": \"⁸\",\n\t\"9\": \"⁹\",\n\t\"+\": \"⁺\",\n\t\"-\": \"⁻\",\n\t\"=\": \"⁼\",\n\t\"(\": \"⁽\",\n\t\")\": \"⁾\",\n\ta: \"ᵃ\",\n\tb: \"ᵇ\",\n\tc: \"ᶜ\",\n\td: \"ᵈ\",\n\te: \"ᵉ\",\n\tf: \"ᶠ\",\n\tg: \"ᵍ\",\n\th: \"ʰ\",\n\ti: \"ⁱ\",\n\tj: \"ʲ\",\n\tk: \"ᵏ\",\n\tl: \"ˡ\",\n\tm: \"ᵐ\",\n\tn: \"ⁿ\",\n\to: \"ᵒ\",\n\tp: \"ᵖ\",\n\tr: \"ʳ\",\n\ts: \"ˢ\",\n\tt: \"ᵗ\",\n\tu: \"ᵘ\",\n\tv: \"ᵛ\",\n\tw: \"ʷ\",\n\tx: \"ˣ\",\n\ty: \"ʸ\",\n\tz: \"ᶻ\",\n};\n\nconst SUBSCRIPTS: Readonly<Record<string, string>> = {\n\t\"0\": \"₀\",\n\t\"1\": \"₁\",\n\t\"2\": \"₂\",\n\t\"3\": \"₃\",\n\t\"4\": \"₄\",\n\t\"5\": \"₅\",\n\t\"6\": \"₆\",\n\t\"7\": \"₇\",\n\t\"8\": \"₈\",\n\t\"9\": \"₉\",\n\t\"+\": \"₊\",\n\t\"-\": \"₋\",\n\t\"=\": \"₌\",\n\t\"(\": \"₍\",\n\t\")\": \"₎\",\n\ta: \"ₐ\",\n\te: \"ₑ\",\n\th: \"ₕ\",\n\ti: \"ᵢ\",\n\tj: \"ⱼ\",\n\tk: \"ₖ\",\n\tl: \"ₗ\",\n\tm: \"ₘ\",\n\tn: \"ₙ\",\n\to: \"ₒ\",\n\tp: \"ₚ\",\n\tr: \"ᵣ\",\n\ts: \"ₛ\",\n\tt: \"ₜ\",\n\tu: \"ᵤ\",\n\tv: \"ᵥ\",\n\tx: \"ₓ\",\n};\n\nconst SPACING_COMMANDS = new Set([\n\t\",\",\n\t\":\",\n\t\";\",\n\t\" \",\n\t\">\",\n\t\"enspace\",\n\t\"enskip\",\n\t\"medspace\",\n\t\"quad\",\n\t\"qquad\",\n\t\"thickspace\",\n\t\"thinspace\",\n]);\nconst NEGATIVE_SPACING_COMMANDS = new Set([\"!\", \"negmedspace\", \"negthickspace\", \"negthinspace\"]);\nconst NEGATIVE_SPACE = \"\\u0000\";\nconst IGNORED_COMMANDS = new Set([\n\t\"displaystyle\",\n\t\"limits\",\n\t\"nolimits\",\n\t\"scriptstyle\",\n\t\"scriptscriptstyle\",\n\t\"textstyle\",\n]);\nconst SIZE_COMMANDS = new Set([\n\t\"big\",\n\t\"Big\",\n\t\"bigg\",\n\t\"Bigg\",\n\t\"bigl\",\n\t\"Bigl\",\n\t\"biggl\",\n\t\"Biggl\",\n\t\"bigr\",\n\t\"Bigr\",\n\t\"biggr\",\n\t\"Biggr\",\n]);\nconst LITERAL_COMMANDS = new Set([\"{\", \"}\", \"$\", \"%\", \"#\", \"_\", \"&\"]);\nconst DELIMITER_COMMANDS = new Set([\"left\", \"middle\", \"right\"]);\nconst PLAIN_WRAPPERS = new Set([\n\t\"emph\",\n\t\"mathcal\",\n\t\"mathbf\",\n\t\"mathfrak\",\n\t\"mathit\",\n\t\"mathrm\",\n\t\"mathnormal\",\n\t\"mathscr\",\n\t\"mathsf\",\n\t\"mathtt\",\n\t\"mathup\",\n\t\"mbox\",\n\t\"overbrace\",\n\t\"pmb\",\n\t\"smash\",\n\t\"substack\",\n\t\"text\",\n\t\"textbf\",\n\t\"textit\",\n\t\"textmd\",\n\t\"textnormal\",\n\t\"textrm\",\n\t\"textsc\",\n\t\"textsf\",\n\t\"textsl\",\n\t\"texttt\",\n\t\"textup\",\n\t\"underbrace\",\n\t\"bm\",\n\t\"boldsymbol\",\n]);\nconst ACCENTS: Readonly<Record<string, string>> = {\n\tacute: \"\\u0301\",\n\tbar: \"\\u0305\",\n\tbreve: \"\\u0306\",\n\tcheck: \"\\u030c\",\n\tddot: \"\\u0308\",\n\tdot: \"\\u0307\",\n\tgrave: \"\\u0300\",\n\that: \"\\u0302\",\n\tmathring: \"\\u030a\",\n\toverleftarrow: \"\\u20d6\",\n\toverleftrightarrow: \"\\u20e1\",\n\toverline: \"\\u0305\",\n\toverrightarrow: \"\\u20d7\",\n\ttilde: \"\\u0303\",\n\tunderline: \"\\u0332\",\n\tvec: \"\\u20d7\",\n\twidehat: \"\\u0302\",\n\twidetilde: \"\\u0303\",\n};\n\ntype MathScriptKind = \"sub\" | \"sup\";\ntype OperatorScriptMarker = \"_\" | \"^\";\ntype InlineOperatorLowerStyle = \"bracket\" | \"script\";\n\nfunction replaceCharacters(value: string, replacements: Readonly<Record<string, string>>): string | undefined {\n\tlet result = \"\";\n\tfor (const character of value) {\n\t\tconst replacement = replacements[character];\n\t\tif (replacement === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tresult += replacement;\n\t}\n\treturn result;\n}\n\nfunction formatScript(value: string, kind: MathScriptKind): string {\n\tvalue = value.trim();\n\tconst replacements = kind === \"sub\" ? SUBSCRIPTS : SUPERSCRIPTS;\n\tconst unicode = replaceCharacters(value.replace(/\\s*([=+-])\\s*/g, \"$1\"), replacements);\n\tif (unicode !== undefined) {\n\t\treturn unicode;\n\t}\n\n\tconst prefix = kind === \"sub\" ? \"_\" : \"^\";\n\tif (Array.from(value).length === 1 || (kind === \"sub\" && /^[A-Za-z]+$/.test(value))) {\n\t\treturn `${prefix}${value}`;\n\t}\n\treturn `${prefix}(${value})`;\n}\n\nfunction formatFraction(numerator: string, denominator: string): string {\n\tnumerator = numerator.trim();\n\tdenominator = denominator.trim();\n\tconst simpleNumerator = /^[\\p{L}\\p{N}.]+$/u.test(numerator);\n\tconst simpleDenominator = /^[\\p{N}.]+$/u.test(denominator) || Array.from(denominator).length === 1;\n\treturn `${simpleNumerator ? numerator : `(${numerator})`}/${simpleDenominator ? denominator : `(${denominator})`}`;\n}\n\nfunction formatRoot(value: string, symbol = \"√\"): string {\n\tvalue = value.trim();\n\treturn /^[\\p{L}\\p{N}.]+$/u.test(value) ? `${symbol}${value}` : `${symbol}(${value})`;\n}\n\nconst NAMED_OPERATOR_START = \"\\u{f0004}\";\nconst NAMED_OPERATOR_END = \"\\u{f0005}\";\nconst NAMED_OPERATOR_LEFT_SPACING_PATTERN = /(?<=[\\p{L}\\p{N})\\]}\\u{f0001}])\\u{f0004}/gu;\nconst NAMED_OPERATOR_RIGHT_SPACING_PATTERN = /\\u{f0005}(?=[\\p{L}\\p{N}√\\u{f0000}])/gu;\n\nfunction normalizeOutput(value: string): string {\n\treturn value\n\t\t.replace(NAMED_OPERATOR_LEFT_SPACING_PATTERN, \" \")\n\t\t.replaceAll(NAMED_OPERATOR_START, \"\")\n\t\t.replace(NAMED_OPERATOR_RIGHT_SPACING_PATTERN, \" \")\n\t\t.replaceAll(NAMED_OPERATOR_END, \"\")\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.replace(/[ \\t]+/g, \" \").trim())\n\t\t.filter((line, index, lines) => line.length > 0 || (index > 0 && index < lines.length - 1))\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\ninterface FractionNode {\n\ttype: \"fraction\";\n\tnumerator: string;\n\tdenominator: string;\n}\n\ninterface OperatorNode {\n\ttype: \"operator\";\n\toperator: string;\n\tlower?: string;\n\tupper?: string;\n}\n\ninterface ParsedOperatorScripts {\n\tlower?: string;\n\tupper?: string;\n}\n\ninterface MatrixNode {\n\ttype: \"matrix\";\n\tlines: string[];\n\tbaseline: number;\n}\n\ntype LayoutNode = FractionNode | OperatorNode | MatrixNode;\n\ninterface Layout {\n\tlines: string[];\n\twidth: number;\n\tbaseline: number;\n}\n\nconst LAYOUT_MARKER_START = \"\\u{f0000}\";\nconst LAYOUT_MARKER_END = \"\\u{f0001}\";\nconst LAYOUT_MARKER_PATTERN = /\\u{f0000}(\\d+)\\u{f0001}/gu;\nconst TRAILING_LAYOUT_MARKER_PATTERN = /\\u{f0000}(\\d+)\\u{f0001}$/u;\nconst PROTECTED_SPACE = \"\\u{f0002}\";\nconst RESERVED_MARKER_PATTERN = /[\\u{f0000}\\u{f0001}\\u{f0002}\\u{f0004}\\u{f0005}]/u;\nconst MAX_SOURCE_LENGTH = 16 * 1024;\nconst MAX_NESTING_DEPTH = 64;\nconst MAX_LAYOUT_NODES = 256;\nconst MAX_RENDERED_ROWS = 200;\nconst MAX_RENDERED_LINE_WIDTH = 4096;\n\ninterface LatexParseState {\n\tnestingDepth: number;\n}\n\ntype LatexSequenceCharacterKind =\n\t| \"end\"\n\t| \"unexpected-close\"\n\t| \"group\"\n\t| \"command\"\n\t| \"script\"\n\t| \"whitespace\"\n\t| \"relation\"\n\t| \"alignment\"\n\t| \"space\"\n\t| \"period\"\n\t| \"literal\";\n\nfunction classifyLatexSequenceCharacter(character: string, endCharacter?: string): LatexSequenceCharacterKind {\n\tif (endCharacter && character === endCharacter) return \"end\";\n\tswitch (character) {\n\t\tcase \"}\":\n\t\t\treturn \"unexpected-close\";\n\t\tcase \"{\":\n\t\t\treturn \"group\";\n\t\tcase \"\\\\\":\n\t\t\treturn \"command\";\n\t\tcase \"^\":\n\t\tcase \"_\":\n\t\t\treturn \"script\";\n\t\tcase \"=\":\n\t\tcase \"<\":\n\t\tcase \">\":\n\t\t\treturn \"relation\";\n\t\tcase \"&\":\n\t\t\treturn \"alignment\";\n\t\tcase \"~\":\n\t\t\treturn \"space\";\n\t\tcase \".\":\n\t\t\treturn \"period\";\n\t\tdefault:\n\t\t\treturn /\\s/.test(character) ? \"whitespace\" : \"literal\";\n\t}\n}\n\nfunction assertLayoutBounds(width: number, rowCount: number): void {\n\tif (\n\t\t!Number.isSafeInteger(width) ||\n\t\twidth < 0 ||\n\t\twidth > MAX_RENDERED_LINE_WIDTH ||\n\t\t!Number.isSafeInteger(rowCount) ||\n\t\trowCount < 0 ||\n\t\trowCount > MAX_RENDERED_ROWS\n\t) {\n\t\tthrow new RangeError(\"LaTeX layout exceeds renderer bounds\");\n\t}\n}\n\nfunction padLayoutLine(line: string, width: number, centered = false): string {\n\tconst padding = Math.max(0, width - visibleWidth(line));\n\tconst left = centered ? Math.floor(padding / 2) : 0;\n\treturn `${\" \".repeat(left)}${line}${\" \".repeat(padding - left)}`;\n}\n\n// pi-ignore noExcessiveCollectionIterations: Every output row must concatenate every layout segment; rows are capped at 200 and parsed layout nodes at 256.\nfunction joinLayouts(layouts: readonly Layout[]): Layout {\n\tif (layouts.length === 0) {\n\t\treturn { lines: [\"\"], width: 0, baseline: 0 };\n\t}\n\tconst baseline = Math.max(...layouts.map((layout) => layout.baseline));\n\tconst below = Math.max(...layouts.map((layout) => layout.lines.length - layout.baseline - 1));\n\tconst width = layouts.reduce((total, layout) => total + layout.width, 0);\n\tconst rowCount = baseline + below + 1;\n\tassertLayoutBounds(width, rowCount);\n\tconst lines: string[] = [];\n\tfor (let row = 0; row < rowCount; row++) {\n\t\tlet line = \"\";\n\t\tfor (const layout of layouts) {\n\t\t\tconst sourceRow = row - baseline + layout.baseline;\n\t\t\tline +=\n\t\t\t\tsourceRow >= 0 && sourceRow < layout.lines.length\n\t\t\t\t\t? padLayoutLine(layout.lines[sourceRow] ?? \"\", layout.width)\n\t\t\t\t\t: \" \".repeat(layout.width);\n\t\t}\n\t\tlines.push(line.trimEnd());\n\t}\n\treturn { lines, width, baseline };\n}\n\nfunction createTextLayout(text: string): Layout {\n\treturn { lines: [text], width: visibleWidth(text), baseline: 0 };\n}\n\nfunction createInterNodeTextLayout(source: string, previousNode: LayoutNode | undefined, nextNode: LayoutNode): Layout {\n\tconst trimmed = (previousNode ? source.trimStart() : source).trimEnd();\n\tconst preserveLeadingSpace = previousNode?.type === \"matrix\" && /^\\s/.test(source);\n\tconst preserveTrailingSpace = nextNode.type === \"matrix\" && /\\s$/.test(source);\n\tconst text = trimmed\n\t\t? `${preserveLeadingSpace ? \" \" : \"\"}${trimmed}${preserveTrailingSpace ? \" \" : \"\"}`\n\t\t: preserveLeadingSpace || preserveTrailingSpace\n\t\t\t? \" \"\n\t\t\t: \"\";\n\treturn createTextLayout(text);\n}\n\nfunction createTrailingTextLayout(source: string, previousNode: LayoutNode | undefined): Layout {\n\tconst trimmed = previousNode ? source.trimStart() : source;\n\tconst text = previousNode?.type === \"matrix\" && /^\\s/.test(source) ? ` ${trimmed}` : trimmed;\n\treturn createTextLayout(text);\n}\n\nfunction renderFractionNodeLayout(node: FractionNode, nodes: readonly LayoutNode[]): Layout {\n\tconst numerator = renderLayout(node.numerator, nodes);\n\tconst denominator = renderLayout(node.denominator, nodes);\n\tconst contentWidth = Math.max(numerator.width, denominator.width, 1);\n\tconst width = contentWidth + 2;\n\tconst lines = [\n\t\t...numerator.lines.map((line) => padLayoutLine(line, width, true)),\n\t\t` ${\"─\".repeat(contentWidth)} `,\n\t\t...denominator.lines.map((line) => padLayoutLine(line, width, true)),\n\t];\n\tassertLayoutBounds(width, lines.length);\n\treturn { lines, width, baseline: numerator.lines.length };\n}\n\nfunction renderOperatorNodeLayout(node: OperatorNode): Layout {\n\tconst contentWidth = Math.max(\n\t\tvisibleWidth(node.operator),\n\t\tnode.lower === undefined ? 0 : visibleWidth(node.lower),\n\t\tnode.upper === undefined ? 0 : visibleWidth(node.upper),\n\t);\n\tconst lines: string[] = [];\n\tif (node.upper !== undefined) lines.push(`${padLayoutLine(node.upper, contentWidth, true)} `);\n\tlines.push(`${padLayoutLine(node.operator, contentWidth, true)} `);\n\tif (node.lower !== undefined) lines.push(`${padLayoutLine(node.lower, contentWidth, true)} `);\n\tassertLayoutBounds(contentWidth + 1, lines.length);\n\treturn { lines, width: contentWidth + 1, baseline: node.upper === undefined ? 0 : 1 };\n}\n\nfunction renderMatrixNodeLayout(node: MatrixNode): Layout {\n\tconst width = Math.max(0, ...node.lines.map((line) => visibleWidth(line)));\n\tassertLayoutBounds(width, node.lines.length);\n\treturn {\n\t\tlines: node.lines.map((line) => padLayoutLine(line, width)),\n\t\twidth,\n\t\tbaseline: node.baseline,\n\t};\n}\n\nfunction renderLayoutNode(node: LayoutNode, nodes: readonly LayoutNode[]): Layout {\n\tswitch (node.type) {\n\t\tcase \"fraction\":\n\t\t\treturn renderFractionNodeLayout(node, nodes);\n\t\tcase \"operator\":\n\t\t\treturn renderOperatorNodeLayout(node);\n\t\tcase \"matrix\":\n\t\t\treturn renderMatrixNodeLayout(node);\n\t}\n}\n\nfunction renderSourceLineLayout(sourceLine: string, nodes: readonly LayoutNode[]): Layout {\n\tconst layouts: Layout[] = [];\n\tlet position = 0;\n\tlet previousNode: LayoutNode | undefined;\n\tfor (const match of sourceLine.matchAll(LAYOUT_MARKER_PATTERN)) {\n\t\tconst index = match.index;\n\t\tconst node = nodes[Number(match[1])];\n\t\tif (!node) continue;\n\t\tif (index > position) {\n\t\t\tlayouts.push(createInterNodeTextLayout(sourceLine.slice(position, index), previousNode, node));\n\t\t}\n\t\tlayouts.push(renderLayoutNode(node, nodes));\n\t\tposition = index + match[0].length;\n\t\tpreviousNode = node;\n\t}\n\tif (position < sourceLine.length) {\n\t\tlayouts.push(createTrailingTextLayout(sourceLine.slice(position), previousNode));\n\t}\n\treturn joinLayouts(layouts);\n}\n\nfunction renderLayout(source: string, nodes: readonly LayoutNode[]): Layout {\n\tconst renderedLines: string[] = [];\n\tlet firstBaseline = 0;\n\tfor (const sourceLine of source.split(\"\\n\")) {\n\t\tconst lineLayout = renderSourceLineLayout(sourceLine, nodes);\n\t\tif (renderedLines.length === 0) firstBaseline = lineLayout.baseline;\n\t\trenderedLines.push(...lineLayout.lines);\n\t\tassertLayoutBounds(0, renderedLines.length);\n\t}\n\tconst width = Math.max(0, ...renderedLines.map((line) => visibleWidth(line)));\n\tassertLayoutBounds(width, renderedLines.length);\n\treturn { lines: renderedLines, width, baseline: firstBaseline };\n}\n\nclass LatexParser {\n\tprivate readonly source: string;\n\tprivate readonly layoutNodes: LayoutNode[];\n\tprivate readonly display: boolean;\n\tprivate readonly state: LatexParseState;\n\tprivate position = 0;\n\tprivate supported = true;\n\tprivate stackFractions = true;\n\n\tconstructor(\n\t\tsource: string,\n\t\tlayoutNodes: LayoutNode[],\n\t\tdisplay: boolean,\n\t\tstate: LatexParseState = { nestingDepth: 0 },\n\t) {\n\t\tthis.source = source;\n\t\tthis.layoutNodes = layoutNodes;\n\t\tthis.display = display;\n\t\tthis.state = state;\n\t}\n\n\trender(): string | undefined {\n\t\tconst rendered = this.parseSequence();\n\t\tif (!this.supported || this.position !== this.source.length) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn normalizeOutput(rendered);\n\t}\n\n\tprivate appendParsedCommand(result: string): string {\n\t\tconst command = this.parseCommand();\n\t\tif (command !== NEGATIVE_SPACE) return result + command;\n\t\tconst trimmed = result.trimEnd();\n\t\treturn trimmed.endsWith(NAMED_OPERATOR_END) ? trimmed.slice(0, -NAMED_OPERATOR_END.length) : trimmed;\n\t}\n\n\tprivate appendParsedScript(result: string, character: string): string {\n\t\tthis.position++;\n\t\tconst trimmed = result.trimEnd();\n\t\tconst script = formatScript(this.parseRequiredArgument(false), character === \"_\" ? \"sub\" : \"sup\");\n\t\treturn trimmed.endsWith(NAMED_OPERATOR_END)\n\t\t\t? `${trimmed.slice(0, -NAMED_OPERATOR_END.length)}${script}${NAMED_OPERATOR_END}`\n\t\t\t: trimmed + script;\n\t}\n\n\tprivate appendPeriod(result: string): string {\n\t\tconst marker = TRAILING_LAYOUT_MARKER_PATTERN.exec(result);\n\t\tconst node = marker ? this.layoutNodes[Number(marker[1])] : undefined;\n\t\tif (node?.type === \"matrix\") {\n\t\t\tconst lastLine = node.lines.length - 1;\n\t\t\tnode.lines[lastLine] = `${node.lines[lastLine] ?? \"\"}.`;\n\t\t\tthis.position++;\n\t\t\treturn result;\n\t\t}\n\t\tthis.position++;\n\t\treturn `${result}.`;\n\t}\n\n\tprivate parseSequence(endCharacter?: string): string {\n\t\tlet result = \"\";\n\t\twhile (this.position < this.source.length) {\n\t\t\tconst character = this.source[this.position];\n\t\t\tswitch (classifyLatexSequenceCharacter(character, endCharacter)) {\n\t\t\t\tcase \"end\":\n\t\t\t\t\tthis.position++;\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"unexpected-close\":\n\t\t\t\t\tthis.supported = false;\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"group\":\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tresult += this.parseNestedSequence(\"}\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"command\":\n\t\t\t\t\tresult = this.appendParsedCommand(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"script\":\n\t\t\t\t\tresult = this.appendParsedScript(result, character);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\tresult += this.parseWhitespace();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"relation\":\n\t\t\t\t\tresult = `${result.trimEnd()} ${character} `;\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"alignment\":\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"space\":\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tresult += \" \";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"period\":\n\t\t\t\t\tresult = this.appendPeriod(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"literal\":\n\t\t\t\t\tresult += character;\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (endCharacter) this.supported = false;\n\t\treturn result;\n\t}\n\n\tprivate parseWhitespace(): string {\n\t\twhile (this.position < this.source.length && /\\s/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\treturn \" \";\n\t}\n\n\tprivate readCommandName(): string | undefined {\n\t\tthis.position++;\n\t\tif (this.position >= this.source.length) {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst first = this.source[this.position] ?? \"\";\n\t\tif (!/[A-Za-z]/.test(first)) {\n\t\t\tthis.position++;\n\t\t\treturn first;\n\t\t}\n\t\tconst start = this.position;\n\t\twhile (this.position < this.source.length && /[A-Za-z]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\treturn this.source.slice(start, this.position);\n\t}\n\n\tprivate parsePredefinedCommand(command: string): string | undefined {\n\t\tif (command === \"\\\\\") return \"\\n\";\n\t\tif (SPACING_COMMANDS.has(command)) return \" \";\n\t\tif (NEGATIVE_SPACING_COMMANDS.has(command)) return NEGATIVE_SPACE;\n\t\tif (IGNORED_COMMANDS.has(command)) return \"\";\n\t\tif (LITERAL_COMMANDS.has(command)) return command;\n\t\tif (command === \"|\") return \"‖\";\n\t\treturn undefined;\n\t}\n\n\tprivate parseNegatedCommand(): string {\n\t\tconst value = this.parseRequiredArgument(false).trim();\n\t\tconst negated = NEGATED_SYMBOLS[value];\n\t\tif (negated !== undefined) return ` ${negated} `;\n\n\t\tconst characters = Array.from(value);\n\t\tif (characters.length === 0) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\treturn ` ${characters[0]}\\u0338${characters.slice(1).join(\"\")} `;\n\t}\n\n\tprivate parseSymbolCommand(command: string): string | undefined {\n\t\tconst symbol = SYMBOLS[command];\n\t\tif (symbol === undefined) return undefined;\n\t\tif (DISPLAY_LIMIT_SYMBOLS.has(command)) return this.parseOperator(symbol, \"script\", true);\n\t\treturn command === \"cdot\" || command === \"times\" || RELATION_COMMANDS.has(command) ? ` ${symbol} ` : symbol;\n\t}\n\n\tprivate parseNamedOrDelimiterCommand(command: string): string | undefined {\n\t\tif (NAMED_OPERATORS.has(command)) return `${NAMED_OPERATOR_START}${command}${NAMED_OPERATOR_END}`;\n\t\tif (SIZE_COMMANDS.has(command)) return \"\";\n\t\tif (!DELIMITER_COMMANDS.has(command)) return undefined;\n\t\tif (this.source[this.position] === \".\") this.position++;\n\t\treturn \"\";\n\t}\n\n\tprivate parseFractionCommand(command: string): string {\n\t\tconst shouldStack = this.display && this.stackFractions && command !== \"tfrac\";\n\t\tconst numerator = this.parseRequiredArgument(!shouldStack);\n\t\tconst denominator = this.parseRequiredArgument(!shouldStack);\n\t\tif (!shouldStack) return formatFraction(numerator, denominator);\n\n\t\tconst index = this.addLayoutNode({\n\t\t\ttype: \"fraction\",\n\t\t\tnumerator: normalizeOutput(numerator),\n\t\t\tdenominator: normalizeOutput(denominator),\n\t\t});\n\t\treturn index === undefined ? \"\" : `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t}\n\n\tprivate parseRootCommand(): string {\n\t\tconst degree = this.parseOptionalArgument()?.trim();\n\t\tconst value = this.parseRequiredArgument();\n\t\tif (degree === undefined || degree === \"2\") return formatRoot(value);\n\t\tif (degree === \"3\") return formatRoot(value, \"∛\");\n\t\tif (degree === \"4\") return formatRoot(value, \"∜\");\n\t\treturn `${formatScript(degree, \"sup\")}${formatRoot(value)}`;\n\t}\n\n\tprivate parseAccentCommand(command: string, accent: string): string {\n\t\tconst value = this.parseRequiredArgument();\n\t\treturn Array.from(value).length === 1 ? `${value}${accent}` : `${command}(${value})`;\n\t}\n\n\tprivate parseOperatorNameCommand(): string {\n\t\tconst starred = this.source[this.position] === \"*\";\n\t\tif (starred) this.position++;\n\t\tconst operator = normalizeOutput(this.parseRequiredArgument()).trim();\n\t\treturn this.parseOperator(operator, \"bracket\", starred, true);\n\t}\n\n\tprivate parseArgumentCommand(command: string): string | undefined {\n\t\tswitch (command) {\n\t\t\tcase \"frac\":\n\t\t\tcase \"dfrac\":\n\t\t\tcase \"tfrac\":\n\t\t\t\treturn this.parseFractionCommand(command);\n\t\t\tcase \"sqrt\":\n\t\t\t\treturn this.parseRootCommand();\n\t\t\tcase \"boxed\":\n\t\t\tcase \"fbox\":\n\t\t\t\treturn `[${this.parseRequiredArgument().trim()}]`;\n\t\t\tcase \"binom\":\n\t\t\tcase \"dbinom\":\n\t\t\tcase \"tbinom\":\n\t\t\t\treturn `(${this.parseRequiredArgument()} choose ${this.parseRequiredArgument()})`;\n\t\t\tcase \"mathbb\": {\n\t\t\t\tconst value = this.parseRequiredArgument();\n\t\t\t\treturn Array.from(value, (character) => BLACKBOARD[character] ?? character).join(\"\");\n\t\t\t}\n\t\t\tcase \"operatorname\":\n\t\t\t\treturn this.parseOperatorNameCommand();\n\t\t\tcase \"mod\":\n\t\t\tcase \"bmod\":\n\t\t\t\treturn \" mod \";\n\t\t\tcase \"pmod\":\n\t\t\tcase \"pod\": {\n\t\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\t\treturn command === \"pmod\" ? ` (mod ${value})` : ` (${value})`;\n\t\t\t}\n\t\t\tcase \"overset\":\n\t\t\tcase \"stackrel\": {\n\t\t\t\tconst upper = this.parseRequiredArgument();\n\t\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\t\treturn `${value}${formatScript(upper, \"sup\")}`;\n\t\t\t}\n\t\t\tcase \"underset\": {\n\t\t\t\tconst lower = this.parseRequiredArgument();\n\t\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\t\treturn `${value}${formatScript(lower, \"sub\")}`;\n\t\t\t}\n\t\t\tcase \"begin\":\n\t\t\t\treturn this.parseEnvironment();\n\t\t\tcase \"end\":\n\t\t\t\tthis.supported = false;\n\t\t\t\treturn \"\";\n\t\t}\n\n\t\tconst accent = ACCENTS[command];\n\t\tif (accent !== undefined) return this.parseAccentCommand(command, accent);\n\t\tif (PLAIN_WRAPPERS.has(command)) {\n\t\t\tconst value = this.parseRequiredArgument();\n\t\t\treturn command.startsWith(\"text\") || command === \"mbox\" ? value : value.trim();\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate parseCommand(): string {\n\t\tconst command = this.readCommandName();\n\t\tif (command === undefined) return \"\";\n\n\t\tconst predefined = this.parsePredefinedCommand(command);\n\t\tif (predefined !== undefined) return predefined;\n\t\tif (command === \"not\") return this.parseNegatedCommand();\n\t\tif (LIMIT_OPERATORS.has(command)) return this.parseOperator(command, \"bracket\", true, true);\n\n\t\tconst symbol = this.parseSymbolCommand(command);\n\t\tif (symbol !== undefined) return symbol;\n\t\tconst namedOrDelimiter = this.parseNamedOrDelimiterCommand(command);\n\t\tif (namedOrDelimiter !== undefined) return namedOrDelimiter;\n\t\tconst argumentCommand = this.parseArgumentCommand(command);\n\t\tif (argumentCommand !== undefined) return argumentCommand;\n\n\t\tthis.supported = false;\n\t\treturn `\\\\${command}`;\n\t}\n\n\tprivate assignOperatorScript(scripts: ParsedOperatorScripts, kind: OperatorScriptMarker, value: string): void {\n\t\tconst property = kind === \"_\" ? \"lower\" : \"upper\";\n\t\tif (scripts[property] !== undefined) this.supported = false;\n\t\tscripts[property] = value;\n\t}\n\n\tprivate parseOperatorDisplayLimits(displayLimits: boolean): boolean {\n\t\tlet modifierPosition = this.position;\n\t\twhile (modifierPosition < this.source.length && /[ \\t]/.test(this.source[modifierPosition] ?? \"\")) {\n\t\t\tmodifierPosition++;\n\t\t}\n\t\tconst modifier = /^\\\\(limits|nolimits)(?![A-Za-z])/.exec(this.source.slice(modifierPosition));\n\t\tif (!modifier) return displayLimits;\n\t\tthis.position = modifierPosition + modifier[0].length;\n\t\treturn modifier[1] === \"limits\";\n\t}\n\n\tprivate parseOperatorScripts(): ParsedOperatorScripts {\n\t\tconst scripts: ParsedOperatorScripts = {};\n\t\twhile (true) {\n\t\t\tlet scriptPosition = this.position;\n\t\t\twhile (scriptPosition < this.source.length && /[ \\t]/.test(this.source[scriptPosition] ?? \"\")) {\n\t\t\t\tscriptPosition++;\n\t\t\t}\n\t\t\tconst kind = this.source[scriptPosition];\n\t\t\tif (kind !== \"_\" && kind !== \"^\") break;\n\t\t\tthis.position = scriptPosition + 1;\n\t\t\tconst value = normalizeOutput(this.parseRequiredArgument(false)).replaceAll(\" \", \"\");\n\t\t\tthis.assignOperatorScript(scripts, kind, value);\n\t\t}\n\t\treturn scripts;\n\t}\n\n\tprivate parseOperator(\n\t\toperator: string,\n\t\tinlineLowerStyle: InlineOperatorLowerStyle,\n\t\tdisplayLimits: boolean,\n\t\tspaced = false,\n\t): string {\n\t\tconst useDisplayLimits = this.parseOperatorDisplayLimits(displayLimits);\n\t\tconst { lower, upper } = this.parseOperatorScripts();\n\t\tif (this.display && useDisplayLimits && (lower !== undefined || upper !== undefined)) {\n\t\t\tconst index = this.addLayoutNode({ type: \"operator\", operator, lower, upper });\n\t\t\treturn index === undefined ? \"\" : `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t\t}\n\n\t\tlet rendered = operator;\n\t\tif (lower !== undefined) {\n\t\t\trendered += inlineLowerStyle === \"bracket\" ? `[${lower}]` : formatScript(lower, \"sub\");\n\t\t}\n\t\tif (upper !== undefined) rendered += formatScript(upper, \"sup\");\n\t\treturn spaced ? ` ${rendered} ` : rendered;\n\t}\n\n\tprivate parseRequiredArgument(stackFractions = true): string {\n\t\tconst previousStackFractions = this.stackFractions;\n\t\tthis.stackFractions = previousStackFractions && stackFractions;\n\t\tconst value = this.parseRequiredArgumentValue();\n\t\tthis.stackFractions = previousStackFractions;\n\t\treturn value;\n\t}\n\n\tprivate parseRequiredArgumentValue(): string {\n\t\twhile (this.position < this.source.length && /[ \\t]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.position >= this.source.length) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tif (this.source[this.position] === \"{\") {\n\t\t\tthis.position++;\n\t\t\treturn this.parseNestedSequence(\"}\");\n\t\t}\n\t\tif (this.source[this.position] === \"\\\\\") {\n\t\t\treturn this.parseCommand();\n\t\t}\n\t\tconst value = this.source[this.position] ?? \"\";\n\t\tthis.position++;\n\t\treturn value;\n\t}\n\n\tprivate parseOptionalArgument(): string | undefined {\n\t\twhile (this.position < this.source.length && /[ \\t]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.source[this.position] !== \"[\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst end = this.source.indexOf(\"]\", this.position + 1);\n\t\tif (end < 0) {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.source.slice(this.position + 1, end);\n\t\tthis.position = end + 1;\n\t\treturn this.renderNested(value);\n\t}\n\n\tprivate readRawGroupContents(start: number): string | undefined {\n\t\tlet depth = 1;\n\t\twhile (this.position < this.source.length) {\n\t\t\tconst character = this.source[this.position];\n\t\t\tif (character === \"\\\\\") {\n\t\t\t\tthis.position += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (character === \"{\") {\n\t\t\t\tdepth++;\n\t\t\t\tif (this.state.nestingDepth + depth > MAX_NESTING_DEPTH) {\n\t\t\t\t\tthis.supported = false;\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tthis.position++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (character !== \"}\") {\n\t\t\t\tthis.position++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdepth--;\n\t\t\tif (depth > 0) {\n\t\t\t\tthis.position++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst value = this.source.slice(start, this.position);\n\t\t\tthis.position++;\n\t\t\treturn value;\n\t\t}\n\t\tthis.supported = false;\n\t\treturn undefined;\n\t}\n\n\tprivate readRawGroup(): string | undefined {\n\t\twhile (this.position < this.source.length && /[ \\t]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.source[this.position] !== \"{\") {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst start = ++this.position;\n\t\tif (this.state.nestingDepth + 1 > MAX_NESTING_DEPTH) {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.readRawGroupContents(start);\n\t}\n\n\tprivate splitEnvironmentRows(body: string): string[] {\n\t\treturn body.split(/\\\\\\\\(?:\\[[^\\]\\n]*\\])?/);\n\t}\n\n\tprivate parseEnvironment(): string {\n\t\tconst environment = this.readRawGroup();\n\t\tif (!environment) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst endMarker = `\\\\end{${environment}}`;\n\t\tconst end = this.source.indexOf(endMarker, this.position);\n\t\tif (end < 0) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tconst body = this.source.slice(this.position, end);\n\t\tthis.position = end + endMarker.length;\n\n\t\tif (environment === \"equation\" || environment === \"equation*\" || environment === \"displaymath\") {\n\t\t\treturn this.renderNested(body).trim();\n\t\t}\n\n\t\tif (\n\t\t\tenvironment === \"aligned\" ||\n\t\t\tenvironment === \"align\" ||\n\t\t\tenvironment === \"align*\" ||\n\t\t\tenvironment === \"alignedat\" ||\n\t\t\tenvironment === \"alignat\" ||\n\t\t\tenvironment === \"alignat*\" ||\n\t\t\tenvironment === \"gather\" ||\n\t\t\tenvironment === \"gathered\" ||\n\t\t\tenvironment === \"multline\" ||\n\t\t\tenvironment === \"multline*\" ||\n\t\t\tenvironment === \"split\"\n\t\t) {\n\t\t\tconst alignedAt = [\"alignedat\", \"alignat\", \"alignat*\"].includes(environment);\n\t\t\tconst alignedBody = alignedAt ? body.replace(/^\\s*\\{[^}]*\\}/, \"\") : body;\n\t\t\treturn this.splitEnvironmentRows(alignedBody)\n\t\t\t\t.map((row) => {\n\t\t\t\t\tconst cells = row.split(\"&\");\n\t\t\t\t\tconst source = alignedAt\n\t\t\t\t\t\t? Array.from({ length: Math.ceil(cells.length / 2) }, (_, index) =>\n\t\t\t\t\t\t\t\tcells.slice(index * 2, index * 2 + 2).join(\"\"),\n\t\t\t\t\t\t\t).join(\" \")\n\t\t\t\t\t\t: cells.join(\"\");\n\t\t\t\t\treturn this.renderNested(source).trim();\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tif (environment === \"cases\" || environment === \"cases*\") {\n\t\t\tconst rows = this.splitEnvironmentRows(body)\n\t\t\t\t.map((row) => row.split(\"&\").map((cell) => this.renderNested(cell, false).trim()))\n\t\t\t\t.filter((row) => row.some(Boolean));\n\t\t\treturn rows\n\t\t\t\t.map((row, index) => {\n\t\t\t\t\tconst value = (row[0] ?? \"\").replace(/,\\s*$/, \"\");\n\t\t\t\t\tconst condition = row[1] ?? \"\";\n\t\t\t\t\tconst delimiter = index === 0 ? \"⎧\" : index === rows.length - 1 ? \"⎩\" : \"⎨\";\n\t\t\t\t\tconst conditionPrefix = /^(?:if|when|for|otherwise)\\b/i.test(condition) ? \" \" : \" if \";\n\t\t\t\t\treturn `${delimiter} ${value}${condition ? `${conditionPrefix}${condition}` : \"\"}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tif (\n\t\t\t[\"array\", \"matrix\", \"smallmatrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\"].includes(environment)\n\t\t) {\n\t\t\tconst matrixBody = environment === \"array\" ? body.replace(/^\\s*\\{[^}]*\\}/, \"\") : body;\n\t\t\treturn this.renderMatrix(environment, matrixBody);\n\t\t}\n\n\t\tthis.supported = false;\n\t\treturn body;\n\t}\n\n\tprivate renderMatrix(environment: string, body: string): string {\n\t\tconst sourceRows = this.splitEnvironmentRows(body).map((row) => row.split(\"&\"));\n\t\tconst sourceColumnCount = Math.max(0, ...sourceRows.map((row) => row.length));\n\t\tif (sourceRows.length > MAX_RENDERED_ROWS || sourceRows.length * sourceColumnCount > MAX_LAYOUT_NODES) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tconst matrix = sourceRows\n\t\t\t.map((row) => row.map((cell) => this.renderNested(cell, false).trim()))\n\t\t\t.filter((row) => row.some(Boolean));\n\t\tconst columnCount = Math.max(0, ...matrix.map((row) => row.length));\n\t\tconst columnWidths = Array.from({ length: columnCount }, (_, column) =>\n\t\t\tMath.max(0, ...matrix.map((row) => visibleWidth(row[column] ?? \"\"))),\n\t\t);\n\t\tconst rows = matrix.map((row) =>\n\t\t\tArray.from({ length: columnCount }, (_, column) => {\n\t\t\t\tconst cell = row[column] ?? \"\";\n\t\t\t\treturn `${cell}${PROTECTED_SPACE.repeat(Math.max(0, (columnWidths[column] ?? 0) - visibleWidth(cell)))}`;\n\t\t\t}).join(\" │ \"),\n\t\t);\n\t\tlet lines: string[];\n\t\tif (environment === \"array\" || environment === \"matrix\" || environment === \"smallmatrix\") {\n\t\t\tlines = rows;\n\t\t} else {\n\t\t\tconst delimiters: Readonly<Record<string, readonly [string, string, string, string, string, string]>> = {\n\t\t\t\tpmatrix: [\"⎛\", \"⎞\", \"⎜\", \"⎟\", \"⎝\", \"⎠\"],\n\t\t\t\tbmatrix: [\"⎡\", \"⎤\", \"⎢\", \"⎥\", \"⎣\", \"⎦\"],\n\t\t\t\tBmatrix: [\"⎧\", \"⎫\", \"⎨\", \"⎬\", \"⎩\", \"⎭\"],\n\t\t\t\tvmatrix: [\"│\", \"│\", \"│\", \"│\", \"│\", \"│\"],\n\t\t\t\tVmatrix: [\"║\", \"║\", \"║\", \"║\", \"║\", \"║\"],\n\t\t\t};\n\t\t\tconst delimiter = delimiters[environment];\n\t\t\tif (!delimiter) {\n\t\t\t\tthis.supported = false;\n\t\t\t\treturn rows.join(\"\\n\");\n\t\t\t}\n\t\t\tlines = rows.map((row, index) => {\n\t\t\t\tconst left = index === 0 ? delimiter[0] : index === rows.length - 1 ? delimiter[4] : delimiter[2];\n\t\t\t\tconst right = index === 0 ? delimiter[1] : index === rows.length - 1 ? delimiter[5] : delimiter[3];\n\t\t\t\treturn `${left} ${row} ${right}`;\n\t\t\t});\n\t\t}\n\n\t\tif (lines.length <= 1) {\n\t\t\treturn lines[0] ?? \"\";\n\t\t}\n\t\tconst index = this.addLayoutNode({ type: \"matrix\", lines, baseline: 0 });\n\t\treturn index === undefined ? \"\" : `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t}\n\n\tprivate addLayoutNode(node: LayoutNode): number | undefined {\n\t\tif (this.layoutNodes.length >= MAX_LAYOUT_NODES) {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.layoutNodes.push(node) - 1;\n\t}\n\n\tprivate parseNestedSequence(endCharacter: string): string {\n\t\tif (this.state.nestingDepth >= MAX_NESTING_DEPTH) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tthis.state.nestingDepth++;\n\t\ttry {\n\t\t\treturn this.parseSequence(endCharacter);\n\t\t} finally {\n\t\t\tthis.state.nestingDepth--;\n\t\t}\n\t}\n\n\tprivate renderNested(source: string, stackFractions = true): string {\n\t\tif (this.state.nestingDepth >= MAX_NESTING_DEPTH) {\n\t\t\tthis.supported = false;\n\t\t\treturn source;\n\t\t}\n\t\tthis.state.nestingDepth++;\n\t\tlet rendered: string | undefined;\n\t\ttry {\n\t\t\trendered = new LatexParser(source, this.layoutNodes, this.display && stackFractions, this.state).render();\n\t\t} finally {\n\t\t\tthis.state.nestingDepth--;\n\t\t}\n\t\tif (rendered === undefined) {\n\t\t\tthis.supported = false;\n\t\t\treturn source;\n\t\t}\n\t\treturn rendered;\n\t}\n}\n\nexport interface RenderLatexOptions {\n\t/** Stack fractions and operator limits vertically for display math (default: false). */\n\tdisplay?: boolean;\n}\n\n/**\n * Render a basic LaTeX math expression as terminal-friendly Unicode text.\n * Returns undefined when the expression contains unsupported or malformed syntax.\n */\nexport function renderLatex(source: string, options: RenderLatexOptions = {}): string | undefined {\n\tif (source.length > MAX_SOURCE_LENGTH || RESERVED_MARKER_PATTERN.test(source)) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst layoutNodes: LayoutNode[] = [];\n\t\tconst rendered = new LatexParser(source, layoutNodes, options.display === true).render();\n\t\tif (rendered === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet result: string;\n\t\tif (layoutNodes.length === 0) {\n\t\t\tresult = rendered.replaceAll(PROTECTED_SPACE, \" \");\n\t\t} else {\n\t\t\tconst lines = renderLayout(rendered, layoutNodes).lines;\n\t\t\tconst indentation = Math.min(\n\t\t\t\t...lines.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length),\n\t\t\t);\n\t\t\tresult = lines\n\t\t\t\t.map((line) => line.slice(indentation).trimEnd())\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trimEnd()\n\t\t\t\t.replaceAll(PROTECTED_SPACE, \" \");\n\t\t}\n\n\t\tconst resultLines = result.split(\"\\n\");\n\t\tif (\n\t\t\tresultLines.length > MAX_RENDERED_ROWS ||\n\t\t\tresultLines.some((line) => visibleWidth(line) > MAX_RENDERED_LINE_WIDTH)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn result;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Component } from "./tui.ts";
|
|
2
|
+
export declare const LAYOUT_NODE: unique symbol;
|
|
3
|
+
export interface LayoutViewport {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
export interface StackLayoutEntry {
|
|
8
|
+
component: Component;
|
|
9
|
+
basis?: number | "auto";
|
|
10
|
+
grow?: number;
|
|
11
|
+
shrink?: number;
|
|
12
|
+
minSize?: number;
|
|
13
|
+
maxSize?: number;
|
|
14
|
+
visible?: (viewport: LayoutViewport) => boolean;
|
|
15
|
+
}
|
|
16
|
+
export type StackAlignment = "stretch" | "start" | "center" | "end";
|
|
17
|
+
export type StackLayoutType = "vstack" | "hstack";
|
|
18
|
+
export type ScrollViewOverscrollBehavior = "chain" | "contain";
|
|
19
|
+
export interface StackLayoutNode {
|
|
20
|
+
type: StackLayoutType;
|
|
21
|
+
entries: readonly StackLayoutEntry[];
|
|
22
|
+
gap: number;
|
|
23
|
+
align: StackAlignment;
|
|
24
|
+
}
|
|
25
|
+
export interface ScrollLayoutState {
|
|
26
|
+
readonly scrollTop: number;
|
|
27
|
+
readonly primary: boolean;
|
|
28
|
+
readonly overscroll: ScrollViewOverscrollBehavior;
|
|
29
|
+
readonly viewportHeight: number;
|
|
30
|
+
getContentWidth(width: number): number;
|
|
31
|
+
updateLayout(contentHeight: number, viewportHeight: number, requestRender: () => void): void;
|
|
32
|
+
}
|
|
33
|
+
export interface ScrollLayoutNode {
|
|
34
|
+
type: "scroll";
|
|
35
|
+
component: Component;
|
|
36
|
+
state: ScrollLayoutState;
|
|
37
|
+
}
|
|
38
|
+
export type LayoutNode = StackLayoutNode | ScrollLayoutNode;
|
|
39
|
+
export interface LayoutComponent extends Component {
|
|
40
|
+
[LAYOUT_NODE](): LayoutNode;
|
|
41
|
+
}
|
|
42
|
+
export declare function getLayoutNode(component: Component): LayoutNode | undefined;
|
|
43
|
+
//# sourceMappingURL=layout-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-node.d.ts","sourceRoot":"","sources":["../src/layout-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,eAAO,MAAM,WAAW,eAA+C,CAAC;AAGxE,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC;CAChD;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,4BAA4B,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC7F;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE5D,MAAM,WAAW,eAAgB,SAAQ,SAAS;IACjD,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAG1E","sourcesContent":["import type { Component } from \"./tui.ts\";\n\nexport const LAYOUT_NODE = Symbol.for(\"@fleetagent/pi-tui/layout-node\");\n\n// pi-ignore noNearIdenticalDataStructures: TUI layout viewport constraints and image pixel dimensions evolve independently.\nexport interface LayoutViewport {\n\twidth: number;\n\theight: number;\n}\n\nexport interface StackLayoutEntry {\n\tcomponent: Component;\n\tbasis?: number | \"auto\";\n\tgrow?: number;\n\tshrink?: number;\n\tminSize?: number;\n\tmaxSize?: number;\n\tvisible?: (viewport: LayoutViewport) => boolean;\n}\n\nexport type StackAlignment = \"stretch\" | \"start\" | \"center\" | \"end\";\nexport type StackLayoutType = \"vstack\" | \"hstack\";\nexport type ScrollViewOverscrollBehavior = \"chain\" | \"contain\";\n\nexport interface StackLayoutNode {\n\ttype: StackLayoutType;\n\tentries: readonly StackLayoutEntry[];\n\tgap: number;\n\talign: StackAlignment;\n}\n\nexport interface ScrollLayoutState {\n\treadonly scrollTop: number;\n\treadonly primary: boolean;\n\treadonly overscroll: ScrollViewOverscrollBehavior;\n\treadonly viewportHeight: number;\n\tgetContentWidth(width: number): number;\n\tupdateLayout(contentHeight: number, viewportHeight: number, requestRender: () => void): void;\n}\n\nexport interface ScrollLayoutNode {\n\ttype: \"scroll\";\n\tcomponent: Component;\n\tstate: ScrollLayoutState;\n}\n\nexport type LayoutNode = StackLayoutNode | ScrollLayoutNode;\n\nexport interface LayoutComponent extends Component {\n\t[LAYOUT_NODE](): LayoutNode;\n}\n\nexport function getLayoutNode(component: Component): LayoutNode | undefined {\n\tconst candidate = component as Partial<LayoutComponent>;\n\treturn typeof candidate[LAYOUT_NODE] === \"function\" ? candidate[LAYOUT_NODE]() : undefined;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const LAYOUT_NODE = Symbol.for("@fleetagent/pi-tui/layout-node");
|
|
2
|
+
export function getLayoutNode(component) {
|
|
3
|
+
const candidate = component;
|
|
4
|
+
return typeof candidate[LAYOUT_NODE] === "function" ? candidate[LAYOUT_NODE]() : undefined;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=layout-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-node.js","sourceRoot":"","sources":["../src/layout-node.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAkDxE,MAAM,UAAU,aAAa,CAAC,SAAoB,EAA0B;IAC3E,MAAM,SAAS,GAAG,SAAqC,CAAC;IACxD,OAAO,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC3F","sourcesContent":["import type { Component } from \"./tui.ts\";\n\nexport const LAYOUT_NODE = Symbol.for(\"@fleetagent/pi-tui/layout-node\");\n\n// pi-ignore noNearIdenticalDataStructures: TUI layout viewport constraints and image pixel dimensions evolve independently.\nexport interface LayoutViewport {\n\twidth: number;\n\theight: number;\n}\n\nexport interface StackLayoutEntry {\n\tcomponent: Component;\n\tbasis?: number | \"auto\";\n\tgrow?: number;\n\tshrink?: number;\n\tminSize?: number;\n\tmaxSize?: number;\n\tvisible?: (viewport: LayoutViewport) => boolean;\n}\n\nexport type StackAlignment = \"stretch\" | \"start\" | \"center\" | \"end\";\nexport type StackLayoutType = \"vstack\" | \"hstack\";\nexport type ScrollViewOverscrollBehavior = \"chain\" | \"contain\";\n\nexport interface StackLayoutNode {\n\ttype: StackLayoutType;\n\tentries: readonly StackLayoutEntry[];\n\tgap: number;\n\talign: StackAlignment;\n}\n\nexport interface ScrollLayoutState {\n\treadonly scrollTop: number;\n\treadonly primary: boolean;\n\treadonly overscroll: ScrollViewOverscrollBehavior;\n\treadonly viewportHeight: number;\n\tgetContentWidth(width: number): number;\n\tupdateLayout(contentHeight: number, viewportHeight: number, requestRender: () => void): void;\n}\n\nexport interface ScrollLayoutNode {\n\ttype: \"scroll\";\n\tcomponent: Component;\n\tstate: ScrollLayoutState;\n}\n\nexport type LayoutNode = StackLayoutNode | ScrollLayoutNode;\n\nexport interface LayoutComponent extends Component {\n\t[LAYOUT_NODE](): LayoutNode;\n}\n\nexport function getLayoutNode(component: Component): LayoutNode | undefined {\n\tconst candidate = component as Partial<LayoutComponent>;\n\treturn typeof candidate[LAYOUT_NODE] === \"function\" ? candidate[LAYOUT_NODE]() : undefined;\n}\n"]}
|
package/dist/layout.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ScrollView } from "./components/scroll-view.ts";
|
|
2
|
+
import { type Component } from "./tui.ts";
|
|
3
|
+
export interface LayoutRect {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LayoutBox {
|
|
10
|
+
component: Component;
|
|
11
|
+
rect: LayoutRect;
|
|
12
|
+
clip: LayoutRect;
|
|
13
|
+
children: LayoutBox[];
|
|
14
|
+
parent?: LayoutBox;
|
|
15
|
+
lines?: readonly string[];
|
|
16
|
+
lineOffset?: number;
|
|
17
|
+
scrollView?: ScrollView;
|
|
18
|
+
scrollContentLines?: readonly string[];
|
|
19
|
+
layer: number;
|
|
20
|
+
}
|
|
21
|
+
export interface LayoutFrame {
|
|
22
|
+
root: LayoutBox;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
lines: string[];
|
|
26
|
+
primaryScrollView?: ScrollView;
|
|
27
|
+
}
|
|
28
|
+
export interface ScrollbarGeometry {
|
|
29
|
+
column: number;
|
|
30
|
+
trackTop: number;
|
|
31
|
+
trackHeight: number;
|
|
32
|
+
thumbTop: number;
|
|
33
|
+
thumbHeight: number;
|
|
34
|
+
maxScrollTop: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function getScrollbarGeometry(box: LayoutBox): ScrollbarGeometry | undefined;
|
|
37
|
+
export declare function renderLayoutFrame(root: Component, width: number, height: number, requestRender: () => void): LayoutFrame;
|
|
38
|
+
export declare function getScrollViewBox(frame: LayoutFrame, scrollView: ScrollView): LayoutBox | undefined;
|
|
39
|
+
export declare function getScrollViewsAt(frame: LayoutFrame, x: number, y: number): ScrollView[];
|
|
40
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,UAAU,CAAC;AAK3E,MAAM,WAAW,UAAU;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACrB;AA0PD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAwBlF;AA+GD,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,IAAI,GACvB,WAAW,CAwBb;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAUlG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAUvF","sourcesContent":["import type { ScrollView } from \"./components/scroll-view.ts\";\nimport { allocateStackSizes, visibleStackEntries } from \"./components/stack.ts\";\nimport { getLayoutNode, type LayoutViewport, type ScrollLayoutNode, type StackLayoutNode } from \"./layout-node.ts\";\nimport { cropKittyImageLine, getKittyImageMetadata, isImageLine } from \"./terminal-image.ts\";\nimport { type Component, CURSOR_MARKER, compositeTuiLine } from \"./tui.ts\";\nimport { extractAnsiCode, getGraphemeCellRange, sliceByColumn, visibleWidth } from \"./utils.ts\";\n\nconst OSC133_ZONE_PREFIX = /^(?:\\x1b\\]133;[ABC](?:\\x07|\\x1b\\\\))+/;\n\nexport interface LayoutRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\nexport interface LayoutBox {\n\tcomponent: Component;\n\trect: LayoutRect;\n\tclip: LayoutRect;\n\tchildren: LayoutBox[];\n\tparent?: LayoutBox;\n\tlines?: readonly string[];\n\tlineOffset?: number;\n\tscrollView?: ScrollView;\n\tscrollContentLines?: readonly string[];\n\tlayer: number;\n}\n\nexport interface LayoutFrame {\n\troot: LayoutBox;\n\twidth: number;\n\theight: number;\n\tlines: string[];\n\tprimaryScrollView?: ScrollView;\n}\n\nexport interface ScrollbarGeometry {\n\tcolumn: number;\n\ttrackTop: number;\n\ttrackHeight: number;\n\tthumbTop: number;\n\tthumbHeight: number;\n\tmaxScrollTop: number;\n}\n\ninterface LayoutContext {\n\tviewport: LayoutViewport;\n\trenderCache: Map<Component, Map<number, string[]>>;\n\trequestRender: () => void;\n\tprimaryScrollView: ScrollView | undefined;\n}\n\ninterface ScrolledKittyImagePaintRequest {\n\tbox: LayoutBox;\n\tscreen: string[];\n\ttotalWidth: number;\n\tscrollTop: number;\n\timageLine: string;\n\timageRow: number;\n\timageRows: number;\n}\n\nfunction intersect(a: LayoutRect, b: LayoutRect): LayoutRect {\n\tconst x = Math.max(a.x, b.x);\n\tconst y = Math.max(a.y, b.y);\n\tconst right = Math.min(a.x + a.width, b.x + b.width);\n\tconst bottom = Math.min(a.y + a.height, b.y + b.height);\n\treturn { x, y, width: Math.max(0, right - x), height: Math.max(0, bottom - y) };\n}\n\nfunction renderCached(context: LayoutContext, component: Component, width: number): string[] {\n\tconst safeWidth = Math.max(1, Math.floor(width));\n\tlet widths = context.renderCache.get(component);\n\tif (!widths) {\n\t\twidths = new Map<number, string[]>();\n\t\tcontext.renderCache.set(component, widths);\n\t}\n\tlet lines = widths.get(safeWidth);\n\tif (!lines) {\n\t\tlines = component.render(safeWidth);\n\t\twidths.set(safeWidth, lines);\n\t}\n\treturn lines;\n}\n\nfunction measureHeight(context: LayoutContext, component: Component, width: number): number {\n\treturn renderCached(context, component, width).length;\n}\n\nfunction measureWidth(context: LayoutContext, component: Component, width: number): number {\n\treturn renderCached(context, component, width).reduce((max, line) => Math.max(max, visibleWidth(line)), 0);\n}\n\nfunction withParent(box: LayoutBox, parent: LayoutBox): LayoutBox {\n\tbox.parent = parent;\n\treturn box;\n}\n\nfunction translateBox(box: LayoutBox, deltaY: number): void {\n\tbox.rect.y += deltaY;\n\tfor (const child of box.children) translateBox(child, deltaY);\n}\n\nfunction updateClips(box: LayoutBox, parentClip: LayoutRect): void {\n\tbox.clip = intersect(parentClip, box.rect);\n\tfor (const child of box.children) updateClips(child, box.clip);\n}\n\ninterface ComponentLayoutRequest {\n\tcontext: LayoutContext;\n\tcomponent: Component;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number | undefined;\n\tclip: LayoutRect;\n}\n\nfunction layoutLeafComponent(request: ComponentLayoutRequest): LayoutBox {\n\tconst { context, component, x, y, width, height, clip } = request;\n\tconst lines = renderCached(context, component, width);\n\tconst allocatedHeight = height === undefined ? lines.length : Math.max(0, Math.floor(height));\n\tlet lineOffset = 0;\n\tif (lines.length > allocatedHeight && allocatedHeight > 0) {\n\t\tconst cursorLine = lines.findIndex((line) => line.includes(CURSOR_MARKER));\n\t\tif (cursorLine >= allocatedHeight) lineOffset = cursorLine - allocatedHeight + 1;\n\t}\n\treturn {\n\t\tcomponent,\n\t\trect: { x, y, width, height: allocatedHeight },\n\t\tclip: intersect(clip, { x, y, width, height: allocatedHeight }),\n\t\tchildren: [],\n\t\tlines,\n\t\tlineOffset,\n\t\tlayer: 0,\n\t};\n}\n\nfunction layoutScrollComponent(request: ComponentLayoutRequest, node: ScrollLayoutNode): LayoutBox {\n\tconst { context, component, x, y, width, height, clip } = request;\n\tconst previousScrollTop = node.state.scrollTop;\n\tconst contentWidth = node.state.getContentWidth(width);\n\tconst childBox = layoutComponent(context, node.component, x, y - previousScrollTop, contentWidth, undefined, clip);\n\tconst contentHeight = childBox.rect.height;\n\tconst viewportHeight = height === undefined ? contentHeight : Math.max(0, Math.floor(height));\n\tnode.state.updateLayout(contentHeight, viewportHeight, context.requestRender);\n\ttranslateBox(childBox, previousScrollTop - node.state.scrollTop);\n\tconst scrollView = node.state as ScrollView;\n\tif (node.state.primary || !context.primaryScrollView) context.primaryScrollView = scrollView;\n\tconst rect = { x, y, width, height: viewportHeight };\n\tconst childClip = intersect(clip, rect);\n\tconst box: LayoutBox = {\n\t\tcomponent,\n\t\trect,\n\t\tclip: childClip,\n\t\tchildren: [childBox],\n\t\tscrollView,\n\t\tscrollContentLines: renderCached(context, node.component, contentWidth),\n\t\tlayer: 0,\n\t};\n\tchildBox.parent = box;\n\tupdateClips(childBox, childClip);\n\treturn box;\n}\n\nfunction layoutVerticalStack(request: ComponentLayoutRequest, node: StackLayoutNode): LayoutBox {\n\tconst { context, component, x, y, width, height, clip } = request;\n\tconst entries = visibleStackEntries(node.entries, context.viewport);\n\tconst intrinsicHeights = entries.map((entry) =>\n\t\ttypeof entry.basis === \"number\" ? entry.basis : measureHeight(context, entry.component, width),\n\t);\n\tconst sizes = allocateStackSizes(entries, intrinsicHeights, height, node.gap);\n\tconst gapTotal = Math.max(0, entries.length - 1) * node.gap;\n\tconst naturalHeight = sizes.reduce((sum, size) => sum + size, 0) + gapTotal;\n\tconst allocatedHeight = height === undefined ? naturalHeight : Math.max(0, Math.floor(height));\n\tconst rect = { x, y, width, height: allocatedHeight };\n\tconst box: LayoutBox = {\n\t\tcomponent,\n\t\trect,\n\t\tclip: intersect(clip, rect),\n\t\tchildren: [],\n\t\tlayer: 0,\n\t};\n\tlet childY = y;\n\tfor (let index = 0; index < entries.length; index++) {\n\t\tbox.children.push(\n\t\t\twithParent(\n\t\t\t\tlayoutComponent(context, entries[index]!.component, x, childY, width, sizes[index]!, box.clip),\n\t\t\t\tbox,\n\t\t\t),\n\t\t);\n\t\tchildY += sizes[index]! + node.gap;\n\t}\n\treturn box;\n}\n\nfunction layoutHorizontalStack(request: ComponentLayoutRequest, node: StackLayoutNode): LayoutBox {\n\tconst { context, component, x, y, width, height, clip } = request;\n\tconst entries = visibleStackEntries(node.entries, context.viewport);\n\tconst intrinsicWidths = entries.map((entry) =>\n\t\ttypeof entry.basis === \"number\" ? entry.basis : measureWidth(context, entry.component, width),\n\t);\n\tconst widths = allocateStackSizes(entries, intrinsicWidths, width, node.gap);\n\tconst intrinsicHeights = entries.map((entry, index) =>\n\t\tmeasureHeight(context, entry.component, Math.max(1, widths[index]!)),\n\t);\n\tconst allocatedHeight =\n\t\theight === undefined\n\t\t\t? intrinsicHeights.reduce((max, childHeight) => Math.max(max, childHeight), 0)\n\t\t\t: Math.max(0, height);\n\tconst rect = { x, y, width, height: allocatedHeight };\n\tconst box: LayoutBox = {\n\t\tcomponent,\n\t\trect,\n\t\tclip: intersect(clip, rect),\n\t\tchildren: [],\n\t\tlayer: 0,\n\t};\n\tlet childX = x;\n\tfor (let index = 0; index < entries.length; index++) {\n\t\tconst naturalChildHeight = intrinsicHeights[index]!;\n\t\tconst childHeight = node.align === \"stretch\" ? allocatedHeight : Math.min(allocatedHeight, naturalChildHeight);\n\t\tlet childY = y;\n\t\tif (node.align === \"center\") childY += Math.floor((allocatedHeight - childHeight) / 2);\n\t\telse if (node.align === \"end\") childY += allocatedHeight - childHeight;\n\t\tconst childWidth = widths[index]!;\n\t\tif (childWidth === 0) {\n\t\t\tbox.children.push({\n\t\t\t\tcomponent: entries[index]!.component,\n\t\t\t\trect: { x: childX, y: childY, width: 0, height: childHeight },\n\t\t\t\tclip: { x: childX, y: childY, width: 0, height: 0 },\n\t\t\t\tchildren: [],\n\t\t\t\tparent: box,\n\t\t\t\tlayer: 0,\n\t\t\t});\n\t\t} else {\n\t\t\tbox.children.push(\n\t\t\t\twithParent(\n\t\t\t\t\tlayoutComponent(context, entries[index]!.component, childX, childY, childWidth, childHeight, box.clip),\n\t\t\t\t\tbox,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tchildX += childWidth + node.gap;\n\t}\n\treturn box;\n}\n\nfunction layoutComponent(\n\tcontext: LayoutContext,\n\tcomponent: Component,\n\tx: number,\n\ty: number,\n\twidth: number,\n\theight: number | undefined,\n\tclip: LayoutRect,\n): LayoutBox {\n\tconst request = { context, component, x, y, width: Math.max(1, Math.floor(width)), height, clip };\n\tconst node = getLayoutNode(component);\n\tif (!node) return layoutLeafComponent(request);\n\tswitch (node.type) {\n\t\tcase \"scroll\":\n\t\t\treturn layoutScrollComponent(request, node);\n\t\tcase \"vstack\":\n\t\t\treturn layoutVerticalStack(request, node);\n\t\tcase \"hstack\":\n\t\t\treturn layoutHorizontalStack(request, node);\n\t}\n}\n\nfunction styleScrollbarCell(line: string, column: number, totalWidth: number, style: (text: string) => string): string {\n\tif (isImageLine(line)) return line;\n\n\tconst graphemeRange = getGraphemeCellRange(line, column);\n\tconst start = graphemeRange?.start ?? column;\n\tconst end = graphemeRange?.end ?? column + 1;\n\tconst before = sliceByColumn(line, 0, start, true);\n\tconst target = sliceByColumn(line, start, end - start, true);\n\tconst after = sliceByColumn(line, end, Math.max(0, totalWidth - end), true);\n\n\tlet targetPrefix = \"\";\n\tlet targetIndex = 0;\n\twhile (targetIndex < target.length) {\n\t\tconst ansi = extractAnsiCode(target, targetIndex);\n\t\tif (!ansi) break;\n\t\ttargetPrefix += ansi.code;\n\t\ttargetIndex += ansi.length;\n\t}\n\tconst targetText = target.slice(targetIndex) || \" \".repeat(end - start);\n\tconst beforePadding = \" \".repeat(Math.max(0, start - visibleWidth(before)));\n\treturn `${before}${beforePadding}${targetPrefix}${style(targetText)}${after}`;\n}\n\nexport function getScrollbarGeometry(box: LayoutBox): ScrollbarGeometry | undefined {\n\tif (!box.scrollView?.isScrollbarVisible || box.rect.width <= 0 || box.rect.height <= 0) return undefined;\n\n\tconst contentHeight = box.children[0]?.rect.height ?? box.scrollContentLines?.length ?? 0;\n\tconst trackHeight = box.rect.height;\n\tconst minThumbHeight = Math.min(2, trackHeight);\n\tconst thumbHeight = Math.max(\n\t\tminThumbHeight,\n\t\tMath.min(trackHeight, Math.round((trackHeight * trackHeight) / contentHeight)),\n\t);\n\tconst maxScrollTop = Math.max(0, contentHeight - trackHeight);\n\tconst maxThumbTop = trackHeight - thumbHeight;\n\tconst thumbOffset = maxScrollTop === 0 ? 0 : Math.round((box.scrollView.scrollTop / maxScrollTop) * maxThumbTop);\n\tconst column = box.rect.x + box.rect.width - 1;\n\tif (column < box.clip.x || column >= box.clip.x + box.clip.width) return undefined;\n\n\treturn {\n\t\tcolumn,\n\t\ttrackTop: box.rect.y,\n\t\ttrackHeight,\n\t\tthumbTop: box.rect.y + thumbOffset,\n\t\tthumbHeight,\n\t\tmaxScrollTop,\n\t};\n}\n\nfunction paintScrollbar(box: LayoutBox, screen: string[], totalWidth: number): void {\n\tconst geometry = getScrollbarGeometry(box);\n\tif (!geometry || !box.scrollView) return;\n\n\tfor (let offset = 0; offset < geometry.thumbHeight; offset++) {\n\t\tconst row = geometry.thumbTop + offset;\n\t\tif (row < box.clip.y || row >= box.clip.y + box.clip.height || row < 0 || row >= screen.length) continue;\n\t\tscreen[row] = styleScrollbarCell(screen[row] ?? \"\", geometry.column, totalWidth, box.scrollView.scrollbarStyle);\n\t}\n}\n\nfunction boxFillsViewportWidth(box: LayoutBox, totalWidth: number): boolean {\n\treturn box.rect.x === 0 && box.rect.width >= totalWidth && box.clip.x === 0 && box.clip.width >= totalWidth;\n}\n\nfunction cropBoxImageLine(line: string, row: number, box: LayoutBox, screenHeight: number): string {\n\tconst imageMetadata = getKittyImageMetadata(line);\n\tif (!imageMetadata) return line;\n\tconst clipBottom = Math.min(screenHeight, box.clip.y + box.clip.height);\n\tconst visibleRows = Math.min(imageMetadata.rows, clipBottom - row);\n\treturn visibleRows < imageMetadata.rows ? cropKittyImageLine(line, 0, visibleRows) : line;\n}\n\nfunction paintBoxImageLine(box: LayoutBox, screen: string[], row: number, line: string, totalWidth: number): void {\n\tif (boxFillsViewportWidth(box, totalWidth)) {\n\t\tscreen[row] = line;\n\t\treturn;\n\t}\n\tif (box.clip.x !== box.rect.x || box.clip.width !== box.rect.width) return;\n\tscreen[row] = compositeTuiLine(screen[row] ?? \"\", line, box.rect.x, box.rect.width, totalWidth);\n}\n\nfunction paintBoxTextLine(box: LayoutBox, screen: string[], row: number, line: string, totalWidth: number): void {\n\tif (box.clip.width <= 0) return;\n\t// A full-width box painting onto an untouched row can retain the source line\n\t// reference. Recomposition would rebuild the row through ANSI/grapheme\n\t// segmentation on every frame. Keep over-wide sources on the clipping path\n\t// so LayoutFrame rows remain viewport-bounded.\n\tif (boxFillsViewportWidth(box, totalWidth) && !screen[row] && visibleWidth(line) <= totalWidth) {\n\t\tscreen[row] = line;\n\t\treturn;\n\t}\n\tconst sourceStart = Math.max(0, box.clip.x - box.rect.x);\n\tconst clippedLine = sliceByColumn(line, sourceStart, box.clip.width, true);\n\tscreen[row] = compositeTuiLine(screen[row] ?? \"\", clippedLine, box.clip.x, box.clip.width, totalWidth);\n}\n\nfunction paintBoxLine(box: LayoutBox, screen: string[], row: number, sourceLine: string, totalWidth: number): void {\n\tconst line = cropBoxImageLine(sourceLine.replace(OSC133_ZONE_PREFIX, \"\"), row, box, screen.length);\n\tif (isImageLine(line)) {\n\t\tpaintBoxImageLine(box, screen, row, line, totalWidth);\n\t\treturn;\n\t}\n\tpaintBoxTextLine(box, screen, row, line, totalWidth);\n}\n\nfunction paintBoxLines(box: LayoutBox, screen: string[], totalWidth: number): void {\n\tif (!box.lines) return;\n\tconst offset = box.lineOffset ?? 0;\n\tconst firstRow = Math.max(box.rect.y, box.clip.y, 0);\n\tconst lastRow = Math.min(box.rect.y + box.rect.height, box.clip.y + box.clip.height, screen.length);\n\tfor (let row = firstRow; row < lastRow; row++) {\n\t\tconst sourceLine = box.lines[offset + row - box.rect.y];\n\t\tif (sourceLine !== undefined) paintBoxLine(box, screen, row, sourceLine, totalWidth);\n\t}\n}\n\nfunction paintScrolledKittyImagePlacement(request: ScrolledKittyImagePaintRequest): void {\n\tconst { box, screen, totalWidth, scrollTop, imageLine, imageRow, imageRows } = request;\n\tconst targetRow = Math.max(0, box.rect.y, box.clip.y);\n\tconst hiddenRows = scrollTop - imageRow + (targetRow - box.rect.y);\n\tif (hiddenRows >= imageRows) return;\n\tconst clipBottom = Math.min(screen.length, box.rect.y + box.rect.height, box.clip.y + box.clip.height);\n\tconst visibleRows = Math.min(clipBottom - targetRow, imageRows - hiddenRows);\n\tif (visibleRows <= 0) return;\n\tconst cropped = cropKittyImageLine(imageLine, hiddenRows, visibleRows);\n\tif (boxFillsViewportWidth(box, totalWidth)) screen[targetRow] = cropped;\n}\n\nfunction paintScrolledKittyImage(box: LayoutBox, screen: string[], totalWidth: number): void {\n\tconst scrollView = box.scrollView;\n\tconst contentLines = box.scrollContentLines;\n\tif (!scrollView || !contentLines || scrollView.scrollTop <= 0 || box.rect.height <= 0) return;\n\tfor (let imageRow = scrollView.scrollTop - 1; imageRow >= 0; imageRow--) {\n\t\tconst imageLine = contentLines[imageRow] ?? \"\";\n\t\tconst metadata = getKittyImageMetadata(imageLine);\n\t\tif (metadata) {\n\t\t\tpaintScrolledKittyImagePlacement({\n\t\t\t\tbox,\n\t\t\t\tscreen,\n\t\t\t\ttotalWidth,\n\t\t\t\tscrollTop: scrollView.scrollTop,\n\t\t\t\timageLine,\n\t\t\t\timageRow,\n\t\t\t\timageRows: metadata.rows,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (imageLine !== \"\") return;\n\t}\n}\n\nfunction paintBox(box: LayoutBox, screen: string[], totalWidth: number): void {\n\tpaintBoxLines(box, screen, totalWidth);\n\tfor (const child of box.children) paintBox(child, screen, totalWidth);\n\tpaintScrolledKittyImage(box, screen, totalWidth);\n\tpaintScrollbar(box, screen, totalWidth);\n}\n\nexport function renderLayoutFrame(\n\troot: Component,\n\twidth: number,\n\theight: number,\n\trequestRender: () => void,\n): LayoutFrame {\n\tconst safeWidth = Math.max(1, Math.floor(width));\n\tconst safeHeight = Math.max(1, Math.floor(height));\n\tconst context: LayoutContext = {\n\t\tviewport: { width: safeWidth, height: safeHeight },\n\t\trenderCache: new Map(),\n\t\trequestRender,\n\t\tprimaryScrollView: undefined,\n\t};\n\tconst rootBox = layoutComponent(context, root, 0, 0, safeWidth, safeHeight, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: safeWidth,\n\t\theight: safeHeight,\n\t});\n\tconst lines = Array.from({ length: safeHeight }, () => \"\");\n\tpaintBox(rootBox, lines, safeWidth);\n\treturn {\n\t\troot: rootBox,\n\t\twidth: safeWidth,\n\t\theight: safeHeight,\n\t\tlines,\n\t\t...(context.primaryScrollView === undefined ? {} : { primaryScrollView: context.primaryScrollView }),\n\t};\n}\n\nfunction containsPoint(rect: LayoutRect, x: number, y: number): boolean {\n\treturn x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height;\n}\n\nexport function getScrollViewBox(frame: LayoutFrame, scrollView: ScrollView): LayoutBox | undefined {\n\tconst visit = (box: LayoutBox): LayoutBox | undefined => {\n\t\tif (box.scrollView === scrollView) return box;\n\t\tfor (const child of box.children) {\n\t\t\tconst match = visit(child);\n\t\t\tif (match) return match;\n\t\t}\n\t\treturn undefined;\n\t};\n\treturn visit(frame.root);\n}\n\nexport function getScrollViewsAt(frame: LayoutFrame, x: number, y: number): ScrollView[] {\n\tconst result: Array<{ scrollView: ScrollView; depth: number }> = [];\n\tconst visit = (box: LayoutBox, depth: number): void => {\n\t\tif (!containsPoint(box.clip, x, y)) return;\n\t\tif (box.scrollView && containsPoint(box.rect, x, y)) result.push({ scrollView: box.scrollView, depth });\n\t\tfor (const child of box.children) visit(child, depth + 1);\n\t};\n\tvisit(frame.root, 0);\n\tresult.sort((a, b) => b.depth - a.depth);\n\treturn result.map((entry) => entry.scrollView);\n}\n"]}
|