@drghaliasri/butex 3.2.2
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 +311 -0
- package/dist/document.d.mts +307 -0
- package/dist/document.d.ts +307 -0
- package/dist/document.js +2886 -0
- package/dist/document.js.map +1 -0
- package/dist/document.mjs +2822 -0
- package/dist/document.mjs.map +1 -0
- package/dist/document2.d.mts +353 -0
- package/dist/document2.d.ts +353 -0
- package/dist/document2.js +3321 -0
- package/dist/document2.js.map +1 -0
- package/dist/document2.mjs +3260 -0
- package/dist/document2.mjs.map +1 -0
- package/dist/index.d.mts +1430 -0
- package/dist/index.d.ts +1430 -0
- package/dist/index.global.js +5903 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +5927 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5884 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react-document.d.mts +153 -0
- package/dist/react-document.d.ts +153 -0
- package/dist/react-document.js +9597 -0
- package/dist/react-document.js.map +1 -0
- package/dist/react-document.mjs +9574 -0
- package/dist/react-document.mjs.map +1 -0
- package/dist/react-document2.d.mts +366 -0
- package/dist/react-document2.d.ts +366 -0
- package/dist/react-document2.js +10812 -0
- package/dist/react-document2.js.map +1 -0
- package/dist/react-document2.mjs +10783 -0
- package/dist/react-document2.mjs.map +1 -0
- package/dist/react.d.mts +895 -0
- package/dist/react.d.ts +895 -0
- package/dist/react.js +6955 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +6935 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/document/index.ts","../src/ast/commands/index.ts","../src/ast/arabic_ast.ts","../src/document/mathObject.ts","../src/document/mathSpans.ts","../src/document/fromJson.ts","../src/editor/atomicCommands.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/digits.ts","../src/editor/render.ts","../src/editor/display/delimiter.ts","../src/editor/display/frac.ts","../src/editor/display/sqrt.ts","../src/editor/display/env.ts","../src/diwani-font.ts","../src/editor/display/atomicCommand.ts","../src/editor/display/atomicCommandsOperators.ts","../src/editor/styles.ts","../src/document/mathEditorAdapter.ts","../src/document/render.ts","../src/document/editing.ts"],"sourcesContent":["export {\n createEmptyDocument,\n createImageBlock,\n createListBlock,\n createRawBlock,\n createTableBlock,\n createTextBlock,\n fromDocumentJson,\n isSupportedDocumentCommand,\n} from './fromJson.js';\nexport { fromMathObjectJson, isDisplayMathNode, renderMathNodeLatex } from './mathObject.js';\nexport { mathNodeFromEditorSession, mathSourceFromEditorSession } from './mathEditorAdapter.js';\nexport { buildInlines, detectMathSpans } from './mathSpans.js';\nexport { buildDocumentPreview, renderDocumentLatex } from './render.js';\nexport {\n addDocumentBlock,\n addListItem,\n addNestedListBlock,\n addTableColumn,\n addTableRow,\n createDocumentBlock,\n documentInlineText,\n moveDocumentBlock,\n removeDocumentBlock,\n removeListItem,\n removeTableColumn,\n removeTableRow,\n insertMathSpanFromEditor,\n replaceMathSpanFromEditor,\n replaceMathSpanSource,\n updateImageBlock,\n updateListItemValue,\n updateRawBlockValue,\n updateTableCell,\n updateTableColumns,\n updateTextBlockValue,\n} from './editing.js';\nexport type { DocumentInlineTarget, DocumentMathTarget, NewDocumentBlockKind } from './editing.js';\nexport type {\n DetectedMathSpan,\n DocumentBlockJson,\n DocumentBlockNode,\n DocumentCommand,\n DocumentInline,\n DocumentJson,\n DocumentListItemJson,\n DocumentNode,\n DocumentParseMode,\n DocumentPreview,\n DocumentPreviewMathIsland,\n ImageBlockNode,\n ListBlockNode,\n ListItemNode,\n MathInline,\n MathNode,\n MathObjectJson,\n RawBlockNode,\n TableBlockNode,\n TextBlockNode,\n TextInline,\n} from './types.js';\n","import type { ChainNode } from '../arabic_ast.js';\n\ntype CommandRenderContext = {\n name: string;\n optionalArgs: ChainNode[];\n mandatoryArgs: ChainNode[];\n renderChain: (chain: ChainNode) => string;\n};\n\nexport function renderCommandCore(context: CommandRenderContext): string {\n const optional = context.optionalArgs.map((arg) => `[${context.renderChain(arg)}]`).join('');\n const mandatory = context.mandatoryArgs.map((arg) => `{${context.renderChain(arg)}}`).join('');\n return context.name + optional + mandatory;\n}\n","import { renderCommandCore } from './commands/index.js';\n\nexport type ArabicNodeJson = {\n node_type: string;\n expr?: string;\n name?: string;\n superscript?: ChainJson | null;\n subscript?: ChainJson | null;\n left_delim_expr?: string;\n right_delim_expr?: string;\n inner_expr?: ChainJson;\n optional_args?: ChainJson[];\n mandatory_args?: ChainJson[];\n opening?: string;\n closing?: string;\n lines?: ChainJson[];\n};\n\nexport type ChainJson = {\n node_type: 'ChainClass';\n chain: ArabicNodeJson[];\n};\n\nexport class State {\n // Empty for now, like the Python State placeholder used by BaseNode.\n}\n\nexport class BaseAstNode {\n state: State;\n superscript: ChainNode | null;\n subscript: ChainNode | null;\n nodeType: string;\n\n constructor(state: State | null = null) {\n if (state === null) {\n state = new State();\n }\n\n this.state = state;\n this.superscript = null;\n this.subscript = null;\n this.nodeType = this.constructor.name;\n }\n\n latex(): string {\n throw new Error('NotImplementedError');\n }\n\n arabicLatex(): string {\n throw new Error('NotImplementedError');\n }\n\n toArabicLatex(): string {\n return this.arabicLatex();\n }\n\n /** Latin-style scripts: `^{...}` and `_{...}` for english_json rendering. */\n latexScripts(): string {\n let s = '';\n\n if (this.superscript !== null) {\n s += '^{' + this.superscript.latex() + '}';\n }\n\n if (this.subscript !== null) {\n s += '_{' + this.subscript.latex() + '}';\n }\n\n return s;\n }\n\n /**\n * Arabic scripts use \\\\prescript{sup}{sub}{content} (matches reference Python output).\n * Call with rendered strings for sup/sub chains (may be empty strings).\n */\n arabicLatexScripts(sup: string, sub: string, content: string): string {\n if (sup !== '' || sub !== '') {\n return '\\\\prescript{' + sup + '}{' + sub + '}{' + content + '}';\n }\n return content;\n }\n}\n\nexport class ChainNode {\n chain: BaseAstNode[];\n\n constructor(chain: BaseAstNode[] = []) {\n this.chain = chain;\n }\n\n latex(): string {\n return this.chain.map((node) => node.latex()).join(' ');\n }\n toEnglishLatex(): string {\n return this.chain.map((node) => node.latex()).join(' ');\n }\n /** RTL: reverse order relative to Latin chain (see test/ref_tests.txt). */\n arabicLatex(): string {\n const reversed = this.chain.slice().reverse();\n return reversed.map((node) => node.arabicLatex()).join(' ');\n }\n\n toArabicLatex(): string {\n return this.arabicLatex();\n }\n}\n\nexport class NumberNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'NumberObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n return this.arabicLatexScripts(sup, sub, this.expr);\n }\n}\n\nexport class CharNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'CharObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n return this.arabicLatexScripts(sup, sub, this.expr);\n }\n}\n\n/**\n * Operator leaf: value comes from JSON as-is (English or Arabic side already chosen by the service).\n * Scripts are not appended (Python parity).\n */\nexport class OperatorNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'OperatorObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr;\n }\n\n arabicLatex(): string {\n return this.expr;\n }\n}\n\nexport class DelimiterNode extends BaseAstNode {\n leftDelimExpr: string;\n innerExpr: ChainNode;\n rightDelimExpr: string;\n\n constructor(leftDelimExpr: string, innerExpr: ChainNode, rightDelimExpr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'DelimiterObject';\n this.leftDelimExpr = leftDelimExpr;\n this.innerExpr = innerExpr;\n this.rightDelimExpr = rightDelimExpr;\n }\n\n latex(): string {\n return this.leftDelimExpr + this.innerExpr.latex() + this.rightDelimExpr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n const content = this.leftDelimExpr + this.innerExpr.arabicLatex() + this.rightDelimExpr;\n return this.arabicLatexScripts(sup, sub, content);\n }\n}\n\nexport class CommandNode extends BaseAstNode {\n name: string;\n optionalArgs: ChainNode[];\n mandatoryArgs: ChainNode[];\n\n constructor(\n name: string,\n optionalArgs: ChainNode[] = [],\n mandatoryArgs: ChainNode[] = [],\n state: State | null = null\n ) {\n super(state);\n this.nodeType = 'CommandObject';\n this.name = name;\n this.optionalArgs = optionalArgs;\n this.mandatoryArgs = mandatoryArgs;\n }\n\n latex(): string {\n const content = renderCommandCore({\n name: this.name,\n optionalArgs: this.optionalArgs,\n mandatoryArgs: this.mandatoryArgs,\n renderChain: (chain) => chain.latex(),\n });\n return content + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n const arabicName = this.name === '\\\\sqrt' ? '\\\\arabsqrt' : this.name;\n const content = renderCommandCore({\n name: arabicName,\n optionalArgs: this.optionalArgs,\n mandatoryArgs: this.mandatoryArgs,\n renderChain: (chain) => chain.arabicLatex(),\n });\n return this.arabicLatexScripts(sup, sub, content);\n }\n}\n\nexport class EnvNode extends BaseAstNode {\n opening: string;\n lines: ChainNode[];\n closing: string;\n\n constructor(opening: string, lines: ChainNode[] = [], closing: string, state: State | null = null) {\n super(state);\n this.nodeType = 'EnvObject';\n this.opening = opening;\n this.lines = lines;\n this.closing = closing;\n }\n\n latex(): string {\n if (this.lines.length === 0) {\n return this.opening + this.closing + this.latexScripts();\n }\n\n const formattedLines = this.lines.map((line) => ` ${line.latex()}`);\n const content = formattedLines.join(' \\\\\\\\' + '\\n');\n return `${this.opening}\\n${content}\\n${this.closing}` + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n\n if (this.lines.length === 0) {\n return this.arabicLatexScripts(sup, sub, this.opening + this.closing);\n }\n\n const formattedLines = this.lines.map((line) => ` ${line.arabicLatex()}`);\n const content = formattedLines.join(' \\\\\\\\' + '\\n');\n const fullContent = `${this.opening}\\n${content}\\n${this.closing}`;\n return this.arabicLatexScripts(sup, sub, fullContent);\n }\n}\n\ntype ParseMode = 'english' | 'arabic';\n\nfunction parseScripts(node: BaseAstNode, json: ArabicNodeJson, mode: ParseMode): void {\n if (json.superscript) {\n node.superscript = parseChain(json.superscript, mode);\n }\n\n if (json.subscript) {\n node.subscript = parseChain(json.subscript, mode);\n }\n}\n\nfunction parseNode(json: ArabicNodeJson, mode: ParseMode): BaseAstNode {\n if (json.node_type === 'DelimiterObject') {\n const node = parseDelimiter(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'OperatorObject') {\n if (typeof json.expr !== 'string') {\n throw new Error('OperatorObject requires string expr');\n }\n const node = new OperatorNode(json.expr);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'CommandObject') {\n const node = parseCommand(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'EnvObject') {\n const node = parseEnv(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (typeof json.expr !== 'string') {\n throw new Error(`${json.node_type} requires string expr`);\n }\n\n let node: BaseAstNode;\n\n if (json.node_type === 'NumberObject') {\n node = new NumberNode(json.expr);\n } else if (json.node_type === 'CharObject') {\n node = new CharNode(json.expr);\n } else {\n throw new Error(`Unsupported node_type: ${json.node_type}`);\n }\n\n parseScripts(node, json, mode);\n return node;\n}\n\nfunction parseDelimiter(json: ArabicNodeJson, mode: ParseMode): DelimiterNode {\n if (typeof json.left_delim_expr !== 'string') {\n throw new Error('DelimiterObject requires string left_delim_expr');\n }\n\n if (!json.inner_expr || json.inner_expr.node_type !== 'ChainClass') {\n throw new Error('DelimiterObject requires ChainClass inner_expr');\n }\n\n if (typeof json.right_delim_expr !== 'string') {\n throw new Error('DelimiterObject requires string right_delim_expr');\n }\n\n const innerExpr = parseChain(json.inner_expr, mode);\n return new DelimiterNode(json.left_delim_expr, innerExpr, json.right_delim_expr);\n}\n\nfunction parseCommand(json: ArabicNodeJson, mode: ParseMode): CommandNode {\n if (typeof json.name !== 'string') {\n throw new Error('CommandObject requires string name');\n }\n\n const optionalJson = Array.isArray(json.optional_args) ? json.optional_args : [];\n const mandatoryJson = Array.isArray(json.mandatory_args) ? json.mandatory_args : [];\n const optionalArgs = optionalJson.map((arg) => parseChain(arg, mode));\n const mandatoryArgs = mandatoryJson.map((arg) => parseChain(arg, mode));\n\n return new CommandNode(json.name, optionalArgs, mandatoryArgs);\n}\n\nfunction parseEnv(json: ArabicNodeJson, mode: ParseMode): EnvNode {\n if (typeof json.opening !== 'string') {\n throw new Error('EnvObject requires string opening');\n }\n\n if (typeof json.closing !== 'string') {\n throw new Error('EnvObject requires string closing');\n }\n\n if (!Array.isArray(json.lines)) {\n throw new Error('EnvObject requires lines array');\n }\n\n const lines = json.lines.map((line) => parseChain(line, mode));\n return new EnvNode(json.opening, lines, json.closing);\n}\n\nfunction parseChain(json: ChainJson, mode: ParseMode): ChainNode {\n if (json.node_type !== 'ChainClass') {\n throw new Error(`Expected ChainClass, got: ${json.node_type}`);\n }\n\n const nodes = json.chain.map((childJson) => parseNode(childJson, mode));\n return new ChainNode(nodes);\n}\n\n/** Import AST from Python english_dict JSON (Latin expr fields). */\nexport function fromEnglishJson(json: ChainJson | ArabicNodeJson): ChainNode | BaseAstNode {\n if (json.node_type === 'ChainClass') {\n return parseChain(json as ChainJson, 'english');\n }\n return parseNode(json, 'english');\n}\n\n/** Import AST from Python arabic_dict JSON (Arabic expr fields). Same shape as English; values differ. */\nexport function fromArabicJson(json: ChainJson | ArabicNodeJson): ChainNode | BaseAstNode {\n if (json.node_type === 'ChainClass') {\n return parseChain(json as ChainJson, 'arabic');\n }\n return parseNode(json, 'arabic');\n}\n","import { ChainNode, fromArabicJson, fromEnglishJson } from '../ast/arabic_ast.js';\nimport type { DocumentParseMode, MathNode, MathObjectJson } from './types.js';\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMathObjectJson(value: unknown): value is MathObjectJson {\n return isObject(value) && value.node_type === 'MathObject';\n}\n\nfunction assertChainNode(value: unknown): ChainNode {\n if (!(value instanceof ChainNode)) {\n throw new Error('MathObject lines must parse to ChainNode');\n }\n return value;\n}\n\nexport function fromMathObjectJson(json: unknown, mode: DocumentParseMode = 'english'): MathNode {\n if (!isMathObjectJson(json)) {\n throw new Error('MathObject requires node_type \"MathObject\"');\n }\n\n if (typeof json.math_mode !== 'string') {\n throw new Error('MathObject requires string math_mode');\n }\n\n if (typeof json.closing !== 'string') {\n throw new Error('MathObject requires string closing');\n }\n\n if (!Array.isArray(json.lines) || json.lines.length === 0) {\n throw new Error('MathObject requires non-empty lines array');\n }\n\n const parseChain = mode === 'arabic' ? fromArabicJson : fromEnglishJson;\n const lines = json.lines.map((line) => assertChainNode(parseChain(line)));\n\n return {\n nodeType: 'MathObject',\n mathMode: json.math_mode,\n lines,\n closing: json.closing,\n };\n}\n\nexport function renderMathNodeLatex(math: MathNode): string {\n const lines = math.lines.map((line) => line.arabicLatex());\n\n if (math.mathMode === '$' || math.mathMode === '\\\\(') {\n return math.mathMode + lines.join(' ') + math.closing;\n }\n\n if (math.mathMode === '$$' || math.mathMode === '\\\\[') {\n if (lines.length === 1) {\n return math.mathMode + '\\n' + lines[0] + '\\n' + math.closing;\n }\n return math.mathMode + '\\n' + lines.map((line) => ` ${line}`).join(' \\\\\\\\\\n') + '\\n' + math.closing;\n }\n\n if (lines.length === 1) {\n return `${math.mathMode}\\n ${lines[0]}\\n${math.closing}`;\n }\n\n return `${math.mathMode}\\n${lines.map((line) => ` ${line}`).join(' \\\\\\\\\\n')}\\n${math.closing}`;\n}\n\nexport function isDisplayMathNode(math: MathNode): boolean {\n return math.mathMode === '$$' || math.mathMode === '\\\\[' || math.mathMode.startsWith('\\\\begin{');\n}\n","import { fromMathObjectJson } from './mathObject.js';\nimport type { DetectedMathSpan, DocumentInline, DocumentParseMode, MathObjectJson } from './types.js';\n\nconst MATH_ENVIRONMENTS = new Set([\n 'equation',\n 'equation*',\n 'align',\n 'align*',\n 'aligned',\n 'gather',\n 'gather*',\n 'multline',\n 'multline*',\n]);\n\nfunction isEscaped(value: string, index: number): boolean {\n let slashCount = 0;\n let i = index - 1;\n while (i >= 0 && value[i] === '\\\\') {\n slashCount += 1;\n i -= 1;\n }\n return slashCount % 2 === 1;\n}\n\nfunction findClosingDollar(value: string, start: number): number {\n let i = start;\n while (i < value.length) {\n if (value[i] === '$' && !isEscaped(value, i)) {\n return i;\n }\n i += 1;\n }\n return -1;\n}\n\nfunction findClosingToken(value: string, token: string, start: number): number {\n const index = value.indexOf(token, start);\n return index < 0 ? -1 : index;\n}\n\nfunction environmentSpan(value: string, start: number): DetectedMathSpan | null {\n const match = /^\\\\begin\\{([A-Za-z*]+)\\}/.exec(value.slice(start));\n if (!match) {\n return null;\n }\n\n const envName = match[1] ?? '';\n if (!MATH_ENVIRONMENTS.has(envName)) {\n return null;\n }\n\n const opening = match[0] ?? '';\n const closing = `\\\\end{${envName}}`;\n const closingStart = value.indexOf(closing, start + opening.length);\n if (closingStart < 0) {\n return null;\n }\n\n const end = closingStart + closing.length;\n return {\n start,\n end,\n source: value.slice(start, end),\n mathMode: opening,\n closing,\n };\n}\n\nexport function detectMathSpans(value: string): DetectedMathSpan[] {\n const spans: DetectedMathSpan[] = [];\n let i = 0;\n\n while (i < value.length) {\n if (value.startsWith('\\\\begin{', i)) {\n const span = environmentSpan(value, i);\n if (span) {\n spans.push(span);\n i = span.end;\n continue;\n }\n }\n\n if (value.startsWith('\\\\(', i)) {\n const close = findClosingToken(value, '\\\\)', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '\\\\(', closing: '\\\\)' });\n i = end;\n continue;\n }\n }\n\n if (value.startsWith('\\\\[', i)) {\n const close = findClosingToken(value, '\\\\]', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '\\\\[', closing: '\\\\]' });\n i = end;\n continue;\n }\n }\n\n if (value.startsWith('$$', i) && !isEscaped(value, i)) {\n const close = value.indexOf('$$', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '$$', closing: '$$' });\n i = end;\n continue;\n }\n }\n\n if (value[i] === '$' && !isEscaped(value, i)) {\n const close = findClosingDollar(value, i + 1);\n if (close >= 0) {\n const end = close + 1;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '$', closing: '$' });\n i = end;\n continue;\n }\n }\n\n i += 1;\n }\n\n return spans;\n}\n\nexport function buildInlines(\n value: string,\n mathObjects: MathObjectJson[] = [],\n mode: DocumentParseMode = 'english'\n): DocumentInline[] {\n const spans = detectMathSpans(value);\n\n if (mathObjects.length > 0 && mathObjects.length !== spans.length) {\n throw new Error(`math_objects count mismatch: detected ${String(spans.length)}, got ${String(mathObjects.length)}`);\n }\n\n const inlines: DocumentInline[] = [];\n let index = 0;\n\n spans.forEach((span, spanIndex) => {\n if (span.start > index) {\n inlines.push({ kind: 'text', text: value.slice(index, span.start) });\n }\n\n const mathJson = mathObjects[spanIndex];\n if (mathJson) {\n if (mathJson.math_mode !== span.mathMode || mathJson.closing !== span.closing) {\n throw new Error('math_objects order mismatch');\n }\n inlines.push({ kind: 'math', source: span.source, math: fromMathObjectJson(mathJson, mode) });\n } else {\n inlines.push({ kind: 'math', source: span.source, math: null });\n }\n\n index = span.end;\n });\n\n if (index < value.length) {\n inlines.push({ kind: 'text', text: value.slice(index) });\n }\n\n if (inlines.length === 0) {\n inlines.push({ kind: 'text', text: value });\n }\n\n return inlines;\n}\n","import { buildInlines } from './mathSpans.js';\nimport { detectMathSpans } from './mathSpans.js';\nimport type {\n DocumentBlockJson,\n DocumentBlockNode,\n DocumentCommand,\n DocumentListItemJson,\n DocumentNode,\n DocumentParseMode,\n ImageBlockNode,\n ListBlockNode,\n ListItemNode,\n RawBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\n\nconst TEXT_COMMANDS = new Set(['\\\\section', '\\\\subsection', '\\\\subsubsection', '\\\\paragraph']);\nconst LIST_COMMANDS = new Set(['\\\\begin{itemize}', '\\\\begin{enumerate}']);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isRecordOfStrings(value: unknown): value is Record<string, string> {\n if (!isObject(value)) {\n return false;\n }\n return Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction requireString(value: unknown, message: string): string {\n if (typeof value !== 'string') {\n throw new Error(message);\n }\n return value;\n}\n\nfunction asBlockJson(value: unknown): DocumentBlockJson {\n if (!isObject(value)) {\n throw new Error('Document block must be an object');\n }\n if (typeof value.command !== 'string') {\n throw new Error('Document block requires string command');\n }\n return value as DocumentBlockJson;\n}\n\nfunction parseTextBlock(json: DocumentBlockJson, mode: DocumentParseMode): TextBlockNode {\n const value = requireString(json.value, `${json.command} requires string value`);\n return {\n kind: 'textBlock',\n command: json.command as TextBlockNode['command'],\n value,\n inlines: buildInlines(value, json.math_objects ?? [], mode),\n };\n}\n\nfunction closingForList(command: '\\\\begin{itemize}' | '\\\\begin{enumerate}'): '\\\\end{itemize}' | '\\\\end{enumerate}' {\n return command === '\\\\begin{itemize}' ? '\\\\end{itemize}' : '\\\\end{enumerate}';\n}\n\nfunction parseListItem(json: DocumentListItemJson, mode: DocumentParseMode): ListItemNode {\n const value = requireString(json.value, 'Document list item requires string value');\n const blocksJson = Array.isArray(json.blocks) ? json.blocks : [];\n return {\n value,\n inlines: buildInlines(value, json.math_objects ?? [], mode),\n blocks: blocksJson.map((block) => parseBlock(asBlockJson(block), mode)),\n };\n}\n\nfunction parseListBlock(json: DocumentBlockJson, mode: DocumentParseMode): ListBlockNode {\n if (!Array.isArray(json.items)) {\n throw new Error(`${json.command} requires items array`);\n }\n const command = json.command as ListBlockNode['command'];\n const expectedClosing = closingForList(command);\n const closing = json.closing === undefined ? expectedClosing : requireString(json.closing, `${json.command} requires string closing`);\n if (closing !== expectedClosing) {\n throw new Error(`${json.command} closing must be ${expectedClosing}`);\n }\n return {\n kind: 'list',\n command,\n closing,\n items: json.items.map((item) => parseListItem(item, mode)),\n };\n}\n\nfunction parseTableBlock(json: DocumentBlockJson, mode: DocumentParseMode): TableBlockNode {\n if (!Array.isArray(json.rows)) {\n throw new Error('\\\\begin{tabular} requires rows array');\n }\n\n const mathObjects = json.math_objects ?? [];\n let mathObjectIndex = 0;\n const rows = json.rows.map((row) => {\n if (!Array.isArray(row)) {\n throw new Error('\\\\begin{tabular} rows must be arrays');\n }\n return row.map((cell) => {\n const value = requireString(cell, '\\\\begin{tabular} cells must be strings');\n const spanCount = detectMathSpans(value).length;\n const cellMathObjects = mathObjects.slice(mathObjectIndex, mathObjectIndex + spanCount);\n mathObjectIndex += spanCount;\n return buildInlines(value, cellMathObjects, mode);\n });\n });\n\n if (mathObjects.length > 0 && mathObjects.length !== mathObjectIndex) {\n throw new Error(`math_objects count mismatch: detected ${String(mathObjectIndex)}, got ${String(mathObjects.length)}`);\n }\n\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: typeof json.columns === 'string' ? json.columns : '',\n rows,\n };\n}\n\nfunction parseImageBlock(json: DocumentBlockJson): ImageBlockNode {\n return {\n kind: 'image',\n command: '\\\\includegraphics',\n value: requireString(json.value, '\\\\includegraphics requires string value'),\n options: isRecordOfStrings(json.options) ? json.options : {},\n };\n}\n\nfunction parseRawBlock(json: DocumentBlockJson): RawBlockNode {\n return {\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : '',\n };\n}\n\nfunction parseBlock(json: DocumentBlockJson, mode: DocumentParseMode): DocumentBlockNode {\n if (TEXT_COMMANDS.has(json.command)) {\n return parseTextBlock(json, mode);\n }\n\n if (LIST_COMMANDS.has(json.command)) {\n return parseListBlock(json, mode);\n }\n\n if (json.command === '\\\\begin{tabular}') {\n return parseTableBlock(json, mode);\n }\n\n if (json.command === '\\\\includegraphics') {\n return parseImageBlock(json);\n }\n\n if (json.command === '\\\\raw') {\n return parseRawBlock(json);\n }\n\n return {\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : json.command,\n };\n}\n\nexport function fromDocumentJson(json: unknown, mode: DocumentParseMode = 'english'): DocumentNode {\n if (!isObject(json) || json.node_type !== 'DocumentObject') {\n throw new Error('DocumentObject requires node_type \"DocumentObject\"');\n }\n\n if (!Array.isArray(json.blocks)) {\n throw new Error('DocumentObject requires blocks array');\n }\n\n return {\n nodeType: 'DocumentObject',\n blocks: json.blocks.map((block) => parseBlock(asBlockJson(block), mode)),\n };\n}\n\nexport function createEmptyDocument(): DocumentNode {\n return {\n nodeType: 'DocumentObject',\n blocks: [],\n };\n}\n\nexport function createTextBlock(command: TextBlockNode['command'], value = ''): TextBlockNode {\n return {\n kind: 'textBlock',\n command,\n value,\n inlines: buildInlines(value),\n };\n}\n\nexport function createRawBlock(value = ''): RawBlockNode {\n return {\n kind: 'raw',\n command: '\\\\raw',\n value,\n };\n}\n\nexport function createListBlock(command: ListBlockNode['command'], items: string[] = []): ListBlockNode {\n return {\n kind: 'list',\n command,\n closing: closingForList(command),\n items: items.map((value) => ({ value, inlines: buildInlines(value), blocks: [] })),\n };\n}\n\nexport function createTableBlock(rows: string[][] = [], columns = ''): TableBlockNode {\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns,\n rows: rows.map((row) => row.map((cell) => buildInlines(cell))),\n };\n}\n\nexport function createImageBlock(value = '', options: Record<string, string> = {}): ImageBlockNode {\n return {\n kind: 'image',\n command: '\\\\includegraphics',\n value,\n options,\n };\n}\n\nexport function isSupportedDocumentCommand(command: string): command is DocumentCommand {\n return (\n TEXT_COMMANDS.has(command) ||\n LIST_COMMANDS.has(command) ||\n command === '\\\\begin{tabular}' ||\n command === '\\\\includegraphics' ||\n command === '\\\\raw'\n );\n}\n","export const ATOMIC_COMMANDS = {\n ///////////////////////// Functions ////////////////////////////////\n\n //////////////// Trigonometric Functions \n cos: {\n id: 'cos',\n category: 'function',\n englishTex: '\\\\cos',\n arabicTex: '\\\\arcos',\n arabicLabel: 'جتا',\n title: 'جيب التمام',\n },\n sin: {\n id: 'sin',\n category: 'function',\n englishTex: '\\\\sin',\n arabicTex: '\\\\arsin',\n arabicLabel: 'جا',\n title: 'جيب',\n },\n tan: {\n id: 'tan',\n category: 'function',\n englishTex: '\\\\tan',\n arabicTex: '\\\\artan',\n arabicLabel: 'ظا',\n title: 'ظل',\n },\n cot: {\n id: 'cot',\n category: 'function',\n englishTex: '\\\\cot',\n arabicTex: '\\\\arcot',\n arabicLabel: 'ظتا',\n title: 'ظل تمام',\n },\n sec: {\n id: 'sec',\n category: 'function',\n englishTex: '\\\\sec',\n arabicTex: '\\\\arsec',\n arabicLabel: 'قا',\n title: 'قاطع',\n },\n csc: {\n id: 'csc',\n category: 'function',\n englishTex: '\\\\csc',\n arabicTex: '\\\\arcsc',\n arabicLabel: 'قتا',\n title: 'قاطع تمام',\n },\n\n\n /////////////////// Arc Trigonometric Functions \n arccos: {\n id: 'arccos',\n category: 'function',\n englishTex: '\\\\arccos',\n arabicTex: '\\\\aracos',\n arabicLabel: 'قجتا',\n title: 'قاطع جيب التمام',\n },\n arcsin: {\n id: 'arcsin',\n category: 'function',\n englishTex: '\\\\arcsin',\n arabicTex: '\\\\arasin',\n arabicLabel: 'قجا',\n title: 'قاطع جيب',\n },\n arctan: {\n id: 'arctan',\n category: 'function',\n englishTex: '\\\\arctan',\n arabicTex: '\\\\aratan',\n arabicLabel: 'قظا',\n title: 'قاطع ظل',\n },\n arccot: {\n id: 'arccot',\n category: 'function',\n englishTex: '\\\\arccot',\n arabicTex: '\\\\aracot',\n arabicLabel: 'قظتا',\n title: 'قاطع ظل التمام',\n },\n arcsec: {\n id: 'arcsec',\n category: 'function',\n englishTex: '\\\\arcsec',\n arabicTex: '\\\\arasec',\n arabicLabel: 'ققا',\n title: 'قاطع القاطع',\n },\n arccsc: {\n id: 'arccsc',\n category: 'function',\n englishTex: '\\\\arccsc',\n arabicTex: '\\\\aracsc',\n arabicLabel: 'ققتا',\n title: 'قاطع القاطع التمام',\n },\n\n ///////////////// Hyperbolic Functions \n cosh: {\n id: 'cosh',\n category: 'function',\n englishTex: '\\\\cosh',\n arabicTex: '\\\\arcosh',\n arabicLabel: 'جتزا',\n title: 'جيب التمام الزائد',\n },\n sinh: {\n id: 'sinh',\n category: 'function',\n englishTex: '\\\\sinh',\n arabicTex: '\\\\arsinh',\n arabicLabel: 'جزا',\n title: 'جيب الزائد',\n },\n tanh: {\n id: 'tanh',\n category: 'function',\n englishTex: '\\\\tanh',\n arabicTex: '\\\\artanh',\n arabicLabel: 'ظزا',\n title: 'ظل الزائد',\n },\n coth: {\n id: 'coth',\n category: 'function',\n englishTex: '\\\\coth',\n arabicTex: '\\\\arcoth',\n arabicLabel: 'ظتزا',\n title: 'ظل تمام الزائد',\n },\n\n ////// These function somehow doesnt exist in LaTeX and therefore MathJax, skip for now. no problem.\n // sech: {\n // id: 'sech',\n // category: 'function',\n // englishTex: '\\\\sech',\n // arabicTex: '\\\\arsech',\n // arabicLabel: 'قزا',\n // title: 'قاطع الزائد',\n // },\n // csch: {\n // id: 'csch',\n // category: 'function',\n // englishTex: '\\\\csch',\n // arabicTex: '\\\\arcsch',\n // arabicLabel: 'قتزا',\n // title: 'قاطع تمام الزائد',\n // },\n\n\n ///////////////// arc Hyperbolic Functions \n ///// Not on MathJax, skip for now, it is okay.\n\n\n\n ////////////////////// Limits & Series ////////////////////////////////\n sum: {\n id: 'sum',\n category: 'limits_series',\n englishTex: '\\\\sum',\n arabicTex: '\\\\arsum',\n arabicLabel: 'مجـــ',\n title: 'مجموع',\n },\n prod: {\n id: 'prod',\n category: 'limits_series',\n englishTex: '\\\\prod',\n arabicTex: '\\\\arprod',\n arabicLabel: 'جـــد',\n title: 'جداء',\n },\n lim: {\n id: 'lim',\n category: 'limits_series',\n englishTex: '\\\\lim',\n arabicTex: '\\\\arlim',\n arabicLabel: 'نـــــها',\n title: 'حد',\n },\n max: {\n id: 'max',\n category: 'limits_series',\n englishTex: '\\\\max',\n arabicTex: '\\\\armax',\n arabicLabel: 'أكبر',\n title: 'أكبر',\n },\n min: {\n id: 'min',\n category: 'limits_series',\n englishTex: '\\\\min',\n arabicTex: '\\\\armin',\n arabicLabel: 'أصغر',\n title: 'أصغر',\n },\n sup: {\n id: 'sup',\n category: 'limits_series',\n englishTex: '\\\\sup',\n arabicTex: '\\\\arsup',\n arabicLabel: 'أعلى',\n title: 'أعلى',\n },\n inf: {\n id: 'inf',\n category: 'limits_series',\n englishTex: '\\\\inf',\n arabicTex: '\\\\arinf',\n arabicLabel: 'أدنى',\n title: 'أدنى',\n },\n\n ////////////////////// Logarithmic and Exponential and Determinant Functions ////////////////////////////////\n pi: {\n id: 'pi',\n category: 'function2',\n englishTex: '\\\\pi',\n arabicTex: '\\\\arpi',\n arabicLabel: 'ط',\n title: 'نسبة الدائرة',\n },\n exp: {\n id: 'exp',\n category: 'function2',\n englishTex: '\\\\exp',\n arabicTex: '\\\\arexp',\n arabicLabel: 'هـ',\n title: 'أسية',\n },\n ln: {\n id: 'ln',\n category: 'function2',\n englishTex: '\\\\ln',\n arabicTex: '\\\\arln',\n arabicRenderTex: '\\\\prescript{}{\\\\arexp}{\\\\arlog}',\n arabicLabel: 'لو',\n title: 'لوغاريتم طبيعي',\n },\n log: {\n id: 'log',\n category: 'function2',\n englishTex: '\\\\log',\n arabicTex: '\\\\arlog',\n arabicLabel: 'لو',\n title: 'لوغاريتم',\n },\n det: {\n id: 'det',\n category: 'function2',\n englishTex: '\\\\det',\n arabicTex: '\\\\ardet',\n arabicLabel: 'محدد',\n title: 'محدد',\n },\n\n ////////////////////// Groups /////////////////////////////////\n N: {\n id: 'N',\n category: 'groups',\n englishTex: '\\\\mathbb{N}',\n arabicTex: '\\\\arabN',\n arabicLabel: 'ط',\n title: 'أعداد طبيعية',\n },\n Z: {\n id: 'Z',\n category: 'groups',\n englishTex: '\\\\mathbb{Z}',\n arabicTex: '\\\\arabZ',\n arabicLabel: 'ص',\n title: 'أعداد صحيحة',\n },\n Q: {\n id: 'Q',\n category: 'groups',\n englishTex: '\\\\mathbb{Q}',\n arabicTex: '\\\\arabQ',\n arabicLabel: 'ن',\n title: 'أعداد نسبية',\n },\n R: {\n id: 'R',\n category: 'groups',\n englishTex: '\\\\mathbb{R}',\n arabicTex: '\\\\arabR',\n arabicLabel: 'ح',\n title: 'أعداد حقيقية',\n },\n C: {\n id: 'C',\n category: 'groups',\n englishTex: '\\\\mathbb{C}',\n arabicTex: '\\\\arabC',\n arabicLabel: 'ع',\n title: 'أعداد عُقدية',\n },\n H: {\n id: 'H',\n category: 'groups',\n englishTex: '\\\\mathbb{H}',\n arabicTex: '\\\\arabH',\n arabicLabel: 'ر',\n title: 'أعداد رباعية',\n },\n\n ////////////////////// Operations ////////////////////////////\n\n\n ////////////////////// Spacing ////////////////////////////////\n negThinSpace: {\n id: 'negThinSpace',\n category: 'spacing',\n englishTex: '\\\\!',\n arabicTex: '\\\\!',\n arabicLabel: '',\n title: 'فراغ سالب رفيع',\n spacing: { direction: 'negative', level: 1 },\n },\n mediumSpace: {\n id: 'mediumSpace',\n category: 'spacing',\n englishTex: '\\\\:',\n arabicTex: '\\\\:',\n arabicLabel: '',\n title: 'فراغ متوسط',\n spacing: { direction: 'positive', level: 1 },\n },\n thickSpace: {\n id: 'thickSpace',\n category: 'spacing',\n englishTex: '\\\\;',\n arabicTex: '\\\\;',\n arabicLabel: '',\n title: 'فراغ عريض',\n spacing: { direction: 'positive', level: 2 },\n },\n quadSpace: {\n id: 'quadSpace',\n category: 'spacing',\n englishTex: '\\\\quad',\n arabicTex: '\\\\quad',\n arabicLabel: '',\n title: 'فراغ كبير',\n spacing: { direction: 'positive', level: 3 },\n },\n qquadSpace: {\n id: 'qquadSpace',\n category: 'spacing',\n englishTex: '\\\\qquad',\n arabicTex: '\\\\qquad',\n arabicLabel: '',\n title: 'فراغ كبير جدا',\n spacing: { direction: 'positive', level: 4 },\n },\n} as const;\n\nexport type AtomicCommandId = keyof typeof ATOMIC_COMMANDS;\nexport type AtomicCommandCategory = 'function' | 'function2' | 'limits_series' | 'groups' | 'spacing';\nexport type SpacingDirection = 'positive' | 'negative';\n\nexport type AtomicCommandSpec = (typeof ATOMIC_COMMANDS)[AtomicCommandId] & {\n arabicRenderTex?: string;\n};\nexport type SpacingCommandSpec = AtomicCommandSpec & {\n category: 'spacing';\n spacing: {\n direction: SpacingDirection;\n level: 1 | 2 | 3 | 4;\n };\n};\n\nexport function atomicCommandsByCategory(category: AtomicCommandCategory): AtomicCommandSpec[] {\n return Object.values(ATOMIC_COMMANDS).filter((command) => command.category === category);\n}\n\nexport function isSpacingCommandSpec(spec: AtomicCommandSpec | null): spec is SpacingCommandSpec {\n return spec?.category === 'spacing';\n}\n\nexport function atomicCommandSpec(id: string): AtomicCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_COMMANDS, id)\n ? ATOMIC_COMMANDS[id as AtomicCommandId]\n : null;\n}\n","export const ATOMIC_OPERATOR_COMMANDS = {\n inf: {\n id: 'inf',\n category: 'operators1',\n Tex: '\\\\infty',\n mirror: true,\n Label: '∞',\n title: 'اللانهاية',\n svg_path: null,\n },\n times: {\n id: 'times',\n category: 'operators1',\n Tex: '\\\\times',\n mirror: false,\n Label: '×',\n title: 'ضرب',\n svg_path: null,\n },\n div: {\n id: 'div',\n category: 'operators1',\n Tex: '\\\\div',\n mirror: false,\n Label: '÷',\n title: 'قسمة',\n svg_path: null,\n },\n pm: {\n id: 'pm',\n category: 'operators1',\n Tex: '\\\\pm',\n mirror: false,\n Label: '±',\n title: 'زائد أو ناقص',\n svg_path: null,\n },\n mp: {\n id: 'mp',\n category: 'operators1',\n Tex: '\\\\mp',\n mirror: false,\n Label: '∓',\n title: 'ناقص أو زائد',\n svg_path: null,\n },\n neq: {\n id: 'neq',\n category: 'operators1',\n Tex: '\\\\neq',\n mirror: false,\n Label: '≠',\n title: 'لا يساوي',\n svg_path: null,\n },\n approx: {\n id: 'approx',\n category: 'operators1',\n Tex: '\\\\approx',\n mirror: false,\n Label: '≈',\n title: 'تقريبا يساوي',\n svg_path: null,\n },\n sim: {\n id: 'sim',\n category: 'operators1',\n Tex: '\\\\sim',\n mirror: false,\n Label: '∼',\n title: 'مشابه',\n svg_path: null,\n },\n mid: {\n id: 'mid',\n category: 'operators1',\n Tex: '\\\\mid',\n mirror: false,\n Label: '∣',\n title: 'يقسم',\n svg_path: null,\n },\n leq: {\n id: 'leq',\n category: 'operators1',\n Tex: '\\\\leq',\n mirror: true,\n Label: '≤',\n title: 'أصغر من أو يساوي',\n svg_path: null,\n },\n geq: {\n id: 'geq',\n category: 'operators1',\n Tex: '\\\\geq',\n mirror: true,\n Label: '≥',\n title: 'أكبر من أو يساوي',\n svg_path: null,\n },\n\n ///// Operators 2\n propto: {\n id: 'propto',\n category: 'operators2',\n Tex: '\\\\propto',\n mirror: true,\n Label: '∝',\n title: 'يتناسب مع',\n svg_path: null,\n },\n in: {\n id: 'in',\n category: 'operators2',\n Tex: '\\\\in',\n mirror: true,\n Label: '∈',\n title: 'ينتمي إلى',\n svg_path: null,\n },\n notin: {\n id: 'notin',\n category: 'operators2',\n Tex: '\\\\notin',\n mirror: false,\n Label: '∉',\n title: 'لا ينتمي إلى',\n svg_path: null,\n },\n subset: {\n id: 'subset',\n category: 'operators2',\n Tex: '\\\\subset',\n mirror: true,\n Label: '⊂',\n title: 'مجموعة جزئية من',\n svg_path: null,\n },\n supset: {\n id: 'supset',\n category: 'operators2',\n Tex: '\\\\supset',\n mirror: true,\n Label: '⊃',\n title: 'مجموعة شاملة لـ',\n svg_path: null,\n },\n subseteq: {\n id: 'subseteq',\n category: 'operators2',\n Tex: '\\\\subseteq',\n mirror: true,\n Label: '⊆',\n title: 'مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n supseteq: {\n id: 'supseteq',\n category: 'operators2',\n Tex: '\\\\supseteq',\n mirror: true,\n Label: '⊇',\n title: 'مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n cap: {\n id: 'cap',\n category: 'operators2',\n Tex: '\\\\cap',\n mirror: false,\n Label: '∩',\n title: 'تقاطع',\n svg_path: null,\n },\n cup: {\n id: 'cup',\n category: 'operators2',\n Tex: '\\\\cup',\n mirror: false,\n Label: '∪',\n title: 'اتحاد',\n svg_path: null,\n },\n emptyset: {\n id: 'emptyset',\n category: 'operators2',\n Tex: '\\\\emptyset',\n mirror: false,\n Label: '∅',\n title: 'المجموعة الخالية',\n svg_path: null,\n },\n nsubseteq: {\n id: 'nsubseteq',\n category: 'operators2',\n Tex: '\\\\nsubseteq',\n mirror: true,\n Label: '⊈',\n title: 'ليست مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n nsupseteq: {\n id: 'nsupseteq',\n category: 'operators2',\n Tex: '\\\\nsupseteq',\n mirror: true,\n Label: '⊉',\n title: 'ليست مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n\n ///// Dots\n ldots: {\n id: 'ldots',\n category: 'dots',\n Tex: '\\\\ldots',\n mirror: false,\n Label: '…',\n title: 'نقاط أفقية',\n svg_path: null,\n },\n cdot: {\n id: 'cdot',\n category: 'dots',\n Tex: '\\\\cdot',\n mirror: false,\n Label: '·',\n title: 'نقطة ضرب',\n svg_path: null,\n },\n cdots: {\n id: 'cdots',\n category: 'dots',\n Tex: '\\\\cdots',\n mirror: false,\n Label: '⋯',\n title: 'نقاط وسطية أفقية',\n svg_path: null,\n },\n vdots: {\n id: 'vdots',\n category: 'dots',\n Tex: '\\\\vdots',\n mirror: false,\n Label: '⋮',\n title: 'نقاط عمودية',\n svg_path: null,\n },\n ddots: {\n id: 'ddots',\n category: 'dots',\n Tex: '\\\\ddots',\n mirror: true,\n displayMirror: false,\n Label: '⋱',\n title: 'نقاط قطرية',\n svg_path: null,\n },\n\n /// Operators 3\n leftrightarrowDouble: {\n id: 'leftrightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftrightarrow',\n mirror: false,\n Label: '⇔',\n title: 'يكافئ',\n svg_path: null,\n },\n rightleftharpoons: {\n id: 'rightleftharpoons',\n category: 'operators3',\n Tex: '\\\\rightleftharpoons',\n mirror: true,\n Label: '⇌',\n title: 'اتزان',\n svg_path: null,\n },\n leftarrow: {\n id: 'leftarrow',\n category: 'operators3',\n Tex: '\\\\leftarrow',\n mirror: true,\n Label: '←',\n title: 'سهم إلى اليسار',\n svg_path: null,\n },\n rightarrow: {\n id: 'rightarrow',\n category: 'operators3',\n Tex: '\\\\rightarrow',\n mirror: true,\n Label: '→',\n title: 'سهم إلى اليمين',\n svg_path: null,\n },\n leftarrowDouble: {\n id: 'leftarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftarrow',\n mirror: true,\n Label: '⇐',\n title: 'سهم مزدوج إلى اليسار',\n svg_path: null,\n },\n rightarrowDouble: {\n id: 'rightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Rightarrow',\n mirror: true,\n Label: '⇒',\n title: 'سهم مزدوج إلى اليمين',\n svg_path: null,\n },\n leftharpoonup: {\n id: 'leftharpoonup',\n category: 'operators3',\n Tex: '\\\\leftharpoonup',\n mirror: true,\n Label: '↼',\n title: 'سهم خطافي علوي إلى اليسار',\n svg_path: null,\n },\n rightharpoonup: {\n id: 'rightharpoonup',\n category: 'operators3',\n Tex: '\\\\rightharpoonup',\n mirror: true,\n Label: '⇀',\n title: 'سهم خطافي علوي إلى اليمين',\n svg_path: null,\n },\n leftharpoondown: {\n id: 'leftharpoondown',\n category: 'operators3',\n Tex: '\\\\leftharpoondown',\n mirror: true,\n Label: '↽',\n title: 'سهم خطافي سفلي إلى اليسار',\n svg_path: null,\n },\n rightharpoondown: {\n id: 'rightharpoondown',\n category: 'operators3',\n Tex: '\\\\rightharpoondown',\n mirror: true,\n Label: '⇁',\n title: 'سهم خطافي سفلي إلى اليمين',\n svg_path: null,\n },\n\n // Integrals\n int: {\n id: 'int',\n category: 'integrals',\n Tex: '\\\\int',\n mirror: true,\n Label: '∫',\n title: 'تكامل',\n svg_path: null,\n },\n iint: {\n id: 'iint',\n category: 'integrals',\n Tex: '\\\\iint',\n mirror: true,\n Label: '∬',\n title: 'تكامل مزدوج',\n svg_path: null,\n },\n iiint: {\n id: 'iiint',\n category: 'integrals',\n Tex: '\\\\iiint',\n mirror: true,\n Label: '∭',\n title: 'تكامل ثلاثي',\n svg_path: null,\n },\n iiiint: {\n id: 'iiiint',\n category: 'integrals',\n Tex: '\\\\iiiint',\n mirror: true,\n Label: '⨌',\n title: 'تكامل رباعي',\n svg_path: null,\n },\n oint: {\n id: 'oint',\n category: 'integrals',\n Tex: '\\\\oint',\n mirror: true,\n Label: '∮',\n title: 'تكامل مغلق',\n svg_path: null,\n },\n oiint: {\n id: 'oiint',\n category: 'integrals',\n Tex: '\\\\oiint',\n mirror: true,\n Label: '∯',\n title: 'تكامل سطحي مغلق',\n svg_path: null,\n },\n oiiint: {\n id: 'oiiint',\n category: 'integrals',\n Tex: '\\\\oiiint',\n mirror: true,\n Label: '∰',\n title: 'تكامل حجمي مغلق',\n svg_path: null,\n },\n} as const;\n\nexport type AtomicOperatorCommandId = keyof typeof ATOMIC_OPERATOR_COMMANDS;\n\nexport type AtomicOperatorCommandCategory =\n | 'operators1'\n | 'operators2'\n | 'operators3'\n | 'dots'\n | 'integrals';\n\nexport type AtomicOperatorCommandSpec =\n (typeof ATOMIC_OPERATOR_COMMANDS)[AtomicOperatorCommandId] & {\n displayMirror?: boolean;\n };\n\nexport function shouldMirrorOperatorDisplay(\n command: AtomicOperatorCommandSpec | null | undefined,\n): boolean {\n return command?.displayMirror ?? command?.mirror ?? false;\n}\n\nconst MIRRORED_OPERATOR_TEX = Object.values(ATOMIC_OPERATOR_COMMANDS)\n .filter((command) => command.mirror)\n .map((command) => command.Tex)\n .sort((a, b) => b.length - a.length);\n\nfunction matchingMirroredOperator(tex: string, index: number): string | null {\n for (const operatorTex of MIRRORED_OPERATOR_TEX) {\n if (!tex.startsWith(operatorTex, index)) {\n continue;\n }\n const next = tex[index + operatorTex.length];\n if (next != null && /[A-Za-z]/.test(next)) {\n continue;\n }\n return operatorTex;\n }\n return null;\n}\n\nfunction findMatchingBrace(tex: string, openIndex: number): number {\n let depth = 0;\n for (let index = openIndex; index < tex.length; index += 1) {\n const char = tex[index];\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n if (char === '{') {\n depth += 1;\n } else if (char === '}') {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nexport function mirrorBuTeXOperatorsInTex(tex: string): string {\n let result = '';\n let index = 0;\n\n while (index < tex.length) {\n if (tex.startsWith('\\\\butexmirror{', index)) {\n const end = findMatchingBrace(tex, index + '\\\\butexmirror'.length);\n if (end !== -1) {\n result += tex.slice(index, end + 1);\n index = end + 1;\n continue;\n }\n }\n\n const operatorTex = matchingMirroredOperator(tex, index);\n if (operatorTex) {\n result += `\\\\butexmirror{${operatorTex}}`;\n index += operatorTex.length;\n continue;\n }\n\n result += tex[index];\n index += 1;\n }\n\n return result;\n}\n\nexport function atomicOperatorCommandsByCategory(\n category: AtomicOperatorCommandCategory,\n): AtomicOperatorCommandSpec[] {\n return Object.values(ATOMIC_OPERATOR_COMMANDS).filter(\n (command) => command.category === category,\n );\n}\n\nexport function atomicOperatorCommandSpec(\n id: string,\n): AtomicOperatorCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_OPERATOR_COMMANDS, id)\n ? ATOMIC_OPERATOR_COMMANDS[id as AtomicOperatorCommandId]\n : null;\n}\n","import type { DigitFormId } from './types.js';\n\nconst WESTERN = '0123456789';\nconst ARABIC_INDIC = '٠١٢٣٤٥٦٧٨٩';\nconst PERSIAN_INDIC = '۰۱۲۳۴۵۶۷۸۹';\n\nconst digitSets: Record<DigitFormId, string> = {\n western: WESTERN,\n arabicIndic: ARABIC_INDIC,\n persianIndic: PERSIAN_INDIC,\n};\n\nfunction digitValue(char: string): number {\n const western = WESTERN.indexOf(char);\n if (western >= 0) {\n return western;\n }\n const arabicIndic = ARABIC_INDIC.indexOf(char);\n if (arabicIndic >= 0) {\n return arabicIndic;\n }\n return PERSIAN_INDIC.indexOf(char);\n}\n\nexport function formatDigits(value: string, digitForm: DigitFormId = 'western'): string {\n const target = digitSets[digitForm];\n return Array.from(value, (char) => {\n const value = digitValue(char);\n return value >= 0 ? target[value] : char;\n }).join('');\n}\n","import type { DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment } from './types.js';\nimport { atomicCommandSpec } from './atomicCommands.js';\nimport { atomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport { formatDigits } from './digits.js';\n\ntype RenderOptions = {\n digitForm?: DigitFormId;\n};\n\nfunction selectedDigitForm(options?: RenderOptions): DigitFormId {\n return options?.digitForm ?? 'western';\n}\n\nfunction latinScripts(node: EditorNode, options?: RenderOptions): string {\n let scripts = '';\n if (node.superscript) {\n scripts += `^{${renderChainEnglish(node.superscript, options)}}`;\n }\n if (node.subscript) {\n scripts += `_{${renderChainEnglish(node.subscript, options)}}`;\n }\n return scripts;\n}\n\nfunction optionalRootIndexEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainEnglish(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction optionalRootIndexArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainArabic(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction arabicScripts(node: EditorNode, content: string, options?: RenderOptions): string {\n const sup = node.superscript ? renderChainArabic(node.superscript, options) : '';\n const sub = node.subscript ? renderChainArabic(node.subscript, options) : '';\n if (sup !== '' || sub !== '') {\n return `\\\\prescript{${sup}}{${sub}}{${content}}`;\n }\n return content;\n}\n\nfunction renderMatrixRowsEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) => row.map((cell) => renderChainEnglish(cell, options)).join(' & '));\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? []).slice(0, node.matrixRows[0]?.length ?? 0).join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction reverseAlignmentForArabic(alignment: EnvColumnAlignment): EnvColumnAlignment {\n if (alignment === 'l') {\n return 'r';\n }\n if (alignment === 'r') {\n return 'l';\n }\n return 'c';\n}\n\nfunction renderMatrixRowsArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) =>\n row\n .slice()\n .reverse()\n .map((cell) => renderChainArabic(cell, options))\n .join(' & '),\n );\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? [])\n .slice(0, node.matrixRows[0]?.length ?? 0)\n .reverse()\n .map(reverseAlignmentForArabic)\n .join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/\\\\/g, '\\\\textbackslash{}').replace(/[{}]/g, '\\\\$&');\n}\n\nfunction renderCharContent(node: EditorNode, options?: RenderOptions): string {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const font = node.characterFont ?? 'default';\n if (font === 'takween') {\n return `\\\\butextakween{${escapeText(expr)}}`;\n }\n if (font === 'diwani') {\n return `\\\\butexdiwani{${escapeText(expr)}}`;\n }\n if (font === 'diwaniOutline') {\n return `\\\\butexdiwanioutline{${escapeText(expr)}}`;\n }\n return expr;\n}\n\nfunction renderNodeEnglish(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n return `${node.leftDelimExpr}${renderChainEnglish(node.innerExpr, options)}${node.rightDelimExpr}${latinScripts(node, options)}`;\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const body = `\\\\frac{${renderChainEnglish(node.numerator, options)}}{${renderChainEnglish(node.denominator, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const body = `\\\\sqrt${optionalRootIndexEnglish(node, options)}{${renderChainEnglish(node.radicand, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'env') {\n return `${renderMatrixRowsEnglish(node, options)}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicCommand') {\n const body = atomicCommandSpec(node.expr)?.englishTex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicOperatorCommand') {\n const body = atomicOperatorCommandSpec(node.expr)?.Tex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'char') {\n return `${renderCharContent(node, options)}${latinScripts(node, options)}`;\n }\n return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;\n}\n\nfunction renderNodeArabic(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n const content = `${node.leftDelimExpr}${renderChainArabic(node.innerExpr, options)}${node.rightDelimExpr}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const content = `\\\\frac{${renderChainArabic(node.numerator, options)}}{${renderChainArabic(node.denominator, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const content = `\\\\arabsqrt${optionalRootIndexArabic(node, options)}{${renderChainArabic(node.radicand, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'env') {\n return arabicScripts(node, renderMatrixRowsArabic(node, options), options);\n }\n if (node.kind === 'atomicCommand') {\n const spec = atomicCommandSpec(node.expr);\n const content = spec?.arabicRenderTex ?? spec?.arabicTex ?? node.expr;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'atomicOperatorCommand') {\n const spec = atomicOperatorCommandSpec(node.expr);\n const tex = spec?.Tex ?? node.expr;\n const content = spec?.mirror ? `\\\\butexmirror{${tex}}` : tex;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'char') {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const content = renderCharContent(node, options);\n return arabicScripts(node, (node.characterFont ?? 'default') === 'default'\n ? `\\\\text{${escapeText(expr)}}`\n : content, options);\n }\n return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);\n}\n\nexport function renderChainEnglish(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes.map((node) => renderNodeEnglish(node, options)).join(' ');\n}\n\nexport function renderChainArabic(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes\n .slice()\n .reverse()\n .map((node) => renderNodeArabic(node, options))\n .join(' ');\n}\n\nexport function renderEnglishLatexFromSession(session: EditorSession): string {\n return renderChainEnglish(session.englishTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n\nexport function renderArabicLatexFromSession(session: EditorSession): string {\n return renderChainArabic(session.arabicTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const DELIMITER_CSS = `\n.delim-pair {\n display: inline-flex;\n align-items: stretch;\n min-height: 1.85em;\n}\n\n.delim-inner {\n display: inline-flex;\n align-items: center;\n}\n\n.delim {\n display: inline-flex;\n align-self: stretch;\n align-items: center;\n justify-content: center;\n color: var(--butex-delim-color, #475569);\n padding: 0 1px;\n min-height: 100%;\n}\n\n.delim-glyph {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n font-size: clamp(20px, 1.08em + 0.8vh, 36px);\n transform: translateY(-20%) scaleY(var(--butex-delim-scale, 1));\n transform-origin: center;\n}\n`.trim();\n\nconst DELIMITER_BASE_HEIGHT_PX = 18;\nconst DELIMITER_MAX_SCALE = 4.8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applyDelimiterScale(pair: HTMLElement, inner: HTMLElement): void {\n const innerHeight = Math.max(inner.getBoundingClientRect().height, DELIMITER_BASE_HEIGHT_PX);\n const scale = clamp((innerHeight / DELIMITER_BASE_HEIGHT_PX) * 1.18, 1.18, DELIMITER_MAX_SCALE);\n pair.style.setProperty('--butex-delim-scale', scale.toFixed(3));\n}\n\nfunction visibleDelimiter(expr: string): string {\n return expr\n .replace('\\\\left', '')\n .replace('\\\\right', '')\n .replace('\\\\{', '{')\n .replace('\\\\}', '}');\n}\n\nexport function buildDelimiterNodeBody(node: EditorNode, buildChain: BuildChain): HTMLElement {\n const pair = document.createElement('span');\n pair.className = 'delim-pair';\n\n const left = document.createElement('span');\n left.className = 'delim delim--left';\n const leftGlyph = document.createElement('span');\n leftGlyph.className = 'delim-glyph';\n leftGlyph.textContent = visibleDelimiter(node.leftDelimExpr);\n left.appendChild(leftGlyph);\n pair.appendChild(left);\n\n const inner = document.createElement('span');\n inner.className = 'delim-inner';\n if (node.innerExpr) {\n inner.appendChild(buildChain(node.innerExpr));\n }\n pair.appendChild(inner);\n\n const right = document.createElement('span');\n right.className = 'delim delim--right';\n const rightGlyph = document.createElement('span');\n rightGlyph.className = 'delim-glyph';\n rightGlyph.textContent = visibleDelimiter(node.rightDelimExpr);\n right.appendChild(rightGlyph);\n pair.appendChild(right);\n\n applyDelimiterScale(pair, inner);\n requestAnimationFrame(() => applyDelimiterScale(pair, inner));\n\n return pair;\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const FRAC_CSS = `\n.frac {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n vertical-align: middle;\n margin: 0 3px;\n min-width: 1.5em;\n}\n\n.frac-num,\n.frac-den {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n min-height: 1.1em;\n padding: 0 4px;\n}\n\n.frac-bar {\n align-self: stretch;\n height: 1px;\n background: var(--butex-frac-bar, currentColor);\n opacity: 0.88;\n}\n`.trim();\n\nexport function buildFracNodeBody(node: EditorNode, buildChain: BuildChain): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = 'frac';\n\n const num = document.createElement('span');\n num.className = 'frac-num';\n if (node.numerator) {\n num.appendChild(buildChain(node.numerator));\n }\n\n const bar = document.createElement('span');\n bar.className = 'frac-bar';\n bar.setAttribute('aria-hidden', 'true');\n\n const den = document.createElement('span');\n den.className = 'frac-den';\n if (node.denominator) {\n den.appendChild(buildChain(node.denominator));\n }\n\n wrap.appendChild(num);\n wrap.appendChild(bar);\n wrap.appendChild(den);\n\n return wrap;\n}\n","import type { EditorChain, EditorNode, EditorSide } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const SQRT_CSS = `\n.sqrt {\n display: inline-flex;\n align-items: stretch;\n position: relative;\n vertical-align: middle;\n margin: 0 2px;\n min-height: 2.1em;\n direction: ltr;\n --butex-sqrt-scale: 1;\n}\n\n.sqrt.sqrt--english .sqrt-root {\n order: 1;\n}\n\n.sqrt.sqrt--english .sqrt-sign {\n order: 2;\n}\n\n.sqrt.sqrt--english .sqrt-radicand {\n order: 3;\n}\n\n.sqrt.sqrt--arabic .sqrt-radicand {\n order: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-sign {\n order: 2;\n}\n\n.sqrt.sqrt--arabic .sqrt-root {\n order: 3;\n}\n\n.sqrt.sqrt--arabic .sqrt-root,\n.sqrt.sqrt--arabic .sqrt-radicand {\n direction: rtl;\n}\n\n.sqrt-root {\n align-self: flex-start;\n min-width: 0.9em;\n min-height: 1em;\n margin-inline-end: -0.18em;\n transform: translate(0.16em, 0.02em);\n font-size: 0.64em;\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-root {\n margin-inline-start: -0.22em;\n margin-inline-end: 0;\n transform: translate(-0.16em, 0.02em);\n}\n\n.sqrt-root .chain {\n min-height: auto;\n}\n\n.sqrt-sign {\n display: inline-flex;\n align-items: flex-end;\n justify-content: center;\n align-self: stretch;\n line-height: 0.78;\n font-size: 2em;\n color: var(--butex-sqrt-color, currentColor);\n transform: scaleY(var(--butex-sqrt-scale));\n transform-origin: center bottom;\n margin-inline-end: -0.24em;\n min-height: 100%;\n position: relative;\n z-index: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-sign {\n transform: scaleX(-1) scaleY(var(--butex-sqrt-scale));\n margin-inline-start: -0.24em;\n margin-inline-end: 0;\n}\n\n.sqrt-radicand {\n display: inline-flex;\n align-items: center;\n min-width: 1.35em;\n min-height: 1.35em;\n padding: 0.06em 0.24em 0;\n border-top: 2px solid var(--butex-sqrt-bar, currentColor);\n transform: translateY(-0.08em);\n position: relative;\n}\n\n.sqrt-radicand .chain {\n min-height: auto;\n}\n`.trim();\n\nconst SQRT_BASE_HEIGHT_PX = 32;\nconst SQRT_MAX_SCALE = 3.8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applySqrtScale(wrap: HTMLElement, radicand: HTMLElement): void {\n const radicandHeight = Math.max(radicand.getBoundingClientRect().height, SQRT_BASE_HEIGHT_PX);\n const scale = clamp(radicandHeight / SQRT_BASE_HEIGHT_PX, 1, SQRT_MAX_SCALE);\n wrap.style.setProperty('--butex-sqrt-scale', scale.toFixed(3));\n}\n\nexport function buildSqrtNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = `sqrt sqrt--${side}`;\n\n const root = document.createElement('span');\n root.className = 'sqrt-root';\n if (node.rootIndex) {\n root.appendChild(buildChain(node.rootIndex));\n }\n\n const sign = document.createElement('span');\n sign.className = 'sqrt-sign';\n sign.setAttribute('aria-hidden', 'true');\n sign.textContent = '\\u221a';\n\n const radicand = document.createElement('span');\n radicand.className = 'sqrt-radicand';\n if (node.radicand) {\n radicand.appendChild(buildChain(node.radicand));\n }\n\n wrap.appendChild(root);\n wrap.appendChild(sign);\n wrap.appendChild(radicand);\n\n applySqrtScale(wrap, radicand);\n requestAnimationFrame(() => applySqrtScale(wrap, radicand));\n\n return wrap;\n}\n","import type { EditorChain, EditorNode, EditorSide, MatrixEnvStyle } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nconst WRAPPERS: Record<MatrixEnvStyle, { left: string; right: string }> = {\n matrix: { left: '', right: '' },\n pmatrix: { left: '(', right: ')' },\n bmatrix: { left: '[', right: ']' },\n Bmatrix: { left: '{', right: '}' },\n vmatrix: { left: '|', right: '|' },\n Vmatrix: { left: '||', right: '||' },\n};\n\nexport const MATRIX_ENV_CSS = `\n.matrix-env {\n display: inline-flex;\n align-items: stretch;\n vertical-align: middle;\n margin: 0 3px;\n --butex-matrix-delim-scale: 1.25;\n}\n\n.matrix-env__wrapper {\n display: inline-flex;\n align-self: stretch;\n align-items: center;\n justify-content: center;\n min-width: 0.42em;\n padding: 0 2px;\n color: var(--butex-delim-color, currentColor);\n font-family: ui-serif, \"Cambria Math\", \"Times New Roman\", serif;\n font-size: clamp(22px, 1.35em + 0.8vh, 42px);\n line-height: 1;\n transform: scaleY(var(--butex-matrix-delim-scale));\n transform-origin: center;\n}\n\n.matrix-env__grid {\n display: inline-grid;\n direction: ltr;\n gap: 2px 5px;\n align-items: center;\n justify-items: center;\n padding: 2px 3px;\n}\n\n.matrix-env__cell {\n min-width: 1.35em;\n min-height: 1.45em;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n border: 1px dashed rgba(148, 163, 184, 0.48);\n padding: 1px 3px;\n}\n\n.matrix-env__cell .chain {\n min-height: auto;\n}\n\n.matrix-env--arabic .matrix-env__cell {\n direction: rtl;\n}\n\n.matrix-env--english .matrix-env__cell {\n direction: ltr;\n}\n`.trim();\n\nconst MATRIX_DELIMITER_BASE_HEIGHT_PX = 20;\nconst MATRIX_DELIMITER_MAX_SCALE = 5.2;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applyMatrixDelimiterScale(wrap: HTMLElement, grid: HTMLElement): void {\n const gridHeight = Math.max(grid.getBoundingClientRect().height, MATRIX_DELIMITER_BASE_HEIGHT_PX);\n const scale = clamp((gridHeight / MATRIX_DELIMITER_BASE_HEIGHT_PX) * 1.22, 1.25, MATRIX_DELIMITER_MAX_SCALE);\n wrap.style.setProperty('--butex-matrix-delim-scale', scale.toFixed(3));\n}\n\nexport function buildMatrixEnvNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = `matrix-env matrix-env--${side}`;\n\n const style = node.envName ?? node.matrixStyle ?? 'matrix';\n const glyphs = style === 'array' || style === 'aligned' ? undefined : WRAPPERS[style];\n\n const left = document.createElement('span');\n left.className = 'matrix-env__wrapper matrix-env__wrapper--left';\n left.textContent = glyphs?.left ?? '';\n\n const grid = document.createElement('span');\n grid.className = 'matrix-env__grid';\n\n const rows = node.matrixRows ?? [];\n const columnCount = Math.max(1, ...rows.map((row) => row.length));\n grid.style.gridTemplateColumns = `repeat(${String(columnCount)}, minmax(1.35em, auto))`;\n\n const displayRows = side === 'arabic' ? rows.map((row) => row.slice().reverse()) : rows;\n for (const row of displayRows) {\n for (const cellChain of row) {\n const cell = document.createElement('span');\n cell.className = 'matrix-env__cell';\n cell.dir = side === 'arabic' ? 'rtl' : 'ltr';\n cell.appendChild(buildChain(cellChain));\n grid.appendChild(cell);\n }\n }\n\n const right = document.createElement('span');\n right.className = 'matrix-env__wrapper matrix-env__wrapper--right';\n right.textContent = glyphs?.right ?? '';\n\n wrap.appendChild(left);\n wrap.appendChild(grid);\n wrap.appendChild(right);\n\n applyMatrixDelimiterScale(wrap, grid);\n requestAnimationFrame(() => applyMatrixDelimiterScale(wrap, grid));\n\n return wrap;\n}\n","import diwaniLetterUrl from './fonts/Diwani Letter Regular.ttf';\nimport diwaniOutlineUrl from './fonts/DWNOUTSH.TTF';\nimport takweenUrl from './fonts/Takween.otf';\n\n\nexport const BUTEX_DIWANI_FONT_FAMILY = 'Diwani Letter';\nexport const BUTEX_DIWANI_OUTLINE_FONT_FAMILY = 'BuTeX Diwani Outline';\nexport const BUTEX_TAKWEEN_FONT_FAMILY = 'BuTeX Takween';\n\nexport const BUTEX_DIWANI_FONT_STACK = `\"${BUTEX_DIWANI_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\nexport const BUTEX_DIWANI_OUTLINE_FONT_STACK = `\"${BUTEX_DIWANI_OUTLINE_FONT_FAMILY}\", \"${BUTEX_DIWANI_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\nexport const BUTEX_TAKWEEN_FONT_STACK = `\"${BUTEX_TAKWEEN_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\n\nexport const BUTEX_DIWANI_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_DIWANI_FONT_FAMILY}\";\n src: url(\"${diwaniLetterUrl}\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_TAKWEEN_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_TAKWEEN_FONT_FAMILY}\";\n src: url(\"${takweenUrl}\") format(\"opentype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_DIWANI_OUTLINE_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_DIWANI_OUTLINE_FONT_FAMILY}\";\n src: url(\"${diwaniOutlineUrl}\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_FONT_FACE_CSS = `\n${BUTEX_DIWANI_FONT_FACE_CSS}\n\n${BUTEX_DIWANI_OUTLINE_FONT_FACE_CSS}\n\n${BUTEX_TAKWEEN_FONT_FACE_CSS}\n`.trim();\n","import { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandSpec, type SpacingCommandSpec } from '../atomicCommands.js';\nimport { BUTEX_DIWANI_FONT_STACK, BUTEX_DIWANI_OUTLINE_FONT_STACK } from '../../diwani-font.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_COMMAND_CSS = `\n/* Shared atomic-command display */\n.atomic-command {\n display: inline-flex;\n align-items: center;\n font-weight: 600;\n line-height: 1;\n}\n\n/* Function-style commands: sin/cos/tan families. */\n.atomic-command--arabic {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n font-size: 1.15em;\n direction: rtl;\n}\n\n.atomic-command--diwani-outline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.atomic-command--english {\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 0.96em;\n}\n\n.atomic-command-label-with-sub {\n position: relative;\n display: inline-block;\n padding-inline-end: 0.45em;\n padding-block-end: 0.22em;\n line-height: 1;\n}\n\n.atomic-command-label-with-sub__sub {\n position: absolute;\n inset-inline-end: 0;\n inset-block-end: 0;\n font-size: 0.62em;\n line-height: 1;\n}\n\n/* Spacing commands: tiny selectable marker, real spacing remains in LaTeX preview. */\n.atomic-spacing {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 3px;\n min-width: 3px;\n height: 1em;\n color: var(--butex-accent, currentColor);\n opacity: 0.62;\n}\n\n.atomic-spacing__marker {\n display: inline-block;\n width: 3px;\n height: 0.85em;\n border-radius: 999px;\n background: currentColor;\n}\n\n.atomic-spacing--negative {\n color: var(--butex-danger, #dc2626);\n}\n`.trim();\n\nfunction spacingArrowForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n const pointsWithFlow = spec.spacing.direction === 'positive';\n if (pointsWithFlow) {\n return side === 'arabic' ? '\\u2190' : '\\u2192';\n }\n return side === 'arabic' ? '\\u2192' : '\\u2190';\n}\n\nexport function spacingTooltipForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n return `${spec.title} ${spacingArrowForSide(spec, side).repeat(spec.spacing.level)}`;\n}\n\nfunction buildFunctionAtomicCommandBody(node: EditorNode, side: EditorSide, spec: AtomicCommandSpec | null): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-command atomic-command--${side}`;\n if (side === 'arabic' && spec?.category === 'groups') {\n value.classList.add('atomic-command--diwani-outline');\n }\n if (side === 'arabic' && node.expr === 'ln') {\n const label = document.createElement('span');\n label.className = 'atomic-command-label-with-sub';\n const base = document.createElement('span');\n base.className = 'atomic-command-label-with-sub__base';\n base.textContent = spec?.arabicLabel ?? node.expr;\n const sub = document.createElement('span');\n sub.className = 'atomic-command-label-with-sub__sub';\n sub.textContent = 'هـ';\n label.append(base, sub);\n value.appendChild(label);\n return value;\n }\n value.textContent = side === 'arabic' ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace('\\\\', '') ?? node.expr;\n return value;\n}\n\nfunction buildSpacingAtomicCommandBody(spec: SpacingCommandSpec, side: EditorSide): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-spacing atomic-spacing--${spec.spacing.direction} atomic-spacing--level-${String(spec.spacing.level)}`;\n value.title = spacingTooltipForSide(spec, side);\n const marker = document.createElement('span');\n marker.className = 'atomic-spacing__marker';\n value.appendChild(marker);\n return value;\n}\n\nexport function buildAtomicCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicCommandSpec(node.expr);\n if (isSpacingCommandSpec(spec)) {\n return buildSpacingAtomicCommandBody(spec, side);\n }\n return buildFunctionAtomicCommandBody(node, side, spec);\n}\n","import { atomicOperatorCommandSpec, shouldMirrorOperatorDisplay, type AtomicOperatorCommandSpec } from '../atomicCommandsOperators.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_OPERATOR_COMMAND_CSS = `\n.atomic-operator-command {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 0.9em;\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 1.05em;\n font-weight: 600;\n line-height: 1;\n}\n\n.atomic-operator-command--mirrored {\n transform: scaleX(-1);\n}\n\n.atomic-operator-command__svg {\n width: 1em;\n height: 1em;\n background: currentColor;\n}\n`.trim();\n\nfunction buildOperatorLabel(spec: AtomicOperatorCommandSpec): HTMLElement {\n const value = document.createElement('span');\n value.className = 'atomic-operator-command__label';\n value.textContent = spec.Label;\n return value;\n}\n\nexport function buildAtomicOperatorCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicOperatorCommandSpec(node.expr);\n const value = document.createElement('span');\n value.className = 'atomic-operator-command';\n value.title = spec?.title ?? node.expr;\n if (side === 'arabic' && shouldMirrorOperatorDisplay(spec)) {\n value.classList.add('atomic-operator-command--mirrored');\n }\n\n if (spec?.svg_path) {\n const icon = document.createElement('span');\n icon.className = 'atomic-operator-command__svg';\n icon.style.mask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n icon.style.webkitMask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n value.appendChild(icon);\n return value;\n }\n\n if (spec) {\n value.appendChild(buildOperatorLabel(spec));\n } else {\n const label = document.createElement('span');\n label.className = 'atomic-operator-command__label';\n label.textContent = node.expr;\n value.appendChild(label);\n }\n return value;\n}\n","import { DELIMITER_CSS } from './display/delimiter.js';\nimport { FRAC_CSS } from './display/frac.js';\nimport { SQRT_CSS } from './display/sqrt.js';\nimport { MATRIX_ENV_CSS } from './display/env.js';\nimport { ATOMIC_COMMAND_CSS } from './display/atomicCommand.js';\nimport { ATOMIC_OPERATOR_COMMAND_CSS } from './display/atomicCommandsOperators.js';\nimport {\n BUTEX_DIWANI_FONT_STACK,\n BUTEX_DIWANI_OUTLINE_FONT_STACK,\n BUTEX_FONT_FACE_CSS,\n BUTEX_TAKWEEN_FONT_STACK,\n} from '../diwani-font.js';\n\nexport const BUTEX_EDITOR_CSS = `\n${BUTEX_FONT_FACE_CSS}\n\n.surface {\n border: 1px solid var(--butex-border, #e2e8f0);\n border-radius: 12px;\n min-height: 100px;\n padding: 8px 10px;\n background: var(--butex-surface-bg, linear-gradient(180deg, #ffffff 0%, #fafbfc 100%));\n color: var(--butex-surface-fg, #0f172a);\n outline: none;\n cursor: text;\n transition: box-shadow 0.15s ease, border-color 0.15s ease;\n}\n\n.surface:focus {\n border-color: var(--butex-focus-border, rgba(13, 148, 136, 0.45));\n box-shadow: 0 0 0 3px var(--butex-focus-shadow, rgba(13, 148, 136, 0.12));\n}\n\n.surface.surface--arabic {\n direction: rtl;\n}\n\n.surface.surface--english {\n direction: ltr;\n}\n\n.node-value--takween {\n font-family: ${BUTEX_TAKWEEN_FONT_STACK};\n}\n\n.node-value--diwani {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n}\n\n.node-value--diwani-outline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.chain {\n display: inline-flex;\n align-items: center;\n gap: 0;\n min-height: 28px;\n flex-wrap: wrap;\n row-gap: 2px;\n}\n\n.slot {\n width: 5px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n border-radius: 3px;\n}\n\n.slot:hover {\n background: var(--butex-slot-hover, rgba(13, 148, 136, 0.08));\n}\n\n.slot.range-highlight {\n background: var(--butex-selection-bg, rgba(13, 148, 136, 0.34));\n width: 11px;\n min-height: 42px;\n border: 2px solid var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n position: relative;\n z-index: 1;\n}\n\n.caret {\n display: inline-block;\n width: 2px;\n height: 20px;\n background: var(--butex-caret, #0f172a);\n border-radius: 1px;\n animation: butex-editor-blink 1s step-end infinite;\n}\n\n@keyframes butex-editor-blink {\n 50% { opacity: 0; }\n}\n\n.node {\n display: inline-flex;\n align-items: stretch;\n gap: 3px;\n border-radius: 8px;\n padding: 2px 4px;\n cursor: pointer;\n border: 1px solid transparent;\n user-select: none;\n}\n\n.node.node--atomic-spacing {\n padding-inline: 0;\n margin-inline: -2px;\n border-color: transparent;\n}\n\n.node:hover {\n border-color: var(--butex-border, #e2e8f0);\n background: var(--butex-node-hover, rgba(148, 163, 184, 0.08));\n}\n\n.node.selected {\n background: var(--butex-node-selected-bg, rgba(13, 148, 136, 0.14));\n border-color: var(--butex-node-selected-border, rgba(13, 148, 136, 0.45));\n}\n\n.node.range-highlight {\n background: var(--butex-selection-bg, rgba(13, 148, 136, 0.34));\n border-color: var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n box-shadow: inset 0 0 0 3px var(--butex-selection-border, rgba(15, 118, 110, 0.9)),\n 0 0 0 1px var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n position: relative;\n z-index: 2;\n}\n\n.chain .slot.range-highlight + .node.range-highlight,\n.chain .node.range-highlight + .slot.range-highlight {\n margin-inline: -1px;\n}\n\n.node-body {\n display: inline-flex;\n align-items: stretch;\n gap: 0;\n min-height: 1.6em;\n}\n\n.node-value {\n font-size: 16px;\n font-weight: 500;\n line-height: 1.25;\n display: inline-flex;\n align-items: center;\n}\n\n.scripts {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n justify-content: space-between;\n align-items: center;\n padding: 1px 0;\n min-width: 0.75em;\n}\n\n.scripts.scripts--sup-only {\n justify-content: flex-start;\n padding-bottom: 2px;\n}\n\n.scripts.scripts--sub-only {\n justify-content: flex-end;\n padding-top: 2px;\n}\n\n.script-box {\n min-height: 12px;\n min-width: 10px;\n border-radius: 4px;\n border: 1px dashed var(--butex-script-border, #cbd5e1);\n padding: 0 2px;\n font-size: 0.68em;\n line-height: 1.15;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: var(--butex-script-bg, rgba(248, 250, 252, 0.95));\n color: var(--butex-script-color, #475569);\n}\n\n.script-box .chain {\n min-height: auto;\n}\n\n${DELIMITER_CSS}\n\n${FRAC_CSS}\n\n${SQRT_CSS}\n\n${MATRIX_ENV_CSS}\n\n${ATOMIC_COMMAND_CSS}\n\n${ATOMIC_OPERATOR_COMMAND_CSS}\n`.trim();\n\n/**\n * Injects BuTeX editor surface styles into `document.head` if not already present.\n * Browser-only; no-op if `document` is undefined (Node).\n */\nexport function injectBuTeXEditorStyles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n const id = 'butex-editor-styles';\n const existing = d.getElementById(id);\n if (existing) {\n existing.textContent = BUTEX_EDITOR_CSS;\n return;\n }\n const style = d.createElement('style');\n style.id = id;\n style.textContent = BUTEX_EDITOR_CSS;\n d.head.appendChild(style);\n}\n","import {\n BaseAstNode,\n ChainNode,\n CharNode,\n CommandNode,\n DelimiterNode,\n EnvNode,\n NumberNode,\n OperatorNode,\n} from '../ast/arabic_ast.js';\nimport {\n ATOMIC_COMMANDS,\n atomicCommandSpec,\n type AtomicCommandId,\n} from '../editor/atomicCommands.js';\nimport {\n ATOMIC_OPERATOR_COMMANDS,\n atomicOperatorCommandSpec,\n type AtomicOperatorCommandId,\n} from '../editor/atomicCommandsOperators.js';\nimport {\n buildInitialSyncMap,\n cloneEditorSession,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createEditorSession,\n createFracNode,\n createGridEnvNode,\n createSqrtNode,\n renderArabicLatexFromSession,\n} from '../editor/index.js';\nimport type {\n EditorChain,\n EditorNode,\n EditorSession,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from '../editor/index.js';\nimport type { MathNode } from './types.js';\n\nexport type MathEditorAdapterResult =\n | { editable: true; session: EditorSession }\n | { editable: false; reason: string };\n\ntype NodeAdapterResult =\n | { editable: true; node: EditorNode }\n | { editable: false; reason: string };\n\ntype UnsupportedAdapterResult = { editable: false; reason: string };\n\nexport type MathNodeFromEditorResult =\n | { ok: true; math: MathNode }\n | { ok: false; reason: string };\n\nfunction commandIdForTex(tex: string): AtomicCommandId | null {\n for (const spec of Object.values(ATOMIC_COMMANDS)) {\n const renderTex = (spec as { arabicRenderTex?: string }).arabicRenderTex;\n if (spec.englishTex === tex || spec.arabicTex === tex || renderTex === tex) {\n return spec.id as AtomicCommandId;\n }\n }\n return null;\n}\n\nfunction operatorCommandIdForTex(tex: string): AtomicOperatorCommandId | null {\n for (const spec of Object.values(ATOMIC_OPERATOR_COMMANDS)) {\n if (spec.Tex === tex) {\n return spec.id as AtomicOperatorCommandId;\n }\n }\n return null;\n}\n\nfunction cloneChainWithFreshIds(chain: EditorChain): EditorChain {\n return structuredClone(chain);\n}\n\nfunction attachScripts(astNode: { superscript: ChainNode | null; subscript: ChainNode | null }, editorNode: EditorNode): UnsupportedAdapterResult | null {\n if (astNode.superscript) {\n const sup = chainToEditorChain(astNode.superscript);\n if (!sup.editable) {\n return sup;\n }\n editorNode.superscript = sup.chain;\n }\n if (astNode.subscript) {\n const sub = chainToEditorChain(astNode.subscript);\n if (!sub.editable) {\n return sub;\n }\n editorNode.subscript = sub.chain;\n }\n return null;\n}\n\ntype ChainAdapterResult =\n | { editable: true; chain: EditorChain }\n | { editable: false; reason: string };\n\nconst MATRIX_ENV_NAMES = new Set<GridEnvName>(['matrix', 'pmatrix', 'bmatrix', 'Bmatrix', 'vmatrix', 'Vmatrix']);\n\nfunction isGridEnvName(value: string): value is GridEnvName {\n return MATRIX_ENV_NAMES.has(value as GridEnvName) || value === 'array' || value === 'aligned';\n}\n\nfunction isMatrixEnvName(value: GridEnvName): value is MatrixEnvStyle {\n return MATRIX_ENV_NAMES.has(value);\n}\n\nfunction parseEnvOpening(opening: string): { envName: GridEnvName; alignments?: EnvColumnAlignment[] } | null {\n const match = /^\\\\begin\\{([^}]+)\\}(?:\\{([lcr]+)\\})?$/.exec(opening);\n if (!match) {\n return null;\n }\n\n const envName = match[1] ?? '';\n if (!isGridEnvName(envName)) {\n return null;\n }\n\n if (envName === 'array') {\n const spec = match[2] ?? 'c';\n return {\n envName,\n alignments: spec.split('').map((alignment) => alignment as EnvColumnAlignment),\n };\n }\n\n return { envName };\n}\n\nfunction splitEnvLine(line: ChainNode): ChainNode[] {\n const cells: ChainNode[] = [];\n let current: BaseAstNode[] = [];\n for (const node of line.chain) {\n if (node instanceof OperatorNode && node.expr === '&') {\n cells.push(new ChainNode(current));\n current = [];\n } else {\n current.push(node);\n }\n }\n cells.push(new ChainNode(current));\n return cells;\n}\n\nfunction envToEditorNode(node: EnvNode): NodeAdapterResult {\n const parsed = parseEnvOpening(node.opening);\n if (!parsed) {\n return { editable: false, reason: `بيئة رياضية غير مدعومة حاليا: ${node.opening}` };\n }\n\n const expectedClosing = `\\\\end{${parsed.envName}}`;\n if (node.closing !== expectedClosing) {\n return { editable: false, reason: `إغلاق بيئة رياضية غير مدعوم حاليا: ${node.closing}` };\n }\n\n const rowCells = node.lines.map(splitEnvLine);\n const rows = Math.max(1, rowCells.length);\n const columns = Math.max(1, ...rowCells.map((row) => row.length));\n const env = createGridEnvNode(parsed.envName, rows, columns, parsed.alignments);\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const row = rowCells[rowIndex] ?? [];\n for (let columnIndex = 0; columnIndex < columns; columnIndex += 1) {\n const cell = chainToEditorChain(row[columnIndex] ?? new ChainNode());\n if (!cell.editable) {\n return cell;\n }\n env.matrixRows![rowIndex]![columnIndex] = cell.chain;\n }\n }\n\n if (parsed.envName === 'array') {\n env.columnAlignments = Array.from(\n { length: columns },\n (_, index) => parsed.alignments?.[index] ?? 'c',\n );\n }\n if (isMatrixEnvName(parsed.envName)) {\n env.matrixStyle = parsed.envName;\n }\n\n const scripts = attachScripts(node, env);\n return scripts ?? { editable: true, node: env };\n}\n\nfunction commandToEditorNode(node: CommandNode): NodeAdapterResult {\n if (node.name === '\\\\frac' && node.mandatoryArgs.length >= 2) {\n const frac = createFracNode();\n const numerator = chainToEditorChain(node.mandatoryArgs[0]!);\n const denominator = chainToEditorChain(node.mandatoryArgs[1]!);\n if (!numerator.editable) {\n return numerator;\n }\n if (!denominator.editable) {\n return denominator;\n }\n frac.numerator = numerator.chain;\n frac.denominator = denominator.chain;\n const scripts = attachScripts(node, frac);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: frac };\n }\n\n if ((node.name === '\\\\sqrt' || node.name === '\\\\arabsqrt') && node.mandatoryArgs.length >= 1) {\n const sqrt = createSqrtNode();\n const radicand = chainToEditorChain(node.mandatoryArgs[0]!);\n if (!radicand.editable) {\n return radicand;\n }\n sqrt.radicand = radicand.chain;\n if (node.optionalArgs[0]) {\n const rootIndex = chainToEditorChain(node.optionalArgs[0]);\n if (!rootIndex.editable) {\n return rootIndex;\n }\n sqrt.rootIndex = rootIndex.chain;\n }\n const scripts = attachScripts(node, sqrt);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: sqrt };\n }\n\n const atomicId = commandIdForTex(node.name);\n if (atomicId && node.optionalArgs.length === 0 && node.mandatoryArgs.length === 0) {\n const atomic = createEditorNode('atomicCommand', atomicId);\n const scripts = attachScripts(node, atomic);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: atomic };\n }\n\n const operatorId = operatorCommandIdForTex(node.name);\n if (operatorId && node.optionalArgs.length === 0 && node.mandatoryArgs.length === 0) {\n const atomicOperator = createEditorNode('atomicOperatorCommand', operatorId);\n const scripts = attachScripts(node, atomicOperator);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: atomicOperator };\n }\n\n return { editable: false, reason: `أمر رياضي غير مدعوم حاليا: ${node.name}` };\n}\n\nfunction astNodeToEditorNode(node: ChainNode['chain'][number]): NodeAdapterResult {\n if (node instanceof CharNode) {\n const editorNode = createEditorNode('char', node.expr);\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof NumberNode) {\n const editorNode = createEditorNode('number', node.expr);\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof OperatorNode) {\n return { editable: true, node: createEditorNode('operator', node.expr) };\n }\n if (node instanceof DelimiterNode) {\n const editorNode = createDelimiterNode(node.leftDelimExpr, node.rightDelimExpr);\n const inner = chainToEditorChain(node.innerExpr);\n if (!inner.editable) {\n return inner;\n }\n editorNode.innerExpr = inner.chain;\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof CommandNode) {\n return commandToEditorNode(node);\n }\n if (node instanceof EnvNode) {\n return envToEditorNode(node);\n }\n return { editable: false, reason: `عقدة رياضية غير مدعومة حاليا: ${node.nodeType}` };\n}\n\nfunction chainToEditorChain(chain: ChainNode): ChainAdapterResult {\n const nodes: EditorNode[] = [];\n for (const astNode of chain.chain) {\n const converted = astNodeToEditorNode(astNode);\n if (!converted.editable) {\n return converted;\n }\n nodes.push(converted.node);\n }\n return { editable: true, chain: createEditorChain(nodes) };\n}\n\nexport function mathObjectToEditorSession(math: MathNode): MathEditorAdapterResult {\n if (math.lines.length !== 1) {\n return { editable: false, reason: 'تحرير المعادلات متعددة الأسطر داخل المستند غير مدعوم بعد' };\n }\n\n const english = chainToEditorChain(math.lines[0]!);\n if (!english.editable) {\n return english;\n }\n\n const arabic = cloneChainWithFreshIds(english.chain);\n const session = createEditorSession(english.chain, arabic, 'english');\n session.sync = buildInitialSyncMap(session.englishTree, session.arabicTree);\n return { editable: true, session: cloneEditorSession(session) };\n}\n\ntype AstNodeResult =\n | { ok: true; node: BaseAstNode }\n | { ok: false; reason: string };\n\ntype AstChainResult =\n | { ok: true; chain: ChainNode }\n | { ok: false; reason: string };\n\nfunction attachAstScripts(editorNode: EditorNode, astNode: BaseAstNode): AstNodeResult | null {\n if (editorNode.superscript) {\n const sup = editorChainToAstChain(editorNode.superscript);\n if (!sup.ok) {\n return sup;\n }\n astNode.superscript = sup.chain;\n }\n if (editorNode.subscript) {\n const sub = editorChainToAstChain(editorNode.subscript);\n if (!sub.ok) {\n return sub;\n }\n astNode.subscript = sub.chain;\n }\n return null;\n}\n\nfunction editorEnvOpening(node: EditorNode): { opening: string; closing: string } | null {\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return null;\n }\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? []).slice(0, node.matrixRows?.[0]?.length ?? 0).join('') || 'c';\n return { opening: `\\\\begin{array}{${spec}}`, closing: '\\\\end{array}' };\n }\n return { opening: `\\\\begin{${envName}}`, closing: `\\\\end{${envName}}` };\n}\n\nfunction editorEnvToAstNode(node: EditorNode): AstNodeResult {\n const wrapper = editorEnvOpening(node);\n if (!wrapper || !node.matrixRows) {\n return { ok: false, reason: 'بيئة رياضية غير مدعومة حاليا' };\n }\n const lines: ChainNode[] = [];\n for (const row of node.matrixRows) {\n const lineNodes: BaseAstNode[] = [];\n for (let columnIndex = 0; columnIndex < row.length; columnIndex += 1) {\n if (columnIndex > 0) {\n lineNodes.push(new OperatorNode('&'));\n }\n const cell = editorChainToAstChain(row[columnIndex]!);\n if (!cell.ok) {\n return cell;\n }\n lineNodes.push(...cell.chain.chain);\n }\n lines.push(new ChainNode(lineNodes));\n }\n const env = new EnvNode(wrapper.opening, lines, wrapper.closing);\n const scripts = attachAstScripts(node, env);\n return scripts ?? { ok: true, node: env };\n}\n\nfunction editorNodeToAstNode(node: EditorNode): AstNodeResult {\n let astNode: BaseAstNode;\n\n if (node.kind === 'char') {\n astNode = new CharNode(node.expr);\n } else if (node.kind === 'number') {\n astNode = new NumberNode(node.expr);\n } else if (node.kind === 'operator') {\n astNode = new OperatorNode(node.expr);\n } else if (node.kind === 'delimiter' && node.innerExpr) {\n const inner = editorChainToAstChain(node.innerExpr);\n if (!inner.ok) {\n return inner;\n }\n astNode = new DelimiterNode(node.leftDelimExpr, inner.chain, node.rightDelimExpr);\n } else if (node.kind === 'frac' && node.numerator && node.denominator) {\n const numerator = editorChainToAstChain(node.numerator);\n const denominator = editorChainToAstChain(node.denominator);\n if (!numerator.ok) {\n return numerator;\n }\n if (!denominator.ok) {\n return denominator;\n }\n astNode = new CommandNode('\\\\frac', [], [numerator.chain, denominator.chain]);\n } else if (node.kind === 'sqrt' && node.radicand) {\n const radicand = editorChainToAstChain(node.radicand);\n if (!radicand.ok) {\n return radicand;\n }\n const optionalArgs: ChainNode[] = [];\n if (node.rootIndex && node.rootIndex.nodes.length > 0) {\n const rootIndex = editorChainToAstChain(node.rootIndex);\n if (!rootIndex.ok) {\n return rootIndex;\n }\n optionalArgs.push(rootIndex.chain);\n }\n astNode = new CommandNode('\\\\sqrt', optionalArgs, [radicand.chain]);\n } else if (node.kind === 'atomicCommand') {\n const tex = atomicCommandSpec(node.expr)?.englishTex;\n if (!tex) {\n return { ok: false, reason: `أمر رياضي غير مدعوم حاليا: ${node.expr}` };\n }\n astNode = new CommandNode(tex);\n } else if (node.kind === 'atomicOperatorCommand') {\n const tex = atomicOperatorCommandSpec(node.expr)?.Tex;\n if (!tex) {\n return { ok: false, reason: `رمز رياضي غير مدعوم حاليا: ${node.expr}` };\n }\n astNode = new CommandNode(tex);\n } else if (node.kind === 'env') {\n return editorEnvToAstNode(node);\n } else {\n return { ok: false, reason: `عقدة رياضية غير مدعومة حاليا: ${node.kind}` };\n }\n\n const scripts = attachAstScripts(node, astNode);\n return scripts ?? { ok: true, node: astNode };\n}\n\nfunction editorChainToAstChain(chain: EditorChain): AstChainResult {\n const nodes: BaseAstNode[] = [];\n for (const editorNode of chain.nodes) {\n const converted = editorNodeToAstNode(editorNode);\n if (!converted.ok) {\n return converted;\n }\n nodes.push(converted.node);\n }\n return { ok: true, chain: new ChainNode(nodes) };\n}\n\nexport function mathNodeFromEditorSession(\n session: EditorSession,\n mathMode = '$',\n closing = '$',\n): MathNodeFromEditorResult {\n const converted = editorChainToAstChain(session.englishTree);\n if (!converted.ok) {\n return converted;\n }\n return {\n ok: true,\n math: {\n nodeType: 'MathObject',\n mathMode,\n lines: [converted.chain],\n closing,\n },\n };\n}\n\n/** Delimited Arabic TeX for document text/preview — matches `<ButexEditor />` arabic output. */\nexport function mathSourceFromEditorSession(\n session: EditorSession,\n mathMode = '$',\n closing = '$',\n): string {\n const inner = renderArabicLatexFromSession(session);\n if (mathMode === '$' || mathMode === '\\\\(') {\n return mathMode + inner + closing;\n }\n if (mathMode === '$$' || mathMode === '\\\\[') {\n if (!inner.includes('\\n')) {\n return `${mathMode}\\n${inner}\\n${closing}`;\n }\n return `${mathMode}\\n${inner.split('\\n').map((line) => ` ${line}`).join(' \\\\\\\\\\n')}\\n${closing}`;\n }\n return `${mathMode}\\n ${inner}\\n${closing}`;\n}\n\nexport function mathSourceWithReplacement(source: string, replacementInnerLatex: string): string {\n if (source.startsWith('$$') && source.endsWith('$$')) {\n return `$$${replacementInnerLatex}$$`;\n }\n if (source.startsWith('$') && source.endsWith('$')) {\n return `$${replacementInnerLatex}$`;\n }\n if (source.startsWith('\\\\(') && source.endsWith('\\\\)')) {\n return `\\\\(${replacementInnerLatex}\\\\)`;\n }\n if (source.startsWith('\\\\[') && source.endsWith('\\\\]')) {\n return `\\\\[${replacementInnerLatex}\\\\]`;\n }\n const begin = /^\\\\begin\\{([A-Za-z*]+)\\}/.exec(source);\n if (begin) {\n const opening = begin[0] ?? '';\n const closing = `\\\\end{${begin[1] ?? ''}}`;\n if (source.endsWith(closing)) {\n return `${opening}${replacementInnerLatex}${closing}`;\n }\n }\n return replacementInnerLatex;\n}\n","import { isDisplayMathNode, renderMathNodeLatex } from './mathObject.js';\nimport type {\n DocumentBlockNode,\n DocumentInline,\n DocumentNode,\n DocumentPreview,\n DocumentPreviewMathIsland,\n ImageBlockNode,\n ListBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\n\nfunction renderInlineLatex(inline: DocumentInline): string {\n if (inline.kind === 'text') {\n return inline.text;\n }\n return inline.math ? renderMathNodeLatex(inline.math) : inline.source;\n}\n\nfunction renderInlinesLatex(inlines: DocumentInline[]): string {\n return inlines.map((inline) => renderInlineLatex(inline)).join('');\n}\n\nfunction renderTextBlockLatex(block: TextBlockNode): string {\n return `${block.command}{${renderInlinesLatex(block.inlines)}}`;\n}\n\nfunction indent(value: string): string {\n return value\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction renderListBlockLatex(block: ListBlockNode): string {\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => '\\n' + indent(renderBlockLatex(child))).join('');\n return ` \\\\item ${renderInlinesLatex(item.inlines)}${nested}`;\n })\n .join('\\n');\n return `${block.command}\\n${items}\\n${block.closing}`;\n}\n\nfunction renderTableBlockLatex(block: TableBlockNode): string {\n const rows = block.rows\n .map((row) => ` ${row.map((cell) => renderInlinesLatex(cell)).join(' & ')}`)\n .join(' \\\\\\\\\\n');\n return `${block.command}{${block.columns}}\\n${rows}\\n${block.closing}`;\n}\n\nfunction renderImageOptions(block: ImageBlockNode): string {\n const entries = Object.entries(block.options);\n if (entries.length === 0) {\n return '';\n }\n return `[${entries.map(([key, value]) => `${key}=${value}`).join(',')}]`;\n}\n\nfunction renderBlockLatex(block: DocumentBlockNode): string {\n if (block.kind === 'textBlock') {\n return renderTextBlockLatex(block);\n }\n if (block.kind === 'list') {\n return renderListBlockLatex(block);\n }\n if (block.kind === 'table') {\n return renderTableBlockLatex(block);\n }\n if (block.kind === 'image') {\n return `${block.command}${renderImageOptions(block)}{${block.value}}`;\n }\n return block.value;\n}\n\nexport function renderDocumentLatex(document: DocumentNode): string {\n return document.blocks.map((block) => renderBlockLatex(block)).join('\\n\\n');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"');\n}\n\nfunction renderPreviewInlines(\n inlines: DocumentInline[],\n islands: DocumentPreviewMathIsland[]\n): string {\n return inlines\n .map((inline) => {\n if (inline.kind === 'text') {\n return escapeHtml(inline.text);\n }\n\n const tex = inline.math ? renderMathNodeLatex(inline.math) : inline.source;\n const id = `math-${String(islands.length)}`;\n const display = inline.math\n ? isDisplayMathNode(inline.math)\n : inline.source.startsWith('$$') || inline.source.startsWith('\\\\[') || inline.source.startsWith('\\\\begin{');\n islands.push({ id, tex, display });\n return `<span class=\"butex-document-math-island\" data-math-id=\"${id}\" data-math-display=\"${display ? 'true' : 'false'}\">${escapeHtml(tex)}</span>`;\n })\n .join('');\n}\n\nfunction renderPreviewBlock(block: DocumentBlockNode, islands: DocumentPreviewMathIsland[]): string {\n if (block.kind === 'textBlock') {\n const tagByCommand: Record<TextBlockNode['command'], string> = {\n '\\\\section': 'h1',\n '\\\\subsection': 'h2',\n '\\\\subsubsection': 'h3',\n '\\\\paragraph': 'p',\n };\n const tag = tagByCommand[block.command];\n return `<${tag}>${renderPreviewInlines(block.inlines, islands)}</${tag}>`;\n }\n\n if (block.kind === 'list') {\n const tag = block.command === '\\\\begin{enumerate}' ? 'ol' : 'ul';\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => renderPreviewBlock(child, islands)).join('');\n return `<li>${renderPreviewInlines(item.inlines, islands)}${nested}</li>`;\n })\n .join('');\n return `<${tag}>${items}</${tag}>`;\n }\n\n if (block.kind === 'table') {\n const rows = block.rows\n .map((row) => `<tr>${row.map((cell) => `<td>${renderPreviewInlines(cell, islands)}</td>`).join('')}</tr>`)\n .join('');\n return `<table><tbody>${rows}</tbody></table>`;\n }\n\n if (block.kind === 'image') {\n return `<img src=\"${escapeHtml(block.value)}\" alt=\"\" />`;\n }\n\n return `<pre>${escapeHtml(block.value)}</pre>`;\n}\n\nexport function buildDocumentPreview(document: DocumentNode): DocumentPreview {\n const mathIslands: DocumentPreviewMathIsland[] = [];\n const html = document.blocks.map((block) => renderPreviewBlock(block, mathIslands)).join('\\n');\n return { html, mathIslands };\n}\n","import { buildInlines } from './mathSpans.js';\nimport type {\n DocumentBlockNode,\n DocumentInline,\n DocumentNode,\n ImageBlockNode,\n ListBlockNode,\n ListItemNode,\n MathNode,\n RawBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\nimport { renderMathNodeLatex } from './mathObject.js';\n\nexport type NewDocumentBlockKind =\n | 'section'\n | 'subsection'\n | 'subsubsection'\n | 'paragraph'\n | 'itemize'\n | 'enumerate'\n | 'table'\n | 'image'\n | 'raw';\n\nexport type DocumentMathTarget =\n | { scope: 'block'; blockIndex: number; spanIndex: number }\n | { scope: 'listItem'; blockIndex: number; itemIndex: number; spanIndex: number }\n | { scope: 'tableCell'; blockIndex: number; rowIndex: number; columnIndex: number; spanIndex: number };\n\nexport type DocumentInlineTarget =\n | { scope: 'block'; blockIndex: number }\n | { scope: 'listItem'; blockIndex: number; itemIndex: number }\n | { scope: 'tableCell'; blockIndex: number; rowIndex: number; columnIndex: number };\n\nfunction cloneDocument(document: DocumentNode): DocumentNode {\n return {\n nodeType: 'DocumentObject',\n blocks: document.blocks.map(cloneBlock),\n };\n}\n\nfunction cloneInlines(inlines: DocumentInline[]): DocumentInline[] {\n return inlines.map((inline) =>\n inline.kind === 'text'\n ? { kind: 'text', text: inline.text }\n : { kind: 'math', source: inline.source, math: inline.math },\n );\n}\n\nfunction cloneListItem(item: ListItemNode): ListItemNode {\n return {\n value: item.value,\n inlines: cloneInlines(item.inlines),\n blocks: item.blocks.map(cloneBlock),\n };\n}\n\nfunction cloneBlock(block: DocumentBlockNode): DocumentBlockNode {\n if (block.kind === 'textBlock') {\n return { ...block, inlines: cloneInlines(block.inlines) };\n }\n if (block.kind === 'list') {\n return { ...block, items: block.items.map(cloneListItem) };\n }\n if (block.kind === 'table') {\n return {\n ...block,\n rows: block.rows.map((row) => row.map((cell) => cloneInlines(cell))),\n };\n }\n if (block.kind === 'image') {\n return { ...block, options: { ...block.options } };\n }\n return { ...block };\n}\n\nfunction inlinesToValue(inlines: DocumentInline[]): string {\n return inlines.map((inline) => (inline.kind === 'text' ? inline.text : inline.source)).join('');\n}\n\nfunction textBlock(command: TextBlockNode['command'], value = ''): TextBlockNode {\n return { kind: 'textBlock', command, value, inlines: buildInlines(value) };\n}\n\nfunction listBlock(command: ListBlockNode['command']): ListBlockNode {\n return {\n kind: 'list',\n command,\n closing: command === '\\\\begin{itemize}' ? '\\\\end{itemize}' : '\\\\end{enumerate}',\n items: [{ value: '', inlines: buildInlines(''), blocks: [] }],\n };\n}\n\nfunction tableBlock(): TableBlockNode {\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: 'cc',\n rows: [\n [buildInlines(''), buildInlines('')],\n [buildInlines(''), buildInlines('')],\n ],\n };\n}\n\nfunction imageBlock(): ImageBlockNode {\n return { kind: 'image', command: '\\\\includegraphics', value: '', options: {} };\n}\n\nfunction rawBlock(): RawBlockNode {\n return { kind: 'raw', command: '\\\\raw', value: '' };\n}\n\nexport function createDocumentBlock(kind: NewDocumentBlockKind): DocumentBlockNode {\n if (kind === 'section') {\n return textBlock('\\\\section');\n }\n if (kind === 'subsection') {\n return textBlock('\\\\subsection');\n }\n if (kind === 'subsubsection') {\n return textBlock('\\\\subsubsection');\n }\n if (kind === 'paragraph') {\n return textBlock('\\\\paragraph');\n }\n if (kind === 'itemize') {\n return listBlock('\\\\begin{itemize}');\n }\n if (kind === 'enumerate') {\n return listBlock('\\\\begin{enumerate}');\n }\n if (kind === 'table') {\n return tableBlock();\n }\n if (kind === 'image') {\n return imageBlock();\n }\n return rawBlock();\n}\n\nexport function addDocumentBlock(document: DocumentNode, kind: NewDocumentBlockKind): DocumentNode {\n const next = cloneDocument(document);\n next.blocks.push(createDocumentBlock(kind));\n return next;\n}\n\nexport function removeDocumentBlock(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n next.blocks.splice(blockIndex, 1);\n return next;\n}\n\nexport function moveDocumentBlock(document: DocumentNode, blockIndex: number, direction: -1 | 1): DocumentNode {\n const next = cloneDocument(document);\n const targetIndex = blockIndex + direction;\n if (blockIndex < 0 || targetIndex < 0 || blockIndex >= next.blocks.length || targetIndex >= next.blocks.length) {\n return document;\n }\n const [block] = next.blocks.splice(blockIndex, 1);\n if (!block) {\n return document;\n }\n next.blocks.splice(targetIndex, 0, block);\n return next;\n}\n\nexport function updateTextBlockValue(document: DocumentNode, blockIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'textBlock') {\n return document;\n }\n block.value = value;\n block.inlines = buildInlines(value);\n return next;\n}\n\nexport function updateRawBlockValue(document: DocumentNode, blockIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'raw') {\n return document;\n }\n block.value = value;\n return next;\n}\n\nexport function updateImageBlock(document: DocumentNode, blockIndex: number, value: string, options: Record<string, string>): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'image') {\n return document;\n }\n block.value = value;\n block.options = options;\n return next;\n}\n\nexport function updateListItemValue(document: DocumentNode, blockIndex: number, itemIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list' || !block.items[itemIndex]) {\n return document;\n }\n block.items[itemIndex].value = value;\n block.items[itemIndex].inlines = buildInlines(value);\n return next;\n}\n\nexport function addListItem(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list') {\n return document;\n }\n block.items.push({ value: '', inlines: buildInlines(''), blocks: [] });\n return next;\n}\n\nexport function removeListItem(document: DocumentNode, blockIndex: number, itemIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list' || block.items.length <= 1) {\n return document;\n }\n block.items.splice(itemIndex, 1);\n return next;\n}\n\nexport function addNestedListBlock(\n document: DocumentNode,\n blockIndex: number,\n itemIndex: number,\n kind: 'itemize' | 'enumerate',\n): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n const item = block?.kind === 'list' ? block.items[itemIndex] : null;\n if (!item) {\n return document;\n }\n item.blocks.push(createDocumentBlock(kind));\n return next;\n}\n\nexport function updateTableCell(document: DocumentNode, blockIndex: number, rowIndex: number, columnIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || !block.rows[rowIndex] || !block.rows[rowIndex][columnIndex]) {\n return document;\n }\n block.rows[rowIndex][columnIndex] = buildInlines(value);\n return next;\n}\n\nexport function updateTableColumns(document: DocumentNode, blockIndex: number, columns: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n block.columns = columns;\n return next;\n}\n\nexport function addTableRow(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n const columns = Math.max(1, block.rows[0]?.length ?? 1);\n block.rows.push(Array.from({ length: columns }, () => buildInlines('')));\n return next;\n}\n\nexport function removeTableRow(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || block.rows.length <= 1) {\n return document;\n }\n block.rows.pop();\n return next;\n}\n\nexport function addTableColumn(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n for (const row of block.rows) {\n row.push(buildInlines(''));\n }\n block.columns += 'c';\n return next;\n}\n\nexport function removeTableColumn(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || (block.rows[0]?.length ?? 0) <= 1) {\n return document;\n }\n for (const row of block.rows) {\n row.pop();\n }\n block.columns = block.columns.slice(0, -1);\n return next;\n}\n\nfunction mathInlineFromMathNode(math: MathNode): DocumentInline {\n return { kind: 'math', source: renderMathNodeLatex(math), math };\n}\n\nfunction replaceInlinesMath(inlines: DocumentInline[], spanIndex: number, source: string, math: MathNode | null = null): DocumentInline[] {\n let mathIndex = 0;\n return inlines.map((inline) => {\n if (inline.kind !== 'math') {\n return inline;\n }\n if (mathIndex === spanIndex) {\n mathIndex += 1;\n return { kind: 'math', source, math };\n }\n mathIndex += 1;\n return inline;\n });\n}\n\nfunction replaceMathSpan(document: DocumentNode, target: DocumentMathTarget, source: string, math: MathNode | null): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[target.blockIndex];\n if (!block) {\n return document;\n }\n\n if (target.scope === 'block' && block.kind === 'textBlock') {\n block.inlines = replaceInlinesMath(block.inlines, target.spanIndex, source, math);\n block.value = inlinesToValue(block.inlines);\n return next;\n }\n\n if (target.scope === 'listItem' && block.kind === 'list') {\n const item: ListItemNode | undefined = block.items[target.itemIndex];\n if (!item) {\n return document;\n }\n item.inlines = replaceInlinesMath(item.inlines, target.spanIndex, source, math);\n item.value = inlinesToValue(item.inlines);\n return next;\n }\n\n if (target.scope === 'tableCell' && block.kind === 'table') {\n const cell = block.rows[target.rowIndex]?.[target.columnIndex];\n if (!cell) {\n return document;\n }\n block.rows[target.rowIndex]![target.columnIndex] = replaceInlinesMath(cell, target.spanIndex, source, math);\n return next;\n }\n\n return document;\n}\n\nexport function replaceMathSpanSource(document: DocumentNode, target: DocumentMathTarget, source: string): DocumentNode {\n return replaceMathSpan(document, target, source, null);\n}\n\nexport function replaceMathSpanFromEditor(\n document: DocumentNode,\n target: DocumentMathTarget,\n math: MathNode,\n source?: string,\n): DocumentNode {\n return replaceMathSpan(document, target, source ?? renderMathNodeLatex(math), math);\n}\n\nfunction insertInlineAt(inlines: DocumentInline[], index: number, inline: DocumentInline): DocumentInline[] {\n const value = inlinesToValue(inlines);\n const safeIndex = Math.max(0, Math.min(index, value.length));\n const before = value.slice(0, safeIndex);\n const after = value.slice(safeIndex);\n const next: DocumentInline[] = [];\n if (before) {\n next.push(...buildInlines(before));\n }\n next.push(inline);\n if (after) {\n next.push(...buildInlines(after));\n }\n return next;\n}\n\nexport function insertMathSpanFromEditor(\n document: DocumentNode,\n target: DocumentInlineTarget,\n insertAt: number,\n math: MathNode,\n source?: string,\n): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[target.blockIndex];\n if (!block) {\n return document;\n }\n const inline: DocumentInline = source\n ? { kind: 'math', source, math }\n : mathInlineFromMathNode(math);\n\n if (target.scope === 'block' && block.kind === 'textBlock') {\n block.inlines = insertInlineAt(block.inlines, insertAt, inline);\n block.value = inlinesToValue(block.inlines);\n return next;\n }\n\n if (target.scope === 'listItem' && block.kind === 'list') {\n const item = block.items[target.itemIndex];\n if (!item) {\n return document;\n }\n item.inlines = insertInlineAt(item.inlines, insertAt, inline);\n item.value = inlinesToValue(item.inlines);\n return next;\n }\n\n if (target.scope === 'tableCell' && block.kind === 'table') {\n const cell = block.rows[target.rowIndex]?.[target.columnIndex];\n if (!cell) {\n return document;\n }\n block.rows[target.rowIndex]![target.columnIndex] = insertInlineAt(cell, insertAt, inline);\n return next;\n }\n\n return document;\n}\n\nexport function documentInlineText(inlines: DocumentInline[]): string {\n return inlinesToValue(inlines);\n}\n"],"mappings":"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","names":["node","parseChain","isObject","value","document","document"]}
|