@greppleai/grip-tui 0.0.0-stage → 0.1.3
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 +818 -2
- package/dist/autocomplete.d.ts +48 -0
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +566 -0
- package/dist/autocomplete.js.map +1 -0
- 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/box.d.ts +22 -0
- package/dist/components/box.d.ts.map +1 -0
- package/dist/components/box.js +104 -0
- package/dist/components/box.js.map +1 -0
- package/dist/components/cancellable-loader.d.ts +22 -0
- package/dist/components/cancellable-loader.d.ts.map +1 -0
- package/dist/components/cancellable-loader.js +35 -0
- package/dist/components/cancellable-loader.js.map +1 -0
- package/dist/components/editor.d.ts +292 -0
- package/dist/components/editor.d.ts.map +1 -0
- package/dist/components/editor.js +1887 -0
- package/dist/components/editor.js.map +1 -0
- 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 +32 -0
- package/dist/components/image.d.ts.map +1 -0
- package/dist/components/image.js +76 -0
- package/dist/components/image.js.map +1 -0
- package/dist/components/input.d.ts +46 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +352 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/loader.d.ts +32 -0
- package/dist/components/loader.d.ts.map +1 -0
- package/dist/components/loader.js +80 -0
- package/dist/components/loader.js.map +1 -0
- package/dist/components/markdown.d.ts +132 -0
- package/dist/components/markdown.d.ts.map +1 -0
- package/dist/components/markdown.js +717 -0
- package/dist/components/markdown.js.map +1 -0
- 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 +50 -0
- package/dist/components/select-list.d.ts.map +1 -0
- package/dist/components/select-list.js +159 -0
- package/dist/components/select-list.js.map +1 -0
- package/dist/components/settings-list.d.ts +52 -0
- package/dist/components/settings-list.d.ts.map +1 -0
- package/dist/components/settings-list.js +187 -0
- package/dist/components/settings-list.js.map +1 -0
- package/dist/components/spacer.d.ts +12 -0
- package/dist/components/spacer.d.ts.map +1 -0
- package/dist/components/spacer.js +23 -0
- package/dist/components/spacer.js.map +1 -0
- 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/text.d.ts +19 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +89 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/truncated-text.d.ts +13 -0
- package/dist/components/truncated-text.d.ts.map +1 -0
- package/dist/components/truncated-text.js +51 -0
- package/dist/components/truncated-text.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/editor-component.d.ts +39 -0
- package/dist/editor-component.d.ts.map +1 -0
- package/dist/editor-component.js +2 -0
- package/dist/editor-component.js.map +1 -0
- package/dist/fuzzy.d.ts +16 -0
- package/dist/fuzzy.d.ts.map +1 -0
- package/dist/fuzzy.js +101 -0
- package/dist/fuzzy.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/keybindings.d.ts +243 -0
- package/dist/keybindings.d.ts.map +1 -0
- package/dist/keybindings.js +209 -0
- package/dist/keybindings.js.map +1 -0
- package/dist/keys.d.ts +184 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +1053 -0
- package/dist/keys.js.map +1 -0
- package/dist/kill-ring.d.ts +30 -0
- package/dist/kill-ring.d.ts.map +1 -0
- package/dist/kill-ring.js +37 -0
- package/dist/kill-ring.js.map +1 -0
- 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/native-modifiers.d.ts +3 -0
- package/dist/native-modifiers.d.ts.map +1 -0
- package/dist/native-modifiers.js +53 -0
- package/dist/native-modifiers.js.map +1 -0
- package/dist/stdin-buffer.d.ts +58 -0
- package/dist/stdin-buffer.d.ts.map +1 -0
- package/dist/stdin-buffer.js +318 -0
- package/dist/stdin-buffer.js.map +1 -0
- package/dist/terminal-control.d.ts +5 -0
- package/dist/terminal-control.d.ts.map +1 -0
- package/dist/terminal-control.js +26 -0
- package/dist/terminal-control.js.map +1 -0
- package/dist/terminal-image.d.ts +112 -0
- package/dist/terminal-image.d.ts.map +1 -0
- package/dist/terminal-image.js +508 -0
- package/dist/terminal-image.js.map +1 -0
- package/dist/terminal.d.ts +117 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +490 -0
- package/dist/terminal.js.map +1 -0
- 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 +514 -0
- package/dist/tui-main-screen.js.map +1 -0
- package/dist/tui.d.ts +295 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +868 -0
- package/dist/tui.js.map +1 -0
- package/dist/undo-stack.d.ts +17 -0
- package/dist/undo-stack.d.ts.map +1 -0
- package/dist/undo-stack.js +25 -0
- package/dist/undo-stack.js.map +1 -0
- package/dist/utils.d.ts +96 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +1106 -0
- package/dist/utils.js.map +1 -0
- package/dist/word-navigation.d.ts +25 -0
- package/dist/word-navigation.d.ts.map +1 -0
- package/dist/word-navigation.js +94 -0
- package/dist/word-navigation.js.map +1 -0
- package/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/package.json +47 -5
package/dist/keys.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Keyboard input handling for terminal applications.\n *\n * Supports both legacy terminal sequences and Kitty keyboard protocol.\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n * Reference: https://github.com/sst/opentui/blob/7da92b4088aebfe27b9f691c04163a48821e49fd/packages/core/src/lib/parse.keypress.ts\n *\n * Symbol keys are also supported, however some ctrl+symbol combos\n * overlap with ASCII codes, e.g. ctrl+[ = ESC.\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#legacy-ctrl-mapping-of-ascii-keys\n * Those can still be * used for ctrl+shift combos\n *\n * API:\n * - matchesKey(data, keyId) - Check if input matches a key identifier\n * - parseKey(data) - Parse input and return the key identifier\n * - Key - Helper object for creating typed key identifiers\n * - setKittyProtocolActive(active) - Set global Kitty protocol state\n * - isKittyProtocolActive() - Query global Kitty protocol state\n */\n\n// =============================================================================\n// Global Kitty Protocol State\n// =============================================================================\n\nlet _kittyProtocolActive = false;\n\n/**\n * Set the global Kitty keyboard protocol state.\n * Called by ProcessTerminal after detecting protocol support.\n */\nexport function setKittyProtocolActive(active: boolean): void {\n\t_kittyProtocolActive = active;\n}\n\n/**\n * Query whether Kitty keyboard protocol is currently active.\n */\nexport function isKittyProtocolActive(): boolean {\n\treturn _kittyProtocolActive;\n}\n\n// =============================================================================\n// Type-Safe Key Identifiers\n// =============================================================================\n\ntype Letter =\n\t| \"a\"\n\t| \"b\"\n\t| \"c\"\n\t| \"d\"\n\t| \"e\"\n\t| \"f\"\n\t| \"g\"\n\t| \"h\"\n\t| \"i\"\n\t| \"j\"\n\t| \"k\"\n\t| \"l\"\n\t| \"m\"\n\t| \"n\"\n\t| \"o\"\n\t| \"p\"\n\t| \"q\"\n\t| \"r\"\n\t| \"s\"\n\t| \"t\"\n\t| \"u\"\n\t| \"v\"\n\t| \"w\"\n\t| \"x\"\n\t| \"y\"\n\t| \"z\";\n\ntype Digit = \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\";\n\ntype SymbolKey =\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\t| \"?\";\n\ntype SpecialKey =\n\t| \"escape\"\n\t| \"esc\"\n\t| \"enter\"\n\t| \"return\"\n\t| \"tab\"\n\t| \"space\"\n\t| \"backspace\"\n\t| \"delete\"\n\t| \"insert\"\n\t| \"clear\"\n\t| \"home\"\n\t| \"end\"\n\t| \"pageUp\"\n\t| \"pageDown\"\n\t| \"up\"\n\t| \"down\"\n\t| \"left\"\n\t| \"right\"\n\t| \"f1\"\n\t| \"f2\"\n\t| \"f3\"\n\t| \"f4\"\n\t| \"f5\"\n\t| \"f6\"\n\t| \"f7\"\n\t| \"f8\"\n\t| \"f9\"\n\t| \"f10\"\n\t| \"f11\"\n\t| \"f12\";\n\ntype BaseKey = Letter | Digit | SymbolKey | SpecialKey;\ntype ModifierName = \"ctrl\" | \"shift\" | \"alt\" | \"super\";\n\ntype ModifiedKeyId<Key extends string, RemainingModifiers extends ModifierName = ModifierName> = {\n\t[M in RemainingModifiers]: `${M}+${Key}` | `${M}+${ModifiedKeyId<Key, Exclude<RemainingModifiers, M>>}`;\n}[RemainingModifiers];\n\n/**\n * Union type of all valid key identifiers.\n * Provides autocomplete and catches typos at compile time.\n */\nexport type KeyId = BaseKey | ModifiedKeyId<BaseKey>;\n\n/**\n * Helper object for creating typed key identifiers with autocomplete.\n *\n * Usage:\n * - Key.escape, Key.enter, Key.tab, etc. for special keys\n * - Key.backtick, Key.comma, Key.period, etc. for symbol keys\n * - Key.ctrl(\"c\"), Key.alt(\"x\"), Key.super(\"k\") for single modifiers\n * - Key.ctrlShift(\"p\"), Key.ctrlAlt(\"x\"), Key.ctrlSuper(\"k\") for combined modifiers\n */\nexport const Key = {\n\t// Special keys\n\tescape: \"escape\" as const,\n\tesc: \"esc\" as const,\n\tenter: \"enter\" as const,\n\treturn: \"return\" as const,\n\ttab: \"tab\" as const,\n\tspace: \"space\" as const,\n\tbackspace: \"backspace\" as const,\n\tdelete: \"delete\" as const,\n\tinsert: \"insert\" as const,\n\tclear: \"clear\" as const,\n\thome: \"home\" as const,\n\tend: \"end\" as const,\n\tpageUp: \"pageUp\" as const,\n\tpageDown: \"pageDown\" as const,\n\tup: \"up\" as const,\n\tdown: \"down\" as const,\n\tleft: \"left\" as const,\n\tright: \"right\" as const,\n\tf1: \"f1\" as const,\n\tf2: \"f2\" as const,\n\tf3: \"f3\" as const,\n\tf4: \"f4\" as const,\n\tf5: \"f5\" as const,\n\tf6: \"f6\" as const,\n\tf7: \"f7\" as const,\n\tf8: \"f8\" as const,\n\tf9: \"f9\" as const,\n\tf10: \"f10\" as const,\n\tf11: \"f11\" as const,\n\tf12: \"f12\" as const,\n\n\t// Symbol keys\n\tbacktick: \"`\" as const,\n\thyphen: \"-\" as const,\n\tequals: \"=\" as const,\n\tleftbracket: \"[\" as const,\n\trightbracket: \"]\" as const,\n\tbackslash: \"\\\\\" as const,\n\tsemicolon: \";\" as const,\n\tquote: \"'\" as const,\n\tcomma: \",\" as const,\n\tperiod: \".\" as const,\n\tslash: \"/\" as const,\n\texclamation: \"!\" as const,\n\tat: \"@\" as const,\n\thash: \"#\" as const,\n\tdollar: \"$\" as const,\n\tpercent: \"%\" as const,\n\tcaret: \"^\" as const,\n\tampersand: \"&\" as const,\n\tasterisk: \"*\" as const,\n\tleftparen: \"(\" as const,\n\trightparen: \")\" as const,\n\tunderscore: \"_\" as const,\n\tplus: \"+\" as const,\n\tpipe: \"|\" as const,\n\ttilde: \"~\" as const,\n\tleftbrace: \"{\" as const,\n\trightbrace: \"}\" as const,\n\tcolon: \":\" as const,\n\tlessthan: \"<\" as const,\n\tgreaterthan: \">\" as const,\n\tquestion: \"?\" as const,\n\n\t// Single modifiers\n\tctrl: <K extends BaseKey>(key: K): `ctrl+${K}` => `ctrl+${key}`,\n\tshift: <K extends BaseKey>(key: K): `shift+${K}` => `shift+${key}`,\n\talt: <K extends BaseKey>(key: K): `alt+${K}` => `alt+${key}`,\n\tsuper: <K extends BaseKey>(key: K): `super+${K}` => `super+${key}`,\n\n\t// Combined modifiers\n\tctrlShift: <K extends BaseKey>(key: K): `ctrl+shift+${K}` => `ctrl+shift+${key}`,\n\tshiftCtrl: <K extends BaseKey>(key: K): `shift+ctrl+${K}` => `shift+ctrl+${key}`,\n\tctrlAlt: <K extends BaseKey>(key: K): `ctrl+alt+${K}` => `ctrl+alt+${key}`,\n\taltCtrl: <K extends BaseKey>(key: K): `alt+ctrl+${K}` => `alt+ctrl+${key}`,\n\tshiftAlt: <K extends BaseKey>(key: K): `shift+alt+${K}` => `shift+alt+${key}`,\n\taltShift: <K extends BaseKey>(key: K): `alt+shift+${K}` => `alt+shift+${key}`,\n\tctrlSuper: <K extends BaseKey>(key: K): `ctrl+super+${K}` => `ctrl+super+${key}`,\n\tsuperCtrl: <K extends BaseKey>(key: K): `super+ctrl+${K}` => `super+ctrl+${key}`,\n\tshiftSuper: <K extends BaseKey>(key: K): `shift+super+${K}` => `shift+super+${key}`,\n\tsuperShift: <K extends BaseKey>(key: K): `super+shift+${K}` => `super+shift+${key}`,\n\taltSuper: <K extends BaseKey>(key: K): `alt+super+${K}` => `alt+super+${key}`,\n\tsuperAlt: <K extends BaseKey>(key: K): `super+alt+${K}` => `super+alt+${key}`,\n\n\t// Triple modifiers\n\tctrlShiftAlt: <K extends BaseKey>(key: K): `ctrl+shift+alt+${K}` => `ctrl+shift+alt+${key}`,\n\tctrlShiftSuper: <K extends BaseKey>(key: K): `ctrl+shift+super+${K}` => `ctrl+shift+super+${key}`,\n} as const;\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SYMBOL_KEYS = new Set([\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\t\"?\",\n]);\n\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\nconst LOCK_MASK = 64 + 128; // Caps Lock + Num Lock\n\nconst CODEPOINTS = {\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tspace: 32,\n\tbackspace: 127,\n\tkpEnter: 57414, // Numpad Enter (Kitty protocol)\n} as const;\n\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nconst PARSED_KEY_NAMES_BY_CODEPOINT = new Map<number, string>([\n\t[CODEPOINTS.escape, \"escape\"],\n\t[CODEPOINTS.tab, \"tab\"],\n\t[CODEPOINTS.enter, \"enter\"],\n\t[CODEPOINTS.kpEnter, \"enter\"],\n\t[CODEPOINTS.space, \"space\"],\n\t[CODEPOINTS.backspace, \"backspace\"],\n\t[FUNCTIONAL_CODEPOINTS.delete, \"delete\"],\n\t[FUNCTIONAL_CODEPOINTS.insert, \"insert\"],\n\t[FUNCTIONAL_CODEPOINTS.home, \"home\"],\n\t[FUNCTIONAL_CODEPOINTS.end, \"end\"],\n\t[FUNCTIONAL_CODEPOINTS.pageUp, \"pageUp\"],\n\t[FUNCTIONAL_CODEPOINTS.pageDown, \"pageDown\"],\n\t[ARROW_CODEPOINTS.up, \"up\"],\n\t[ARROW_CODEPOINTS.down, \"down\"],\n\t[ARROW_CODEPOINTS.left, \"left\"],\n\t[ARROW_CODEPOINTS.right, \"right\"],\n]);\n\nconst KITTY_FUNCTIONAL_KEY_EQUIVALENTS = new Map<number, number>([\n\t[57399, 48], // KP_0 -> 0\n\t[57400, 49], // KP_1 -> 1\n\t[57401, 50], // KP_2 -> 2\n\t[57402, 51], // KP_3 -> 3\n\t[57403, 52], // KP_4 -> 4\n\t[57404, 53], // KP_5 -> 5\n\t[57405, 54], // KP_6 -> 6\n\t[57406, 55], // KP_7 -> 7\n\t[57407, 56], // KP_8 -> 8\n\t[57408, 57], // KP_9 -> 9\n\t[57409, 46], // KP_DECIMAL -> .\n\t[57410, 47], // KP_DIVIDE -> /\n\t[57411, 42], // KP_MULTIPLY -> *\n\t[57412, 45], // KP_SUBTRACT -> -\n\t[57413, 43], // KP_ADD -> +\n\t[57415, 61], // KP_EQUAL -> =\n\t[57416, 44], // KP_SEPARATOR -> ,\n\t[57417, ARROW_CODEPOINTS.left],\n\t[57418, ARROW_CODEPOINTS.right],\n\t[57419, ARROW_CODEPOINTS.up],\n\t[57420, ARROW_CODEPOINTS.down],\n\t[57421, FUNCTIONAL_CODEPOINTS.pageUp],\n\t[57422, FUNCTIONAL_CODEPOINTS.pageDown],\n\t[57423, FUNCTIONAL_CODEPOINTS.home],\n\t[57424, FUNCTIONAL_CODEPOINTS.end],\n\t[57425, FUNCTIONAL_CODEPOINTS.insert],\n\t[57426, FUNCTIONAL_CODEPOINTS.delete],\n]);\n\nfunction normalizeKittyFunctionalCodepoint(codepoint: number): number {\n\treturn KITTY_FUNCTIONAL_KEY_EQUIVALENTS.get(codepoint) ?? codepoint;\n}\n\nfunction normalizeShiftedLetterIdentityCodepoint(codepoint: number, modifier: number): number {\n\tconst effectiveModifier = modifier & ~LOCK_MASK;\n\tif ((effectiveModifier & MODIFIERS.shift) !== 0 && codepoint >= 65 && codepoint <= 90) {\n\t\treturn codepoint + 32;\n\t}\n\treturn codepoint;\n}\n\nconst LEGACY_KEY_SEQUENCES = {\n\tup: [\"\\x1b[A\", \"\\x1bOA\"],\n\tdown: [\"\\x1b[B\", \"\\x1bOB\"],\n\tright: [\"\\x1b[C\", \"\\x1bOC\"],\n\tleft: [\"\\x1b[D\", \"\\x1bOD\"],\n\thome: [\"\\x1b[H\", \"\\x1bOH\", \"\\x1b[1~\", \"\\x1b[7~\"],\n\tend: [\"\\x1b[F\", \"\\x1bOF\", \"\\x1b[4~\", \"\\x1b[8~\"],\n\tinsert: [\"\\x1b[2~\"],\n\tdelete: [\"\\x1b[3~\"],\n\tpageUp: [\"\\x1b[5~\", \"\\x1b[[5~\"],\n\tpageDown: [\"\\x1b[6~\", \"\\x1b[[6~\"],\n\tclear: [\"\\x1b[E\", \"\\x1bOE\"],\n\tf1: [\"\\x1bOP\", \"\\x1b[11~\", \"\\x1b[[A\"],\n\tf2: [\"\\x1bOQ\", \"\\x1b[12~\", \"\\x1b[[B\"],\n\tf3: [\"\\x1bOR\", \"\\x1b[13~\", \"\\x1b[[C\"],\n\tf4: [\"\\x1bOS\", \"\\x1b[14~\", \"\\x1b[[D\"],\n\tf5: [\"\\x1b[15~\", \"\\x1b[[E\"],\n\tf6: [\"\\x1b[17~\"],\n\tf7: [\"\\x1b[18~\"],\n\tf8: [\"\\x1b[19~\"],\n\tf9: [\"\\x1b[20~\"],\n\tf10: [\"\\x1b[21~\"],\n\tf11: [\"\\x1b[23~\"],\n\tf12: [\"\\x1b[24~\"],\n} as const;\n\nconst LEGACY_SHIFT_SEQUENCES = {\n\tup: [\"\\x1b[a\"],\n\tdown: [\"\\x1b[b\"],\n\tright: [\"\\x1b[c\"],\n\tleft: [\"\\x1b[d\"],\n\tclear: [\"\\x1b[e\"],\n\tinsert: [\"\\x1b[2$\"],\n\tdelete: [\"\\x1b[3$\"],\n\tpageUp: [\"\\x1b[5$\"],\n\tpageDown: [\"\\x1b[6$\"],\n\thome: [\"\\x1b[7$\"],\n\tend: [\"\\x1b[8$\"],\n} as const;\n\nconst LEGACY_CTRL_SEQUENCES = {\n\tup: [\"\\x1bOa\"],\n\tdown: [\"\\x1bOb\"],\n\tright: [\"\\x1bOc\"],\n\tleft: [\"\\x1bOd\"],\n\tclear: [\"\\x1bOe\"],\n\tinsert: [\"\\x1b[2^\"],\n\tdelete: [\"\\x1b[3^\"],\n\tpageUp: [\"\\x1b[5^\"],\n\tpageDown: [\"\\x1b[6^\"],\n\thome: [\"\\x1b[7^\"],\n\tend: [\"\\x1b[8^\"],\n} as const;\n\nconst LEGACY_SEQUENCE_KEY_IDS: Record<string, KeyId> = {\n\t\"\\x1b\": \"escape\",\n\t\"\\x1c\": \"ctrl+\\\\\",\n\t\"\\x1d\": \"ctrl+]\",\n\t\"\\x1f\": \"ctrl+-\",\n\t\"\\x1b\\x1b\": \"ctrl+alt+[\",\n\t\"\\x1b\\x1c\": \"ctrl+alt+\\\\\",\n\t\"\\x1b\\x1d\": \"ctrl+alt+]\",\n\t\"\\x1b\\x1f\": \"ctrl+alt+-\",\n\t\"\\t\": \"tab\",\n\t\"\\r\": \"enter\",\n\t\"\\x1bOM\": \"enter\",\n\t\"\\x00\": \"ctrl+space\",\n\t\" \": \"space\",\n\t\"\\x7f\": \"backspace\",\n\t\"\\x1b[Z\": \"shift+tab\",\n\t\"\\x1b\\x7f\": \"alt+backspace\",\n\t\"\\x1b\\b\": \"alt+backspace\",\n\t\"\\x1b[A\": \"up\",\n\t\"\\x1b[B\": \"down\",\n\t\"\\x1b[C\": \"right\",\n\t\"\\x1b[D\": \"left\",\n\t\"\\x1b[H\": \"home\",\n\t\"\\x1b[F\": \"end\",\n\t\"\\x1b[3~\": \"delete\",\n\t\"\\x1b[5~\": \"pageUp\",\n\t\"\\x1b[6~\": \"pageDown\",\n\t\"\\x1bOA\": \"up\",\n\t\"\\x1bOB\": \"down\",\n\t\"\\x1bOC\": \"right\",\n\t\"\\x1bOD\": \"left\",\n\t\"\\x1bOH\": \"home\",\n\t\"\\x1bOF\": \"end\",\n\t\"\\x1b[E\": \"clear\",\n\t\"\\x1bOE\": \"clear\",\n\t\"\\x1bOe\": \"ctrl+clear\",\n\t\"\\x1b[e\": \"shift+clear\",\n\t\"\\x1b[2~\": \"insert\",\n\t\"\\x1b[2$\": \"shift+insert\",\n\t\"\\x1b[2^\": \"ctrl+insert\",\n\t\"\\x1b[3$\": \"shift+delete\",\n\t\"\\x1b[3^\": \"ctrl+delete\",\n\t\"\\x1b[[5~\": \"pageUp\",\n\t\"\\x1b[[6~\": \"pageDown\",\n\t\"\\x1b[a\": \"shift+up\",\n\t\"\\x1b[b\": \"shift+down\",\n\t\"\\x1b[c\": \"shift+right\",\n\t\"\\x1b[d\": \"shift+left\",\n\t\"\\x1bOa\": \"ctrl+up\",\n\t\"\\x1bOb\": \"ctrl+down\",\n\t\"\\x1bOc\": \"ctrl+right\",\n\t\"\\x1bOd\": \"ctrl+left\",\n\t\"\\x1b[5$\": \"shift+pageUp\",\n\t\"\\x1b[6$\": \"shift+pageDown\",\n\t\"\\x1b[7$\": \"shift+home\",\n\t\"\\x1b[8$\": \"shift+end\",\n\t\"\\x1b[5^\": \"ctrl+pageUp\",\n\t\"\\x1b[6^\": \"ctrl+pageDown\",\n\t\"\\x1b[7^\": \"ctrl+home\",\n\t\"\\x1b[8^\": \"ctrl+end\",\n\t\"\\x1bOP\": \"f1\",\n\t\"\\x1bOQ\": \"f2\",\n\t\"\\x1bOR\": \"f3\",\n\t\"\\x1bOS\": \"f4\",\n\t\"\\x1b[11~\": \"f1\",\n\t\"\\x1b[12~\": \"f2\",\n\t\"\\x1b[13~\": \"f3\",\n\t\"\\x1b[14~\": \"f4\",\n\t\"\\x1b[[A\": \"f1\",\n\t\"\\x1b[[B\": \"f2\",\n\t\"\\x1b[[C\": \"f3\",\n\t\"\\x1b[[D\": \"f4\",\n\t\"\\x1b[[E\": \"f5\",\n\t\"\\x1b[15~\": \"f5\",\n\t\"\\x1b[17~\": \"f6\",\n\t\"\\x1b[18~\": \"f7\",\n\t\"\\x1b[19~\": \"f8\",\n\t\"\\x1b[20~\": \"f9\",\n\t\"\\x1b[21~\": \"f10\",\n\t\"\\x1b[23~\": \"f11\",\n\t\"\\x1b[24~\": \"f12\",\n\t\"\\x1bb\": \"alt+left\",\n\t\"\\x1bf\": \"alt+right\",\n\t\"\\x1bp\": \"alt+up\",\n\t\"\\x1bn\": \"alt+down\",\n} as const;\n\ntype LegacyModifierKey = keyof typeof LEGACY_SHIFT_SEQUENCES;\n\nconst matchesLegacySequence = (data: string, sequences: readonly string[]): boolean => sequences.includes(data);\n\nconst matchesLegacyModifierSequence = (data: string, key: LegacyModifierKey, modifier: number): boolean => {\n\tif (modifier === MODIFIERS.shift) {\n\t\treturn matchesLegacySequence(data, LEGACY_SHIFT_SEQUENCES[key]);\n\t}\n\tif (modifier === MODIFIERS.ctrl) {\n\t\treturn matchesLegacySequence(data, LEGACY_CTRL_SEQUENCES[key]);\n\t}\n\treturn false;\n};\n\n// =============================================================================\n// Kitty Protocol Parsing\n// =============================================================================\n\n/**\n * Event types from Kitty keyboard protocol (flag 2)\n * 1 = key press, 2 = key repeat, 3 = key release\n */\nexport type KeyEventType = \"press\" | \"repeat\" | \"release\";\n\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tshiftedKey?: number; // Shifted version of the key (when shift is pressed)\n\tbaseLayoutKey?: number; // Key in standard PC-101 layout (for non-Latin layouts)\n\tmodifier: number;\n\teventType: KeyEventType;\n}\n\ninterface ParsedModifyOtherKeysSequence {\n\tcodepoint: number;\n\tmodifier: number;\n}\n\n// Store the last parsed event type for isKeyRelease() to query\nlet _lastEventType: KeyEventType = \"press\";\n\n/**\n * Check if the last parsed key event was a key release.\n * Only meaningful when Kitty keyboard protocol with flag 2 is active.\n */\nexport function isKeyRelease(data: string): boolean {\n\t// Don't treat bracketed paste content as key release, even if it contains\n\t// patterns like \":3F\" (e.g., bluetooth MAC addresses like \"90:62:3F:A5\").\n\t// Terminal.ts re-wraps paste content with bracketed paste markers before\n\t// passing to TUI, so pasted data will always contain \\x1b[200~.\n\tif (data.includes(\"\\x1b[200~\")) {\n\t\treturn false;\n\t}\n\n\t// Quick check: release events with flag 2 contain \":3\"\n\t// Format: \\x1b[<codepoint>;<modifier>:3u\n\tif (\n\t\tdata.includes(\":3u\") ||\n\t\tdata.includes(\":3~\") ||\n\t\tdata.includes(\":3A\") ||\n\t\tdata.includes(\":3B\") ||\n\t\tdata.includes(\":3C\") ||\n\t\tdata.includes(\":3D\") ||\n\t\tdata.includes(\":3H\") ||\n\t\tdata.includes(\":3F\")\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Check if the last parsed key event was a key repeat.\n * Only meaningful when Kitty keyboard protocol with flag 2 is active.\n */\nexport function isKeyRepeat(data: string): boolean {\n\t// Don't treat bracketed paste content as key repeat, even if it contains\n\t// patterns like \":2F\". See isKeyRelease() for details.\n\tif (data.includes(\"\\x1b[200~\")) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tdata.includes(\":2u\") ||\n\t\tdata.includes(\":2~\") ||\n\t\tdata.includes(\":2A\") ||\n\t\tdata.includes(\":2B\") ||\n\t\tdata.includes(\":2C\") ||\n\t\tdata.includes(\":2D\") ||\n\t\tdata.includes(\":2H\") ||\n\t\tdata.includes(\":2F\")\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction parseEventType(eventTypeStr: string | undefined): KeyEventType {\n\tif (!eventTypeStr) return \"press\";\n\tconst eventType = parseInt(eventTypeStr, 10);\n\tif (eventType === 2) return \"repeat\";\n\tif (eventType === 3) return \"release\";\n\treturn \"press\";\n}\n\nfunction recordParsedKittySequence(sequence: ParsedKittySequence): ParsedKittySequence {\n\t_lastEventType = sequence.eventType;\n\treturn sequence;\n}\n\nfunction parseKittyCsiUSequence(data: string): ParsedKittySequence | null {\n\t// CSI u format with alternate keys (flag 4):\n\t// \\x1b[<codepoint>u\n\t// \\x1b[<codepoint>;<mod>u\n\t// \\x1b[<codepoint>;<mod>:<event>u\n\t// \\x1b[<codepoint>:<shifted>;<mod>u\n\t// \\x1b[<codepoint>:<shifted>:<base>;<mod>u\n\t// \\x1b[<codepoint>::<base>;<mod>u (no shifted key, only base)\n\tconst match = data.match(/^\\x1b\\[(\\d+)(?::(\\d*))?(?::(\\d+))?(?:;(\\d+))?(?::(\\d+))?u$/);\n\tif (!match) return null;\n\tconst codepoint = parseInt(match[1]!, 10);\n\tconst shiftedKey = match[2] && match[2].length > 0 ? parseInt(match[2], 10) : undefined;\n\tconst baseLayoutKey = match[3] ? parseInt(match[3], 10) : undefined;\n\tconst modValue = match[4] ? parseInt(match[4], 10) : 1;\n\tconst eventType = parseEventType(match[5]);\n\treturn recordParsedKittySequence({ codepoint, shiftedKey, baseLayoutKey, modifier: modValue - 1, eventType });\n}\n\nfunction parseKittyArrowSequence(data: string): ParsedKittySequence | null {\n\t// Arrow keys with modifier: \\x1b[1;<mod>A/B/C/D or \\x1b[1;<mod>:<event>A/B/C/D\n\tconst match = data.match(/^\\x1b\\[1;(\\d+)(?::(\\d+))?([ABCD])$/);\n\tif (!match) return null;\n\tconst modValue = parseInt(match[1]!, 10);\n\tconst eventType = parseEventType(match[2]);\n\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\treturn recordParsedKittySequence({\n\t\tcodepoint: arrowCodes[match[3]!]!,\n\t\tmodifier: modValue - 1,\n\t\teventType,\n\t});\n}\n\nfunction parseKittyFunctionalSequence(data: string): ParsedKittySequence | null {\n\t// Functional keys: \\x1b[<num>~ or \\x1b[<num>;<mod>~ or \\x1b[<num>;<mod>:<event>~\n\tconst match = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?(?::(\\d+))?~$/);\n\tif (!match) return null;\n\tconst keyNum = parseInt(match[1]!, 10);\n\tconst modValue = match[2] ? parseInt(match[2], 10) : 1;\n\tconst eventType = parseEventType(match[3]);\n\tconst funcCodes: Record<number, number> = {\n\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t7: FUNCTIONAL_CODEPOINTS.home,\n\t\t8: FUNCTIONAL_CODEPOINTS.end,\n\t};\n\tconst codepoint = funcCodes[keyNum];\n\treturn codepoint === undefined ? null : recordParsedKittySequence({ codepoint, modifier: modValue - 1, eventType });\n}\n\nfunction parseKittyHomeEndSequence(data: string): ParsedKittySequence | null {\n\t// Home/End with modifier: \\x1b[1;<mod>H/F or \\x1b[1;<mod>:<event>H/F\n\tconst match = data.match(/^\\x1b\\[1;(\\d+)(?::(\\d+))?([HF])$/);\n\tif (!match) return null;\n\tconst modValue = parseInt(match[1]!, 10);\n\tconst eventType = parseEventType(match[2]);\n\tconst codepoint = match[3] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\treturn recordParsedKittySequence({ codepoint, modifier: modValue - 1, eventType });\n}\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\treturn (\n\t\tparseKittyCsiUSequence(data) ??\n\t\tparseKittyArrowSequence(data) ??\n\t\tparseKittyFunctionalSequence(data) ??\n\t\tparseKittyHomeEndSequence(data)\n\t);\n}\n\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\t// Check if modifiers match\n\tif (actualMod !== expectedMod) return false;\n\n\tconst normalizedCodepoint = normalizeShiftedLetterIdentityCodepoint(\n\t\tnormalizeKittyFunctionalCodepoint(parsed.codepoint),\n\t\tparsed.modifier,\n\t);\n\tconst normalizedExpectedCodepoint = normalizeShiftedLetterIdentityCodepoint(\n\t\tnormalizeKittyFunctionalCodepoint(expectedCodepoint),\n\t\texpectedModifier,\n\t);\n\n\t// Primary match: codepoint matches directly after normalizing functional keys\n\tif (normalizedCodepoint === normalizedExpectedCodepoint) return true;\n\n\t// Alternate match: use base layout key for non-Latin keyboard layouts.\n\t// This allows Ctrl+С (Cyrillic) to match Ctrl+c (Latin) when terminal reports\n\t// the base layout key (the key in standard PC-101 layout).\n\t//\n\t// Only fall back to base layout key when the codepoint is NOT already a\n\t// recognized Latin letter (a-z) or symbol (e.g., /, -, [, ;, etc.).\n\t// When the codepoint is a recognized key, it is authoritative regardless\n\t// of physical key position. This prevents remapped layouts (Dvorak, Colemak,\n\t// xremap, etc.) from causing false matches: both letters and symbols move\n\t// to different physical positions, so Ctrl+K could falsely match Ctrl+V\n\t// (letter remapping) and Ctrl+/ could falsely match Ctrl+[ (symbol remapping)\n\t// if the base layout key were always considered.\n\tif (parsed.baseLayoutKey !== undefined && parsed.baseLayoutKey === expectedCodepoint) {\n\t\tconst cp = normalizedCodepoint;\n\t\tconst isLatinLetter = cp >= 97 && cp <= 122; // a-z\n\t\tconst isKnownSymbol = SYMBOL_KEYS.has(String.fromCharCode(cp));\n\t\tif (!isLatinLetter && !isKnownSymbol) return true;\n\t}\n\n\treturn false;\n}\n\nfunction parseModifyOtherKeysSequence(data: string): ParsedModifyOtherKeysSequence | null {\n\tconst match = data.match(/^\\x1b\\[27;(\\d+);(\\d+)~$/);\n\tif (!match) return null;\n\tconst modValue = parseInt(match[1]!, 10);\n\tconst codepoint = parseInt(match[2]!, 10);\n\treturn { codepoint, modifier: modValue - 1 };\n}\n\n/**\n * Match xterm modifyOtherKeys format: CSI 27 ; modifiers ; keycode ~\n * This is used by terminals when Kitty protocol is not enabled.\n * Modifier values are 1-indexed: 2=shift, 3=alt, 5=ctrl, etc.\n */\nfunction matchesModifyOtherKeys(data: string, expectedKeycode: number, expectedModifier: number): boolean {\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed) return false;\n\treturn parsed.codepoint === expectedKeycode && parsed.modifier === expectedModifier;\n}\n\nfunction isWindowsTerminalSession(): boolean {\n\treturn (\n\t\tBoolean(process.env.WT_SESSION) && !process.env.SSH_CONNECTION && !process.env.SSH_CLIENT && !process.env.SSH_TTY\n\t);\n}\n\n/**\n * Raw 0x08 (BS) is ambiguous in legacy terminals.\n *\n * - Windows Terminal uses it for Ctrl+Backspace.\n * - Some legacy terminals and tmux setups send it for plain Backspace.\n *\n * Prefer explicit Kitty / CSI-u / modifyOtherKeys sequences whenever they are\n * available. Fall back to a Windows Terminal heuristic only for raw BS bytes.\n */\nfunction matchesRawBackspace(data: string, expectedModifier: number): boolean {\n\tif (data === \"\\x7f\") return expectedModifier === 0;\n\tif (data !== \"\\x08\") return false;\n\treturn isWindowsTerminalSession() ? expectedModifier === MODIFIERS.ctrl : expectedModifier === 0;\n}\n\n// =============================================================================\n// Generic Key Matching\n// =============================================================================\n\n/**\n * Get the control character for a key.\n * Uses the universal formula: code & 0x1f (mask to lower 5 bits)\n *\n * Works for:\n * - Letters a-z → 1-26\n * - Symbols [\\]_ → 27, 28, 29, 31\n * - Also maps - to same as _ (same physical key on US keyboards)\n */\nfunction rawCtrlChar(key: string): string | null {\n\tconst char = key.toLowerCase();\n\tconst code = char.charCodeAt(0);\n\tif ((code >= 97 && code <= 122) || char === \"[\" || char === \"\\\\\" || char === \"]\" || char === \"_\") {\n\t\treturn String.fromCharCode(code & 0x1f);\n\t}\n\t// Handle - as _ (same physical key on US keyboards)\n\tif (char === \"-\") {\n\t\treturn String.fromCharCode(31); // Same as Ctrl+_\n\t}\n\treturn null;\n}\n\nfunction isDigitKey(key: string): boolean {\n\treturn key >= \"0\" && key <= \"9\";\n}\n\nfunction matchesPrintableModifyOtherKeys(data: string, expectedKeycode: number, expectedModifier: number): boolean {\n\tif (expectedModifier === 0) return false;\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed || parsed.modifier !== expectedModifier) return false;\n\treturn (\n\t\tnormalizeShiftedLetterIdentityCodepoint(parsed.codepoint, parsed.modifier) ===\n\t\tnormalizeShiftedLetterIdentityCodepoint(expectedKeycode, expectedModifier)\n\t);\n}\n\nfunction formatKeyNameWithModifiers(keyName: string, modifier: number): string | undefined {\n\tconst mods: string[] = [];\n\tconst effectiveMod = modifier & ~LOCK_MASK;\n\tconst supportedModifierMask = MODIFIERS.shift | MODIFIERS.ctrl | MODIFIERS.alt | MODIFIERS.super;\n\tif ((effectiveMod & ~supportedModifierMask) !== 0) return undefined;\n\tif (effectiveMod & MODIFIERS.shift) mods.push(\"shift\");\n\tif (effectiveMod & MODIFIERS.ctrl) mods.push(\"ctrl\");\n\tif (effectiveMod & MODIFIERS.alt) mods.push(\"alt\");\n\tif (effectiveMod & MODIFIERS.super) mods.push(\"super\");\n\treturn mods.length > 0 ? `${mods.join(\"+\")}+${keyName}` : keyName;\n}\n\ninterface ParsedKeyId {\n\tkey: string;\n\tctrl: boolean;\n\tshift: boolean;\n\talt: boolean;\n\tsuper: boolean;\n}\n\nfunction parseKeyId(keyId: string): ParsedKeyId | null {\n\tconst parts = keyId.toLowerCase().split(\"+\");\n\tconst key = parts[parts.length - 1];\n\tif (!key) return null;\n\treturn {\n\t\tkey,\n\t\tctrl: parts.includes(\"ctrl\"),\n\t\tshift: parts.includes(\"shift\"),\n\t\talt: parts.includes(\"alt\"),\n\t\tsuper: parts.includes(\"super\"),\n\t};\n}\n\ninterface LegacyKittyKeyMatch {\n\tlegacyKey: LegacyModifierKey;\n\tcodepoint: number;\n}\n\ntype ArrowKeyName = keyof typeof ARROW_CODEPOINTS;\n\nconst LEGACY_FUNCTIONAL_KEY_MATCHES: Record<string, LegacyKittyKeyMatch> = {\n\tinsert: { legacyKey: \"insert\", codepoint: FUNCTIONAL_CODEPOINTS.insert },\n\tdelete: { legacyKey: \"delete\", codepoint: FUNCTIONAL_CODEPOINTS.delete },\n\thome: { legacyKey: \"home\", codepoint: FUNCTIONAL_CODEPOINTS.home },\n\tend: { legacyKey: \"end\", codepoint: FUNCTIONAL_CODEPOINTS.end },\n\tpageup: { legacyKey: \"pageUp\", codepoint: FUNCTIONAL_CODEPOINTS.pageUp },\n\tpagedown: { legacyKey: \"pageDown\", codepoint: FUNCTIONAL_CODEPOINTS.pageDown },\n};\n\nconst ARROW_KEY_MATCHES: Record<string, LegacyKittyKeyMatch> = {\n\tup: { legacyKey: \"up\", codepoint: ARROW_CODEPOINTS.up },\n\tdown: { legacyKey: \"down\", codepoint: ARROW_CODEPOINTS.down },\n\tleft: { legacyKey: \"left\", codepoint: ARROW_CODEPOINTS.left },\n\tright: { legacyKey: \"right\", codepoint: ARROW_CODEPOINTS.right },\n};\n\nconst ALT_ARROW_SEQUENCES: Record<ArrowKeyName, readonly string[]> = {\n\tup: [\"\\x1bp\"],\n\tdown: [\"\\x1bn\"],\n\tleft: [\"\\x1b[1;3D\", \"\\x1bb\"],\n\tright: [\"\\x1b[1;3C\", \"\\x1bf\"],\n};\n\nconst LEGACY_ALT_ARROW_SEQUENCES: Partial<Record<ArrowKeyName, string>> = {\n\tleft: \"\\x1bB\",\n\tright: \"\\x1bF\",\n};\n\nconst FUNCTION_KEY_NAMES = new Set([\"f1\", \"f2\", \"f3\", \"f4\", \"f5\", \"f6\", \"f7\", \"f8\", \"f9\", \"f10\", \"f11\", \"f12\"]);\n\nfunction getModifierMask(parsed: ParsedKeyId): number {\n\tlet modifier = 0;\n\tif (parsed.shift) modifier |= MODIFIERS.shift;\n\tif (parsed.alt) modifier |= MODIFIERS.alt;\n\tif (parsed.ctrl) modifier |= MODIFIERS.ctrl;\n\tif (parsed.super) modifier |= MODIFIERS.super;\n\treturn modifier;\n}\n\nfunction matchesEncodedKey(data: string, codepoint: number, modifier: number): boolean {\n\treturn matchesKittySequence(data, codepoint, modifier) || matchesModifyOtherKeys(data, codepoint, modifier);\n}\n\nfunction matchesSpaceKey(data: string, modifier: number): boolean {\n\tif (!_kittyProtocolActive && modifier === MODIFIERS.ctrl && data === \"\\x00\") return true;\n\tif (!_kittyProtocolActive && modifier === MODIFIERS.alt && data === \"\\x1b \") return true;\n\tif (modifier === 0) return data === \" \" || matchesEncodedKey(data, CODEPOINTS.space, 0);\n\treturn matchesEncodedKey(data, CODEPOINTS.space, modifier);\n}\n\nfunction matchesTabKey(data: string, modifier: number): boolean {\n\tif (modifier === MODIFIERS.shift) {\n\t\treturn data === \"\\x1b[Z\" || matchesEncodedKey(data, CODEPOINTS.tab, MODIFIERS.shift);\n\t}\n\tif (modifier === 0) return data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n\treturn matchesEncodedKey(data, CODEPOINTS.tab, modifier);\n}\n\nfunction matchesKittyEnter(data: string, modifier: number): boolean {\n\treturn (\n\t\tmatchesKittySequence(data, CODEPOINTS.enter, modifier) || matchesKittySequence(data, CODEPOINTS.kpEnter, modifier)\n\t);\n}\n\nfunction matchesEnterKey(data: string, modifier: number): boolean {\n\tif (modifier === MODIFIERS.shift) {\n\t\tif (matchesKittyEnter(data, modifier) || matchesModifyOtherKeys(data, CODEPOINTS.enter, modifier)) return true;\n\t\t// Kitty's custom mapping and Ghostty's text mapping for Shift+Enter.\n\t\treturn _kittyProtocolActive && (data === \"\\x1b\\r\" || data === \"\\n\");\n\t}\n\tif (modifier === MODIFIERS.alt) {\n\t\tif (matchesKittyEnter(data, modifier) || matchesModifyOtherKeys(data, CODEPOINTS.enter, modifier)) return true;\n\t\treturn !_kittyProtocolActive && data === \"\\x1b\\r\";\n\t}\n\tif (modifier === 0) {\n\t\treturn (\n\t\t\tdata === \"\\r\" || (!_kittyProtocolActive && data === \"\\n\") || data === \"\\x1bOM\" || matchesKittyEnter(data, 0)\n\t\t);\n\t}\n\treturn matchesKittyEnter(data, modifier) || matchesModifyOtherKeys(data, CODEPOINTS.enter, modifier);\n}\n\nfunction matchesBackspaceKey(data: string, modifier: number): boolean {\n\tif (modifier === MODIFIERS.alt) {\n\t\tif (data === \"\\x1b\\x7f\" || data === \"\\x1b\\b\") return true;\n\t\treturn matchesEncodedKey(data, CODEPOINTS.backspace, modifier);\n\t}\n\tif (modifier === MODIFIERS.ctrl) {\n\t\t// Raw BS is ambiguous between Ctrl+Backspace and plain Backspace.\n\t\tif (matchesRawBackspace(data, modifier)) return true;\n\t\treturn matchesEncodedKey(data, CODEPOINTS.backspace, modifier);\n\t}\n\tif (modifier === 0) {\n\t\treturn matchesRawBackspace(data, 0) || matchesEncodedKey(data, CODEPOINTS.backspace, 0);\n\t}\n\treturn matchesEncodedKey(data, CODEPOINTS.backspace, modifier);\n}\n\nfunction matchesLegacyFunctionalKey(data: string, modifier: number, match: LegacyKittyKeyMatch): boolean {\n\tif (modifier === 0) {\n\t\treturn (\n\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES[match.legacyKey]) ||\n\t\t\tmatchesKittySequence(data, match.codepoint, 0)\n\t\t);\n\t}\n\treturn (\n\t\tmatchesLegacyModifierSequence(data, match.legacyKey, modifier) ||\n\t\tmatchesKittySequence(data, match.codepoint, modifier)\n\t);\n}\n\nfunction matchesClearKey(data: string, modifier: number): boolean {\n\tif (modifier === 0) return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.clear);\n\treturn matchesLegacyModifierSequence(data, \"clear\", modifier);\n}\n\nfunction matchesLegacyAltArrow(data: string, key: ArrowKeyName): boolean {\n\tif (ALT_ARROW_SEQUENCES[key].includes(data)) return true;\n\treturn !_kittyProtocolActive && LEGACY_ALT_ARROW_SEQUENCES[key] === data;\n}\n\nfunction matchesArrowKey(data: string, key: ArrowKeyName, modifier: number): boolean {\n\tconst match = ARROW_KEY_MATCHES[key];\n\tif (modifier === MODIFIERS.alt && matchesLegacyAltArrow(data, key)) return true;\n\treturn matchesLegacyFunctionalKey(data, modifier, match);\n}\n\nfunction matchesFunctionKey(data: string, key: string, modifier: number): boolean {\n\tif (modifier !== 0) return false;\n\tconst functionKey = key as keyof typeof LEGACY_KEY_SEQUENCES;\n\treturn matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[functionKey]);\n}\n\nfunction matchesNamedKey(data: string, key: string, modifier: number): boolean | undefined {\n\tconst functionalMatch = LEGACY_FUNCTIONAL_KEY_MATCHES[key];\n\tif (functionalMatch) return matchesLegacyFunctionalKey(data, modifier, functionalMatch);\n\n\tconst arrowMatch = ARROW_KEY_MATCHES[key];\n\tif (arrowMatch) return matchesArrowKey(data, key as ArrowKeyName, modifier);\n\tif (FUNCTION_KEY_NAMES.has(key)) return matchesFunctionKey(data, key, modifier);\n\n\tswitch (key) {\n\t\tcase \"escape\":\n\t\tcase \"esc\":\n\t\t\tif (modifier !== 0) return false;\n\t\t\treturn (\n\t\t\t\tdata === \"\\x1b\" ||\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.escape, 0) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.escape, 0)\n\t\t\t);\n\t\tcase \"space\":\n\t\t\treturn matchesSpaceKey(data, modifier);\n\t\tcase \"tab\":\n\t\t\treturn matchesTabKey(data, modifier);\n\t\tcase \"enter\":\n\t\tcase \"return\":\n\t\t\treturn matchesEnterKey(data, modifier);\n\t\tcase \"backspace\":\n\t\t\treturn matchesBackspaceKey(data, modifier);\n\t\tcase \"clear\":\n\t\t\treturn matchesClearKey(data, modifier);\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction isPrintableKeyName(key: string): boolean {\n\treturn key.length === 1 && ((key >= \"a\" && key <= \"z\") || isDigitKey(key) || SYMBOL_KEYS.has(key));\n}\n\nfunction matchesLegacyPrintable(data: string, key: string, modifier: number, rawCtrl: string | null): boolean {\n\tif (_kittyProtocolActive) return false;\n\tif (modifier === MODIFIERS.ctrl + MODIFIERS.alt) return rawCtrl !== null && data === `\\x1b${rawCtrl}`;\n\tif (modifier === MODIFIERS.alt) return data === `\\x1b${key}`;\n\treturn false;\n}\n\nfunction matchesPrintableEncoding(data: string, codepoint: number, modifier: number): boolean {\n\treturn matchesKittySequence(data, codepoint, modifier) || matchesPrintableModifyOtherKeys(data, codepoint, modifier);\n}\n\nfunction matchesPrintableKey(data: string, key: string, modifier: number): boolean {\n\tif (!isPrintableKeyName(key)) return false;\n\tconst codepoint = key.charCodeAt(0);\n\tconst rawCtrl = rawCtrlChar(key);\n\tconst isLetter = key >= \"a\" && key <= \"z\";\n\n\tif (matchesLegacyPrintable(data, key, modifier, rawCtrl)) return true;\n\tif (modifier === MODIFIERS.ctrl) {\n\t\tif (rawCtrl && data === rawCtrl) return true;\n\t\treturn matchesPrintableEncoding(data, codepoint, modifier);\n\t}\n\tif (modifier === MODIFIERS.shift + MODIFIERS.ctrl) {\n\t\treturn matchesPrintableEncoding(data, codepoint, modifier);\n\t}\n\tif (modifier === MODIFIERS.shift) {\n\t\tif (isLetter && data === key.toUpperCase()) return true;\n\t\treturn matchesPrintableEncoding(data, codepoint, modifier);\n\t}\n\tif (modifier !== 0) return matchesPrintableEncoding(data, codepoint, modifier);\n\treturn data === key || matchesKittySequence(data, codepoint, 0);\n}\n\n/**\n * Match input data against a key identifier string.\n *\n * Supported key identifiers:\n * - Single keys: \"escape\", \"tab\", \"enter\", \"backspace\", \"delete\", \"home\", \"end\", \"space\"\n * - Arrow keys: \"up\", \"down\", \"left\", \"right\"\n * - Ctrl combinations: \"ctrl+c\", \"ctrl+z\", etc.\n * - Shift combinations: \"shift+tab\", \"shift+enter\"\n * - Alt combinations: \"alt+enter\", \"alt+backspace\"\n * - Super combinations: \"super+k\", \"super+enter\"\n * - Combined modifiers: \"shift+ctrl+p\", \"ctrl+alt+x\", \"ctrl+super+k\"\n *\n * Use the Key helper for autocomplete: Key.ctrl(\"c\"), Key.escape, Key.ctrlShift(\"p\"), Key.super(\"k\")\n *\n * @param data - Raw input data from terminal\n * @param keyId - Key identifier (e.g., \"ctrl+c\", \"escape\", Key.ctrl(\"c\"))\n */\nexport function matchesKey(data: string, keyId: KeyId): boolean {\n\tconst parsed = parseKeyId(keyId);\n\tif (!parsed) return false;\n\tconst modifier = getModifierMask(parsed);\n\tconst namedMatch = matchesNamedKey(data, parsed.key, modifier);\n\tif (namedMatch !== undefined) return namedMatch;\n\treturn matchesPrintableKey(data, parsed.key, modifier);\n}\n\n/**\n * Parse input data and return the key identifier if recognized.\n *\n * @param data - Raw input data from terminal\n * @returns Key identifier string (e.g., \"ctrl+c\") or undefined\n */\nfunction formatParsedKey(codepoint: number, modifier: number, baseLayoutKey?: number): string | undefined {\n\tconst normalizedCodepoint = normalizeKittyFunctionalCodepoint(codepoint);\n\tconst identityCodepoint = normalizeShiftedLetterIdentityCodepoint(normalizedCodepoint, modifier);\n\n\t// Use base layout key only when codepoint is not a recognized Latin\n\t// letter (a-z), digit (0-9), or symbol (/, -, [, ;, etc.). For those,\n\t// the codepoint is authoritative regardless of physical key position.\n\t// This prevents remapped layouts (Dvorak, Colemak, xremap, etc.) from\n\t// reporting the wrong key name based on the QWERTY physical position.\n\tconst isLatinLetter = identityCodepoint >= 97 && identityCodepoint <= 122; // a-z\n\tconst isDigit = identityCodepoint >= 48 && identityCodepoint <= 57; // 0-9\n\tconst isKnownSymbol = SYMBOL_KEYS.has(String.fromCharCode(identityCodepoint));\n\tconst effectiveCodepoint =\n\t\tisLatinLetter || isDigit || isKnownSymbol ? identityCodepoint : (baseLayoutKey ?? identityCodepoint);\n\n\tlet keyName = PARSED_KEY_NAMES_BY_CODEPOINT.get(effectiveCodepoint);\n\tif (!keyName) {\n\t\tconst character = String.fromCharCode(effectiveCodepoint);\n\t\tconst isDigitCharacter = effectiveCodepoint >= 48 && effectiveCodepoint <= 57;\n\t\tconst isLowercaseLetter = effectiveCodepoint >= 97 && effectiveCodepoint <= 122;\n\t\tif (isDigitCharacter || isLowercaseLetter || SYMBOL_KEYS.has(character)) keyName = character;\n\t}\n\n\tif (!keyName) return undefined;\n\treturn formatKeyNameWithModifiers(keyName, modifier);\n}\n\nfunction parseTerminalEncodedKey(data: string): string | undefined {\n\tconst kitty = parseKittySequence(data);\n\tif (kitty) return formatParsedKey(kitty.codepoint, kitty.modifier, kitty.baseLayoutKey);\n\n\tconst modifyOtherKeys = parseModifyOtherKeysSequence(data);\n\tif (!modifyOtherKeys) return undefined;\n\treturn formatParsedKey(modifyOtherKeys.codepoint, modifyOtherKeys.modifier);\n}\n\nfunction parseModeDependentLegacyKey(data: string): string | undefined {\n\tif (data === \"\\x08\") return isWindowsTerminalSession() ? \"ctrl+backspace\" : \"backspace\";\n\tif (_kittyProtocolActive) return data === \"\\x1b\\r\" || data === \"\\n\" ? \"shift+enter\" : undefined;\n\tif (data === \"\\n\") return \"enter\";\n\tif (data === \"\\x1b\\r\") return \"alt+enter\";\n\tif (data === \"\\x1b \") return \"alt+space\";\n\tif (data === \"\\x1bB\") return \"alt+left\";\n\tif (data === \"\\x1bF\") return \"alt+right\";\n\treturn undefined;\n}\n\nfunction parseLegacyAltCombination(data: string): string | undefined {\n\tif (_kittyProtocolActive || data.length !== 2 || data[0] !== \"\\x1b\") return undefined;\n\tconst code = data.charCodeAt(1);\n\tif (code >= 1 && code <= 26) return `ctrl+alt+${String.fromCharCode(code + 96)}`;\n\tconst key = String.fromCharCode(code);\n\tif ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || SYMBOL_KEYS.has(key)) return `alt+${key}`;\n\treturn undefined;\n}\n\nfunction parseSingleCharacterKey(data: string): string | undefined {\n\tif (data.length !== 1) return undefined;\n\tconst code = data.charCodeAt(0);\n\tif (code >= 1 && code <= 26) return `ctrl+${String.fromCharCode(code + 96)}`;\n\treturn code >= 32 && code <= 126 ? data : undefined;\n}\n\nexport function parseKey(data: string): string | undefined {\n\tconst encodedKey = parseTerminalEncodedKey(data);\n\tif (encodedKey) return encodedKey;\n\tconst modeDependentKey = parseModeDependentLegacyKey(data);\n\tif (modeDependentKey) return modeDependentKey;\n\tconst legacySequenceKey = LEGACY_SEQUENCE_KEY_IDS[data];\n\tif (legacySequenceKey) return legacySequenceKey;\n\treturn parseLegacyAltCombination(data) ?? parseSingleCharacterKey(data);\n}\n\n// =============================================================================\n// Kitty CSI-u Printable Decoding\n// =============================================================================\n\nconst KITTY_CSI_U_REGEX = /^\\x1b\\[(\\d+)(?::(\\d*))?(?::(\\d+))?(?:;(\\d+))?(?::(\\d+))?u$/;\nconst KITTY_PRINTABLE_ALLOWED_MODIFIERS = MODIFIERS.shift | LOCK_MASK;\n\n/**\n * Decode a Kitty CSI-u sequence into a printable character, if applicable.\n *\n * When Kitty keyboard protocol flag 1 (disambiguate) is active, terminals send\n * CSI-u sequences for all keys, including plain printable characters. This\n * function extracts the printable character from such sequences.\n *\n * Only accepts plain or Shift-modified keys. Rejects Ctrl, Alt, and unsupported\n * modifier combinations (those are handled by keybinding matching instead).\n * Prefers the shifted keycode when Shift is held and a shifted key is reported.\n *\n * @param data - Raw input data from terminal\n * @returns The printable character, or undefined if not a printable CSI-u sequence\n */\nexport function decodeKittyPrintable(data: string): string | undefined {\n\tconst match = data.match(KITTY_CSI_U_REGEX);\n\tif (!match) return undefined;\n\n\t// CSI-u groups: <codepoint>[:<shifted>[:<base>]];<mod>[:<event>]u\n\tconst codepoint = Number.parseInt(match[1] ?? \"\", 10);\n\tif (!Number.isFinite(codepoint)) return undefined;\n\n\tconst shiftedKey = match[2] && match[2].length > 0 ? Number.parseInt(match[2], 10) : undefined;\n\tconst modValue = match[4] ? Number.parseInt(match[4], 10) : 1;\n\t// Modifiers are 1-indexed in CSI-u; normalize to our bitmask.\n\tconst modifier = Number.isFinite(modValue) ? modValue - 1 : 0;\n\n\t// Only accept printable CSI-u input for plain or Shift-modified text keys.\n\t// Reject unsupported modifier bits (e.g. Super/Meta) to avoid inserting\n\t// characters from modifier-only terminal events.\n\tif ((modifier & ~KITTY_PRINTABLE_ALLOWED_MODIFIERS) !== 0) return undefined;\n\tif (modifier & (MODIFIERS.alt | MODIFIERS.ctrl)) return undefined;\n\n\t// Prefer the shifted keycode when Shift is held.\n\tlet effectiveCodepoint = codepoint;\n\tif (modifier & MODIFIERS.shift && typeof shiftedKey === \"number\") {\n\t\teffectiveCodepoint = shiftedKey;\n\t}\n\teffectiveCodepoint = normalizeKittyFunctionalCodepoint(effectiveCodepoint);\n\t// Drop control characters or invalid codepoints.\n\tif (!Number.isFinite(effectiveCodepoint) || effectiveCodepoint < 32) return undefined;\n\n\ttry {\n\t\treturn String.fromCodePoint(effectiveCodepoint);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction decodeModifyOtherKeysPrintable(data: string): string | undefined {\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed) return undefined;\n\tconst modifier = parsed.modifier & ~LOCK_MASK;\n\tif ((modifier & ~MODIFIERS.shift) !== 0) return undefined;\n\tif (!Number.isFinite(parsed.codepoint) || parsed.codepoint < 32) return undefined;\n\n\ttry {\n\t\treturn String.fromCodePoint(parsed.codepoint);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function decodePrintableKey(data: string): string | undefined {\n\treturn decodeKittyPrintable(data) ?? decodeModifyOtherKeysPrintable(data);\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ring buffer for Emacs-style kill/yank operations.
|
|
3
|
+
*
|
|
4
|
+
* Tracks killed (deleted) text entries. Consecutive kills can accumulate
|
|
5
|
+
* into a single entry. Supports yank (paste most recent) and yank-pop
|
|
6
|
+
* (cycle through older entries).
|
|
7
|
+
*/
|
|
8
|
+
interface KillRingPushOptions {
|
|
9
|
+
prepend: boolean;
|
|
10
|
+
accumulate?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class KillRing {
|
|
13
|
+
private ring;
|
|
14
|
+
/**
|
|
15
|
+
* Add text to the kill ring.
|
|
16
|
+
*
|
|
17
|
+
* @param text - The killed text to add
|
|
18
|
+
* @param opts - Push options
|
|
19
|
+
* @param opts.prepend - If accumulating, prepend (backward deletion) or append (forward deletion)
|
|
20
|
+
* @param opts.accumulate - Merge with the most recent entry instead of creating a new one
|
|
21
|
+
*/
|
|
22
|
+
push(text: string, opts: KillRingPushOptions): void;
|
|
23
|
+
/** Get most recent entry without modifying the ring. */
|
|
24
|
+
peek(): string | undefined;
|
|
25
|
+
/** Move last entry to front (for yank-pop cycling). */
|
|
26
|
+
rotate(): void;
|
|
27
|
+
get length(): number;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=kill-ring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill-ring.d.ts","sourceRoot":"","sources":["../src/kill-ring.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,UAAU,mBAAmB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,QAAQ;IACpB,OAAO,CAAC,IAAI,CAAgB;IAE5B;;;;;;;OAOG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CASlD;IAED,wDAAwD;IACxD,IAAI,IAAI,MAAM,GAAG,SAAS,CAEzB;IAED,uDAAuD;IACvD,MAAM,IAAI,IAAI,CAKb;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACD","sourcesContent":["/**\n * Ring buffer for Emacs-style kill/yank operations.\n *\n * Tracks killed (deleted) text entries. Consecutive kills can accumulate\n * into a single entry. Supports yank (paste most recent) and yank-pop\n * (cycle through older entries).\n */\ninterface KillRingPushOptions {\n\tprepend: boolean;\n\taccumulate?: boolean;\n}\n\nexport class KillRing {\n\tprivate ring: string[] = [];\n\n\t/**\n\t * Add text to the kill ring.\n\t *\n\t * @param text - The killed text to add\n\t * @param opts - Push options\n\t * @param opts.prepend - If accumulating, prepend (backward deletion) or append (forward deletion)\n\t * @param opts.accumulate - Merge with the most recent entry instead of creating a new one\n\t */\n\tpush(text: string, opts: KillRingPushOptions): void {\n\t\tif (!text) return;\n\n\t\tif (opts.accumulate && this.ring.length > 0) {\n\t\t\tconst last = this.ring.pop()!;\n\t\t\tthis.ring.push(opts.prepend ? text + last : last + text);\n\t\t} else {\n\t\t\tthis.ring.push(text);\n\t\t}\n\t}\n\n\t/** Get most recent entry without modifying the ring. */\n\tpeek(): string | undefined {\n\t\treturn this.ring.length > 0 ? this.ring[this.ring.length - 1] : undefined;\n\t}\n\n\t/** Move last entry to front (for yank-pop cycling). */\n\trotate(): void {\n\t\tif (this.ring.length > 1) {\n\t\t\tconst last = this.ring.pop()!;\n\t\t\tthis.ring.unshift(last);\n\t\t}\n\t}\n\n\tget length(): number {\n\t\treturn this.ring.length;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class KillRing {
|
|
2
|
+
ring = [];
|
|
3
|
+
/**
|
|
4
|
+
* Add text to the kill ring.
|
|
5
|
+
*
|
|
6
|
+
* @param text - The killed text to add
|
|
7
|
+
* @param opts - Push options
|
|
8
|
+
* @param opts.prepend - If accumulating, prepend (backward deletion) or append (forward deletion)
|
|
9
|
+
* @param opts.accumulate - Merge with the most recent entry instead of creating a new one
|
|
10
|
+
*/
|
|
11
|
+
push(text, opts) {
|
|
12
|
+
if (!text)
|
|
13
|
+
return;
|
|
14
|
+
if (opts.accumulate && this.ring.length > 0) {
|
|
15
|
+
const last = this.ring.pop();
|
|
16
|
+
this.ring.push(opts.prepend ? text + last : last + text);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.ring.push(text);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Get most recent entry without modifying the ring. */
|
|
23
|
+
peek() {
|
|
24
|
+
return this.ring.length > 0 ? this.ring[this.ring.length - 1] : undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Move last entry to front (for yank-pop cycling). */
|
|
27
|
+
rotate() {
|
|
28
|
+
if (this.ring.length > 1) {
|
|
29
|
+
const last = this.ring.pop();
|
|
30
|
+
this.ring.unshift(last);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
get length() {
|
|
34
|
+
return this.ring.length;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=kill-ring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill-ring.js","sourceRoot":"","sources":["../src/kill-ring.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,QAAQ;IACZ,IAAI,GAAa,EAAE,CAAC;IAE5B;;;;;;;OAOG;IACH,IAAI,CAAC,IAAY,EAAE,IAAyB,EAAQ;QACnD,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAG,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IAAA,CACD;IAED,wDAAwD;IACxD,IAAI,GAAuB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CAC1E;IAED,uDAAuD;IACvD,MAAM,GAAS;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAG,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IAAA,CACD;IAED,IAAI,MAAM,GAAW;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAAA,CACxB;CACD","sourcesContent":["/**\n * Ring buffer for Emacs-style kill/yank operations.\n *\n * Tracks killed (deleted) text entries. Consecutive kills can accumulate\n * into a single entry. Supports yank (paste most recent) and yank-pop\n * (cycle through older entries).\n */\ninterface KillRingPushOptions {\n\tprepend: boolean;\n\taccumulate?: boolean;\n}\n\nexport class KillRing {\n\tprivate ring: string[] = [];\n\n\t/**\n\t * Add text to the kill ring.\n\t *\n\t * @param text - The killed text to add\n\t * @param opts - Push options\n\t * @param opts.prepend - If accumulating, prepend (backward deletion) or append (forward deletion)\n\t * @param opts.accumulate - Merge with the most recent entry instead of creating a new one\n\t */\n\tpush(text: string, opts: KillRingPushOptions): void {\n\t\tif (!text) return;\n\n\t\tif (opts.accumulate && this.ring.length > 0) {\n\t\t\tconst last = this.ring.pop()!;\n\t\t\tthis.ring.push(opts.prepend ? text + last : last + text);\n\t\t} else {\n\t\t\tthis.ring.push(text);\n\t\t}\n\t}\n\n\t/** Get most recent entry without modifying the ring. */\n\tpeek(): string | undefined {\n\t\treturn this.ring.length > 0 ? this.ring[this.ring.length - 1] : undefined;\n\t}\n\n\t/** Move last entry to front (for yank-pop cycling). */\n\trotate(): void {\n\t\tif (this.ring.length > 1) {\n\t\t\tconst last = this.ring.pop()!;\n\t\t\tthis.ring.unshift(last);\n\t\t}\n\t}\n\n\tget length(): number {\n\t\treturn this.ring.length;\n\t}\n}\n"]}
|
package/dist/latex.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface RenderLatexOptions {
|
|
2
|
+
/** Stack fractions and operator limits vertically for display math (default: false). */
|
|
3
|
+
display?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Render a basic LaTeX math expression as terminal-friendly Unicode text.
|
|
7
|
+
* Returns undefined when the expression contains unsupported or malformed syntax.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderLatex(source: string, options?: RenderLatexOptions): string | undefined;
|
|
10
|
+
//# sourceMappingURL=latex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latex.d.ts","sourceRoot":"","sources":["../src/latex.ts"],"names":[],"mappings":"AA+8CA,MAAM,WAAW,kBAAkB;IAClC,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,GAAG,SAAS,CAsChG","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// grip-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"]}
|