mardora 1.2.1 → 1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/paragraph-plugin.ts","../src/plugins/heading-plugin.ts","../src/plugins/inline-plugin.ts","../src/plugins/link-plugin.ts","../src/plugins/list-plugin.ts","../src/plugins/table-controls.ts","../src/plugins/table-controls-theme.ts","../src/plugins/table-model.ts","../src/plugins/table-plugin.ts","../src/plugins/html-plugin.ts","../src/editor/media-lightbox.ts","../src/editor/media-lightbox-theme.ts","../src/plugins/image-plugin.ts","../src/plugins/math-plugin.ts","../src/plugins/mermaid-plugin.ts","../src/plugins/code-plugin.theme.ts","../src/plugins/code-plugin.ts","../src/plugins/quote-plugin.ts","../src/plugins/hr-plugin.ts","../src/plugins/emoji-plugin.ts","../src/plugins/index.ts"],"names":["theme","Decoration","syntaxTree","WidgetType","EditorView","BREAK_TAG","BREAK_TAG_REGEX","isEscaped","canonicalizeBreakTags","escapeUnescapedPipes","normalizeCellContent","normalizeParsedTable","buildEmptyRow","document","view","tags","EditorState","classes","pos"],"mappings":"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","file":"chunk-SMHHXYOS.js","sourcesContent":["import { SyntaxNode } from \"@lezer/common\";\nimport { MardoraPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\n\n/**\n * ParagraphPlugin - Adds top and bottom padding to paragraphs in preview\n *\n * Applies visual spacing to markdown paragraphs for better readability\n */\nexport class ParagraphPlugin extends MardoraPlugin {\n readonly name = \"paragraph\";\n readonly version = \"1.0.0\";\n override readonly requiredNodes = [\"Paragraph\"] as const;\n\n /**\n * Plugin theme for preview styling\n */\n override get theme() {\n return theme;\n }\n\n override renderToHTML(node: SyntaxNode, children: string): string | null {\n if (node.name !== \"Paragraph\") {\n return null;\n }\n\n return `<p class=\"cm-mardora-paragraph\">${children}</p>`;\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-mardora-paragraph\": {\n paddingTop: \"0.5em\",\n paddingBottom: \"0.5em\",\n },\n },\n});\n","import { Decoration } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport type { PreviewContext } from \"../preview/types\";\n\n/**\n * Node types for ATX headings in markdown\n */\nconst HEADING_TYPES = [\"ATXHeading1\", \"ATXHeading2\", \"ATXHeading3\", \"ATXHeading4\", \"ATXHeading5\", \"ATXHeading6\"];\n\n/**\n * Mark decorations for heading content\n */\nconst headingMarkDecorations = {\n \"heading-1\": Decoration.mark({ class: \"cm-mardora-h1\" }),\n \"heading-2\": Decoration.mark({ class: \"cm-mardora-h2\" }),\n \"heading-3\": Decoration.mark({ class: \"cm-mardora-h3\" }),\n \"heading-4\": Decoration.mark({ class: \"cm-mardora-h4\" }),\n \"heading-5\": Decoration.mark({ class: \"cm-mardora-h5\" }),\n \"heading-6\": Decoration.mark({ class: \"cm-mardora-h6\" }),\n \"header-mark-class\": Decoration.mark({ class: \"cm-mardora-header-mark\" }),\n \"heading-mark\": Decoration.replace({}),\n};\n\n/**\n * Line decorations for heading lines\n */\nconst headingLineDecorations = {\n \"heading-1\": Decoration.line({ class: \"cm-mardora-line-h1\" }),\n \"heading-2\": Decoration.line({ class: \"cm-mardora-line-h2\" }),\n \"heading-3\": Decoration.line({ class: \"cm-mardora-line-h3\" }),\n \"heading-4\": Decoration.line({ class: \"cm-mardora-line-h4\" }),\n \"heading-5\": Decoration.line({ class: \"cm-mardora-line-h5\" }),\n \"heading-6\": Decoration.line({ class: \"cm-mardora-line-h6\" }),\n};\n\n/**\n * HeadingPlugin - Decorates markdown headings\n *\n * Adds visual styling to ATX headings (# through ######)\n * - Line decorations for the entire heading line\n * - Mark decorations for heading content\n * - Hides # markers when cursor is not in the heading\n */\nexport class HeadingPlugin extends DecorationPlugin {\n readonly name = \"heading\";\n readonly version = \"1.0.0\";\n override decorationPriority = 10;\n override readonly requiredNodes = [\n \"ATXHeading1\",\n \"ATXHeading2\",\n \"ATXHeading3\",\n \"ATXHeading4\",\n \"ATXHeading5\",\n \"ATXHeading6\",\n \"HeaderMark\",\n ] as const;\n\n /**\n * Constructor - calls super constructor\n */\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Build heading decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (!HEADING_TYPES.includes(name)) {\n return;\n }\n\n const level = parseInt(name.slice(-1), 10);\n const headingClass = `heading-${level}` as keyof typeof headingMarkDecorations;\n const lineClass = `heading-${level}` as keyof typeof headingLineDecorations;\n\n // Add line decoration\n const line = view.state.doc.lineAt(from);\n decorations.push(headingLineDecorations[lineClass].range(line.from));\n\n // Add mark decoration for the heading content\n decorations.push(headingMarkDecorations[headingClass].range(from, to));\n\n // Find and hide the heading marker (#). Heading level changes are handled by the selection toolbar.\n const headingMark = node.node.getChild(\"HeaderMark\");\n if (headingMark) {\n const markEnd = Math.min(headingMark.to + 1, line.to);\n // Clamp to line end so replace decoration never spans a newline.\n decorations.push(headingMarkDecorations[\"heading-mark\"].range(headingMark.from, markEnd));\n }\n },\n });\n }\n\n override renderToHTML(node: SyntaxNode, children: string, ctx: PreviewContext): string | null {\n if (node.name === \"HeaderMark\") {\n return \"\";\n }\n\n if (!HEADING_TYPES.includes(node.name)) {\n return null;\n }\n\n const level = parseInt(node.name.slice(-1), 10);\n const lineClass = headingLineDecorations[`heading-${level}` as keyof typeof headingLineDecorations].spec.class;\n const headingClass = headingMarkDecorations[`heading-${level}` as keyof typeof headingMarkDecorations].spec.class;\n const id = level >= 2 ? ctx.headingIdForNode?.(node) : null;\n const idAttr = id ? ` id=\"${id}\"` : \"\";\n\n return `<div class=\"${lineClass}\">\n <h${level}${idAttr} class=\"${headingClass}\">${children}</h${level}>\n </div>\\n`;\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-mardora-h1\": {\n fontSize: \"2em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-mardora-h2\": {\n fontSize: \"1.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-mardora-h3\": {\n fontSize: \"1.5em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-mardora-h4\": {\n fontSize: \"1.25em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-mardora-h5\": {\n fontSize: \"1em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-mardora-h6\": {\n fontSize: \"0.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n // Heading line styles\n \".cm-mardora-line-h1\": {\n paddingTop: \"1.5em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-mardora-line-h2\": {\n paddingTop: \"1.25em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-mardora-line-h3, .cm-mardora-line-h4, .cm-mardora-line-h5, .cm-mardora-line-h6\": {\n paddingTop: \"1em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-mardora-header-mark\": {\n opacity: 0.5,\n },\n },\n});\n","import { Decoration, KeyBinding } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { toggleMarkdownStyle } from \"../editor/utils\";\nimport { tags } from \"@lezer/highlight\";\nimport type { MarkdownConfig, InlineParser } from \"@lezer/markdown\";\nimport { Extension } from \"@codemirror/state\";\nimport { createWrapSelectionInputHandler } from \"../lib\";\n\n/**\n * Node types for inline styling in markdown\n */\nconst INLINE_TYPES = {\n Emphasis: \"emphasis\",\n StrongEmphasis: \"strong\",\n Strikethrough: \"strikethrough\",\n Subscript: \"subscript\",\n Superscript: \"superscript\",\n Highlight: \"highlight\",\n} as const;\n\n/**\n * Mark decorations for inline content\n */\nconst inlineMarkDecorations = {\n emphasis: Decoration.mark({ class: \"cm-mardora-emphasis\" }),\n strong: Decoration.mark({ class: \"cm-mardora-strong\" }),\n strikethrough: Decoration.mark({ class: \"cm-mardora-strikethrough\" }),\n subscript: Decoration.mark({ class: \"cm-mardora-subscript\" }),\n superscript: Decoration.mark({ class: \"cm-mardora-superscript\" }),\n highlight: Decoration.mark({ class: \"cm-mardora-highlight\" }),\n // Markers (* _ ~~ ^ ~ ==)\n \"inline-mark\": Decoration.replace({}),\n};\n\n// Character code for '='\nconst EQUALS = 61;\n\n// Punctuation regex for flanking checks (matches Unicode punctuation)\n// eslint-disable-next-line no-useless-escape\nlet Punctuation = /[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\u2010-\\u2027]/;\ntry {\n Punctuation = new RegExp(\"[\\\\p{S}|\\\\p{P}]\", \"u\");\n} catch {\n // Fallback regex is used above for environments without Unicode support\n}\n\n// Delimiter type for highlight markers — enables nested inline parsing\nconst HighlightDelim = { resolve: \"Highlight\", mark: \"HighlightMark\" };\n\n/**\n * Inline parser for highlight syntax: ==text==\n * Uses addDelimiter (like Strikethrough) so nested inline styles work.\n */\nconst highlightParser: InlineParser = {\n name: \"Highlight\",\n parse(cx, next, pos) {\n // Must start with ==\n if (next !== EQUALS || cx.char(pos + 1) !== EQUALS) return -1;\n // Don't match === (or more)\n if (cx.char(pos + 2) === EQUALS) return -1;\n\n // Flanking checks (same logic as Strikethrough)\n const before = cx.slice(pos - 1, pos);\n const after = cx.slice(pos + 2, pos + 3);\n const sBefore = /\\s|^$/.test(before),\n sAfter = /\\s|^$/.test(after);\n const pBefore = Punctuation.test(before),\n pAfter = Punctuation.test(after);\n\n return cx.addDelimiter(\n HighlightDelim,\n pos,\n pos + 2,\n !sAfter && (!pAfter || sBefore || pBefore),\n !sBefore && (!pBefore || sAfter || pAfter)\n );\n },\n};\n\n/**\n * InlinePlugin - Decorates inline markdown formatting\n *\n * Adds visual styling to inline elements:\n * - Emphasis (italic) - *text* or _text_\n * - Strong (bold) - **text** or __text__\n * - Strikethrough - ~~text~~\n * - Subscript - ~text~\n * - Superscript - ^text^\n * - Highlight - ==text==\n *\n * Hides formatting markers when cursor is not in the element\n */\nexport class InlinePlugin extends DecorationPlugin {\n readonly name = \"inline\";\n readonly version = \"1.0.0\";\n override decorationPriority = 20;\n override readonly requiredNodes = [\n \"Emphasis\",\n \"StrongEmphasis\",\n \"Strikethrough\",\n \"Subscript\",\n \"Superscript\",\n \"Highlight\",\n \"EmphasisMark\",\n \"StrikethroughMark\",\n \"SubscriptMark\",\n \"SuperscriptMark\",\n \"HighlightMark\",\n \"Escape\",\n ] as const;\n marks: string[] = [];\n\n constructor() {\n super();\n\n for (const mark of Object.keys(INLINE_TYPES)) {\n this.marks.push(...this.getMarkerNames(mark));\n }\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for inline formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-b\",\n run: toggleMarkdownStyle(\"**\"),\n preventDefault: true,\n },\n {\n key: \"Mod-i\",\n run: toggleMarkdownStyle(\"*\"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-s\",\n run: toggleMarkdownStyle(\"~~\"),\n preventDefault: true,\n },\n {\n key: \"Mod-,\",\n run: toggleMarkdownStyle(\"~\"),\n preventDefault: true,\n },\n {\n key: \"Mod-.\",\n run: toggleMarkdownStyle(\"^\"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-h\",\n run: toggleMarkdownStyle(\"==\"),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * Intercepts inline marker typing to wrap selected text.\n *\n * If user types inline markers while text is selected, wraps each selected\n * range with the appropriate marker:\n * - * _ ~ ^ -> marker + selected + marker\n * - = -> ==selected==\n */\n override getExtensions(): Extension[] {\n return [createWrapSelectionInputHandler({ \"*\": \"*\", _: \"_\", \"~\": \"~\", \"^\": \"^\", \"=\": \"==\" })];\n }\n\n /**\n * Return markdown parser extensions for highlight syntax (==text==)\n */\n override getMarkdownConfig(): MarkdownConfig {\n return {\n defineNodes: [\n { name: \"Highlight\", style: tags.emphasis },\n { name: \"HighlightMark\", style: tags.processingInstruction },\n ],\n parseInline: [highlightParser],\n };\n }\n\n /**\n * Build inline decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name === \"Escape\") {\n decorations.push(inlineMarkDecorations[\"inline-mark\"].range(from, Math.min(from + 1, to)));\n return;\n }\n\n // Check if this is an inline type we handle\n const inlineType = INLINE_TYPES[name as keyof typeof INLINE_TYPES];\n if (!inlineType) {\n return;\n }\n\n // Add mark decoration for the content\n decorations.push(inlineMarkDecorations[inlineType].range(from, to));\n\n // Only hide markers when cursor is not in the element\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n // Get the appropriate marker children based on type\n const markerNames = this.getMarkerNames(name);\n for (const markerName of markerNames) {\n const marks = node.node.getChildren(markerName);\n for (const mark of marks) {\n decorations.push(inlineMarkDecorations[\"inline-mark\"].range(mark.from, mark.to));\n }\n }\n }\n },\n });\n }\n\n /**\n * Get the marker node names for a given inline type\n */\n private getMarkerNames(nodeType: string): string[] {\n switch (nodeType) {\n case \"Emphasis\":\n case \"StrongEmphasis\":\n return [\"EmphasisMark\"];\n case \"Strikethrough\":\n return [\"StrikethroughMark\"];\n case \"Subscript\":\n return [\"SubscriptMark\"];\n case \"Superscript\":\n return [\"SuperscriptMark\"];\n case \"Highlight\":\n return [\"HighlightMark\"];\n default:\n return [];\n }\n }\n\n override renderToHTML(node: SyntaxNode, children: string): string | null {\n if (this.marks.includes(node.name)) {\n return \"\";\n }\n\n const inlineType = INLINE_TYPES[node.name as keyof typeof INLINE_TYPES];\n if (!inlineType) {\n return null;\n }\n const className = inlineMarkDecorations[inlineType].spec.class as string;\n\n return `<span class=\"${className}\">${children}</span>`;\n }\n}\n\n/**\n * Theme for inline styling\n */\nconst theme = createTheme({\n default: {\n // Emphasis (italic)\n \".cm-mardora-emphasis\": {\n fontStyle: \"italic\",\n },\n\n // Strong (bold)\n \".cm-mardora-strong\": {\n fontWeight: \"bold\",\n },\n\n // Strikethrough\n \".cm-mardora-strikethrough\": {\n textDecoration: \"line-through\",\n opacity: \"0.7\",\n },\n\n // Subscript\n \".cm-mardora-subscript\": {\n fontSize: \"0.75em\",\n verticalAlign: \"sub\",\n },\n\n // Superscript\n \".cm-mardora-superscript\": {\n fontSize: \"0.75em\",\n verticalAlign: \"super\",\n },\n\n // Highlight\n \".cm-mardora-highlight\": {\n backgroundColor: \"rgba(255, 213, 0, 0.35)\",\n borderRadius: \"2px\",\n padding: \"1px 2px\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\n\n/**\n * Mark decorations for link syntax elements\n */\nconst linkMarkDecorations = {\n \"link-text\": Decoration.mark({ class: \"cm-mardora-link-text\" }),\n \"link-marker\": Decoration.mark({ class: \"cm-mardora-link-marker\" }),\n \"link-url\": Decoration.mark({ class: \"cm-mardora-link-url\" }),\n \"link-hidden\": Decoration.mark({ class: \"cm-mardora-link-hidden\" }),\n};\n\n/**\n * Parse link markdown to extract text and URL\n * Format: [text](url) or [text](url \"title\")\n */\nfunction parseLinkMarkdown(content: string): { text: string; url: string; title?: string } | null {\n // Regex to match: [text](url) or [text](url \"title\")\n const match = content.match(/^\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\n if (!match) return null;\n\n const result: { text: string; url: string; title?: string } = {\n text: match[1] || \"\",\n url: match[2]!,\n };\n\n if (match[3] !== undefined) {\n result.title = match[3];\n }\n\n return result;\n}\n\n/**\n * Widget for displaying a tooltip with the link URL on hover\n */\nclass LinkTooltipWidget extends WidgetType {\n constructor(\n readonly url: string,\n readonly from: number,\n readonly to: number\n ) {\n super();\n }\n\n override eq(other: LinkTooltipWidget): boolean {\n return other.url === this.url && other.from === this.from && other.to === this.to;\n }\n\n toDOM(view: EditorView) {\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"cm-mardora-link-wrapper\";\n wrapper.style.cursor = \"pointer\";\n\n // Tooltip element\n const tooltip = document.createElement(\"span\");\n tooltip.className = \"cm-mardora-link-tooltip\";\n tooltip.textContent = this.url;\n wrapper.appendChild(tooltip);\n\n // Show/hide tooltip on hover\n wrapper.addEventListener(\"mouseenter\", () => {\n tooltip.classList.add(\"cm-mardora-link-tooltip-visible\");\n });\n\n wrapper.addEventListener(\"mouseleave\", () => {\n tooltip.classList.remove(\"cm-mardora-link-tooltip-visible\");\n });\n\n // Click handler - select the raw markdown\n wrapper.addEventListener(\"click\", (e) => {\n if (e.ctrlKey || e.metaKey) {\n // Ctrl+Click: open in new tab\n e.preventDefault();\n e.stopPropagation();\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\n } else {\n // Regular click: select raw markdown\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n }\n });\n\n return wrapper;\n }\n\n override ignoreEvent(event: Event): boolean {\n // Allow click and mouse events to be handled by our handlers\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\n }\n}\n\n/**\n * LinkPlugin - Decorates and provides interactivity for markdown links\n *\n * Supports the full link syntax: [text](url) and [text](url \"title\")\n * - Click: reveals raw markdown (selects/focuses the link syntax)\n * - Ctrl+Click: opens the link URL in a new browser tab\n * - Hover: shows tooltip with the link URL\n * - Hides the markdown syntax when cursor is not in range\n * - Shows raw markdown when cursor is within the link range\n */\nexport class LinkPlugin extends DecorationPlugin {\n readonly name = \"link\";\n readonly version = \"1.0.0\";\n override decorationPriority = 22;\n override readonly requiredNodes = [\"Link\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for link formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-k\",\n run: (view) => this.toggleLink(view),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * URL regex pattern\n */\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\n\n /**\n * Toggle link on selection\n * - If text is selected and is a URL: [](url) with cursor in brackets\n * - If text is selected (not URL): [text]() with cursor in parentheses\n * - If nothing selected: []() with cursor in brackets\n * - If already a link: remove syntax, leave plain text\n */\n private toggleLink(view: EditorView): boolean {\n const { state } = view;\n const { from, to, empty } = state.selection.main;\n const selectedText = state.sliceDoc(from, to);\n\n // Check if selection is already a link [text](url)\n const linkMatch = selectedText.match(/^\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\n if (linkMatch) {\n // Already a link - extract just the text and replace\n const linkText = linkMatch[1] || \"\";\n view.dispatch({\n changes: { from, to, insert: linkText },\n selection: { anchor: from, head: from + linkText.length },\n });\n return true;\n }\n\n // Check if we're inside a link by looking at surrounding context\n const lineStart = state.doc.lineAt(from).from;\n const lineEnd = state.doc.lineAt(to).to;\n const lineText = state.sliceDoc(lineStart, lineEnd);\n\n // Find link pattern in line that contains the selection\n const linkRegex = /\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\n let match;\n while ((match = linkRegex.exec(lineText)) !== null) {\n const matchFrom = lineStart + match.index;\n const matchTo = matchFrom + match[0].length;\n\n // Check if selection is within this link\n if (from >= matchFrom && to <= matchTo) {\n // Remove the link syntax, leave plain text\n const linkText = match[1] || \"\";\n view.dispatch({\n changes: { from: matchFrom, to: matchTo, insert: linkText },\n selection: { anchor: matchFrom, head: matchFrom + linkText.length },\n });\n return true;\n }\n }\n\n if (empty) {\n // No selection - insert []() and place cursor in brackets\n view.dispatch({\n changes: { from, insert: \"[]()\" },\n selection: { anchor: from + 1 },\n });\n } else if (this.urlPattern.test(selectedText)) {\n // Selected text is a URL - put it in parentheses, cursor in brackets\n const newText = `[](${selectedText})`;\n view.dispatch({\n changes: { from, to, insert: newText },\n selection: { anchor: from + 1 },\n });\n } else {\n // Selected text is not a URL - wrap as link text, cursor in parentheses\n const newText = `[${selectedText}]()`;\n view.dispatch({\n changes: { from, to, insert: newText },\n selection: { anchor: from + selectedText.length + 3 },\n });\n }\n\n return true;\n }\n\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Handle Link nodes\n if (name === \"Link\") {\n const content = view.state.sliceDoc(from, to);\n const parsed = parseLinkMarkdown(content);\n\n if (!parsed) return;\n\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\n\n if (cursorInRange) {\n // Cursor in range: show raw markdown with styling\n this.decorateRawLink(node.node, decorations, view);\n } else {\n // Cursor out of range: hide raw markdown, show styled link text\n // Hide the entire markdown syntax\n decorations.push(linkMarkDecorations[\"link-hidden\"].range(from, to));\n\n // Add styled link text with tooltip widget after the hidden markdown\n decorations.push(\n Decoration.widget({\n widget: new LinkTooltipWidget(parsed.url, from, to),\n side: 1,\n }).range(to)\n );\n\n // Add replacement decoration to show styled link text\n decorations.push(\n Decoration.replace({\n widget: new LinkTextWidget(parsed.text, parsed.url, from, to, parsed.title),\n }).range(from, to)\n );\n }\n }\n },\n });\n }\n\n /**\n * Decorate raw link markdown when cursor is in range\n */\n private decorateRawLink(\n node: SyntaxNode,\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\n view: import(\"@codemirror/view\").EditorView\n ): void {\n const content = view.state.sliceDoc(node.from, node.to);\n\n // Style the opening bracket [\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.from, node.from + 1));\n\n // Find and style the link text and closing bracket + opening paren ](\n const bracketParen = content.indexOf(\"](\");\n if (bracketParen !== -1) {\n // Style link text\n if (bracketParen > 1) {\n decorations.push(linkMarkDecorations[\"link-text\"].range(node.from + 1, node.from + bracketParen));\n }\n // Style ]( markers\n decorations.push(\n linkMarkDecorations[\"link-marker\"].range(node.from + bracketParen, node.from + bracketParen + 2)\n );\n\n // Find and style the URL\n const urlChild = node.getChild(\"URL\");\n if (urlChild) {\n decorations.push(linkMarkDecorations[\"link-url\"].range(urlChild.from, urlChild.to));\n }\n\n // Style closing )\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.to - 1, node.to));\n }\n }\n\n /**\n * Render link to HTML for preview mode\n */\n override renderToHTML(\n node: SyntaxNode,\n _children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): string | null {\n if (node.name !== \"Link\") return null;\n\n const content = ctx.sliceDoc(node.from, node.to);\n const parsed = parseLinkMarkdown(content);\n if (!parsed) return null;\n\n const textContent = ctx.sanitize(parsed.text);\n const urlAttr = ctx.sanitize(parsed.url);\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\n\n return `<a class=\"cm-mardora-link\" href=\"${urlAttr}\"${titleAttr} target=\"_blank\" rel=\"noopener noreferrer\">${textContent}</a>`;\n }\n}\n\n/**\n * Widget to display the styled link text with interactivity\n */\nclass LinkTextWidget extends WidgetType {\n constructor(\n readonly text: string,\n readonly url: string,\n readonly from: number,\n readonly to: number,\n readonly title?: string\n ) {\n super();\n }\n\n override eq(other: LinkTextWidget): boolean {\n return (\n other.text === this.text &&\n other.url === this.url &&\n other.from === this.from &&\n other.to === this.to &&\n other.title === this.title\n );\n }\n\n toDOM(view: EditorView) {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-link-styled\";\n span.textContent = this.text;\n span.style.cursor = \"pointer\";\n\n if (this.title) {\n span.title = this.title;\n }\n\n // Tooltip element\n const tooltip = document.createElement(\"span\");\n tooltip.className = \"cm-mardora-link-tooltip\";\n tooltip.textContent = this.url;\n span.appendChild(tooltip);\n\n // Show/hide tooltip on hover\n span.addEventListener(\"mouseenter\", () => {\n tooltip.classList.add(\"cm-mardora-link-tooltip-visible\");\n });\n\n span.addEventListener(\"mouseleave\", () => {\n tooltip.classList.remove(\"cm-mardora-link-tooltip-visible\");\n });\n\n // Click handler\n span.addEventListener(\"click\", (e) => {\n if (e.ctrlKey || e.metaKey) {\n // Ctrl+Click: open in new tab\n e.preventDefault();\n e.stopPropagation();\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\n } else {\n // Regular click: select raw markdown\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n }\n });\n\n return span;\n }\n\n override ignoreEvent(event: Event): boolean {\n // Allow click and mouse events to be handled by our handlers\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\n }\n}\n\n/**\n * Theme for link styling\n */\nconst theme = createTheme({\n default: {\n // Link text\n \".cm-mardora-link-text\": {\n color: \"#0366d6\",\n },\n\n // Link markers ([ ] ( ))\n \".cm-mardora-link-marker\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // URL in raw markdown\n \".cm-mardora-link-url\": {\n color: \"#6a737d\",\n fontStyle: \"italic\",\n },\n\n // Hidden markdown syntax\n \".cm-mardora-link-hidden\": {\n display: \"none\",\n },\n\n // Styled link when cursor is not in range\n \".cm-mardora-link-styled\": {\n color: \"#0366d6\",\n textDecoration: \"underline\",\n position: \"relative\",\n cursor: \"pointer\",\n },\n\n \".cm-mardora-link-styled:hover\": {\n color: \"#0056b3\",\n },\n\n // Preview link styling\n \".cm-mardora-link\": {\n color: \"#0366d6\",\n textDecoration: \"underline\",\n },\n\n \".cm-mardora-link:hover\": {\n color: \"#0056b3\",\n },\n\n // Tooltip styling\n \".cm-mardora-link-tooltip\": {\n display: \"none\",\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n backgroundColor: \"#24292e\",\n color: \"#ffffff\",\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n zIndex: \"1000\",\n pointerEvents: \"none\",\n marginBottom: \"4px\",\n maxWidth: \"300px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n\n \".cm-mardora-link-tooltip-visible\": {\n display: \"block\",\n },\n },\n\n dark: {\n \".cm-mardora-link-text\": {\n color: \"#58a6ff\",\n },\n\n \".cm-mardora-link-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-link-url\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-link-styled\": {\n color: \"#58a6ff\",\n },\n\n \".cm-mardora-link-styled:hover\": {\n color: \"#79c0ff\",\n },\n\n \".cm-mardora-link\": {\n color: \"#58a6ff\",\n },\n\n \".cm-mardora-link:hover\": {\n color: \"#79c0ff\",\n },\n\n \".cm-mardora-link-tooltip\": {\n backgroundColor: \"#30363d\",\n color: \"#c9d1d9\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { Range } from \"@codemirror/state\";\nimport { SyntaxNode } from \"@lezer/common\";\n\n// ============================================================================\n// CSS Classes\n// ============================================================================\n\nconst classes = {\n // Unordered list classes\n lineUL: \"cm-mardora-list-line-ul\",\n markUL: \"cm-mardora-list-mark-ul\",\n\n // Ordered list classes\n lineOL: \"cm-mardora-list-line-ol\",\n markOL: \"cm-mardora-list-mark-ol\",\n\n // Task list classes\n taskLine: \"cm-mardora-task-line\",\n taskMarker: \"cm-mardora-task-marker\",\n\n // Common classes\n content: \"cm-mardora-list-content\",\n indent: \"cm-mardora-list-indent\",\n active: \" cm-mardora-active\",\n preview: \"cm-mardora-preview\",\n};\n\n// ============================================================================\n// Checkbox Widget\n// ============================================================================\n\n/**\n * Interactive checkbox widget for task list items.\n * Replaces `[ ]` or `[x]` markers with a clickable checkbox when not editing.\n */\nexport class TaskCheckboxWidget extends WidgetType {\n constructor(readonly checked: boolean) {\n super();\n }\n\n override eq(other: TaskCheckboxWidget): boolean {\n return other.checked === this.checked;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const wrap = document.createElement(\"span\");\n wrap.className = `cm-mardora-task-checkbox ${this.checked ? \"checked\" : \"\"}`;\n wrap.setAttribute(\"aria-hidden\", \"true\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = this.checked;\n checkbox.tabIndex = -1;\n\n checkbox.addEventListener(\"mousedown\", (e) => {\n e.preventDefault();\n this.toggleCheckbox(view, wrap);\n });\n\n wrap.appendChild(checkbox);\n return wrap;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n\n /** Toggle the checkbox state in the document */\n private toggleCheckbox(view: EditorView, wrap: HTMLElement): void {\n const pos = view.posAtDOM(wrap);\n const line = view.state.doc.lineAt(pos);\n const match = line.text.match(/^(\\s*(?:[-*+]|\\d+\\.)\\s*)\\[([ xX])\\]/);\n\n if (match) {\n const markerStart = line.from + match[1]!.length + 1;\n const newChar = this.checked ? \" \" : \"x\";\n view.dispatch({\n changes: { from: markerStart, to: markerStart + 1, insert: newChar },\n });\n }\n }\n}\n\n// ============================================================================\n// List Plugin\n// ============================================================================\n\n/**\n * Decorates markdown lists with custom styling.\n *\n * Supports:\n * - **Unordered lists** — Replaces `*`, `-`, `+` markers with styled bullets\n * - **Ordered lists** — Styles numbered markers (`1.`, `2.`, etc.)\n * - **Task lists** — Renders `[ ]`/`[x]` as interactive checkboxes\n */\nexport class ListPlugin extends DecorationPlugin {\n readonly name = \"list\";\n readonly version = \"1.0.0\";\n override decorationPriority = 20;\n override readonly requiredNodes = [\n \"BulletList\",\n \"OrderedList\",\n \"ListItem\",\n \"ListMark\",\n \"Task\",\n \"TaskMarker\",\n ] as const;\n\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for list formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-Shift-8\",\n run: (view) => this.toggleListOnLines(view, \"- \"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-7\",\n run: (view) => this.toggleListOnLines(view, \"1. \"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-9\",\n run: (view) => this.toggleListOnLines(view, \"- [ ] \"),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * Toggle list marker on current line or selected lines\n */\n private toggleListOnLines(view: EditorView, marker: string): boolean {\n const { state } = view;\n const { from, to } = state.selection.main;\n\n // Get all lines in selection\n const startLine = state.doc.lineAt(from);\n const endLine = state.doc.lineAt(to);\n\n const changes: { from: number; to: number; insert: string }[] = [];\n\n // Regex to match existing list markers\n const listMarkerRegex = /^(\\s*)([-*+]|\\d+\\.)\\s(\\[[ xX]\\]\\s)?/;\n\n const isOrderedMarker = marker === \"1. \";\n let orderNum = 1;\n\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\n const line = state.doc.line(lineNum);\n const match = line.text.match(listMarkerRegex);\n\n // Get the actual marker to insert (incremental for ordered lists)\n const actualMarker = isOrderedMarker ? `${orderNum}. ` : marker;\n\n if (match) {\n // Line already has a list marker - check if same type\n const existingMarker = match[0];\n const indent = match[1] || \"\";\n\n // Check if this is the same marker type (toggle off)\n const isUnordered = /^[-*+]$/.test(match[2]!);\n const isOrdered = /^\\d+\\.$/.test(match[2]!);\n const hasTask = !!match[3];\n\n const wantUnordered = marker === \"- \";\n const wantOrdered = isOrderedMarker;\n const wantTask = marker === \"- [ ] \";\n\n if (\n (wantUnordered && isUnordered && !hasTask) ||\n (wantOrdered && isOrdered && !hasTask) ||\n (wantTask && hasTask)\n ) {\n // Same type - remove the marker\n changes.push({\n from: line.from,\n to: line.from + existingMarker.length,\n insert: indent,\n });\n } else {\n // Different type - replace the marker\n changes.push({\n from: line.from,\n to: line.from + existingMarker.length,\n insert: indent + actualMarker,\n });\n orderNum++;\n }\n } else {\n // No list marker - add one at start of line (after any indent)\n const indentMatch = line.text.match(/^(\\s*)/);\n const indent = indentMatch ? indentMatch[1]! : \"\";\n changes.push({\n from: line.from + indent.length,\n to: line.from + indent.length,\n insert: actualMarker,\n });\n orderNum++;\n }\n }\n\n if (changes.length > 0) {\n view.dispatch({ changes });\n }\n\n return true;\n }\n\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n const line = view.state.doc.lineAt(from);\n const cursorInLine = ctx.cursorInRange(line.from, line.to);\n\n switch (name) {\n case \"ListItem\":\n this.decorateListItem(node, line, decorations);\n break;\n\n case \"ListMark\":\n this.decorateListMark(node, line, decorations, cursorInLine);\n break;\n\n case \"TaskMarker\":\n this.decorateTaskMarker(from, to, view, decorations, cursorInLine);\n break;\n }\n },\n });\n }\n\n /** Add line decoration for list items with nesting depth */\n private decorateListItem(\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\n line: { from: number },\n decorations: Range<Decoration>[]\n ): void {\n const parent = node.node.parent;\n const listType = parent?.name;\n\n // Calculate nesting depth\n let depth = 0;\n let ancestor = node.node.parent;\n while (ancestor) {\n if (ancestor.name === \"ListItem\") depth++;\n ancestor = ancestor.parent;\n }\n\n // Check for task marker child\n const hasTask = this.hasTaskChild(node);\n\n // Determine line class based on list type\n let lineClass: string;\n if (hasTask) lineClass = classes.taskLine;\n else if (listType === \"OrderedList\") lineClass = classes.lineOL;\n else lineClass = classes.lineUL;\n\n decorations.push(\n Decoration.line({\n class: lineClass,\n attributes: { style: `--depth: ${depth}` },\n }).range(line.from)\n );\n }\n\n /** Check if a ListItem node has a Task child */\n private hasTaskChild(\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0]\n ): boolean {\n const cursor = node.node.cursor();\n if (cursor.firstChild()) {\n do {\n if (cursor.name === \"Task\") return true;\n } while (cursor.nextSibling());\n }\n return false;\n }\n\n /** Decorate list markers (bullets for UL, numbers for OL) */\n private decorateListMark(\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\n line: { from: number; to: number },\n decorations: Range<Decoration>[],\n cursorInLine: boolean\n ): void {\n const { from, to } = node;\n const parent = node.node.parent;\n const grandparent = parent?.parent;\n const listType = grandparent?.name;\n const activeClass = cursorInLine ? classes.active : \"\";\n\n // Add indent decoration for nested items\n if (from > line.from) {\n decorations.push(Decoration.mark({ class: classes.indent + activeClass }).range(line.from, from));\n }\n\n // Add marker decoration based on list type\n const markClass = listType === \"OrderedList\" ? classes.markOL : classes.markUL;\n decorations.push(Decoration.mark({ class: markClass + activeClass }).range(from, to + 1));\n\n // Wrap remaining line content\n const contentStart = to + 1;\n if (contentStart < line.to) {\n decorations.push(Decoration.mark({ class: classes.content }).range(contentStart, line.to));\n }\n }\n\n /** Decorate task markers - show checkbox widget or raw text based on cursor */\n private decorateTaskMarker(\n from: number,\n to: number,\n view: EditorView,\n decorations: Range<Decoration>[],\n cursorInLine: boolean\n ): void {\n const text = view.state.sliceDoc(from, to);\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\n\n if (cursorInLine) {\n // Show raw marker when editing\n decorations.push(Decoration.mark({ class: classes.taskMarker }).range(from, to));\n } else {\n // Replace with interactive checkbox\n decorations.push(\n Decoration.replace({\n widget: new TaskCheckboxWidget(isChecked),\n }).range(from, to)\n );\n }\n }\n\n /** Render list nodes to HTML */\n override renderToHTML(\n node: SyntaxNode,\n children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): string | null {\n switch (node.name) {\n case \"BulletList\":\n return `<ul class=\"${classes.lineUL} ${classes.preview}\">${children}</ul>\\n`;\n\n case \"OrderedList\":\n return `<ol class=\"${classes.lineOL} ${classes.preview}\">${children}</ol>\\n`;\n\n case \"ListItem\":\n return `<li>${children}</li>\\n`;\n\n case \"Task\":\n return children;\n\n case \"TaskMarker\": {\n const text = ctx.sliceDoc(node.from, node.to);\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\n return `<input type=\"checkbox\" class=\"cm-mardora-task-checkbox\" disabled ${isChecked ? \"checked\" : \"\"} />`;\n }\n\n case \"ListMark\":\n return \"\";\n\n default:\n return null;\n }\n }\n}\n\n// ============================================================================\n// Theme\n// ============================================================================\n\nconst theme = createTheme({\n default: {\n // Indentation marker positioning\n \".cm-mardora-list-indent\": {\n overflow: \"hidden\",\n display: \"inline-block\",\n position: \"absolute\",\n left: \"calc(1rem * (var(--depth, 0) + 1))\",\n transform: \"translateX(-100%)\",\n },\n\n // List line layout (flexbox for marker alignment)\n \".cm-mardora-list-line-ul, .cm-mardora-list-line-ol\": {\n position: \"relative\",\n paddingLeft: \"calc(1rem * (var(--depth, 0) + 1)) !important\",\n display: \"flex\",\n alignItems: \"start\",\n },\n \".cm-mardora-list-line-ul > :first-child, .cm-mardora-list-line-ol > :first-child\": {\n flexShrink: 0,\n },\n\n // List marker sizing\n \".cm-mardora-list-line-ul .cm-mardora-list-mark-ul, .cm-mardora-list-line-ol .cm-mardora-list-mark-ol\": {\n whiteSpace: \"pre\",\n position: \"relative\",\n width: \"1rem\",\n flexShrink: 0,\n },\n\n // Hide raw marker text when not active\n \".cm-mardora-list-mark-ul:not(.cm-mardora-active) > span, .cm-mardora-task-line .cm-mardora-list-mark-ol:not(.cm-mardora-active) > span\":\n {\n visibility: \"hidden\",\n display: \"none\",\n },\n\n // Styled bullet for unordered lists\n \".cm-mardora-list-line-ul .cm-mardora-list-mark-ul:not(.cm-mardora-active)::after\": {\n content: '\"•\"',\n color: \"var(--color-link)\",\n fontWeight: \"bold\",\n pointerEvents: \"none\",\n },\n\n // Task marker styling (visible when editing)\n \".cm-mardora-task-marker\": {\n color: \"var(--mardora-highlight, #a4a4a4)\",\n fontFamily: \"monospace\",\n },\n\n // Task checkbox container\n \".cm-mardora-task-checkbox\": {\n display: \"inline-flex\",\n verticalAlign: \"middle\",\n marginRight: \"0.3em\",\n cursor: \"pointer\",\n userSelect: \"none\",\n alignItems: \"center\",\n height: \"1.2em\",\n },\n\n // Task checkbox input styling\n \".cm-mardora-task-checkbox input\": {\n cursor: \"pointer\",\n margin: 0,\n width: \"1.1em\",\n height: \"1.1em\",\n appearance: \"none\",\n border: \"1px solid\",\n borderRadius: \"0.25em\",\n backgroundColor: \"transparent\",\n position: \"relative\",\n },\n\n // Checkmark for completed tasks\n \".cm-mardora-task-checkbox.checked input::after\": {\n content: '\"✓\"',\n position: \"absolute\",\n left: \"1px\",\n top: \"-3px\",\n },\n\n // Preview styles (override editor-specific layout)\n \".cm-mardora-preview\": {\n display: \"block\",\n paddingLeft: \"1.5rem\",\n margin: \"0.5rem 0\",\n },\n \".cm-mardora-preview li\": {\n display: \"list-item\",\n marginBottom: \"0.25rem\",\n },\n \"ul.cm-mardora-preview\": {\n listStyleType: \"disc\",\n },\n \"ol.cm-mardora-preview\": {\n listStyleType: \"decimal\",\n },\n // Hide list marker for task items\n \".cm-mardora-preview li:has(.cm-mardora-task-checkbox)\": {\n listStyleType: \"none\",\n },\n \".cm-mardora-preview li .cm-mardora-paragraph\": {\n padding: \"0\",\n },\n },\n});\n","import { Extension, StateEffect, StateField } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, ViewUpdate } from \"@codemirror/view\";\nimport { createMardoraIcon, type MardoraIconName } from \"../editor/icons\";\nimport type { TableInfo } from \"./table-model\";\n\nexport type TableControlKind = \"row\" | \"column\";\nexport type TableControlAction =\n | \"insert-row-above\"\n | \"insert-row-below\"\n | \"move-row-up\"\n | \"move-row-down\"\n | \"copy-row\"\n | \"delete-row\"\n | \"insert-column-left\"\n | \"insert-column-right\"\n | \"move-column-left\"\n | \"move-column-right\"\n | \"copy-column\"\n | \"delete-column\"\n | \"delete-table\";\n\nexport interface ActiveTableControl {\n readonly tableFrom: number;\n readonly kind: TableControlKind;\n readonly rowIndex?: number;\n readonly columnIndex?: number;\n readonly menuOpen: boolean;\n}\n\nexport interface TableMenuStateInput {\n readonly kind: TableControlKind;\n readonly rowIndex?: number;\n readonly columnIndex?: number;\n readonly bodyRowCount: number;\n readonly columnCount: number;\n}\n\nexport interface TableControlMenuState {\n readonly canMoveRowUp: boolean;\n readonly canMoveRowDown: boolean;\n readonly canDeleteRow: boolean;\n readonly canMoveColumnLeft: boolean;\n readonly canMoveColumnRight: boolean;\n readonly canDeleteColumn: boolean;\n}\n\nexport interface TableControlMenuItem {\n readonly action: TableControlAction;\n readonly label: string;\n readonly icon: MardoraIconName;\n readonly enabled: boolean;\n}\n\nexport function createTableControlMenuState(input: TableMenuStateInput): TableControlMenuState {\n const rowIndex = input.rowIndex ?? 0;\n const columnIndex = input.columnIndex ?? 0;\n return {\n canMoveRowUp: input.kind === \"row\" && rowIndex > 1,\n canMoveRowDown: input.kind === \"row\" && rowIndex >= 1 && rowIndex < input.bodyRowCount,\n canDeleteRow: input.kind === \"row\" && rowIndex >= 1,\n canMoveColumnLeft: input.kind === \"column\" && columnIndex > 1,\n canMoveColumnRight: input.kind === \"column\" && columnIndex >= 1 && columnIndex < input.columnCount,\n canDeleteColumn: input.kind === \"column\" && input.columnCount > 1,\n };\n}\n\nexport function createTableControlMenuItems(input: TableMenuStateInput): TableControlMenuItem[] {\n const state = createTableControlMenuState(input);\n return input.kind === \"row\"\n ? [\n { action: \"insert-row-above\", label: \"在上方插入一行\", icon: \"arrow-up-to-line\", enabled: true },\n { action: \"insert-row-below\", label: \"在下方插入一行\", icon: \"arrow-down-to-line\", enabled: true },\n { action: \"move-row-up\", label: \"当前行上移\", icon: \"arrow-up\", enabled: state.canMoveRowUp },\n { action: \"move-row-down\", label: \"当前行下移\", icon: \"arrow-down\", enabled: state.canMoveRowDown },\n { action: \"copy-row\", label: \"拷贝行\", icon: \"copy\", enabled: true },\n { action: \"delete-row\", label: \"删除行\", icon: \"trash-2\", enabled: state.canDeleteRow },\n { action: \"delete-table\", label: \"删除表格\", icon: \"table-delete\", enabled: true },\n ]\n : [\n { action: \"insert-column-left\", label: \"在左侧插入列\", icon: \"arrow-left-to-line\", enabled: true },\n { action: \"insert-column-right\", label: \"在右侧插入列\", icon: \"arrow-right-to-line\", enabled: true },\n { action: \"move-column-left\", label: \"左移列\", icon: \"arrow-left\", enabled: state.canMoveColumnLeft },\n { action: \"move-column-right\", label: \"右移列\", icon: \"arrow-right\", enabled: state.canMoveColumnRight },\n { action: \"copy-column\", label: \"拷贝列\", icon: \"copy\", enabled: true },\n { action: \"delete-column\", label: \"删除列\", icon: \"trash-2\", enabled: state.canDeleteColumn },\n { action: \"delete-table\", label: \"删除表格\", icon: \"table-delete\", enabled: true },\n ];\n}\n\nfunction areTableControlsEqual(left: ActiveTableControl | null, right: ActiveTableControl | null): boolean {\n return (\n left?.tableFrom === right?.tableFrom &&\n left?.kind === right?.kind &&\n left?.rowIndex === right?.rowIndex &&\n left?.columnIndex === right?.columnIndex &&\n left?.menuOpen === right?.menuOpen\n );\n}\n\nfunction isSameTableControlTarget(left: ActiveTableControl | null, right: ActiveTableControl | null): boolean {\n return (\n left?.tableFrom === right?.tableFrom &&\n left?.kind === right?.kind &&\n left?.rowIndex === right?.rowIndex &&\n left?.columnIndex === right?.columnIndex\n );\n}\n\nexport function resolveTableControlHandleClick(\n current: ActiveTableControl | null,\n target: ActiveTableControl\n): ActiveTableControl | null {\n if (current?.menuOpen && isSameTableControlTarget(current, target)) {\n return null;\n }\n return { ...target, menuOpen: true };\n}\n\nexport const setActiveTableControlEffect = StateEffect.define<ActiveTableControl | null>();\n\nexport function hasTableControlStateChange(effects: readonly StateEffect<unknown>[]): boolean {\n return effects.some((effect) => effect.is(setActiveTableControlEffect));\n}\n\nexport const activeTableControlField = StateField.define<ActiveTableControl | null>({\n create: () => null,\n update(value, transaction) {\n for (const effect of transaction.effects) {\n if (effect.is(setActiveTableControlEffect)) {\n return effect.value;\n }\n }\n if (transaction.docChanged) {\n return null;\n }\n return value;\n },\n});\n\nexport interface TableControlsConfig {\n readonly getTableInfoByFrom: (view: EditorView, tableFrom: number) => TableInfo | null;\n readonly runAction: (view: EditorView, control: ActiveTableControl, action: TableControlAction) => void;\n}\n\nexport function tableControls(config: TableControlsConfig): Extension[] {\n const plugin = ViewPlugin.define((view) => new TableControlsView(view, config));\n return [\n activeTableControlField,\n plugin,\n EditorView.domEventHandlers({\n keydown(event, view) {\n if (event.key !== \"Escape\" || !view.state.field(activeTableControlField, false)) {\n return false;\n }\n view.dispatch({ effects: setActiveTableControlEffect.of(null) });\n event.preventDefault();\n return true;\n },\n }),\n ];\n}\n\nclass TableControlsView {\n private readonly overlay: HTMLElement;\n private hoverControl: ActiveTableControl | null = null;\n\n constructor(\n private readonly view: EditorView,\n private readonly config: TableControlsConfig\n ) {\n this.overlay = view.dom.ownerDocument.createElement(\"div\");\n this.overlay.className = \"cm-mardora-table-controls-overlay\";\n this.overlay.addEventListener(\"mousedown\", this.handleOverlayMouseDown);\n view.dom.appendChild(this.overlay);\n view.dom.addEventListener(\"mousemove\", this.handleMouseMove);\n view.dom.addEventListener(\"mouseleave\", this.handleMouseLeave);\n view.dom.ownerDocument.addEventListener(\"mousedown\", this.handleDocumentMouseDown, true);\n this.render();\n }\n\n update(update: ViewUpdate): void {\n const controlStateChanged = update.transactions.some((transaction) => hasTableControlStateChange(transaction.effects));\n if (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n update.geometryChanged ||\n controlStateChanged\n ) {\n this.render();\n }\n }\n\n destroy(): void {\n this.view.dom.removeEventListener(\"mousemove\", this.handleMouseMove);\n this.view.dom.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n this.view.dom.ownerDocument.removeEventListener(\"mousedown\", this.handleDocumentMouseDown, true);\n this.overlay.removeEventListener(\"mousedown\", this.handleOverlayMouseDown);\n this.overlay.remove();\n }\n\n private readonly handleMouseMove = (event: MouseEvent): void => {\n if (event.target instanceof Element && event.target.closest(\".cm-mardora-table-controls-overlay\")) {\n return;\n }\n\n const cell = event.target instanceof Element ? event.target.closest(\".cm-mardora-table-cell\") : null;\n if (!cell || !this.view.dom.contains(cell)) {\n if (!this.currentControl()?.menuOpen) {\n this.setHoverControl(null);\n }\n return;\n }\n\n const tableFrom = Number(cell.getAttribute(\"data-mardora-table-from\"));\n const rowIndex = Number(cell.getAttribute(\"data-mardora-row-index\"));\n const columnIndex = Number(cell.getAttribute(\"data-mardora-column-index\"));\n const rowKind = cell.getAttribute(\"data-mardora-row-kind\");\n if (!Number.isFinite(tableFrom) || !Number.isFinite(rowIndex) || !Number.isFinite(columnIndex)) {\n return;\n }\n\n this.setHoverControl(\n rowKind === \"body\"\n ? { tableFrom, kind: \"row\", rowIndex, columnIndex, menuOpen: false }\n : { tableFrom, kind: \"column\", columnIndex, menuOpen: false }\n );\n };\n\n private readonly handleMouseLeave = (): void => {\n if (this.currentControl()?.menuOpen) {\n return;\n }\n this.setHoverControl(null);\n };\n\n private readonly handleDocumentMouseDown = (event: MouseEvent): void => {\n if (event.target instanceof Node && this.overlay.contains(event.target)) {\n return;\n }\n if (this.view.state.field(activeTableControlField, false)) {\n this.view.dispatch({ effects: setActiveTableControlEffect.of(null) });\n }\n };\n\n private readonly handleOverlayMouseDown = (event: MouseEvent): void => {\n const target = event.target instanceof Element ? event.target : null;\n const button = target?.closest<HTMLElement>(\"[data-mardora-table-control-action]\");\n if (!button) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n\n const control = this.currentControl();\n if (!control) {\n return;\n }\n\n const action = button.dataset.mardoraTableControlAction || \"\";\n if (button.getAttribute(\"aria-disabled\") === \"true\") {\n return;\n }\n\n if (action === \"open-row-menu\") {\n if (control.rowIndex === undefined || control.rowIndex <= 0) {\n return;\n }\n const activeControl = this.view.state.field(activeTableControlField, false) ?? null;\n this.view.dispatch({\n effects: setActiveTableControlEffect.of(\n resolveTableControlHandleClick(activeControl, {\n tableFrom: control.tableFrom,\n kind: \"row\",\n rowIndex: control.rowIndex,\n ...(control.columnIndex === undefined ? {} : { columnIndex: control.columnIndex }),\n menuOpen: false,\n })\n ),\n });\n return;\n }\n\n if (action === \"open-column-menu\") {\n if (control.columnIndex === undefined) {\n return;\n }\n const activeControl = this.view.state.field(activeTableControlField, false) ?? null;\n this.view.dispatch({\n effects: setActiveTableControlEffect.of(\n resolveTableControlHandleClick(activeControl, {\n tableFrom: control.tableFrom,\n kind: \"column\",\n columnIndex: control.columnIndex,\n menuOpen: false,\n })\n ),\n });\n return;\n }\n\n this.config.runAction(this.view, control, action as TableControlAction);\n this.hoverControl = null;\n this.view.dispatch({ effects: setActiveTableControlEffect.of(null) });\n };\n\n private currentControl(): ActiveTableControl | null {\n return this.view.state.field(activeTableControlField, false) ?? this.hoverControl ?? null;\n }\n\n private setHoverControl(control: ActiveTableControl | null): void {\n if (areTableControlsEqual(this.hoverControl, control)) {\n return;\n }\n this.hoverControl = control;\n this.render();\n }\n\n private render(): void {\n const control = this.currentControl();\n this.overlay.replaceChildren();\n if (!control) {\n return;\n }\n\n const table = this.config.getTableInfoByFrom(this.view, control.tableFrom);\n if (!table) {\n return;\n }\n\n const rowButton = control.rowIndex !== undefined && control.rowIndex > 0 ? this.createHandle(\"row\") : null;\n const columnButton = control.columnIndex !== undefined ? this.createHandle(\"column\") : null;\n if (rowButton) this.overlay.appendChild(rowButton);\n if (columnButton) this.overlay.appendChild(columnButton);\n if (control.menuOpen) this.overlay.appendChild(this.createMenu(control, table));\n this.positionOverlay(control, table);\n }\n\n private createHandle(kind: TableControlKind): HTMLButtonElement {\n const button = this.view.dom.ownerDocument.createElement(\"button\");\n button.type = \"button\";\n button.className = `cm-mardora-table-handle cm-mardora-table-${kind}-handle`;\n button.dataset.mardoraTableControlAction = kind === \"row\" ? \"open-row-menu\" : \"open-column-menu\";\n button.setAttribute(\"aria-label\", kind === \"row\" ? \"Table row actions\" : \"Table column actions\");\n button.innerHTML = \"<span></span><span></span><span></span>\";\n return button;\n }\n\n private createMenu(control: ActiveTableControl, table: TableInfo): HTMLElement {\n const input: TableMenuStateInput = {\n kind: control.kind,\n bodyRowCount: table.bodyCells.length,\n columnCount: table.columnCount,\n ...(control.rowIndex === undefined ? {} : { rowIndex: control.rowIndex }),\n ...(control.columnIndex === undefined ? {} : { columnIndex: control.columnIndex + 1 }),\n };\n const menu = this.view.dom.ownerDocument.createElement(\"div\");\n menu.className = \"cm-mardora-table-control-menu\";\n menu.setAttribute(\"role\", \"menu\");\n\n for (const { action, label, icon, enabled } of createTableControlMenuItems(input)) {\n const item = this.view.dom.ownerDocument.createElement(\"button\");\n item.type = \"button\";\n item.className = \"cm-mardora-table-control-menu-item\";\n item.dataset.mardoraTableControlAction = action;\n item.setAttribute(\"role\", \"menuitem\");\n item.setAttribute(\"aria-disabled\", enabled ? \"false\" : \"true\");\n if (!enabled) item.disabled = true;\n const svg = createMardoraIcon(icon);\n if (svg) item.appendChild(svg);\n const text = this.view.dom.ownerDocument.createElement(\"span\");\n text.textContent = label;\n item.appendChild(text);\n menu.appendChild(item);\n }\n return menu;\n }\n\n private positionOverlay(control: ActiveTableControl, table: TableInfo): void {\n this.view.requestMeasure({\n read: () => {\n const editorRect = this.view.dom.getBoundingClientRect();\n const rowRect =\n control.rowIndex !== undefined && control.rowIndex > 0\n ? this.findCellElement(table.from, control.rowIndex, 0)?.getBoundingClientRect() ?? null\n : null;\n const columnRect =\n control.columnIndex !== undefined\n ? this.findCellElement(table.from, 0, control.columnIndex)?.getBoundingClientRect() ?? null\n : null;\n return { editorRect, rowRect, columnRect };\n },\n write: (measure) => {\n const rowHandle = this.overlay.querySelector<HTMLElement>(\".cm-mardora-table-row-handle\");\n const columnHandle = this.overlay.querySelector<HTMLElement>(\".cm-mardora-table-column-handle\");\n if (rowHandle && measure.rowRect) {\n rowHandle.style.left = `${measure.rowRect.left - measure.editorRect.left - 10}px`;\n rowHandle.style.top = `${measure.rowRect.top - measure.editorRect.top + measure.rowRect.height / 2 - 10}px`;\n }\n if (columnHandle && measure.columnRect) {\n columnHandle.style.left = `${measure.columnRect.left - measure.editorRect.left + measure.columnRect.width / 2 - 10}px`;\n columnHandle.style.top = `${measure.columnRect.top - measure.editorRect.top - 10}px`;\n }\n const menu = this.overlay.querySelector<HTMLElement>(\".cm-mardora-table-control-menu\");\n const anchor = control.kind === \"row\" ? rowHandle : columnHandle;\n if (menu && anchor) {\n menu.style.left = `${Number.parseFloat(anchor.style.left) + 28}px`;\n menu.style.top = `${Number.parseFloat(anchor.style.top)}px`;\n }\n },\n });\n }\n\n private findCellElement(tableFrom: number, rowIndex: number, columnIndex: number): HTMLElement | null {\n const selector = [\n \".cm-mardora-table-cell\",\n `[data-mardora-table-from=\"${tableFrom}\"]`,\n `[data-mardora-row-index=\"${rowIndex}\"]`,\n `[data-mardora-column-index=\"${columnIndex}\"]`,\n ].join(\"\");\n return this.view.dom.querySelector<HTMLElement>(selector);\n }\n}\n","import { createTheme } from \"../editor\";\n\nexport const tableControlsTheme = createTheme({\n default: {\n \".cm-mardora-table-wrapper\": {\n overflow: \"visible\",\n },\n \".cm-mardora-table-controls-overlay\": {\n position: \"absolute\",\n inset: \"0\",\n pointerEvents: \"none\",\n zIndex: \"20\",\n },\n \".cm-mardora-table-handle\": {\n position: \"absolute\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n border: \"1px solid var(--color-border, #d7dee7)\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"var(--color-background, #ffffff)\",\n color: \"var(--color-muted-foreground, #64748b)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.09375rem\",\n pointerEvents: \"auto\",\n opacity: \"1\",\n cursor: \"pointer\",\n padding: \"0\",\n transition: \"background-color 120ms ease, border-color 120ms ease, color 120ms ease\",\n },\n \".cm-mardora-table-handle:hover, .cm-mardora-table-handle:focus-visible\": {\n borderColor: \"rgba(37, 99, 235, 0.55)\",\n backgroundColor: \"rgba(37, 99, 235, 0.08)\",\n color: \"rgba(37, 99, 235, 0.95)\",\n outline: \"none\",\n },\n \".cm-mardora-table-handle span\": {\n width: \"0.1875rem\",\n height: \"0.1875rem\",\n borderRadius: \"999px\",\n backgroundColor: \"currentColor\",\n display: \"block\",\n },\n \".cm-mardora-table-row-handle\": {\n flexDirection: \"column\",\n },\n \".cm-mardora-table-control-menu\": {\n position: \"absolute\",\n minWidth: \"12rem\",\n padding: \"0.25rem\",\n border: \"1px solid var(--color-border, #d7dee7)\",\n borderRadius: \"0.5rem\",\n backgroundColor: \"var(--color-background, #ffffff)\",\n boxShadow: \"0 18px 44px rgba(15, 23, 42, 0.16)\",\n pointerEvents: \"auto\",\n },\n \".cm-mardora-table-control-menu-item\": {\n width: \"100%\",\n minHeight: \"2rem\",\n border: \"0\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"transparent\",\n color: \"var(--color-text, #0f172a)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0 0.625rem\",\n fontSize: \"0.875rem\",\n textAlign: \"left\",\n cursor: \"pointer\",\n },\n \".cm-mardora-table-control-menu-item svg\": {\n width: \"0.875rem\",\n height: \"0.875rem\",\n flexShrink: \"0\",\n color: \"var(--color-muted-foreground, #64748b)\",\n strokeWidth: \"2\",\n },\n \".cm-mardora-table-control-menu-item span\": {\n minWidth: \"0\",\n flex: \"1\",\n },\n \".cm-mardora-table-control-menu-item:hover\": {\n backgroundColor: \"rgba(15, 23, 42, 0.06)\",\n },\n \".cm-mardora-table-control-menu-item:disabled\": {\n color: \"var(--color-muted-foreground, #94a3b8)\",\n cursor: \"not-allowed\",\n },\n \".cm-mardora-table-cell-row-selected, .cm-mardora-table-cell-column-selected\": {\n backgroundColor: \"rgba(37, 99, 235, 0.12)\",\n boxShadow: \"inset 0 0 0 1px rgba(37, 99, 235, 0.38)\",\n },\n },\n dark: {\n \".cm-mardora-table-handle\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #161b22)\",\n color: \"var(--color-muted-foreground, #94a3b8)\",\n },\n \".cm-mardora-table-handle:hover, .cm-mardora-table-handle:focus-visible\": {\n borderColor: \"rgba(96, 165, 250, 0.68)\",\n backgroundColor: \"rgba(96, 165, 250, 0.14)\",\n color: \"rgba(147, 197, 253, 0.98)\",\n },\n \".cm-mardora-table-control-menu\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #161b22)\",\n boxShadow: \"0 18px 44px rgba(0, 0, 0, 0.42)\",\n },\n \".cm-mardora-table-control-menu-item\": {\n color: \"var(--color-text, #e6edf3)\",\n },\n \".cm-mardora-table-control-menu-item svg\": {\n color: \"var(--color-muted-foreground, #94a3b8)\",\n },\n \".cm-mardora-table-control-menu-item:hover\": {\n backgroundColor: \"rgba(255, 255, 255, 0.08)\",\n },\n \".cm-mardora-table-cell-row-selected, .cm-mardora-table-cell-column-selected\": {\n backgroundColor: \"rgba(96, 165, 250, 0.18)\",\n boxShadow: \"inset 0 0 0 1px rgba(96, 165, 250, 0.5)\",\n },\n },\n});\n","import { syntaxTree } from \"@codemirror/language\";\nimport { EditorState } from \"@codemirror/state\";\n\nexport type Alignment = \"left\" | \"center\" | \"right\";\nexport type TableRowKind = \"header\" | \"body\";\n\nexport interface ParsedTable {\n headers: string[];\n alignments: Alignment[];\n rows: string[][];\n}\n\nexport interface TableCellInfo {\n rowKind: TableRowKind;\n rowIndex: number;\n columnIndex: number;\n from: number;\n to: number;\n contentFrom: number;\n contentTo: number;\n lineFrom: number;\n lineNumber: number;\n rawText: string;\n}\n\nexport interface TableInfo {\n from: number;\n to: number;\n startLineNumber: number;\n delimiterLineNumber: number;\n endLineNumber: number;\n columnCount: number;\n alignments: Alignment[];\n cellsByRow: TableCellInfo[][];\n headerCells: TableCellInfo[];\n bodyCells: TableCellInfo[][];\n}\n\nexport const BREAK_TAG = \"<br />\";\nexport const BREAK_TAG_REGEX = /<br\\s*\\/?>/gi;\nexport const DELIMITER_CELL_PATTERN = /^:?-{3,}:?$/;\n/** Returns whether the character at the given index is backslash-escaped. */\nexport function isEscaped(text: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && text[i] === \"\\\\\"; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\n/** Collects the positions of every unescaped pipe character in a line. */\nexport function getPipePositions(lineText: string): number[] {\n const positions: number[] = [];\n for (let index = 0; index < lineText.length; index++) {\n if (lineText[index] === \"|\" && !isEscaped(lineText, index)) {\n positions.push(index);\n }\n }\n return positions;\n}\n\n/** Splits a markdown table row into raw cell strings. */\nexport function splitTableLine(lineText: string): string[] {\n const cells: string[] = [];\n const trimmed = lineText.trim();\n\n if (!trimmed.includes(\"|\")) {\n return [trimmed];\n }\n\n let current = \"\";\n for (let index = 0; index < trimmed.length; index++) {\n const char = trimmed[index]!;\n if (char === \"|\" && !isEscaped(trimmed, index)) {\n cells.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n cells.push(current);\n\n if (trimmed.startsWith(\"|\")) {\n cells.shift();\n }\n if (trimmed.endsWith(\"|\")) {\n cells.pop();\n }\n\n return cells;\n}\n\n/** Checks whether the given line can participate in a table block. */\nexport function isTableRowLine(lineText: string): boolean {\n return getPipePositions(lineText.trim()).length > 0;\n}\n\n/** Parses a delimiter cell token into a table alignment value. */\nexport function parseAlignment(cell: string): Alignment {\n const trimmed = cell.trim();\n const left = trimmed.startsWith(\":\");\n const right = trimmed.endsWith(\":\");\n if (left && right) return \"center\";\n if (right) return \"right\";\n return \"left\";\n}\n\n/** Parses the delimiter line and returns per-column alignments. */\nexport function parseDelimiterAlignments(lineText: string): Alignment[] | null {\n const cells = splitTableLine(lineText).map((cell) => cell.trim());\n if (cells.length === 0 || !cells.every((cell) => DELIMITER_CELL_PATTERN.test(cell))) {\n return null;\n }\n return cells.map(parseAlignment);\n}\n\n/** Splits a table node slice into its table lines and any trailing markdown. */\nexport function splitTableAndTrailingMarkdown(markdown: string): { tableMarkdown: string; trailingMarkdown: string } {\n const lines = markdown.split(\"\\n\");\n if (lines.length < 2) {\n return { tableMarkdown: markdown, trailingMarkdown: \"\" };\n }\n\n const headerLine = lines[0] || \"\";\n const delimiterLine = lines[1] || \"\";\n if (!isTableRowLine(headerLine) || !parseDelimiterAlignments(delimiterLine)) {\n return { tableMarkdown: markdown, trailingMarkdown: \"\" };\n }\n\n let endIndex = 1;\n for (let index = 2; index < lines.length; index++) {\n if (!isTableRowLine(lines[index] || \"\")) {\n break;\n }\n endIndex = index;\n }\n\n return {\n tableMarkdown: lines.slice(0, endIndex + 1).join(\"\\n\"),\n trailingMarkdown: lines.slice(endIndex + 1).join(\"\\n\"),\n };\n}\n\n/** Normalizes every supported `<br>` form to the canonical `<br />` token. */\nexport function canonicalizeBreakTags(text: string): string {\n return text.replace(BREAK_TAG_REGEX, BREAK_TAG);\n}\n\n/** Escapes literal pipe characters so cell content stays GFM-compatible. */\nexport function escapeUnescapedPipes(text: string): string {\n let result = \"\";\n for (let index = 0; index < text.length; index++) {\n const char = text[index]!;\n if (char === \"|\" && !isEscaped(text, index)) {\n result += \"\\\\|\";\n continue;\n }\n result += char;\n }\n return result;\n}\n\n/** Trims and normalizes cell content before it is written back to markdown. */\nexport function normalizeCellContent(text: string): string {\n const normalizedBreaks = canonicalizeBreakTags(text.trim());\n if (!normalizedBreaks) {\n return \"\";\n }\n\n const parts = normalizedBreaks.split(BREAK_TAG_REGEX).map((part) => escapeUnescapedPipes(part.trim()));\n if (parts.length === 1) {\n return parts[0] || \"\";\n }\n\n return parts.join(` ${BREAK_TAG} `).trim();\n}\n\n/** Measures the visible width of a cell for markdown alignment output. */\nexport function renderWidth(text: string): number {\n return canonicalizeBreakTags(text).replace(BREAK_TAG, \" \").replace(/\\\\\\|/g, \"|\").length;\n}\n\n/** Pads a cell according to its alignment for normalized markdown output. */\nexport function padCell(text: string, width: number, alignment: Alignment): string {\n const safeWidth = Math.max(width, renderWidth(text));\n const difference = safeWidth - renderWidth(text);\n if (difference <= 0) {\n return text;\n }\n\n if (alignment === \"right\") {\n return \" \".repeat(difference) + text;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(difference / 2);\n const right = difference - left;\n return \" \".repeat(left) + text + \" \".repeat(right);\n }\n\n return text + \" \".repeat(difference);\n}\n\n/** Builds the markdown delimiter token for a column. */\nexport function delimiterCell(width: number, alignment: Alignment): string {\n const hyphenCount = Math.max(width, 3);\n if (alignment === \"center\") {\n return \":\" + \"-\".repeat(Math.max(1, hyphenCount - 2)) + \":\";\n }\n if (alignment === \"right\") {\n return \"-\".repeat(Math.max(2, hyphenCount - 1)) + \":\";\n }\n return \"-\".repeat(hyphenCount);\n}\n\n/** Parses a markdown table block into header, alignment, and body rows. */\nexport function parseTableMarkdown(markdown: string): ParsedTable | null {\n const { tableMarkdown } = splitTableAndTrailingMarkdown(markdown);\n const lines = tableMarkdown.split(\"\\n\");\n if (lines.length < 2) {\n return null;\n }\n\n const headers = splitTableLine(lines[0] || \"\").map((cell) => cell.trim());\n const alignments = parseDelimiterAlignments(lines[1] || \"\");\n if (!alignments) {\n return null;\n }\n\n const rows = lines\n .slice(2)\n .filter((line) => isTableRowLine(line))\n .map((line) => splitTableLine(line).map((cell) => cell.trim()));\n\n return { headers, alignments, rows };\n}\n\n/** Expands all rows so the parsed table has a consistent column count. */\nexport function normalizeParsedTable(parsed: ParsedTable): ParsedTable {\n const columnCount = Math.max(\n parsed.headers.length,\n parsed.alignments.length,\n ...parsed.rows.map((row) => row.length),\n 1\n );\n\n const headers = Array.from({ length: columnCount }, (_, index) => normalizeCellContent(parsed.headers[index] || \"\"));\n const alignments = Array.from({ length: columnCount }, (_, index) => parsed.alignments[index] || \"left\");\n const rows = parsed.rows.map((row) =>\n Array.from({ length: columnCount }, (_, index) => normalizeCellContent(row[index] || \"\"))\n );\n\n return { headers, alignments, rows };\n}\n\n/** Formats a parsed table back into normalized GFM markdown. */\nexport function formatTableMarkdown(parsed: ParsedTable): string {\n const normalized = normalizeParsedTable(parsed);\n const widths = normalized.headers.map((header, index) =>\n Math.max(renderWidth(header), ...normalized.rows.map((row) => renderWidth(row[index] || \"\")), 3)\n );\n\n const formatRow = (cells: string[]) =>\n `| ${cells.map((cell, index) => padCell(cell, widths[index] || 3, normalized.alignments[index] || \"left\")).join(\" | \")} |`;\n\n const headerLine = formatRow(normalized.headers);\n const delimiterLine = `| ${normalized.alignments\n .map((alignment, index) => delimiterCell(widths[index] || 3, alignment))\n .join(\" | \")} |`;\n const bodyLines = normalized.rows.map((row) => formatRow(row));\n\n return [headerLine, delimiterLine, ...bodyLines].join(\"\\n\");\n}\n\n/** Creates a blank row with the requested number of columns. */\nexport function buildEmptyRow(columnCount: number): string[] {\n return Array.from({ length: columnCount }, () => \"\");\n}\n\n/** Finds the visible content bounds inside a raw table cell span. */\nexport function getVisibleBounds(rawCellText: string): { startOffset: number; endOffset: number } {\n const leading = rawCellText.length - rawCellText.trimStart().length;\n const trailing = rawCellText.length - rawCellText.trimEnd().length;\n const trimmedLength = rawCellText.trim().length;\n\n if (trimmedLength === 0) {\n const placeholderOffset = Math.min(Math.floor(rawCellText.length / 2), Math.max(rawCellText.length - 1, 0));\n return {\n startOffset: placeholderOffset,\n endOffset: Math.min(placeholderOffset + 1, rawCellText.length),\n };\n }\n\n return {\n startOffset: leading,\n endOffset: rawCellText.length - trailing,\n };\n}\n\n/** Returns whether every cell in a body row is empty. */\nexport function isBodyRowEmpty(row: TableCellInfo[]): boolean {\n return row.every((cell) => normalizeCellContent(cell.rawText) === \"\");\n}\n\n/** Converts the live editor table model into a serializable table structure. */\nexport function buildTableFromInfo(tableInfo: TableInfo): ParsedTable {\n return {\n headers: tableInfo.headerCells.map((cell) => normalizeCellContent(cell.rawText)),\n alignments: [...tableInfo.alignments],\n rows: tableInfo.bodyCells.map((row) => row.map((cell) => normalizeCellContent(cell.rawText))),\n };\n}\n\n/** Maps a logical row index to its physical line index in formatted markdown. */\nexport function getRowLineIndex(rowIndex: number): number {\n return rowIndex === 0 ? 0 : rowIndex + 1;\n}\n\n/** Resolves the caret anchor for a cell inside normalized table markdown. */\nexport function getCellAnchorInFormattedTable(\n formattedTable: string,\n rowIndex: number,\n columnIndex: number,\n offset = 0\n): number {\n const lines = formattedTable.split(\"\\n\");\n const lineIndex = getRowLineIndex(rowIndex);\n const lineText = lines[lineIndex] || \"\";\n const pipes = getPipePositions(lineText);\n\n if (pipes.length < columnIndex + 2) {\n return formattedTable.length;\n }\n\n const rawFrom = pipes[columnIndex]! + 1;\n const rawTo = pipes[columnIndex + 1]!;\n const visible = getVisibleBounds(lineText.slice(rawFrom, rawTo));\n const lineOffset = lines.slice(0, lineIndex).reduce((sum, line) => sum + line.length + 1, 0);\n return (\n lineOffset +\n Math.min(rawFrom + visible.startOffset + offset, rawFrom + Math.max(visible.endOffset - 1, visible.startOffset))\n );\n}\n\n/** Wraps a table replacement with the required blank spacer lines. */\nexport function createTableInsert(state: EditorState, from: number, to: number, tableMarkdown: string) {\n let insert = tableMarkdown;\n let prefixLength = 0;\n\n const startLine = state.doc.lineAt(from);\n if (startLine.number === 1 || state.doc.line(startLine.number - 1).text.trim() !== \"\") {\n insert = \"\\n\" + insert;\n prefixLength = 1;\n }\n\n const endLine = state.doc.lineAt(Math.max(from, to));\n if (endLine.number === state.doc.lines || state.doc.line(endLine.number + 1).text.trim() !== \"\") {\n insert += \"\\n\";\n }\n\n return { from, to, insert, prefixLength };\n}\n\n/** Builds a live table model from the current editor document. */\nexport function readTableInfo(state: EditorState, nodeFrom: number, nodeTo: number): TableInfo | null {\n const startLine = state.doc.lineAt(nodeFrom);\n const endLine = state.doc.lineAt(nodeTo);\n const delimiterLineNumber = startLine.number + 1;\n if (delimiterLineNumber > endLine.number) {\n return null;\n }\n\n const delimiterLine = state.doc.line(delimiterLineNumber);\n const alignments = parseDelimiterAlignments(delimiterLine.text);\n if (!alignments) {\n return null;\n }\n\n let effectiveEndLineNumber = delimiterLineNumber;\n for (let lineNumber = delimiterLineNumber + 1; lineNumber <= endLine.number; lineNumber++) {\n const line = state.doc.line(lineNumber);\n if (!isTableRowLine(line.text)) {\n break;\n }\n effectiveEndLineNumber = lineNumber;\n }\n\n const cellsByRow: TableCellInfo[][] = [];\n for (let lineNumber = startLine.number; lineNumber <= effectiveEndLineNumber; lineNumber++) {\n if (lineNumber === delimiterLineNumber) {\n continue;\n }\n\n const line = state.doc.line(lineNumber);\n const pipes = getPipePositions(line.text);\n if (pipes.length < 2) {\n return null;\n }\n\n const isHeader = lineNumber === startLine.number;\n const rowIndex = isHeader ? 0 : cellsByRow.length;\n const cells: TableCellInfo[] = [];\n\n for (let columnIndex = 0; columnIndex < pipes.length - 1; columnIndex++) {\n const from = line.from + pipes[columnIndex]! + 1;\n const to = line.from + pipes[columnIndex + 1]!;\n const rawText = line.text.slice(pipes[columnIndex]! + 1, pipes[columnIndex + 1]);\n const visible = getVisibleBounds(rawText);\n\n cells.push({\n rowKind: isHeader ? \"header\" : \"body\",\n rowIndex,\n columnIndex,\n from,\n to,\n contentFrom: from + visible.startOffset,\n contentTo: from + visible.endOffset,\n lineFrom: line.from,\n lineNumber,\n rawText,\n });\n }\n\n cellsByRow.push(cells);\n }\n\n if (cellsByRow.length === 0) {\n return null;\n }\n\n return {\n from: startLine.from,\n to: state.doc.line(effectiveEndLineNumber).to,\n startLineNumber: startLine.number,\n delimiterLineNumber,\n endLineNumber: effectiveEndLineNumber,\n columnCount: cellsByRow[0]!.length,\n alignments: Array.from({ length: cellsByRow[0]!.length }, (_, index) => alignments[index] || \"left\"),\n cellsByRow,\n headerCells: cellsByRow[0]!,\n bodyCells: cellsByRow.slice(1),\n };\n}\n\n/** Finds the table model that contains the given document position. */\nexport function getTableInfoAtPosition(state: EditorState, position: number): TableInfo | null {\n let resolved: TableInfo | null = null;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n if (resolved || node.name !== \"Table\") {\n return;\n }\n\n const info = readTableInfo(state, node.from, node.to);\n if (info && position >= info.from && position <= info.to) {\n resolved = info;\n }\n },\n });\n\n return resolved;\n}\n\n/** Returns the table cell containing the given cursor position. */\nexport function findCellAtPosition(tableInfo: TableInfo, position: number): TableCellInfo | null {\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n if (position >= cell.from && position <= cell.to) {\n return cell;\n }\n }\n }\n\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n if (position >= cell.from - 1 && position <= cell.to + 1) {\n return cell;\n }\n }\n }\n\n let nearestCell: TableCellInfo | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n const distance = Math.min(Math.abs(position - cell.from), Math.abs(position - cell.to));\n if (distance < nearestDistance) {\n nearestCell = cell;\n nearestDistance = distance;\n }\n }\n }\n\n return nearestCell;\n}\n\n/** Clamps a document position into the editable content span of a cell. */\nexport function clampCellPosition(cell: TableCellInfo, position: number): number {\n const cellEnd = Math.max(cell.contentFrom, cell.contentTo);\n return Math.max(cell.contentFrom, Math.min(position, cellEnd));\n}\n\n/** Collects all `<br />` token ranges from the current table. */\nexport function collectBreakRanges(tableInfo: TableInfo): Array<{ from: number; to: number }> {\n const ranges: Array<{ from: number; to: number }> = [];\n\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n let match: RegExpExecArray | null;\n const regex = new RegExp(BREAK_TAG_REGEX);\n while ((match = regex.exec(cell.rawText)) !== null) {\n ranges.push({\n from: cell.from + match.index,\n to: cell.from + match.index + match[0].length,\n });\n }\n }\n }\n\n return ranges;\n}\n\nexport type InsertSide = \"above\" | \"below\";\nexport type HorizontalSide = \"left\" | \"right\";\nexport type MoveDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nfunction bodyIndexFromRowIndex(rowIndex: number): number {\n return rowIndex - 1;\n}\n\nfunction columnArrayIndex(columnIndex: number): number {\n return columnIndex - 1;\n}\n\nfunction cloneParsedTable(parsed: ParsedTable): ParsedTable {\n const normalized = normalizeParsedTable(parsed);\n return {\n headers: [...normalized.headers],\n alignments: [...normalized.alignments],\n rows: normalized.rows.map((row) => [...row]),\n };\n}\n\nfunction swapArrayItems<T>(items: T[], left: number, right: number): void {\n const current = items[left]!;\n items[left] = items[right]!;\n items[right] = current;\n}\n\nexport function insertTableRow(parsed: ParsedTable, rowIndex: number, side: InsertSide): ParsedTable {\n const next = cloneParsedTable(parsed);\n const bodyIndex = Math.max(0, Math.min(bodyIndexFromRowIndex(rowIndex), next.rows.length));\n const insertAt = side === \"above\" ? bodyIndex : bodyIndex + 1;\n next.rows.splice(Math.max(0, Math.min(insertAt, next.rows.length)), 0, buildEmptyRow(next.headers.length));\n return next;\n}\n\nexport function moveTableRow(\n parsed: ParsedTable,\n rowIndex: number,\n direction: Extract<MoveDirection, \"up\" | \"down\">\n): ParsedTable {\n const next = cloneParsedTable(parsed);\n const bodyIndex = bodyIndexFromRowIndex(rowIndex);\n const targetIndex = direction === \"up\" ? bodyIndex - 1 : bodyIndex + 1;\n if (bodyIndex < 0 || bodyIndex >= next.rows.length || targetIndex < 0 || targetIndex >= next.rows.length) {\n return next;\n }\n const current = next.rows[bodyIndex]!;\n next.rows[bodyIndex] = next.rows[targetIndex]!;\n next.rows[targetIndex] = current;\n return next;\n}\n\nexport function copyTableRow(parsed: ParsedTable, rowIndex: number): ParsedTable {\n const next = cloneParsedTable(parsed);\n const bodyIndex = bodyIndexFromRowIndex(rowIndex);\n if (bodyIndex < 0 || bodyIndex >= next.rows.length) {\n return next;\n }\n next.rows.splice(bodyIndex + 1, 0, [...next.rows[bodyIndex]!]);\n return next;\n}\n\nexport function deleteTableRow(parsed: ParsedTable, rowIndex: number): ParsedTable {\n const next = cloneParsedTable(parsed);\n const bodyIndex = bodyIndexFromRowIndex(rowIndex);\n if (bodyIndex < 0 || bodyIndex >= next.rows.length) {\n return next;\n }\n if (next.rows.length <= 1) {\n next.rows[0] = buildEmptyRow(next.headers.length);\n return next;\n }\n next.rows.splice(bodyIndex, 1);\n return next;\n}\n\nexport function insertTableColumn(parsed: ParsedTable, columnIndex: number, side: HorizontalSide): ParsedTable {\n const next = cloneParsedTable(parsed);\n const currentIndex = Math.max(0, Math.min(columnArrayIndex(columnIndex), next.headers.length));\n const insertAt = side === \"left\" ? currentIndex : currentIndex + 1;\n const safeInsertAt = Math.max(0, Math.min(insertAt, next.headers.length));\n next.headers.splice(safeInsertAt, 0, \"\");\n next.alignments.splice(safeInsertAt, 0, \"left\");\n for (const row of next.rows) {\n row.splice(safeInsertAt, 0, \"\");\n }\n return next;\n}\n\nexport function moveTableColumn(\n parsed: ParsedTable,\n columnIndex: number,\n direction: Extract<MoveDirection, \"left\" | \"right\">\n): ParsedTable {\n const next = cloneParsedTable(parsed);\n const currentIndex = columnArrayIndex(columnIndex);\n const targetIndex = direction === \"left\" ? currentIndex - 1 : currentIndex + 1;\n if (currentIndex < 0 || currentIndex >= next.headers.length || targetIndex < 0 || targetIndex >= next.headers.length) {\n return next;\n }\n swapArrayItems(next.headers, currentIndex, targetIndex);\n swapArrayItems(next.alignments, currentIndex, targetIndex);\n for (const row of next.rows) {\n swapArrayItems(row, currentIndex, targetIndex);\n }\n return next;\n}\n\nexport function copyTableColumn(parsed: ParsedTable, columnIndex: number): ParsedTable {\n const next = cloneParsedTable(parsed);\n const currentIndex = columnArrayIndex(columnIndex);\n if (currentIndex < 0 || currentIndex >= next.headers.length) {\n return next;\n }\n next.headers.splice(currentIndex + 1, 0, next.headers[currentIndex] || \"\");\n next.alignments.splice(currentIndex + 1, 0, next.alignments[currentIndex] || \"left\");\n for (const row of next.rows) {\n row.splice(currentIndex + 1, 0, row[currentIndex] || \"\");\n }\n return next;\n}\n\nexport function deleteTableColumn(parsed: ParsedTable, columnIndex: number): ParsedTable {\n const next = cloneParsedTable(parsed);\n if (next.headers.length <= 1) {\n return next;\n }\n const currentIndex = columnArrayIndex(columnIndex);\n if (currentIndex < 0 || currentIndex >= next.headers.length) {\n return next;\n }\n next.headers.splice(currentIndex, 1);\n next.alignments.splice(currentIndex, 1);\n for (const row of next.rows) {\n row.splice(currentIndex, 1);\n }\n return next;\n}\n","import { Annotation, EditorState, Extension, Prec, Range, RangeSet } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { BlockWrapper, Decoration, EditorView, KeyBinding, WidgetType, keymap } from \"@codemirror/view\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { MarkdownConfig, Table } from \"@lezer/markdown\";\nimport { createTheme, deepMerge } from \"../editor\";\nimport { MardoraConfig } from \"../editor/mardora\";\nimport { DecorationContext, DecorationPlugin, PluginContext } from \"../editor/plugin\";\nimport { ThemeEnum } from \"../editor/utils\";\nimport { PreviewRenderer } from \"../preview/renderer\";\nimport {\n ActiveTableControl,\n TableControlAction,\n activeTableControlField,\n tableControls,\n} from \"./table-controls\";\nimport { tableControlsTheme } from \"./table-controls-theme\";\nimport {\n copyTableColumn,\n copyTableRow,\n deleteTableColumn,\n deleteTableRow,\n insertTableColumn,\n insertTableRow,\n moveTableColumn,\n moveTableRow,\n} from \"./table-model\";\n\ntype Alignment = \"left\" | \"center\" | \"right\";\ntype TableRowKind = \"header\" | \"body\";\n\ninterface ParsedTable {\n headers: string[];\n alignments: Alignment[];\n rows: string[][];\n}\n\ninterface PreviewContextLike {\n sliceDoc(from: number, to: number): string;\n sanitize(html: string): string;\n}\n\ninterface TableCellInfo {\n rowKind: TableRowKind;\n rowIndex: number;\n columnIndex: number;\n from: number;\n to: number;\n contentFrom: number;\n contentTo: number;\n lineFrom: number;\n lineNumber: number;\n rawText: string;\n}\n\ninterface TableInfo {\n from: number;\n to: number;\n startLineNumber: number;\n delimiterLineNumber: number;\n endLineNumber: number;\n columnCount: number;\n alignments: Alignment[];\n cellsByRow: TableCellInfo[][];\n headerCells: TableCellInfo[];\n bodyCells: TableCellInfo[][];\n}\n\nconst BREAK_TAG = \"<br />\";\nconst BREAK_TAG_REGEX = /<br\\s*\\/?>/gi;\nconst DELIMITER_CELL_PATTERN = /^:?-{3,}:?$/;\nconst TABLE_SUB_NODE_NAMES = new Set([\"TableHeader\", \"TableDelimiter\", \"TableRow\", \"TableCell\"]);\nconst TABLE_TEMPLATE: ParsedTable = {\n headers: [\"Header 1\", \"Header 2\", \"Header 3\"],\n alignments: [\"left\", \"left\", \"left\"],\n rows: [[\"\", \"\", \"\"]],\n};\n\nconst normalizeAnnotation = Annotation.define<boolean>();\nconst repairSelectionAnnotation = Annotation.define<boolean>();\nconst pipeReplace = Decoration.replace({});\nconst delimiterReplace = Decoration.replace({});\n\nconst tableBlockWrapper = BlockWrapper.create({\n tagName: \"div\",\n attributes: { class: \"cm-mardora-table-wrapper\" },\n});\n\nclass TableBreakWidget extends WidgetType {\n /** Reuses the same widget instance for identical break markers. */\n override eq(): boolean {\n return true;\n }\n\n /** Renders an inline `<br />` placeholder inside a table cell. */\n toDOM(): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-table-break\";\n span.setAttribute(\"aria-label\", \"line break\");\n span.appendChild(document.createElement(\"br\"));\n return span;\n }\n\n /** Allows the editor to observe events on the rendered break widget. */\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\nclass TableCaretWidget extends WidgetType {\n /** Reuses the same caret widget shape across table cells. */\n override eq(): boolean {\n return true;\n }\n\n /** Renders a lightweight caret for table cells where CodeMirror's native cursor cannot be placed. */\n toDOM(): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-table-caret\";\n span.setAttribute(\"aria-hidden\", \"true\");\n return span;\n }\n}\n\nconst tableCaretWidget = new TableCaretWidget();\n\nclass TableControlsWidget extends WidgetType {\n constructor(\n private readonly onAddRow: (view: EditorView) => void,\n private readonly onAddColumn: (view: EditorView) => void\n ) {\n super();\n }\n\n /** Forces the control widget to be recreated so handlers stay current. */\n override eq(): boolean {\n return false;\n }\n\n /** Renders the hover controls used to append rows and columns. */\n toDOM(view: EditorView): HTMLElement {\n const anchor = document.createElement(\"span\");\n anchor.className = \"cm-mardora-table-controls-anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n\n const rightButton = this.createButton(\"Add column\", \"cm-mardora-table-control cm-mardora-table-control-column\");\n rightButton.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.onAddColumn(view);\n });\n\n const bottomButton = this.createButton(\"Add row\", \"cm-mardora-table-control cm-mardora-table-control-row\");\n bottomButton.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.onAddRow(view);\n });\n\n anchor.append(rightButton, bottomButton);\n return anchor;\n }\n\n /** Lets button events bubble through the widget. */\n override ignoreEvent(): boolean {\n return false;\n }\n\n /** Builds a single control button with the provided label and class. */\n private createButton(label: string, className: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = className;\n button.setAttribute(\"tabindex\", \"-1\");\n button.setAttribute(\"aria-label\", label);\n button.textContent = \"+\";\n return button;\n }\n}\n\n/** Returns whether the character at the given index is backslash-escaped. */\nfunction isEscaped(text: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && text[i] === \"\\\\\"; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\n/** Collects the positions of every unescaped pipe character in a line. */\nfunction getPipePositions(lineText: string): number[] {\n const positions: number[] = [];\n for (let index = 0; index < lineText.length; index++) {\n if (lineText[index] === \"|\" && !isEscaped(lineText, index)) {\n positions.push(index);\n }\n }\n return positions;\n}\n\n/** Splits a markdown table row into raw cell strings. */\nfunction splitTableLine(lineText: string): string[] {\n const cells: string[] = [];\n const trimmed = lineText.trim();\n\n if (!trimmed.includes(\"|\")) {\n return [trimmed];\n }\n\n let current = \"\";\n for (let index = 0; index < trimmed.length; index++) {\n const char = trimmed[index]!;\n if (char === \"|\" && !isEscaped(trimmed, index)) {\n cells.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n cells.push(current);\n\n if (trimmed.startsWith(\"|\")) {\n cells.shift();\n }\n if (trimmed.endsWith(\"|\")) {\n cells.pop();\n }\n\n return cells;\n}\n\n/** Checks whether the given line can participate in a table block. */\nfunction isTableRowLine(lineText: string): boolean {\n return getPipePositions(lineText.trim()).length > 0;\n}\n\n/** Parses a delimiter cell token into a table alignment value. */\nfunction parseAlignment(cell: string): Alignment {\n const trimmed = cell.trim();\n const left = trimmed.startsWith(\":\");\n const right = trimmed.endsWith(\":\");\n if (left && right) return \"center\";\n if (right) return \"right\";\n return \"left\";\n}\n\n/** Parses the delimiter line and returns per-column alignments. */\nfunction parseDelimiterAlignments(lineText: string): Alignment[] | null {\n const cells = splitTableLine(lineText).map((cell) => cell.trim());\n if (cells.length === 0 || !cells.every((cell) => DELIMITER_CELL_PATTERN.test(cell))) {\n return null;\n }\n return cells.map(parseAlignment);\n}\n\n/** Splits a table node slice into its table lines and any trailing markdown. */\nfunction splitTableAndTrailingMarkdown(markdown: string): { tableMarkdown: string; trailingMarkdown: string } {\n const lines = markdown.split(\"\\n\");\n if (lines.length < 2) {\n return { tableMarkdown: markdown, trailingMarkdown: \"\" };\n }\n\n const headerLine = lines[0] || \"\";\n const delimiterLine = lines[1] || \"\";\n if (!isTableRowLine(headerLine) || !parseDelimiterAlignments(delimiterLine)) {\n return { tableMarkdown: markdown, trailingMarkdown: \"\" };\n }\n\n let endIndex = 1;\n for (let index = 2; index < lines.length; index++) {\n if (!isTableRowLine(lines[index] || \"\")) {\n break;\n }\n endIndex = index;\n }\n\n return {\n tableMarkdown: lines.slice(0, endIndex + 1).join(\"\\n\"),\n trailingMarkdown: lines.slice(endIndex + 1).join(\"\\n\"),\n };\n}\n\n/** Normalizes every supported `<br>` form to the canonical `<br />` token. */\nfunction canonicalizeBreakTags(text: string): string {\n return text.replace(BREAK_TAG_REGEX, BREAK_TAG);\n}\n\n/** Escapes literal pipe characters so cell content stays GFM-compatible. */\nfunction escapeUnescapedPipes(text: string): string {\n let result = \"\";\n for (let index = 0; index < text.length; index++) {\n const char = text[index]!;\n if (char === \"|\" && !isEscaped(text, index)) {\n result += \"\\\\|\";\n continue;\n }\n result += char;\n }\n return result;\n}\n\n/** Trims and normalizes cell content before it is written back to markdown. */\nfunction normalizeCellContent(text: string): string {\n const normalizedBreaks = canonicalizeBreakTags(text.trim());\n if (!normalizedBreaks) {\n return \"\";\n }\n\n const parts = normalizedBreaks.split(BREAK_TAG_REGEX).map((part) => escapeUnescapedPipes(part.trim()));\n if (parts.length === 1) {\n return parts[0] || \"\";\n }\n\n return parts.join(` ${BREAK_TAG} `).trim();\n}\n\n/** Measures the visible width of a cell for markdown alignment output. */\nfunction renderWidth(text: string): number {\n return canonicalizeBreakTags(text).replace(BREAK_TAG, \" \").replace(/\\\\\\|/g, \"|\").length;\n}\n\n/** Pads a cell according to its alignment for normalized markdown output. */\nfunction padCell(text: string, width: number, alignment: Alignment): string {\n const safeWidth = Math.max(width, renderWidth(text));\n const difference = safeWidth - renderWidth(text);\n if (difference <= 0) {\n return text;\n }\n\n if (alignment === \"right\") {\n return \" \".repeat(difference) + text;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(difference / 2);\n const right = difference - left;\n return \" \".repeat(left) + text + \" \".repeat(right);\n }\n\n return text + \" \".repeat(difference);\n}\n\n/** Builds the markdown delimiter token for a column. */\nfunction delimiterCell(width: number, alignment: Alignment): string {\n const hyphenCount = Math.max(width, 3);\n if (alignment === \"center\") {\n return \":\" + \"-\".repeat(Math.max(1, hyphenCount - 2)) + \":\";\n }\n if (alignment === \"right\") {\n return \"-\".repeat(Math.max(2, hyphenCount - 1)) + \":\";\n }\n return \"-\".repeat(hyphenCount);\n}\n\n/** Parses a markdown table block into header, alignment, and body rows. */\nfunction parseTableMarkdown(markdown: string): ParsedTable | null {\n const { tableMarkdown } = splitTableAndTrailingMarkdown(markdown);\n const lines = tableMarkdown.split(\"\\n\");\n if (lines.length < 2) {\n return null;\n }\n\n const headers = splitTableLine(lines[0] || \"\").map((cell) => cell.trim());\n const alignments = parseDelimiterAlignments(lines[1] || \"\");\n if (!alignments) {\n return null;\n }\n\n const rows = lines\n .slice(2)\n .filter((line) => isTableRowLine(line))\n .map((line) => splitTableLine(line).map((cell) => cell.trim()));\n\n return { headers, alignments, rows };\n}\n\n/** Expands all rows so the parsed table has a consistent column count. */\nfunction normalizeParsedTable(parsed: ParsedTable): ParsedTable {\n const columnCount = Math.max(\n parsed.headers.length,\n parsed.alignments.length,\n ...parsed.rows.map((row) => row.length),\n 1\n );\n\n const headers = Array.from({ length: columnCount }, (_, index) => normalizeCellContent(parsed.headers[index] || \"\"));\n const alignments = Array.from({ length: columnCount }, (_, index) => parsed.alignments[index] || \"left\");\n const rows = parsed.rows.map((row) =>\n Array.from({ length: columnCount }, (_, index) => normalizeCellContent(row[index] || \"\"))\n );\n\n return { headers, alignments, rows };\n}\n\n/** Formats a parsed table back into normalized GFM markdown. */\nfunction formatTableMarkdown(parsed: ParsedTable): string {\n const normalized = normalizeParsedTable(parsed);\n const widths = normalized.headers.map((header, index) =>\n Math.max(renderWidth(header), ...normalized.rows.map((row) => renderWidth(row[index] || \"\")), 3)\n );\n\n const formatRow = (cells: string[]) =>\n `| ${cells.map((cell, index) => padCell(cell, widths[index] || 3, normalized.alignments[index] || \"left\")).join(\" | \")} |`;\n\n const headerLine = formatRow(normalized.headers);\n const delimiterLine = `| ${normalized.alignments\n .map((alignment, index) => delimiterCell(widths[index] || 3, alignment))\n .join(\" | \")} |`;\n const bodyLines = normalized.rows.map((row) => formatRow(row));\n\n return [headerLine, delimiterLine, ...bodyLines].join(\"\\n\");\n}\n\n/** Creates a blank row with the requested number of columns. */\nfunction buildEmptyRow(columnCount: number): string[] {\n return Array.from({ length: columnCount }, () => \"\");\n}\n\n/** Creates a preview renderer that skips paragraph wrapping inside cells. */\nfunction createPreviewRenderer(markdown: string, config?: MardoraConfig): PreviewRenderer {\n const plugins = (config?.plugins || []).filter((plugin) => plugin.name !== \"paragraph\");\n return new PreviewRenderer(markdown, plugins, config?.markdown || [], config?.theme || ThemeEnum.AUTO, true);\n}\n\n/** Removes a single top-level paragraph wrapper from preview HTML. */\nfunction stripSingleParagraph(html: string): string {\n const trimmed = html.trim();\n const match = trimmed.match(/^<p\\b[^>]*>([\\s\\S]*)<\\/p>$/i);\n return match?.[1] || trimmed;\n}\n\n/** Renders one table cell through the preview pipeline. */\nasync function renderCellToHtml(text: string, config?: MardoraConfig): Promise<string> {\n if (!text.trim()) {\n return \"&nbsp;\";\n }\n\n return stripSingleParagraph(await createPreviewRenderer(text, config).render());\n}\n\n/** Renders a parsed table into semantic preview HTML. */\nasync function renderTableToHtml(parsed: ParsedTable, config?: MardoraConfig): Promise<string> {\n const normalized = normalizeParsedTable(parsed);\n let html = '<div class=\"cm-mardora-table-widget\"><table class=\"cm-mardora-table cm-mardora-table-preview\">';\n html += '<thead><tr class=\"cm-mardora-table-row cm-mardora-table-header-row\">';\n\n for (let index = 0; index < normalized.headers.length; index++) {\n const alignment = normalized.alignments[index] || \"left\";\n const content = await renderCellToHtml(normalized.headers[index] || \"\", config);\n html += `<th class=\"cm-mardora-table-cell cm-mardora-table-th${\n alignment === \"center\"\n ? \" cm-mardora-table-cell-center\"\n : alignment === \"right\"\n ? \" cm-mardora-table-cell-right\"\n : \"\"\n }${index === normalized.headers.length - 1 ? \" cm-mardora-table-cell-last\" : \"\"}\">${content}</th>`;\n }\n\n html += \"</tr></thead><tbody>\";\n\n for (let rowIndex = 0; rowIndex < normalized.rows.length; rowIndex++) {\n const row = normalized.rows[rowIndex] || [];\n html += `<tr class=\"cm-mardora-table-row cm-mardora-table-body-row${\n rowIndex === normalized.rows.length - 1 ? \" cm-mardora-table-row-last\" : \"\"\n }\">`;\n\n for (let index = 0; index < normalized.headers.length; index++) {\n const alignment = normalized.alignments[index] || \"left\";\n const content = await renderCellToHtml(row[index] || \"\", config);\n html += `<td class=\"cm-mardora-table-cell${\n alignment === \"center\"\n ? \" cm-mardora-table-cell-center\"\n : alignment === \"right\"\n ? \" cm-mardora-table-cell-right\"\n : \"\"\n }${index === normalized.headers.length - 1 ? \" cm-mardora-table-cell-last\" : \"\"}\">${content}</td>`;\n }\n\n html += \"</tr>\";\n }\n\n html += \"</tbody></table></div>\";\n return html;\n}\n\n/** Finds the visible content bounds inside a raw table cell span. */\nfunction getVisibleBounds(rawCellText: string): { startOffset: number; endOffset: number } {\n const leading = rawCellText.length - rawCellText.trimStart().length;\n const trailing = rawCellText.length - rawCellText.trimEnd().length;\n const trimmedLength = rawCellText.trim().length;\n\n if (trimmedLength === 0) {\n const placeholderOffset = Math.min(Math.floor(rawCellText.length / 2), Math.max(rawCellText.length - 1, 0));\n return {\n startOffset: placeholderOffset,\n endOffset: Math.min(placeholderOffset + 1, rawCellText.length),\n };\n }\n\n return {\n startOffset: leading,\n endOffset: rawCellText.length - trailing,\n };\n}\n\n/** Returns whether every cell in a body row is empty. */\nfunction isBodyRowEmpty(row: TableCellInfo[]): boolean {\n return row.every((cell) => normalizeCellContent(cell.rawText) === \"\");\n}\n\n/** Converts the live editor table model into a serializable table structure. */\nfunction buildTableFromInfo(tableInfo: TableInfo): ParsedTable {\n return {\n headers: tableInfo.headerCells.map((cell) => normalizeCellContent(cell.rawText)),\n alignments: [...tableInfo.alignments],\n rows: tableInfo.bodyCells.map((row) => row.map((cell) => normalizeCellContent(cell.rawText))),\n };\n}\n\n/** Maps a logical row index to its physical line index in formatted markdown. */\nfunction getRowLineIndex(rowIndex: number): number {\n return rowIndex === 0 ? 0 : rowIndex + 1;\n}\n\n/** Resolves the caret anchor for a cell inside normalized table markdown. */\nfunction getCellAnchorInFormattedTable(\n formattedTable: string,\n rowIndex: number,\n columnIndex: number,\n offset = 0\n): number {\n const lines = formattedTable.split(\"\\n\");\n const lineIndex = getRowLineIndex(rowIndex);\n const lineText = lines[lineIndex] || \"\";\n const pipes = getPipePositions(lineText);\n\n if (pipes.length < columnIndex + 2) {\n return formattedTable.length;\n }\n\n const rawFrom = pipes[columnIndex]! + 1;\n const rawTo = pipes[columnIndex + 1]!;\n const visible = getVisibleBounds(lineText.slice(rawFrom, rawTo));\n const lineOffset = lines.slice(0, lineIndex).reduce((sum, line) => sum + line.length + 1, 0);\n return (\n lineOffset +\n Math.min(rawFrom + visible.startOffset + offset, rawFrom + Math.max(visible.endOffset - 1, visible.startOffset))\n );\n}\n\n/** Wraps a table replacement with the required blank spacer lines. */\nfunction createTableInsert(state: EditorState, from: number, to: number, tableMarkdown: string) {\n let insert = tableMarkdown;\n let prefixLength = 0;\n\n const startLine = state.doc.lineAt(from);\n if (startLine.number === 1 || state.doc.line(startLine.number - 1).text.trim() !== \"\") {\n insert = \"\\n\" + insert;\n prefixLength = 1;\n }\n\n const endLine = state.doc.lineAt(Math.max(from, to));\n if (endLine.number === state.doc.lines || state.doc.line(endLine.number + 1).text.trim() !== \"\") {\n insert += \"\\n\";\n }\n\n return { from, to, insert, prefixLength };\n}\n\n/** Builds a live table model from the current editor document. */\nfunction readTableInfo(state: EditorState, nodeFrom: number, nodeTo: number): TableInfo | null {\n const startLine = state.doc.lineAt(nodeFrom);\n const endLine = state.doc.lineAt(nodeTo);\n const delimiterLineNumber = startLine.number + 1;\n if (delimiterLineNumber > endLine.number) {\n return null;\n }\n\n const delimiterLine = state.doc.line(delimiterLineNumber);\n const alignments = parseDelimiterAlignments(delimiterLine.text);\n if (!alignments) {\n return null;\n }\n\n let effectiveEndLineNumber = delimiterLineNumber;\n for (let lineNumber = delimiterLineNumber + 1; lineNumber <= endLine.number; lineNumber++) {\n const line = state.doc.line(lineNumber);\n if (!isTableRowLine(line.text)) {\n break;\n }\n effectiveEndLineNumber = lineNumber;\n }\n\n const cellsByRow: TableCellInfo[][] = [];\n for (let lineNumber = startLine.number; lineNumber <= effectiveEndLineNumber; lineNumber++) {\n if (lineNumber === delimiterLineNumber) {\n continue;\n }\n\n const line = state.doc.line(lineNumber);\n const pipes = getPipePositions(line.text);\n if (pipes.length < 2) {\n return null;\n }\n\n const isHeader = lineNumber === startLine.number;\n const rowIndex = isHeader ? 0 : cellsByRow.length;\n const cells: TableCellInfo[] = [];\n\n for (let columnIndex = 0; columnIndex < pipes.length - 1; columnIndex++) {\n const from = line.from + pipes[columnIndex]! + 1;\n const to = line.from + pipes[columnIndex + 1]!;\n const rawText = line.text.slice(pipes[columnIndex]! + 1, pipes[columnIndex + 1]);\n const visible = getVisibleBounds(rawText);\n\n cells.push({\n rowKind: isHeader ? \"header\" : \"body\",\n rowIndex,\n columnIndex,\n from,\n to,\n contentFrom: from + visible.startOffset,\n contentTo: from + visible.endOffset,\n lineFrom: line.from,\n lineNumber,\n rawText,\n });\n }\n\n cellsByRow.push(cells);\n }\n\n if (cellsByRow.length === 0) {\n return null;\n }\n\n return {\n from: startLine.from,\n to: state.doc.line(effectiveEndLineNumber).to,\n startLineNumber: startLine.number,\n delimiterLineNumber,\n endLineNumber: effectiveEndLineNumber,\n columnCount: cellsByRow[0]!.length,\n alignments: Array.from({ length: cellsByRow[0]!.length }, (_, index) => alignments[index] || \"left\"),\n cellsByRow,\n headerCells: cellsByRow[0]!,\n bodyCells: cellsByRow.slice(1),\n };\n}\n\n/** Finds the table model that contains the given document position. */\nfunction getTableInfoAtPosition(state: EditorState, position: number): TableInfo | null {\n let resolved: TableInfo | null = null;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n if (resolved || node.name !== \"Table\") {\n return;\n }\n\n const info = readTableInfo(state, node.from, node.to);\n if (info && position >= info.from && position <= info.to) {\n resolved = info;\n }\n },\n });\n\n return resolved;\n}\n\n/** Returns the table cell containing the given cursor position. */\nfunction findCellAtPosition(tableInfo: TableInfo, position: number): TableCellInfo | null {\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n if (position >= cell.from && position <= cell.to) {\n return cell;\n }\n }\n }\n\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n if (position >= cell.from - 1 && position <= cell.to + 1) {\n return cell;\n }\n }\n }\n\n let nearestCell: TableCellInfo | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n const distance = Math.min(Math.abs(position - cell.from), Math.abs(position - cell.to));\n if (distance < nearestDistance) {\n nearestCell = cell;\n nearestDistance = distance;\n }\n }\n }\n\n return nearestCell;\n}\n\n/** Clamps a document position into the editable content span of a cell. */\nfunction clampCellPosition(cell: TableCellInfo, position: number): number {\n const cellEnd = Math.max(cell.contentFrom, cell.contentTo);\n return Math.max(cell.contentFrom, Math.min(position, cellEnd));\n}\n\n/** Collects all `<br />` token ranges from the current table. */\nfunction collectBreakRanges(tableInfo: TableInfo): Array<{ from: number; to: number }> {\n const ranges: Array<{ from: number; to: number }> = [];\n\n for (const row of tableInfo.cellsByRow) {\n for (const cell of row) {\n let match: RegExpExecArray | null;\n const regex = new RegExp(BREAK_TAG_REGEX);\n while ((match = regex.exec(cell.rawText)) !== null) {\n ranges.push({\n from: cell.from + match.index,\n to: cell.from + match.index + match[0].length,\n });\n }\n }\n }\n\n return ranges;\n}\n\n/** Returns the character offset of a DOM text position inside a rendered cell. */\nfunction getTextOffsetInsideCell(cellElement: Element, targetNode: Node, targetOffset: number): number | null {\n const document = cellElement.ownerDocument;\n const walker = document.createTreeWalker(cellElement, NodeFilter.SHOW_TEXT);\n let offset = 0;\n let current = walker.nextNode();\n\n while (current) {\n const textLength = current.textContent?.length || 0;\n if (current === targetNode) {\n return offset + Math.min(targetOffset, textLength);\n }\n\n offset += textLength;\n current = walker.nextNode();\n }\n\n return null;\n}\n\n/** Reads the browser caret position at a click point inside the rendered cell. */\nfunction getCellTextOffsetFromPoint(cellElement: Element, x: number, y: number): number | null {\n const measuredOffset = getMeasuredCellTextOffsetFromPoint(cellElement, x, y);\n if (measuredOffset !== null) {\n return measuredOffset;\n }\n\n const document = cellElement.ownerDocument;\n const caretDocument = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n caretRangeFromPoint?: (x: number, y: number) => { startContainer: Node; startOffset: number } | null;\n };\n\n const caretPosition = caretDocument.caretPositionFromPoint?.(x, y);\n if (caretPosition && cellElement.contains(caretPosition.offsetNode)) {\n return getTextOffsetInsideCell(cellElement, caretPosition.offsetNode, caretPosition.offset);\n }\n\n const caretRange = caretDocument.caretRangeFromPoint?.(x, y);\n if (caretRange && cellElement.contains(caretRange.startContainer)) {\n return getTextOffsetInsideCell(cellElement, caretRange.startContainer, caretRange.startOffset);\n }\n\n return null;\n}\n\n/** Measures rendered text boxes to find the nearest insertion offset inside a table cell. */\nfunction getMeasuredCellTextOffsetFromPoint(cellElement: Element, x: number, y: number): number | null {\n const document = cellElement.ownerDocument;\n const walker = document.createTreeWalker(cellElement, NodeFilter.SHOW_TEXT);\n let absoluteOffset = 0;\n let best: { offset: number; score: number } | null = null;\n let current = walker.nextNode();\n\n while (current) {\n const text = current.textContent || \"\";\n for (let index = 0; index < text.length; index++) {\n const range = document.createRange();\n range.setStart(current, index);\n range.setEnd(current, index + 1);\n\n for (const rect of Array.from(range.getClientRects())) {\n if (rect.width === 0 && rect.height === 0) {\n continue;\n }\n\n const verticalDistance = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0;\n const boundaryOffset = x <= rect.left + rect.width / 2 ? absoluteOffset + index : absoluteOffset + index + 1;\n const boundaryX = boundaryOffset === absoluteOffset + index ? rect.left : rect.right;\n const horizontalDistance = Math.abs(x - boundaryX);\n const score = verticalDistance * 10000 + horizontalDistance;\n\n if (!best || score < best.score) {\n best = { offset: boundaryOffset, score };\n }\n }\n\n range.detach();\n }\n\n absoluteOffset += text.length;\n current = walker.nextNode();\n }\n\n return best?.offset ?? null;\n}\n\n/** Maps a rendered table-cell coordinate back to the editable markdown content range. */\nfunction getTableCellPositionFromPoint(view: EditorView, cellElement: Element, x: number, y: number): number | null {\n const contentFrom = Number(cellElement.getAttribute(\"data-mardora-content-from\"));\n const contentTo = Number(cellElement.getAttribute(\"data-mardora-content-to\"));\n if (!Number.isFinite(contentFrom) || !Number.isFinite(contentTo)) {\n return null;\n }\n\n const coordinatePosition = view.posAtCoords({ x, y }, false);\n const textOffset = getCellTextOffsetFromPoint(cellElement, x, y);\n const fallbackPosition = textOffset === null ? contentFrom : contentFrom + textOffset;\n const position =\n textOffset !== null\n ? fallbackPosition\n : coordinatePosition !== null && coordinatePosition >= contentFrom && coordinatePosition <= contentTo\n ? coordinatePosition\n : fallbackPosition;\n\n return Math.max(contentFrom, Math.min(position, Math.max(contentFrom, contentTo)));\n}\n\n/** Finds a rendered table cell at a viewport point and maps it back to a document position. */\nfunction getTablePositionFromPoint(view: EditorView, x: number, y: number): number | null {\n const element = view.dom.ownerDocument.elementFromPoint(x, y);\n const cellElement = element?.closest(\".cm-mardora-table-cell\");\n if (!cellElement || !view.dom.contains(cellElement)) {\n return view.posAtCoords({ x, y }, false);\n }\n\n return getTableCellPositionFromPoint(view, cellElement, x, y);\n}\n\nconst lineDecorations = {\n header: Decoration.line({ class: \"cm-mardora-table-row cm-mardora-table-header-row\" }),\n delimiter: Decoration.line({ class: \"cm-mardora-table-row cm-mardora-table-delimiter-row\" }),\n body: Decoration.line({ class: \"cm-mardora-table-row cm-mardora-table-body-row\" }),\n last: Decoration.line({ class: \"cm-mardora-table-row-last\" }),\n};\n\nfunction getCellClassName(\n isHeader: boolean,\n alignment: Alignment,\n isLastCell: boolean,\n isRowSelected = false,\n isColumnSelected = false\n): string {\n return [\n \"cm-mardora-table-cell\",\n isHeader ? \"cm-mardora-table-th\" : \"\",\n alignment === \"center\" ? \"cm-mardora-table-cell-center\" : \"\",\n alignment === \"right\" ? \"cm-mardora-table-cell-right\" : \"\",\n isLastCell ? \"cm-mardora-table-cell-last\" : \"\",\n isRowSelected ? \"cm-mardora-table-cell-row-selected\" : \"\",\n isColumnSelected ? \"cm-mardora-table-cell-column-selected\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction getCellDecoration(\n isHeader: boolean,\n alignment: Alignment,\n isLastCell: boolean,\n cell: TableCellInfo,\n tableFrom: number,\n isRowSelected = false,\n isColumnSelected = false\n): Decoration {\n return Decoration.mark({\n class: getCellClassName(isHeader, alignment, isLastCell, isRowSelected, isColumnSelected),\n attributes: {\n \"data-mardora-table-cell\": \"true\",\n \"data-mardora-table-from\": String(tableFrom),\n \"data-mardora-row-index\": String(cell.rowIndex),\n \"data-mardora-row-kind\": cell.rowKind,\n \"data-mardora-column-index\": String(cell.columnIndex),\n \"data-mardora-content-from\": String(cell.contentFrom),\n \"data-mardora-content-to\": String(cell.contentTo),\n },\n });\n}\n\nexport class TablePlugin extends DecorationPlugin {\n readonly name = \"table\";\n readonly version = \"2.0.0\";\n override decorationPriority = 20;\n override readonly requiredNodes = [\"Table\", \"TableHeader\", \"TableDelimiter\", \"TableRow\", \"TableCell\"] as const;\n\n private mardoraConfig: MardoraConfig | undefined;\n private pendingNormalizationView: EditorView | null = null;\n private pendingPaddingView: EditorView | null = null;\n private pendingSelectionRepairView: EditorView | null = null;\n\n /** Stores the editor config for preview rendering and shared behavior. */\n override onRegister(context: PluginContext): void {\n super.onRegister(context);\n this.mardoraConfig = context.config;\n }\n\n /** Exposes the plugin theme used for editor and preview styling. */\n override get theme() {\n return (themeEnum: ThemeEnum) => deepMerge(theme(themeEnum), tableControlsTheme(themeEnum));\n }\n\n /** Enables GFM table parsing for the editor and preview renderer. */\n override getMarkdownConfig(): MarkdownConfig {\n return Table;\n }\n\n /** Registers block wrappers and atomic ranges for the table UI. */\n override getExtensions(): Extension[] {\n return [\n Prec.highest(keymap.of(this.buildTableKeymap())),\n EditorView.blockWrappers.of((view) => this.computeBlockWrappers(view)),\n EditorView.atomicRanges.of((view) => this.computeAtomicRanges(view)),\n tableControls({\n getTableInfoByFrom: (view, tableFrom) => getTableInfoAtPosition(view.state, tableFrom),\n runAction: (view, control, action) => this.runTableControlAction(view, control, action),\n }),\n EditorView.domEventHandlers({\n mousedown: (event, view) => this.handleTableMouseDown(view, event),\n keydown: (event, view) => this.handleDomKeydown(view, event),\n }),\n ];\n }\n\n /** Provides the table-specific keyboard shortcuts and navigation. */\n override getKeymap(): KeyBinding[] {\n return [];\n }\n\n /** Builds the high-priority key bindings used inside tables. */\n private buildTableKeymap(): KeyBinding[] {\n return [\n { key: \"Mod-Shift-t\", run: (view) => this.insertTable(view), preventDefault: true },\n { key: \"Mod-Alt-ArrowDown\", run: (view) => this.addRow(view), preventDefault: true },\n { key: \"Mod-Alt-ArrowRight\", run: (view) => this.addColumn(view), preventDefault: true },\n { key: \"Mod-Alt-Backspace\", run: (view) => this.removeRow(view), preventDefault: true },\n { key: \"Mod-Alt-Delete\", run: (view) => this.removeColumn(view), preventDefault: true },\n { key: \"Tab\", run: (view) => this.handleTab(view, false) },\n { key: \"Shift-Tab\", run: (view) => this.handleTab(view, true) },\n { key: \"ArrowLeft\", run: (view) => this.handleArrowHorizontal(view, false) },\n { key: \"ArrowRight\", run: (view) => this.handleArrowHorizontal(view, true) },\n { key: \"ArrowUp\", run: (view) => this.handleArrowVertical(view, false) },\n { key: \"ArrowDown\", run: (view) => this.handleArrowVertical(view, true) },\n { key: \"Enter\", run: (view) => this.handleEnter(view) },\n { key: \"Shift-Enter\", run: (view) => this.insertBreakTag(view), preventDefault: true },\n { key: \"Backspace\", run: (view) => this.handleBreakDeletion(view, false) },\n { key: \"Delete\", run: (view) => this.handleBreakDeletion(view, true) },\n ];\n }\n\n /** Schedules an initial normalization pass once the view is ready. */\n override onViewReady(view: EditorView): void {\n this.scheduleNormalization(view);\n }\n\n /** Re-schedules normalization after user-driven document changes. */\n override onViewUpdate(update: import(\"@codemirror/view\").ViewUpdate): void {\n if (update.docChanged && !update.transactions.some((transaction) => transaction.annotation(normalizeAnnotation))) {\n this.schedulePadding(update.view);\n }\n\n if (\n update.selectionSet &&\n !update.transactions.some((transaction) => transaction.annotation(repairSelectionAnnotation))\n ) {\n this.scheduleSelectionRepair(update.view);\n }\n }\n\n /** Intercepts table-specific DOM key handling before browser defaults run. */\n private handleDomKeydown(view: EditorView, event: KeyboardEvent): boolean {\n if (event.defaultPrevented || event.isComposing || event.altKey || event.metaKey || event.ctrlKey) {\n return false;\n }\n\n let handled = false;\n\n if (event.key === \"Tab\") {\n handled = this.handleTab(view, event.shiftKey);\n } else if (event.key === \"Enter\" && event.shiftKey) {\n handled = this.insertBreakTag(view);\n } else if (event.key === \"Enter\") {\n handled = this.handleEnter(view);\n } else if (event.key === \"ArrowLeft\") {\n handled = this.handleArrowHorizontal(view, false);\n } else if (event.key === \"ArrowRight\") {\n handled = this.handleArrowHorizontal(view, true);\n } else if (event.key === \"ArrowUp\") {\n handled = this.handleArrowVertical(view, false);\n } else if (event.key === \"ArrowDown\") {\n handled = this.handleArrowVertical(view, true);\n } else if (event.key === \"Backspace\") {\n handled = this.handleBreakDeletion(view, false);\n } else if (event.key === \"Delete\") {\n handled = this.handleBreakDeletion(view, true);\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n return handled;\n }\n\n /** Maps a single pointer-down on rendered table cells back to the editable markdown cell content. */\n private handleTableMouseDown(view: EditorView, event: MouseEvent): boolean {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.detail !== 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return false;\n }\n\n if (event.target instanceof Element && event.target.closest(\".cm-mardora-table-controls-overlay\")) {\n return false;\n }\n\n const target = event.target instanceof Element ? event.target.closest(\".cm-mardora-table-cell\") : null;\n if (!target || !view.dom.contains(target)) {\n return false;\n }\n\n const anchor = getTableCellPositionFromPoint(view, target, event.clientX, event.clientY);\n if (anchor === null) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n const startY = event.clientY;\n let dragging = false;\n const ownerDocument = view.dom.ownerDocument;\n\n const move = (moveEvent: MouseEvent) => {\n if ((moveEvent.buttons & 1) === 0) {\n return;\n }\n\n moveEvent.preventDefault();\n const distance = Math.abs(moveEvent.clientX - startX) + Math.abs(moveEvent.clientY - startY);\n if (distance > 3) {\n dragging = true;\n }\n\n if (!dragging) {\n return;\n }\n\n const head = getTablePositionFromPoint(view, moveEvent.clientX, moveEvent.clientY);\n if (head === null) {\n return;\n }\n\n view.dispatch({\n selection: { anchor, head },\n annotations: repairSelectionAnnotation.of(true),\n scrollIntoView: false,\n });\n };\n\n const up = () => {\n ownerDocument.removeEventListener(\"mousemove\", move, true);\n ownerDocument.removeEventListener(\"mouseup\", up, true);\n };\n\n ownerDocument.addEventListener(\"mousemove\", move, true);\n ownerDocument.addEventListener(\"mouseup\", up, true);\n\n view.focus();\n view.dispatch({\n selection: { anchor },\n annotations: repairSelectionAnnotation.of(true),\n scrollIntoView: false,\n });\n return true;\n }\n\n /** Builds the visual table decorations for every parsed table block. */\n override buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name !== \"Table\") {\n return;\n }\n\n const tableInfo = readTableInfo(view.state, node.from, node.to);\n if (tableInfo) {\n this.decorateTable(view, decorations, tableInfo);\n }\n },\n });\n }\n\n /** Renders the full table node to semantic preview HTML. */\n override async renderToHTML(node: SyntaxNode, _children: string, ctx: PreviewContextLike): Promise<string | null> {\n if (node.name === \"Table\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const { tableMarkdown, trailingMarkdown } = splitTableAndTrailingMarkdown(content);\n const parsed = parseTableMarkdown(tableMarkdown);\n if (!parsed) {\n return null;\n }\n\n const tableHtml = await renderTableToHtml(parsed, this.mardoraConfig);\n if (!trailingMarkdown.trim()) {\n return tableHtml;\n }\n\n return tableHtml + (await createPreviewRenderer(trailingMarkdown, this.mardoraConfig).render());\n }\n\n if (TABLE_SUB_NODE_NAMES.has(node.name)) {\n return \"\";\n }\n\n return null;\n }\n\n /** Computes the block wrapper ranges used to group table lines. */\n private computeBlockWrappers(view: EditorView): RangeSet<BlockWrapper> {\n const wrappers: Range<BlockWrapper>[] = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name !== \"Table\") {\n return;\n }\n\n const tableInfo = readTableInfo(view.state, node.from, node.to);\n if (tableInfo) {\n wrappers.push(tableBlockWrapper.range(tableInfo.from, tableInfo.to));\n }\n },\n });\n\n return BlockWrapper.set(wrappers, true);\n }\n\n /** Computes atomic ranges for delimiters and inline break tags. */\n private computeAtomicRanges(view: EditorView): RangeSet<Decoration> {\n const ranges: Range<Decoration>[] = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name !== \"Table\") {\n return;\n }\n\n const tableInfo = readTableInfo(view.state, node.from, node.to);\n if (!tableInfo) {\n return;\n }\n\n for (let lineNumber = tableInfo.startLineNumber; lineNumber <= tableInfo.endLineNumber; lineNumber++) {\n const line = view.state.doc.line(lineNumber);\n if (lineNumber === tableInfo.delimiterLineNumber) {\n ranges.push(delimiterReplace.range(line.from, line.to));\n continue;\n }\n\n const pipes = getPipePositions(line.text);\n for (const pipe of pipes) {\n ranges.push(pipeReplace.range(line.from + pipe, line.from + pipe + 1));\n }\n\n for (let columnIndex = 0; columnIndex < pipes.length - 1; columnIndex++) {\n const rawFrom = pipes[columnIndex]! + 1;\n const rawTo = pipes[columnIndex + 1]!;\n const rawText = line.text.slice(rawFrom, rawTo);\n const visible = getVisibleBounds(rawText);\n\n if (visible.startOffset > 0) {\n ranges.push(pipeReplace.range(line.from + rawFrom, line.from + rawFrom + visible.startOffset));\n }\n if (visible.endOffset < rawText.length) {\n ranges.push(pipeReplace.range(line.from + rawFrom + visible.endOffset, line.from + rawTo));\n }\n\n let match: RegExpExecArray | null;\n const regex = new RegExp(BREAK_TAG_REGEX);\n while ((match = regex.exec(rawText)) !== null) {\n ranges.push(\n Decoration.replace({ widget: new TableBreakWidget() }).range(\n line.from + rawFrom + match.index,\n line.from + rawFrom + match.index + match[0].length\n )\n );\n }\n }\n }\n },\n });\n\n return RangeSet.of(ranges, true);\n }\n\n /** Applies row, cell, and control decorations for a single table. */\n private decorateTable(view: EditorView, decorations: Range<Decoration>[], tableInfo: TableInfo): void {\n const activeControl = view.state.field(activeTableControlField, false) ?? null;\n for (let lineNumber = tableInfo.startLineNumber; lineNumber <= tableInfo.endLineNumber; lineNumber++) {\n const line = view.state.doc.line(lineNumber);\n const isHeader = lineNumber === tableInfo.startLineNumber;\n const isDelimiter = lineNumber === tableInfo.delimiterLineNumber;\n const isLastBody = !isHeader && !isDelimiter && lineNumber === tableInfo.endLineNumber;\n\n if (isHeader) {\n decorations.push(lineDecorations.header.range(line.from));\n } else if (isDelimiter) {\n decorations.push(lineDecorations.delimiter.range(line.from));\n } else {\n decorations.push(lineDecorations.body.range(line.from));\n }\n\n if (isLastBody) {\n decorations.push(lineDecorations.last.range(line.from));\n }\n\n if (isDelimiter) {\n decorations.push(delimiterReplace.range(line.from, line.to));\n continue;\n }\n\n const rowCells = tableInfo.cellsByRow.find((row) => row[0]?.lineNumber === lineNumber) || [];\n this.decorateLine(decorations, line.from, line.text, tableInfo, isHeader, rowCells, activeControl);\n }\n\n this.decorateTableCaret(view, decorations, tableInfo);\n\n decorations.push(\n Decoration.widget({\n widget: new TableControlsWidget(\n (view) => {\n const liveTable = getTableInfoAtPosition(view.state, tableInfo.from);\n if (liveTable) {\n this.appendRow(view, liveTable, liveTable.columnCount - 1);\n }\n },\n (view) => {\n const liveTable = getTableInfoAtPosition(view.state, tableInfo.from);\n if (liveTable) {\n this.appendColumn(view, liveTable);\n }\n }\n ),\n side: 1,\n }).range(tableInfo.to)\n );\n }\n\n /** Draws an explicit caret inside table cells because table layout can hide CodeMirror's native cursor. */\n private decorateTableCaret(view: EditorView, decorations: Range<Decoration>[], tableInfo: TableInfo): void {\n const selection = view.state.selection.main;\n if (!selection.empty || selection.head < tableInfo.from || selection.head > tableInfo.to) {\n return;\n }\n\n const cell = findCellAtPosition(tableInfo, selection.head);\n if (!cell || selection.head < cell.contentFrom || selection.head > cell.contentTo) {\n return;\n }\n\n decorations.push(\n Decoration.widget({\n widget: tableCaretWidget,\n side: -1,\n }).range(selection.head)\n );\n }\n\n /** Applies the visual cell decorations for a single table row line. */\n private decorateLine(\n decorations: Range<Decoration>[],\n lineFrom: number,\n lineText: string,\n tableInfo: TableInfo,\n isHeader: boolean,\n rowCells: TableCellInfo[],\n activeControl: ActiveTableControl | null\n ): void {\n const pipes = getPipePositions(lineText);\n if (pipes.length < 2) {\n return;\n }\n\n for (const pipe of pipes) {\n decorations.push(pipeReplace.range(lineFrom + pipe, lineFrom + pipe + 1));\n }\n\n for (let columnIndex = 0; columnIndex < pipes.length - 1; columnIndex++) {\n const rawFrom = pipes[columnIndex]! + 1;\n const rawTo = pipes[columnIndex + 1]!;\n const rawText = lineText.slice(rawFrom, rawTo);\n const visible = getVisibleBounds(rawText);\n const absoluteFrom = lineFrom + rawFrom;\n const absoluteTo = lineFrom + rawTo;\n\n if (visible.startOffset > 0) {\n decorations.push(pipeReplace.range(absoluteFrom, absoluteFrom + visible.startOffset));\n }\n if (visible.endOffset < rawText.length) {\n decorations.push(pipeReplace.range(absoluteFrom + visible.endOffset, absoluteTo));\n }\n\n const cell = rowCells[columnIndex];\n if (cell) {\n const isRowSelected =\n activeControl?.kind === \"row\" &&\n activeControl.tableFrom === tableInfo.from &&\n activeControl.rowIndex === cell.rowIndex;\n const isColumnSelected =\n activeControl?.kind === \"column\" &&\n activeControl.tableFrom === tableInfo.from &&\n activeControl.columnIndex === cell.columnIndex;\n decorations.push(\n getCellDecoration(\n isHeader,\n tableInfo.alignments[columnIndex] || \"left\",\n columnIndex === pipes.length - 2,\n cell,\n tableInfo.from,\n isRowSelected,\n isColumnSelected\n ).range(absoluteFrom, absoluteTo)\n );\n }\n\n let match: RegExpExecArray | null;\n const regex = new RegExp(BREAK_TAG_REGEX);\n while ((match = regex.exec(rawText)) !== null) {\n decorations.push(\n Decoration.replace({ widget: new TableBreakWidget() }).range(\n absoluteFrom + match.index,\n absoluteFrom + match.index + match[0].length\n )\n );\n }\n }\n }\n\n /** Normalizes every parsed table block back into canonical markdown. */\n private normalizeTables(view: EditorView): void {\n const changes: Array<{ from: number; to: number; insert: string }> = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name !== \"Table\") {\n return;\n }\n\n const content = view.state.sliceDoc(node.from, node.to);\n const { tableMarkdown } = splitTableAndTrailingMarkdown(content);\n const parsed = parseTableMarkdown(tableMarkdown);\n if (!parsed) {\n return;\n }\n\n const formatted = formatTableMarkdown(parsed);\n const change = createTableInsert(view.state, node.from, node.from + tableMarkdown.length, formatted);\n if (\n change.insert !== tableMarkdown ||\n change.from !== node.from ||\n change.to !== node.from + tableMarkdown.length\n ) {\n changes.push({\n from: change.from,\n to: change.to,\n insert: change.insert,\n });\n }\n },\n });\n\n if (changes.length > 0) {\n view.dispatch({\n changes: changes.sort((left, right) => right.from - left.from),\n annotations: normalizeAnnotation.of(true),\n });\n }\n }\n\n /** Defers table normalization until the current update cycle is finished. */\n private scheduleNormalization(view: EditorView): void {\n if (this.pendingNormalizationView === view) {\n return;\n }\n\n this.pendingNormalizationView = view;\n queueMicrotask(() => {\n if (this.pendingNormalizationView !== view) {\n return;\n }\n\n this.pendingNormalizationView = null;\n this.normalizeTables(view);\n });\n }\n\n /** Adds missing spacer lines above and below tables after edits. */\n private ensureTablePadding(view: EditorView): void {\n const changes: Array<{ from: number; to: number; insert: string }> = [];\n\n syntaxTree(view.state).iterate({\n enter: (node) => {\n if (node.name !== \"Table\") {\n return;\n }\n\n const tableInfo = readTableInfo(view.state, node.from, node.to);\n if (!tableInfo) {\n return;\n }\n\n const startLine = view.state.doc.lineAt(tableInfo.from);\n if (startLine.number === 1) {\n changes.push({ from: startLine.from, to: startLine.from, insert: \"\\n\" });\n } else {\n const previousLine = view.state.doc.line(startLine.number - 1);\n if (previousLine.text.trim() !== \"\") {\n changes.push({ from: startLine.from, to: startLine.from, insert: \"\\n\" });\n }\n }\n\n const endLine = view.state.doc.lineAt(tableInfo.to);\n if (endLine.number === view.state.doc.lines) {\n changes.push({ from: endLine.to, to: endLine.to, insert: \"\\n\" });\n } else {\n const nextLine = view.state.doc.line(endLine.number + 1);\n if (nextLine.text.trim() !== \"\") {\n changes.push({ from: endLine.to, to: endLine.to, insert: \"\\n\" });\n }\n }\n },\n });\n\n if (changes.length > 0) {\n view.dispatch({\n changes: changes.sort((left, right) => right.from - left.from),\n annotations: normalizeAnnotation.of(true),\n });\n }\n }\n\n /** Schedules a padding-only pass after the current update cycle finishes. */\n private schedulePadding(view: EditorView): void {\n if (this.pendingPaddingView === view) {\n return;\n }\n\n this.pendingPaddingView = view;\n queueMicrotask(() => {\n if (this.pendingPaddingView !== view) {\n return;\n }\n\n this.pendingPaddingView = null;\n this.ensureTablePadding(view);\n });\n }\n\n /** Repairs carets that land in hidden table markup instead of editable cell content. */\n private ensureTableSelection(view: EditorView): void {\n const selection = view.state.selection.main;\n if (!selection.empty) {\n return;\n }\n\n const tableInfo = getTableInfoAtPosition(view.state, selection.head);\n if (!tableInfo) {\n return;\n }\n\n const cell = findCellAtPosition(tableInfo, selection.head);\n if (!cell) {\n return;\n }\n\n const anchor = clampCellPosition(cell, selection.head);\n if (anchor === selection.head) {\n return;\n }\n\n view.dispatch({\n selection: { anchor },\n annotations: repairSelectionAnnotation.of(true),\n scrollIntoView: true,\n });\n }\n\n /** Schedules table selection repair after the current update finishes. */\n private scheduleSelectionRepair(view: EditorView): void {\n if (this.pendingSelectionRepairView === view) {\n return;\n }\n\n this.pendingSelectionRepairView = view;\n queueMicrotask(() => {\n if (this.pendingSelectionRepairView !== view) {\n return;\n }\n\n this.pendingSelectionRepairView = null;\n this.ensureTableSelection(view);\n });\n }\n\n /** Rewrites a table block and restores the caret to a target cell position. */\n private replaceTable(\n view: EditorView,\n tableInfo: TableInfo,\n parsed: ParsedTable,\n targetRowIndex: number,\n targetColumnIndex: number,\n offset = 0\n ): void {\n const formatted = formatTableMarkdown(parsed);\n const change = createTableInsert(view.state, tableInfo.from, tableInfo.to, formatted);\n const selection =\n change.from +\n change.prefixLength +\n getCellAnchorInFormattedTable(\n formatted,\n Math.max(0, targetRowIndex),\n Math.max(0, Math.min(targetColumnIndex, Math.max(parsed.headers.length - 1, 0))),\n Math.max(0, offset)\n );\n\n view.dispatch({\n changes: { from: change.from, to: change.to, insert: change.insert },\n selection: { anchor: selection },\n });\n }\n\n /** Runs a row or column control action by rewriting the active markdown table. */\n private runTableControlAction(view: EditorView, control: ActiveTableControl, action: TableControlAction): void {\n const tableInfo = getTableInfoAtPosition(view.state, control.tableFrom);\n if (!tableInfo) {\n return;\n }\n\n if (action === \"delete-table\") {\n view.dispatch({\n changes: { from: tableInfo.from, to: tableInfo.to, insert: \"\" },\n selection: { anchor: tableInfo.from },\n scrollIntoView: true,\n });\n return;\n }\n\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n const rowIndex = control.rowIndex ?? 1;\n const columnIndex = (control.columnIndex ?? 0) + 1;\n\n const next =\n action === \"insert-row-above\"\n ? insertTableRow(parsed, rowIndex, \"above\")\n : action === \"insert-row-below\"\n ? insertTableRow(parsed, rowIndex, \"below\")\n : action === \"move-row-up\"\n ? moveTableRow(parsed, rowIndex, \"up\")\n : action === \"move-row-down\"\n ? moveTableRow(parsed, rowIndex, \"down\")\n : action === \"copy-row\"\n ? copyTableRow(parsed, rowIndex)\n : action === \"delete-row\"\n ? deleteTableRow(parsed, rowIndex)\n : action === \"insert-column-left\"\n ? insertTableColumn(parsed, columnIndex, \"left\")\n : action === \"insert-column-right\"\n ? insertTableColumn(parsed, columnIndex, \"right\")\n : action === \"move-column-left\"\n ? moveTableColumn(parsed, columnIndex, \"left\")\n : action === \"move-column-right\"\n ? moveTableColumn(parsed, columnIndex, \"right\")\n : action === \"copy-column\"\n ? copyTableColumn(parsed, columnIndex)\n : action === \"delete-column\"\n ? deleteTableColumn(parsed, columnIndex)\n : parsed;\n\n const targetRow =\n action === \"insert-row-above\"\n ? rowIndex\n : action === \"insert-row-below\" || action === \"copy-row\"\n ? rowIndex + 1\n : rowIndex;\n const targetColumn =\n action === \"insert-column-left\"\n ? Math.max(0, columnIndex - 1)\n : action === \"insert-column-right\" || action === \"copy-column\"\n ? columnIndex\n : Math.max(0, Math.min(columnIndex - 1, next.headers.length - 1));\n\n this.replaceTable(view, tableInfo, next, Math.max(0, Math.min(targetRow, next.rows.length)), targetColumn);\n }\n\n /** Inserts an empty body row below the given logical row index. */\n private insertRowBelow(view: EditorView, tableInfo: TableInfo, afterRowIndex: number, targetColumn: number): void {\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n const insertBodyIndex = Math.max(0, Math.min(afterRowIndex, parsed.rows.length));\n parsed.rows.splice(insertBodyIndex, 0, buildEmptyRow(tableInfo.columnCount));\n this.replaceTable(view, tableInfo, parsed, insertBodyIndex + 1, targetColumn);\n }\n\n /** Inserts a starter table near the current cursor line. */\n private insertTable(view: EditorView): boolean {\n const { state } = view;\n const cursor = state.selection.main.head;\n const line = state.doc.lineAt(cursor);\n const insertAt = line.text.trim() ? line.to : line.from;\n const formatted = formatTableMarkdown(TABLE_TEMPLATE);\n const change = createTableInsert(state, insertAt, insertAt, formatted);\n const selection = change.from + change.prefixLength + getCellAnchorInFormattedTable(formatted, 0, 0);\n\n view.dispatch({\n changes: { from: change.from, to: change.to, insert: change.insert },\n selection: { anchor: selection },\n });\n\n return true;\n }\n\n /** Adds a new empty body row to the active table. */\n private addRow(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n this.appendRow(view, tableInfo, cell?.columnIndex || 0);\n return true;\n }\n\n /** Appends a row and keeps the caret in the requested column. */\n private appendRow(view: EditorView, tableInfo: TableInfo, targetColumn: number): void {\n this.insertRowBelow(view, tableInfo, tableInfo.bodyCells.length, targetColumn);\n }\n\n /** Inserts a new column after the current column. */\n private addColumn(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n const insertAfter = cell?.columnIndex ?? tableInfo.columnCount - 1;\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n\n parsed.headers.splice(insertAfter + 1, 0, \"\");\n parsed.alignments.splice(insertAfter + 1, 0, \"left\");\n for (const row of parsed.rows) {\n row.splice(insertAfter + 1, 0, \"\");\n }\n\n this.replaceTable(view, tableInfo, parsed, cell?.rowIndex || 0, insertAfter + 1);\n\n return true;\n }\n\n /** Appends a new column at the far right of the table. */\n private appendColumn(view: EditorView, tableInfo: TableInfo): void {\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n parsed.headers.push(\"\");\n parsed.alignments.push(\"left\");\n for (const row of parsed.rows) {\n row.push(\"\");\n }\n\n this.replaceTable(view, tableInfo, parsed, 0, parsed.headers.length - 1);\n }\n\n /** Removes the current body row or clears the last remaining row. */\n private removeRow(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n if (!cell || cell.rowKind !== \"body\") {\n return false;\n }\n\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n const bodyIndex = cell.rowIndex - 1;\n if (bodyIndex < 0 || bodyIndex >= parsed.rows.length) {\n return false;\n }\n\n if (parsed.rows.length === 1) {\n parsed.rows[0] = buildEmptyRow(tableInfo.columnCount);\n } else {\n parsed.rows.splice(bodyIndex, 1);\n }\n\n const nextRowIndex = Math.max(1, Math.min(cell.rowIndex, parsed.rows.length));\n this.replaceTable(view, tableInfo, parsed, nextRowIndex, Math.min(cell.columnIndex, tableInfo.columnCount - 1));\n\n return true;\n }\n\n /** Removes the current column when the table has more than one column. */\n private removeColumn(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo || tableInfo.columnCount <= 1) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n const removeAt = cell?.columnIndex ?? tableInfo.columnCount - 1;\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n\n parsed.headers.splice(removeAt, 1);\n parsed.alignments.splice(removeAt, 1);\n for (const row of parsed.rows) {\n row.splice(removeAt, 1);\n }\n\n this.replaceTable(view, tableInfo, parsed, cell?.rowIndex || 0, Math.min(removeAt, parsed.headers.length - 1));\n\n return true;\n }\n\n /** Moves to the next or previous logical cell with Tab navigation. */\n private handleTab(view: EditorView, backwards: boolean): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n if (!cell) {\n return false;\n }\n\n const cells = tableInfo.cellsByRow.flat();\n const currentIndex = cells.findIndex((candidate) => candidate.from === cell.from && candidate.to === cell.to);\n if (currentIndex < 0) {\n return false;\n }\n\n const nextIndex = backwards ? currentIndex - 1 : currentIndex + 1;\n if (nextIndex < 0) {\n return true;\n }\n if (nextIndex >= cells.length) {\n this.appendRow(view, tableInfo, 0);\n return true;\n }\n\n this.moveSelectionToCell(view, cells[nextIndex]!);\n return true;\n }\n\n /** Moves horizontally between adjacent cells when the caret hits an edge. */\n private handleArrowHorizontal(view: EditorView, forward: boolean): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n if (!cell) {\n return false;\n }\n\n const cursor = view.state.selection.main.head;\n const rightEdge = Math.max(cell.contentFrom, cell.contentTo);\n if (forward && cursor < rightEdge) {\n return false;\n }\n if (!forward && cursor > cell.contentFrom) {\n return false;\n }\n\n const row = tableInfo.cellsByRow[cell.rowIndex] || [];\n const nextCell = row[cell.columnIndex + (forward ? 1 : -1)];\n if (!nextCell) {\n return false;\n }\n\n this.moveSelectionToCell(view, nextCell);\n return true;\n }\n\n /** Moves vertically between rows while keeping the current column. */\n private handleArrowVertical(view: EditorView, forward: boolean): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n if (!cell) {\n return false;\n }\n\n const nextRow = tableInfo.cellsByRow[cell.rowIndex + (forward ? 1 : -1)];\n if (!nextRow) {\n return false;\n }\n\n const nextCell = nextRow[cell.columnIndex];\n if (!nextCell) {\n return false;\n }\n\n this.moveSelectionToCell(view, nextCell);\n return true;\n }\n\n /** Advances downward on Enter and manages the trailing empty row behavior. */\n private handleEnter(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const cell = this.getCurrentCell(view, tableInfo);\n if (!cell) {\n return false;\n }\n\n if (cell.rowKind === \"body\") {\n const currentRow = tableInfo.bodyCells[cell.rowIndex - 1];\n if (currentRow && isBodyRowEmpty(currentRow)) {\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n parsed.rows.splice(cell.rowIndex - 1, 1);\n const formatted = formatTableMarkdown(parsed);\n const change = createTableInsert(view.state, tableInfo.from, tableInfo.to, formatted);\n const anchor = Math.min(change.from + change.insert.length, view.state.doc.length + change.insert.length);\n\n view.dispatch({\n changes: { from: change.from, to: change.to, insert: change.insert },\n selection: { anchor },\n });\n return true;\n }\n }\n\n if (cell.rowKind === \"body\" && cell.rowIndex === tableInfo.cellsByRow.length - 1) {\n const parsed = normalizeParsedTable(buildTableFromInfo(tableInfo));\n parsed.rows.push(buildEmptyRow(tableInfo.columnCount));\n this.replaceTable(view, tableInfo, parsed, parsed.rows.length, cell.columnIndex);\n return true;\n }\n\n this.insertRowBelow(view, tableInfo, cell.rowIndex, cell.columnIndex);\n return true;\n }\n\n /** Inserts a canonical `<br />` token inside the current table cell. */\n private insertBreakTag(view: EditorView): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const selection = view.state.selection.main;\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: BREAK_TAG },\n selection: { anchor: selection.from + BREAK_TAG.length },\n });\n return true;\n }\n\n /** Deletes a whole `<br />` token when backspace or delete hits it. */\n private handleBreakDeletion(view: EditorView, forward: boolean): boolean {\n const tableInfo = this.getTableAtCursor(view);\n if (!tableInfo) {\n return false;\n }\n\n const selection = view.state.selection.main;\n const cursor = selection.head;\n\n for (const range of collectBreakRanges(tableInfo)) {\n const within = cursor > range.from && cursor < range.to;\n const matchesBackspace = !forward && cursor === range.to;\n const matchesDelete = forward && cursor === range.from;\n const overlapsSelection = !selection.empty && selection.from <= range.from && selection.to >= range.to;\n\n if (within || matchesBackspace || matchesDelete || overlapsSelection) {\n view.dispatch({\n changes: { from: range.from, to: range.to, insert: \"\" },\n selection: { anchor: range.from },\n });\n return true;\n }\n }\n\n return false;\n }\n\n /** Moves the current selection anchor into a target cell. */\n private moveSelectionToCell(view: EditorView, cell: TableCellInfo, offset = 0): void {\n const end = Math.max(cell.contentFrom, cell.contentTo);\n view.dispatch({\n selection: { anchor: Math.min(cell.contentFrom + offset, end) },\n scrollIntoView: true,\n });\n }\n\n /** Returns the table currently containing the editor cursor. */\n private getTableAtCursor(view: EditorView): TableInfo | null {\n return getTableInfoAtPosition(view.state, view.state.selection.main.head);\n }\n\n /** Returns the active cell under the current selection head. */\n private getCurrentCell(view: EditorView, tableInfo: TableInfo): TableCellInfo | null {\n return findCellAtPosition(tableInfo, view.state.selection.main.head);\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-mardora-table-wrapper, .cm-mardora-table-widget\": {\n display: \"table\",\n width: \"100%\",\n borderCollapse: \"separate\",\n borderSpacing: \"0\",\n position: \"relative\",\n overflow: \"visible\",\n border: \"1px solid var(--color-border, #d7dee7)\",\n borderRadius: \"0.75rem\",\n backgroundColor: \"var(--color-background, #ffffff)\",\n\n \"& .cm-mardora-table\": {\n width: \"100%\",\n borderCollapse: \"separate\",\n borderSpacing: \"0\",\n tableLayout: \"auto\",\n },\n\n \"& .cm-mardora-table-row\": {\n display: \"table-row !important\",\n },\n\n \"& .cm-mardora-table-delimiter-row\": {\n display: \"none !important\",\n },\n\n \"& .cm-mardora-table-cell\": {\n display: \"table-cell\",\n minWidth: \"4rem\",\n minHeight: \"2.5rem\",\n height: \"2.75rem\",\n padding: \"0.5rem 0.875rem\",\n verticalAlign: \"top\",\n borderRight: \"1px solid var(--color-border, #d7dee7)\",\n borderBottom: \"1px solid var(--color-border, #d7dee7)\",\n whiteSpace: \"normal\",\n overflowWrap: \"break-word\",\n wordBreak: \"normal\",\n lineHeight: \"1.6\",\n },\n\n \"& .cm-mardora-table-body-row\": {\n minHeight: \"2.75rem\",\n },\n\n \"& .cm-mardora-table-cell .cm-mardora-code-inline\": {\n whiteSpace: \"normal\",\n overflowWrap: \"anywhere\",\n },\n\n \"& .cm-mardora-table-th\": {\n fontWeight: \"600\",\n },\n\n \"& .cm-mardora-table-cell-last\": {\n borderRight: \"none\",\n },\n\n \"& .cm-mardora-table-row-last .cm-mardora-table-cell\": {\n borderBottom: \"none\",\n },\n\n \"& .cm-mardora-table-cell-center\": {\n textAlign: \"center\",\n },\n\n \"& .cm-mardora-table-cell-right\": {\n textAlign: \"right\",\n },\n\n \"& .cm-mardora-table-break\": {\n display: \"inline\",\n },\n\n \"& .cm-mardora-table-caret\": {\n display: \"inline-block\",\n width: \"1px\",\n height: \"1.2em\",\n margin: \"0 -0.5px\",\n verticalAlign: \"-0.15em\",\n backgroundColor: \"var(--color-foreground, #111827)\",\n pointerEvents: \"none\",\n },\n\n \"& .cm-mardora-table-controls-anchor\": {\n position: \"absolute\",\n inset: \"0\",\n pointerEvents: \"none\",\n },\n\n \"& .cm-mardora-table-control\": {\n position: \"absolute\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n border: \"1px solid var(--color-border, #d7dee7)\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"var(--color-background, #ffffff)\",\n color: \"var(--color-muted-foreground, #64748b)\",\n boxShadow: \"0 8px 18px rgba(15, 23, 42, 0.08)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.875rem\",\n lineHeight: \"1\",\n opacity: \"0\",\n pointerEvents: \"auto\",\n transition: \"opacity 120ms ease, transform 120ms ease, background-color 120ms ease, border-color 120ms ease, color 120ms ease\",\n },\n\n \"& .cm-mardora-table-control:hover, & .cm-mardora-table-control:focus-visible\": {\n borderColor: \"rgba(37, 99, 235, 0.55)\",\n backgroundColor: \"rgba(37, 99, 235, 0.08)\",\n color: \"rgba(37, 99, 235, 0.95)\",\n outline: \"none\",\n },\n\n \"& .cm-mardora-table-control-column\": {\n top: \"50%\",\n right: \"-0.625rem\",\n transform: \"translate(0.25rem, -50%)\",\n },\n\n \"& .cm-mardora-table-control-row\": {\n left: \"50%\",\n bottom: \"-0.625rem\",\n transform: \"translate(-50%, 0.25rem)\",\n },\n\n \"&:hover .cm-mardora-table-control, &:focus-within .cm-mardora-table-control\": {\n opacity: \"1\",\n },\n\n \"&:hover .cm-mardora-table-control-column, &:focus-within .cm-mardora-table-control-column\": {\n transform: \"translate(0, -50%)\",\n },\n\n \"&:hover .cm-mardora-table-control-row, &:focus-within .cm-mardora-table-control-row\": {\n transform: \"translate(-50%, 0)\",\n },\n },\n },\n\n dark: {\n \".cm-mardora-table-wrapper, .cm-mardora-table-widget\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #0d1117)\",\n\n \"& .cm-mardora-table-cell\": {\n borderColor: \"var(--color-border, #30363d)\",\n },\n\n \"& .cm-mardora-table-control\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #161b22)\",\n color: \"var(--color-muted-foreground, #94a3b8)\",\n boxShadow: \"0 10px 24px rgba(0, 0, 0, 0.28)\",\n },\n\n \"& .cm-mardora-table-control:hover, & .cm-mardora-table-control:focus-visible\": {\n borderColor: \"rgba(96, 165, 250, 0.68)\",\n backgroundColor: \"rgba(96, 165, 250, 0.14)\",\n color: \"rgba(147, 197, 253, 0.98)\",\n },\n },\n },\n});\n","import { Decoration, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport DOMPurify from \"dompurify\";\nimport { createTheme } from \"../editor\";\n\n/**\n * Mark decorations for HTML content\n */\nconst htmlMarkDecorations = {\n \"html-tag\": Decoration.mark({ class: \"cm-mardora-html-tag\" }),\n \"html-comment\": Decoration.mark({ class: \"cm-mardora-html-comment\" }),\n};\n\n/**\n * Line decorations for HTML blocks (when visible)\n */\nconst htmlLineDecorations = {\n \"html-block\": Decoration.line({ class: \"cm-mardora-line-html-block\" }),\n \"hidden-line\": Decoration.line({ class: \"cm-mardora-hidden-line\" }),\n};\n\n/**\n * Widget to render sanitized HTML (block)\n */\nclass HTMLPreviewWidget extends WidgetType {\n constructor(readonly html: string) {\n super();\n }\n\n override eq(other: HTMLPreviewWidget): boolean {\n return other.html === this.html;\n }\n\n toDOM() {\n const div = document.createElement(\"div\");\n div.className = \"cm-mardora-html-preview\";\n div.innerHTML = DOMPurify.sanitize(this.html);\n return div;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\n/**\n * Widget to render sanitized inline HTML\n */\nclass InlineHTMLPreviewWidget extends WidgetType {\n constructor(readonly html: string) {\n super();\n }\n\n override eq(other: InlineHTMLPreviewWidget): boolean {\n return other.html === this.html;\n }\n\n toDOM() {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-inline-html-preview\";\n span.innerHTML = DOMPurify.sanitize(this.html);\n return span;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\ninterface HTMLGroup {\n from: number;\n to: number;\n}\n\ninterface HTMLTagInfo {\n from: number;\n to: number;\n tagName: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n}\n\ninterface InlineHTMLElement {\n from: number;\n to: number;\n content: string;\n}\n\n/**\n * Parse an HTML tag to extract its name and type\n */\nfunction parseHTMLTag(content: string): { tagName: string; isClosing: boolean; isSelfClosing: boolean } | null {\n const match = content.match(/^<\\s*(\\/?)([a-zA-Z][a-zA-Z0-9-]*)[^>]*(\\/?)>$/);\n if (!match) return null;\n\n return {\n tagName: match[2]!.toLowerCase(),\n isClosing: match[1] === \"/\",\n isSelfClosing:\n match[3] === \"/\" ||\n [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\", \"area\", \"base\", \"col\", \"embed\", \"source\", \"track\", \"wbr\"].includes(\n match[2]!.toLowerCase()\n ),\n };\n}\n\n/**\n * HTMLPlugin - Decorates and Renders HTML in markdown\n */\nexport class HTMLPlugin extends DecorationPlugin {\n readonly name = \"html\";\n readonly version = \"1.0.0\";\n override decorationPriority = 30;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n // Collect blocks and inline tags\n const htmlGroups: HTMLGroup[] = [];\n const htmlTags: HTMLTagInfo[] = [];\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Handle HTML Comments\n if (name === \"Comment\") {\n decorations.push(htmlMarkDecorations[\"html-comment\"].range(from, to));\n return;\n }\n\n // Collect inline HTML tags for pairing\n if (name === \"HTMLTag\") {\n const content = view.state.sliceDoc(from, to);\n const parsed = parseHTMLTag(content);\n if (parsed) {\n htmlTags.push({\n from,\n to,\n tagName: parsed.tagName,\n isClosing: parsed.isClosing,\n isSelfClosing: parsed.isSelfClosing,\n });\n }\n }\n\n // Handle HTML Blocks - Collect for grouping\n if (name === \"HTMLBlock\") {\n const last = htmlGroups[htmlGroups.length - 1];\n if (last) {\n const gap = view.state.sliceDoc(last.to, from);\n if (!gap.trim()) {\n last.to = to;\n return;\n }\n }\n htmlGroups.push({ from, to });\n }\n },\n });\n\n // Find complete inline HTML elements (must be on same line)\n const inlineElements: InlineHTMLElement[] = [];\n const usedTags = new Set<number>(); // Track used tag indices\n\n for (let i = 0; i < htmlTags.length; i++) {\n if (usedTags.has(i)) continue;\n\n const openTag = htmlTags[i]!;\n if (openTag.isClosing) continue;\n\n // Handle self-closing tags\n if (openTag.isSelfClosing) {\n inlineElements.push({\n from: openTag.from,\n to: openTag.to,\n content: view.state.sliceDoc(openTag.from, openTag.to),\n });\n usedTags.add(i);\n continue;\n }\n\n // Find matching closing tag (must be on same line)\n const openLine = view.state.doc.lineAt(openTag.from);\n let depth = 1;\n let closeTagIndex: number | null = null;\n\n for (let j = i + 1; j < htmlTags.length && depth > 0; j++) {\n const tag = htmlTags[j]!;\n\n // Stop if we've gone past the open tag's line\n if (tag.from > openLine.to) break;\n\n if (tag.tagName === openTag.tagName) {\n if (tag.isClosing) {\n depth--;\n if (depth === 0) {\n closeTagIndex = j;\n }\n } else if (!tag.isSelfClosing) {\n depth++;\n }\n }\n }\n\n if (closeTagIndex !== null) {\n const closeTag = htmlTags[closeTagIndex]!;\n inlineElements.push({\n from: openTag.from,\n to: closeTag.to,\n content: view.state.sliceDoc(openTag.from, closeTag.to),\n });\n\n // Mark all tags within this range as used (to handle nesting)\n for (let k = i; k <= closeTagIndex; k++) {\n usedTags.add(k);\n }\n }\n }\n\n // Sort by position and filter out overlapping elements (keep outermost)\n inlineElements.sort((a, b) => a.from - b.from);\n const filteredElements: InlineHTMLElement[] = [];\n let lastEnd = -1;\n\n for (const elem of inlineElements) {\n if (elem.from >= lastEnd) {\n filteredElements.push(elem);\n lastEnd = elem.to;\n }\n }\n\n // Apply decorations for inline elements\n for (const elem of filteredElements) {\n const cursorInRange = ctx.cursorInRange(elem.from, elem.to);\n\n if (cursorInRange) {\n // Show source - find and style the tags within this element\n for (const tag of htmlTags) {\n if (tag.from >= elem.from && tag.to <= elem.to) {\n decorations.push(htmlMarkDecorations[\"html-tag\"].range(tag.from, tag.to));\n }\n }\n } else {\n // Render preview\n decorations.push(\n Decoration.replace({\n widget: new InlineHTMLPreviewWidget(elem.content),\n }).range(elem.from, elem.to)\n );\n }\n }\n\n // Style any remaining unprocessed tags (orphan tags)\n for (let i = 0; i < htmlTags.length; i++) {\n if (!usedTags.has(i)) {\n const tag = htmlTags[i]!;\n decorations.push(htmlMarkDecorations[\"html-tag\"].range(tag.from, tag.to));\n }\n }\n\n // Process gathered HTML block groups\n for (const group of htmlGroups) {\n const { from, to } = group;\n\n const nodeLineStart = view.state.doc.lineAt(from);\n const nodeLineEnd = view.state.doc.lineAt(to);\n const cursorInRange = ctx.cursorInRange(nodeLineStart.from, nodeLineEnd.to);\n\n if (cursorInRange) {\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(htmlLineDecorations[\"html-block\"].range(line.from));\n }\n } else {\n const htmlContent = view.state.sliceDoc(from, to);\n\n decorations.push(\n Decoration.replace({\n widget: new HTMLPreviewWidget(htmlContent.trim()),\n }).range(from, nodeLineStart.to)\n );\n\n for (let i = nodeLineStart.number + 1; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(htmlLineDecorations[\"hidden-line\"].range(line.from));\n }\n }\n }\n }\n}\n\n/**\n * Theme for HTML styling\n */\nconst theme = createTheme({\n default: {\n \".cm-mardora-html-tag\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85em\",\n },\n\n \".cm-mardora-html-comment\": {\n color: \"#6a737d\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85em\",\n opacity: 0.5,\n },\n\n \".cm-mardora-line-html-block\": {\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\n },\n\n \".cm-mardora-hidden-line\": {\n display: \"none\",\n },\n\n \".cm-mardora-html-preview\": {\n display: \"inline-block\",\n width: \"100%\",\n verticalAlign: \"top\",\n margin: \"0\",\n whiteSpace: \"normal\",\n lineHeight: \"1.4\",\n },\n \".cm-mardora-html-preview > *:first-child\": {\n marginTop: \"0\",\n },\n \".cm-mardora-html-preview > *:last-child\": {\n marginBottom: \"0\",\n },\n\n \".cm-mardora-inline-html-preview\": {\n display: \"inline\",\n whiteSpace: \"normal\",\n },\n },\n});\n","import { createMardoraIcon } from \"./icons\";\n\nexport type MediaLightboxContent =\n | {\n readonly kind: \"image\";\n readonly src: string;\n readonly alt: string;\n readonly title?: string;\n }\n | {\n readonly kind: \"html\";\n readonly html: string;\n readonly title?: string;\n };\n\nexport interface OpenMediaLightboxOptions {\n readonly content: MediaLightboxContent;\n readonly returnFocus?: HTMLElement | null;\n}\n\nexport interface MediaLightboxHandle {\n readonly element: HTMLElement;\n close(): void;\n}\n\nexport interface MediaPreviewButtonOptions {\n readonly label: string;\n readonly content: () => MediaLightboxContent | null;\n}\n\nexport function consumeMediaLightboxTrigger(event: Pick<Event, \"preventDefault\" | \"stopPropagation\">): void {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport function createMediaPreviewButton(\n ownerDocument: Document,\n options: MediaPreviewButtonOptions\n): HTMLButtonElement {\n const button = ownerDocument.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cm-mardora-media-preview-button\";\n button.setAttribute(\"aria-label\", options.label);\n button.title = options.label;\n const icon = createMardoraIcon(\"maximize-2\");\n if (icon) button.appendChild(icon);\n button.addEventListener(\"click\", (event) => {\n consumeMediaLightboxTrigger(event);\n const content = options.content();\n if (!content) return;\n openMediaLightbox(ownerDocument, { content, returnFocus: button });\n });\n return button;\n}\n\nexport function openMediaLightbox(ownerDocument: Document, options: OpenMediaLightboxOptions): MediaLightboxHandle {\n ownerDocument.querySelector(\".cm-mardora-media-lightbox\")?.remove();\n const mountPoint = options.returnFocus?.closest(\".cm-editor, .mardora-preview\") ?? ownerDocument.body;\n\n const root = ownerDocument.createElement(\"div\");\n root.className = \"cm-mardora-media-lightbox\";\n root.setAttribute(\"role\", \"dialog\");\n root.setAttribute(\"aria-modal\", \"true\");\n if (options.content.title) {\n root.setAttribute(\"aria-label\", options.content.title);\n }\n\n const panel = ownerDocument.createElement(\"div\");\n panel.className = \"cm-mardora-media-lightbox-panel\";\n panel.addEventListener(\"click\", (event) => event.stopPropagation());\n\n const closeButton = ownerDocument.createElement(\"button\");\n closeButton.type = \"button\";\n closeButton.className = \"cm-mardora-media-lightbox-close\";\n closeButton.setAttribute(\"aria-label\", \"关闭大图查看\");\n closeButton.title = \"关闭大图查看\";\n const closeIcon = createMardoraIcon(\"x\");\n if (closeIcon) closeButton.appendChild(closeIcon);\n\n const body = ownerDocument.createElement(\"div\");\n body.className = \"cm-mardora-media-lightbox-body\";\n body.appendChild(createLightboxContent(ownerDocument, options.content));\n\n panel.appendChild(closeButton);\n panel.appendChild(body);\n root.appendChild(panel);\n\n const close = (): void => {\n root.remove();\n ownerDocument.removeEventListener(\"keydown\", handleKeydown);\n options.returnFocus?.focus();\n };\n const handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n }\n };\n\n root.addEventListener(\"click\", close);\n closeButton.addEventListener(\"click\", (event) => {\n consumeMediaLightboxTrigger(event);\n close();\n });\n ownerDocument.addEventListener(\"keydown\", handleKeydown);\n mountPoint.appendChild(root);\n closeButton.focus();\n\n return { element: root, close };\n}\n\nfunction createLightboxContent(ownerDocument: Document, content: MediaLightboxContent): HTMLElement {\n if (content.kind === \"image\") {\n const image = ownerDocument.createElement(\"img\");\n image.className = \"cm-mardora-media-lightbox-image\";\n image.src = content.src;\n image.alt = content.alt;\n if (content.title) image.title = content.title;\n return image;\n }\n\n const container = ownerDocument.createElement(\"div\");\n container.className = \"cm-mardora-media-lightbox-html\";\n container.innerHTML = content.html;\n return container;\n}\n","import { createTheme } from \"./utils\";\n\nexport const mediaLightboxTheme = createTheme({\n default: {\n \".cm-mardora-media-preview\": {\n position: \"relative\",\n },\n \".cm-mardora-media-preview-button\": {\n position: \"absolute\",\n top: \"0.5rem\",\n right: \"0.5rem\",\n width: \"1.75rem\",\n height: \"1.75rem\",\n border: \"1px solid rgba(148, 163, 184, 0.45)\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"rgba(255, 255, 255, 0.86)\",\n color: \"#334155\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0\",\n opacity: \"0\",\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n transition: \"opacity 120ms ease, background-color 120ms ease, border-color 120ms ease\",\n zIndex: \"2\",\n },\n \".cm-mardora-media-preview:hover .cm-mardora-media-preview-button, .cm-mardora-media-preview-button:focus-visible\": {\n opacity: \"1\",\n },\n \".cm-mardora-media-preview-button:hover, .cm-mardora-media-preview-button:focus-visible\": {\n borderColor: \"rgba(37, 99, 235, 0.55)\",\n backgroundColor: \"rgba(255, 255, 255, 0.96)\",\n color: \"#2563eb\",\n outline: \"none\",\n },\n \".cm-mardora-media-preview-button svg\": {\n width: \"1rem\",\n height: \"1rem\",\n },\n \".cm-mardora-media-lightbox\": {\n position: \"fixed\",\n inset: \"0\",\n zIndex: \"10000\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n backgroundColor: \"rgba(15, 23, 42, 0.24)\",\n },\n \".cm-mardora-media-lightbox-panel\": {\n position: \"relative\",\n width: \"min(96vw, 1200px)\",\n maxWidth: \"min(96vw, 1200px)\",\n maxHeight: \"92vh\",\n borderRadius: \"0.75rem\",\n backgroundColor: \"#ffffff\",\n color: \"#0f172a\",\n boxShadow: \"0 24px 70px rgba(15, 23, 42, 0.28)\",\n overflow: \"hidden\",\n },\n \".cm-mardora-media-lightbox-body\": {\n maxWidth: \"100%\",\n maxHeight: \"92vh\",\n overflow: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n },\n \".cm-mardora-media-lightbox-image\": {\n display: \"block\",\n maxWidth: \"100%\",\n maxHeight: \"calc(92vh - 2rem)\",\n width: \"auto\",\n height: \"auto\",\n objectFit: \"contain\",\n },\n \".cm-mardora-media-lightbox-html\": {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"calc(92vh - 2rem)\",\n overflow: \"auto\",\n display: \"flex\",\n justifyContent: \"center\",\n },\n \".cm-mardora-media-lightbox-html svg\": {\n display: \"block\",\n maxWidth: \"100%\",\n maxHeight: \"calc(92vh - 2rem)\",\n width: \"100%\",\n height: \"auto\",\n },\n \".cm-mardora-media-lightbox-close\": {\n position: \"absolute\",\n top: \"0.5rem\",\n right: \"0.5rem\",\n width: \"2rem\",\n height: \"2rem\",\n border: \"1px solid rgba(148, 163, 184, 0.45)\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"rgba(255, 255, 255, 0.92)\",\n color: \"#334155\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0\",\n cursor: \"pointer\",\n },\n \".cm-mardora-media-lightbox-close:hover, .cm-mardora-media-lightbox-close:focus-visible\": {\n borderColor: \"rgba(37, 99, 235, 0.55)\",\n color: \"#2563eb\",\n outline: \"none\",\n },\n \".cm-mardora-media-lightbox-close svg\": {\n width: \"1rem\",\n height: \"1rem\",\n },\n },\n dark: {\n \".cm-mardora-media-preview-button\": {\n borderColor: \"rgba(71, 85, 105, 0.72)\",\n backgroundColor: \"rgba(15, 23, 42, 0.84)\",\n color: \"#cbd5e1\",\n },\n \".cm-mardora-media-preview-button:hover, .cm-mardora-media-preview-button:focus-visible\": {\n borderColor: \"rgba(96, 165, 250, 0.68)\",\n backgroundColor: \"rgba(15, 23, 42, 0.96)\",\n color: \"#93c5fd\",\n },\n \".cm-mardora-media-lightbox-panel\": {\n backgroundColor: \"#0f172a\",\n color: \"#e2e8f0\",\n boxShadow: \"0 24px 70px rgba(0, 0, 0, 0.45)\",\n },\n \".cm-mardora-media-lightbox-close\": {\n borderColor: \"rgba(71, 85, 105, 0.72)\",\n backgroundColor: \"rgba(15, 23, 42, 0.92)\",\n color: \"#cbd5e1\",\n },\n \".cm-mardora-media-lightbox-close:hover, .cm-mardora-media-lightbox-close:focus-visible\": {\n borderColor: \"rgba(96, 165, 250, 0.68)\",\n color: \"#93c5fd\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { consumeMediaLightboxTrigger, openMediaLightbox } from \"../editor/media-lightbox\";\nimport { mediaLightboxTheme } from \"../editor/media-lightbox-theme\";\nimport { createMardoraIcon } from \"../editor/icons\";\nimport type { PreviewContext } from \"../preview/types\";\nimport { SyntaxNode } from \"@lezer/common\";\n\n/**\n * Mark decorations for image syntax elements\n */\nconst imageMarkDecorations = {\n \"image-block\": Decoration.line({ class: \"cm-mardora-image-block\" }),\n \"image-marker\": Decoration.mark({ class: \"cm-mardora-image-marker\" }),\n \"image-alt\": Decoration.mark({ class: \"cm-mardora-image-alt\" }),\n \"image-url\": Decoration.mark({ class: \"cm-mardora-image-url\" }),\n \"image-hidden\": Decoration.mark({ class: \"cm-mardora-image-hidden\" }),\n};\n\nexport interface ParsedImageMarkdown {\n readonly alt: string;\n readonly url: string;\n readonly title?: string;\n readonly width?: number;\n}\n\nexport interface ImageMarkdownChange {\n readonly from: number;\n readonly to: number;\n readonly insert: string;\n}\n\ninterface ImageMarkdownRange {\n readonly from: number;\n readonly imageTo: number;\n readonly to: number;\n readonly markdown: string;\n readonly width?: number;\n readonly widthAttrFrom?: number;\n readonly widthAttrTo?: number;\n}\n\nconst imageWidthAttributePattern = /^(\\s*)\\{width=(\\d+)\\}/;\nconst minImageWidth = 120;\nconst imageWidgetEditorSelectionEventTypes = new Set([\n \"mousedown\",\n \"mouseup\",\n \"mousemove\",\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n]);\nconst previewImageIcon =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M15 3h6v6\"></path><path d=\"m21 3-7 7\"></path><path d=\"M9 21H3v-6\"></path><path d=\"m3 21 7-7\"></path></svg>';\n\n/**\n * Parse image markdown to extract alt text, URL, optional title, and optional pixel width.\n * Format: ![alt text](url \"optional title\"){width=420}\n */\nexport function parseImageMarkdown(content: string): ParsedImageMarkdown | null {\n const trimmed = content.trim();\n const widthMatch = trimmed.match(/\\{width=(\\d+)\\}$/);\n const markdown = widthMatch ? trimmed.slice(0, widthMatch.index).trimEnd() : trimmed;\n\n // Regex to match: ![alt](url) or ![alt](url \"title\")\n const match = markdown.match(/^!\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\n if (!match) return null;\n\n const result: ParsedImageMarkdown = {\n alt: match[1] || \"\",\n url: match[2]!,\n ...(widthMatch ? { width: Number(widthMatch[1]) } : {}),\n };\n\n if (match[3] !== undefined) {\n return { ...result, title: match[3] };\n }\n\n return result;\n}\n\nfunction readImageMarkdownRange(doc: string, from: number, imageTo: number): ImageMarkdownRange {\n const lineEnd = doc.indexOf(\"\\n\", imageTo);\n const scanTo = lineEnd === -1 ? doc.length : lineEnd;\n const afterImage = doc.slice(imageTo, scanTo);\n const widthMatch = afterImage.match(imageWidthAttributePattern);\n if (widthMatch) {\n const widthAttrTo = imageTo + widthMatch[0].length;\n return {\n from,\n imageTo,\n to: widthAttrTo,\n markdown: doc.slice(from, widthAttrTo),\n width: Number(widthMatch[2]),\n widthAttrFrom: imageTo,\n widthAttrTo,\n };\n }\n\n return {\n from,\n imageTo,\n to: imageTo,\n markdown: doc.slice(from, imageTo),\n };\n}\n\nexport function resolveImageWidthChange(input: {\n readonly doc: string;\n readonly from: number;\n readonly to: number;\n readonly width: number;\n}): ImageMarkdownChange {\n const range = readImageMarkdownRange(input.doc, input.from, input.to);\n const width = Math.max(1, Math.round(input.width));\n return {\n from: range.widthAttrFrom ?? input.to,\n to: range.widthAttrTo ?? input.to,\n insert: `{width=${width}}`,\n };\n}\n\nexport function resolveImageResetWidthChange(input: {\n readonly doc: string;\n readonly from: number;\n readonly to: number;\n}): ImageMarkdownChange | null {\n const range = readImageMarkdownRange(input.doc, input.from, input.to);\n if (range.widthAttrFrom === undefined || range.widthAttrTo === undefined) return null;\n return { from: range.widthAttrFrom, to: range.widthAttrTo, insert: \"\" };\n}\n\nexport function resolveImageDeleteChange(input: {\n readonly doc: string;\n readonly from: number;\n readonly to: number;\n}): ImageMarkdownChange {\n const range = readImageMarkdownRange(input.doc, input.from, input.to);\n return { from: input.from, to: range.to, insert: \"\" };\n}\n\nexport function bindImagePreviewButtons(root: HTMLElement | Document): () => void {\n const onClick = (event: Event) => {\n const target =\n event.target && typeof (event.target as Element).closest === \"function\" ? (event.target as Element) : null;\n const previewButton = target?.closest<HTMLButtonElement>(\".cm-mardora-image-preview-button[data-src]\");\n if (!previewButton || !root.contains(previewButton)) return;\n\n consumeMediaLightboxTrigger(event);\n openMediaLightbox(previewButton.ownerDocument, {\n content: {\n kind: \"image\",\n src: previewButton.dataset.src ?? \"\",\n alt: previewButton.dataset.alt ?? \"\",\n ...(previewButton.dataset.title ? { title: previewButton.dataset.title } : {}),\n },\n returnFocus: previewButton,\n });\n };\n\n root.addEventListener(\"click\", onClick);\n return () => root.removeEventListener(\"click\", onClick);\n}\n\n/**\n * Widget to render an image with optional caption using figure/figcaption\n * Placed below the markdown syntax as a widget decoration\n */\nclass ImageWidget extends WidgetType {\n constructor(\n readonly url: string,\n readonly alt: string,\n readonly from: number,\n readonly imageTo: number,\n readonly to: number,\n readonly width?: number,\n readonly title?: string\n ) {\n super();\n }\n\n override eq(other: ImageWidget): boolean {\n return (\n other.url === this.url &&\n other.alt === this.alt &&\n other.from === this.from &&\n other.imageTo === this.imageTo &&\n other.to === this.to &&\n other.width === this.width &&\n other.title === this.title\n );\n }\n\n toDOM(view: EditorView) {\n // Create figure element for semantic image container\n const figure = document.createElement(\"figure\");\n figure.className = \"cm-mardora-image-figure cm-mardora-media-preview\";\n figure.setAttribute(\"role\", \"figure\");\n figure.style.cursor = \"pointer\";\n if (this.width) {\n figure.style.width = `${this.width}px`;\n }\n if (this.title) {\n figure.setAttribute(\"aria-label\", this.title);\n }\n\n const activateFigure = () => figure.classList.add(\"cm-mardora-image-figure-active\");\n const deactivateFigure = () => {\n if (!figure.matches(\":focus-within\")) figure.classList.remove(\"cm-mardora-image-figure-active\");\n };\n figure.addEventListener(\"pointerenter\", activateFigure);\n figure.addEventListener(\"mouseenter\", activateFigure);\n figure.addEventListener(\"focusin\", activateFigure);\n figure.addEventListener(\"pointerleave\", deactivateFigure);\n figure.addEventListener(\"mouseleave\", deactivateFigure);\n figure.addEventListener(\"focusout\", deactivateFigure);\n\n // Click handler to select the raw markdown text\n figure.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n });\n\n // Create image element with accessibility attributes\n const img = document.createElement(\"img\");\n img.className = \"cm-mardora-image\";\n img.src = this.url;\n img.alt = this.alt;\n img.setAttribute(\"loading\", \"lazy\");\n img.setAttribute(\"decoding\", \"async\");\n if (this.title) {\n img.title = this.title;\n }\n if (this.width) {\n img.style.width = \"100%\";\n }\n\n // Handle image loading error\n img.onerror = () => {\n img.style.display = \"none\";\n const errorSpan = document.createElement(\"span\");\n errorSpan.className = \"cm-mardora-image-error\";\n errorSpan.setAttribute(\"role\", \"alert\");\n errorSpan.textContent = `[Image not found: ${this.alt || this.url}]`;\n figure.appendChild(errorSpan);\n };\n\n figure.appendChild(img);\n figure.appendChild(this.createToolbar(view, figure));\n figure.appendChild(this.createResizeHandle(view, figure, \"left\"));\n figure.appendChild(this.createResizeHandle(view, figure, \"right\"));\n\n // Add figcaption if title exists\n if (this.title) {\n const figcaption = document.createElement(\"figcaption\");\n figcaption.className = \"cm-mardora-image-caption\";\n figcaption.textContent = this.title;\n figure.appendChild(figcaption);\n }\n\n return figure;\n }\n\n override ignoreEvent(event: Event) {\n if (imageWidgetEditorSelectionEventTypes.has(event.type)) return true;\n return event.type !== \"click\";\n }\n\n private createToolbar(view: EditorView, figure: HTMLElement): HTMLElement {\n const toolbar = figure.ownerDocument.createElement(\"div\");\n toolbar.className = \"cm-mardora-image-toolbar\";\n toolbar.appendChild(\n this.createToolButton(figure.ownerDocument, \"还原默认大小\", \"rotate-ccw\", () => {\n const change = resolveImageResetWidthChange({\n doc: view.state.doc.toString(),\n from: this.from,\n to: this.imageTo,\n });\n if (!change) return;\n view.dispatch({ changes: change });\n view.focus();\n })\n );\n toolbar.appendChild(\n this.createToolButton(figure.ownerDocument, \"放大查看图片\", \"maximize-2\", () => {\n openMediaLightbox(figure.ownerDocument, {\n content: {\n kind: \"image\",\n src: this.url,\n alt: this.alt,\n ...(this.title === undefined ? {} : { title: this.title }),\n },\n returnFocus: toolbar.querySelector(\".cm-mardora-image-preview-button\") as HTMLElement | null,\n });\n }, \"cm-mardora-image-preview-button\")\n );\n toolbar.appendChild(\n this.createToolButton(figure.ownerDocument, \"删除图片\", \"trash-2\", () => {\n view.dispatch({\n changes: resolveImageDeleteChange({\n doc: view.state.doc.toString(),\n from: this.from,\n to: this.imageTo,\n }),\n });\n view.focus();\n })\n );\n return toolbar;\n }\n\n private createToolButton(\n ownerDocument: Document,\n label: string,\n iconName: string,\n onActivate: () => void,\n extraClass = \"\"\n ): HTMLButtonElement {\n const button = ownerDocument.createElement(\"button\");\n button.type = \"button\";\n button.className = `cm-mardora-image-tool-button${extraClass ? ` ${extraClass}` : \"\"}`;\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n const icon = createMardoraIcon(iconName);\n if (icon) button.appendChild(icon);\n button.addEventListener(\"click\", (event) => {\n consumeMediaLightboxTrigger(event);\n onActivate();\n });\n return button;\n }\n\n private createResizeHandle(view: EditorView, figure: HTMLElement, side: \"left\" | \"right\"): HTMLElement {\n const handle = figure.ownerDocument.createElement(\"span\");\n handle.className = `cm-mardora-image-resize-handle cm-mardora-image-resize-handle-${side}`;\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-label\", side === \"left\" ? \"向左拖拽调整图片宽度\" : \"向右拖拽调整图片宽度\");\n if (figure.ownerDocument.defaultView?.PointerEvent) {\n handle.addEventListener(\"pointerdown\", (event) => this.startResize(event, view, figure, side));\n } else {\n handle.addEventListener(\"mousedown\", (event) => this.startResize(event, view, figure, side));\n }\n return handle;\n }\n\n private startResize(event: PointerEvent | MouseEvent, view: EditorView, figure: HTMLElement, side: \"left\" | \"right\") {\n consumeMediaLightboxTrigger(event);\n const ownerDocument = figure.ownerDocument;\n const startX = event.clientX;\n const startWidth = Math.max(minImageWidth, figure.getBoundingClientRect().width || this.width || minImageWidth);\n const maxWidth = resolveImageMaxWidth(view, figure);\n const direction = side === \"right\" ? 1 : -1;\n const image = figure.querySelector(\"img\");\n if (image) image.style.width = \"100%\";\n let nextWidth = startWidth;\n\n const moveEvent = event.type.startsWith(\"pointer\") ? \"pointermove\" : \"mousemove\";\n const upEvent = event.type.startsWith(\"pointer\") ? \"pointerup\" : \"mouseup\";\n const onMove = (move: Event) => {\n const pointer = move as PointerEvent | MouseEvent;\n consumeMediaLightboxTrigger(pointer);\n nextWidth = clampImageWidth(startWidth + (pointer.clientX - startX) * direction, maxWidth);\n figure.style.width = `${nextWidth}px`;\n };\n const onUp = (up: Event) => {\n consumeMediaLightboxTrigger(up);\n ownerDocument.removeEventListener(moveEvent, onMove);\n ownerDocument.removeEventListener(upEvent, onUp);\n view.dispatch({\n changes: resolveImageWidthChange({\n doc: view.state.doc.toString(),\n from: this.from,\n to: this.imageTo,\n width: nextWidth,\n }),\n });\n view.focus();\n };\n\n ownerDocument.addEventListener(moveEvent, onMove);\n ownerDocument.addEventListener(upEvent, onUp);\n }\n}\n\nfunction clampImageWidth(width: number, maxWidth: number): number {\n return Math.max(minImageWidth, Math.min(Math.round(width), maxWidth));\n}\n\nfunction resolveImageMaxWidth(view: EditorView, figure: HTMLElement): number {\n const content = figure.closest(\".cm-line\") ?? figure.closest(\".cm-content\") ?? view.contentDOM ?? view.dom;\n const width = content.getBoundingClientRect().width;\n return Math.max(minImageWidth, Math.round(width || figure.getBoundingClientRect().width || 800));\n}\n\nfunction renderPreviewImageButton(parsed: ParsedImageMarkdown, ctx: PreviewContext): string {\n const titleDataAttr = parsed.title ? ` data-title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\n return `<div class=\"cm-mardora-image-toolbar\">\n <button type=\"button\" class=\"cm-mardora-image-tool-button cm-mardora-image-preview-button\" aria-label=\"放大查看图片\" title=\"放大查看图片\" data-src=\"${ctx.sanitize(parsed.url)}\" data-alt=\"${ctx.sanitize(parsed.alt)}\"${titleDataAttr}>${previewImageIcon}</button>\n </div>`;\n}\n\n/**\n * ImagePlugin - Decorates and renders images in markdown\n *\n * Supports the full image syntax: ![alt text](url \"optional title\")\n * - Shows image widget below the node when cursor is not in range\n * - Hides the markdown syntax when cursor is not in range\n * - Shows raw markdown when cursor is in the image syntax\n * - Uses figure/figcaption for semantic HTML with accessibility attributes\n */\nexport class ImagePlugin extends DecorationPlugin {\n readonly name = \"image\";\n readonly version = \"1.0.0\";\n override decorationPriority = 25;\n override readonly requiredNodes = [\"Image\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for image formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-Shift-i\",\n run: (view) => this.toggleImage(view),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * URL regex pattern\n */\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\n\n /**\n * Toggle image on selection\n * - If text selected and is a URL: ![Alt Text](url) with cursor in brackets\n * - If text selected (not URL): ![text]() with cursor in parentheses\n * - If nothing selected: ![Alt Text]() with cursor in parentheses\n * - If already an image: remove syntax, leave just the URL\n */\n private toggleImage(view: EditorView): boolean {\n const { state } = view;\n const { from, to, empty } = state.selection.main;\n const selectedText = state.sliceDoc(from, to);\n\n // Check if selection is already an image ![alt](url)\n const imageMatch = selectedText.match(/^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\n if (imageMatch) {\n // Already an image - extract just the URL and replace\n const imageUrl = imageMatch[2] || \"\";\n view.dispatch({\n changes: { from, to, insert: imageUrl },\n selection: { anchor: from, head: from + imageUrl.length },\n });\n return true;\n }\n\n // Check if we're inside an image by looking at surrounding context\n const lineStart = state.doc.lineAt(from).from;\n const lineEnd = state.doc.lineAt(to).to;\n const lineText = state.sliceDoc(lineStart, lineEnd);\n\n // Find image pattern in line that contains the selection\n const imageRegex = /!\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\n let match;\n while ((match = imageRegex.exec(lineText)) !== null) {\n const matchFrom = lineStart + match.index;\n const matchTo = matchFrom + match[0].length;\n\n // Check if selection is within this image\n if (from >= matchFrom && to <= matchTo) {\n // Remove the image syntax, leave just the URL\n const imageUrl = match[2] || \"\";\n view.dispatch({\n changes: { from: matchFrom, to: matchTo, insert: imageUrl },\n selection: { anchor: matchFrom, head: matchFrom + imageUrl.length },\n });\n return true;\n }\n }\n\n if (empty) {\n // No selection - insert ![Alt Text]() and place cursor in parentheses\n const defaultAlt = \"Alt Text\";\n const newText = `![${defaultAlt}]()`;\n view.dispatch({\n changes: { from, insert: newText },\n selection: { anchor: from + defaultAlt.length + 4 }, // After ![Alt Text](\n });\n } else if (this.urlPattern.test(selectedText)) {\n // Selected text is a URL - put it in parentheses with default alt text\n const defaultAlt = \"Alt Text\";\n const newText = `![${defaultAlt}](${selectedText})`;\n view.dispatch({\n changes: { from, to, insert: newText },\n selection: { anchor: from + 2, head: from + 2 + defaultAlt.length }, // Select \"Alt Text\"\n });\n } else {\n // Selected text is not a URL - use as alt text, cursor in parentheses\n const newText = `![${selectedText}]()`;\n view.dispatch({\n changes: { from, to, insert: newText },\n selection: { anchor: from + selectedText.length + 4 }, // After ![text](\n });\n }\n\n return true;\n }\n\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Handle Image nodes\n if (name === \"Image\") {\n const imageRange = readImageMarkdownRange(view.state.doc.toString(), from, to);\n const parsed = parseImageMarkdown(imageRange.markdown);\n\n if (!parsed) return;\n\n const cursorInRange = ctx.selectionOverlapsRange(from, imageRange.to);\n\n // Add line decoration for image\n decorations.push(imageMarkDecorations[\"image-block\"].range(from));\n\n // Always add the image widget below the node\n decorations.push(\n Decoration.widget({\n widget: new ImageWidget(parsed.url, parsed.alt, from, to, imageRange.to, parsed.width, parsed.title),\n side: 1, // Place after the position\n block: false, // Don't create a new line\n }).range(imageRange.to)\n );\n\n if (cursorInRange) {\n // Cursor in range: show raw markdown with styling\n this.decorateRawImage(node.node, decorations, view);\n } else {\n // Cursor out of range: hide the raw markdown text\n decorations.push(imageMarkDecorations[\"image-hidden\"].range(from, imageRange.to));\n }\n }\n },\n });\n }\n\n /**\n * Decorate raw image markdown when cursor is in range\n */\n private decorateRawImage(\n node: SyntaxNode,\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\n view: import(\"@codemirror/view\").EditorView\n ): void {\n // Find and style child nodes\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"URL\") {\n decorations.push(imageMarkDecorations[\"image-url\"].range(child.from, child.to));\n }\n }\n\n // Style the markers (! [ ] ( ))\n const content = view.state.sliceDoc(node.from, node.to);\n const bangBracket = node.from; // Position of !\n if (content.startsWith(\"![\")) {\n decorations.push(imageMarkDecorations[\"image-marker\"].range(bangBracket, bangBracket + 2));\n }\n\n // Find and style closing bracket and parentheses\n const altEnd = content.indexOf(\"](\");\n if (altEnd !== -1) {\n const altStart = 2;\n // Style alt text\n if (altEnd > altStart) {\n decorations.push(imageMarkDecorations[\"image-alt\"].range(node.from + altStart, node.from + altEnd));\n }\n // Style ]( markers\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.from + altEnd, node.from + altEnd + 2));\n // Style closing )\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.to - 1, node.to));\n }\n }\n\n /**\n * Render image to HTML for preview mode using figure/figcaption\n */\n override renderToHTML(\n node: SyntaxNode,\n _children: string,\n ctx: PreviewContext\n ): string | null {\n if (node.name !== \"Image\") return null;\n\n const range = readImageMarkdownRange(ctx.doc, node.from, node.to);\n const content = ctx.sliceDoc(node.from, range.to);\n const parsed = parseImageMarkdown(content);\n if (!parsed) return null;\n\n const altAttr = ctx.sanitize(parsed.alt);\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\n const ariaLabel = parsed.title ? ` aria-label=\"${ctx.sanitize(parsed.title)}\"` : \"\";\n const figureWidthStyle = parsed.width ? ` style=\"width: ${parsed.width}px;\"` : \"\";\n const imageWidthStyle = parsed.width ? ` style=\"width: 100%;\"` : \"\";\n\n let html = `<figure class=\"cm-mardora-image-figure\" role=\"figure\"${ariaLabel}${figureWidthStyle}>`;\n html += `<img class=\"cm-mardora-image\" src=\"${ctx.sanitize(parsed.url)}\" alt=\"${altAttr}\"${titleAttr}${imageWidthStyle} loading=\"lazy\" decoding=\"async\" />`;\n html += renderPreviewImageButton(parsed, ctx);\n\n if (parsed.title) {\n html += `<figcaption class=\"cm-mardora-image-caption\">${ctx.sanitize(parsed.title)}</figcaption>`;\n }\n\n html += `</figure>`;\n return html;\n }\n\n override getPreviewConsumedTo(node: SyntaxNode, ctx: { doc: string }): number | null {\n if (node.name !== \"Image\") return null;\n return readImageMarkdownRange(ctx.doc, node.from, node.to).to;\n }\n}\n\n/**\n * Theme for image styling\n */\nconst imageTheme = createTheme({\n default: {\n \".cm-mardora-image-block br\": {\n display: \"none\",\n },\n\n // Image markers (! [ ] ( ))\n \".cm-mardora-image-marker\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Alt text\n \".cm-mardora-image-alt\": {\n color: \"#22863a\",\n fontStyle: \"italic\",\n },\n\n // URL\n \".cm-mardora-image-url\": {\n color: \"#0366d6\",\n textDecoration: \"underline\",\n },\n\n // Hidden markdown syntax (when cursor is not in range)\n \".cm-mardora-image-hidden\": {\n display: \"none\",\n },\n\n // Figure container — fill the content width so the image aligns with\n // surrounding text lines instead of shrinking to its intrinsic size and\n // leaving a gap on the right. Inline width (from {width=} / drag-resize)\n // overrides this via the style attribute.\n \".cm-mardora-image-figure\": {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"start\",\n width: \"100%\",\n maxWidth: \"100%\",\n margin: \"0\",\n padding: \"0\",\n position: \"relative\",\n },\n\n \".cm-mardora-image-toolbar\": {\n position: \"absolute\",\n top: \"0.5rem\",\n right: \"0.5rem\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.125rem\",\n padding: \"0.1875rem\",\n border: \"1px solid rgba(148, 163, 184, 0.4)\",\n borderRadius: \"0.375rem\",\n backgroundColor: \"rgba(255, 255, 255, 0.9)\",\n boxShadow: \"0 8px 24px rgba(15, 23, 42, 0.14)\",\n opacity: \"0\",\n pointerEvents: \"auto\",\n transition: \"opacity 120ms ease, background-color 120ms ease, border-color 120ms ease\",\n zIndex: \"3\",\n },\n\n \".cm-mardora-image-figure:hover .cm-mardora-image-toolbar, .cm-mardora-image-figure-active .cm-mardora-image-toolbar, .cm-mardora-image-toolbar:focus-within\": {\n opacity: \"1\",\n },\n\n \".cm-mardora-image-tool-button\": {\n width: \"1.75rem\",\n height: \"1.75rem\",\n border: \"0\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"transparent\",\n color: \"#334155\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0\",\n cursor: \"pointer\",\n transition: \"background-color 120ms ease, color 120ms ease\",\n },\n\n \".cm-mardora-image-tool-button:hover, .cm-mardora-image-tool-button:focus-visible\": {\n backgroundColor: \"rgba(37, 99, 235, 0.1)\",\n color: \"#2563eb\",\n outline: \"none\",\n },\n\n \".cm-mardora-image-tool-button svg\": {\n width: \"1rem\",\n height: \"1rem\",\n },\n\n \".cm-mardora-image-resize-handle\": {\n position: \"absolute\",\n top: \"50%\",\n width: \"0.375rem\",\n height: \"2.75rem\",\n borderRadius: \"999px\",\n backgroundColor: \"#3b82f6\",\n boxShadow: \"0 0 0 2px rgba(255, 255, 255, 0.9), 0 8px 20px rgba(37, 99, 235, 0.24)\",\n cursor: \"ew-resize\",\n opacity: \"0\",\n transform: \"translateY(-50%)\",\n transition: \"opacity 120ms ease, background-color 120ms ease\",\n zIndex: \"2\",\n },\n\n \".cm-mardora-image-figure:hover .cm-mardora-image-resize-handle, .cm-mardora-image-figure-active .cm-mardora-image-resize-handle, .cm-mardora-image-resize-handle:focus-visible\": {\n opacity: \"1\",\n },\n\n \".cm-mardora-image-resize-handle:hover, .cm-mardora-image-resize-handle:focus-visible\": {\n backgroundColor: \"#2563eb\",\n outline: \"none\",\n },\n\n \".cm-mardora-image-resize-handle-left\": {\n left: \"-0.1875rem\",\n },\n\n \".cm-mardora-image-resize-handle-right\": {\n right: \"-0.1875rem\",\n },\n\n // Image element — fill the figure by default so the image stretches to\n // the content width. When an explicit width is set, img gets an inline\n // width:100% too (figure carries the pixel width), so this stays consistent.\n \".cm-mardora-image\": {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"800px\",\n height: \"auto\",\n borderRadius: \"4px\",\n },\n\n // Figcaption\n \".cm-mardora-image-caption\": {\n display: \"block\",\n width: \"100%\",\n fontSize: \"0.875em\",\n color: \"#6a737d\",\n marginTop: \"0.5em\",\n textAlign: \"center\",\n fontStyle: \"italic\",\n },\n\n // Error state\n \".cm-mardora-image-error\": {\n display: \"inline-block\",\n padding: \"0.5em 1em\",\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\n color: \"#d73a49\",\n borderRadius: \"4px\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n },\n },\n\n dark: {\n \".cm-mardora-image-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-image-alt\": {\n color: \"#7ee787\",\n },\n\n \".cm-mardora-image-url\": {\n color: \"#58a6ff\",\n },\n\n \".cm-mardora-image-caption\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-image-toolbar\": {\n borderColor: \"rgba(71, 85, 105, 0.72)\",\n backgroundColor: \"rgba(15, 23, 42, 0.88)\",\n boxShadow: \"0 8px 24px rgba(0, 0, 0, 0.32)\",\n },\n\n \".cm-mardora-image-tool-button\": {\n color: \"#cbd5e1\",\n },\n\n \".cm-mardora-image-tool-button:hover, .cm-mardora-image-tool-button:focus-visible\": {\n backgroundColor: \"rgba(96, 165, 250, 0.18)\",\n color: \"#93c5fd\",\n },\n\n \".cm-mardora-image-error\": {\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\n color: \"#f85149\",\n },\n },\n});\n\nconst theme = (theme: Parameters<typeof imageTheme>[0]) => ({\n ...imageTheme(theme),\n ...mediaLightboxTheme(theme),\n});\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { Extension } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { tags } from \"@lezer/highlight\";\nimport type { MarkdownConfig, InlineParser, BlockParser, Line, BlockContext } from \"@lezer/markdown\";\nimport katex from \"katex\";\nimport { createWrapSelectionInputHandler } from \"../lib\";\n// @ts-expect-error - raw import for CSS as string\nimport katexCss from \"katex/dist/katex.min.css?raw\";\n\n/**\n * Inject KaTeX CSS into the document head (only once)\n */\nfunction injectKatexStyles(): void {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"mardora-katex-styles\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"mardora-katex-styles\";\n style.textContent = katexCss;\n document.head.appendChild(style);\n}\n\n// Inject styles when module loads\ninjectKatexStyles();\n\n// Character codes\nconst DOLLAR = 36; // '$'\n\n/**\n * Mark decorations for math syntax elements\n */\nconst mathMarkDecorations = {\n \"math-block\": Decoration.line({ class: \"cm-mardora-math-block\" }),\n \"math-inline\": Decoration.mark({ class: \"cm-mardora-math-inline\" }),\n \"math-marker\": Decoration.mark({ class: \"cm-mardora-math-marker\" }),\n \"math-hidden\": Decoration.mark({ class: \"cm-mardora-math-hidden\" }),\n};\n\n/**\n * Render LaTeX to HTML using KaTeX\n */\nfunction renderMath(latex: string, displayMode: boolean): { html: string; error: string | null } {\n try {\n const html = katex.renderToString(latex, {\n displayMode,\n throwOnError: false,\n errorColor: \"#d73a49\",\n trust: false,\n strict: false,\n });\n return { html, error: null };\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : \"Unknown error\";\n return { html: \"\", error: errorMsg };\n }\n}\n\n/**\n * Widget to render inline math\n */\nclass InlineMathWidget extends WidgetType {\n constructor(\n readonly latex: string,\n readonly from: number,\n readonly to: number\n ) {\n super();\n }\n\n override eq(other: InlineMathWidget): boolean {\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\n }\n\n toDOM(view: EditorView) {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-math-rendered cm-mardora-math-rendered-inline\";\n span.style.cursor = \"pointer\";\n\n const { html, error } = renderMath(this.latex, false);\n\n if (error) {\n span.className += \" cm-mardora-math-error\";\n span.textContent = `[Math Error: ${error}]`;\n } else {\n span.innerHTML = html;\n }\n\n // Click handler to select the raw math text\n span.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n });\n\n return span;\n }\n\n override ignoreEvent(event: Event) {\n return event.type !== \"click\";\n }\n}\n\n/**\n * Widget to render block math (display mode)\n */\nclass MathBlockWidget extends WidgetType {\n constructor(\n readonly latex: string,\n readonly from: number,\n readonly to: number\n ) {\n super();\n }\n\n override eq(other: MathBlockWidget): boolean {\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\n }\n\n toDOM(view: EditorView) {\n const div = document.createElement(\"div\");\n div.className = \"cm-mardora-math-rendered cm-mardora-math-rendered-block\";\n div.style.cursor = \"pointer\";\n\n const { html, error } = renderMath(this.latex, true);\n\n if (error) {\n div.className += \" cm-mardora-math-error\";\n div.textContent = `[Math Error: ${error}]`;\n } else {\n div.innerHTML = html;\n }\n\n // Click handler to select the raw math text\n div.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n });\n\n return div;\n }\n\n override ignoreEvent(event: Event) {\n return event.type !== \"click\";\n }\n}\n\n/**\n * Inline parser for inline math: $...$\n * Does not match $$ (block math markers)\n */\nconst inlineMathParser: InlineParser = {\n name: \"InlineMath\",\n parse(cx, next, pos) {\n // Check if we are at a $ character\n if (next !== DOLLAR) return -1;\n\n // Don't match $$ (that's block math)\n if (cx.char(pos + 1) === DOLLAR) return -1;\n\n // Find the closing $\n let end = pos + 1;\n while (end < cx.end) {\n const char = cx.char(end);\n if (char === DOLLAR) {\n // Found closing $, but make sure it's not $$\n if (cx.char(end + 1) !== DOLLAR) {\n // Extract the math content (excluding the $ markers)\n const content = cx.slice(pos + 1, end);\n\n // Skip empty math\n if (content.trim().length === 0) return -1;\n\n // Create the element with markers\n const openMark = cx.elt(\"InlineMathMark\", pos, pos + 1);\n const closeMark = cx.elt(\"InlineMathMark\", end, end + 1);\n const inlineMath = cx.elt(\"InlineMath\", pos, end + 1, [openMark, closeMark]);\n\n return cx.addElement(inlineMath);\n }\n // Skip $$ for block math\n return -1;\n }\n // Skip escaped characters\n if (char === 92 /* backslash */) {\n end += 2;\n continue;\n }\n end++;\n }\n\n return -1;\n },\n};\n\n/**\n * Block parser for math blocks: $$...$$\n */\nconst mathBlockParser: BlockParser = {\n name: \"MathBlock\",\n parse(cx: BlockContext, line: Line) {\n // Check if line starts with $$\n const text = line.text;\n const trimmed = text.slice(line.pos).trimStart();\n\n if (!trimmed.startsWith(\"$$\")) return false;\n\n // Find the end of the math block\n const startLine = cx.lineStart;\n let endPos = -1;\n let lastLineEnd = startLine + line.text.length;\n\n // Move past the opening line\n while (cx.nextLine()) {\n const currentText = line.text;\n lastLineEnd = cx.lineStart + currentText.length;\n\n // Check if this line contains closing $$\n if (currentText.trimEnd().endsWith(\"$$\")) {\n endPos = lastLineEnd;\n // Move past the closing line so subsequent markdown gets parsed\n cx.nextLine();\n break;\n }\n }\n\n if (endPos === -1) {\n // No closing found, treat as regular paragraph\n return false;\n }\n\n // Create the math block element\n const openMark = cx.elt(\"MathBlockMark\", startLine, startLine + text.indexOf(\"$$\") + 2);\n const closeMark = cx.elt(\"MathBlockMark\", endPos - 2, endPos);\n cx.addElement(cx.elt(\"MathBlock\", startLine, endPos, [openMark, closeMark]));\n\n return true;\n },\n};\n\n/**\n * MathPlugin - Renders LaTeX math expressions using KaTeX\n *\n * Supports:\n * - Inline math: $E = mc^2$\n * - Block math (display mode):\n * $$\n * \\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}\n * $$\n *\n * Behavior:\n * - Inline math: Show rendered output when cursor outside, raw LaTeX when inside\n * - Block math: Always show rendered output below, hide raw when cursor outside (like ImagePlugin)\n */\nexport class MathPlugin extends DecorationPlugin {\n readonly name = \"math\";\n readonly version = \"1.0.0\";\n override decorationPriority = 25;\n override readonly requiredNodes = [\"InlineMath\", \"MathBlock\", \"InlineMathMark\", \"MathBlockMark\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Intercepts dollar typing to wrap selected text as inline math.\n *\n * If user types '$' while text is selected, wraps each selected range\n * with single dollars (selected -> $selected$).\n */\n override getExtensions(): Extension[] {\n return [createWrapSelectionInputHandler({ $: \"$\" })];\n }\n\n /**\n * Return markdown parser extensions for math syntax\n */\n override getMarkdownConfig(): MarkdownConfig {\n return {\n defineNodes: [\n { name: \"InlineMath\", style: tags.emphasis },\n { name: \"InlineMathMark\", style: tags.processingInstruction },\n { name: \"MathBlock\", block: true },\n { name: \"MathBlockMark\", style: tags.processingInstruction },\n ],\n parseInline: [inlineMathParser],\n parseBlock: [mathBlockParser],\n };\n }\n\n /**\n * Build decorations for math expressions\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n // Handle inline math\n if (name === \"InlineMath\") {\n const content = view.state.sliceDoc(from, to);\n // Extract LaTeX content (remove $ markers)\n const latex = content.slice(1, -1);\n\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\n\n if (cursorInRange) {\n // Show raw math with styled markers\n decorations.push(mathMarkDecorations[\"math-inline\"].range(from, to));\n\n // Style the $ markers\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"InlineMathMark\") {\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\n }\n }\n } else {\n // Replace with rendered math widget\n decorations.push(\n Decoration.replace({\n widget: new InlineMathWidget(latex, from, to),\n }).range(from, to)\n );\n }\n }\n\n // Handle math blocks\n if (name === \"MathBlock\") {\n const content = view.state.sliceDoc(from, to);\n\n // Extract LaTeX content (remove $$ markers and trim)\n const lines = content.split(\"\\n\");\n const latex = lines\n .slice(1, -1) // Remove first and last lines (the $$ markers)\n .join(\"\\n\")\n .trim();\n\n // If the block is simple (everything on one line), handle differently\n const singleLine = !content.includes(\"\\n\");\n const latexContent = singleLine ? content.slice(2, -2).trim() : latex;\n\n const nodeLineStart = view.state.doc.lineAt(from);\n const nodeLineEnd = view.state.doc.lineAt(to);\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\n\n // Add line decoration for math block\n decorations.push(mathMarkDecorations[\"math-block\"].range(from));\n\n // Always add the math block widget below the node (like image plugin)\n decorations.push(\n Decoration.widget({\n widget: new MathBlockWidget(latexContent, from, to),\n side: 1,\n block: false,\n }).range(to)\n );\n\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n decorations.push(mathMarkDecorations[\"math-block\"].range(line.from));\n }\n\n // Cursor in range: show raw LaTeX with styling\n if (cursorInRange) {\n // Style the $$ markers\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"MathBlockMark\") {\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\n }\n }\n } else {\n // Cursor out of range: hide the raw math text\n decorations.push(mathMarkDecorations[\"math-hidden\"].range(from, to));\n }\n }\n },\n });\n }\n\n /**\n * Render math to HTML for preview mode\n */\n override renderToHTML(\n node: SyntaxNode,\n _children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): string | null {\n if (node.name === \"InlineMath\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const latex = content.slice(1, -1);\n const { html, error } = renderMath(latex, false);\n\n if (error) {\n return `<span class=\"cm-mardora-math-error\">[Math Error: ${ctx.sanitize(error)}]</span>`;\n }\n return `<span class=\"cm-mardora-math-rendered cm-mardora-math-rendered-inline\">${html}</span>`;\n }\n\n if (node.name === \"MathBlock\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const lines = content.split(\"\\n\");\n const latex = lines.length > 1 ? lines.slice(1, -1).join(\"\\n\").trim() : content.slice(2, -2).trim();\n const { html, error } = renderMath(latex, true);\n\n if (error) {\n return `<div class=\"cm-mardora-math-error\">[Math Error: ${ctx.sanitize(error)}]</div>`;\n }\n return `<div class=\"cm-mardora-math-rendered cm-mardora-math-rendered-block\">${html}</div>`;\n }\n\n // Hide math markers in preview\n if (node.name === \"InlineMathMark\" || node.name === \"MathBlockMark\") {\n return \"\";\n }\n\n return null;\n }\n}\n\n/**\n * Theme for math styling\n */\nconst theme = createTheme({\n default: {\n \".cm-mardora-math-block\": {\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n \".cm-mardora-math-block br\": {\n display: \"none\",\n },\n\n // Math markers ($ $$)\n \".cm-mardora-math-marker\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Inline math styling when editing\n \".cm-mardora-math-inline\": {\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9em\",\n },\n\n // Hidden math syntax (when cursor is not in range)\n \".cm-mardora-math-hidden\": {\n display: \"none\",\n },\n\n // Hidden line (for multi-line blocks)\n \".cm-mardora-hidden-line\": {\n display: \"none\",\n },\n\n // Rendered math container (both inline and block)\n \".cm-mardora-math-rendered\": {\n fontFamily: \"KaTeX_Main, 'Times New Roman', serif\",\n },\n\n // Inline rendered math\n \".cm-mardora-math-rendered-inline\": {\n display: \"inline\",\n verticalAlign: \"baseline\",\n },\n\n // Block rendered math (display mode)\n \".cm-mardora-math-rendered-block\": {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"1em 0\",\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\n borderRadius: \"4px\",\n overflow: \"auto\",\n },\n\n // Math error styling\n \".cm-mardora-math-error\": {\n display: \"inline-block\",\n padding: \"0.25em 0.5em\",\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\n color: \"#d73a49\",\n borderRadius: \"4px\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n },\n\n dark: {\n \".cm-mardora-math-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-math-rendered-block\": {\n backgroundColor: \"rgba(255, 255, 255, 0.02)\",\n },\n\n \".cm-mardora-math-error\": {\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\n color: \"#f85149\",\n },\n },\n});\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme, ThemeEnum } from \"../editor\";\nimport { createMediaPreviewButton } from \"../editor/media-lightbox\";\nimport { mediaLightboxTheme } from \"../editor/media-lightbox-theme\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { tags } from \"@lezer/highlight\";\nimport type { MarkdownConfig, BlockParser, Line, BlockContext } from \"@lezer/markdown\";\nimport mermaid from \"mermaid\";\n\n/**\n * Initialize mermaid with default configuration\n */\nmermaid.initialize({\n startOnLoad: false,\n theme: \"default\",\n suppressErrorRendering: true,\n});\n\n/**\n * Render a mermaid diagram definition to SVG\n */\nlet mermaidCounter = 0;\nasync function renderMermaid(\n definition: string,\n options: Record<string, string> = {},\n defaultTheme: string = \"default\"\n): Promise<{ svg: string; error: string | null }> {\n try {\n const id = `mardora-mermaid-${mermaidCounter++}`;\n let finalDefinition = definition;\n\n // transform theme to mermaid config\n const mermaidConfig: Record<string, string> = {};\n if (options.theme) {\n mermaidConfig.theme = options.theme;\n } else {\n mermaidConfig.theme = defaultTheme;\n }\n\n // If we have config to apply, prepend the directive\n if (Object.keys(mermaidConfig).length > 0) {\n const jsonConfig = JSON.stringify(mermaidConfig);\n // Mermaid directive format: %%{init: { ... }}%%\n finalDefinition = `%%{init: ${jsonConfig} }%%\\n${definition}`;\n }\n\n const { svg } = await mermaid.render(id, finalDefinition);\n return { svg, error: null };\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : \"Unknown error\";\n return { svg: \"\", error: errorMsg };\n }\n}\n\n/**\n * Helper to parse attributes from fence line\n * Example: ```mermaid theme=\"dark\" scale=\"2\"\n */\nfunction parseAttributes(fenceLine: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n // Match key=\"value\" or key='value'\n const regex = /(\\w+)=[\"']([^\"']*)[\"']/g;\n let match;\n while ((match = regex.exec(fenceLine)) !== null && match[1] && match[2]) {\n attributes[match[1]] = match[2];\n }\n return attributes;\n}\n\n/**\n * Mark decorations for mermaid syntax elements\n */\nconst mermaidMarkDecorations = {\n \"mermaid-block-start\": Decoration.line({ class: \"cm-mardora-mermaid-block-start\" }),\n \"mermaid-block-end\": Decoration.line({ class: \"cm-mardora-mermaid-block-end\" }),\n \"mermaid-block\": Decoration.line({ class: \"cm-mardora-mermaid-block\" }),\n \"mermaid-block-rendered\": Decoration.line({ class: \"cm-mardora-mermaid-block-rendered\" }),\n \"mermaid-marker\": Decoration.mark({ class: \"cm-mardora-mermaid-marker\" }),\n \"mermaid-hidden\": Decoration.mark({ class: \"cm-mardora-mermaid-hidden\" }),\n};\n\n/**\n * Widget to render mermaid block diagrams\n */\nclass MermaidBlockWidget extends WidgetType {\n constructor(\n readonly definition: string,\n readonly attributes: Record<string, string>,\n readonly defaultTheme: string,\n readonly from: number,\n readonly to: number\n ) {\n super();\n }\n\n override eq(other: MermaidBlockWidget): boolean {\n return (\n other.definition === this.definition &&\n JSON.stringify(other.attributes) === JSON.stringify(this.attributes) &&\n other.defaultTheme === this.defaultTheme &&\n other.from === this.from &&\n other.to === this.to\n );\n }\n\n toDOM(view: EditorView) {\n const div = document.createElement(\"div\");\n div.className = \"cm-mardora-mermaid-rendered cm-mardora-media-preview\";\n div.style.cursor = \"pointer\";\n\n // Show loading state initially\n div.innerHTML = `<div class=\"cm-mardora-mermaid-loading\">Rendering diagram…</div>`;\n\n // Render mermaid asynchronously\n // Render mermaid asynchronously\n renderMermaid(this.definition, this.attributes, this.defaultTheme).then(({ svg, error }) => {\n if (error) {\n div.className += \" cm-mardora-mermaid-error\";\n div.innerHTML = `<span>[Mermaid Error: ${error}]</span>`;\n } else {\n div.innerHTML = svg;\n div.appendChild(\n createMediaPreviewButton(div.ownerDocument, {\n label: \"放大查看 Mermaid 图\",\n content: () => ({ kind: \"html\", html: svg, title: \"Mermaid 图\" }),\n })\n );\n }\n });\n\n // Click handler to select the raw mermaid text\n div.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n selection: { anchor: this.from, head: this.to },\n scrollIntoView: true,\n });\n view.focus();\n });\n\n return div;\n }\n\n override ignoreEvent(event: Event) {\n return event.type !== \"click\";\n }\n}\n\n/**\n * Block parser for mermaid blocks:\n * ```mermaid\n * graph TD\n * A --> B\n * ```\n */\nconst mermaidBlockParser: BlockParser = {\n name: \"MermaidBlock\",\n before: \"FencedCode\",\n parse(cx: BlockContext, line: Line) {\n const text = line.text;\n const trimmed = text.slice(line.pos).trimStart();\n\n // Must start with ```mermaid\n if (!trimmed.startsWith(\"```mermaid\")) return false;\n\n // Ensure nothing meaningful after ```mermaid (allow trailing whitespace)\n // We now allow attributes, so we don't strictly check for empty rest\n // const rest = trimmed.slice(10);\n // if (rest.trim().length > 0) return false;\n\n const startLine = cx.lineStart;\n let endPos = -1;\n let closeBacktickStart = -1;\n\n // Move past the opening line and find the closing ```\n while (cx.nextLine()) {\n const currentText = line.text;\n const currentLineStart = cx.lineStart;\n const lastLineEnd = currentLineStart + currentText.length;\n\n // Check if this line is a closing ``` (only backticks, possibly with whitespace)\n const trimmedLine = currentText.trim();\n if (trimmedLine === \"```\") {\n endPos = lastLineEnd;\n closeBacktickStart = currentLineStart + currentText.indexOf(\"```\");\n // Move past the closing line so subsequent markdown gets parsed\n cx.nextLine();\n break;\n }\n }\n\n if (endPos === -1) {\n // No closing found, treat as regular text\n return false;\n }\n\n // Create the mermaid block element with markers\n const openMarkEnd = startLine + text.indexOf(\"```mermaid\") + 10;\n const openMark = cx.elt(\"MermaidBlockMark\", startLine, openMarkEnd);\n const closeMark = cx.elt(\"MermaidBlockMark\", closeBacktickStart, closeBacktickStart + 3);\n\n cx.addElement(cx.elt(\"MermaidBlock\", startLine, endPos, [openMark, closeMark]));\n\n return true;\n },\n};\n\n/**\n * MermaidPlugin - Renders mermaid diagrams in the editor\n *\n * Supports block mermaid syntax:\n * ```mermaid\n * graph TD\n * A --> B\n * ```\n *\n * Behavior:\n * - Always show rendered diagram below the block\n * - Hide raw definition when cursor is outside the block\n * - Show raw definition with styled markers when cursor is inside\n */\nexport class MermaidPlugin extends DecorationPlugin {\n readonly name = \"mermaid\";\n readonly version = \"1.0.0\";\n override decorationPriority = 25;\n override readonly requiredNodes = [\"MermaidBlock\", \"MermaidBlockMark\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Return markdown parser extensions for mermaid syntax\n */\n override getMarkdownConfig(): MarkdownConfig {\n return {\n defineNodes: [\n { name: \"MermaidBlock\", block: true },\n { name: \"MermaidBlockMark\", style: tags.processingInstruction },\n ],\n parseBlock: [mermaidBlockParser],\n };\n }\n\n /**\n * Build decorations for mermaid blocks\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n const config = this.context?.config;\n const currentTheme = config?.theme === ThemeEnum.DARK ? \"dark\" : \"default\";\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name === \"MermaidBlock\") {\n const content = view.state.sliceDoc(from, to);\n\n // Extract mermaid definition (remove ```mermaid and ``` markers)\n const lines = content.split(\"\\n\");\n const definition = lines\n .slice(1, -1) // Remove first and last lines (the markers)\n .join(\"\\n\")\n .trim();\n\n const docLines = content.split(\"\\n\");\n const fenceLine = docLines[0] || \"\";\n const attributes = parseAttributes(fenceLine);\n\n const nodeLineStart = view.state.doc.lineAt(from);\n const nodeLineEnd = view.state.doc.lineAt(to);\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\n\n // Calculate line number width for mermaid block\n const totalCodeLines = nodeLineEnd.number - nodeLineStart.number - 1;\n const lineNumWidth = String(totalCodeLines).length;\n let codeLineIndex = 1;\n\n // Add line decorations for mermaid block\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\n const line = view.state.doc.line(i);\n const isFenceLine = i === nodeLineStart.number || i === nodeLineEnd.number;\n const relativeLineNum = codeLineIndex;\n\n decorations.push(mermaidMarkDecorations[\"mermaid-block\"].range(line.from));\n if (!cursorInRange) decorations.push(mermaidMarkDecorations[\"mermaid-block-rendered\"].range(line.from));\n\n if (i === nodeLineStart.number)\n decorations.push(mermaidMarkDecorations[\"mermaid-block-start\"].range(line.from));\n\n if (i === nodeLineEnd.number)\n decorations.push(mermaidMarkDecorations[\"mermaid-block-end\"].range(line.from));\n\n if (!isFenceLine) {\n decorations.push(\n Decoration.line({\n attributes: {\n \"data-line-num\": String(relativeLineNum),\n style: `--line-num-width: ${lineNumWidth}ch`,\n },\n }).range(line.from)\n );\n }\n\n // Increment code line index (only for non-fence lines)\n if (!isFenceLine) {\n codeLineIndex++;\n }\n }\n\n // Always add the rendered widget below the block\n decorations.push(\n Decoration.widget({\n widget: new MermaidBlockWidget(definition, attributes, currentTheme, from, to),\n side: 1,\n block: false,\n }).range(to)\n );\n\n if (cursorInRange) {\n // Cursor in range: show raw definition with styled markers\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"MermaidBlockMark\") {\n decorations.push(mermaidMarkDecorations[\"mermaid-marker\"].range(child.from, child.to));\n }\n }\n } else {\n // Cursor out of range: hide the raw text\n decorations.push(mermaidMarkDecorations[\"mermaid-hidden\"].range(from, to));\n }\n }\n },\n });\n }\n\n /**\n * Render mermaid to HTML for preview mode\n *\n * Renders the actual mermaid diagram to SVG HTML\n */\n override async renderToHTML(\n node: SyntaxNode,\n _children: string,\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\n ): Promise<string | null> {\n if (node.name === \"MermaidBlock\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const lines = content.split(\"\\n\");\n const definition = lines.length > 1 ? lines.slice(1, -1).join(\"\\n\").trim() : \"\";\n\n const fenceLine = lines[0] || \"\";\n const attributes = parseAttributes(fenceLine);\n\n const config = this.context?.config;\n const currentTheme = config?.theme === ThemeEnum.DARK ? \"dark\" : \"default\";\n\n const { svg, error } = await renderMermaid(definition, attributes, currentTheme);\n\n if (error) {\n return `<div class=\"cm-mardora-mermaid-error\">${ctx.sanitize(`[Mermaid Error: ${error}]`)}</div>`;\n }\n\n return `<div class=\"cm-mardora-mermaid-rendered\">${svg}</div>`;\n }\n\n // Hide mermaid markers in preview\n if (node.name === \"MermaidBlockMark\") {\n return \"\";\n }\n\n return null;\n }\n}\n\n/**\n * Theme for mermaid styling\n */\nconst mermaidTheme = createTheme({\n default: {\n // Raw mermaid block lines (monospace)\n \".cm-mardora-mermaid-block:not(.cm-mardora-mermaid-block-rendered)\": {\n \"--radius\": \"0.375rem\",\n position: \"relative\",\n\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9rem\",\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\n padding: \"0 1rem !important\",\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 1rem) !important\",\n lineHeight: \"1.5\",\n borderLeft: \"1px solid var(--color-border)\",\n borderRight: \"1px solid var(--color-border)\",\n },\n\n \".cm-mardora-mermaid-block-start:not(.cm-mardora-mermaid-block-rendered)\": {\n overflow: \"hidden\",\n borderTopLeftRadius: \"var(--radius)\",\n borderTopRightRadius: \"var(--radius)\",\n borderTop: \"1px solid var(--color-border)\",\n },\n\n \".cm-mardora-mermaid-block-end:not(.cm-mardora-mermaid-block-rendered)\": {\n overflow: \"hidden\",\n borderBottomLeftRadius: \"var(--radius)\",\n borderBottomRightRadius: \"var(--radius)\",\n borderBottom: \"1px solid var(--color-border)\",\n },\n\n \".cm-mardora-mermaid-block:not(.cm-mardora-mermaid-block-rendered)::before\": {\n content: \"attr(data-line-num)\",\n position: \"absolute\",\n left: \"0.5rem\",\n top: \"0.2rem\",\n width: \"var(--line-num-width, 2ch)\",\n textAlign: \"right\",\n color: \"#6a737d\",\n opacity: \"0.6\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n userSelect: \"none\",\n },\n\n \".cm-mardora-mermaid-block.cm-mardora-mermaid-block-rendered br\": {\n display: \"none\",\n },\n\n // Mermaid markers (```mermaid / ```)\n \".cm-mardora-mermaid-marker\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Hidden mermaid syntax (when cursor is not in range)\n \".cm-mardora-mermaid-hidden\": {\n display: \"none\",\n },\n\n // Rendered mermaid container\n \".cm-mardora-mermaid-rendered\": {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: \"1em 0\",\n borderRadius: \"4px\",\n overflow: \"auto\",\n },\n\n // SVG inside rendered container\n \".cm-mardora-mermaid-rendered svg\": {\n maxWidth: \"100%\",\n height: \"auto\",\n aspectRatio: \"auto\",\n },\n\n // Loading state\n \".cm-mardora-mermaid-loading\": {\n display: \"inline-block\",\n padding: \"0.5em 1em\",\n color: \"#6a737d\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Error styling\n \".cm-mardora-mermaid-error\": {\n display: \"inline-block\",\n padding: \"0.25em 0.5em\",\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\n color: \"#d73a49\",\n borderRadius: \"4px\",\n fontSize: \"0.875em\",\n fontStyle: \"italic\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n },\n\n dark: {\n \".cm-mardora-mermaid-block:not(.cm-mardora-mermaid-block-rendered)\": {\n backgroundColor: \"rgba(255, 255, 255, 0.03)\",\n },\n\n \".cm-mardora-mermaid-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-mermaid-loading\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-mermaid-error\": {\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\n color: \"#f85149\",\n },\n },\n});\n\nconst theme = (theme: Parameters<typeof mermaidTheme>[0]) => ({\n ...mermaidTheme(theme),\n ...mediaLightboxTheme(theme),\n});\n","import { createTheme } from \"../editor\";\n\n/** Shared theme styles for editor + preview code blocks. */\nexport const codePluginTheme = createTheme({\n default: {\n // Inline code\n \".cm-mardora-code-inline\": {\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9em\",\n backgroundColor: \"rgba(0, 0, 0, 0.05)\",\n padding: \"0.1rem 0.25rem\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"3px\",\n },\n\n // Fenced code block lines\n \".cm-mardora-code-block-line\": {\n \"--radius\": \"0.375rem\",\n\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9rem\",\n backgroundColor: \"transparent\",\n padding: \"0 1rem !important\",\n lineHeight: \"1.5\",\n minHeight: \"1.5em\",\n borderLeft: \"1px solid var(--color-border, #d4d4d8)\",\n borderRight: \"1px solid var(--color-border, #d4d4d8)\",\n },\n\n // First line of code block\n \".cm-mardora-code-block-line-start\": {\n borderTopLeftRadius: \"var(--radius)\",\n borderTopRightRadius: \"var(--radius)\",\n position: \"relative\",\n overflow: \"visible\",\n borderTop: \"1px solid var(--color-border, #d4d4d8)\",\n paddingTop: \"0.5rem !important\",\n },\n\n \".cm-mardora-code-block-rendered.cm-mardora-code-block-line-start\": {\n paddingTop: \"0.5rem !important\",\n paddingBottom: \"0 !important\",\n },\n\n \".cm-mardora-code-fence-line\": {\n height: \"0\",\n minHeight: \"0\",\n lineHeight: \"0\",\n paddingTop: \"0 !important\",\n paddingBottom: \"0 !important\",\n border: \"none !important\",\n overflow: \"visible\",\n },\n\n // Code block hover toolbar\n \".cm-mardora-code-toolbar\": {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.2rem\",\n position: \"absolute\",\n top: \"0.5rem\",\n right: \"0.45rem\",\n zIndex: \"20\",\n opacity: \"0\",\n pointerEvents: \"none\",\n transition: \"opacity 0.12s ease\",\n color: \"var(--color-text, inherit)\",\n fontFamily: \"var(--font-sans, system-ui, sans-serif)\",\n fontSize: \"0.78rem\",\n lineHeight: \"1\",\n\n \"&.is-visible, &.is-menu-open\": {\n opacity: \"1\",\n pointerEvents: \"auto\",\n },\n },\n\n \".cm-mardora-code-container:hover .cm-mardora-code-toolbar, .cm-mardora-code-container:focus-within .cm-mardora-code-toolbar\":\n {\n opacity: \"1\",\n pointerEvents: \"auto\",\n },\n\n \".cm-mardora-code-language-control\": {\n position: \"relative\",\n },\n\n \".cm-mardora-code-language-button, .cm-mardora-code-copy-btn\": {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"1.55rem\",\n minWidth: \"1.55rem\",\n gap: \"0.25rem\",\n padding: \"0 0.35rem\",\n backgroundColor: \"rgba(255, 255, 255, 0.86)\",\n border: \"1px solid rgba(209, 213, 219, 0.9)\",\n borderRadius: \"0.25rem\",\n color: \"#3f3f46\",\n cursor: \"pointer\",\n boxShadow: \"none\",\n transition: \"background-color 0.12s ease, border-color 0.12s ease, color 0.12s ease\",\n\n \"&:hover\": {\n backgroundColor: \"rgba(244, 244, 245, 0.96)\",\n borderColor: \"rgba(161, 161, 170, 0.95)\",\n color: \"#18181b\",\n },\n\n \"&.copied\": {\n color: \"#3f3f46\",\n },\n },\n\n \".cm-mardora-code-copy-btn\": {\n padding: \"0\",\n },\n\n \".cm-mardora-code-language-menu\": {\n position: \"absolute\",\n top: \"calc(100% + 0.35rem)\",\n right: \"0\",\n width: \"14rem\",\n maxHeight: \"18rem\",\n padding: \"0.45rem\",\n backgroundColor: \"var(--color-background, #fff)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"0.375rem\",\n boxShadow: \"0 10px 30px rgba(15, 23, 42, 0.12)\",\n overflow: \"hidden\",\n\n \"&[hidden]\": {\n display: \"none\",\n },\n },\n\n \".cm-mardora-code-language-search\": {\n display: \"flex\",\n alignItems: \"center\",\n position: \"relative\",\n marginBottom: \"0.35rem\",\n\n \"& input\": {\n width: \"100%\",\n height: \"2rem\",\n padding: \"0 2rem 0 0.65rem\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"transparent\",\n color: \"var(--color-text, inherit)\",\n outline: \"none\",\n font: \"inherit\",\n\n \"&:focus\": {\n borderColor: \"#94a3b8\",\n },\n },\n },\n\n \".cm-mardora-code-language-search-icon\": {\n position: \"absolute\",\n right: \"0.55rem\",\n color: \"#52525b\",\n pointerEvents: \"none\",\n },\n\n \".cm-mardora-code-language-list\": {\n maxHeight: \"14.5rem\",\n overflowY: \"auto\",\n },\n\n \".cm-mardora-code-language-item\": {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n height: \"1.9rem\",\n padding: \"0 0.45rem\",\n border: \"none\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"transparent\",\n color: \"var(--color-text, inherit)\",\n cursor: \"pointer\",\n font: \"inherit\",\n textAlign: \"left\",\n\n \"&:hover\": {\n backgroundColor: \"rgba(0, 0, 0, 0.07)\",\n },\n },\n\n // Caption (below code block)\n \".cm-mardora-code-block-has-caption\": {\n padding: \"0 !important\",\n paddingTop: \"0.5rem !important\",\n },\n\n \".cm-mardora-code-caption\": {\n textAlign: \"center\",\n fontSize: \"0.85rem\",\n color: \"#6a737d\",\n fontStyle: \"italic\",\n padding: \"0.25rem 1rem\",\n backgroundColor: \"rgba(0, 0, 0, 0.06)\",\n },\n\n // Last line of code block\n \".cm-mardora-code-block-line-end\": {\n borderBottomLeftRadius: \"var(--radius)\",\n borderBottomRightRadius: \"var(--radius)\",\n borderBottom: \"1px solid var(--color-border, #d4d4d8)\",\n paddingBottom: \"0.5rem !important\",\n },\n\n \".cm-mardora-code-block-rendered.cm-mardora-code-block-line-end\": {\n paddingTop: \"0 !important\",\n paddingBottom: \"0.5rem !important\",\n },\n\n \".cm-mardora-code-block-single-line\": {\n paddingTop: \"0.5rem !important\",\n paddingBottom: \"0.5rem !important\",\n },\n\n \".cm-mardora-code-block-rendered.cm-mardora-code-block-single-line\": {\n paddingTop: \"0.5rem !important\",\n paddingBottom: \"0.5rem !important\",\n },\n\n // Fence markers (```)\n \".cm-mardora-code-fence\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n },\n\n // Line numbers\n \".cm-mardora-code-line-numbered\": {\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 1rem) !important\",\n position: \"relative\",\n\n \"&::before\": {\n content: \"attr(data-line-num)\",\n position: \"absolute\",\n left: \"0.5rem\",\n top: \"0.2rem\",\n width: \"var(--line-num-width, 2ch)\",\n textAlign: \"right\",\n color: \"#6a737d\",\n opacity: \"0.6\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n userSelect: \"none\",\n },\n },\n\n \".cm-mardora-code-line-numbered-diff\": {\n paddingLeft: \"calc(var(--line-num-old-width, 2ch) + var(--line-num-new-width, 2ch) + 2.75rem) !important\",\n position: \"relative\",\n\n \"&::before\": {\n content: \"attr(data-line-num-old)\",\n position: \"absolute\",\n left: \"0.5rem\",\n top: \"0.2rem\",\n width: \"var(--line-num-old-width, 2ch)\",\n textAlign: \"right\",\n color: \"#6a737d\",\n opacity: \"0.6\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n userSelect: \"none\",\n },\n\n \"&::after\": {\n content: 'attr(data-line-num-new) \" \" attr(data-diff-marker)',\n position: \"absolute\",\n left: \"calc(0.5rem + var(--line-num-old-width, 2ch) + 0.75rem)\",\n top: \"0.2rem\",\n width: \"calc(var(--line-num-new-width, 2ch) + 2ch)\",\n textAlign: \"right\",\n color: \"#6a737d\",\n opacity: \"0.6\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n userSelect: \"none\",\n },\n\n \"&.cm-mardora-code-line-diff-gutter\": {\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 2rem) !important\",\n\n \"&::after\": {\n content: \"attr(data-diff-marker)\",\n position: \"absolute\",\n left: \"calc(0.5rem + var(--line-num-width, 2ch) + 0.35rem)\",\n top: \"0.1rem\",\n width: \"1ch\",\n textAlign: \"right\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85rem\",\n fontWeight: \"700\",\n userSelect: \"none\",\n },\n },\n },\n\n // Preview: code lines (need block display for full-width highlights)\n \".cm-mardora-code-line\": {\n display: \"block\",\n position: \"relative\",\n paddingLeft: \"1rem\",\n paddingRight: \"1rem\",\n lineHeight: \"1.5\",\n borderLeft: \"3px solid transparent\",\n },\n\n // Line highlight\n \".cm-mardora-code-line-highlight\": {\n backgroundColor: \"rgba(255, 220, 100, 0.2) !important\",\n borderLeft: \"3px solid #f0b429 !important\",\n },\n\n \".cm-mardora-code-line-diff-add\": {\n color: \"inherit\",\n backgroundColor: \"rgba(34, 197, 94, 0.12) !important\",\n borderLeft: \"3px solid #22c55e !important\",\n\n \"&.cm-mardora-code-line-diff-gutter::after\": {\n color: \"#16a34a\",\n },\n },\n\n \".cm-mardora-code-line-diff-del\": {\n color: \"inherit\",\n backgroundColor: \"rgba(239, 68, 68, 0.12) !important\",\n borderLeft: \"3px solid #ef4444 !important\",\n\n \"&.cm-mardora-code-line-diff-gutter::after\": {\n color: \"#dc2626\",\n },\n },\n\n \".cm-mardora-code-diff-sign-add\": {\n color: \"#16a34a\",\n fontWeight: \"700\",\n },\n\n \".cm-mardora-code-diff-sign-del\": {\n color: \"#dc2626\",\n fontWeight: \"700\",\n },\n\n \".cm-mardora-code-diff-mod-add\": {\n color: \"inherit\",\n backgroundColor: \"rgba(34, 197, 94, 0.25)\",\n borderRadius: \"2px\",\n padding: \"0.1rem 0\",\n },\n\n \".cm-mardora-code-diff-mod-del\": {\n color: \"inherit\",\n backgroundColor: \"rgba(239, 68, 68, 0.25)\",\n borderRadius: \"2px\",\n padding: \"0.1rem 0\",\n },\n\n // Text highlight\n \".cm-mardora-code-text-highlight\": {\n color: \"inherit\",\n backgroundColor: \"rgba(255, 220, 100, 0.4)\",\n borderRadius: \"2px\",\n padding: \"0.1rem 0\",\n },\n\n // Preview: container wrapper\n \".cm-mardora-code-container\": {\n margin: \"1rem 0\",\n borderRadius: \"var(--radius)\",\n overflow: \"visible\",\n border: \"1px solid var(--color-border, #d4d4d8)\",\n position: \"relative\",\n backgroundColor: \"transparent\",\n\n \".cm-mardora-code-block\": {\n margin: \"0\",\n borderRadius: \"var(--radius)\",\n border: \"none\",\n whiteSpace: \"pre-wrap\",\n },\n\n \".cm-mardora-code-caption\": {\n borderTop: \"1px solid var(--color-border)\",\n },\n },\n\n // Preview: standalone code block (not in container)\n \".cm-mardora-code-block\": {\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.9rem\",\n backgroundColor: \"transparent\",\n padding: \"1rem\",\n overflow: \"auto\",\n position: \"relative\",\n borderRadius: \"var(--radius)\",\n border: \"1px solid var(--color-border, #d4d4d8)\",\n\n \"&.cm-mardora-code-block-has-caption\": {\n borderBottomLeftRadius: \"0\",\n borderBottomRightRadius: \"0\",\n borderBottom: \"none\",\n paddingBottom: \"0.5rem !important\",\n },\n },\n },\n\n dark: {\n \".cm-mardora-code-inline\": {\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\n },\n\n \".cm-mardora-code-block-line\": {\n backgroundColor: \"transparent\",\n borderLeftColor: \"rgba(148, 163, 184, 0.26)\",\n borderRightColor: \"rgba(148, 163, 184, 0.26)\",\n },\n\n \".cm-mardora-code-block-line-start\": {\n borderTopColor: \"rgba(148, 163, 184, 0.26)\",\n },\n\n \".cm-mardora-code-block-line-end\": {\n borderBottomColor: \"rgba(148, 163, 184, 0.26)\",\n },\n\n \".cm-mardora-code-fence\": {\n color: \"#8b949e\",\n },\n\n \".cm-mardora-code-container\": {\n borderColor: \"rgba(148, 163, 184, 0.26)\",\n\n \".cm-mardora-code-caption\": {\n borderTopColor: \"rgba(148, 163, 184, 0.26)\",\n },\n },\n\n \".cm-mardora-code-block\": {\n backgroundColor: \"transparent\",\n borderColor: \"rgba(148, 163, 184, 0.26)\",\n },\n\n \".cm-mardora-code-language-button, .cm-mardora-code-copy-btn\": {\n backgroundColor: \"rgba(39, 39, 42, 0.72)\",\n borderColor: \"rgba(82, 82, 91, 0.9)\",\n color: \"#e4e4e7\",\n\n \"&:hover\": {\n backgroundColor: \"rgba(63, 63, 70, 0.92)\",\n borderColor: \"rgba(113, 113, 122, 0.95)\",\n },\n\n \"&.copied\": {\n color: \"#e4e4e7\",\n },\n },\n\n \".cm-mardora-code-language-menu\": {\n backgroundColor: \"#18181b\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.35)\",\n },\n\n \".cm-mardora-code-language-search-icon\": {\n color: \"#a1a1aa\",\n },\n\n \".cm-mardora-code-caption\": {\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\n },\n\n \".cm-mardora-code-line-numbered\": {\n \"&::before\": {\n color: \"#8b949e\",\n },\n },\n\n \".cm-mardora-code-line-numbered-diff\": {\n \"&::before\": {\n color: \"#8b949e\",\n },\n\n \"&::after\": {\n color: \"#8b949e\",\n },\n },\n\n \".cm-mardora-code-line-diff-gutter\": {\n \"&::after\": {\n color: \"#8b949e\",\n },\n },\n\n \".cm-mardora-code-line-highlight\": {\n backgroundColor: \"rgba(255, 220, 100, 0.15) !important\",\n borderLeft: \"3px solid #d9a520 !important\",\n },\n\n \".cm-mardora-code-line-diff-add\": {\n backgroundColor: \"rgba(34, 197, 94, 0.15) !important\",\n borderLeft: \"3px solid #22c55e !important\",\n\n \"&.cm-mardora-code-line-diff-gutter::after\": {\n color: \"#4ade80\",\n },\n },\n\n \".cm-mardora-code-line-diff-del\": {\n backgroundColor: \"rgba(239, 68, 68, 0.15) !important\",\n borderLeft: \"3px solid #ef4444 !important\",\n\n \"&.cm-mardora-code-line-diff-gutter::after\": {\n color: \"#f87171\",\n },\n },\n\n \".cm-mardora-code-diff-sign-add\": {\n color: \"#4ade80\",\n },\n\n \".cm-mardora-code-diff-sign-del\": {\n color: \"#f87171\",\n },\n\n \".cm-mardora-code-diff-mod-add\": {\n backgroundColor: \"rgba(34, 197, 94, 0.3)\",\n },\n\n \".cm-mardora-code-diff-mod-del\": {\n backgroundColor: \"rgba(239, 68, 68, 0.3)\",\n },\n\n \".cm-mardora-code-text-highlight\": {\n backgroundColor: \"rgba(255, 220, 100, 0.3)\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\nimport { EditorState, Extension, Transaction, TransactionSpec } from \"@codemirror/state\";\nimport { LanguageDescription, syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { toggleMarkdownStyle } from \"../editor\";\nimport { Parser, SyntaxNode } from \"@lezer/common\";\nimport { Highlighter, highlightCode } from \"@lezer/highlight\";\nimport { languages } from \"@codemirror/language-data\";\nimport { createWrapSelectionInputHandler } from \"../lib\";\nimport { codePluginTheme as theme } from \"./code-plugin.theme\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Copy icon SVG (clipboard) */\nconst COPY_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\n\n/** Checkmark icon SVG (success state) */\nexport const CODE_COPY_SUCCESS_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-check-icon lucide-check\"><path d=\"M20 6 9 17l-5-5\"></path></svg>`;\n\n/** Chevron icon SVG */\nconst CHEVRON_DOWN_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"></path></svg>`;\n\n/** Search icon SVG */\nconst SEARCH_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><path d=\"m21 21-4.3-4.3\"></path></svg>`;\n\n/** Language selected icon SVG */\nconst LANGUAGE_SELECTED_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"></path></svg>`;\n\n/** Delay before resetting copy button state (ms) */\nconst COPY_RESET_DELAY = 2000;\n\n/** Code fence marker in markdown blocks */\nconst CODE_FENCE = \"```\";\n\n/** Regex for quoted code info values like title=\"file.ts\" */\nconst QUOTED_INFO_PATTERN = /(\\w+)=\"([^\"]*)\"/g;\n\n/** Regex for /pattern/ with optional instance selectors (/pattern/1-3,5) */\nconst TEXT_HIGHLIGHT_PATTERN = /\\/([^/]+)\\/(?:(\\d+(?:-\\d+)?(?:,\\d+(?:-\\d+)?)*))?/g;\n\nconst codeLanguageOptions = [\n [\"Plain text\", \"\"],\n [\"Bash\", \"bash\"],\n [\"C\", \"c\"],\n [\"C++\", \"cpp\"],\n [\"C#\", \"csharp\"],\n [\"CSS\", \"css\"],\n [\"Go\", \"go\"],\n [\"HTML\", \"html\"],\n [\"Java\", \"java\"],\n [\"JavaScript\", \"javascript\"],\n [\"JSON\", \"json\"],\n [\"Markdown\", \"markdown\"],\n [\"Mermaid\", \"mermaid\"],\n [\"Python\", \"python\"],\n [\"Ruby\", \"ruby\"],\n [\"Rust\", \"rust\"],\n [\"Shell\", \"shell\"],\n [\"SQL\", \"sql\"],\n [\"Swift\", \"swift\"],\n [\"TypeScript\", \"typescript\"],\n [\"TSX\", \"tsx\"],\n [\"Vue\", \"vue\"],\n [\"YAML\", \"yaml\"],\n] as const;\n\nconst codeLanguageAliases: Record<string, string> = {\n bash: \"Bash\",\n c: \"C\",\n cpp: \"C++\",\n \"c++\": \"C++\",\n csharp: \"C#\",\n \"c#\": \"C#\",\n css: \"CSS\",\n go: \"Go\",\n html: \"HTML\",\n java: \"Java\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n json: \"JSON\",\n markdown: \"Markdown\",\n mermaid: \"Mermaid\",\n md: \"Markdown\",\n python: \"Python\",\n py: \"Python\",\n ruby: \"Ruby\",\n rust: \"Rust\",\n sql: \"SQL\",\n swift: \"Swift\",\n typescript: \"TypeScript\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n vue: \"Vue\",\n yaml: \"YAML\",\n yml: \"YAML\",\n};\n\nfunction isCodeInfoDirective(token: string): boolean {\n const normalizedToken = token.toLowerCase();\n return (\n /^(?:line-numbers|linenumbers|showlinenumbers)(?:\\{\\d+\\})?$/.test(normalizedToken) ||\n normalizedToken === \"copy\" ||\n normalizedToken === \"diff\" ||\n normalizedToken.startsWith(\"{\") ||\n normalizedToken.startsWith(\"/\") ||\n normalizedToken.startsWith(\"title=\") ||\n normalizedToken.startsWith(\"caption=\")\n );\n}\n\nexport function replaceCodeInfoLanguage(codeInfo: string, nextLanguage: string): string {\n const trimmedInfo = codeInfo.trim();\n const normalizedLanguage = nextLanguage.trim();\n const tokens = trimmedInfo ? trimmedInfo.split(/\\s+/) : [];\n\n if (tokens.length > 0 && tokens[0] && !isCodeInfoDirective(tokens[0])) {\n tokens.shift();\n }\n\n return [normalizedLanguage, ...tokens].filter(Boolean).join(\" \");\n}\n\nexport function getCodeInfoLanguageTokenLength(codeInfo: string): number {\n const match = codeInfo.match(/^(\\S+)(\\s*)/);\n const token = match?.[1];\n if (!token || isCodeInfoDirective(token)) return 0;\n return token.length + (match[2]?.length ?? 0);\n}\n\nexport function encodeCodeCopyPayload(code: string): string {\n if (typeof btoa !== \"undefined\") {\n return btoa(encodeURIComponent(code));\n }\n\n return Buffer.from(encodeURIComponent(code), \"utf8\").toString(\"base64\");\n}\n\nexport function decodeCodeCopyPayload(payload: string): string {\n const decoded = typeof atob !== \"undefined\" ? atob(payload) : Buffer.from(payload, \"base64\").toString(\"utf8\");\n return decodeURIComponent(decoded);\n}\n\nfunction getClipboardApi(documentRef: Document): Clipboard | undefined {\n return documentRef.defaultView?.navigator.clipboard ?? (typeof navigator !== \"undefined\" ? navigator.clipboard : undefined);\n}\n\nfunction copyTextWithTextAreaFallback(text: string, documentRef: Document): boolean {\n const textArea = documentRef.createElement(\"textarea\");\n textArea.value = text;\n textArea.setAttribute(\"readonly\", \"true\");\n textArea.style.position = \"fixed\";\n textArea.style.left = \"-9999px\";\n textArea.style.top = \"0\";\n documentRef.body.appendChild(textArea);\n textArea.select();\n textArea.setSelectionRange(0, text.length);\n\n try {\n return documentRef.execCommand(\"copy\");\n } finally {\n textArea.remove();\n }\n}\n\nexport async function copyCodeTextToClipboard(\n text: string,\n documentRef: Document | undefined = typeof document !== \"undefined\" ? document : undefined\n): Promise<void> {\n if (!documentRef) {\n throw new Error(\"A browser document is required to copy code text\");\n }\n\n const clipboard = getClipboardApi(documentRef);\n if (clipboard?.writeText) {\n try {\n await clipboard.writeText(text);\n return;\n } catch {\n // Fall back to a selected textarea to force a text/plain clipboard payload.\n }\n }\n\n if (copyTextWithTextAreaFallback(text, documentRef)) {\n return;\n }\n\n throw new Error(\"Unable to copy code text\");\n}\n\nfunction markCodeCopyButtonCopied(copyBtn: HTMLButtonElement): void {\n copyBtn.classList.add(\"copied\");\n copyBtn.innerHTML = CODE_COPY_SUCCESS_ICON;\n setTimeout(() => {\n copyBtn.classList.remove(\"copied\");\n copyBtn.innerHTML = COPY_ICON;\n }, COPY_RESET_DELAY);\n}\n\nexport function bindCodeCopyButtons(root: HTMLElement | Document): () => void {\n const onClick = (event: Event) => {\n const target = event.target instanceof Element ? event.target : null;\n const copyBtn = target?.closest<HTMLButtonElement>(\".cm-mardora-code-copy-btn[data-code]\");\n if (!copyBtn || !root.contains(copyBtn)) return;\n\n const codePayload = copyBtn.dataset.code ?? \"\";\n const code = copyBtn.dataset.encoded === \"true\" ? decodeCodeCopyPayload(codePayload) : codePayload;\n\n event.preventDefault();\n event.stopPropagation();\n void copyCodeTextToClipboard(code, copyBtn.ownerDocument).then(() => {\n markCodeCopyButtonCopied(copyBtn);\n });\n };\n\n root.addEventListener(\"click\", onClick);\n return () => root.removeEventListener(\"click\", onClick);\n}\n\nexport interface CodeFenceAutoCloseInput {\n text: string;\n from: number;\n to: number;\n lineFrom: number;\n lineTo: number;\n lineText: string;\n selectionEmpty: boolean;\n}\n\nexport interface CodeFenceAutoCloseResult {\n changes: { from: number; to: number; insert: string };\n selection: { anchor: number };\n}\n\nexport function resolveCodeFenceAutoClose(input: CodeFenceAutoCloseInput): CodeFenceAutoCloseResult | null {\n if (input.from !== input.to || !input.selectionEmpty) {\n return null;\n }\n\n const cursorOffset = input.from - input.lineFrom;\n const beforeCursor = input.lineText.slice(0, cursorOffset);\n const afterCursor = input.lineText.slice(cursorOffset);\n const openingMatch =\n input.text === \"`\" ? beforeCursor.match(/^(\\s*)``$/) : input.text === CODE_FENCE ? beforeCursor.match(/^(\\s*)$/) : null;\n\n if (!openingMatch || afterCursor.trim() !== \"\") {\n return null;\n }\n\n const indent = openingMatch[1] ?? \"\";\n const insert = `${indent}${CODE_FENCE}\\n${indent}\\n${indent}${CODE_FENCE}`;\n const anchor = input.lineFrom + indent.length + CODE_FENCE.length + 1 + indent.length;\n\n return {\n changes: { from: input.lineFrom, to: input.lineTo, insert },\n selection: { anchor },\n };\n}\n\nfunction isInsideFencedCode(state: EditorState, pos: number, lineFrom: number): boolean {\n const inspectPos = pos > lineFrom ? pos - 1 : pos;\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(inspectPos, -1);\n\n while (node) {\n if (node.name === \"FencedCode\") return true;\n node = node.parent;\n }\n\n return false;\n}\n\nexport function resolveCodeFenceAutoCloseTransaction(transaction: Transaction): TransactionSpec | null {\n if (!transaction.docChanged || !transaction.startState.selection.main.empty || transaction.startState.selection.ranges.length !== 1) {\n return null;\n }\n\n let autoClose: TransactionSpec | null = null;\n\n transaction.changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n if (autoClose) return;\n\n const line = transaction.startState.doc.lineAt(fromA);\n if (isInsideFencedCode(transaction.startState, fromA, line.from)) return;\n\n const result = resolveCodeFenceAutoClose({\n text: inserted.toString(),\n from: fromA,\n to: toA,\n lineFrom: line.from,\n lineTo: line.to,\n lineText: line.text,\n selectionEmpty: true,\n });\n\n if (!result) return;\n\n const userEvent = transaction.annotation(Transaction.userEvent);\n autoClose = {\n changes: result.changes,\n selection: result.selection,\n scrollIntoView: true,\n filter: false,\n ...(userEvent ? { userEvent } : {}),\n };\n });\n\n return autoClose;\n}\n\nfunction createCodeFenceAutoCloseTransactionFilter(): Extension {\n return EditorState.transactionFilter.of((transaction) => resolveCodeFenceAutoCloseTransaction(transaction) ?? transaction);\n}\n\nfunction createCodeFenceAutoCloseInputHandler(): Extension {\n return EditorView.inputHandler.of((view, from, to, text) => {\n const selectionEmpty = view.state.selection.ranges.length === 1 && view.state.selection.main.empty;\n const line = view.state.doc.lineAt(from);\n const result = resolveCodeFenceAutoClose({\n text,\n from,\n to,\n lineFrom: line.from,\n lineTo: line.to,\n lineText: line.text,\n selectionEmpty,\n });\n\n if (!result) {\n return false;\n }\n\n view.dispatch({\n changes: result.changes,\n selection: result.selection,\n scrollIntoView: true,\n });\n\n return true;\n });\n}\n\nfunction createCodeFenceAutoCloseBeforeInputHandler(): Extension {\n return EditorView.domEventHandlers({\n beforeinput(event, view) {\n const inputEvent = event as InputEvent;\n if (inputEvent.inputType !== \"insertText\") {\n return false;\n }\n\n const text = inputEvent.data ?? \"\";\n const { from, to } = view.state.selection.main;\n const selectionEmpty = view.state.selection.ranges.length === 1 && view.state.selection.main.empty;\n const line = view.state.doc.lineAt(from);\n const result = resolveCodeFenceAutoClose({\n text,\n from,\n to,\n lineFrom: line.from,\n lineTo: line.to,\n lineText: line.text,\n selectionEmpty,\n });\n\n if (!result) {\n return false;\n }\n\n event.preventDefault();\n view.dispatch({\n changes: result.changes,\n selection: result.selection,\n scrollIntoView: true,\n });\n\n return true;\n },\n });\n}\n\nfunction formatLanguageLabel(language: string): string {\n const normalized = language.trim().toLowerCase();\n if (!normalized) return \"Text\";\n return codeLanguageAliases[normalized] ?? language;\n}\n\ninterface ToolbarElement extends HTMLElement {\n __mardoraDestroyToolbar?: () => void;\n}\n\ninterface PreviewRenderContext {\n sliceDoc(from: number, to: number): string;\n sanitize(html: string): string;\n syntaxHighlighters?: readonly Highlighter[];\n}\n\n// ============================================================================\n// Decorations\n// ============================================================================\n\n/** Mark and line decorations for code elements */\nconst codeMarkDecorations = {\n // Inline code\n \"inline-code\": Decoration.mark({ class: \"cm-mardora-code-inline\" }),\n \"inline-mark\": Decoration.replace({}),\n\n // Fenced code block\n \"code-block-line\": Decoration.line({ class: \"cm-mardora-code-block-line\" }),\n \"code-block-line-start\": Decoration.line({ class: \"cm-mardora-code-block-line-start\" }),\n \"code-block-line-end\": Decoration.line({ class: \"cm-mardora-code-block-line-end\" }),\n \"code-block-single-line\": Decoration.line({ class: \"cm-mardora-code-block-single-line\" }),\n \"code-block-rendered\": Decoration.line({ class: \"cm-mardora-code-block-rendered\" }),\n \"code-fence-line\": Decoration.line({ class: \"cm-mardora-code-fence-line\" }),\n \"code-fence\": Decoration.mark({ class: \"cm-mardora-code-fence\" }),\n \"code-hidden\": Decoration.replace({}),\n\n // Highlights\n \"code-line-highlight\": Decoration.line({ class: \"cm-mardora-code-line-highlight\" }),\n \"code-text-highlight\": Decoration.mark({ class: \"cm-mardora-code-text-highlight\" }),\n\n // Diff preview\n \"diff-line-add\": Decoration.line({ class: \"cm-mardora-code-line-diff-add\" }),\n \"diff-line-del\": Decoration.line({ class: \"cm-mardora-code-line-diff-del\" }),\n \"diff-sign-add\": Decoration.mark({ class: \"cm-mardora-code-diff-sign-add\" }),\n \"diff-sign-del\": Decoration.mark({ class: \"cm-mardora-code-diff-sign-del\" }),\n \"diff-mod-add\": Decoration.mark({ class: \"cm-mardora-code-diff-mod-add\" }),\n \"diff-mod-del\": Decoration.mark({ class: \"cm-mardora-code-diff-mod-del\" }),\n \"diff-escape-hidden\": Decoration.replace({}),\n};\n\n/**\n * Text highlight definition\n * Matches text or regex patterns with optional instance selection\n */\nexport interface TextHighlight {\n /** The pattern to match (regex without slashes) */\n pattern: string;\n /** Specific instances to highlight (e.g., [3,5] or range [3,4,5]) */\n instances?: number[];\n}\n\n/**\n * Properties extracted from CodeInfo string\n *\n * Example: ```tsx line-numbers{5} title=\"hello.tsx\" caption=\"Example\" copy {2-4,5} /Hello/3-5\n */\nexport interface CodeBlockProperties {\n /** Language identifier (first token) */\n language: string;\n /** Show line numbers, optionally starting from a specific number */\n showLineNumbers?: number | boolean;\n /** Title to display */\n title?: string;\n /** Caption to display */\n caption?: string;\n /** Show copy button */\n copy?: boolean;\n /** Enable diff preview mode */\n diff?: boolean;\n /** Lines to highlight (e.g., [2,3,4,5,9]) */\n highlightLines?: number[];\n /** Text patterns to highlight with optional instance selection */\n highlightText?: TextHighlight[];\n}\n\ntype DiffLineKind = \"normal\" | \"addition\" | \"deletion\";\n\ninterface DiffLineState {\n kind: DiffLineKind;\n content: string;\n contentOffset: number;\n escapedMarker: boolean;\n modificationRanges?: Array<[number, number]>;\n}\n\ninterface DiffDisplayLineNumbers {\n oldLine: number | null;\n newLine: number | null;\n}\n\n// ============================================================================\n// Widgets\n// ============================================================================\n\n/**\n * Widget for the compact code block hover toolbar.\n */\nclass CodeBlockToolbarWidget extends WidgetType {\n constructor(\n private props: CodeBlockProperties,\n private codeContent: string,\n private codeInfo: string,\n private openingLineFrom: number,\n private openingLineTo: number,\n private openingFence: string,\n private forceVisible: boolean\n ) {\n super();\n }\n\n /** Creates the toolbar DOM element with language switcher and copy button. */\n toDOM(view: EditorView): HTMLElement {\n const toolbar = document.createElement(\"div\") as ToolbarElement;\n toolbar.className = \"cm-mardora-code-toolbar\";\n if (this.forceVisible) {\n toolbar.classList.add(\"is-visible\");\n }\n toolbar.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n toolbar.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n });\n\n const languageControl = this.createLanguageControl(view, toolbar);\n toolbar.appendChild(languageControl);\n\n if (this.props.copy !== false) {\n const copyBtn = document.createElement(\"button\");\n copyBtn.className = \"cm-mardora-code-copy-btn\";\n copyBtn.type = \"button\";\n copyBtn.title = \"Copy code\";\n copyBtn.setAttribute(\"aria-label\", \"Copy code\");\n copyBtn.innerHTML = COPY_ICON;\n\n copyBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n void copyCodeTextToClipboard(this.codeContent, copyBtn.ownerDocument).then(() => {\n markCodeCopyButtonCopied(copyBtn);\n });\n });\n\n toolbar.appendChild(copyBtn);\n }\n\n requestAnimationFrame(() => this.bindHoverLines(toolbar));\n return toolbar;\n }\n\n /** Checks equality for widget reuse optimization. */\n override eq(other: CodeBlockToolbarWidget): boolean {\n return (\n this.props.title === other.props.title &&\n this.props.language === other.props.language &&\n this.props.copy === other.props.copy &&\n this.codeContent === other.codeContent &&\n this.codeInfo === other.codeInfo &&\n this.openingLineFrom === other.openingLineFrom &&\n this.openingLineTo === other.openingLineTo &&\n this.openingFence === other.openingFence &&\n this.forceVisible === other.forceVisible\n );\n }\n\n override destroy(dom: HTMLElement): void {\n const toolbar = dom as ToolbarElement;\n toolbar.__mardoraDestroyToolbar?.();\n }\n\n /** Allow click events to propagate for toolbar interaction. */\n override ignoreEvent(): boolean {\n return false;\n }\n\n private createLanguageControl(view: EditorView, toolbar: ToolbarElement): HTMLElement {\n const control = document.createElement(\"div\");\n control.className = \"cm-mardora-code-language-control\";\n\n const button = document.createElement(\"button\");\n button.className = \"cm-mardora-code-language-button\";\n button.type = \"button\";\n button.setAttribute(\"aria-haspopup\", \"listbox\");\n button.setAttribute(\"aria-expanded\", \"false\");\n button.innerHTML = `<span>${this.escapeHtml(formatLanguageLabel(this.props.language))}</span>${CHEVRON_DOWN_ICON}`;\n\n const menu = document.createElement(\"div\");\n menu.className = \"cm-mardora-code-language-menu\";\n menu.setAttribute(\"role\", \"listbox\");\n menu.hidden = true;\n\n const searchWrap = document.createElement(\"label\");\n searchWrap.className = \"cm-mardora-code-language-search\";\n const searchInput = document.createElement(\"input\");\n searchInput.type = \"search\";\n searchInput.placeholder = \"Search...\";\n searchInput.autocomplete = \"off\";\n searchInput.spellcheck = false;\n const searchIcon = document.createElement(\"span\");\n searchIcon.className = \"cm-mardora-code-language-search-icon\";\n searchIcon.innerHTML = SEARCH_ICON;\n searchWrap.append(searchInput, searchIcon);\n\n const list = document.createElement(\"div\");\n list.className = \"cm-mardora-code-language-list\";\n menu.append(searchWrap, list);\n control.append(button, menu);\n\n const closeMenu = () => {\n menu.hidden = true;\n toolbar.classList.remove(\"is-menu-open\");\n button.setAttribute(\"aria-expanded\", \"false\");\n toolbar.ownerDocument.removeEventListener(\"pointerdown\", handleOutsidePointerDown, true);\n };\n\n const renderList = () => {\n const query = searchInput.value.trim().toLowerCase();\n list.textContent = \"\";\n\n for (const [label, value] of codeLanguageOptions) {\n const searchable = `${label} ${value}`.toLowerCase();\n if (query && !searchable.includes(query)) continue;\n\n const item = document.createElement(\"button\");\n item.className = \"cm-mardora-code-language-item\";\n item.type = \"button\";\n item.setAttribute(\"role\", \"option\");\n item.setAttribute(\"data-language\", value);\n const selected = this.props.language.trim().toLowerCase() === value.toLowerCase();\n item.setAttribute(\"aria-selected\", String(selected));\n item.innerHTML = `<span>${this.escapeHtml(label)}</span>${selected ? LANGUAGE_SELECTED_ICON : \"\"}`;\n item.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n const nextInfo = replaceCodeInfoLanguage(this.codeInfo, value);\n view.dispatch({\n changes: {\n from: this.openingLineFrom,\n to: this.openingLineTo,\n insert: `${this.openingFence}${nextInfo ? nextInfo : \"\"}`,\n },\n selection: view.state.selection,\n scrollIntoView: false,\n });\n closeMenu();\n view.focus();\n });\n list.appendChild(item);\n }\n };\n\n const openMenu = () => {\n renderList();\n menu.hidden = false;\n toolbar.classList.add(\"is-menu-open\");\n button.setAttribute(\"aria-expanded\", \"true\");\n toolbar.ownerDocument.addEventListener(\"pointerdown\", handleOutsidePointerDown, true);\n searchInput.focus();\n };\n\n const handleOutsidePointerDown = (event: PointerEvent) => {\n if (toolbar.contains(event.target as Node | null)) return;\n closeMenu();\n };\n\n button.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (menu.hidden) {\n openMenu();\n } else {\n closeMenu();\n }\n });\n\n searchInput.addEventListener(\"input\", renderList);\n searchInput.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeMenu();\n view.focus();\n }\n });\n\n toolbar.__mardoraDestroyToolbar = () => closeMenu();\n return control;\n }\n\n private bindHoverLines(toolbar: HTMLElement): void {\n const firstLine = toolbar.closest(\".cm-line\");\n if (!(firstLine instanceof HTMLElement)) return;\n const editorRoot = firstLine.closest(\".cm-editor\");\n if (!(editorRoot instanceof HTMLElement)) return;\n\n const codeLines: HTMLElement[] = [];\n let current: Element | null = firstLine;\n\n while (current instanceof HTMLElement && current.classList.contains(\"cm-mardora-code-block-line\")) {\n codeLines.push(current);\n if (current.classList.contains(\"cm-mardora-code-block-line-end\")) break;\n current = current.nextElementSibling;\n }\n\n const rectContains = (rect: DOMRect, event: MouseEvent) =>\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom;\n\n const updateVisibility = (event: MouseEvent) => {\n const overCodeBlock = codeLines.some((line) => rectContains(line.getBoundingClientRect(), event));\n const overToolbar = rectContains(toolbar.getBoundingClientRect(), event);\n if (this.forceVisible || overCodeBlock || overToolbar || toolbar.classList.contains(\"is-menu-open\")) {\n toolbar.classList.add(\"is-visible\");\n } else {\n toolbar.classList.remove(\"is-visible\");\n }\n };\n const hide = () => {\n if (this.forceVisible) {\n toolbar.classList.add(\"is-visible\");\n return;\n }\n if (!toolbar.classList.contains(\"is-menu-open\")) toolbar.classList.remove(\"is-visible\");\n };\n\n editorRoot.addEventListener(\"mousemove\", updateVisibility);\n editorRoot.addEventListener(\"mouseleave\", hide);\n\n const existingDestroy = (toolbar as ToolbarElement).__mardoraDestroyToolbar;\n (toolbar as ToolbarElement).__mardoraDestroyToolbar = () => {\n existingDestroy?.();\n editorRoot.removeEventListener(\"mousemove\", updateVisibility);\n editorRoot.removeEventListener(\"mouseleave\", hide);\n };\n }\n\n private escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n }\n}\n\n/**\n * Widget for code block caption.\n * Displays descriptive text below the code block.\n */\nclass CodeBlockCaptionWidget extends WidgetType {\n constructor(private caption: string) {\n super();\n }\n\n /** Creates the caption DOM element. */\n toDOM(): HTMLElement {\n const captionEl = document.createElement(\"div\");\n captionEl.className = \"cm-mardora-code-caption\";\n captionEl.textContent = this.caption;\n return captionEl;\n }\n\n /** Checks equality for widget reuse optimization. */\n override eq(other: CodeBlockCaptionWidget): boolean {\n return this.caption === other.caption;\n }\n\n /** Allow click events to propagate for caption interaction. */\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n// ============================================================================\n// Plugin\n// ============================================================================\n\n/**\n * CodePlugin - Handles inline code and fenced code blocks.\n *\n * **Inline code:** `code`\n * Hides backticks when cursor is not in range.\n *\n * **Fenced code blocks:**\n * Supports syntax highlighting, line numbers, line/text highlighting,\n * title, caption, and copy button via CodeInfo properties.\n *\n * @example\n * ```tsx line-numbers{5} title=\"example.tsx\" {2-4} /pattern/\n * const x = 1;\n * ```\n */\nexport class CodePlugin extends DecorationPlugin {\n readonly name = \"code\";\n readonly version = \"1.0.0\";\n override decorationPriority = 25;\n override readonly requiredNodes = [\"InlineCode\", \"FencedCode\", \"CodeMark\", \"CodeInfo\", \"CodeText\"] as const;\n private readonly parserCache = new Map<string, Promise<Parser | null>>();\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Keyboard shortcuts for code formatting\n */\n override getKeymap(): KeyBinding[] {\n return [\n {\n key: \"Mod-e\",\n run: toggleMarkdownStyle(\"`\"),\n preventDefault: true,\n },\n {\n key: \"Mod-Shift-e\",\n run: (view) => this.toggleCodeBlock(view),\n preventDefault: true,\n },\n ];\n }\n\n /**\n * Intercepts backtick typing to wrap selected text as inline code.\n *\n * If user types '`' while text is selected, wraps each selected range\n * with backticks (selected -> `selected`).\n */\n override getExtensions(): Extension[] {\n return [\n createCodeFenceAutoCloseTransactionFilter(),\n createCodeFenceAutoCloseBeforeInputHandler(),\n createCodeFenceAutoCloseInputHandler(),\n createWrapSelectionInputHandler({ \"`\": \"`\" }),\n ];\n }\n\n /**\n * Toggle code block on current line or selected lines\n */\n private toggleCodeBlock(view: EditorView): boolean {\n const { state } = view;\n const { from, to } = state.selection.main;\n\n // Get all lines in selection\n const startLine = state.doc.lineAt(from);\n const endLine = state.doc.lineAt(to);\n\n // Check if lines are already in a code block\n const prevLineNum = startLine.number > 1 ? startLine.number - 1 : startLine.number;\n const nextLineNum = endLine.number < state.doc.lines ? endLine.number + 1 : endLine.number;\n\n const prevLine = state.doc.line(prevLineNum);\n const nextLine = state.doc.line(nextLineNum);\n\n const isWrapped =\n prevLine.text.trim().startsWith(CODE_FENCE) &&\n nextLine.text.trim() === CODE_FENCE &&\n prevLineNum !== startLine.number &&\n nextLineNum !== endLine.number;\n\n if (isWrapped) {\n // Remove the fence lines\n view.dispatch({\n changes: [\n { from: prevLine.from, to: prevLine.to + 1, insert: \"\" }, // Remove opening fence + newline\n { from: nextLine.from - 1, to: nextLine.to, insert: \"\" }, // Remove newline + closing fence\n ],\n });\n } else {\n // Wrap with code fence\n const openFence = `${CODE_FENCE}\\n`;\n const closeFence = `\\n${CODE_FENCE}`;\n\n view.dispatch({\n changes: [\n { from: startLine.from, insert: openFence },\n { from: endLine.to, insert: closeFence },\n ],\n selection: { anchor: startLine.from + openFence.length, head: endLine.to + openFence.length },\n });\n }\n\n return true;\n }\n\n /**\n * Parse CodeInfo string into structured properties\n *\n * @param codeInfo - The raw CodeInfo string (e.g., \"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\n * @returns Parsed CodeBlockProperties object\n *\n * @example\n * ```typescript\n * parseCodeInfo(\"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\n * ```\n *\n * Returns:\n * ```json\n * {\n * language: \"tsx\",\n * lineNumbers: 5,\n * title: \"hello.tsx\",\n * copy: true,\n * diff: false,\n * highlightLines: [2,3,4,5],\n * highlightText: [{ pattern: \"Hello\", instances: [3,4,5] }]\n * }\n * ```\n */\n parseCodeInfo(codeInfo: string): CodeBlockProperties {\n const props: CodeBlockProperties = { language: \"\" };\n\n if (!codeInfo || !codeInfo.trim()) {\n return props;\n }\n\n let remaining = codeInfo.trim();\n\n // Extract language (first token), but only when it isn't a known directive.\n const firstTokenMatch = remaining.match(/^([^\\s]+)/);\n if (firstTokenMatch && firstTokenMatch[1]) {\n const firstToken = firstTokenMatch[1];\n if (!isCodeInfoDirective(firstToken)) {\n props.language = firstToken;\n remaining = remaining.slice(firstToken.length).trim();\n }\n }\n\n // Extract quoted values (title=\"...\" caption=\"...\")\n let quotedMatch;\n while ((quotedMatch = QUOTED_INFO_PATTERN.exec(remaining)) !== null) {\n const key = quotedMatch[1]?.toLowerCase();\n const value = quotedMatch[2];\n\n if (key === \"title\" && value !== undefined) {\n props.title = value;\n } else if (key === \"caption\" && value !== undefined) {\n props.caption = value;\n }\n }\n // Remove matched quoted values\n remaining = remaining.replace(QUOTED_INFO_PATTERN, \"\").trim();\n\n // Check for line numbers with optional start value.\n // Supports both `line-numbers` and legacy `showLineNumbers` tokens.\n const lineNumbersMatch = remaining.match(/\\b(?:line-numbers|lineNumbers|showLineNumbers)(?:\\{(\\d+)\\})?/i);\n if (lineNumbersMatch) {\n if (lineNumbersMatch[1]) {\n props.showLineNumbers = parseInt(lineNumbersMatch[1], 10);\n } else {\n props.showLineNumbers = true;\n }\n remaining = remaining.replace(lineNumbersMatch[0], \"\").trim();\n }\n\n // Check for copy flag\n if (/\\bcopy\\b/.test(remaining)) {\n props.copy = true;\n remaining = remaining.replace(/\\bcopy\\b/, \"\").trim();\n }\n\n // Check for diff flag\n if (/\\bdiff\\b/.test(remaining)) {\n props.diff = true;\n remaining = remaining.replace(/\\bdiff\\b/, \"\").trim();\n }\n\n // Extract line highlights {2-4,5,9}\n const lineHighlightMatch = remaining.match(/\\{([^}]+)\\}/);\n if (lineHighlightMatch && lineHighlightMatch[1]) {\n const highlightLines = this.parseNumberList(lineHighlightMatch[1]);\n\n if (highlightLines.length > 0) {\n props.highlightLines = highlightLines;\n }\n remaining = remaining.replace(lineHighlightMatch[0], \"\").trim();\n }\n\n // Extract text/regex highlights /pattern/ or /pattern/3-5 or /pattern/3,5\n let textMatch;\n const highlightText: TextHighlight[] = [];\n\n while ((textMatch = TEXT_HIGHLIGHT_PATTERN.exec(remaining)) !== null) {\n if (!textMatch[1]) continue;\n const highlight: TextHighlight = {\n pattern: textMatch[1],\n };\n\n // Parse instance selection if present\n if (textMatch[2]) {\n const instances = this.parseNumberList(textMatch[2]);\n\n if (instances.length > 0) {\n highlight.instances = instances;\n }\n }\n\n highlightText.push(highlight);\n }\n\n if (highlightText.length > 0) {\n props.highlightText = highlightText;\n }\n\n return props;\n }\n\n /**\n * Build decorations for inline code and fenced code blocks.\n * Handles line numbers, highlights, header/caption widgets, and fence visibility.\n */\n buildDecorations(ctx: DecorationContext): void {\n const tree = syntaxTree(ctx.view.state);\n\n tree.iterate({\n enter: (node) => {\n if (node.name === \"InlineCode\") {\n this.decorateInlineCode(node, ctx);\n return;\n }\n\n if (node.name === \"FencedCode\") {\n this.decorateFencedCode(node, ctx);\n }\n },\n });\n }\n\n private decorateInlineCode(node: { from: number; to: number; node: SyntaxNode }, ctx: DecorationContext): void {\n const { from, to } = node;\n ctx.decorations.push(codeMarkDecorations[\"inline-code\"].range(from, to));\n\n if (ctx.selectionOverlapsRange(from, to)) {\n return;\n }\n\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"CodeMark\") {\n ctx.decorations.push(codeMarkDecorations[\"inline-mark\"].range(child.from, child.to));\n }\n }\n }\n\n private decorateFencedCode(node: { from: number; to: number; node: SyntaxNode }, ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const nodeLineStart = view.state.doc.lineAt(node.from);\n const nodeLineEnd = view.state.doc.lineAt(node.to);\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\n\n let infoProps: CodeBlockProperties = { language: \"\" };\n let codeContent = \"\";\n let codeInfo = \"\";\n\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"CodeInfo\") {\n codeInfo = view.state.sliceDoc(child.from, child.to).trim();\n infoProps = this.parseCodeInfo(codeInfo);\n }\n if (child.name === \"CodeText\") {\n codeContent = view.state.sliceDoc(child.from, child.to);\n }\n }\n\n const openingLineText = view.state.sliceDoc(nodeLineStart.from, nodeLineStart.to);\n const openingFenceMatch = openingLineText.match(/^(\\s*)(```+|~~~+)/);\n const openingFence = openingFenceMatch ? `${openingFenceMatch[1] ?? \"\"}${openingFenceMatch[2] ?? CODE_FENCE}` : CODE_FENCE;\n\n const codeLines: string[] = [];\n for (let i = nodeLineStart.number + 1; i <= nodeLineEnd.number - 1; i++) {\n const codeLine = view.state.doc.line(i);\n codeLines.push(view.state.sliceDoc(codeLine.from, codeLine.to));\n }\n\n const totalCodeLines = nodeLineEnd.number - nodeLineStart.number - 1;\n const startLineNum = typeof infoProps.showLineNumbers === \"number\" ? infoProps.showLineNumbers : 1;\n const maxLineNum = startLineNum + totalCodeLines - 1;\n const lineNumWidth = Math.max(String(maxLineNum).length, String(startLineNum).length);\n const highlightInstanceCounters = new Array(infoProps.highlightText?.length ?? 0).fill(0);\n\n const diffStates = infoProps.diff ? this.analyzeDiffLines(codeLines) : [];\n const diffDisplayLineNumbers = infoProps.diff ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum) : [];\n const displayLineNumbers = infoProps.diff\n ? diffDisplayLineNumbers.map((numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index)\n : codeLines.map((_, index) => startLineNum + index);\n const diffHighlightLineNumbers = infoProps.diff\n ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum).map(\n (numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index\n )\n : [];\n const maxOldDiffLineNum = diffDisplayLineNumbers.reduce((max, numbers) => {\n const oldLine = numbers.oldLine ?? 0;\n return oldLine > max ? oldLine : max;\n }, startLineNum);\n const maxNewDiffLineNum = diffDisplayLineNumbers.reduce((max, numbers) => {\n const newLine = numbers.newLine ?? 0;\n return newLine > max ? newLine : max;\n }, startLineNum);\n const diffOldLineNumWidth = Math.max(String(startLineNum).length, String(maxOldDiffLineNum).length);\n const diffNewLineNumWidth = Math.max(String(startLineNum).length, String(maxNewDiffLineNum).length);\n\n const shouldShowCaption = !cursorInRange && !!infoProps.caption;\n\n const firstContentLineNumber = nodeLineStart.number + 1;\n const lastContentLineNumber = nodeLineEnd.number - 1;\n const toolbarLineNumber =\n firstContentLineNumber <= lastContentLineNumber ? firstContentLineNumber : nodeLineStart.number;\n const toolbarLine = view.state.doc.line(toolbarLineNumber);\n\n decorations.push(\n Decoration.widget({\n widget: new CodeBlockToolbarWidget(\n infoProps,\n codeContent,\n codeInfo,\n nodeLineStart.from,\n nodeLineStart.to,\n openingFence,\n cursorInRange\n ),\n block: false,\n side: -1,\n }).range(toolbarLine.from)\n );\n\n let codeLineIndex = 0;\n for (let lineNumber = nodeLineStart.number; lineNumber <= nodeLineEnd.number; lineNumber++) {\n const line = view.state.doc.line(lineNumber);\n const isFenceLine = lineNumber === nodeLineStart.number || lineNumber === nodeLineEnd.number;\n const relativeLineNum = displayLineNumbers[codeLineIndex] ?? startLineNum + codeLineIndex;\n\n if (isFenceLine) {\n decorations.push(codeMarkDecorations[\"code-fence-line\"].range(line.from));\n continue;\n }\n\n decorations.push(codeMarkDecorations[\"code-block-line\"].range(line.from));\n if (!cursorInRange) {\n decorations.push(codeMarkDecorations[\"code-block-rendered\"].range(line.from));\n }\n\n if (lineNumber === firstContentLineNumber) {\n decorations.push(codeMarkDecorations[\"code-block-line-start\"].range(line.from));\n }\n\n if (lineNumber === lastContentLineNumber) {\n decorations.push(codeMarkDecorations[\"code-block-line-end\"].range(line.from));\n if (shouldShowCaption) {\n decorations.push(Decoration.line({ class: \"cm-mardora-code-block-has-caption\" }).range(line.from));\n }\n }\n\n if (firstContentLineNumber === lastContentLineNumber) {\n decorations.push(codeMarkDecorations[\"code-block-single-line\"].range(line.from));\n }\n\n if (!isFenceLine && infoProps.showLineNumbers && !infoProps.diff) {\n decorations.push(\n Decoration.line({\n class: \"cm-mardora-code-line-numbered\",\n attributes: {\n \"data-line-num\": String(relativeLineNum),\n style: `--line-num-width: ${lineNumWidth}ch`,\n },\n }).range(line.from)\n );\n }\n\n if (!isFenceLine && infoProps.showLineNumbers && infoProps.diff) {\n const diffLineNumbers = diffDisplayLineNumbers[codeLineIndex];\n const diffState = diffStates[codeLineIndex];\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\n decorations.push(\n Decoration.line({\n class: \"cm-mardora-code-line-numbered-diff\",\n attributes: {\n \"data-line-num-old\": diffLineNumbers?.oldLine != null ? String(diffLineNumbers.oldLine) : \"\",\n \"data-line-num-new\": diffLineNumbers?.newLine != null ? String(diffLineNumbers.newLine) : \"\",\n \"data-diff-marker\": diffMarker,\n style: `--line-num-old-width: ${diffOldLineNumWidth}ch; --line-num-new-width: ${diffNewLineNumWidth}ch`,\n },\n }).range(line.from)\n );\n }\n\n if (!isFenceLine && infoProps.diff) {\n this.decorateDiffLine(line, codeLineIndex, diffStates, cursorInRange, !infoProps.showLineNumbers, decorations);\n }\n\n if (!isFenceLine && infoProps.highlightLines) {\n const highlightLineNumber = infoProps.diff\n ? (diffHighlightLineNumbers[codeLineIndex] ?? codeLineIndex + 1)\n : startLineNum + codeLineIndex;\n if (infoProps.highlightLines.includes(highlightLineNumber)) {\n decorations.push(codeMarkDecorations[\"code-line-highlight\"].range(line.from));\n }\n }\n\n if (!isFenceLine && infoProps.highlightText?.length) {\n this.decorateTextHighlights(\n line.from,\n view.state.sliceDoc(line.from, line.to),\n infoProps.highlightText,\n highlightInstanceCounters,\n decorations\n );\n }\n\n if (!isFenceLine) {\n codeLineIndex++;\n }\n }\n\n this.decorateFenceMarkers(node.node, decorations);\n\n if (!cursorInRange && infoProps.caption) {\n decorations.push(\n Decoration.widget({\n widget: new CodeBlockCaptionWidget(infoProps.caption),\n block: false,\n side: 1,\n }).range(nodeLineEnd.to)\n );\n }\n }\n\n private decorateFenceMarkers(\n node: SyntaxNode,\n decorations: DecorationContext[\"decorations\"]\n ): void {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"CodeMark\") {\n decorations.push(codeMarkDecorations[\"code-hidden\"].range(child.from, child.to));\n continue;\n }\n\n if (child.name === \"CodeInfo\") {\n decorations.push(codeMarkDecorations[\"code-hidden\"].range(child.from, child.to));\n }\n }\n }\n\n private decorateDiffLine(\n line: { from: number; to: number },\n codeLineIndex: number,\n diffStates: DiffLineState[],\n cursorInRange: boolean,\n showDiffMarkerGutter: boolean,\n decorations: DecorationContext[\"decorations\"]\n ): void {\n const diffState = diffStates[codeLineIndex];\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\n\n if (showDiffMarkerGutter) {\n decorations.push(\n Decoration.line({\n class: \"cm-mardora-code-line-diff-gutter\",\n attributes: {\n \"data-diff-marker\": diffMarker,\n },\n }).range(line.from)\n );\n }\n\n if (diffState?.kind === \"addition\") {\n decorations.push(codeMarkDecorations[\"diff-line-add\"].range(line.from));\n if (cursorInRange && line.to > line.from) {\n decorations.push(codeMarkDecorations[\"diff-sign-add\"].range(line.from, line.from + 1));\n }\n }\n\n if (diffState?.kind === \"deletion\") {\n decorations.push(codeMarkDecorations[\"diff-line-del\"].range(line.from));\n if (cursorInRange && line.to > line.from) {\n decorations.push(codeMarkDecorations[\"diff-sign-del\"].range(line.from, line.from + 1));\n }\n }\n\n if (\n !cursorInRange &&\n line.to > line.from &&\n (diffState?.escapedMarker || diffState?.kind === \"addition\" || diffState?.kind === \"deletion\")\n ) {\n decorations.push(codeMarkDecorations[\"diff-escape-hidden\"].range(line.from, line.from + 1));\n }\n\n if (diffState?.modificationRanges?.length) {\n for (const [start, end] of diffState.modificationRanges) {\n const rangeFrom = line.from + diffState.contentOffset + start;\n const rangeTo = line.from + diffState.contentOffset + end;\n if (rangeTo > rangeFrom) {\n decorations.push(\n (diffState.kind === \"addition\"\n ? codeMarkDecorations[\"diff-mod-add\"]\n : codeMarkDecorations[\"diff-mod-del\"]\n ).range(rangeFrom, rangeTo)\n );\n }\n }\n }\n }\n\n private decorateTextHighlights(\n lineFrom: number,\n lineText: string,\n highlights: TextHighlight[],\n instanceCounters: number[],\n decorations: DecorationContext[\"decorations\"]\n ): void {\n for (const [highlightIndex, textHighlight] of highlights.entries()) {\n try {\n const regex = new RegExp(textHighlight.pattern, \"g\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(lineText)) !== null) {\n instanceCounters[highlightIndex] = (instanceCounters[highlightIndex] ?? 0) + 1;\n const globalMatchIndex = instanceCounters[highlightIndex];\n const shouldHighlight = !textHighlight.instances || textHighlight.instances.includes(globalMatchIndex);\n\n if (shouldHighlight) {\n const matchFrom = lineFrom + match.index;\n const matchTo = matchFrom + match[0].length;\n decorations.push(codeMarkDecorations[\"code-text-highlight\"].range(matchFrom, matchTo));\n }\n }\n } catch {\n // Invalid regex; ignore this highlight pattern.\n }\n }\n }\n\n /**\n * Render code elements to HTML for static preview.\n * Applies syntax highlighting using @lezer/highlight.\n */\n override async renderToHTML(node: SyntaxNode, _children: string, ctx: PreviewRenderContext): Promise<string | null> {\n // Hide CodeMark (backticks)\n if (node.name === \"CodeMark\") {\n return \"\";\n }\n\n // Inline code\n if (node.name === \"InlineCode\") {\n // Extract content without backticks\n let content = ctx.sliceDoc(node.from, node.to);\n // Remove leading and trailing backticks\n const match = content.match(/^`+(.+?)`+$/s);\n if (match && match[1]) {\n content = match[1];\n }\n return `<code class=\"cm-mardora-code-inline\" style=\"padding: 0.1rem 0.25rem\">${this.escapeHtml(content)}</code>`;\n }\n\n // Fenced code block\n if (node.name === \"FencedCode\") {\n const content = ctx.sliceDoc(node.from, node.to);\n const lines = content.split(\"\\n\");\n\n // Extract info string from first line (everything after ```)\n const firstLine = lines[0] || \"\";\n const infoMatch = firstLine.match(/^```(.*)$/);\n const infoString = infoMatch?.[1]?.trim() || \"\";\n\n // Parse properties from info string\n const props = this.parseCodeInfo(infoString);\n\n // Get code content (without fence lines)\n const codeLines = lines.slice(1, -1);\n const code = codeLines.join(\"\\n\");\n\n // Build HTML parts\n let html = \"\";\n\n // Wrapper container\n html += `<div class=\"cm-mardora-code-container\">`;\n\n html += `<div class=\"cm-mardora-code-toolbar\">`;\n html += `<button class=\"cm-mardora-code-language-button\" type=\"button\"${props.language ? ` data-lang=\"${this.escapeAttribute(props.language)}\"` : \"\"}>`;\n html += `<span>${this.escapeHtml(formatLanguageLabel(props.language))}</span>${CHEVRON_DOWN_ICON}`;\n html += `</button>`;\n if (props.copy !== false) {\n // Encode code as base64 to safely store in data attribute (preserves newlines and special chars)\n const encodedCode = encodeCodeCopyPayload(code);\n html += `<button class=\"cm-mardora-code-copy-btn\" type=\"button\" title=\"Copy code\" data-code=\"${encodedCode}\" data-encoded=\"true\">`;\n html += COPY_ICON;\n html += `</button>`;\n }\n html += `</div>`;\n\n // Calculate line number info\n const startLineNum = typeof props.showLineNumbers === \"number\" ? props.showLineNumbers : 1;\n const previewHighlightCounters = new Array(props.highlightText?.length ?? 0).fill(0);\n const diffStates = props.diff ? this.analyzeDiffLines(codeLines) : [];\n const previewDiffLineNumbers = props.diff ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum) : [];\n const previewLineNumbers = props.diff\n ? previewDiffLineNumbers.map((numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index)\n : codeLines.map((_, index) => startLineNum + index);\n const previewHighlightLineNumbers = props.diff\n ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum).map(\n (numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index\n )\n : [];\n const lineNumWidth = String(Math.max(...previewLineNumbers, startLineNum)).length;\n const previewOldLineNumWidth = String(\n Math.max(...previewDiffLineNumbers.map((numbers) => numbers.oldLine ?? 0), startLineNum)\n ).length;\n const previewNewLineNumWidth = String(\n Math.max(...previewDiffLineNumbers.map((numbers) => numbers.newLine ?? 0), startLineNum)\n ).length;\n const previewContentLines = props.diff ? diffStates.map((state) => state.content) : codeLines;\n const highlightedLines = await this.highlightCodeLines(\n previewContentLines.join(\"\\n\"),\n props.language || \"\",\n ctx.syntaxHighlighters\n );\n\n // Code block with line processing\n const hasCaption = props.caption ? \" cm-mardora-code-block-has-caption\" : \"\";\n html += `<pre class=\"cm-mardora-code-block${hasCaption}\"${props.language ? ` data-lang=\"${this.escapeAttribute(props.language)}\"` : \"\"}>`;\n html += `<code>`;\n\n // Process each line\n codeLines.forEach((line, index) => {\n const lineNum = previewLineNumbers[index] ?? startLineNum + index;\n const highlightLineNumber = props.diff\n ? (previewHighlightLineNumbers[index] ?? startLineNum + index)\n : startLineNum + index;\n const isHighlighted = props.highlightLines?.includes(highlightLineNumber);\n const diffState = props.diff ? diffStates[index] : undefined;\n const diffLineNumbers = props.diff ? previewDiffLineNumbers[index] : undefined;\n\n // Line classes\n const lineClasses: string[] = [\"cm-mardora-code-line\"];\n if (isHighlighted) lineClasses.push(\"cm-mardora-code-line-highlight\");\n if (props.showLineNumbers) {\n lineClasses.push(props.diff ? \"cm-mardora-code-line-numbered-diff\" : \"cm-mardora-code-line-numbered\");\n }\n if (diffState?.kind === \"addition\") lineClasses.push(\"cm-mardora-code-line-diff-add\");\n if (diffState?.kind === \"deletion\") lineClasses.push(\"cm-mardora-code-line-diff-del\");\n\n // Line attributes\n const lineAttrs: string[] = [`class=\"${lineClasses.join(\" \")}\"`];\n if (props.showLineNumbers && !props.diff) {\n lineAttrs.push(`data-line-num=\"${lineNum}\"`);\n lineAttrs.push(`style=\"--line-num-width: ${lineNumWidth}ch\"`);\n }\n if (props.diff) {\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\n if (props.showLineNumbers) {\n lineAttrs.push(`data-line-num-old=\"${diffLineNumbers?.oldLine != null ? diffLineNumbers.oldLine : \"\"}\"`);\n lineAttrs.push(`data-line-num-new=\"${diffLineNumbers?.newLine != null ? diffLineNumbers.newLine : \"\"}\"`);\n lineAttrs.push(`data-diff-marker=\"${diffMarker}\"`);\n lineAttrs.push(\n `style=\"--line-num-old-width: ${previewOldLineNumWidth}ch; --line-num-new-width: ${previewNewLineNumWidth}ch\"`\n );\n } else {\n lineAttrs.push(`data-diff-marker=\"${diffMarker}\"`);\n lineClasses.push(\"cm-mardora-code-line-diff-gutter\");\n lineAttrs[0] = `class=\"${lineClasses.join(\" \")}\"`;\n }\n }\n\n // Highlight text content\n const highlightedLine = highlightedLines[index] ?? this.escapeHtml(previewContentLines[index] ?? line);\n let lineContent = highlightedLine;\n\n if (diffState) {\n lineContent = this.renderDiffPreviewLine(diffState, highlightedLine);\n }\n\n // Apply text highlights\n if (props.highlightText && props.highlightText.length > 0) {\n lineContent = this.applyTextHighlights(lineContent, props.highlightText, previewHighlightCounters);\n }\n\n html += `<span ${lineAttrs.join(\" \")}>${lineContent || \" \"}</span>`;\n });\n\n html += `</code></pre>`;\n\n // Caption\n if (props.caption) {\n html += `<div class=\"cm-mardora-code-caption\">${this.escapeHtml(props.caption)}</div>`;\n }\n\n // Close wrapper container\n html += `</div>`;\n\n return html;\n }\n\n // Hide CodeInfo and CodeText - they're handled by FencedCode\n if (node.name === \"CodeInfo\" || node.name === \"CodeText\") {\n return \"\";\n }\n\n return null;\n }\n\n /** Parse comma-separated numbers and ranges (e.g. \"1,3-5\") into [1,3,4,5]. */\n private parseNumberList(value: string): number[] {\n const result: number[] = [];\n\n for (const part of value.split(\",\")) {\n const trimmed = part.trim();\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/);\n\n if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n result.push(i);\n }\n continue;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n result.push(parseInt(trimmed, 10));\n }\n }\n\n return result;\n }\n\n /**\n * Highlight a single line of code using the language's Lezer parser.\n * Falls back to sanitized plain text if the language is not supported.\n */\n private async highlightCodeLines(\n code: string,\n lang: string,\n syntaxHighlighters?: readonly Highlighter[]\n ): Promise<string[]> {\n const rawLines = code.split(\"\\n\");\n if (!lang || !code) {\n return rawLines.map((line) => this.escapeHtml(line));\n }\n\n const parser = await this.resolveLanguageParser(lang);\n if (!parser) {\n return rawLines.map((line) => this.escapeHtml(line));\n }\n\n try {\n const tree = parser.parse(code);\n const highlightedLines: string[] = [\"\"];\n\n highlightCode(\n code,\n tree,\n syntaxHighlighters && syntaxHighlighters.length > 0 ? syntaxHighlighters : [],\n (text, classes) => {\n const chunk = classes\n ? `<span class=\"${this.escapeAttribute(classes)}\">${this.escapeHtml(text)}</span>`\n : this.escapeHtml(text);\n highlightedLines[highlightedLines.length - 1] += chunk;\n },\n () => {\n highlightedLines.push(\"\");\n }\n );\n\n return rawLines.map((line, index) => highlightedLines[index] || this.escapeHtml(line));\n } catch {\n return rawLines.map((line) => this.escapeHtml(line));\n }\n }\n\n private async resolveLanguageParser(lang: string): Promise<Parser | null> {\n const normalizedLang = this.normalizeLanguage(lang);\n if (!normalizedLang) return null;\n\n const cached = this.parserCache.get(normalizedLang);\n if (cached) return cached;\n\n const parserPromise = (async () => {\n const langDesc = LanguageDescription.matchLanguageName(languages, normalizedLang, true);\n\n if (!langDesc) return null;\n\n if (langDesc.support) {\n return langDesc.support.language.parser;\n }\n\n if (typeof langDesc.load === \"function\") {\n try {\n const support = await langDesc.load();\n return support.language.parser;\n } catch {\n return null;\n }\n }\n\n return null;\n })();\n\n this.parserCache.set(normalizedLang, parserPromise);\n return parserPromise;\n }\n\n private normalizeLanguage(lang: string): string {\n const normalized = lang.trim().toLowerCase();\n if (!normalized) return \"\";\n\n const normalizedMap: Record<string, string> = {\n \"c++\": \"cpp\",\n \"c#\": \"csharp\",\n \"f#\": \"fsharp\",\n py: \"python\",\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"shell\",\n };\n\n return normalizedMap[normalized] ?? normalized;\n }\n\n private escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n }\n\n private escapeAttribute(value: string): string {\n return this.escapeHtml(value).replace(/`/g, \"&#96;\");\n }\n\n private analyzeDiffLines(lines: string[]): DiffLineState[] {\n const states = lines.map((line) => this.parseDiffLineState(line));\n\n let index = 0;\n while (index < states.length) {\n if (states[index]?.kind !== \"deletion\") {\n index++;\n continue;\n }\n\n const deletionStart = index;\n while (index < states.length && states[index]?.kind === \"deletion\") {\n index++;\n }\n const deletionEnd = index;\n\n const additionStart = index;\n while (index < states.length && states[index]?.kind === \"addition\") {\n index++;\n }\n const additionEnd = index;\n\n if (additionStart === additionEnd) {\n continue;\n }\n\n const pairCount = Math.min(deletionEnd - deletionStart, additionEnd - additionStart);\n for (let pairIndex = 0; pairIndex < pairCount; pairIndex++) {\n const deletionState = states[deletionStart + pairIndex];\n const additionState = states[additionStart + pairIndex];\n\n if (!deletionState || !additionState) {\n continue;\n }\n\n const ranges = this.computeChangedRanges(deletionState.content, additionState.content);\n if (ranges.oldRanges.length > 0) {\n deletionState.modificationRanges = ranges.oldRanges;\n }\n if (ranges.newRanges.length > 0) {\n additionState.modificationRanges = ranges.newRanges;\n }\n }\n }\n\n return states;\n }\n\n private computeDiffDisplayLineNumbers(states: DiffLineState[], startLineNum: number): DiffDisplayLineNumbers[] {\n const numbers: DiffDisplayLineNumbers[] = [];\n let oldLineNumber = startLineNum;\n let newLineNumber = startLineNum;\n\n for (const state of states) {\n if (state.kind === \"deletion\") {\n numbers.push({ oldLine: oldLineNumber, newLine: null });\n oldLineNumber++;\n continue;\n }\n\n if (state.kind === \"addition\") {\n numbers.push({ oldLine: null, newLine: newLineNumber });\n newLineNumber++;\n continue;\n }\n\n numbers.push({ oldLine: oldLineNumber, newLine: newLineNumber });\n oldLineNumber++;\n newLineNumber++;\n }\n\n return numbers;\n }\n\n private parseDiffLineState(line: string): DiffLineState {\n const escapedMarker = line.startsWith(\"\\\\+\") || line.startsWith(\"\\\\-\");\n\n if (escapedMarker) {\n return {\n kind: \"normal\",\n content: line.slice(1),\n contentOffset: 1,\n escapedMarker: true,\n };\n }\n\n if (line.startsWith(\"+\")) {\n return {\n kind: \"addition\",\n content: line.slice(1),\n contentOffset: 1,\n escapedMarker: false,\n };\n }\n\n if (line.startsWith(\"-\")) {\n return {\n kind: \"deletion\",\n content: line.slice(1),\n contentOffset: 1,\n escapedMarker: false,\n };\n }\n\n return {\n kind: \"normal\",\n content: line,\n contentOffset: 0,\n escapedMarker: false,\n };\n }\n\n private computeChangedRanges(\n oldText: string,\n newText: string\n ): { oldRanges: Array<[number, number]>; newRanges: Array<[number, number]> } {\n let prefix = 0;\n while (prefix < oldText.length && prefix < newText.length && oldText[prefix] === newText[prefix]) {\n prefix++;\n }\n\n let oldSuffix = oldText.length;\n let newSuffix = newText.length;\n while (oldSuffix > prefix && newSuffix > prefix && oldText[oldSuffix - 1] === newText[newSuffix - 1]) {\n oldSuffix--;\n newSuffix--;\n }\n\n const oldRanges: Array<[number, number]> = [];\n const newRanges: Array<[number, number]> = [];\n\n if (oldSuffix > prefix) {\n oldRanges.push([prefix, oldSuffix]);\n }\n if (newSuffix > prefix) {\n newRanges.push([prefix, newSuffix]);\n }\n\n return { oldRanges, newRanges };\n }\n\n private renderDiffPreviewLine(diffState: DiffLineState, highlightedContent: string): string {\n const modClass =\n diffState.kind === \"addition\"\n ? \"cm-mardora-code-diff-mod-add\"\n : diffState.kind === \"deletion\"\n ? \"cm-mardora-code-diff-mod-del\"\n : \"\";\n\n const baseHighlightedContent = highlightedContent || this.escapeHtml(diffState.content);\n\n const contentHtml =\n diffState.modificationRanges && modClass\n ? this.applyRangesToHighlightedHTML(baseHighlightedContent, diffState.modificationRanges, modClass)\n : baseHighlightedContent;\n\n return contentHtml || \" \";\n }\n\n private applyRangesToHighlightedHTML(\n htmlContent: string,\n ranges: Array<[number, number]>,\n className: string\n ): string {\n const normalizedRanges = ranges\n .map(([start, end]) => [Math.max(0, start), Math.max(0, end)] as [number, number])\n .filter(([start, end]) => end > start)\n .sort((a, b) => a[0] - b[0]);\n\n if (normalizedRanges.length === 0 || !htmlContent) {\n return htmlContent;\n }\n\n const isInsideRange = (position: number) => {\n for (const [start, end] of normalizedRanges) {\n if (position >= start && position < end) return true;\n if (position < start) return false;\n }\n return false;\n };\n\n let result = \"\";\n let htmlIndex = 0;\n let textPosition = 0;\n let markOpen = false;\n\n while (htmlIndex < htmlContent.length) {\n const char = htmlContent[htmlIndex];\n\n if (char === \"<\") {\n const tagEnd = htmlContent.indexOf(\">\", htmlIndex);\n if (tagEnd === -1) {\n result += htmlContent.slice(htmlIndex);\n break;\n }\n result += htmlContent.slice(htmlIndex, tagEnd + 1);\n htmlIndex = tagEnd + 1;\n continue;\n }\n\n let token = char;\n if (char === \"&\") {\n const entityEnd = htmlContent.indexOf(\";\", htmlIndex);\n if (entityEnd !== -1) {\n token = htmlContent.slice(htmlIndex, entityEnd + 1);\n htmlIndex = entityEnd + 1;\n } else {\n htmlIndex += 1;\n }\n } else {\n htmlIndex += 1;\n }\n\n const shouldMark = isInsideRange(textPosition);\n\n if (shouldMark && !markOpen) {\n result += `<mark class=\"${className}\">`;\n markOpen = true;\n }\n if (!shouldMark && markOpen) {\n result += \"</mark>\";\n markOpen = false;\n }\n\n result += token;\n textPosition += 1;\n }\n\n if (markOpen) {\n result += \"</mark>\";\n }\n\n return result;\n }\n\n /**\n * Apply text highlights (regex patterns) to already syntax-highlighted HTML.\n * Wraps matched patterns in `<mark>` elements.\n */\n private applyTextHighlights(htmlContent: string, highlights: TextHighlight[], instanceCounters?: number[]): string {\n let result = htmlContent;\n\n for (const [highlightIndex, highlight] of highlights.entries()) {\n try {\n // Create regex from pattern\n const regex = new RegExp(`(${highlight.pattern})`, \"g\");\n let matchCount = instanceCounters?.[highlightIndex] ?? 0;\n\n result = result.replace(regex, (match) => {\n matchCount++;\n // Check if this instance should be highlighted\n const shouldHighlight = !highlight.instances || highlight.instances.includes(matchCount);\n if (shouldHighlight) {\n return `<mark class=\"cm-mardora-code-text-highlight\">${match}</mark>`;\n }\n return match;\n });\n\n if (instanceCounters) {\n instanceCounters[highlightIndex] = matchCount;\n }\n } catch {\n // Invalid regex, skip\n }\n }\n\n return result;\n }\n}\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\nimport { EditorState, Extension, TransactionSpec } from \"@codemirror/state\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { createMardoraIcon, type MardoraIconName } from \"../editor/icons\";\n\nexport type CalloutLabel = \"NOTE\" | \"TIP\" | \"IMPORTANT\" | \"WARNING\" | \"CAUTION\";\n\ntype CalloutInfo = {\n label: CalloutLabel;\n type: Lowercase<CalloutLabel>;\n};\n\nexport type CalloutTitleInputTarget = {\n anchor: number;\n changes?: {\n from: number;\n insert: string;\n };\n};\n\nexport type CalloutTypeChange = {\n from: number;\n to: number;\n insert: CalloutLabel;\n};\n\nconst calloutLabels: readonly CalloutLabel[] = [\"NOTE\", \"TIP\", \"IMPORTANT\", \"WARNING\", \"CAUTION\"];\nconst calloutIconMap: Record<CalloutLabel, MardoraIconName> = {\n NOTE: \"info\",\n TIP: \"lightbulb\",\n IMPORTANT: \"badge-alert\",\n WARNING: \"triangle-alert\",\n CAUTION: \"octagon-alert\",\n};\nconst calloutIconMarkupMap: Record<CalloutLabel, string> = {\n NOTE: '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M12 16v-4\"></path><path d=\"M12 8h.01\"></path>',\n TIP: '<path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"></path><path d=\"M9 18h6\"></path><path d=\"M10 22h4\"></path>',\n IMPORTANT:\n '<path d=\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"></path><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"></line><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"></line>',\n WARNING:\n '<path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"></path><path d=\"M12 9v4\"></path><path d=\"M12 17h.01\"></path>',\n CAUTION:\n '<path d=\"M12 16h.01\"></path><path d=\"M12 8v4\"></path><path d=\"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z\"></path>',\n};\nconst calloutMarkerPattern = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]$/i;\nconst calloutMarkerSearchPattern = /\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]/i;\nconst quotePrefixPattern = /^ {0,3}>\\s?/;\n\nfunction stripQuoteMarker(line: string): string {\n return line.replace(quotePrefixPattern, \"\");\n}\n\nexport function parseCalloutInfo(markdown: string): CalloutInfo | null {\n const firstLine = markdown.split(/\\r?\\n/, 1)[0] ?? \"\";\n const match = stripQuoteMarker(firstLine).trim().match(calloutMarkerPattern);\n\n if (!match?.[1]) {\n return null;\n }\n\n const label = match[1].toUpperCase() as CalloutLabel;\n return { label, type: label.toLowerCase() as Lowercase<CalloutLabel> };\n}\n\nfunction removeRenderedCalloutMarker(children: string, label: CalloutLabel): string {\n const markerPattern = new RegExp(`^(\\\\s*(?:<p\\\\b[^>]*>)?\\\\s*)\\\\[!${label}\\\\]\\\\s*(?:\\\\r?\\\\n)?\\\\s*`, \"i\");\n return children.replace(markerPattern, \"$1\");\n}\n\nfunction renderCalloutIconHTML(label: CalloutLabel): string {\n return `<svg class=\"cm-mardora-callout-title-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${calloutIconMarkupMap[label]}</svg>`;\n}\n\nfunction getQuotePrefixLength(line: string): number | null {\n const match = line.match(quotePrefixPattern);\n return match ? match[0].length : null;\n}\n\nexport function resolveCalloutTitleInputTarget(state: EditorState, pos: number): CalloutTitleInputTarget | null {\n const titleLine = state.doc.lineAt(pos);\n\n if (!parseCalloutInfo(titleLine.text)) {\n return null;\n }\n\n const bodyLineNumber = titleLine.number + 1;\n if (bodyLineNumber <= state.doc.lines) {\n const bodyLine = state.doc.line(bodyLineNumber);\n const quotePrefixLength = getQuotePrefixLength(bodyLine.text);\n\n if (quotePrefixLength !== null) {\n return {\n anchor: bodyLine.from + quotePrefixLength,\n };\n }\n }\n\n const insert = \"\\n> \";\n return {\n anchor: titleLine.to + insert.length,\n changes: {\n from: titleLine.to,\n insert,\n },\n };\n}\n\nexport function resolveCalloutTypeChange(\n state: EditorState,\n pos: number,\n nextLabel: CalloutLabel\n): CalloutTypeChange | null {\n const titleLine = state.doc.lineAt(pos);\n const callout = parseCalloutInfo(titleLine.text);\n if (!callout || callout.label === nextLabel) {\n return null;\n }\n\n const markerMatch = titleLine.text.match(calloutMarkerSearchPattern);\n if (!markerMatch?.[1] || markerMatch.index === undefined) {\n return null;\n }\n\n const typeFrom = titleLine.from + markerMatch.index + 2;\n return {\n from: typeFrom,\n to: typeFrom + markerMatch[1].length,\n insert: nextLabel,\n };\n}\n\nclass CalloutTitleWidget extends WidgetType {\n constructor(\n readonly info: CalloutInfo,\n readonly pos: number\n ) {\n super();\n }\n\n override eq(other: CalloutTitleWidget): boolean {\n return other.info.label === this.info.label && other.pos === this.pos;\n }\n\n toDOM(): HTMLElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cm-mardora-callout-title-button\";\n button.dataset.calloutLabel = this.info.label;\n button.dataset.calloutPos = String(this.pos);\n button.setAttribute(\"aria-haspopup\", \"menu\");\n button.setAttribute(\"aria-label\", `Switch ${this.info.label} callout type`);\n\n const icon = createMardoraIcon(calloutIconMap[this.info.label]);\n if (icon) {\n icon.classList.add(\"cm-mardora-callout-title-icon\");\n button.appendChild(icon);\n }\n\n const label = document.createElement(\"span\");\n label.textContent = this.info.label;\n button.appendChild(label);\n\n return button;\n }\n\n override ignoreEvent(event: Event): boolean {\n return event.type !== \"mousedown\" && event.type !== \"click\";\n }\n}\n\n/**\n * Mark decorations for blockquote elements\n */\nconst quoteMarkDecorations = {\n /** Decoration for the > marker */\n \"quote-mark\": Decoration.replace({}),\n /** Decoration for the quote content */\n \"quote-content\": Decoration.mark({ class: \"cm-mardora-quote-content\" }),\n /** Decoration for callout content */\n \"callout-content\": Decoration.mark({ class: \"cm-mardora-callout-content\" }),\n};\n\nfunction calloutMarkerDecoration(info: CalloutInfo, pos: number): Decoration {\n return Decoration.replace({ widget: new CalloutTitleWidget(info, pos) });\n}\n\n/**\n * Line decorations for blockquote lines\n */\nconst quoteLineDecorations = {\n /** Decoration for blockquote lines */\n \"quote-line\": Decoration.line({ class: \"cm-mardora-quote-line\" }),\n};\n\nfunction calloutLineDecoration(info: CalloutInfo, first: boolean): Decoration {\n const spec: { class: string; attributes?: { [key: string]: string } } = {\n class: [\"cm-mardora-callout-line\", `cm-mardora-callout-${info.type}`, first ? \"cm-mardora-callout-title-line\" : \"\"]\n .filter(Boolean)\n .join(\" \"),\n };\n\n return Decoration.line(spec);\n}\n\nfunction getQuoteMarkReplacementEnd(lineText: string, nodeTo: number, lineFrom: number): number {\n const restOfLine = lineText.slice(nodeTo - lineFrom);\n if (restOfLine.trim().length === 0) {\n return nodeTo;\n }\n\n return Math.min(nodeTo + 1, lineFrom + lineText.length);\n}\n\n/**\n * QuotePlugin - Decorates markdown blockquotes\n *\n * Adds visual styling to blockquotes (> prefixed lines)\n * - Line decorations for indicating quote blocks with a left border\n * - Mark decorations for quote content\n * - Hides > markers when cursor is not in the blockquote\n */\nexport class QuotePlugin extends DecorationPlugin {\n readonly name = \"quote\";\n readonly version = \"1.0.0\";\n override decorationPriority = 10;\n override readonly requiredNodes = [\"Blockquote\", \"QuoteMark\"] as const;\n private calloutTypeMenu: HTMLElement | null = null;\n private calloutTypeMenuDocument: Document | null = null;\n\n /**\n * Constructor - calls super constructor\n */\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n override getExtensions(): Extension[] {\n return [\n EditorView.domEventHandlers({\n keydown: (event) => this.handleKeyDown(event),\n mousedown: (event, view) => this.handleCalloutTitleMouseDown(event, view),\n }),\n ];\n }\n\n override onViewUpdate(update: import(\"@codemirror/view\").ViewUpdate): void {\n if (update.docChanged) {\n this.closeCalloutTypeMenu();\n }\n }\n\n override onUnregister(): void {\n this.closeCalloutTypeMenu();\n super.onUnregister();\n }\n\n private handleKeyDown(event: KeyboardEvent): boolean {\n if (event.key !== \"Escape\" || !this.calloutTypeMenu) {\n return false;\n }\n\n this.closeCalloutTypeMenu();\n event.preventDefault();\n return true;\n }\n\n private handleCalloutTitleMouseDown(event: MouseEvent, view: EditorView): boolean {\n if (event.button !== 0) {\n return false;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return false;\n }\n\n const titleButton = target.closest(\".cm-mardora-callout-title-button\");\n if (titleButton instanceof HTMLElement && view.dom.contains(titleButton)) {\n const pos = Number(titleButton.dataset.calloutPos);\n if (!Number.isFinite(pos)) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.openCalloutTypeMenu(view, titleButton, pos);\n return true;\n }\n\n const lineElement = target.closest(\".cm-mardora-callout-title-line\");\n if (!lineElement || !view.dom.contains(lineElement)) {\n return false;\n }\n\n let pos: number | null = null;\n try {\n pos = view.posAtDOM(lineElement, 0);\n } catch {\n pos = null;\n }\n\n pos ??= view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos === null) {\n return false;\n }\n\n const inputTarget = resolveCalloutTitleInputTarget(view.state, pos);\n if (!inputTarget) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const transaction: TransactionSpec = {\n selection: { anchor: inputTarget.anchor },\n scrollIntoView: true,\n };\n\n if (inputTarget.changes) {\n transaction.changes = inputTarget.changes;\n }\n\n view.dispatch(transaction);\n view.focus();\n return true;\n }\n\n private openCalloutTypeMenu(view: EditorView, button: HTMLElement, pos: number): void {\n this.closeCalloutTypeMenu();\n\n const current = parseCalloutInfo(view.state.doc.lineAt(pos).text);\n if (!current) {\n return;\n }\n\n const doc = view.dom.ownerDocument;\n const menu = doc.createElement(\"div\");\n menu.className = \"cm-mardora-callout-type-menu\";\n menu.setAttribute(\"role\", \"menu\");\n menu.setAttribute(\"aria-label\", \"Switch callout type\");\n\n for (const label of calloutLabels) {\n const item = doc.createElement(\"button\");\n item.type = \"button\";\n item.className = [\n \"cm-mardora-callout-type-menu-item\",\n `cm-mardora-callout-type-menu-item-${label.toLowerCase()}`,\n label === current.label ? \"cm-mardora-callout-type-menu-item-active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n item.setAttribute(\"role\", \"menuitem\");\n item.dataset.calloutLabel = label;\n if (label === current.label) {\n item.setAttribute(\"aria-current\", \"true\");\n }\n\n const icon = createMardoraIcon(calloutIconMap[label]);\n if (icon) {\n icon.classList.add(\"cm-mardora-callout-type-menu-icon\");\n item.appendChild(icon);\n }\n\n const text = doc.createElement(\"span\");\n text.textContent = label;\n item.appendChild(text);\n\n item.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n const change = resolveCalloutTypeChange(view.state, pos, label);\n if (change) {\n view.dispatch({\n changes: change,\n selection: { anchor: change.from + change.insert.length },\n scrollIntoView: true,\n });\n }\n this.closeCalloutTypeMenu();\n view.focus();\n });\n\n menu.appendChild(item);\n }\n\n view.dom.appendChild(menu);\n this.calloutTypeMenu = menu;\n this.calloutTypeMenuDocument = doc;\n doc.addEventListener(\"mousedown\", this.handleDocumentMouseDown, true);\n this.positionCalloutTypeMenu(button, menu);\n }\n\n private positionCalloutTypeMenu(button: HTMLElement, menu: HTMLElement): void {\n const rect = button.getBoundingClientRect();\n const win = button.ownerDocument.defaultView;\n const menuWidth = 176;\n const viewportWidth = win?.innerWidth ?? rect.left + menuWidth;\n const left = Math.max(8, Math.min(rect.left, viewportWidth - menuWidth - 8));\n menu.style.left = `${left}px`;\n menu.style.top = `${rect.bottom + 6}px`;\n }\n\n private readonly handleDocumentMouseDown = (event: MouseEvent): void => {\n const target = event.target;\n if (\n target instanceof Element &&\n (target.closest(\".cm-mardora-callout-type-menu\") || target.closest(\".cm-mardora-callout-title-button\"))\n ) {\n return;\n }\n\n this.closeCalloutTypeMenu();\n };\n\n private closeCalloutTypeMenu(): void {\n if (this.calloutTypeMenuDocument) {\n this.calloutTypeMenuDocument.removeEventListener(\"mousedown\", this.handleDocumentMouseDown, true);\n this.calloutTypeMenuDocument = null;\n }\n this.calloutTypeMenu?.remove();\n this.calloutTypeMenu = null;\n }\n\n /**\n * Build blockquote decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name !== \"Blockquote\") {\n return;\n }\n\n const raw = view.state.sliceDoc(from, to);\n const callout = parseCalloutInfo(raw);\n\n // Process each line within the blockquote\n const startLine = view.state.doc.lineAt(from);\n const endLine = view.state.doc.lineAt(to);\n\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\n const line = view.state.doc.line(lineNum);\n\n // Add line decoration for the blockquote border\n decorations.push(\n callout\n ? calloutLineDecoration(callout, lineNum === startLine.number).range(line.from)\n : quoteLineDecorations[\"quote-line\"].range(line.from)\n );\n }\n\n // Add mark decoration for the entire blockquote content\n decorations.push(\n (callout ? quoteMarkDecorations[\"callout-content\"] : quoteMarkDecorations[\"quote-content\"]).range(from, to)\n );\n\n // Find all QuoteMark children (> symbols)\n this.hideQuoteMarks(from, to, decorations, view);\n if (callout) {\n this.hideCalloutMarker(startLine.from, startLine.to, callout, decorations, view);\n }\n },\n });\n }\n\n private hideCalloutMarker(\n from: number,\n to: number,\n info: CalloutInfo,\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\n view: import(\"@codemirror/view\").EditorView\n ): void {\n const lineText = view.state.sliceDoc(from, to);\n const markerMatch = lineText.match(calloutMarkerSearchPattern);\n\n if (markerMatch?.index === undefined || !markerMatch[0]) {\n return;\n }\n\n const markerFrom = from + markerMatch.index;\n decorations.push(calloutMarkerDecoration(info, markerFrom).range(markerFrom, markerFrom + markerMatch[0].length));\n }\n\n /**\n * Find and hide quote marks in every quoted line.\n */\n private hideQuoteMarks(\n from: number,\n to: number,\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\n view: import(\"@codemirror/view\").EditorView\n ): void {\n syntaxTree(view.state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.name !== \"QuoteMark\") {\n return;\n }\n\n // Clamp to line end so replace decoration never spans a newline.\n const line = view.state.doc.lineAt(node.from);\n const markEnd = getQuoteMarkReplacementEnd(line.text, node.to, line.from);\n decorations.push(quoteMarkDecorations[\"quote-mark\"].range(node.from, markEnd));\n },\n });\n }\n\n override renderToHTML(\n node: SyntaxNode,\n children: string,\n ctx: { sliceDoc(from: number, to: number): string }\n ): string | null {\n if (node.name === \"QuoteMark\") {\n return \"\";\n }\n\n if (node.name !== \"Blockquote\") {\n return null;\n }\n\n const callout = parseCalloutInfo(ctx.sliceDoc(node.from, node.to));\n if (callout) {\n const content = removeRenderedCalloutMarker(children, callout.label);\n return `<blockquote class=\"cm-mardora-callout cm-mardora-callout-${callout.type}\"><div class=\"cm-mardora-callout-title\">${renderCalloutIconHTML(callout.label)}<span>${callout.label}</span></div><div class=\"cm-mardora-callout-content\">${content}</div></blockquote>\\n`;\n }\n\n return `<blockquote class=\"cm-mardora-quote-line\"><div class=\"cm-mardora-quote-content\">${children}</div></blockquote>\\n`;\n }\n}\n\nconst theme = createTheme({\n default: {\n // Line styling with left border\n \".cm-mardora-quote-line\": {\n borderLeft: \"3px solid currentColor\",\n paddingLeft: \"1em !important\",\n paddingTop: \"0.25em !important\",\n paddingBottom: \"0.25em !important\",\n marginLeft: \"0.25em\",\n minHeight: \"1.6em\",\n boxSizing: \"content-box\",\n opacity: \"0.85\",\n },\n\n // Quote content styling\n \".cm-mardora-quote-content\": {\n fontStyle: \"italic\",\n },\n\n \".cm-mardora-callout-line\": {\n borderLeft: \"4px solid var(--mardora-callout-color)\",\n paddingLeft: \"1em !important\",\n paddingTop: \"0.25em !important\",\n paddingBottom: \"0.25em !important\",\n marginLeft: \"0.25em\",\n minHeight: \"1.6em\",\n backgroundColor: \"var(--mardora-callout-bg)\",\n },\n\n \".cm-mardora-callout-title-button\": {\n appearance: \"none\",\n border: \"0\",\n backgroundColor: \"transparent\",\n borderRadius: \"4px\",\n color: \"var(--mardora-callout-color)\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.35em\",\n font: \"inherit\",\n fontWeight: \"700\",\n fontStyle: \"normal\",\n lineHeight: \"1.2\",\n padding: \"0.05em 0.2em\",\n },\n\n \".cm-mardora-callout-title-button:hover\": {\n backgroundColor: \"color-mix(in srgb, var(--mardora-callout-color) 10%, transparent)\",\n },\n\n \".cm-mardora-callout-title-button:focus-visible\": {\n outline: \"2px solid var(--mardora-callout-color)\",\n outlineOffset: \"2px\",\n },\n\n \".cm-mardora-callout-title-icon\": {\n width: \"0.9em\",\n height: \"0.9em\",\n flex: \"0 0 auto\",\n },\n\n \".cm-mardora-callout-type-menu\": {\n position: \"fixed\",\n zIndex: \"2000\",\n minWidth: \"176px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n padding: \"6px\",\n border: \"1px solid var(--mardora-border-color, #d8dee8)\",\n borderRadius: \"8px\",\n backgroundColor: \"var(--mardora-bg-primary, #ffffff)\",\n boxShadow: \"0 10px 28px rgba(15, 23, 42, 0.14)\",\n },\n\n \".cm-mardora-callout-type-menu-item\": {\n appearance: \"none\",\n border: \"0\",\n backgroundColor: \"transparent\",\n borderRadius: \"6px\",\n color: \"var(--mardora-text-primary, #24292f)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5em\",\n font: \"inherit\",\n fontSize: \"0.875em\",\n fontWeight: \"600\",\n lineHeight: \"1.4\",\n padding: \"0.45em 0.55em\",\n textAlign: \"left\",\n width: \"100%\",\n },\n\n \".cm-mardora-callout-type-menu-item:hover\": {\n backgroundColor: \"var(--mardora-bg-secondary, #f6f8fa)\",\n },\n\n \".cm-mardora-callout-type-menu-item-active\": {\n backgroundColor: \"var(--mardora-bg-secondary, #f6f8fa)\",\n color: \"var(--mardora-callout-option-color)\",\n },\n\n \".cm-mardora-callout-type-menu-icon\": {\n width: \"1em\",\n height: \"1em\",\n flex: \"0 0 auto\",\n color: \"var(--mardora-callout-option-color)\",\n },\n\n \".cm-mardora-callout-type-menu-item-note\": {\n \"--mardora-callout-option-color\": \"#0969da\",\n },\n\n \".cm-mardora-callout-type-menu-item-tip\": {\n \"--mardora-callout-option-color\": \"#1a7f37\",\n },\n\n \".cm-mardora-callout-type-menu-item-important\": {\n \"--mardora-callout-option-color\": \"#8250df\",\n },\n\n \".cm-mardora-callout-type-menu-item-warning\": {\n \"--mardora-callout-option-color\": \"#9a6700\",\n },\n\n \".cm-mardora-callout-type-menu-item-caution\": {\n \"--mardora-callout-option-color\": \"#cf222e\",\n },\n\n \".cm-mardora-callout\": {\n borderLeft: \"4px solid var(--mardora-callout-color)\",\n borderRadius: \"0\",\n padding: \"0.25em 1em\",\n margin: \"1em 0\",\n backgroundColor: \"var(--mardora-callout-bg)\",\n },\n\n \".cm-mardora-callout-title\": {\n color: \"var(--mardora-callout-color)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.35em\",\n fontWeight: \"700\",\n fontStyle: \"normal\",\n lineHeight: \"1.2\",\n marginBottom: \"0.75em\",\n padding: \"0.05em 0.2em\",\n },\n\n \".cm-mardora-callout-content\": {\n fontStyle: \"normal\",\n },\n\n \".cm-mardora-callout-content p\": {\n marginTop: \"0\",\n marginBottom: \"0\",\n },\n\n \".cm-mardora-callout-note\": {\n \"--mardora-callout-color\": \"#0969da\",\n \"--mardora-callout-bg\": \"rgba(9, 105, 218, 0.08)\",\n },\n\n \".cm-mardora-callout-tip\": {\n \"--mardora-callout-color\": \"#1a7f37\",\n \"--mardora-callout-bg\": \"rgba(26, 127, 55, 0.08)\",\n },\n\n \".cm-mardora-callout-important\": {\n \"--mardora-callout-color\": \"#8250df\",\n \"--mardora-callout-bg\": \"rgba(130, 80, 223, 0.08)\",\n },\n\n \".cm-mardora-callout-warning\": {\n \"--mardora-callout-color\": \"#9a6700\",\n \"--mardora-callout-bg\": \"rgba(154, 103, 0, 0.1)\",\n },\n\n \".cm-mardora-callout-caution\": {\n \"--mardora-callout-color\": \"#cf222e\",\n \"--mardora-callout-bg\": \"rgba(207, 34, 46, 0.08)\",\n },\n },\n});\n","import { Decoration } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\n\n/**\n * Line decoration for horizontal rule lines\n */\nconst hrLineDecoration = Decoration.line({ class: \"cm-mardora-hr-line\" });\n\n/**\n * Mark decoration to hide raw markers (---, ***, ___) when unfocused\n */\nconst hrMarkDecoration = Decoration.replace({});\n\n/**\n * HRPlugin - Decorates markdown horizontal rules\n *\n * Adds visual styling to thematic breaks (---, ***, ___)\n * - Line decoration that renders a centered horizontal line\n * - Hides raw marker characters when the cursor is not on the line\n */\nexport class HRPlugin extends DecorationPlugin {\n readonly name = \"hr\";\n readonly version = \"1.0.0\";\n override decorationPriority = 10;\n override readonly requiredNodes = [\"HorizontalRule\"] as const;\n\n /**\n * Constructor - calls super constructor\n */\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Build horizontal rule decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name !== \"HorizontalRule\") {\n return;\n }\n\n // Add line decoration for the horizontal rule styling\n const line = view.state.doc.lineAt(from);\n decorations.push(hrLineDecoration.range(line.from));\n\n // Hide the raw markers when cursor is not on the line\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n // Clamp to line end so replace decoration never spans a newline\n const markEnd = Math.min(to, line.to);\n decorations.push(hrMarkDecoration.range(from, markEnd));\n }\n },\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n override renderToHTML(node: SyntaxNode, _children: string): string | null {\n if (node.name !== \"HorizontalRule\") {\n return null;\n }\n\n return `<hr class=\"cm-mardora-hr-line\" />\\n`;\n }\n}\n\nconst theme = createTheme({\n default: {\n // Line styling — displays a centered horizontal line\n \".cm-mardora-hr-line\": {\n display: \"flex\",\n alignItems: \"center\",\n paddingTop: \"0.75em\",\n paddingBottom: \"0.75em\",\n border: \"none\",\n \"&::after\": {\n content: '\"\"',\n flex: \"1\",\n height: \"2px\",\n background: \"currentColor\",\n opacity: \"0.3\",\n },\n },\n },\n});\n","import { Decoration, WidgetType } from \"@codemirror/view\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\nimport { createTheme } from \"../editor\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport * as emoji from \"node-emoji\";\n\nfunction shortcodeToEmoji(raw: string): string | null {\n const rendered = emoji.emojify(raw);\n return rendered !== raw ? rendered : null;\n}\n\nclass EmojiWidget extends WidgetType {\n constructor(readonly rendered: string) {\n super();\n }\n\n override eq(other: EmojiWidget): boolean {\n return other.rendered === this.rendered;\n }\n\n toDOM() {\n const span = document.createElement(\"span\");\n span.className = \"cm-mardora-emoji\";\n span.textContent = this.rendered;\n return span;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/**\n * Mark decorations for emoji syntax elements\n */\nconst emojiMarkDecorations = {\n \"emoji-source\": Decoration.mark({ class: \"cm-mardora-emoji-source\" }),\n};\n\n/**\n * EmojiPlugin - Decorates markdown emojis\n *\n * Parses and decorates emoji shortcodes like :smile:\n * - Converts valid shortcodes to Unicode emoji when cursor is outside\n * - Keeps raw shortcode visible while editing (cursor inside token)\n */\nexport class EmojiPlugin extends DecorationPlugin {\n readonly name = \"emoji\";\n readonly version = \"1.0.0\";\n override decorationPriority = 20;\n override readonly requiredNodes = [\"Emoji\", \"EmojiMark\"] as const;\n\n constructor() {\n super();\n }\n\n /**\n * Plugin theme\n */\n override get theme() {\n return theme;\n }\n\n /**\n * Build emoji decorations by iterating the syntax tree\n */\n buildDecorations(ctx: DecorationContext): void {\n const { view, decorations } = ctx;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node) => {\n const { from, to, name } = node;\n\n if (name !== \"Emoji\") {\n return;\n }\n\n const raw = view.state.sliceDoc(from, to);\n const rendered = shortcodeToEmoji(raw);\n if (!rendered) {\n return;\n }\n\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (cursorInNode) {\n decorations.push(emojiMarkDecorations[\"emoji-source\"].range(from, to));\n return;\n }\n\n decorations.push(\n Decoration.replace({\n widget: new EmojiWidget(rendered),\n }).range(from, to)\n );\n },\n });\n }\n\n override renderToHTML(\n node: SyntaxNode,\n children: string,\n ctx: {\n sliceDoc(from: number, to: number): string;\n sanitize(html: string): string;\n syntaxHighlighters?: readonly import(\"@lezer/highlight\").Highlighter[];\n }\n ): string | null {\n if (node.name === \"EmojiMark\") {\n return \"\";\n }\n\n if (node.name !== \"Emoji\") {\n return null;\n }\n\n const raw = ctx.sliceDoc(node.from, node.to);\n const rendered = shortcodeToEmoji(raw);\n if (!rendered) {\n return `<span class=\"cm-mardora-emoji-source\">${children}</span>`;\n }\n\n return `<span class=\"cm-mardora-emoji\">${rendered}</span>`;\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-mardora-emoji\": {\n fontFamily: '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", sans-serif',\n fontVariantEmoji: \"emoji\",\n lineHeight: \"1.2\",\n },\n \".cm-mardora-emoji-source\": {\n fontFamily: \"inherit\",\n lineHeight: \"inherit\",\n },\n },\n});\n","// Re-export individual plugins\nexport { ParagraphPlugin } from \"./paragraph-plugin\";\nexport { HeadingPlugin } from \"./heading-plugin\";\nexport { InlinePlugin } from \"./inline-plugin\";\nexport { LinkPlugin } from \"./link-plugin\";\nexport { ListPlugin } from \"./list-plugin\";\nexport { TablePlugin } from \"./table-plugin\";\nexport { HTMLPlugin } from \"./html-plugin\";\nexport { bindImagePreviewButtons, ImagePlugin } from \"./image-plugin\";\nexport { MathPlugin } from \"./math-plugin\";\nexport { MermaidPlugin } from \"./mermaid-plugin\";\nexport {\n bindCodeCopyButtons,\n CodePlugin,\n CODE_COPY_SUCCESS_ICON,\n copyCodeTextToClipboard,\n decodeCodeCopyPayload,\n encodeCodeCopyPayload,\n} from \"./code-plugin\";\nexport { QuotePlugin, resolveCalloutTitleInputTarget, resolveCalloutTypeChange } from \"./quote-plugin\";\nexport type { CalloutLabel, CalloutTitleInputTarget, CalloutTypeChange } from \"./quote-plugin\";\nexport { HRPlugin } from \"./hr-plugin\";\nexport { EmojiPlugin } from \"./emoji-plugin\";\n\n// Plugin collections\nimport { MardoraPlugin } from \"../editor/plugin\";\nimport { ParagraphPlugin } from \"./paragraph-plugin\";\nimport { HeadingPlugin } from \"./heading-plugin\";\nimport { InlinePlugin } from \"./inline-plugin\";\nimport { LinkPlugin } from \"./link-plugin\";\nimport { ListPlugin } from \"./list-plugin\";\nimport { TablePlugin } from \"./table-plugin\";\nimport { HTMLPlugin } from \"./html-plugin\";\nimport { ImagePlugin } from \"./image-plugin\";\nimport { MathPlugin } from \"./math-plugin\";\nimport { MermaidPlugin } from \"./mermaid-plugin\";\nimport { CodePlugin } from \"./code-plugin\";\nimport { QuotePlugin } from \"./quote-plugin\";\nimport { HRPlugin } from \"./hr-plugin\";\nimport { EmojiPlugin } from \"./emoji-plugin\";\n\n/**\n * Default plugins\n *\n * This is the set of essential plugins\n */\nconst essentialPlugins: MardoraPlugin[] = [\n new ParagraphPlugin(),\n new HeadingPlugin(),\n new InlinePlugin(),\n new LinkPlugin(),\n new ListPlugin(),\n new TablePlugin(),\n new HTMLPlugin(),\n new ImagePlugin(),\n new MathPlugin(),\n new MermaidPlugin(),\n new CodePlugin(),\n new QuotePlugin(),\n new HRPlugin(),\n new EmojiPlugin(),\n];\n\n/**\n * All plugins\n *\n * This is the set of all plugins available with mardora\n */\nconst allPlugins: MardoraPlugin[] = [...essentialPlugins];\n\nexport { essentialPlugins, allPlugins };\n"]}