draftly 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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-plugin.ts","../src/plugins/html-plugin.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":["DraftlyPlugin","createTheme","Decoration","DecorationPlugin","theme","syntaxTree","toggleMarkdownStyle","createWrapSelectionInputHandler","tags","WidgetType","view","Annotation","BlockWrapper","PreviewRenderer","Table","Prec","keymap","EditorView","RangeSet","DOMPurify","katexCss","katex","mermaid","highlightCode","classes","LanguageDescription","languages","emoji"],"mappings":"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","file":"chunk-OMFUE4AQ.cjs","sourcesContent":["import { SyntaxNode } from \"@lezer/common\";\r\nimport { DraftlyPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\n\r\n/**\r\n * ParagraphPlugin - Adds top and bottom padding to paragraphs in preview\r\n *\r\n * Applies visual spacing to markdown paragraphs for better readability\r\n */\r\nexport class ParagraphPlugin extends DraftlyPlugin {\r\n readonly name = \"paragraph\";\r\n readonly version = \"1.0.0\";\r\n override readonly requiredNodes = [\"Paragraph\"] as const;\r\n\r\n /**\r\n * Plugin theme for preview styling\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n override renderToHTML(node: SyntaxNode, children: string): string | null {\r\n if (node.name !== \"Paragraph\") {\r\n return null;\r\n }\r\n\r\n return `<p class=\"cm-draftly-paragraph\">${children}</p>`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-paragraph\": {\r\n paddingTop: \"0.5em\",\r\n paddingBottom: \"0.5em\",\r\n },\r\n },\r\n});\r\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 * 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-draftly-h1\" }),\n \"heading-2\": Decoration.mark({ class: \"cm-draftly-h2\" }),\n \"heading-3\": Decoration.mark({ class: \"cm-draftly-h3\" }),\n \"heading-4\": Decoration.mark({ class: \"cm-draftly-h4\" }),\n \"heading-5\": Decoration.mark({ class: \"cm-draftly-h5\" }),\n \"heading-6\": Decoration.mark({ class: \"cm-draftly-h6\" }),\n \"header-mark-class\": Decoration.mark({ class: \"cm-draftly-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-draftly-line-h1\" }),\n \"heading-2\": Decoration.line({ class: \"cm-draftly-line-h2\" }),\n \"heading-3\": Decoration.line({ class: \"cm-draftly-line-h3\" }),\n \"heading-4\": Decoration.line({ class: \"cm-draftly-line-h4\" }),\n \"heading-5\": Decoration.line({ class: \"cm-draftly-line-h5\" }),\n \"heading-6\": Decoration.line({ class: \"cm-draftly-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 style the heading marker (#)\n // Only hide when cursor is not in the heading\n const headingMark = node.node.getChild(\"HeaderMark\");\n if (headingMark) {\n const markEnd = Math.min(headingMark.to + 1, line.to);\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\n if (!cursorInNode) {\n // Clamp to line end so replace decoration never spans a newline\n decorations.push(headingMarkDecorations[\"heading-mark\"].range(headingMark.from, markEnd));\n } else {\n decorations.push(headingMarkDecorations[\"header-mark-class\"].range(headingMark.from, markEnd));\n }\n }\n },\n });\n }\n\n override renderToHTML(node: SyntaxNode, children: string): 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\n return `<div class=\"${lineClass}\">\n <h${level} class=\"${headingClass}\">${children}</h${level}>\n </div>\\n`;\n }\n}\n\nconst theme = createTheme({\n default: {\n \".cm-draftly-h1\": {\n fontSize: \"2em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h2\": {\n fontSize: \"1.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h3\": {\n fontSize: \"1.5em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h4\": {\n fontSize: \"1.25em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h5\": {\n fontSize: \"1em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n \".cm-draftly-h6\": {\n fontSize: \"0.75em\",\n fontWeight: \"bold\",\n fontFamily: \"sans-serif\",\n textDecoration: \"none\",\n },\n\n // Heading line styles\n \".cm-draftly-line-h1\": {\n paddingTop: \"1.5em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-line-h2\": {\n paddingTop: \"1.25em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-line-h3, .cm-draftly-line-h4, .cm-draftly-line-h5, .cm-draftly-line-h6\": {\n paddingTop: \"1em\",\n paddingBottom: \"0.5em\",\n },\n \".cm-draftly-header-mark\": {\n opacity: 0.5,\n },\n },\n});\n","import { Decoration, KeyBinding } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\nimport { toggleMarkdownStyle } from \"../editor/utils\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport type { MarkdownConfig, InlineParser } from \"@lezer/markdown\";\r\nimport { Extension } from \"@codemirror/state\";\r\nimport { createWrapSelectionInputHandler } from \"../lib\";\r\n\r\n/**\r\n * Node types for inline styling in markdown\r\n */\r\nconst INLINE_TYPES = {\r\n Emphasis: \"emphasis\",\r\n StrongEmphasis: \"strong\",\r\n Strikethrough: \"strikethrough\",\r\n Subscript: \"subscript\",\r\n Superscript: \"superscript\",\r\n Highlight: \"highlight\",\r\n} as const;\r\n\r\n/**\r\n * Mark decorations for inline content\r\n */\r\nconst inlineMarkDecorations = {\r\n emphasis: Decoration.mark({ class: \"cm-draftly-emphasis\" }),\r\n strong: Decoration.mark({ class: \"cm-draftly-strong\" }),\r\n strikethrough: Decoration.mark({ class: \"cm-draftly-strikethrough\" }),\r\n subscript: Decoration.mark({ class: \"cm-draftly-subscript\" }),\r\n superscript: Decoration.mark({ class: \"cm-draftly-superscript\" }),\r\n highlight: Decoration.mark({ class: \"cm-draftly-highlight\" }),\r\n // Markers (* _ ~~ ^ ~ ==)\r\n \"inline-mark\": Decoration.replace({}),\r\n};\r\n\r\n// Character code for '='\r\nconst EQUALS = 61;\r\n\r\n// Punctuation regex for flanking checks (matches Unicode punctuation)\r\n// eslint-disable-next-line no-useless-escape\r\nlet Punctuation = /[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\u2010-\\u2027]/;\r\ntry {\r\n Punctuation = new RegExp(\"[\\\\p{S}|\\\\p{P}]\", \"u\");\r\n} catch {\r\n // Fallback regex is used above for environments without Unicode support\r\n}\r\n\r\n// Delimiter type for highlight markers — enables nested inline parsing\r\nconst HighlightDelim = { resolve: \"Highlight\", mark: \"HighlightMark\" };\r\n\r\n/**\r\n * Inline parser for highlight syntax: ==text==\r\n * Uses addDelimiter (like Strikethrough) so nested inline styles work.\r\n */\r\nconst highlightParser: InlineParser = {\r\n name: \"Highlight\",\r\n parse(cx, next, pos) {\r\n // Must start with ==\r\n if (next !== EQUALS || cx.char(pos + 1) !== EQUALS) return -1;\r\n // Don't match === (or more)\r\n if (cx.char(pos + 2) === EQUALS) return -1;\r\n\r\n // Flanking checks (same logic as Strikethrough)\r\n const before = cx.slice(pos - 1, pos);\r\n const after = cx.slice(pos + 2, pos + 3);\r\n const sBefore = /\\s|^$/.test(before),\r\n sAfter = /\\s|^$/.test(after);\r\n const pBefore = Punctuation.test(before),\r\n pAfter = Punctuation.test(after);\r\n\r\n return cx.addDelimiter(\r\n HighlightDelim,\r\n pos,\r\n pos + 2,\r\n !sAfter && (!pAfter || sBefore || pBefore),\r\n !sBefore && (!pBefore || sAfter || pAfter)\r\n );\r\n },\r\n};\r\n\r\n/**\r\n * InlinePlugin - Decorates inline markdown formatting\r\n *\r\n * Adds visual styling to inline elements:\r\n * - Emphasis (italic) - *text* or _text_\r\n * - Strong (bold) - **text** or __text__\r\n * - Strikethrough - ~~text~~\r\n * - Subscript - ~text~\r\n * - Superscript - ^text^\r\n * - Highlight - ==text==\r\n *\r\n * Hides formatting markers when cursor is not in the element\r\n */\r\nexport class InlinePlugin extends DecorationPlugin {\r\n readonly name = \"inline\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 20;\r\n override readonly requiredNodes = [\r\n \"Emphasis\",\r\n \"StrongEmphasis\",\r\n \"Strikethrough\",\r\n \"Subscript\",\r\n \"Superscript\",\r\n \"Highlight\",\r\n \"EmphasisMark\",\r\n \"StrikethroughMark\",\r\n \"SubscriptMark\",\r\n \"SuperscriptMark\",\r\n \"HighlightMark\",\r\n ] as const;\r\n marks: string[] = [];\r\n\r\n constructor() {\r\n super();\r\n\r\n for (const mark of Object.keys(INLINE_TYPES)) {\r\n this.marks.push(...this.getMarkerNames(mark));\r\n }\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for inline formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-b\",\r\n run: toggleMarkdownStyle(\"**\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-i\",\r\n run: toggleMarkdownStyle(\"*\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-s\",\r\n run: toggleMarkdownStyle(\"~~\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-,\",\r\n run: toggleMarkdownStyle(\"~\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-.\",\r\n run: toggleMarkdownStyle(\"^\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-h\",\r\n run: toggleMarkdownStyle(\"==\"),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Intercepts inline marker typing to wrap selected text.\r\n *\r\n * If user types inline markers while text is selected, wraps each selected\r\n * range with the appropriate marker:\r\n * - * _ ~ ^ -> marker + selected + marker\r\n * - = -> ==selected==\r\n */\r\n override getExtensions(): Extension[] {\r\n return [createWrapSelectionInputHandler({ \"*\": \"*\", _: \"_\", \"~\": \"~\", \"^\": \"^\", \"=\": \"==\" })];\r\n }\r\n\r\n /**\r\n * Return markdown parser extensions for highlight syntax (==text==)\r\n */\r\n override getMarkdownConfig(): MarkdownConfig {\r\n return {\r\n defineNodes: [\r\n { name: \"Highlight\", style: tags.emphasis },\r\n { name: \"HighlightMark\", style: tags.processingInstruction },\r\n ],\r\n parseInline: [highlightParser],\r\n };\r\n }\r\n\r\n /**\r\n * Build inline decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Check if this is an inline type we handle\r\n const inlineType = INLINE_TYPES[name as keyof typeof INLINE_TYPES];\r\n if (!inlineType) {\r\n return;\r\n }\r\n\r\n // Add mark decoration for the content\r\n decorations.push(inlineMarkDecorations[inlineType].range(from, to));\r\n\r\n // Only hide markers when cursor is not in the element\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInNode) {\r\n // Get the appropriate marker children based on type\r\n const markerNames = this.getMarkerNames(name);\r\n for (const markerName of markerNames) {\r\n const marks = node.node.getChildren(markerName);\r\n for (const mark of marks) {\r\n decorations.push(inlineMarkDecorations[\"inline-mark\"].range(mark.from, mark.to));\r\n }\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the marker node names for a given inline type\r\n */\r\n private getMarkerNames(nodeType: string): string[] {\r\n switch (nodeType) {\r\n case \"Emphasis\":\r\n case \"StrongEmphasis\":\r\n return [\"EmphasisMark\"];\r\n case \"Strikethrough\":\r\n return [\"StrikethroughMark\"];\r\n case \"Subscript\":\r\n return [\"SubscriptMark\"];\r\n case \"Superscript\":\r\n return [\"SuperscriptMark\"];\r\n case \"Highlight\":\r\n return [\"HighlightMark\"];\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n override renderToHTML(node: SyntaxNode, children: string): string | null {\r\n if (this.marks.includes(node.name)) {\r\n return \"\";\r\n }\r\n\r\n const inlineType = INLINE_TYPES[node.name as keyof typeof INLINE_TYPES];\r\n if (!inlineType) {\r\n return null;\r\n }\r\n const className = inlineMarkDecorations[inlineType].spec.class as string;\r\n\r\n return `<span class=\"${className}\">${children}</span>`;\r\n }\r\n}\r\n\r\n/**\r\n * Theme for inline styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n // Emphasis (italic)\r\n \".cm-draftly-emphasis\": {\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // Strong (bold)\r\n \".cm-draftly-strong\": {\r\n fontWeight: \"bold\",\r\n },\r\n\r\n // Strikethrough\r\n \".cm-draftly-strikethrough\": {\r\n textDecoration: \"line-through\",\r\n opacity: \"0.7\",\r\n },\r\n\r\n // Subscript\r\n \".cm-draftly-subscript\": {\r\n fontSize: \"0.75em\",\r\n verticalAlign: \"sub\",\r\n },\r\n\r\n // Superscript\r\n \".cm-draftly-superscript\": {\r\n fontSize: \"0.75em\",\r\n verticalAlign: \"super\",\r\n },\r\n\r\n // Highlight\r\n \".cm-draftly-highlight\": {\r\n backgroundColor: \"rgba(255, 213, 0, 0.35)\",\r\n borderRadius: \"2px\",\r\n padding: \"1px 2px\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for link syntax elements\r\n */\r\nconst linkMarkDecorations = {\r\n \"link-text\": Decoration.mark({ class: \"cm-draftly-link-text\" }),\r\n \"link-marker\": Decoration.mark({ class: \"cm-draftly-link-marker\" }),\r\n \"link-url\": Decoration.mark({ class: \"cm-draftly-link-url\" }),\r\n \"link-hidden\": Decoration.mark({ class: \"cm-draftly-link-hidden\" }),\r\n};\r\n\r\n/**\r\n * Parse link markdown to extract text and URL\r\n * Format: [text](url) or [text](url \"title\")\r\n */\r\nfunction parseLinkMarkdown(content: string): { text: string; url: string; title?: string } | null {\r\n // Regex to match: [text](url) or [text](url \"title\")\r\n const match = content.match(/^\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\r\n if (!match) return null;\r\n\r\n const result: { text: string; url: string; title?: string } = {\r\n text: match[1] || \"\",\r\n url: match[2]!,\r\n };\r\n\r\n if (match[3] !== undefined) {\r\n result.title = match[3];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Widget for displaying a tooltip with the link URL on hover\r\n */\r\nclass LinkTooltipWidget extends WidgetType {\r\n constructor(\r\n readonly url: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: LinkTooltipWidget): boolean {\r\n return other.url === this.url && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const wrapper = document.createElement(\"span\");\r\n wrapper.className = \"cm-draftly-link-wrapper\";\r\n wrapper.style.cursor = \"pointer\";\r\n\r\n // Tooltip element\r\n const tooltip = document.createElement(\"span\");\r\n tooltip.className = \"cm-draftly-link-tooltip\";\r\n tooltip.textContent = this.url;\r\n wrapper.appendChild(tooltip);\r\n\r\n // Show/hide tooltip on hover\r\n wrapper.addEventListener(\"mouseenter\", () => {\r\n tooltip.classList.add(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n wrapper.addEventListener(\"mouseleave\", () => {\r\n tooltip.classList.remove(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n // Click handler - select the raw markdown\r\n wrapper.addEventListener(\"click\", (e) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n // Ctrl+Click: open in new tab\r\n e.preventDefault();\r\n e.stopPropagation();\r\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\r\n } else {\r\n // Regular click: select raw markdown\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n }\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n override ignoreEvent(event: Event): boolean {\r\n // Allow click and mouse events to be handled by our handlers\r\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\r\n }\r\n}\r\n\r\n/**\r\n * LinkPlugin - Decorates and provides interactivity for markdown links\r\n *\r\n * Supports the full link syntax: [text](url) and [text](url \"title\")\r\n * - Click: reveals raw markdown (selects/focuses the link syntax)\r\n * - Ctrl+Click: opens the link URL in a new browser tab\r\n * - Hover: shows tooltip with the link URL\r\n * - Hides the markdown syntax when cursor is not in range\r\n * - Shows raw markdown when cursor is within the link range\r\n */\r\nexport class LinkPlugin extends DecorationPlugin {\r\n readonly name = \"link\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 22;\r\n override readonly requiredNodes = [\"Link\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for link formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-k\",\r\n run: (view) => this.toggleLink(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * URL regex pattern\r\n */\r\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\r\n\r\n /**\r\n * Toggle link on selection\r\n * - If text is selected and is a URL: [](url) with cursor in brackets\r\n * - If text is selected (not URL): [text]() with cursor in parentheses\r\n * - If nothing selected: []() with cursor in brackets\r\n * - If already a link: remove syntax, leave plain text\r\n */\r\n private toggleLink(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to, empty } = state.selection.main;\r\n const selectedText = state.sliceDoc(from, to);\r\n\r\n // Check if selection is already a link [text](url)\r\n const linkMatch = selectedText.match(/^\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\r\n if (linkMatch) {\r\n // Already a link - extract just the text and replace\r\n const linkText = linkMatch[1] || \"\";\r\n view.dispatch({\r\n changes: { from, to, insert: linkText },\r\n selection: { anchor: from, head: from + linkText.length },\r\n });\r\n return true;\r\n }\r\n\r\n // Check if we're inside a link by looking at surrounding context\r\n const lineStart = state.doc.lineAt(from).from;\r\n const lineEnd = state.doc.lineAt(to).to;\r\n const lineText = state.sliceDoc(lineStart, lineEnd);\r\n\r\n // Find link pattern in line that contains the selection\r\n const linkRegex = /\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\r\n let match;\r\n while ((match = linkRegex.exec(lineText)) !== null) {\r\n const matchFrom = lineStart + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n\r\n // Check if selection is within this link\r\n if (from >= matchFrom && to <= matchTo) {\r\n // Remove the link syntax, leave plain text\r\n const linkText = match[1] || \"\";\r\n view.dispatch({\r\n changes: { from: matchFrom, to: matchTo, insert: linkText },\r\n selection: { anchor: matchFrom, head: matchFrom + linkText.length },\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n if (empty) {\r\n // No selection - insert []() and place cursor in brackets\r\n view.dispatch({\r\n changes: { from, insert: \"[]()\" },\r\n selection: { anchor: from + 1 },\r\n });\r\n } else if (this.urlPattern.test(selectedText)) {\r\n // Selected text is a URL - put it in parentheses, cursor in brackets\r\n const newText = `[](${selectedText})`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + 1 },\r\n });\r\n } else {\r\n // Selected text is not a URL - wrap as link text, cursor in parentheses\r\n const newText = `[${selectedText}]()`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + selectedText.length + 3 },\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle Link nodes\r\n if (name === \"Link\") {\r\n const content = view.state.sliceDoc(from, to);\r\n const parsed = parseLinkMarkdown(content);\r\n\r\n if (!parsed) return;\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n if (cursorInRange) {\r\n // Cursor in range: show raw markdown with styling\r\n this.decorateRawLink(node.node, decorations, view);\r\n } else {\r\n // Cursor out of range: hide raw markdown, show styled link text\r\n // Hide the entire markdown syntax\r\n decorations.push(linkMarkDecorations[\"link-hidden\"].range(from, to));\r\n\r\n // Add styled link text with tooltip widget after the hidden markdown\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new LinkTooltipWidget(parsed.url, from, to),\r\n side: 1,\r\n }).range(to)\r\n );\r\n\r\n // Add replacement decoration to show styled link text\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new LinkTextWidget(parsed.text, parsed.url, from, to, parsed.title),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Decorate raw link markdown when cursor is in range\r\n */\r\n private decorateRawLink(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n const content = view.state.sliceDoc(node.from, node.to);\r\n\r\n // Style the opening bracket [\r\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.from, node.from + 1));\r\n\r\n // Find and style the link text and closing bracket + opening paren ](\r\n const bracketParen = content.indexOf(\"](\");\r\n if (bracketParen !== -1) {\r\n // Style link text\r\n if (bracketParen > 1) {\r\n decorations.push(linkMarkDecorations[\"link-text\"].range(node.from + 1, node.from + bracketParen));\r\n }\r\n // Style ]( markers\r\n decorations.push(\r\n linkMarkDecorations[\"link-marker\"].range(node.from + bracketParen, node.from + bracketParen + 2)\r\n );\r\n\r\n // Find and style the URL\r\n const urlChild = node.getChild(\"URL\");\r\n if (urlChild) {\r\n decorations.push(linkMarkDecorations[\"link-url\"].range(urlChild.from, urlChild.to));\r\n }\r\n\r\n // Style closing )\r\n decorations.push(linkMarkDecorations[\"link-marker\"].range(node.to - 1, node.to));\r\n }\r\n }\r\n\r\n /**\r\n * Render link to HTML for preview mode\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name !== \"Link\") return null;\r\n\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const parsed = parseLinkMarkdown(content);\r\n if (!parsed) return null;\r\n\r\n const textContent = ctx.sanitize(parsed.text);\r\n const urlAttr = ctx.sanitize(parsed.url);\r\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n\r\n return `<a class=\"cm-draftly-link\" href=\"${urlAttr}\"${titleAttr} target=\"_blank\" rel=\"noopener noreferrer\">${textContent}</a>`;\r\n }\r\n}\r\n\r\n/**\r\n * Widget to display the styled link text with interactivity\r\n */\r\nclass LinkTextWidget extends WidgetType {\r\n constructor(\r\n readonly text: string,\r\n readonly url: string,\r\n readonly from: number,\r\n readonly to: number,\r\n readonly title?: string\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: LinkTextWidget): boolean {\r\n return (\r\n other.text === this.text &&\r\n other.url === this.url &&\r\n other.from === this.from &&\r\n other.to === this.to &&\r\n other.title === this.title\r\n );\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const span = document.createElement(\"span\");\r\n span.className = \"cm-draftly-link-styled\";\r\n span.textContent = this.text;\r\n span.style.cursor = \"pointer\";\r\n\r\n if (this.title) {\r\n span.title = this.title;\r\n }\r\n\r\n // Tooltip element\r\n const tooltip = document.createElement(\"span\");\r\n tooltip.className = \"cm-draftly-link-tooltip\";\r\n tooltip.textContent = this.url;\r\n span.appendChild(tooltip);\r\n\r\n // Show/hide tooltip on hover\r\n span.addEventListener(\"mouseenter\", () => {\r\n tooltip.classList.add(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n span.addEventListener(\"mouseleave\", () => {\r\n tooltip.classList.remove(\"cm-draftly-link-tooltip-visible\");\r\n });\r\n\r\n // Click handler\r\n span.addEventListener(\"click\", (e) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n // Ctrl+Click: open in new tab\r\n e.preventDefault();\r\n e.stopPropagation();\r\n window.open(this.url, \"_blank\", \"noopener,noreferrer\");\r\n } else {\r\n // Regular click: select raw markdown\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n }\r\n });\r\n\r\n return span;\r\n }\r\n\r\n override ignoreEvent(event: Event): boolean {\r\n // Allow click and mouse events to be handled by our handlers\r\n return event.type !== \"click\" && event.type !== \"mouseenter\" && event.type !== \"mouseleave\";\r\n }\r\n}\r\n\r\n/**\r\n * Theme for link styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n // Link text\r\n \".cm-draftly-link-text\": {\r\n color: \"#0366d6\",\r\n },\r\n\r\n // Link markers ([ ] ( ))\r\n \".cm-draftly-link-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // URL in raw markdown\r\n \".cm-draftly-link-url\": {\r\n color: \"#6a737d\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // Hidden markdown syntax\r\n \".cm-draftly-link-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Styled link when cursor is not in range\r\n \".cm-draftly-link-styled\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n position: \"relative\",\r\n cursor: \"pointer\",\r\n },\r\n\r\n \".cm-draftly-link-styled:hover\": {\r\n color: \"#0056b3\",\r\n },\r\n\r\n // Preview link styling\r\n \".cm-draftly-link\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n },\r\n\r\n \".cm-draftly-link:hover\": {\r\n color: \"#0056b3\",\r\n },\r\n\r\n // Tooltip styling\r\n \".cm-draftly-link-tooltip\": {\r\n display: \"none\",\r\n position: \"absolute\",\r\n bottom: \"100%\",\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n backgroundColor: \"#24292e\",\r\n color: \"#ffffff\",\r\n padding: \"4px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"12px\",\r\n whiteSpace: \"nowrap\",\r\n zIndex: \"1000\",\r\n pointerEvents: \"none\",\r\n marginBottom: \"4px\",\r\n maxWidth: \"300px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n\r\n \".cm-draftly-link-tooltip-visible\": {\r\n display: \"block\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-link-text\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-link-url\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-link-styled\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link-styled:hover\": {\r\n color: \"#79c0ff\",\r\n },\r\n\r\n \".cm-draftly-link\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-link:hover\": {\r\n color: \"#79c0ff\",\r\n },\r\n\r\n \".cm-draftly-link-tooltip\": {\r\n backgroundColor: \"#30363d\",\r\n color: \"#c9d1d9\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { Range } from \"@codemirror/state\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n// ============================================================================\r\n// CSS Classes\r\n// ============================================================================\r\n\r\nconst classes = {\r\n // Unordered list classes\r\n lineUL: \"cm-draftly-list-line-ul\",\r\n markUL: \"cm-draftly-list-mark-ul\",\r\n\r\n // Ordered list classes\r\n lineOL: \"cm-draftly-list-line-ol\",\r\n markOL: \"cm-draftly-list-mark-ol\",\r\n\r\n // Task list classes\r\n taskLine: \"cm-draftly-task-line\",\r\n taskMarker: \"cm-draftly-task-marker\",\r\n\r\n // Common classes\r\n content: \"cm-draftly-list-content\",\r\n indent: \"cm-draftly-list-indent\",\r\n active: \" cm-draftly-active\",\r\n preview: \"cm-draftly-preview\",\r\n};\r\n\r\n// ============================================================================\r\n// Checkbox Widget\r\n// ============================================================================\r\n\r\n/**\r\n * Interactive checkbox widget for task list items.\r\n * Replaces `[ ]` or `[x]` markers with a clickable checkbox when not editing.\r\n */\r\nexport class TaskCheckboxWidget extends WidgetType {\r\n constructor(readonly checked: boolean) {\r\n super();\r\n }\r\n\r\n override eq(other: TaskCheckboxWidget): boolean {\r\n return other.checked === this.checked;\r\n }\r\n\r\n toDOM(view: EditorView): HTMLElement {\r\n const wrap = document.createElement(\"span\");\r\n wrap.className = `cm-draftly-task-checkbox ${this.checked ? \"checked\" : \"\"}`;\r\n wrap.setAttribute(\"aria-hidden\", \"true\");\r\n\r\n const checkbox = document.createElement(\"input\");\r\n checkbox.type = \"checkbox\";\r\n checkbox.checked = this.checked;\r\n checkbox.tabIndex = -1;\r\n\r\n checkbox.addEventListener(\"mousedown\", (e) => {\r\n e.preventDefault();\r\n this.toggleCheckbox(view, wrap);\r\n });\r\n\r\n wrap.appendChild(checkbox);\r\n return wrap;\r\n }\r\n\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n\r\n /** Toggle the checkbox state in the document */\r\n private toggleCheckbox(view: EditorView, wrap: HTMLElement): void {\r\n const pos = view.posAtDOM(wrap);\r\n const line = view.state.doc.lineAt(pos);\r\n const match = line.text.match(/^(\\s*(?:[-*+]|\\d+\\.)\\s*)\\[([ xX])\\]/);\r\n\r\n if (match) {\r\n const markerStart = line.from + match[1]!.length + 1;\r\n const newChar = this.checked ? \" \" : \"x\";\r\n view.dispatch({\r\n changes: { from: markerStart, to: markerStart + 1, insert: newChar },\r\n });\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// List Plugin\r\n// ============================================================================\r\n\r\n/**\r\n * Decorates markdown lists with custom styling.\r\n *\r\n * Supports:\r\n * - **Unordered lists** — Replaces `*`, `-`, `+` markers with styled bullets\r\n * - **Ordered lists** — Styles numbered markers (`1.`, `2.`, etc.)\r\n * - **Task lists** — Renders `[ ]`/`[x]` as interactive checkboxes\r\n */\r\nexport class ListPlugin extends DecorationPlugin {\r\n readonly name = \"list\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 20;\r\n override readonly requiredNodes = [\r\n \"BulletList\",\r\n \"OrderedList\",\r\n \"ListItem\",\r\n \"ListMark\",\r\n \"Task\",\r\n \"TaskMarker\",\r\n ] as const;\r\n\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for list formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-Shift-8\",\r\n run: (view) => this.toggleListOnLines(view, \"- \"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-7\",\r\n run: (view) => this.toggleListOnLines(view, \"1. \"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-9\",\r\n run: (view) => this.toggleListOnLines(view, \"- [ ] \"),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Toggle list marker on current line or selected lines\r\n */\r\n private toggleListOnLines(view: EditorView, marker: string): boolean {\r\n const { state } = view;\r\n const { from, to } = state.selection.main;\r\n\r\n // Get all lines in selection\r\n const startLine = state.doc.lineAt(from);\r\n const endLine = state.doc.lineAt(to);\r\n\r\n const changes: { from: number; to: number; insert: string }[] = [];\r\n\r\n // Regex to match existing list markers\r\n const listMarkerRegex = /^(\\s*)([-*+]|\\d+\\.)\\s(\\[[ xX]\\]\\s)?/;\r\n\r\n const isOrderedMarker = marker === \"1. \";\r\n let orderNum = 1;\r\n\r\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\r\n const line = state.doc.line(lineNum);\r\n const match = line.text.match(listMarkerRegex);\r\n\r\n // Get the actual marker to insert (incremental for ordered lists)\r\n const actualMarker = isOrderedMarker ? `${orderNum}. ` : marker;\r\n\r\n if (match) {\r\n // Line already has a list marker - check if same type\r\n const existingMarker = match[0];\r\n const indent = match[1] || \"\";\r\n\r\n // Check if this is the same marker type (toggle off)\r\n const isUnordered = /^[-*+]$/.test(match[2]!);\r\n const isOrdered = /^\\d+\\.$/.test(match[2]!);\r\n const hasTask = !!match[3];\r\n\r\n const wantUnordered = marker === \"- \";\r\n const wantOrdered = isOrderedMarker;\r\n const wantTask = marker === \"- [ ] \";\r\n\r\n if (\r\n (wantUnordered && isUnordered && !hasTask) ||\r\n (wantOrdered && isOrdered && !hasTask) ||\r\n (wantTask && hasTask)\r\n ) {\r\n // Same type - remove the marker\r\n changes.push({\r\n from: line.from,\r\n to: line.from + existingMarker.length,\r\n insert: indent,\r\n });\r\n } else {\r\n // Different type - replace the marker\r\n changes.push({\r\n from: line.from,\r\n to: line.from + existingMarker.length,\r\n insert: indent + actualMarker,\r\n });\r\n orderNum++;\r\n }\r\n } else {\r\n // No list marker - add one at start of line (after any indent)\r\n const indentMatch = line.text.match(/^(\\s*)/);\r\n const indent = indentMatch ? indentMatch[1]! : \"\";\r\n changes.push({\r\n from: line.from + indent.length,\r\n to: line.from + indent.length,\r\n insert: actualMarker,\r\n });\r\n orderNum++;\r\n }\r\n }\r\n\r\n if (changes.length > 0) {\r\n view.dispatch({ changes });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n const line = view.state.doc.lineAt(from);\r\n const cursorInLine = ctx.cursorInRange(line.from, line.to);\r\n\r\n switch (name) {\r\n case \"ListItem\":\r\n this.decorateListItem(node, line, decorations);\r\n break;\r\n\r\n case \"ListMark\":\r\n this.decorateListMark(node, line, decorations, cursorInLine);\r\n break;\r\n\r\n case \"TaskMarker\":\r\n this.decorateTaskMarker(from, to, view, decorations, cursorInLine);\r\n break;\r\n }\r\n },\r\n });\r\n }\r\n\r\n /** Add line decoration for list items with nesting depth */\r\n private decorateListItem(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\r\n line: { from: number },\r\n decorations: Range<Decoration>[]\r\n ): void {\r\n const parent = node.node.parent;\r\n const listType = parent?.name;\r\n\r\n // Calculate nesting depth\r\n let depth = 0;\r\n let ancestor = node.node.parent;\r\n while (ancestor) {\r\n if (ancestor.name === \"ListItem\") depth++;\r\n ancestor = ancestor.parent;\r\n }\r\n\r\n // Check for task marker child\r\n const hasTask = this.hasTaskChild(node);\r\n\r\n // Determine line class based on list type\r\n let lineClass: string;\r\n if (hasTask) lineClass = classes.taskLine;\r\n else if (listType === \"OrderedList\") lineClass = classes.lineOL;\r\n else lineClass = classes.lineUL;\r\n\r\n decorations.push(\r\n Decoration.line({\r\n class: lineClass,\r\n attributes: { style: `--depth: ${depth}` },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n /** Check if a ListItem node has a Task child */\r\n private hasTaskChild(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0]\r\n ): boolean {\r\n const cursor = node.node.cursor();\r\n if (cursor.firstChild()) {\r\n do {\r\n if (cursor.name === \"Task\") return true;\r\n } while (cursor.nextSibling());\r\n }\r\n return false;\r\n }\r\n\r\n /** Decorate list markers (bullets for UL, numbers for OL) */\r\n private decorateListMark(\r\n node: Parameters<NonNullable<Parameters<ReturnType<typeof syntaxTree>[\"iterate\"]>[0][\"enter\"]>>[0],\r\n line: { from: number; to: number },\r\n decorations: Range<Decoration>[],\r\n cursorInLine: boolean\r\n ): void {\r\n const { from, to } = node;\r\n const parent = node.node.parent;\r\n const grandparent = parent?.parent;\r\n const listType = grandparent?.name;\r\n const activeClass = cursorInLine ? classes.active : \"\";\r\n\r\n // Add indent decoration for nested items\r\n if (from > line.from) {\r\n decorations.push(Decoration.mark({ class: classes.indent + activeClass }).range(line.from, from));\r\n }\r\n\r\n // Add marker decoration based on list type\r\n const markClass = listType === \"OrderedList\" ? classes.markOL : classes.markUL;\r\n decorations.push(Decoration.mark({ class: markClass + activeClass }).range(from, to + 1));\r\n\r\n // Wrap remaining line content\r\n const contentStart = to + 1;\r\n if (contentStart < line.to) {\r\n decorations.push(Decoration.mark({ class: classes.content }).range(contentStart, line.to));\r\n }\r\n }\r\n\r\n /** Decorate task markers - show checkbox widget or raw text based on cursor */\r\n private decorateTaskMarker(\r\n from: number,\r\n to: number,\r\n view: EditorView,\r\n decorations: Range<Decoration>[],\r\n cursorInLine: boolean\r\n ): void {\r\n const text = view.state.sliceDoc(from, to);\r\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\r\n\r\n if (cursorInLine) {\r\n // Show raw marker when editing\r\n decorations.push(Decoration.mark({ class: classes.taskMarker }).range(from, to));\r\n } else {\r\n // Replace with interactive checkbox\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new TaskCheckboxWidget(isChecked),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n\r\n /** Render list nodes to HTML */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n switch (node.name) {\r\n case \"BulletList\":\r\n return `<ul class=\"${classes.lineUL} ${classes.preview}\">${children}</ul>\\n`;\r\n\r\n case \"OrderedList\":\r\n return `<ol class=\"${classes.lineOL} ${classes.preview}\">${children}</ol>\\n`;\r\n\r\n case \"ListItem\":\r\n return `<li>${children}</li>\\n`;\r\n\r\n case \"Task\":\r\n return children;\r\n\r\n case \"TaskMarker\": {\r\n const text = ctx.sliceDoc(node.from, node.to);\r\n const isChecked = text.includes(\"x\") || text.includes(\"X\");\r\n return `<input type=\"checkbox\" class=\"cm-draftly-task-checkbox\" disabled ${isChecked ? \"checked\" : \"\"} />`;\r\n }\r\n\r\n case \"ListMark\":\r\n return \"\";\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Theme\r\n// ============================================================================\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Indentation marker positioning\r\n \".cm-draftly-list-indent\": {\r\n overflow: \"hidden\",\r\n display: \"inline-block\",\r\n position: \"absolute\",\r\n left: \"calc(1rem * (var(--depth, 0) + 1))\",\r\n transform: \"translateX(-100%)\",\r\n },\r\n\r\n // List line layout (flexbox for marker alignment)\r\n \".cm-draftly-list-line-ul, .cm-draftly-list-line-ol\": {\r\n position: \"relative\",\r\n paddingLeft: \"calc(1rem * (var(--depth, 0) + 1)) !important\",\r\n display: \"flex\",\r\n alignItems: \"start\",\r\n },\r\n \".cm-draftly-list-line-ul > :first-child, .cm-draftly-list-line-ol > :first-child\": {\r\n flexShrink: 0,\r\n },\r\n\r\n // List marker sizing\r\n \".cm-draftly-list-line-ul .cm-draftly-list-mark-ul, .cm-draftly-list-line-ol .cm-draftly-list-mark-ol\": {\r\n whiteSpace: \"pre\",\r\n position: \"relative\",\r\n width: \"1rem\",\r\n flexShrink: 0,\r\n },\r\n\r\n // Hide raw marker text when not active\r\n \".cm-draftly-list-mark-ul:not(.cm-draftly-active) > span, .cm-draftly-task-line .cm-draftly-list-mark-ol:not(.cm-draftly-active) > span\":\r\n {\r\n visibility: \"hidden\",\r\n display: \"none\",\r\n },\r\n\r\n // Styled bullet for unordered lists\r\n \".cm-draftly-list-line-ul .cm-draftly-list-mark-ul:not(.cm-draftly-active)::after\": {\r\n content: '\"•\"',\r\n color: \"var(--color-link)\",\r\n fontWeight: \"bold\",\r\n pointerEvents: \"none\",\r\n },\r\n\r\n // Task marker styling (visible when editing)\r\n \".cm-draftly-task-marker\": {\r\n color: \"var(--draftly-highlight, #a4a4a4)\",\r\n fontFamily: \"monospace\",\r\n },\r\n\r\n // Task checkbox container\r\n \".cm-draftly-task-checkbox\": {\r\n display: \"inline-flex\",\r\n verticalAlign: \"middle\",\r\n marginRight: \"0.3em\",\r\n cursor: \"pointer\",\r\n userSelect: \"none\",\r\n alignItems: \"center\",\r\n height: \"1.2em\",\r\n },\r\n\r\n // Task checkbox input styling\r\n \".cm-draftly-task-checkbox input\": {\r\n cursor: \"pointer\",\r\n margin: 0,\r\n width: \"1.1em\",\r\n height: \"1.1em\",\r\n appearance: \"none\",\r\n border: \"1px solid\",\r\n borderRadius: \"0.25em\",\r\n backgroundColor: \"transparent\",\r\n position: \"relative\",\r\n },\r\n\r\n // Checkmark for completed tasks\r\n \".cm-draftly-task-checkbox.checked input::after\": {\r\n content: '\"✓\"',\r\n position: \"absolute\",\r\n left: \"1px\",\r\n top: \"-3px\",\r\n },\r\n\r\n // Preview styles (override editor-specific layout)\r\n \".cm-draftly-preview\": {\r\n display: \"block\",\r\n paddingLeft: \"1.5rem\",\r\n margin: \"0.5rem 0\",\r\n },\r\n \".cm-draftly-preview li\": {\r\n display: \"list-item\",\r\n marginBottom: \"0.25rem\",\r\n },\r\n \"ul.cm-draftly-preview\": {\r\n listStyleType: \"disc\",\r\n },\r\n \"ol.cm-draftly-preview\": {\r\n listStyleType: \"decimal\",\r\n },\r\n // Hide list marker for task items\r\n \".cm-draftly-preview li:has(.cm-draftly-task-checkbox)\": {\r\n listStyleType: \"none\",\r\n },\r\n \".cm-draftly-preview li .cm-draftly-paragraph\": {\r\n padding: \"0\",\r\n },\r\n },\r\n});\r\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 } from \"../editor\";\nimport { DraftlyConfig } from \"../editor/draftly\";\nimport { DecorationContext, DecorationPlugin, PluginContext } from \"../editor/plugin\";\nimport { ThemeEnum } from \"../editor/utils\";\nimport { PreviewRenderer } from \"../preview/renderer\";\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-draftly-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-draftly-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 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-draftly-table-controls-anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n\n const rightButton = this.createButton(\"Add column\", \"cm-draftly-table-control cm-draftly-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-draftly-table-control cm-draftly-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?: DraftlyConfig): 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?: DraftlyConfig): 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?: DraftlyConfig): Promise<string> {\n const normalized = normalizeParsedTable(parsed);\n let html = '<div class=\"cm-draftly-table-widget\"><table class=\"cm-draftly-table cm-draftly-table-preview\">';\n html += '<thead><tr class=\"cm-draftly-table-row cm-draftly-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-draftly-table-cell cm-draftly-table-th${\n alignment === \"center\"\n ? \" cm-draftly-table-cell-center\"\n : alignment === \"right\"\n ? \" cm-draftly-table-cell-right\"\n : \"\"\n }${index === normalized.headers.length - 1 ? \" cm-draftly-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-draftly-table-row cm-draftly-table-body-row${\n rowIndex % 2 === 1 ? \" cm-draftly-table-row-even\" : \"\"\n }${rowIndex === normalized.rows.length - 1 ? \" cm-draftly-table-row-last\" : \"\"}\">`;\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-draftly-table-cell${\n alignment === \"center\"\n ? \" cm-draftly-table-cell-center\"\n : alignment === \"right\"\n ? \" cm-draftly-table-cell-right\"\n : \"\"\n }${index === normalized.headers.length - 1 ? \" cm-draftly-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\nconst lineDecorations = {\n header: Decoration.line({ class: \"cm-draftly-table-row cm-draftly-table-header-row\" }),\n delimiter: Decoration.line({ class: \"cm-draftly-table-row cm-draftly-table-delimiter-row\" }),\n body: Decoration.line({ class: \"cm-draftly-table-row cm-draftly-table-body-row\" }),\n even: Decoration.line({ class: \"cm-draftly-table-row cm-draftly-table-body-row cm-draftly-table-row-even\" }),\n last: Decoration.line({ class: \"cm-draftly-table-row-last\" }),\n};\n\nconst cellDecorations = {\n \"th-left\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-th\" }),\n \"th-center\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-th cm-draftly-table-cell-center\" }),\n \"th-right\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-th cm-draftly-table-cell-right\" }),\n \"th-left-last\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-th cm-draftly-table-cell-last\" }),\n \"th-center-last\": Decoration.mark({\n class: \"cm-draftly-table-cell cm-draftly-table-th cm-draftly-table-cell-center cm-draftly-table-cell-last\",\n }),\n \"th-right-last\": Decoration.mark({\n class: \"cm-draftly-table-cell cm-draftly-table-th cm-draftly-table-cell-right cm-draftly-table-cell-last\",\n }),\n \"td-left\": Decoration.mark({ class: \"cm-draftly-table-cell\" }),\n \"td-center\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-cell-center\" }),\n \"td-right\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-cell-right\" }),\n \"td-left-last\": Decoration.mark({ class: \"cm-draftly-table-cell cm-draftly-table-cell-last\" }),\n \"td-center-last\": Decoration.mark({\n class: \"cm-draftly-table-cell cm-draftly-table-cell-center cm-draftly-table-cell-last\",\n }),\n \"td-right-last\": Decoration.mark({\n class: \"cm-draftly-table-cell cm-draftly-table-cell-right cm-draftly-table-cell-last\",\n }),\n} as const;\n\ntype CellDecorationKey = keyof typeof cellDecorations;\n\nfunction getCellDecoration(isHeader: boolean, alignment: Alignment, isLastCell: boolean): Decoration {\n const key = `${isHeader ? \"th\" : \"td\"}-${alignment}${isLastCell ? \"-last\" : \"\"}` as CellDecorationKey;\n return cellDecorations[key];\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 draftlyConfig: DraftlyConfig | 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.draftlyConfig = context.config;\n }\n\n /** Exposes the plugin theme used for editor and preview styling. */\n override get theme() {\n return theme;\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 EditorView.domEventHandlers({\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 /** 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.draftlyConfig);\n if (!trailingMarkdown.trim()) {\n return tableHtml;\n }\n\n return tableHtml + (await createPreviewRenderer(trailingMarkdown, this.draftlyConfig).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 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 const bodyIndex = isHeader || isDelimiter ? -1 : lineNumber - tableInfo.delimiterLineNumber - 1;\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 if (bodyIndex % 2 === 1) {\n decorations.push(lineDecorations.even.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 this.decorateLine(decorations, line.from, line.text, tableInfo.alignments, isHeader);\n }\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 /** 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 alignments: Alignment[],\n isHeader: boolean\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 decorations.push(\n getCellDecoration(isHeader, alignments[columnIndex] || \"left\", columnIndex === pipes.length - 2).range(\n absoluteFrom,\n 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 /** 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-draftly-table-wrapper, .cm-draftly-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-draftly-table\": {\n width: \"100%\",\n borderCollapse: \"separate\",\n borderSpacing: \"0\",\n tableLayout: \"auto\",\n },\n\n \"& .cm-draftly-table-row\": {\n display: \"table-row !important\",\n },\n\n \"& .cm-draftly-table-header-row\": {\n backgroundColor: \"rgba(15, 23, 42, 0.04)\",\n },\n\n \"& .cm-draftly-table-row-even\": {\n backgroundColor: \"rgba(15, 23, 42, 0.02)\",\n },\n\n \"& .cm-draftly-table-delimiter-row\": {\n display: \"none !important\",\n },\n\n \"& .cm-draftly-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-draftly-table-body-row\": {\n minHeight: \"2.75rem\",\n },\n\n \"& .cm-draftly-table-cell .cm-draftly-code-inline\": {\n whiteSpace: \"normal\",\n overflowWrap: \"anywhere\",\n },\n\n \"& .cm-draftly-table-th\": {\n fontWeight: \"600\",\n borderBottomWidth: \"2px\",\n },\n\n \"& .cm-draftly-table-cell-last\": {\n borderRight: \"none\",\n },\n\n \"& .cm-draftly-table-row-last .cm-draftly-table-cell\": {\n borderBottom: \"none\",\n },\n\n \"& .cm-draftly-table-cell-center\": {\n textAlign: \"center\",\n },\n\n \"& .cm-draftly-table-cell-right\": {\n textAlign: \"right\",\n },\n\n \"& .cm-draftly-table-break\": {\n display: \"inline\",\n },\n\n \"& .cm-draftly-table-controls-anchor\": {\n position: \"absolute\",\n inset: \"0\",\n pointerEvents: \"none\",\n },\n\n \"& .cm-draftly-table-control\": {\n position: \"absolute\",\n width: \"1.75rem\",\n height: \"1.75rem\",\n border: \"1px solid var(--color-border, #d7dee7)\",\n borderRadius: \"999px\",\n backgroundColor: \"var(--color-background, #ffffff)\",\n color: \"var(--color-text, #0f172a)\",\n boxShadow: \"0 10px 24px rgba(15, 23, 42, 0.12)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: \"0\",\n pointerEvents: \"auto\",\n transition: \"opacity 120ms ease, transform 120ms ease, background-color 120ms ease\",\n },\n\n \"& .cm-draftly-table-control:hover\": {\n backgroundColor: \"rgba(15, 23, 42, 0.05)\",\n },\n\n \"& .cm-draftly-table-control-column\": {\n top: \"50%\",\n right: \"-0.95rem\",\n transform: \"translate(0.35rem, -50%)\",\n },\n\n \"& .cm-draftly-table-control-row\": {\n left: \"50%\",\n bottom: \"-0.95rem\",\n transform: \"translate(-50%, 0.35rem)\",\n },\n\n \"&:hover .cm-draftly-table-control, &:focus-within .cm-draftly-table-control\": {\n opacity: \"1\",\n },\n\n \"&:hover .cm-draftly-table-control-column, &:focus-within .cm-draftly-table-control-column\": {\n transform: \"translate(0, -50%)\",\n },\n\n \"&:hover .cm-draftly-table-control-row, &:focus-within .cm-draftly-table-control-row\": {\n transform: \"translate(-50%, 0)\",\n },\n },\n },\n\n dark: {\n \".cm-draftly-table-wrapper, .cm-draftly-table-widget\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #0d1117)\",\n\n \"& .cm-draftly-table-header-row\": {\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\n },\n\n \"& .cm-draftly-table-row-even\": {\n backgroundColor: \"rgba(255, 255, 255, 0.025)\",\n },\n\n \"& .cm-draftly-table-cell\": {\n borderColor: \"var(--color-border, #30363d)\",\n },\n\n \"& .cm-draftly-table-control\": {\n borderColor: \"var(--color-border, #30363d)\",\n backgroundColor: \"var(--color-background, #161b22)\",\n color: \"var(--color-text, #e6edf3)\",\n boxShadow: \"0 12px 28px rgba(0, 0, 0, 0.35)\",\n },\n\n \"& .cm-draftly-table-control:hover\": {\n backgroundColor: \"rgba(255, 255, 255, 0.08)\",\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-draftly-html-tag\" }),\n \"html-comment\": Decoration.mark({ class: \"cm-draftly-html-comment\" }),\n};\n\n/**\n * Line decorations for HTML blocks (when visible)\n */\nconst htmlLineDecorations = {\n \"html-block\": Decoration.line({ class: \"cm-draftly-line-html-block\" }),\n \"hidden-line\": Decoration.line({ class: \"cm-draftly-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-draftly-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-draftly-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-draftly-html-tag\": {\n color: \"#6a737d\",\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\n fontSize: \"0.85em\",\n },\n\n \".cm-draftly-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-draftly-line-html-block\": {\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\n },\n\n \".cm-draftly-hidden-line\": {\n display: \"none\",\n },\n\n \".cm-draftly-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-draftly-html-preview > *:first-child\": {\n marginTop: \"0\",\n },\n \".cm-draftly-html-preview > *:last-child\": {\n marginBottom: \"0\",\n },\n\n \".cm-draftly-inline-html-preview\": {\n display: \"inline\",\n whiteSpace: \"normal\",\n },\n },\n});\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for image syntax elements\r\n */\r\nconst imageMarkDecorations = {\r\n \"image-block\": Decoration.line({ class: \"cm-draftly-image-block\" }),\r\n \"image-marker\": Decoration.mark({ class: \"cm-draftly-image-marker\" }),\r\n \"image-alt\": Decoration.mark({ class: \"cm-draftly-image-alt\" }),\r\n \"image-url\": Decoration.mark({ class: \"cm-draftly-image-url\" }),\r\n \"image-hidden\": Decoration.mark({ class: \"cm-draftly-image-hidden\" }),\r\n};\r\n\r\n/**\r\n * Parse image markdown to extract alt text, URL, and optional title\r\n * Format: ![alt text](url \"optional title\")\r\n */\r\nfunction parseImageMarkdown(content: string): { alt: string; url: string; title?: string } | null {\r\n // Regex to match: ![alt](url) or ![alt](url \"title\")\r\n const match = content.match(/^!\\[([^\\]]*)\\]\\(([^\"\\s)]+)(?:\\s+\"([^\"]*)\")?\\s*\\)$/);\r\n if (!match) return null;\r\n\r\n const result: { alt: string; url: string; title?: string } = {\r\n alt: match[1] || \"\",\r\n url: match[2]!,\r\n };\r\n\r\n if (match[3] !== undefined) {\r\n result.title = match[3];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Widget to render an image with optional caption using figure/figcaption\r\n * Placed below the markdown syntax as a widget decoration\r\n */\r\nclass ImageWidget extends WidgetType {\r\n constructor(\r\n readonly url: string,\r\n readonly alt: string,\r\n readonly from: number,\r\n readonly to: number,\r\n readonly title?: string\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: ImageWidget): boolean {\r\n return (\r\n other.url === this.url &&\r\n other.alt === this.alt &&\r\n other.from === this.from &&\r\n other.to === this.to &&\r\n other.title === this.title\r\n );\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n // Create figure element for semantic image container\r\n const figure = document.createElement(\"figure\");\r\n figure.className = \"cm-draftly-image-figure\";\r\n figure.setAttribute(\"role\", \"figure\");\r\n figure.style.cursor = \"pointer\";\r\n if (this.title) {\r\n figure.setAttribute(\"aria-label\", this.title);\r\n }\r\n\r\n // Click handler to select the raw markdown text\r\n figure.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n // Create image element with accessibility attributes\r\n const img = document.createElement(\"img\");\r\n img.className = \"cm-draftly-image\";\r\n img.src = this.url;\r\n img.alt = this.alt;\r\n img.setAttribute(\"loading\", \"lazy\");\r\n img.setAttribute(\"decoding\", \"async\");\r\n if (this.title) {\r\n img.title = this.title;\r\n }\r\n\r\n // Handle image loading error\r\n img.onerror = () => {\r\n img.style.display = \"none\";\r\n const errorSpan = document.createElement(\"span\");\r\n errorSpan.className = \"cm-draftly-image-error\";\r\n errorSpan.setAttribute(\"role\", \"alert\");\r\n errorSpan.textContent = `[Image not found: ${this.alt || this.url}]`;\r\n figure.appendChild(errorSpan);\r\n };\r\n\r\n figure.appendChild(img);\r\n\r\n // Add figcaption if title exists\r\n if (this.title) {\r\n const figcaption = document.createElement(\"figcaption\");\r\n figcaption.className = \"cm-draftly-image-caption\";\r\n figcaption.textContent = this.title;\r\n figure.appendChild(figcaption);\r\n }\r\n\r\n return figure;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n // Allow click events to be handled by our click handler\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * ImagePlugin - Decorates and renders images in markdown\r\n *\r\n * Supports the full image syntax: ![alt text](url \"optional title\")\r\n * - Shows image widget below the node when cursor is not in range\r\n * - Hides the markdown syntax when cursor is not in range\r\n * - Shows raw markdown when cursor is in the image syntax\r\n * - Uses figure/figcaption for semantic HTML with accessibility attributes\r\n */\r\nexport class ImagePlugin extends DecorationPlugin {\r\n readonly name = \"image\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"Image\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for image formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-Shift-i\",\r\n run: (view) => this.toggleImage(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * URL regex pattern\r\n */\r\n private readonly urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\r\n\r\n /**\r\n * Toggle image on selection\r\n * - If text selected and is a URL: ![Alt Text](url) with cursor in brackets\r\n * - If text selected (not URL): ![text]() with cursor in parentheses\r\n * - If nothing selected: ![Alt Text]() with cursor in parentheses\r\n * - If already an image: remove syntax, leave just the URL\r\n */\r\n private toggleImage(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to, empty } = state.selection.main;\r\n const selectedText = state.sliceDoc(from, to);\r\n\r\n // Check if selection is already an image ![alt](url)\r\n const imageMatch = selectedText.match(/^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/);\r\n if (imageMatch) {\r\n // Already an image - extract just the URL and replace\r\n const imageUrl = imageMatch[2] || \"\";\r\n view.dispatch({\r\n changes: { from, to, insert: imageUrl },\r\n selection: { anchor: from, head: from + imageUrl.length },\r\n });\r\n return true;\r\n }\r\n\r\n // Check if we're inside an image by looking at surrounding context\r\n const lineStart = state.doc.lineAt(from).from;\r\n const lineEnd = state.doc.lineAt(to).to;\r\n const lineText = state.sliceDoc(lineStart, lineEnd);\r\n\r\n // Find image pattern in line that contains the selection\r\n const imageRegex = /!\\[([^\\]]*)\\]\\(([^)]*)\\)/g;\r\n let match;\r\n while ((match = imageRegex.exec(lineText)) !== null) {\r\n const matchFrom = lineStart + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n\r\n // Check if selection is within this image\r\n if (from >= matchFrom && to <= matchTo) {\r\n // Remove the image syntax, leave just the URL\r\n const imageUrl = match[2] || \"\";\r\n view.dispatch({\r\n changes: { from: matchFrom, to: matchTo, insert: imageUrl },\r\n selection: { anchor: matchFrom, head: matchFrom + imageUrl.length },\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n if (empty) {\r\n // No selection - insert ![Alt Text]() and place cursor in parentheses\r\n const defaultAlt = \"Alt Text\";\r\n const newText = `![${defaultAlt}]()`;\r\n view.dispatch({\r\n changes: { from, insert: newText },\r\n selection: { anchor: from + defaultAlt.length + 4 }, // After ![Alt Text](\r\n });\r\n } else if (this.urlPattern.test(selectedText)) {\r\n // Selected text is a URL - put it in parentheses with default alt text\r\n const defaultAlt = \"Alt Text\";\r\n const newText = `![${defaultAlt}](${selectedText})`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + 2, head: from + 2 + defaultAlt.length }, // Select \"Alt Text\"\r\n });\r\n } else {\r\n // Selected text is not a URL - use as alt text, cursor in parentheses\r\n const newText = `![${selectedText}]()`;\r\n view.dispatch({\r\n changes: { from, to, insert: newText },\r\n selection: { anchor: from + selectedText.length + 4 }, // After ![text](\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle Image nodes\r\n if (name === \"Image\") {\r\n const content = view.state.sliceDoc(from, to);\r\n const parsed = parseImageMarkdown(content);\r\n\r\n if (!parsed) return;\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n // Add line decoration for image\r\n decorations.push(imageMarkDecorations[\"image-block\"].range(from));\r\n\r\n // Always add the image widget below the node\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new ImageWidget(parsed.url, parsed.alt, from, to, parsed.title),\r\n side: 1, // Place after the position\r\n block: false, // Don't create a new line\r\n }).range(to)\r\n );\r\n\r\n if (cursorInRange) {\r\n // Cursor in range: show raw markdown with styling\r\n this.decorateRawImage(node.node, decorations, view);\r\n } else {\r\n // Cursor out of range: hide the raw markdown text\r\n decorations.push(imageMarkDecorations[\"image-hidden\"].range(from, to));\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Decorate raw image markdown when cursor is in range\r\n */\r\n private decorateRawImage(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n // Find and style child nodes\r\n for (let child = node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"URL\") {\r\n decorations.push(imageMarkDecorations[\"image-url\"].range(child.from, child.to));\r\n }\r\n }\r\n\r\n // Style the markers (! [ ] ( ))\r\n const content = view.state.sliceDoc(node.from, node.to);\r\n const bangBracket = node.from; // Position of !\r\n if (content.startsWith(\"![\")) {\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(bangBracket, bangBracket + 2));\r\n }\r\n\r\n // Find and style closing bracket and parentheses\r\n const altEnd = content.indexOf(\"](\");\r\n if (altEnd !== -1) {\r\n const altStart = 2;\r\n // Style alt text\r\n if (altEnd > altStart) {\r\n decorations.push(imageMarkDecorations[\"image-alt\"].range(node.from + altStart, node.from + altEnd));\r\n }\r\n // Style ]( markers\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.from + altEnd, node.from + altEnd + 2));\r\n // Style closing )\r\n decorations.push(imageMarkDecorations[\"image-marker\"].range(node.to - 1, node.to));\r\n }\r\n }\r\n\r\n /**\r\n * Render image to HTML for preview mode using figure/figcaption\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name !== \"Image\") return null;\r\n\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const parsed = parseImageMarkdown(content);\r\n if (!parsed) return null;\r\n\r\n const altAttr = ctx.sanitize(parsed.alt);\r\n const titleAttr = parsed.title ? ` title=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n const ariaLabel = parsed.title ? ` aria-label=\"${ctx.sanitize(parsed.title)}\"` : \"\";\r\n\r\n let html = `<figure class=\"cm-draftly-image-figure\" role=\"figure\"${ariaLabel}>`;\r\n html += `<img class=\"cm-draftly-image\" src=\"${ctx.sanitize(parsed.url)}\" alt=\"${altAttr}\"${titleAttr} loading=\"lazy\" decoding=\"async\" />`;\r\n\r\n if (parsed.title) {\r\n html += `<figcaption class=\"cm-draftly-image-caption\">${ctx.sanitize(parsed.title)}</figcaption>`;\r\n }\r\n\r\n html += `</figure>`;\r\n return html;\r\n }\r\n}\r\n\r\n/**\r\n * Theme for image styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-image-block br\": {\r\n display: \"none\",\r\n },\r\n\r\n // Image markers (! [ ] ( ))\r\n \".cm-draftly-image-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Alt text\r\n \".cm-draftly-image-alt\": {\r\n color: \"#22863a\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // URL\r\n \".cm-draftly-image-url\": {\r\n color: \"#0366d6\",\r\n textDecoration: \"underline\",\r\n },\r\n\r\n // Hidden markdown syntax (when cursor is not in range)\r\n \".cm-draftly-image-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Figure container\r\n \".cm-draftly-image-figure\": {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"start\",\r\n maxWidth: \"100%\",\r\n padding: \"0\",\r\n },\r\n\r\n // Image element\r\n \".cm-draftly-image\": {\r\n maxWidth: \"100%\",\r\n maxHeight: \"800px\",\r\n height: \"auto\",\r\n borderRadius: \"4px\",\r\n },\r\n\r\n // Figcaption\r\n \".cm-draftly-image-caption\": {\r\n display: \"block\",\r\n width: \"100%\",\r\n fontSize: \"0.875em\",\r\n color: \"#6a737d\",\r\n marginTop: \"0.5em\",\r\n textAlign: \"center\",\r\n fontStyle: \"italic\",\r\n },\r\n\r\n // Error state\r\n \".cm-draftly-image-error\": {\r\n display: \"inline-block\",\r\n padding: \"0.5em 1em\",\r\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\r\n color: \"#d73a49\",\r\n borderRadius: \"4px\",\r\n fontSize: \"0.875em\",\r\n fontStyle: \"italic\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-image-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-image-alt\": {\r\n color: \"#7ee787\",\r\n },\r\n\r\n \".cm-draftly-image-url\": {\r\n color: \"#58a6ff\",\r\n },\r\n\r\n \".cm-draftly-image-caption\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-image-error\": {\r\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\r\n color: \"#f85149\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\r\nimport { Extension } from \"@codemirror/state\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport type { MarkdownConfig, InlineParser, BlockParser, Line, BlockContext } from \"@lezer/markdown\";\r\nimport katex from \"katex\";\r\nimport { createWrapSelectionInputHandler } from \"../lib\";\r\n// @ts-expect-error - raw import for CSS as string\r\nimport katexCss from \"katex/dist/katex.min.css?raw\";\r\n\r\n/**\r\n * Inject KaTeX CSS into the document head (only once)\r\n */\r\nfunction injectKatexStyles(): void {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(\"draftly-katex-styles\")) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"draftly-katex-styles\";\r\n style.textContent = katexCss;\r\n document.head.appendChild(style);\r\n}\r\n\r\n// Inject styles when module loads\r\ninjectKatexStyles();\r\n\r\n// Character codes\r\nconst DOLLAR = 36; // '$'\r\n\r\n/**\r\n * Mark decorations for math syntax elements\r\n */\r\nconst mathMarkDecorations = {\r\n \"math-block\": Decoration.line({ class: \"cm-draftly-math-block\" }),\r\n \"math-inline\": Decoration.mark({ class: \"cm-draftly-math-inline\" }),\r\n \"math-marker\": Decoration.mark({ class: \"cm-draftly-math-marker\" }),\r\n \"math-hidden\": Decoration.mark({ class: \"cm-draftly-math-hidden\" }),\r\n};\r\n\r\n/**\r\n * Render LaTeX to HTML using KaTeX\r\n */\r\nfunction renderMath(latex: string, displayMode: boolean): { html: string; error: string | null } {\r\n try {\r\n const html = katex.renderToString(latex, {\r\n displayMode,\r\n throwOnError: false,\r\n errorColor: \"#d73a49\",\r\n trust: false,\r\n strict: false,\r\n });\r\n return { html, error: null };\r\n } catch (e) {\r\n const errorMsg = e instanceof Error ? e.message : \"Unknown error\";\r\n return { html: \"\", error: errorMsg };\r\n }\r\n}\r\n\r\n/**\r\n * Widget to render inline math\r\n */\r\nclass InlineMathWidget extends WidgetType {\r\n constructor(\r\n readonly latex: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: InlineMathWidget): boolean {\r\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const span = document.createElement(\"span\");\r\n span.className = \"cm-draftly-math-rendered cm-draftly-math-rendered-inline\";\r\n span.style.cursor = \"pointer\";\r\n\r\n const { html, error } = renderMath(this.latex, false);\r\n\r\n if (error) {\r\n span.className += \" cm-draftly-math-error\";\r\n span.textContent = `[Math Error: ${error}]`;\r\n } else {\r\n span.innerHTML = html;\r\n }\r\n\r\n // Click handler to select the raw math text\r\n span.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n return span;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * Widget to render block math (display mode)\r\n */\r\nclass MathBlockWidget extends WidgetType {\r\n constructor(\r\n readonly latex: string,\r\n readonly from: number,\r\n readonly to: number\r\n ) {\r\n super();\r\n }\r\n\r\n override eq(other: MathBlockWidget): boolean {\r\n return other.latex === this.latex && other.from === this.from && other.to === this.to;\r\n }\r\n\r\n toDOM(view: EditorView) {\r\n const div = document.createElement(\"div\");\r\n div.className = \"cm-draftly-math-rendered cm-draftly-math-rendered-block\";\r\n div.style.cursor = \"pointer\";\r\n\r\n const { html, error } = renderMath(this.latex, true);\r\n\r\n if (error) {\r\n div.className += \" cm-draftly-math-error\";\r\n div.textContent = `[Math Error: ${error}]`;\r\n } else {\r\n div.innerHTML = html;\r\n }\r\n\r\n // Click handler to select the raw math text\r\n div.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n view.dispatch({\r\n selection: { anchor: this.from, head: this.to },\r\n scrollIntoView: true,\r\n });\r\n view.focus();\r\n });\r\n\r\n return div;\r\n }\r\n\r\n override ignoreEvent(event: Event) {\r\n return event.type !== \"click\";\r\n }\r\n}\r\n\r\n/**\r\n * Inline parser for inline math: $...$\r\n * Does not match $$ (block math markers)\r\n */\r\nconst inlineMathParser: InlineParser = {\r\n name: \"InlineMath\",\r\n parse(cx, next, pos) {\r\n // Check if we are at a $ character\r\n if (next !== DOLLAR) return -1;\r\n\r\n // Don't match $$ (that's block math)\r\n if (cx.char(pos + 1) === DOLLAR) return -1;\r\n\r\n // Find the closing $\r\n let end = pos + 1;\r\n while (end < cx.end) {\r\n const char = cx.char(end);\r\n if (char === DOLLAR) {\r\n // Found closing $, but make sure it's not $$\r\n if (cx.char(end + 1) !== DOLLAR) {\r\n // Extract the math content (excluding the $ markers)\r\n const content = cx.slice(pos + 1, end);\r\n\r\n // Skip empty math\r\n if (content.trim().length === 0) return -1;\r\n\r\n // Create the element with markers\r\n const openMark = cx.elt(\"InlineMathMark\", pos, pos + 1);\r\n const closeMark = cx.elt(\"InlineMathMark\", end, end + 1);\r\n const inlineMath = cx.elt(\"InlineMath\", pos, end + 1, [openMark, closeMark]);\r\n\r\n return cx.addElement(inlineMath);\r\n }\r\n // Skip $$ for block math\r\n return -1;\r\n }\r\n // Skip escaped characters\r\n if (char === 92 /* backslash */) {\r\n end += 2;\r\n continue;\r\n }\r\n end++;\r\n }\r\n\r\n return -1;\r\n },\r\n};\r\n\r\n/**\r\n * Block parser for math blocks: $$...$$\r\n */\r\nconst mathBlockParser: BlockParser = {\r\n name: \"MathBlock\",\r\n parse(cx: BlockContext, line: Line) {\r\n // Check if line starts with $$\r\n const text = line.text;\r\n const trimmed = text.slice(line.pos).trimStart();\r\n\r\n if (!trimmed.startsWith(\"$$\")) return false;\r\n\r\n // Find the end of the math block\r\n const startLine = cx.lineStart;\r\n let endPos = -1;\r\n let lastLineEnd = startLine + line.text.length;\r\n\r\n // Move past the opening line\r\n while (cx.nextLine()) {\r\n const currentText = line.text;\r\n lastLineEnd = cx.lineStart + currentText.length;\r\n\r\n // Check if this line contains closing $$\r\n if (currentText.trimEnd().endsWith(\"$$\")) {\r\n endPos = lastLineEnd;\r\n // Move past the closing line so subsequent markdown gets parsed\r\n cx.nextLine();\r\n break;\r\n }\r\n }\r\n\r\n if (endPos === -1) {\r\n // No closing found, treat as regular paragraph\r\n return false;\r\n }\r\n\r\n // Create the math block element\r\n const openMark = cx.elt(\"MathBlockMark\", startLine, startLine + text.indexOf(\"$$\") + 2);\r\n const closeMark = cx.elt(\"MathBlockMark\", endPos - 2, endPos);\r\n cx.addElement(cx.elt(\"MathBlock\", startLine, endPos, [openMark, closeMark]));\r\n\r\n return true;\r\n },\r\n};\r\n\r\n/**\r\n * MathPlugin - Renders LaTeX math expressions using KaTeX\r\n *\r\n * Supports:\r\n * - Inline math: $E = mc^2$\r\n * - Block math (display mode):\r\n * $$\r\n * \\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}\r\n * $$\r\n *\r\n * Behavior:\r\n * - Inline math: Show rendered output when cursor outside, raw LaTeX when inside\r\n * - Block math: Always show rendered output below, hide raw when cursor outside (like ImagePlugin)\r\n */\r\nexport class MathPlugin extends DecorationPlugin {\r\n readonly name = \"math\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"InlineMath\", \"MathBlock\", \"InlineMathMark\", \"MathBlockMark\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Intercepts dollar typing to wrap selected text as inline math.\r\n *\r\n * If user types '$' while text is selected, wraps each selected range\r\n * with single dollars (selected -> $selected$).\r\n */\r\n override getExtensions(): Extension[] {\r\n return [createWrapSelectionInputHandler({ \"$\": \"$\" })];\r\n }\r\n\r\n /**\r\n * Return markdown parser extensions for math syntax\r\n */\r\n override getMarkdownConfig(): MarkdownConfig {\r\n return {\r\n defineNodes: [\r\n { name: \"InlineMath\", style: tags.emphasis },\r\n { name: \"InlineMathMark\", style: tags.processingInstruction },\r\n { name: \"MathBlock\", block: true },\r\n { name: \"MathBlockMark\", style: tags.processingInstruction },\r\n ],\r\n parseInline: [inlineMathParser],\r\n parseBlock: [mathBlockParser],\r\n };\r\n }\r\n\r\n /**\r\n * Build decorations for math expressions\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n // Handle inline math\r\n if (name === \"InlineMath\") {\r\n const content = view.state.sliceDoc(from, to);\r\n // Extract LaTeX content (remove $ markers)\r\n const latex = content.slice(1, -1);\r\n\r\n const cursorInRange = ctx.selectionOverlapsRange(from, to);\r\n\r\n if (cursorInRange) {\r\n // Show raw math with styled markers\r\n decorations.push(mathMarkDecorations[\"math-inline\"].range(from, to));\r\n\r\n // Style the $ markers\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"InlineMathMark\") {\r\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\r\n }\r\n }\r\n } else {\r\n // Replace with rendered math widget\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new InlineMathWidget(latex, from, to),\r\n }).range(from, to)\r\n );\r\n }\r\n }\r\n\r\n // Handle math blocks\r\n if (name === \"MathBlock\") {\r\n const content = view.state.sliceDoc(from, to);\r\n\r\n // Extract LaTeX content (remove $$ markers and trim)\r\n const lines = content.split(\"\\n\");\r\n const latex = lines\r\n .slice(1, -1) // Remove first and last lines (the $$ markers)\r\n .join(\"\\n\")\r\n .trim();\r\n\r\n // If the block is simple (everything on one line), handle differently\r\n const singleLine = !content.includes(\"\\n\");\r\n const latexContent = singleLine ? content.slice(2, -2).trim() : latex;\r\n\r\n const nodeLineStart = view.state.doc.lineAt(from);\r\n const nodeLineEnd = view.state.doc.lineAt(to);\r\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\r\n\r\n // Add line decoration for math block\r\n decorations.push(mathMarkDecorations[\"math-block\"].range(from));\r\n\r\n // Always add the math block widget below the node (like image plugin)\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new MathBlockWidget(latexContent, from, to),\r\n side: 1,\r\n block: false,\r\n }).range(to)\r\n );\r\n\r\n for (let i = nodeLineStart.number; i <= nodeLineEnd.number; i++) {\r\n const line = view.state.doc.line(i);\r\n decorations.push(mathMarkDecorations[\"math-block\"].range(line.from));\r\n }\r\n\r\n // Cursor in range: show raw LaTeX with styling\r\n if (cursorInRange) {\r\n // Style the $$ markers\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"MathBlockMark\") {\r\n decorations.push(mathMarkDecorations[\"math-marker\"].range(child.from, child.to));\r\n }\r\n }\r\n } else {\r\n // Cursor out of range: hide the raw math text\r\n decorations.push(mathMarkDecorations[\"math-hidden\"].range(from, to));\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Render math to HTML for preview mode\r\n */\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n _children: string,\r\n ctx: { sliceDoc(from: number, to: number): string; sanitize(html: string): string }\r\n ): string | null {\r\n if (node.name === \"InlineMath\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const latex = content.slice(1, -1);\r\n const { html, error } = renderMath(latex, false);\r\n\r\n if (error) {\r\n return `<span class=\"cm-draftly-math-error\">[Math Error: ${ctx.sanitize(error)}]</span>`;\r\n }\r\n return `<span class=\"cm-draftly-math-rendered cm-draftly-math-rendered-inline\">${html}</span>`;\r\n }\r\n\r\n if (node.name === \"MathBlock\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const lines = content.split(\"\\n\");\r\n const latex = lines.length > 1 ? lines.slice(1, -1).join(\"\\n\").trim() : content.slice(2, -2).trim();\r\n const { html, error } = renderMath(latex, true);\r\n\r\n if (error) {\r\n return `<div class=\"cm-draftly-math-error\">[Math Error: ${ctx.sanitize(error)}]</div>`;\r\n }\r\n return `<div class=\"cm-draftly-math-rendered cm-draftly-math-rendered-block\">${html}</div>`;\r\n }\r\n\r\n // Hide math markers in preview\r\n if (node.name === \"InlineMathMark\" || node.name === \"MathBlockMark\") {\r\n return \"\";\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Theme for math styling\r\n */\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-math-block\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n \".cm-draftly-math-block br\": {\r\n display: \"none\",\r\n },\r\n\r\n // Math markers ($ $$)\r\n \".cm-draftly-math-marker\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Inline math styling when editing\r\n \".cm-draftly-math-inline\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9em\",\r\n },\r\n\r\n // Hidden math syntax (when cursor is not in range)\r\n \".cm-draftly-math-hidden\": {\r\n display: \"none\",\r\n },\r\n\r\n // Hidden line (for multi-line blocks)\r\n \".cm-draftly-hidden-line\": {\r\n display: \"none\",\r\n },\r\n\r\n // Rendered math container (both inline and block)\r\n \".cm-draftly-math-rendered\": {\r\n fontFamily: \"KaTeX_Main, 'Times New Roman', serif\",\r\n },\r\n\r\n // Inline rendered math\r\n \".cm-draftly-math-rendered-inline\": {\r\n display: \"inline\",\r\n verticalAlign: \"baseline\",\r\n },\r\n\r\n // Block rendered math (display mode)\r\n \".cm-draftly-math-rendered-block\": {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1em 0\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\r\n borderRadius: \"4px\",\r\n overflow: \"auto\",\r\n },\r\n\r\n // Math error styling\r\n \".cm-draftly-math-error\": {\r\n display: \"inline-block\",\r\n padding: \"0.25em 0.5em\",\r\n backgroundColor: \"rgba(255, 0, 0, 0.1)\",\r\n color: \"#d73a49\",\r\n borderRadius: \"4px\",\r\n fontSize: \"0.875em\",\r\n fontStyle: \"italic\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-math-marker\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-math-rendered-block\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.02)\",\r\n },\r\n\r\n \".cm-draftly-math-error\": {\r\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\r\n color: \"#f85149\",\r\n },\r\n },\r\n});\r\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 { 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 = `draftly-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-draftly-mermaid-block-start\" }),\n \"mermaid-block-end\": Decoration.line({ class: \"cm-draftly-mermaid-block-end\" }),\n \"mermaid-block\": Decoration.line({ class: \"cm-draftly-mermaid-block\" }),\n \"mermaid-block-rendered\": Decoration.line({ class: \"cm-draftly-mermaid-block-rendered\" }),\n \"mermaid-marker\": Decoration.mark({ class: \"cm-draftly-mermaid-marker\" }),\n \"mermaid-hidden\": Decoration.mark({ class: \"cm-draftly-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-draftly-mermaid-rendered\";\n div.style.cursor = \"pointer\";\n\n // Show loading state initially\n div.innerHTML = `<div class=\"cm-draftly-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-draftly-mermaid-error\";\n div.innerHTML = `<span>[Mermaid Error: ${error}]</span>`;\n } else {\n div.innerHTML = svg;\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-draftly-mermaid-error\">${ctx.sanitize(`[Mermaid Error: ${error}]`)}</div>`;\n }\n\n return `<div class=\"cm-draftly-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 theme = createTheme({\n default: {\n // Raw mermaid block lines (monospace)\n \".cm-draftly-mermaid-block:not(.cm-draftly-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-draftly-mermaid-block-start:not(.cm-draftly-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-draftly-mermaid-block-end:not(.cm-draftly-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-draftly-mermaid-block:not(.cm-draftly-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-draftly-mermaid-block.cm-draftly-mermaid-block-rendered br\": {\n display: \"none\",\n },\n\n // Mermaid markers (```mermaid / ```)\n \".cm-draftly-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-draftly-mermaid-hidden\": {\n display: \"none\",\n },\n\n // Rendered mermaid container\n \".cm-draftly-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-draftly-mermaid-rendered svg\": {\n maxWidth: \"100%\",\n height: \"auto\",\n aspectRatio: \"auto\",\n },\n\n // Loading state\n \".cm-draftly-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-draftly-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-draftly-mermaid-block:not(.cm-draftly-mermaid-block-rendered)\": {\n backgroundColor: \"rgba(255, 255, 255, 0.03)\",\n },\n\n \".cm-draftly-mermaid-marker\": {\n color: \"#8b949e\",\n },\n\n \".cm-draftly-mermaid-loading\": {\n color: \"#8b949e\",\n },\n\n \".cm-draftly-mermaid-error\": {\n backgroundColor: \"rgba(255, 0, 0, 0.15)\",\n color: \"#f85149\",\n },\n },\n});\n","import { createTheme } from \"../editor\";\r\n\r\n/** Shared theme styles for editor + preview code blocks. */\r\nexport const codePluginTheme = createTheme({\r\n default: {\r\n // Inline code\r\n \".cm-draftly-code-inline\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.05)\",\r\n padding: \"0.1rem 0.25rem\",\r\n border: \"1px solid var(--color-border)\",\r\n borderRadius: \"3px\",\r\n },\r\n\r\n // Fenced code block lines\r\n \".cm-draftly-code-block-line\": {\r\n \"--radius\": \"0.375rem\",\r\n\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\r\n padding: \"0 1rem !important\",\r\n lineHeight: \"1.5\",\r\n borderLeft: \"1px solid var(--color-border)\",\r\n borderRight: \"1px solid var(--color-border)\",\r\n },\r\n\r\n // First line of code block\r\n \".cm-draftly-code-block-line-start\": {\r\n borderTopLeftRadius: \"var(--radius)\",\r\n borderTopRightRadius: \"var(--radius)\",\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n borderTop: \"1px solid var(--color-border)\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n\r\n // Remove top radius when header is present\r\n \".cm-draftly-code-block-has-header\": {\r\n padding: \"0 !important\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n\r\n // Code block header widget\r\n \".cm-draftly-code-header\": {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"0.25rem 1rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.06)\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n\r\n \".cm-draftly-code-header-left\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"0.5rem\",\r\n\r\n \".cm-draftly-code-header-title\": {\r\n color: \"var(--color-text, inherit)\",\r\n fontWeight: \"500\",\r\n },\r\n\r\n \".cm-draftly-code-header-lang\": {\r\n color: \"#6a737d\",\r\n opacity: \"0.8\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-header-right\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"0.5rem\",\r\n\r\n \".cm-draftly-code-copy-btn\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"0.25rem\",\r\n backgroundColor: \"transparent\",\r\n border: \"none\",\r\n borderRadius: \"4px\",\r\n cursor: \"pointer\",\r\n color: \"#6a737d\",\r\n transition: \"color 0.2s, background-color 0.2s\",\r\n\r\n \"&:hover\": {\r\n backgroundColor: \"rgba(0, 0, 0, 0.1)\",\r\n color: \"var(--color-text, inherit)\",\r\n },\r\n\r\n \"&.copied\": {\r\n color: \"#22c55e\",\r\n },\r\n },\r\n },\r\n },\r\n\r\n // Caption (below code block)\r\n \".cm-draftly-code-block-has-caption\": {\r\n padding: \"0 !important\",\r\n paddingTop: \"0.5rem !important\",\r\n },\r\n\r\n \".cm-draftly-code-caption\": {\r\n textAlign: \"center\",\r\n fontSize: \"0.85rem\",\r\n color: \"#6a737d\",\r\n fontStyle: \"italic\",\r\n padding: \"0.25rem 1rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.06)\",\r\n },\r\n\r\n // Last line of code block\r\n \".cm-draftly-code-block-line-end\": {\r\n borderBottomLeftRadius: \"var(--radius)\",\r\n borderBottomRightRadius: \"var(--radius)\",\r\n borderBottom: \"1px solid var(--color-border)\",\r\n paddingTop: \"0.5rem !important\",\r\n\r\n \"& br\": {\r\n display: \"none\",\r\n },\r\n },\r\n\r\n // Fence markers (```)\r\n \".cm-draftly-code-fence\": {\r\n color: \"#6a737d\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n },\r\n\r\n // Line numbers\r\n \".cm-draftly-code-line-numbered\": {\r\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 1rem) !important\",\r\n position: \"relative\",\r\n\r\n \"&::before\": {\r\n content: \"attr(data-line-num)\",\r\n position: \"absolute\",\r\n left: \"0.5rem\",\r\n top: \"0.2rem\",\r\n width: \"var(--line-num-width, 2ch)\",\r\n textAlign: \"right\",\r\n color: \"#6a737d\",\r\n opacity: \"0.6\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n userSelect: \"none\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-numbered-diff\": {\r\n paddingLeft: \"calc(var(--line-num-old-width, 2ch) + var(--line-num-new-width, 2ch) + 2.75rem) !important\",\r\n position: \"relative\",\r\n\r\n \"&::before\": {\r\n content: \"attr(data-line-num-old)\",\r\n position: \"absolute\",\r\n left: \"0.5rem\",\r\n top: \"0.2rem\",\r\n width: \"var(--line-num-old-width, 2ch)\",\r\n textAlign: \"right\",\r\n color: \"#6a737d\",\r\n opacity: \"0.6\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n userSelect: \"none\",\r\n },\r\n\r\n \"&::after\": {\r\n content: 'attr(data-line-num-new) \" \" attr(data-diff-marker)',\r\n position: \"absolute\",\r\n left: \"calc(0.5rem + var(--line-num-old-width, 2ch) + 0.75rem)\",\r\n top: \"0.2rem\",\r\n width: \"calc(var(--line-num-new-width, 2ch) + 2ch)\",\r\n textAlign: \"right\",\r\n color: \"#6a737d\",\r\n opacity: \"0.6\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n userSelect: \"none\",\r\n },\r\n\r\n \"&.cm-draftly-code-line-diff-gutter\": {\r\n paddingLeft: \"calc(var(--line-num-width, 2ch) + 2rem) !important\",\r\n\r\n \"&::after\": {\r\n content: \"attr(data-diff-marker)\",\r\n position: \"absolute\",\r\n left: \"calc(0.5rem + var(--line-num-width, 2ch) + 0.35rem)\",\r\n top: \"0.1rem\",\r\n width: \"1ch\",\r\n textAlign: \"right\",\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.85rem\",\r\n fontWeight: \"700\",\r\n userSelect: \"none\",\r\n },\r\n },\r\n },\r\n\r\n // Preview: code lines (need block display for full-width highlights)\r\n \".cm-draftly-code-line\": {\r\n display: \"block\",\r\n position: \"relative\",\r\n paddingLeft: \"1rem\",\r\n paddingRight: \"1rem\",\r\n lineHeight: \"1.5\",\r\n borderLeft: \"3px solid transparent\",\r\n },\r\n\r\n // Line highlight\r\n \".cm-draftly-code-line-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.2) !important\",\r\n borderLeft: \"3px solid #f0b429 !important\",\r\n },\r\n\r\n \".cm-draftly-code-line-diff-add\": {\r\n color: \"inherit\",\r\n backgroundColor: \"rgba(34, 197, 94, 0.12) !important\",\r\n borderLeft: \"3px solid #22c55e !important\",\r\n\r\n \"&.cm-draftly-code-line-diff-gutter::after\": {\r\n color: \"#16a34a\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-diff-del\": {\r\n color: \"inherit\",\r\n backgroundColor: \"rgba(239, 68, 68, 0.12) !important\",\r\n borderLeft: \"3px solid #ef4444 !important\",\r\n\r\n \"&.cm-draftly-code-line-diff-gutter::after\": {\r\n color: \"#dc2626\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-diff-sign-add\": {\r\n color: \"#16a34a\",\r\n fontWeight: \"700\",\r\n },\r\n\r\n \".cm-draftly-code-diff-sign-del\": {\r\n color: \"#dc2626\",\r\n fontWeight: \"700\",\r\n },\r\n\r\n \".cm-draftly-code-diff-mod-add\": {\r\n color: \"inherit\",\r\n backgroundColor: \"rgba(34, 197, 94, 0.25)\",\r\n borderRadius: \"2px\",\r\n padding: \"0.1rem 0\",\r\n },\r\n\r\n \".cm-draftly-code-diff-mod-del\": {\r\n color: \"inherit\",\r\n backgroundColor: \"rgba(239, 68, 68, 0.25)\",\r\n borderRadius: \"2px\",\r\n padding: \"0.1rem 0\",\r\n },\r\n\r\n // Text highlight\r\n \".cm-draftly-code-text-highlight\": {\r\n color: \"inherit\",\r\n backgroundColor: \"rgba(255, 220, 100, 0.4)\",\r\n borderRadius: \"2px\",\r\n padding: \"0.1rem 0\",\r\n },\r\n\r\n // Preview: container wrapper\r\n \".cm-draftly-code-container\": {\r\n margin: \"1rem 0\",\r\n borderRadius: \"var(--radius)\",\r\n overflow: \"hidden\",\r\n border: \"1px solid var(--color-border)\",\r\n\r\n \".cm-draftly-code-header\": {\r\n borderRadius: \"0\",\r\n border: \"none\",\r\n borderBottom: \"1px solid var(--color-border)\",\r\n },\r\n\r\n \".cm-draftly-code-block\": {\r\n margin: \"0\",\r\n borderRadius: \"0\",\r\n border: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n },\r\n\r\n \".cm-draftly-code-caption\": {\r\n borderTop: \"1px solid var(--color-border)\",\r\n },\r\n },\r\n\r\n // Preview: standalone code block (not in container)\r\n \".cm-draftly-code-block\": {\r\n fontFamily: \"var(--font-jetbrains-mono, monospace)\",\r\n fontSize: \"0.9rem\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\r\n padding: \"1rem\",\r\n overflow: \"auto\",\r\n position: \"relative\",\r\n borderRadius: \"var(--radius)\",\r\n border: \"1px solid var(--color-border)\",\r\n\r\n \"&.cm-draftly-code-block-has-header\": {\r\n borderTopLeftRadius: \"0\",\r\n borderTopRightRadius: \"0\",\r\n borderTop: \"none\",\r\n margin: \"0\",\r\n paddingTop: \"0.5rem !important\",\r\n },\r\n\r\n \"&.cm-draftly-code-block-has-caption\": {\r\n borderBottomLeftRadius: \"0\",\r\n borderBottomRightRadius: \"0\",\r\n borderBottom: \"none\",\r\n paddingBottom: \"0.5rem !important\",\r\n },\r\n },\r\n },\r\n\r\n dark: {\r\n \".cm-draftly-code-inline\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\r\n },\r\n\r\n \".cm-draftly-code-block-line\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-fence\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-block\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-header\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.08)\",\r\n\r\n \".cm-draftly-code-header-lang\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \".cm-draftly-code-copy-btn\": {\r\n color: \"#8b949e\",\r\n\r\n \"&:hover\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\r\n },\r\n },\r\n },\r\n\r\n \".cm-draftly-code-caption\": {\r\n backgroundColor: \"rgba(255, 255, 255, 0.05)\",\r\n },\r\n\r\n \".cm-draftly-code-line-numbered\": {\r\n \"&::before\": {\r\n color: \"#8b949e\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-numbered-diff\": {\r\n \"&::before\": {\r\n color: \"#8b949e\",\r\n },\r\n\r\n \"&::after\": {\r\n color: \"#8b949e\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-diff-gutter\": {\r\n \"&::after\": {\r\n color: \"#8b949e\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.15) !important\",\r\n borderLeft: \"3px solid #d9a520 !important\",\r\n },\r\n\r\n \".cm-draftly-code-line-diff-add\": {\r\n backgroundColor: \"rgba(34, 197, 94, 0.15) !important\",\r\n borderLeft: \"3px solid #22c55e !important\",\r\n\r\n \"&.cm-draftly-code-line-diff-gutter::after\": {\r\n color: \"#4ade80\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-line-diff-del\": {\r\n backgroundColor: \"rgba(239, 68, 68, 0.15) !important\",\r\n borderLeft: \"3px solid #ef4444 !important\",\r\n\r\n \"&.cm-draftly-code-line-diff-gutter::after\": {\r\n color: \"#f87171\",\r\n },\r\n },\r\n\r\n \".cm-draftly-code-diff-sign-add\": {\r\n color: \"#4ade80\",\r\n },\r\n\r\n \".cm-draftly-code-diff-sign-del\": {\r\n color: \"#f87171\",\r\n },\r\n\r\n \".cm-draftly-code-diff-mod-add\": {\r\n backgroundColor: \"rgba(34, 197, 94, 0.3)\",\r\n },\r\n\r\n \".cm-draftly-code-diff-mod-del\": {\r\n backgroundColor: \"rgba(239, 68, 68, 0.3)\",\r\n },\r\n\r\n \".cm-draftly-code-text-highlight\": {\r\n backgroundColor: \"rgba(255, 220, 100, 0.3)\",\r\n },\r\n },\r\n});\r\n","import { Decoration, EditorView, KeyBinding, WidgetType } from \"@codemirror/view\";\r\nimport { Extension } from \"@codemirror/state\";\r\nimport { LanguageDescription, syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { toggleMarkdownStyle } from \"../editor\";\r\nimport { Parser, SyntaxNode } from \"@lezer/common\";\r\nimport { Highlighter, highlightCode } from \"@lezer/highlight\";\r\nimport { languages } from \"@codemirror/language-data\";\r\nimport { createWrapSelectionInputHandler } from \"../lib\";\r\nimport { codePluginTheme as theme } from \"./code-plugin.theme\";\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Copy icon SVG (clipboard) */\r\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>`;\r\n\r\n/** Checkmark icon SVG (success state) */\r\nconst CHECK_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\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\r\n\r\n/** Delay before resetting copy button state (ms) */\r\nconst COPY_RESET_DELAY = 2000;\r\n\r\n/** Code fence marker in markdown blocks */\r\nconst CODE_FENCE = \"```\";\r\n\r\n/** Regex for quoted code info values like title=\"file.ts\" */\r\nconst QUOTED_INFO_PATTERN = /(\\w+)=\"([^\"]*)\"/g;\r\n\r\n/** Regex for /pattern/ with optional instance selectors (/pattern/1-3,5) */\r\nconst TEXT_HIGHLIGHT_PATTERN = /\\/([^/]+)\\/(?:(\\d+(?:-\\d+)?(?:,\\d+(?:-\\d+)?)*))?/g;\r\n\r\ninterface PreviewRenderContext {\r\n sliceDoc(from: number, to: number): string;\r\n sanitize(html: string): string;\r\n syntaxHighlighters?: readonly Highlighter[];\r\n}\r\n\r\n// ============================================================================\r\n// Decorations\r\n// ============================================================================\r\n\r\n/** Mark and line decorations for code elements */\r\nconst codeMarkDecorations = {\r\n // Inline code\r\n \"inline-code\": Decoration.mark({ class: \"cm-draftly-code-inline\" }),\r\n \"inline-mark\": Decoration.replace({}),\r\n\r\n // Fenced code block\r\n \"code-block-line\": Decoration.line({ class: \"cm-draftly-code-block-line\" }),\r\n \"code-block-line-start\": Decoration.line({ class: \"cm-draftly-code-block-line-start\" }),\r\n \"code-block-line-end\": Decoration.line({ class: \"cm-draftly-code-block-line-end\" }),\r\n \"code-fence\": Decoration.mark({ class: \"cm-draftly-code-fence\" }),\r\n \"code-hidden\": Decoration.replace({}),\r\n\r\n // Highlights\r\n \"code-line-highlight\": Decoration.line({ class: \"cm-draftly-code-line-highlight\" }),\r\n \"code-text-highlight\": Decoration.mark({ class: \"cm-draftly-code-text-highlight\" }),\r\n\r\n // Diff preview\r\n \"diff-line-add\": Decoration.line({ class: \"cm-draftly-code-line-diff-add\" }),\r\n \"diff-line-del\": Decoration.line({ class: \"cm-draftly-code-line-diff-del\" }),\r\n \"diff-sign-add\": Decoration.mark({ class: \"cm-draftly-code-diff-sign-add\" }),\r\n \"diff-sign-del\": Decoration.mark({ class: \"cm-draftly-code-diff-sign-del\" }),\r\n \"diff-mod-add\": Decoration.mark({ class: \"cm-draftly-code-diff-mod-add\" }),\r\n \"diff-mod-del\": Decoration.mark({ class: \"cm-draftly-code-diff-mod-del\" }),\r\n \"diff-escape-hidden\": Decoration.replace({}),\r\n};\r\n\r\n/**\r\n * Text highlight definition\r\n * Matches text or regex patterns with optional instance selection\r\n */\r\nexport interface TextHighlight {\r\n /** The pattern to match (regex without slashes) */\r\n pattern: string;\r\n /** Specific instances to highlight (e.g., [3,5] or range [3,4,5]) */\r\n instances?: number[];\r\n}\r\n\r\n/**\r\n * Properties extracted from CodeInfo string\r\n *\r\n * Example: ```tsx line-numbers{5} title=\"hello.tsx\" caption=\"Example\" copy {2-4,5} /Hello/3-5\r\n */\r\nexport interface CodeBlockProperties {\r\n /** Language identifier (first token) */\r\n language: string;\r\n /** Show line numbers, optionally starting from a specific number */\r\n showLineNumbers?: number | boolean;\r\n /** Title to display */\r\n title?: string;\r\n /** Caption to display */\r\n caption?: string;\r\n /** Show copy button */\r\n copy?: boolean;\r\n /** Enable diff preview mode */\r\n diff?: boolean;\r\n /** Lines to highlight (e.g., [2,3,4,5,9]) */\r\n highlightLines?: number[];\r\n /** Text patterns to highlight with optional instance selection */\r\n highlightText?: TextHighlight[];\r\n}\r\n\r\ntype DiffLineKind = \"normal\" | \"addition\" | \"deletion\";\r\n\r\ninterface DiffLineState {\r\n kind: DiffLineKind;\r\n content: string;\r\n contentOffset: number;\r\n escapedMarker: boolean;\r\n modificationRanges?: Array<[number, number]>;\r\n}\r\n\r\ninterface DiffDisplayLineNumbers {\r\n oldLine: number | null;\r\n newLine: number | null;\r\n}\r\n\r\n// ============================================================================\r\n// Widgets\r\n// ============================================================================\r\n\r\n/**\r\n * Widget for code block header.\r\n * Displays title or language on the left, and a copy button on the right.\r\n */\r\nclass CodeBlockHeaderWidget extends WidgetType {\r\n constructor(\r\n private props: CodeBlockProperties,\r\n private codeContent: string\r\n ) {\r\n super();\r\n }\r\n\r\n /** Creates the header DOM element with title/language and optional copy button. */\r\n toDOM(): HTMLElement {\r\n const header = document.createElement(\"div\");\r\n header.className = \"cm-draftly-code-header\";\r\n\r\n // Left side: title or language\r\n const leftSide = document.createElement(\"div\");\r\n leftSide.className = \"cm-draftly-code-header-left\";\r\n\r\n if (this.props.title) {\r\n const title = document.createElement(\"span\");\r\n title.className = \"cm-draftly-code-header-title\";\r\n title.textContent = this.props.title;\r\n leftSide.appendChild(title);\r\n } else if (this.props.language) {\r\n const lang = document.createElement(\"span\");\r\n lang.className = \"cm-draftly-code-header-lang\";\r\n lang.textContent = this.props.language;\r\n leftSide.appendChild(lang);\r\n }\r\n\r\n header.appendChild(leftSide);\r\n\r\n // Right side: copy button\r\n if (this.props.copy !== false) {\r\n const rightSide = document.createElement(\"div\");\r\n rightSide.className = \"cm-draftly-code-header-right\";\r\n\r\n const copyBtn = document.createElement(\"button\");\r\n copyBtn.className = \"cm-draftly-code-copy-btn\";\r\n copyBtn.type = \"button\";\r\n copyBtn.title = \"Copy code\";\r\n copyBtn.innerHTML = COPY_ICON;\r\n\r\n copyBtn.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n navigator.clipboard.writeText(this.codeContent).then(() => {\r\n copyBtn.classList.add(\"copied\");\r\n copyBtn.innerHTML = CHECK_ICON;\r\n setTimeout(() => {\r\n copyBtn.classList.remove(\"copied\");\r\n copyBtn.innerHTML = COPY_ICON;\r\n }, COPY_RESET_DELAY);\r\n });\r\n });\r\n\r\n rightSide.appendChild(copyBtn);\r\n header.appendChild(rightSide);\r\n }\r\n\r\n return header;\r\n }\r\n\r\n /** Checks equality for widget reuse optimization. */\r\n override eq(other: CodeBlockHeaderWidget): boolean {\r\n return (\r\n this.props.title === other.props.title &&\r\n this.props.language === other.props.language &&\r\n this.props.copy === other.props.copy &&\r\n this.codeContent === other.codeContent\r\n );\r\n }\r\n\r\n /** Allow click events to propagate for copy button interaction. */\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Widget for code block caption.\r\n * Displays descriptive text below the code block.\r\n */\r\nclass CodeBlockCaptionWidget extends WidgetType {\r\n constructor(private caption: string) {\r\n super();\r\n }\r\n\r\n /** Creates the caption DOM element. */\r\n toDOM(): HTMLElement {\r\n const captionEl = document.createElement(\"div\");\r\n captionEl.className = \"cm-draftly-code-caption\";\r\n captionEl.textContent = this.caption;\r\n return captionEl;\r\n }\r\n\r\n /** Checks equality for widget reuse optimization. */\r\n override eq(other: CodeBlockCaptionWidget): boolean {\r\n return this.caption === other.caption;\r\n }\r\n\r\n /** Allow click events to propagate for caption interaction. */\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Plugin\r\n// ============================================================================\r\n\r\n/**\r\n * CodePlugin - Handles inline code and fenced code blocks.\r\n *\r\n * **Inline code:** `code`\r\n * Hides backticks when cursor is not in range.\r\n *\r\n * **Fenced code blocks:**\r\n * Supports syntax highlighting, line numbers, line/text highlighting,\r\n * title, caption, and copy button via CodeInfo properties.\r\n *\r\n * @example\r\n * ```tsx line-numbers{5} title=\"example.tsx\" {2-4} /pattern/\r\n * const x = 1;\r\n * ```\r\n */\r\nexport class CodePlugin extends DecorationPlugin {\r\n readonly name = \"code\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 25;\r\n override readonly requiredNodes = [\"InlineCode\", \"FencedCode\", \"CodeMark\", \"CodeInfo\", \"CodeText\"] as const;\r\n private readonly parserCache = new Map<string, Promise<Parser | null>>();\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Keyboard shortcuts for code formatting\r\n */\r\n override getKeymap(): KeyBinding[] {\r\n return [\r\n {\r\n key: \"Mod-e\",\r\n run: toggleMarkdownStyle(\"`\"),\r\n preventDefault: true,\r\n },\r\n {\r\n key: \"Mod-Shift-e\",\r\n run: (view) => this.toggleCodeBlock(view),\r\n preventDefault: true,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Intercepts backtick typing to wrap selected text as inline code.\r\n *\r\n * If user types '`' while text is selected, wraps each selected range\r\n * with backticks (selected -> `selected`).\r\n */\r\n override getExtensions(): Extension[] {\r\n return [createWrapSelectionInputHandler({ \"`\": \"`\" })];\r\n }\r\n\r\n /**\r\n * Toggle code block on current line or selected lines\r\n */\r\n private toggleCodeBlock(view: EditorView): boolean {\r\n const { state } = view;\r\n const { from, to } = state.selection.main;\r\n\r\n // Get all lines in selection\r\n const startLine = state.doc.lineAt(from);\r\n const endLine = state.doc.lineAt(to);\r\n\r\n // Check if lines are already in a code block\r\n const prevLineNum = startLine.number > 1 ? startLine.number - 1 : startLine.number;\r\n const nextLineNum = endLine.number < state.doc.lines ? endLine.number + 1 : endLine.number;\r\n\r\n const prevLine = state.doc.line(prevLineNum);\r\n const nextLine = state.doc.line(nextLineNum);\r\n\r\n const isWrapped =\r\n prevLine.text.trim().startsWith(CODE_FENCE) &&\r\n nextLine.text.trim() === CODE_FENCE &&\r\n prevLineNum !== startLine.number &&\r\n nextLineNum !== endLine.number;\r\n\r\n if (isWrapped) {\r\n // Remove the fence lines\r\n view.dispatch({\r\n changes: [\r\n { from: prevLine.from, to: prevLine.to + 1, insert: \"\" }, // Remove opening fence + newline\r\n { from: nextLine.from - 1, to: nextLine.to, insert: \"\" }, // Remove newline + closing fence\r\n ],\r\n });\r\n } else {\r\n // Wrap with code fence\r\n const openFence = `${CODE_FENCE}\\n`;\r\n const closeFence = `\\n${CODE_FENCE}`;\r\n\r\n view.dispatch({\r\n changes: [\r\n { from: startLine.from, insert: openFence },\r\n { from: endLine.to, insert: closeFence },\r\n ],\r\n selection: { anchor: startLine.from + openFence.length, head: endLine.to + openFence.length },\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Parse CodeInfo string into structured properties\r\n *\r\n * @param codeInfo - The raw CodeInfo string (e.g., \"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\r\n * @returns Parsed CodeBlockProperties object\r\n *\r\n * @example\r\n * ```typescript\r\n * parseCodeInfo(\"tsx line-numbers{5} title=\\\"hello.tsx\\\" copy {2-4,5} /Hello/3-5\")\r\n * ```\r\n *\r\n * Returns:\r\n * ```json\r\n * {\r\n * language: \"tsx\",\r\n * lineNumbers: 5,\r\n * title: \"hello.tsx\",\r\n * copy: true,\r\n * diff: false,\r\n * highlightLines: [2,3,4,5],\r\n * highlightText: [{ pattern: \"Hello\", instances: [3,4,5] }]\r\n * }\r\n * ```\r\n */\r\n parseCodeInfo(codeInfo: string): CodeBlockProperties {\r\n const props: CodeBlockProperties = { language: \"\" };\r\n\r\n if (!codeInfo || !codeInfo.trim()) {\r\n return props;\r\n }\r\n\r\n let remaining = codeInfo.trim();\r\n\r\n // Extract language (first token), but only when it isn't a known directive.\r\n const firstTokenMatch = remaining.match(/^([^\\s]+)/);\r\n if (firstTokenMatch && firstTokenMatch[1]) {\r\n const firstToken = firstTokenMatch[1];\r\n const normalizedToken = firstToken.toLowerCase();\r\n const isLineNumberDirective = /^(?:line-numbers|linenumbers|showlinenumbers)(?:\\{\\d+\\})?$/.test(\r\n normalizedToken\r\n );\r\n const isKnownDirective =\r\n isLineNumberDirective ||\r\n normalizedToken === \"copy\" ||\r\n normalizedToken === \"diff\" ||\r\n normalizedToken.startsWith(\"{\") ||\r\n normalizedToken.startsWith(\"/\");\r\n\r\n if (!isKnownDirective) {\r\n props.language = firstToken;\r\n remaining = remaining.slice(firstToken.length).trim();\r\n }\r\n }\r\n\r\n // Extract quoted values (title=\"...\" caption=\"...\")\r\n let quotedMatch;\r\n while ((quotedMatch = QUOTED_INFO_PATTERN.exec(remaining)) !== null) {\r\n const key = quotedMatch[1]?.toLowerCase();\r\n const value = quotedMatch[2];\r\n\r\n if (key === \"title\" && value !== undefined) {\r\n props.title = value;\r\n } else if (key === \"caption\" && value !== undefined) {\r\n props.caption = value;\r\n }\r\n }\r\n // Remove matched quoted values\r\n remaining = remaining.replace(QUOTED_INFO_PATTERN, \"\").trim();\r\n\r\n // Check for line numbers with optional start value.\r\n // Supports both `line-numbers` and legacy `showLineNumbers` tokens.\r\n const lineNumbersMatch = remaining.match(/\\b(?:line-numbers|lineNumbers|showLineNumbers)(?:\\{(\\d+)\\})?/i);\r\n if (lineNumbersMatch) {\r\n if (lineNumbersMatch[1]) {\r\n props.showLineNumbers = parseInt(lineNumbersMatch[1], 10);\r\n } else {\r\n props.showLineNumbers = true;\r\n }\r\n remaining = remaining.replace(lineNumbersMatch[0], \"\").trim();\r\n }\r\n\r\n // Check for copy flag\r\n if (/\\bcopy\\b/.test(remaining)) {\r\n props.copy = true;\r\n remaining = remaining.replace(/\\bcopy\\b/, \"\").trim();\r\n }\r\n\r\n // Check for diff flag\r\n if (/\\bdiff\\b/.test(remaining)) {\r\n props.diff = true;\r\n remaining = remaining.replace(/\\bdiff\\b/, \"\").trim();\r\n }\r\n\r\n // Extract line highlights {2-4,5,9}\r\n const lineHighlightMatch = remaining.match(/\\{([^}]+)\\}/);\r\n if (lineHighlightMatch && lineHighlightMatch[1]) {\r\n const highlightLines = this.parseNumberList(lineHighlightMatch[1]);\r\n\r\n if (highlightLines.length > 0) {\r\n props.highlightLines = highlightLines;\r\n }\r\n remaining = remaining.replace(lineHighlightMatch[0], \"\").trim();\r\n }\r\n\r\n // Extract text/regex highlights /pattern/ or /pattern/3-5 or /pattern/3,5\r\n let textMatch;\r\n const highlightText: TextHighlight[] = [];\r\n\r\n while ((textMatch = TEXT_HIGHLIGHT_PATTERN.exec(remaining)) !== null) {\r\n if (!textMatch[1]) continue;\r\n const highlight: TextHighlight = {\r\n pattern: textMatch[1],\r\n };\r\n\r\n // Parse instance selection if present\r\n if (textMatch[2]) {\r\n const instances = this.parseNumberList(textMatch[2]);\r\n\r\n if (instances.length > 0) {\r\n highlight.instances = instances;\r\n }\r\n }\r\n\r\n highlightText.push(highlight);\r\n }\r\n\r\n if (highlightText.length > 0) {\r\n props.highlightText = highlightText;\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /**\r\n * Build decorations for inline code and fenced code blocks.\r\n * Handles line numbers, highlights, header/caption widgets, and fence visibility.\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const tree = syntaxTree(ctx.view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n if (node.name === \"InlineCode\") {\r\n this.decorateInlineCode(node, ctx);\r\n return;\r\n }\r\n\r\n if (node.name === \"FencedCode\") {\r\n this.decorateFencedCode(node, ctx);\r\n }\r\n },\r\n });\r\n }\r\n\r\n private decorateInlineCode(node: { from: number; to: number; node: SyntaxNode }, ctx: DecorationContext): void {\r\n const { from, to } = node;\r\n ctx.decorations.push(codeMarkDecorations[\"inline-code\"].range(from, to));\r\n\r\n if (ctx.selectionOverlapsRange(from, to)) {\r\n return;\r\n }\r\n\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeMark\") {\r\n ctx.decorations.push(codeMarkDecorations[\"inline-mark\"].range(child.from, child.to));\r\n }\r\n }\r\n }\r\n\r\n private decorateFencedCode(node: { from: number; to: number; node: SyntaxNode }, ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const nodeLineStart = view.state.doc.lineAt(node.from);\r\n const nodeLineEnd = view.state.doc.lineAt(node.to);\r\n const cursorInRange = ctx.selectionOverlapsRange(nodeLineStart.from, nodeLineEnd.to);\r\n\r\n let infoProps: CodeBlockProperties = { language: \"\" };\r\n let codeContent = \"\";\r\n\r\n for (let child = node.node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeInfo\") {\r\n infoProps = this.parseCodeInfo(view.state.sliceDoc(child.from, child.to).trim());\r\n }\r\n if (child.name === \"CodeText\") {\r\n codeContent = view.state.sliceDoc(child.from, child.to);\r\n }\r\n }\r\n\r\n const codeLines: string[] = [];\r\n for (let i = nodeLineStart.number + 1; i <= nodeLineEnd.number - 1; i++) {\r\n const codeLine = view.state.doc.line(i);\r\n codeLines.push(view.state.sliceDoc(codeLine.from, codeLine.to));\r\n }\r\n\r\n const totalCodeLines = nodeLineEnd.number - nodeLineStart.number - 1;\r\n const startLineNum = typeof infoProps.showLineNumbers === \"number\" ? infoProps.showLineNumbers : 1;\r\n const maxLineNum = startLineNum + totalCodeLines - 1;\r\n const lineNumWidth = Math.max(String(maxLineNum).length, String(startLineNum).length);\r\n const highlightInstanceCounters = new Array(infoProps.highlightText?.length ?? 0).fill(0);\r\n\r\n const diffStates = infoProps.diff ? this.analyzeDiffLines(codeLines) : [];\r\n const diffDisplayLineNumbers = infoProps.diff ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum) : [];\r\n const displayLineNumbers = infoProps.diff\r\n ? diffDisplayLineNumbers.map((numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index)\r\n : codeLines.map((_, index) => startLineNum + index);\r\n const diffHighlightLineNumbers = infoProps.diff\r\n ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum).map(\r\n (numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index\r\n )\r\n : [];\r\n const maxOldDiffLineNum = diffDisplayLineNumbers.reduce((max, numbers) => {\r\n const oldLine = numbers.oldLine ?? 0;\r\n return oldLine > max ? oldLine : max;\r\n }, startLineNum);\r\n const maxNewDiffLineNum = diffDisplayLineNumbers.reduce((max, numbers) => {\r\n const newLine = numbers.newLine ?? 0;\r\n return newLine > max ? newLine : max;\r\n }, startLineNum);\r\n const diffOldLineNumWidth = Math.max(String(startLineNum).length, String(maxOldDiffLineNum).length);\r\n const diffNewLineNumWidth = Math.max(String(startLineNum).length, String(maxNewDiffLineNum).length);\r\n\r\n const shouldShowHeader = !cursorInRange && (infoProps.title || infoProps.copy || infoProps.language);\r\n const shouldShowCaption = !cursorInRange && !!infoProps.caption;\r\n\r\n if (shouldShowHeader) {\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new CodeBlockHeaderWidget(infoProps, codeContent),\r\n block: false,\r\n side: -1,\r\n }).range(nodeLineStart.from)\r\n );\r\n }\r\n\r\n let codeLineIndex = 0;\r\n for (let lineNumber = nodeLineStart.number; lineNumber <= nodeLineEnd.number; lineNumber++) {\r\n const line = view.state.doc.line(lineNumber);\r\n const isFenceLine = lineNumber === nodeLineStart.number || lineNumber === nodeLineEnd.number;\r\n const relativeLineNum = displayLineNumbers[codeLineIndex] ?? startLineNum + codeLineIndex;\r\n\r\n decorations.push(codeMarkDecorations[\"code-block-line\"].range(line.from));\r\n\r\n if (lineNumber === nodeLineStart.number) {\r\n decorations.push(codeMarkDecorations[\"code-block-line-start\"].range(line.from));\r\n if (shouldShowHeader) {\r\n decorations.push(Decoration.line({ class: \"cm-draftly-code-block-has-header\" }).range(line.from));\r\n }\r\n }\r\n\r\n if (lineNumber === nodeLineEnd.number) {\r\n decorations.push(codeMarkDecorations[\"code-block-line-end\"].range(line.from));\r\n if (shouldShowCaption) {\r\n decorations.push(Decoration.line({ class: \"cm-draftly-code-block-has-caption\" }).range(line.from));\r\n }\r\n }\r\n\r\n if (!isFenceLine && infoProps.showLineNumbers && !infoProps.diff) {\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-line-numbered\",\r\n attributes: {\r\n \"data-line-num\": String(relativeLineNum),\r\n style: `--line-num-width: ${lineNumWidth}ch`,\r\n },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n if (!isFenceLine && infoProps.showLineNumbers && infoProps.diff) {\r\n const diffLineNumbers = diffDisplayLineNumbers[codeLineIndex];\r\n const diffState = diffStates[codeLineIndex];\r\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-line-numbered-diff\",\r\n attributes: {\r\n \"data-line-num-old\": diffLineNumbers?.oldLine != null ? String(diffLineNumbers.oldLine) : \"\",\r\n \"data-line-num-new\": diffLineNumbers?.newLine != null ? String(diffLineNumbers.newLine) : \"\",\r\n \"data-diff-marker\": diffMarker,\r\n style: `--line-num-old-width: ${diffOldLineNumWidth}ch; --line-num-new-width: ${diffNewLineNumWidth}ch`,\r\n },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n if (!isFenceLine && infoProps.diff) {\r\n this.decorateDiffLine(\r\n line,\r\n codeLineIndex,\r\n diffStates,\r\n cursorInRange,\r\n !infoProps.showLineNumbers,\r\n decorations\r\n );\r\n }\r\n\r\n if (!isFenceLine && infoProps.highlightLines) {\r\n const highlightLineNumber = infoProps.diff\r\n ? (diffHighlightLineNumbers[codeLineIndex] ?? codeLineIndex + 1)\r\n : startLineNum + codeLineIndex;\r\n if (infoProps.highlightLines.includes(highlightLineNumber)) {\r\n decorations.push(codeMarkDecorations[\"code-line-highlight\"].range(line.from));\r\n }\r\n }\r\n\r\n if (!isFenceLine && infoProps.highlightText?.length) {\r\n this.decorateTextHighlights(\r\n line.from,\r\n view.state.sliceDoc(line.from, line.to),\r\n infoProps.highlightText,\r\n highlightInstanceCounters,\r\n decorations\r\n );\r\n }\r\n\r\n if (!isFenceLine) {\r\n codeLineIndex++;\r\n }\r\n }\r\n\r\n this.decorateFenceMarkers(node.node, cursorInRange, decorations);\r\n\r\n if (!cursorInRange && infoProps.caption) {\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new CodeBlockCaptionWidget(infoProps.caption),\r\n block: false,\r\n side: 1,\r\n }).range(nodeLineEnd.to)\r\n );\r\n }\r\n }\r\n\r\n private decorateFenceMarkers(\r\n node: SyntaxNode,\r\n cursorInRange: boolean,\r\n decorations: DecorationContext[\"decorations\"]\r\n ): void {\r\n for (let child = node.firstChild; child; child = child.nextSibling) {\r\n if (child.name === \"CodeMark\" || child.name === \"CodeInfo\") {\r\n decorations.push(\r\n (cursorInRange ? codeMarkDecorations[\"code-fence\"] : codeMarkDecorations[\"code-hidden\"]).range(\r\n child.from,\r\n child.to\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n private decorateDiffLine(\r\n line: { from: number; to: number },\r\n codeLineIndex: number,\r\n diffStates: DiffLineState[],\r\n cursorInRange: boolean,\r\n showDiffMarkerGutter: boolean,\r\n decorations: DecorationContext[\"decorations\"]\r\n ): void {\r\n const diffState = diffStates[codeLineIndex];\r\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\r\n\r\n if (showDiffMarkerGutter) {\r\n decorations.push(\r\n Decoration.line({\r\n class: \"cm-draftly-code-line-diff-gutter\",\r\n attributes: {\r\n \"data-diff-marker\": diffMarker,\r\n },\r\n }).range(line.from)\r\n );\r\n }\r\n\r\n if (diffState?.kind === \"addition\") {\r\n decorations.push(codeMarkDecorations[\"diff-line-add\"].range(line.from));\r\n if (cursorInRange && line.to > line.from) {\r\n decorations.push(codeMarkDecorations[\"diff-sign-add\"].range(line.from, line.from + 1));\r\n }\r\n }\r\n\r\n if (diffState?.kind === \"deletion\") {\r\n decorations.push(codeMarkDecorations[\"diff-line-del\"].range(line.from));\r\n if (cursorInRange && line.to > line.from) {\r\n decorations.push(codeMarkDecorations[\"diff-sign-del\"].range(line.from, line.from + 1));\r\n }\r\n }\r\n\r\n if (\r\n !cursorInRange &&\r\n line.to > line.from &&\r\n (diffState?.escapedMarker || diffState?.kind === \"addition\" || diffState?.kind === \"deletion\")\r\n ) {\r\n decorations.push(codeMarkDecorations[\"diff-escape-hidden\"].range(line.from, line.from + 1));\r\n }\r\n\r\n if (diffState?.modificationRanges?.length) {\r\n for (const [start, end] of diffState.modificationRanges) {\r\n const rangeFrom = line.from + diffState.contentOffset + start;\r\n const rangeTo = line.from + diffState.contentOffset + end;\r\n if (rangeTo > rangeFrom) {\r\n decorations.push(\r\n (diffState.kind === \"addition\"\r\n ? codeMarkDecorations[\"diff-mod-add\"]\r\n : codeMarkDecorations[\"diff-mod-del\"]\r\n ).range(rangeFrom, rangeTo)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private decorateTextHighlights(\r\n lineFrom: number,\r\n lineText: string,\r\n highlights: TextHighlight[],\r\n instanceCounters: number[],\r\n decorations: DecorationContext[\"decorations\"]\r\n ): void {\r\n for (const [highlightIndex, textHighlight] of highlights.entries()) {\r\n try {\r\n const regex = new RegExp(textHighlight.pattern, \"g\");\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(lineText)) !== null) {\r\n instanceCounters[highlightIndex] = (instanceCounters[highlightIndex] ?? 0) + 1;\r\n const globalMatchIndex = instanceCounters[highlightIndex];\r\n const shouldHighlight = !textHighlight.instances || textHighlight.instances.includes(globalMatchIndex);\r\n\r\n if (shouldHighlight) {\r\n const matchFrom = lineFrom + match.index;\r\n const matchTo = matchFrom + match[0].length;\r\n decorations.push(codeMarkDecorations[\"code-text-highlight\"].range(matchFrom, matchTo));\r\n }\r\n }\r\n } catch {\r\n // Invalid regex; ignore this highlight pattern.\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Render code elements to HTML for static preview.\r\n * Applies syntax highlighting using @lezer/highlight.\r\n */\r\n override async renderToHTML(node: SyntaxNode, _children: string, ctx: PreviewRenderContext): Promise<string | null> {\r\n // Hide CodeMark (backticks)\r\n if (node.name === \"CodeMark\") {\r\n return \"\";\r\n }\r\n\r\n // Inline code\r\n if (node.name === \"InlineCode\") {\r\n // Extract content without backticks\r\n let content = ctx.sliceDoc(node.from, node.to);\r\n // Remove leading and trailing backticks\r\n const match = content.match(/^`+(.+?)`+$/s);\r\n if (match && match[1]) {\r\n content = match[1];\r\n }\r\n return `<code class=\"cm-draftly-code-inline\" style=\"padding: 0.1rem 0.25rem\">${this.escapeHtml(content)}</code>`;\r\n }\r\n\r\n // Fenced code block\r\n if (node.name === \"FencedCode\") {\r\n const content = ctx.sliceDoc(node.from, node.to);\r\n const lines = content.split(\"\\n\");\r\n\r\n // Extract info string from first line (everything after ```)\r\n const firstLine = lines[0] || \"\";\r\n const infoMatch = firstLine.match(/^```(.*)$/);\r\n const infoString = infoMatch?.[1]?.trim() || \"\";\r\n\r\n // Parse properties from info string\r\n const props = this.parseCodeInfo(infoString);\r\n\r\n // Get code content (without fence lines)\r\n const codeLines = lines.slice(1, -1);\r\n const code = codeLines.join(\"\\n\");\r\n\r\n // Build HTML parts\r\n let html = \"\";\r\n\r\n // Wrapper container\r\n html += `<div class=\"cm-draftly-code-container\">`;\r\n\r\n // Header (if title, copy, or language is set)\r\n const showHeader = props.title || props.copy || props.language;\r\n if (showHeader) {\r\n html += `<div class=\"cm-draftly-code-header\">`;\r\n html += `<div class=\"cm-draftly-code-header-left\">`;\r\n if (props.title) {\r\n html += `<span class=\"cm-draftly-code-header-title\">${this.escapeHtml(props.title)}</span>`;\r\n } else if (props.language) {\r\n html += `<span class=\"cm-draftly-code-header-lang\">${this.escapeHtml(props.language)}</span>`;\r\n }\r\n html += `</div>`;\r\n if (props.copy !== false) {\r\n html += `<div class=\"cm-draftly-code-header-right\">`;\r\n // Encode code as base64 to safely store in data attribute (preserves newlines and special chars)\r\n const encodedCode =\r\n typeof btoa !== \"undefined\" ? btoa(encodeURIComponent(code)) : Buffer.from(code).toString(\"base64\");\r\n html += `<button class=\"cm-draftly-code-copy-btn\" type=\"button\" title=\"Copy code\" data-code=\"${encodedCode}\" data-encoded=\"true\">`;\r\n html += `<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>`;\r\n html += `</button>`;\r\n html += `</div>`;\r\n }\r\n html += `</div>`;\r\n }\r\n\r\n // Calculate line number info\r\n const startLineNum = typeof props.showLineNumbers === \"number\" ? props.showLineNumbers : 1;\r\n const previewHighlightCounters = new Array(props.highlightText?.length ?? 0).fill(0);\r\n const diffStates = props.diff ? this.analyzeDiffLines(codeLines) : [];\r\n const previewDiffLineNumbers = props.diff ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum) : [];\r\n const previewLineNumbers = props.diff\r\n ? previewDiffLineNumbers.map((numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index)\r\n : codeLines.map((_, index) => startLineNum + index);\r\n const previewHighlightLineNumbers = props.diff\r\n ? this.computeDiffDisplayLineNumbers(diffStates, startLineNum).map(\r\n (numbers, index) => numbers.newLine ?? numbers.oldLine ?? startLineNum + index\r\n )\r\n : [];\r\n const lineNumWidth = String(Math.max(...previewLineNumbers, startLineNum)).length;\r\n const previewOldLineNumWidth = String(\r\n Math.max(\r\n ...previewDiffLineNumbers.map((numbers) => numbers.oldLine ?? 0),\r\n startLineNum\r\n )\r\n ).length;\r\n const previewNewLineNumWidth = String(\r\n Math.max(\r\n ...previewDiffLineNumbers.map((numbers) => numbers.newLine ?? 0),\r\n startLineNum\r\n )\r\n ).length;\r\n const previewContentLines = props.diff ? diffStates.map((state) => state.content) : codeLines;\r\n const highlightedLines = await this.highlightCodeLines(\r\n previewContentLines.join(\"\\n\"),\r\n props.language || \"\",\r\n ctx.syntaxHighlighters\r\n );\r\n\r\n // Code block with line processing\r\n const hasHeader = showHeader ? \" cm-draftly-code-block-has-header\" : \"\";\r\n const hasCaption = props.caption ? \" cm-draftly-code-block-has-caption\" : \"\";\r\n html += `<pre class=\"cm-draftly-code-block${hasHeader}${hasCaption}\"${props.language ? ` data-lang=\"${this.escapeAttribute(props.language)}\"` : \"\"}>`;\r\n html += `<code>`;\r\n\r\n // Process each line\r\n codeLines.forEach((line, index) => {\r\n const lineNum = previewLineNumbers[index] ?? startLineNum + index;\r\n const highlightLineNumber = props.diff\r\n ? (previewHighlightLineNumbers[index] ?? startLineNum + index)\r\n : startLineNum + index;\r\n const isHighlighted = props.highlightLines?.includes(highlightLineNumber);\r\n const diffState = props.diff ? diffStates[index] : undefined;\r\n const diffLineNumbers = props.diff ? previewDiffLineNumbers[index] : undefined;\r\n\r\n // Line classes\r\n const lineClasses: string[] = [\"cm-draftly-code-line\"];\r\n if (isHighlighted) lineClasses.push(\"cm-draftly-code-line-highlight\");\r\n if (props.showLineNumbers) {\r\n lineClasses.push(props.diff ? \"cm-draftly-code-line-numbered-diff\" : \"cm-draftly-code-line-numbered\");\r\n }\r\n if (diffState?.kind === \"addition\") lineClasses.push(\"cm-draftly-code-line-diff-add\");\r\n if (diffState?.kind === \"deletion\") lineClasses.push(\"cm-draftly-code-line-diff-del\");\r\n\r\n // Line attributes\r\n const lineAttrs: string[] = [`class=\"${lineClasses.join(\" \")}\"`];\r\n if (props.showLineNumbers && !props.diff) {\r\n lineAttrs.push(`data-line-num=\"${lineNum}\"`);\r\n lineAttrs.push(`style=\"--line-num-width: ${lineNumWidth}ch\"`);\r\n }\r\n if (props.diff) {\r\n const diffMarker = diffState?.kind === \"addition\" ? \"+\" : diffState?.kind === \"deletion\" ? \"-\" : \" \";\r\n if (props.showLineNumbers) {\r\n lineAttrs.push(`data-line-num-old=\"${diffLineNumbers?.oldLine != null ? diffLineNumbers.oldLine : \"\"}\"`);\r\n lineAttrs.push(`data-line-num-new=\"${diffLineNumbers?.newLine != null ? diffLineNumbers.newLine : \"\"}\"`);\r\n lineAttrs.push(`data-diff-marker=\"${diffMarker}\"`);\r\n lineAttrs.push(\r\n `style=\"--line-num-old-width: ${previewOldLineNumWidth}ch; --line-num-new-width: ${previewNewLineNumWidth}ch\"`\r\n );\r\n } else {\r\n lineAttrs.push(`data-diff-marker=\"${diffMarker}\"`);\r\n lineClasses.push(\"cm-draftly-code-line-diff-gutter\");\r\n lineAttrs[0] = `class=\"${lineClasses.join(\" \")}\"`;\r\n }\r\n }\r\n\r\n // Highlight text content\r\n const highlightedLine = highlightedLines[index] ?? this.escapeHtml(previewContentLines[index] ?? line);\r\n let lineContent = highlightedLine;\r\n\r\n if (diffState) {\r\n lineContent = this.renderDiffPreviewLine(diffState, highlightedLine);\r\n }\r\n\r\n // Apply text highlights\r\n if (props.highlightText && props.highlightText.length > 0) {\r\n lineContent = this.applyTextHighlights(lineContent, props.highlightText, previewHighlightCounters);\r\n }\r\n\r\n html += `<span ${lineAttrs.join(\" \")}>${lineContent || \" \"}</span>`;\r\n });\r\n\r\n html += `</code></pre>`;\r\n\r\n // Caption\r\n if (props.caption) {\r\n html += `<div class=\"cm-draftly-code-caption\">${this.escapeHtml(props.caption)}</div>`;\r\n }\r\n\r\n // Close wrapper container\r\n html += `</div>`;\r\n\r\n return html;\r\n }\r\n\r\n // Hide CodeInfo and CodeText - they're handled by FencedCode\r\n if (node.name === \"CodeInfo\" || node.name === \"CodeText\") {\r\n return \"\";\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Parse comma-separated numbers and ranges (e.g. \"1,3-5\") into [1,3,4,5]. */\r\n private parseNumberList(value: string): number[] {\r\n const result: number[] = [];\r\n\r\n for (const part of value.split(\",\")) {\r\n const trimmed = part.trim();\r\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/);\r\n\r\n if (rangeMatch && rangeMatch[1] && rangeMatch[2]) {\r\n const start = parseInt(rangeMatch[1], 10);\r\n const end = parseInt(rangeMatch[2], 10);\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n continue;\r\n }\r\n\r\n if (/^\\d+$/.test(trimmed)) {\r\n result.push(parseInt(trimmed, 10));\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Highlight a single line of code using the language's Lezer parser.\r\n * Falls back to sanitized plain text if the language is not supported.\r\n */\r\n private async highlightCodeLines(\r\n code: string,\r\n lang: string,\r\n syntaxHighlighters?: readonly Highlighter[]\r\n ): Promise<string[]> {\r\n const rawLines = code.split(\"\\n\");\r\n if (!lang || !code) {\r\n return rawLines.map((line) => this.escapeHtml(line));\r\n }\r\n\r\n const parser = await this.resolveLanguageParser(lang);\r\n if (!parser) {\r\n return rawLines.map((line) => this.escapeHtml(line));\r\n }\r\n\r\n try {\r\n const tree = parser.parse(code);\r\n const highlightedLines: string[] = [\"\"];\r\n\r\n highlightCode(\r\n code,\r\n tree,\r\n syntaxHighlighters && syntaxHighlighters.length > 0 ? syntaxHighlighters : [],\r\n (text, classes) => {\r\n const chunk = classes\r\n ? `<span class=\"${this.escapeAttribute(classes)}\">${this.escapeHtml(text)}</span>`\r\n : this.escapeHtml(text);\r\n highlightedLines[highlightedLines.length - 1] += chunk;\r\n },\r\n () => {\r\n highlightedLines.push(\"\");\r\n }\r\n );\r\n\r\n return rawLines.map((line, index) => highlightedLines[index] || this.escapeHtml(line));\r\n } catch {\r\n return rawLines.map((line) => this.escapeHtml(line));\r\n }\r\n }\r\n\r\n private async resolveLanguageParser(lang: string): Promise<Parser | null> {\r\n const normalizedLang = this.normalizeLanguage(lang);\r\n if (!normalizedLang) return null;\r\n\r\n const cached = this.parserCache.get(normalizedLang);\r\n if (cached) return cached;\r\n\r\n const parserPromise = (async () => {\r\n const langDesc = LanguageDescription.matchLanguageName(languages, normalizedLang, true);\r\n\r\n if (!langDesc) return null;\r\n\r\n if (langDesc.support) {\r\n return langDesc.support.language.parser;\r\n }\r\n\r\n if (typeof langDesc.load === \"function\") {\r\n try {\r\n const support = await langDesc.load();\r\n return support.language.parser;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n })();\r\n\r\n this.parserCache.set(normalizedLang, parserPromise);\r\n return parserPromise;\r\n }\r\n\r\n private normalizeLanguage(lang: string): string {\r\n const normalized = lang.trim().toLowerCase();\r\n if (!normalized) return \"\";\r\n\r\n const normalizedMap: Record<string, string> = {\r\n \"c++\": \"cpp\",\r\n \"c#\": \"csharp\",\r\n \"f#\": \"fsharp\",\r\n py: \"python\",\r\n js: \"javascript\",\r\n ts: \"typescript\",\r\n sh: \"shell\",\r\n };\r\n\r\n return normalizedMap[normalized] ?? normalized;\r\n }\r\n\r\n private escapeHtml(value: string): string {\r\n return value\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n }\r\n\r\n private escapeAttribute(value: string): string {\r\n return this.escapeHtml(value).replace(/`/g, \"&#96;\");\r\n }\r\n\r\n private analyzeDiffLines(lines: string[]): DiffLineState[] {\r\n const states = lines.map((line) => this.parseDiffLineState(line));\r\n\r\n let index = 0;\r\n while (index < states.length) {\r\n if (states[index]?.kind !== \"deletion\") {\r\n index++;\r\n continue;\r\n }\r\n\r\n const deletionStart = index;\r\n while (index < states.length && states[index]?.kind === \"deletion\") {\r\n index++;\r\n }\r\n const deletionEnd = index;\r\n\r\n const additionStart = index;\r\n while (index < states.length && states[index]?.kind === \"addition\") {\r\n index++;\r\n }\r\n const additionEnd = index;\r\n\r\n if (additionStart === additionEnd) {\r\n continue;\r\n }\r\n\r\n const pairCount = Math.min(deletionEnd - deletionStart, additionEnd - additionStart);\r\n for (let pairIndex = 0; pairIndex < pairCount; pairIndex++) {\r\n const deletionState = states[deletionStart + pairIndex];\r\n const additionState = states[additionStart + pairIndex];\r\n\r\n if (!deletionState || !additionState) {\r\n continue;\r\n }\r\n\r\n const ranges = this.computeChangedRanges(deletionState.content, additionState.content);\r\n if (ranges.oldRanges.length > 0) {\r\n deletionState.modificationRanges = ranges.oldRanges;\r\n }\r\n if (ranges.newRanges.length > 0) {\r\n additionState.modificationRanges = ranges.newRanges;\r\n }\r\n }\r\n }\r\n\r\n return states;\r\n }\r\n\r\n private computeDiffDisplayLineNumbers(states: DiffLineState[], startLineNum: number): DiffDisplayLineNumbers[] {\r\n const numbers: DiffDisplayLineNumbers[] = [];\r\n let oldLineNumber = startLineNum;\r\n let newLineNumber = startLineNum;\r\n\r\n for (const state of states) {\r\n if (state.kind === \"deletion\") {\r\n numbers.push({ oldLine: oldLineNumber, newLine: null });\r\n oldLineNumber++;\r\n continue;\r\n }\r\n\r\n if (state.kind === \"addition\") {\r\n numbers.push({ oldLine: null, newLine: newLineNumber });\r\n newLineNumber++;\r\n continue;\r\n }\r\n\r\n numbers.push({ oldLine: oldLineNumber, newLine: newLineNumber });\r\n oldLineNumber++;\r\n newLineNumber++;\r\n }\r\n\r\n return numbers;\r\n }\r\n\r\n private parseDiffLineState(line: string): DiffLineState {\r\n const escapedMarker = line.startsWith(\"\\\\+\") || line.startsWith(\"\\\\-\");\r\n\r\n if (escapedMarker) {\r\n return {\r\n kind: \"normal\",\r\n content: line.slice(1),\r\n contentOffset: 1,\r\n escapedMarker: true,\r\n };\r\n }\r\n\r\n if (line.startsWith(\"+\")) {\r\n return {\r\n kind: \"addition\",\r\n content: line.slice(1),\r\n contentOffset: 1,\r\n escapedMarker: false,\r\n };\r\n }\r\n\r\n if (line.startsWith(\"-\")) {\r\n return {\r\n kind: \"deletion\",\r\n content: line.slice(1),\r\n contentOffset: 1,\r\n escapedMarker: false,\r\n };\r\n }\r\n\r\n return {\r\n kind: \"normal\",\r\n content: line,\r\n contentOffset: 0,\r\n escapedMarker: false,\r\n };\r\n }\r\n\r\n private computeChangedRanges(\r\n oldText: string,\r\n newText: string\r\n ): { oldRanges: Array<[number, number]>; newRanges: Array<[number, number]> } {\r\n let prefix = 0;\r\n while (prefix < oldText.length && prefix < newText.length && oldText[prefix] === newText[prefix]) {\r\n prefix++;\r\n }\r\n\r\n let oldSuffix = oldText.length;\r\n let newSuffix = newText.length;\r\n while (oldSuffix > prefix && newSuffix > prefix && oldText[oldSuffix - 1] === newText[newSuffix - 1]) {\r\n oldSuffix--;\r\n newSuffix--;\r\n }\r\n\r\n const oldRanges: Array<[number, number]> = [];\r\n const newRanges: Array<[number, number]> = [];\r\n\r\n if (oldSuffix > prefix) {\r\n oldRanges.push([prefix, oldSuffix]);\r\n }\r\n if (newSuffix > prefix) {\r\n newRanges.push([prefix, newSuffix]);\r\n }\r\n\r\n return { oldRanges, newRanges };\r\n }\r\n\r\n private renderDiffPreviewLine(diffState: DiffLineState, highlightedContent: string): string {\r\n const modClass =\r\n diffState.kind === \"addition\"\r\n ? \"cm-draftly-code-diff-mod-add\"\r\n : diffState.kind === \"deletion\"\r\n ? \"cm-draftly-code-diff-mod-del\"\r\n : \"\";\r\n\r\n const baseHighlightedContent = highlightedContent || this.escapeHtml(diffState.content);\r\n\r\n const contentHtml =\r\n diffState.modificationRanges && modClass\r\n ? this.applyRangesToHighlightedHTML(baseHighlightedContent, diffState.modificationRanges, modClass)\r\n : baseHighlightedContent;\r\n\r\n return contentHtml || \" \";\r\n }\r\n\r\n private applyRangesToHighlightedHTML(\r\n htmlContent: string,\r\n ranges: Array<[number, number]>,\r\n className: string\r\n ): string {\r\n const normalizedRanges = ranges\r\n .map(([start, end]) => [Math.max(0, start), Math.max(0, end)] as [number, number])\r\n .filter(([start, end]) => end > start)\r\n .sort((a, b) => a[0] - b[0]);\r\n\r\n if (normalizedRanges.length === 0 || !htmlContent) {\r\n return htmlContent;\r\n }\r\n\r\n const isInsideRange = (position: number) => {\r\n for (const [start, end] of normalizedRanges) {\r\n if (position >= start && position < end) return true;\r\n if (position < start) return false;\r\n }\r\n return false;\r\n };\r\n\r\n let result = \"\";\r\n let htmlIndex = 0;\r\n let textPosition = 0;\r\n let markOpen = false;\r\n\r\n while (htmlIndex < htmlContent.length) {\r\n const char = htmlContent[htmlIndex];\r\n\r\n if (char === \"<\") {\r\n const tagEnd = htmlContent.indexOf(\">\", htmlIndex);\r\n if (tagEnd === -1) {\r\n result += htmlContent.slice(htmlIndex);\r\n break;\r\n }\r\n result += htmlContent.slice(htmlIndex, tagEnd + 1);\r\n htmlIndex = tagEnd + 1;\r\n continue;\r\n }\r\n\r\n let token = char;\r\n if (char === \"&\") {\r\n const entityEnd = htmlContent.indexOf(\";\", htmlIndex);\r\n if (entityEnd !== -1) {\r\n token = htmlContent.slice(htmlIndex, entityEnd + 1);\r\n htmlIndex = entityEnd + 1;\r\n } else {\r\n htmlIndex += 1;\r\n }\r\n } else {\r\n htmlIndex += 1;\r\n }\r\n\r\n const shouldMark = isInsideRange(textPosition);\r\n\r\n if (shouldMark && !markOpen) {\r\n result += `<mark class=\"${className}\">`;\r\n markOpen = true;\r\n }\r\n if (!shouldMark && markOpen) {\r\n result += \"</mark>\";\r\n markOpen = false;\r\n }\r\n\r\n result += token;\r\n textPosition += 1;\r\n }\r\n\r\n if (markOpen) {\r\n result += \"</mark>\";\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Apply text highlights (regex patterns) to already syntax-highlighted HTML.\r\n * Wraps matched patterns in `<mark>` elements.\r\n */\r\n private applyTextHighlights(htmlContent: string, highlights: TextHighlight[], instanceCounters?: number[]): string {\r\n let result = htmlContent;\r\n\r\n for (const [highlightIndex, highlight] of highlights.entries()) {\r\n try {\r\n // Create regex from pattern\r\n const regex = new RegExp(`(${highlight.pattern})`, \"g\");\r\n let matchCount = instanceCounters?.[highlightIndex] ?? 0;\r\n\r\n result = result.replace(regex, (match) => {\r\n matchCount++;\r\n // Check if this instance should be highlighted\r\n const shouldHighlight = !highlight.instances || highlight.instances.includes(matchCount);\r\n if (shouldHighlight) {\r\n return `<mark class=\"cm-draftly-code-text-highlight\">${match}</mark>`;\r\n }\r\n return match;\r\n });\r\n\r\n if (instanceCounters) {\r\n instanceCounters[highlightIndex] = matchCount;\r\n }\r\n } catch {\r\n // Invalid regex, skip\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Decoration } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Mark decorations for blockquote elements\r\n */\r\nconst quoteMarkDecorations = {\r\n /** Decoration for the > marker */\r\n \"quote-mark\": Decoration.replace({}),\r\n /** Decoration for the quote content */\r\n \"quote-content\": Decoration.mark({ class: \"cm-draftly-quote-content\" }),\r\n};\r\n\r\n/**\r\n * Line decorations for blockquote lines\r\n */\r\nconst quoteLineDecorations = {\r\n /** Decoration for blockquote lines */\r\n \"quote-line\": Decoration.line({ class: \"cm-draftly-quote-line\" }),\r\n};\r\n\r\n/**\r\n * QuotePlugin - Decorates markdown blockquotes\r\n *\r\n * Adds visual styling to blockquotes (> prefixed lines)\r\n * - Line decorations for indicating quote blocks with a left border\r\n * - Mark decorations for quote content\r\n * - Hides > markers when cursor is not in the blockquote\r\n */\r\nexport class QuotePlugin extends DecorationPlugin {\r\n readonly name = \"quote\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 10;\r\n override readonly requiredNodes = [\"Blockquote\", \"QuoteMark\"] as const;\r\n\r\n /**\r\n * Constructor - calls super constructor\r\n */\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Build blockquote decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n if (name !== \"Blockquote\") {\r\n return;\r\n }\r\n\r\n // Process each line within the blockquote\r\n const startLine = view.state.doc.lineAt(from);\r\n const endLine = view.state.doc.lineAt(to);\r\n\r\n for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {\r\n const line = view.state.doc.line(lineNum);\r\n\r\n // Add line decoration for the blockquote border\r\n decorations.push(quoteLineDecorations[\"quote-line\"].range(line.from));\r\n }\r\n\r\n // Add mark decoration for the entire blockquote content\r\n decorations.push(quoteMarkDecorations[\"quote-content\"].range(from, to));\r\n\r\n // Hide quote markers when cursor is not in the blockquote\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInNode) {\r\n // Find all QuoteMark children (> symbols)\r\n this.hideQuoteMarks(node.node, decorations, view);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Recursively find and hide quote marks\r\n */\r\n private hideQuoteMarks(\r\n node: SyntaxNode,\r\n decorations: import(\"@codemirror/state\").Range<Decoration>[],\r\n view: import(\"@codemirror/view\").EditorView\r\n ): void {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.name === \"QuoteMark\") {\r\n // Clamp to line end so replace decoration never spans a newline\r\n const line = view.state.doc.lineAt(child.from);\r\n const markEnd = Math.min(child.to + 1, line.to);\r\n decorations.push(quoteMarkDecorations[\"quote-mark\"].range(child.from, markEnd));\r\n }\r\n // Recurse into nested blockquotes\r\n if (child.name === \"Blockquote\") {\r\n this.hideQuoteMarks(child, decorations, view);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n\r\n override renderToHTML(node: SyntaxNode, children: string): string | null {\r\n if (node.name === \"QuoteMark\") {\r\n return \"\";\r\n }\r\n\r\n if (node.name !== \"Blockquote\") {\r\n return null;\r\n }\r\n\r\n return `<blockquote class=\"cm-draftly-quote-line\"><div class=\"cm-draftly-quote-content\">${children}</div></blockquote>\\n`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Line styling with left border\r\n \".cm-draftly-quote-line\": {\r\n borderLeft: \"3px solid currentColor\",\r\n paddingLeft: \"1em !important\",\r\n paddingTop: \"0.25em !important\",\r\n paddingBottom: \"0.25em !important\",\r\n marginLeft: \"0.25em\",\r\n opacity: \"0.85\",\r\n },\r\n\r\n // Quote content styling\r\n \".cm-draftly-quote-content\": {\r\n fontStyle: \"italic\",\r\n },\r\n },\r\n});\r\n","import { Decoration } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\n\r\n/**\r\n * Line decoration for horizontal rule lines\r\n */\r\nconst hrLineDecoration = Decoration.line({ class: \"cm-draftly-hr-line\" });\r\n\r\n/**\r\n * Mark decoration to hide raw markers (---, ***, ___) when unfocused\r\n */\r\nconst hrMarkDecoration = Decoration.replace({});\r\n\r\n/**\r\n * HRPlugin - Decorates markdown horizontal rules\r\n *\r\n * Adds visual styling to thematic breaks (---, ***, ___)\r\n * - Line decoration that renders a centered horizontal line\r\n * - Hides raw marker characters when the cursor is not on the line\r\n */\r\nexport class HRPlugin extends DecorationPlugin {\r\n readonly name = \"hr\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 10;\r\n override readonly requiredNodes = [\"HorizontalRule\"] as const;\r\n\r\n /**\r\n * Constructor - calls super constructor\r\n */\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Build horizontal rule decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n if (name !== \"HorizontalRule\") {\r\n return;\r\n }\r\n\r\n // Add line decoration for the horizontal rule styling\r\n const line = view.state.doc.lineAt(from);\r\n decorations.push(hrLineDecoration.range(line.from));\r\n\r\n // Hide the raw markers when cursor is not on the line\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (!cursorInNode) {\r\n // Clamp to line end so replace decoration never spans a newline\r\n const markEnd = Math.min(to, line.to);\r\n decorations.push(hrMarkDecoration.range(from, markEnd));\r\n }\r\n },\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n override renderToHTML(node: SyntaxNode, _children: string): string | null {\r\n if (node.name !== \"HorizontalRule\") {\r\n return null;\r\n }\r\n\r\n return `<hr class=\"cm-draftly-hr-line\" />\\n`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n // Line styling — displays a centered horizontal line\r\n \".cm-draftly-hr-line\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: \"0.75em\",\r\n paddingBottom: \"0.75em\",\r\n border: \"none\",\r\n \"&::after\": {\r\n content: '\"\"',\r\n flex: \"1\",\r\n height: \"2px\",\r\n background: \"currentColor\",\r\n opacity: \"0.3\",\r\n },\r\n },\r\n },\r\n});\r\n","import { Decoration, WidgetType } from \"@codemirror/view\";\r\nimport { syntaxTree } from \"@codemirror/language\";\r\nimport { DecorationContext, DecorationPlugin } from \"../editor/plugin\";\r\nimport { createTheme } from \"../editor\";\r\nimport { SyntaxNode } from \"@lezer/common\";\r\nimport * as emoji from \"node-emoji\";\r\n\r\nfunction shortcodeToEmoji(raw: string): string | null {\r\n const rendered = emoji.emojify(raw);\r\n return rendered !== raw ? rendered : null;\r\n}\r\n\r\nclass EmojiWidget extends WidgetType {\r\n constructor(readonly rendered: string) {\r\n super();\r\n }\r\n\r\n override eq(other: EmojiWidget): boolean {\r\n return other.rendered === this.rendered;\r\n }\r\n\r\n toDOM() {\r\n const span = document.createElement(\"span\");\r\n span.className = \"cm-draftly-emoji\";\r\n span.textContent = this.rendered;\r\n return span;\r\n }\r\n\r\n override ignoreEvent(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Mark decorations for emoji syntax elements\r\n */\r\nconst emojiMarkDecorations = {\r\n \"emoji-source\": Decoration.mark({ class: \"cm-draftly-emoji-source\" }),\r\n};\r\n\r\n/**\r\n * EmojiPlugin - Decorates markdown emojis\r\n *\r\n * Parses and decorates emoji shortcodes like :smile:\r\n * - Converts valid shortcodes to Unicode emoji when cursor is outside\r\n * - Keeps raw shortcode visible while editing (cursor inside token)\r\n */\r\nexport class EmojiPlugin extends DecorationPlugin {\r\n readonly name = \"emoji\";\r\n readonly version = \"1.0.0\";\r\n override decorationPriority = 20;\r\n override readonly requiredNodes = [\"Emoji\", \"EmojiMark\"] as const;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Plugin theme\r\n */\r\n override get theme() {\r\n return theme;\r\n }\r\n\r\n /**\r\n * Build emoji decorations by iterating the syntax tree\r\n */\r\n buildDecorations(ctx: DecorationContext): void {\r\n const { view, decorations } = ctx;\r\n const tree = syntaxTree(view.state);\r\n\r\n tree.iterate({\r\n enter: (node) => {\r\n const { from, to, name } = node;\r\n\r\n if (name !== \"Emoji\") {\r\n return;\r\n }\r\n\r\n const raw = view.state.sliceDoc(from, to);\r\n const rendered = shortcodeToEmoji(raw);\r\n if (!rendered) {\r\n return;\r\n }\r\n\r\n const cursorInNode = ctx.selectionOverlapsRange(from, to);\r\n if (cursorInNode) {\r\n decorations.push(emojiMarkDecorations[\"emoji-source\"].range(from, to));\r\n return;\r\n }\r\n\r\n decorations.push(\r\n Decoration.replace({\r\n widget: new EmojiWidget(rendered),\r\n }).range(from, to)\r\n );\r\n },\r\n });\r\n }\r\n\r\n override renderToHTML(\r\n node: SyntaxNode,\r\n children: string,\r\n ctx: {\r\n sliceDoc(from: number, to: number): string;\r\n sanitize(html: string): string;\r\n syntaxHighlighters?: readonly import(\"@lezer/highlight\").Highlighter[];\r\n }\r\n ): string | null {\r\n if (node.name === \"EmojiMark\") {\r\n return \"\";\r\n }\r\n\r\n if (node.name !== \"Emoji\") {\r\n return null;\r\n }\r\n\r\n const raw = ctx.sliceDoc(node.from, node.to);\r\n const rendered = shortcodeToEmoji(raw);\r\n if (!rendered) {\r\n return `<span class=\"cm-draftly-emoji-source\">${children}</span>`;\r\n }\r\n\r\n return `<span class=\"cm-draftly-emoji\">${rendered}</span>`;\r\n }\r\n}\r\n\r\nconst theme = createTheme({\r\n default: {\r\n \".cm-draftly-emoji\": {\r\n fontFamily: '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", sans-serif',\r\n fontVariantEmoji: \"emoji\",\r\n lineHeight: \"1.2\",\r\n },\r\n \".cm-draftly-emoji-source\": {\r\n fontFamily: \"inherit\",\r\n lineHeight: \"inherit\",\r\n },\r\n },\r\n});\r\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 { ImagePlugin } from \"./image-plugin\";\nexport { MathPlugin } from \"./math-plugin\";\nexport { MermaidPlugin } from \"./mermaid-plugin\";\nexport { CodePlugin } from \"./code-plugin\";\nexport { QuotePlugin } from \"./quote-plugin\";\nexport { HRPlugin } from \"./hr-plugin\";\nexport { EmojiPlugin } from \"./emoji-plugin\";\n\n// Plugin collections\nimport { DraftlyPlugin } 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: DraftlyPlugin[] = [\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 draftly\n */\nconst allPlugins: DraftlyPlugin[] = [...essentialPlugins];\n\nexport { essentialPlugins, allPlugins };\n"]}