prosemirror-remark
Version:
ProseMirror Remark integration
1 lines • 278 kB
Source Map (JSON)
{"version":3,"file":"prosemirror-remark.cjs","sources":["../src/syntax-extensions/BlockquoteExtension.ts","../src/syntax-extensions/BoldExtension.ts","../src/syntax-extensions/BreakExtension.ts","../src/syntax-extensions/TextExtension.ts","../src/syntax-extensions/CodeBlockExtension.ts","../src/syntax-extensions/DefinitionExtension.ts","../src/syntax-extensions/ParagraphExtension.ts","../src/syntax-extensions/HeadingExtension.ts","../src/syntax-extensions/HorizontalRuleExtension.ts","../src/syntax-extensions/ImageExtension.ts","../src/syntax-extensions/ImageReferenceExtension.ts","../src/syntax-extensions/InlineCodeExtension.ts","../src/syntax-extensions/ItalicExtension.ts","../src/syntax-extensions/LinkExtension.ts","../src/syntax-extensions/LinkReferenceExtension.ts","../src/syntax-extensions/ListItemExtension.ts","../src/syntax-extensions/OrderedListExtension.ts","../src/syntax-extensions/RootExtension.ts","../src/syntax-extensions/UnorderedListExtension.ts","../src/MarkdownExtension.ts","../node_modules/ccount/index.js","../node_modules/devlop/lib/default.js","../node_modules/micromark-util-character/index.js","../node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp/index.js","../node_modules/unist-util-is/lib/index.js","../node_modules/unist-util-visit-parents/lib/color.js","../node_modules/unist-util-visit-parents/lib/index.js","../node_modules/mdast-util-find-and-replace/lib/index.js","../node_modules/mdast-util-gfm-autolink-literal/lib/index.js","../node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js","../src/utils/buildUnifiedExtension.ts","../src/syntax-extensions/ExtendedAutolinkExtension.ts","../node_modules/mdast-util-gfm-strikethrough/lib/index.js","../node_modules/micromark-util-chunked/index.js","../node_modules/micromark-util-classify-character/index.js","../node_modules/micromark-util-resolve-all/index.js","../node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../src/syntax-extensions/StrikethroughExtension.ts","../node_modules/mdast-util-to-markdown/lib/handle/blockquote.js","../node_modules/mdast-util-to-markdown/lib/util/pattern-in-scope.js","../node_modules/mdast-util-to-markdown/lib/handle/break.js","../node_modules/longest-streak/index.js","../node_modules/mdast-util-to-markdown/lib/util/format-code-as-indented.js","../node_modules/mdast-util-to-markdown/lib/util/check-fence.js","../node_modules/mdast-util-to-markdown/lib/handle/code.js","../node_modules/mdast-util-to-markdown/lib/util/check-quote.js","../node_modules/mdast-util-to-markdown/lib/handle/definition.js","../node_modules/mdast-util-to-markdown/lib/util/check-emphasis.js","../node_modules/mdast-util-to-markdown/lib/util/encode-character-reference.js","../node_modules/mdast-util-to-markdown/lib/util/encode-info.js","../node_modules/mdast-util-to-markdown/lib/handle/emphasis.js","../node_modules/unist-util-visit/lib/index.js","../node_modules/mdast-util-to-string/lib/index.js","../node_modules/mdast-util-to-markdown/lib/util/format-heading-as-setext.js","../node_modules/mdast-util-to-markdown/lib/handle/heading.js","../node_modules/mdast-util-to-markdown/lib/handle/html.js","../node_modules/mdast-util-to-markdown/lib/handle/image.js","../node_modules/mdast-util-to-markdown/lib/handle/image-reference.js","../node_modules/mdast-util-to-markdown/lib/handle/inline-code.js","../node_modules/mdast-util-to-markdown/lib/util/format-link-as-autolink.js","../node_modules/mdast-util-to-markdown/lib/handle/link.js","../node_modules/mdast-util-to-markdown/lib/handle/link-reference.js","../node_modules/mdast-util-to-markdown/lib/util/check-bullet.js","../node_modules/mdast-util-to-markdown/lib/util/check-bullet-other.js","../node_modules/mdast-util-to-markdown/lib/util/check-bullet-ordered.js","../node_modules/mdast-util-to-markdown/lib/util/check-rule.js","../node_modules/mdast-util-to-markdown/lib/handle/list.js","../node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js","../node_modules/mdast-util-to-markdown/lib/handle/list-item.js","../node_modules/mdast-util-to-markdown/lib/handle/paragraph.js","../node_modules/mdast-util-phrasing/lib/index.js","../node_modules/mdast-util-to-markdown/lib/handle/root.js","../node_modules/mdast-util-to-markdown/lib/util/check-strong.js","../node_modules/mdast-util-to-markdown/lib/handle/strong.js","../node_modules/mdast-util-to-markdown/lib/handle/text.js","../node_modules/mdast-util-to-markdown/lib/util/check-rule-repetition.js","../node_modules/mdast-util-to-markdown/lib/handle/thematic-break.js","../node_modules/mdast-util-to-markdown/lib/handle/index.js","../node_modules/mdast-util-gfm-task-list-item/lib/index.js","../node_modules/micromark-factory-space/index.js","../node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../src/syntax-extensions/TaskListItemExtension.ts","../src/GFMExtension.ts"],"sourcesContent":["import type { BlockContent, Blockquote, DefinitionContent } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { wrapIn } from \"prosemirror-commands\";\nimport { type InputRule, wrappingInputRule } from \"prosemirror-inputrules\";\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class BlockquoteExtension extends NodeExtension<Blockquote> {\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n wrappingInputRule(\n /^\\s{0,3}>\\s$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n return {\n \"Mod->\": wrapIn(proseMirrorSchema.nodes[this.proseMirrorNodeName()]),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"blockquote\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{ tag: \"blockquote\" }],\n toDOM(): DOMOutputSpec {\n return [\"blockquote\", 0];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n _node: ProseMirrorNode,\n convertedChildren: Array<BlockContent | DefinitionContent>,\n ): Array<Blockquote> {\n return [\n {\n children: convertedChildren,\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"blockquote\" {\n return \"blockquote\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Blockquote,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n}\n","import type { Emphasis, Strong, Text } from \"mdast\";\nimport type { InputRule } from \"prosemirror-inputrules\";\nimport type {\n DOMOutputSpec,\n MarkSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { toggleMark } from \"prosemirror-commands\";\nimport { MarkExtension, MarkInputRule } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class BoldExtension extends MarkExtension<Strong> {\n public override processConvertedUnistNode(\n convertedNode: Emphasis | Text,\n ): Strong {\n return { children: [convertedNode], type: this.unistNodeName() };\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n new MarkInputRule(\n /\\*\\*([^\\s](?:.*[^\\s])?)\\*\\*([\\s\\S])$/u,\n proseMirrorSchema.marks[this.proseMirrorMarkName()],\n ),\n new MarkInputRule(\n /__([^\\s](?:.*[^\\s])?)__([\\s\\S])$/u,\n proseMirrorSchema.marks[this.proseMirrorMarkName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const markType = proseMirrorSchema.marks[this.proseMirrorMarkName()];\n return {\n \"Mod-b\": toggleMark(markType),\n \"Mod-B\": toggleMark(markType),\n };\n }\n\n public override proseMirrorMarkName(): string {\n return \"strong\";\n }\n\n public override proseMirrorMarkSpec(): MarkSpec {\n return {\n parseDOM: [\n { tag: \"b\" },\n { tag: \"strong\" },\n {\n getAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/u.test(value) && null,\n style: \"font-weight\",\n },\n ],\n toDOM(): DOMOutputSpec {\n return [\"strong\", 0];\n },\n };\n }\n\n public override unistNodeName(): \"strong\" {\n return \"strong\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Strong,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return convertedChildren.map((child) =>\n child.mark(\n child.marks.concat([\n proseMirrorSchema.marks[this.proseMirrorMarkName()].create(),\n ]),\n ),\n );\n }\n}\n","import type { Break } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { chainCommands, exitCode } from \"prosemirror-commands\";\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class BreakExtension extends NodeExtension<Break> {\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const command = chainCommands(exitCode, (state, dispatch) => {\n if (dispatch) {\n dispatch(\n state.tr\n .replaceSelectionWith(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()].create(),\n )\n .scrollIntoView(),\n );\n }\n return true;\n });\n\n const isMac =\n typeof navigator !== \"undefined\"\n ? /Mac|iP(hone|[oa]d)/u.test(navigator.platform) // eslint-disable-line @typescript-eslint/no-deprecated -- In the tested systems, it will be defined\n : false;\n\n return {\n \"Mod-Enter\": command,\n \"Shift-Enter\": command,\n ...(isMac && { \"Ctrl-Enter\": command }),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"hard_break\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n group: \"inline\",\n inline: true,\n parseDOM: [{ tag: \"br\" }],\n selectable: false,\n toDOM(): DOMOutputSpec {\n return [\"br\"];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(): Array<Break> {\n return [{ type: this.unistNodeName() }];\n }\n\n public override unistNodeName(): \"break\" {\n return \"break\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Break,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n}\n","import type { Text } from \"mdast\";\nimport type {\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport { NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class TextExtension extends NodeExtension<Text> {\n public override proseMirrorNodeName(): string {\n return \"text\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n group: \"inline\",\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n node: ProseMirrorNode,\n ): Array<Text> {\n return [{ type: this.unistNodeName(), value: node.text ?? \"\" }];\n }\n\n public override unistNodeName(): \"text\" {\n return \"text\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Text,\n proseMirrorSchema: Schema<string, string>,\n ): Array<ProseMirrorNode> {\n return [proseMirrorSchema.text(node.value)];\n }\n}\n","import type { Code, Text } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport { setBlockType } from \"prosemirror-commands\";\nimport { type InputRule, textblockTypeInputRule } from \"prosemirror-inputrules\";\nimport {\n type Command,\n type EditorState,\n Selection,\n type Transaction,\n} from \"prosemirror-state\";\nimport {\n createProseMirrorNode,\n type Extension,\n NodeExtension,\n} from \"prosemirror-unified\";\n\nimport { TextExtension } from \"./TextExtension\";\n\n/**\n * @public\n */\nexport class CodeBlockExtension extends NodeExtension<Code> {\n private static liftOutOfCodeBlock() {\n return (\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n ): boolean => {\n const { $from, $to } = state.selection;\n if (\n // Mustn't be a complex selection\n !$from.sameParent($to) ||\n // Must be in a code block\n $from.parent.type.name !== \"code_block\" ||\n // Must be at the end of the code block\n $from.parentOffset !== $from.parent.content.size ||\n // There must already be a preceding empty line\n !$from.parent.textBetween(0, $from.parentOffset).endsWith(\"\\n\\n\")\n ) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n dispatch(\n tr\n // Delete the preceding empty line\n .deleteRange($from.pos - 2, $from.pos)\n // Insert empty paragraph\n .insert(\n $from.pos - 1,\n tr.doc.type.schema.nodes[\"paragraph\"].create(),\n )\n // Put the cursor into the empty paragraph\n .setSelection(Selection.near(tr.doc.resolve($from.pos), 1))\n .scrollIntoView(),\n );\n }\n return true;\n };\n }\n\n public override dependencies(): Array<Extension> {\n return [new TextExtension()];\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n textblockTypeInputRule(\n /^\\s{0,3}```$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n textblockTypeInputRule(\n /^\\s{4}$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n return {\n Enter: CodeBlockExtension.liftOutOfCodeBlock(),\n \"Shift-Mod-\\\\\": setBlockType(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"code_block\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n code: true,\n content: \"text*\",\n defining: true,\n group: \"block\",\n marks: \"\",\n parseDOM: [{ preserveWhitespace: \"full\", tag: \"pre\" }],\n toDOM(): DOMOutputSpec {\n return [\"pre\", [\"code\", 0]];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n _node: ProseMirrorNode,\n convertedChildren: Array<Text>,\n ): Array<Code> {\n return [\n {\n type: this.unistNodeName(),\n value: convertedChildren.map((child) => child.value).join(\"\"),\n },\n ];\n }\n\n public override unistNodeName(): \"code\" {\n return \"code\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Code,\n proseMirrorSchema: Schema<string, string>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n [proseMirrorSchema.text(node.value)],\n );\n }\n}\n","import type { Definition } from \"mdast\";\nimport type { Node as ProseMirrorNode, Schema } from \"prosemirror-model\";\n\nimport { NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport interface DefinitionExtensionContext {\n definitions: Record<\n string,\n { title: string | null | undefined; url: string }\n >;\n}\n\n/**\n * @public\n */\nexport class DefinitionExtension extends NodeExtension<Definition> {\n public override proseMirrorNodeName(): null {\n return null;\n }\n\n public override proseMirrorNodeSpec(): null {\n return null;\n }\n\n public override proseMirrorNodeToUnistNodes(): Array<Definition> {\n return [];\n }\n\n public override unistNodeName(): \"definition\" {\n return \"definition\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Definition,\n _proseMirrorSchema: Schema<string, string>,\n _convertedChildren: Array<ProseMirrorNode>,\n context: Partial<{\n DefinitionExtension: DefinitionExtensionContext;\n }>,\n ): Array<ProseMirrorNode> {\n context.DefinitionExtension ??= { definitions: {} };\n context.DefinitionExtension.definitions[node.identifier] = {\n title: node.title,\n url: node.url,\n };\n return [];\n }\n}\n","import type { Paragraph, PhrasingContent } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class ParagraphExtension extends NodeExtension<Paragraph> {\n public override proseMirrorNodeName(): string {\n return \"paragraph\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{ tag: \"p\" }],\n toDOM(): DOMOutputSpec {\n return [\"p\", 0];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n _node: ProseMirrorNode,\n convertedChildren: Array<PhrasingContent>,\n ): Array<Paragraph> {\n return [{ children: convertedChildren, type: this.unistNodeName() }];\n }\n\n public override unistNodeName(): \"paragraph\" {\n return \"paragraph\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Paragraph,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n}\n","import type { Heading, PhrasingContent } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command, EditorState } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { setBlockType } from \"prosemirror-commands\";\nimport { type InputRule, textblockTypeInputRule } from \"prosemirror-inputrules\";\nimport {\n createProseMirrorNode,\n type Extension,\n NodeExtension,\n} from \"prosemirror-unified\";\n\nimport { ParagraphExtension } from \"./ParagraphExtension\";\nimport { TextExtension } from \"./TextExtension\";\n\n/**\n * @public\n */\nexport class HeadingExtension extends NodeExtension<Heading> {\n private static headingLevelCommandBuilder(\n proseMirrorSchema: Schema<string, string>,\n levelUpdate: -1 | 1,\n onlyAtStart: boolean,\n ): Command {\n return (state, dispatch, view) => {\n if (onlyAtStart && !HeadingExtension.isAtStart(state, view)) {\n return false;\n }\n\n const { $anchor } = state.selection;\n const headingNode = $anchor.parent;\n if (headingNode.type.name !== \"heading\") {\n return false;\n }\n\n const newHeadingLevel =\n (headingNode.attrs[\"level\"] as number) + levelUpdate;\n\n if (newHeadingLevel < 0 || newHeadingLevel > 6) {\n return false;\n }\n if (dispatch === undefined) {\n return true;\n }\n\n const headingPosition = $anchor.before($anchor.depth);\n\n if (newHeadingLevel > 0) {\n dispatch(\n state.tr.setNodeMarkup(headingPosition, undefined, {\n level: newHeadingLevel,\n }),\n );\n } else {\n dispatch(\n state.tr.setNodeMarkup(\n headingPosition,\n proseMirrorSchema.nodes[\"paragraph\"],\n ),\n );\n }\n return true;\n };\n }\n\n private static isAtStart(\n state: EditorState,\n view: EditorView | undefined,\n ): boolean {\n if (!state.selection.empty) {\n return false;\n }\n if (view !== undefined) {\n return view.endOfTextblock(\"backward\", state);\n }\n return state.selection.$anchor.parentOffset > 0;\n }\n\n public override dependencies(): Array<Extension> {\n return [new ParagraphExtension(), new TextExtension()];\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n textblockTypeInputRule(\n /^\\s{0,3}(#{1,6})\\s$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n (match) => ({ level: match[1].length }),\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const keymap: Record<string, Command> = {\n \"#\": HeadingExtension.headingLevelCommandBuilder(\n proseMirrorSchema,\n 1,\n true,\n ),\n Backspace: HeadingExtension.headingLevelCommandBuilder(\n proseMirrorSchema,\n -1,\n true,\n ),\n \"Shift-Tab\": HeadingExtension.headingLevelCommandBuilder(\n proseMirrorSchema,\n -1,\n false,\n ),\n Tab: HeadingExtension.headingLevelCommandBuilder(\n proseMirrorSchema,\n 1,\n false,\n ),\n };\n\n for (let i = 1; i <= 6; i++) {\n keymap[`Shift-Mod-${i.toString()}`] = setBlockType(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n { level: i },\n );\n }\n return keymap;\n }\n\n public override proseMirrorNodeName(): string {\n return \"heading\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n attrs: { level: { default: 1 } },\n content: \"text*\",\n defining: true,\n group: \"block\",\n parseDOM: [\n { attrs: { level: 1 }, tag: \"h1\" },\n { attrs: { level: 2 }, tag: \"h2\" },\n { attrs: { level: 3 }, tag: \"h3\" },\n { attrs: { level: 4 }, tag: \"h4\" },\n { attrs: { level: 5 }, tag: \"h5\" },\n { attrs: { level: 6 }, tag: \"h6\" },\n ],\n toDOM(node: ProseMirrorNode): DOMOutputSpec {\n return [`h${(node.attrs[\"level\"] as number).toString()}`, 0];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n node: ProseMirrorNode,\n convertedChildren: Array<PhrasingContent>,\n ): Array<Heading> {\n return [\n {\n children: convertedChildren,\n depth: node.attrs[\"level\"] as 1 | 2 | 3 | 4 | 5 | 6,\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"heading\" {\n return \"heading\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Heading,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n {\n level: node.depth,\n },\n );\n }\n}\n","import type { ThematicBreak } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { InputRule } from \"prosemirror-inputrules\";\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class HorizontalRuleExtension extends NodeExtension<ThematicBreak> {\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n new InputRule(/^\\s{0,3}(?:\\*\\*\\*|---|___)\\n$/u, (state, _, start, end) =>\n state.tr.replaceWith(\n start,\n end,\n createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n [],\n ),\n ),\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n return {\n \"Mod-_\": (state, dispatch): true => {\n if (dispatch) {\n dispatch(\n state.tr\n .replaceSelectionWith(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()].create(),\n )\n .scrollIntoView(),\n );\n }\n return true;\n },\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"horizontal_rule\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n group: \"block\",\n parseDOM: [{ tag: \"hr\" }],\n toDOM(): DOMOutputSpec {\n return [\"div\", [\"hr\"]];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(): Array<ThematicBreak> {\n return [\n {\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"thematicBreak\" {\n return \"thematicBreak\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: ThematicBreak,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n}\n","import type { Image } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport {\n createProseMirrorNode,\n type Extension,\n NodeExtension,\n} from \"prosemirror-unified\";\n\nimport { ParagraphExtension } from \"./ParagraphExtension\";\n\n/**\n * @public\n */\nexport class ImageExtension extends NodeExtension<Image> {\n public override dependencies(): Array<Extension> {\n return [new ParagraphExtension()];\n }\n\n public override proseMirrorNodeName(): string {\n return \"image\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n attrs: {\n alt: { default: null },\n src: {},\n title: { default: null },\n },\n draggable: true,\n group: \"inline\",\n inline: true,\n parseDOM: [\n {\n getAttrs(dom: Node | string): {\n alt: string | null;\n src: string | null;\n title: string | null;\n } {\n return {\n alt: (dom as HTMLElement).getAttribute(\"alt\"),\n src: (dom as HTMLElement).getAttribute(\"src\"),\n title: (dom as HTMLElement).getAttribute(\"title\"),\n };\n },\n tag: \"img[src]\",\n },\n ],\n toDOM(node: ProseMirrorNode): DOMOutputSpec {\n return [\"img\", node.attrs];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n node: ProseMirrorNode,\n ): Array<Image> {\n return [\n {\n type: this.unistNodeName(),\n url: node.attrs[\"src\"] as string,\n ...(node.attrs[\"alt\"] !== null && { alt: node.attrs[\"alt\"] as string }),\n ...(node.attrs[\"title\"] !== null && {\n title: node.attrs[\"title\"] as string,\n }),\n },\n ];\n }\n\n public override unistNodeName(): \"image\" {\n return \"image\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Image,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n {\n alt: node.alt,\n src: node.url,\n title: node.title,\n },\n );\n }\n}\n","import type { ImageReference } from \"mdast\";\nimport type { Node as ProseMirrorNode, Schema } from \"prosemirror-model\";\n\nimport { type Extension, NodeExtension } from \"prosemirror-unified\";\n\nimport {\n DefinitionExtension,\n type DefinitionExtensionContext,\n} from \"./DefinitionExtension\";\nimport { ImageExtension } from \"./ImageExtension\";\n\n/**\n * @public\n */\nexport interface ImageReferenceExtensionContext {\n proseMirrorNodes: Record<string, ProseMirrorNode>;\n}\n\n/**\n * @public\n */\nexport class ImageReferenceExtension extends NodeExtension<ImageReference> {\n public override dependencies(): Array<Extension> {\n return [new DefinitionExtension(), new ImageExtension()];\n }\n\n public override postUnistToProseMirrorHook(\n context: Partial<{\n DefinitionExtension: DefinitionExtensionContext;\n ImageReferenceExtension: ImageReferenceExtensionContext;\n }>,\n ): void {\n if (\n context.ImageReferenceExtension === undefined ||\n context.DefinitionExtension === undefined\n ) {\n return;\n }\n for (const id in context.ImageReferenceExtension.proseMirrorNodes) {\n if (!(id in context.DefinitionExtension.definitions)) {\n continue;\n }\n const definition = context.DefinitionExtension.definitions[id];\n const attrs = context.ImageReferenceExtension.proseMirrorNodes[id]\n .attrs as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Attrs can be any\n any\n >;\n attrs[\"src\"] = definition.url;\n if (definition.title !== undefined) {\n attrs[\"title\"] = definition.title;\n }\n }\n }\n\n public override proseMirrorNodeName(): null {\n return null;\n }\n\n public override proseMirrorNodeSpec(): null {\n return null;\n }\n\n public override proseMirrorNodeToUnistNodes(): Array<ImageReference> {\n return [];\n }\n\n public override unistNodeName(): \"imageReference\" {\n return \"imageReference\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: ImageReference,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n context: Partial<{\n ImageReferenceExtension: ImageReferenceExtensionContext;\n }>,\n ): Array<ProseMirrorNode> {\n const proseMirrorNode = proseMirrorSchema.nodes[\"image\"].createAndFill(\n { alt: node.alt, src: \"\", title: node.label },\n convertedChildren,\n );\n if (proseMirrorNode === null) {\n return [];\n }\n context.ImageReferenceExtension ??= { proseMirrorNodes: {} };\n context.ImageReferenceExtension.proseMirrorNodes[node.identifier] =\n proseMirrorNode;\n return [proseMirrorNode];\n }\n}\n","import type { InlineCode, Text } from \"mdast\";\nimport type { InputRule } from \"prosemirror-inputrules\";\nimport type {\n DOMOutputSpec,\n MarkSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { toggleMark } from \"prosemirror-commands\";\nimport { MarkExtension, MarkInputRule } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class InlineCodeExtension extends MarkExtension<InlineCode> {\n public override processConvertedUnistNode(convertedNode: Text): InlineCode {\n return { type: this.unistNodeName(), value: convertedNode.value };\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n new MarkInputRule(\n /`([^\\s](?:.*[^\\s])?)`([\\s\\S])$/u,\n proseMirrorSchema.marks[this.proseMirrorMarkName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const markType = proseMirrorSchema.marks[this.proseMirrorMarkName()];\n return {\n \"Ctrl-`\": toggleMark(markType),\n };\n }\n\n public override proseMirrorMarkName(): string {\n return \"code\";\n }\n\n public override proseMirrorMarkSpec(): MarkSpec {\n return {\n inclusive: false,\n parseDOM: [{ tag: \"code\" }],\n toDOM(): DOMOutputSpec {\n return [\"code\", 0];\n },\n };\n }\n\n public override unistNodeName(): \"inlineCode\" {\n return \"inlineCode\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: InlineCode,\n proseMirrorSchema: Schema<string, string>,\n ): Array<ProseMirrorNode> {\n return [\n proseMirrorSchema\n .text(node.value)\n .mark([proseMirrorSchema.marks[this.proseMirrorMarkName()].create()]),\n ];\n }\n}\n","import type { Emphasis, Strong, Text } from \"mdast\";\nimport type { InputRule } from \"prosemirror-inputrules\";\nimport type {\n DOMOutputSpec,\n MarkSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\n\nimport { toggleMark } from \"prosemirror-commands\";\nimport { MarkExtension, MarkInputRule } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class ItalicExtension extends MarkExtension<Emphasis> {\n public override processConvertedUnistNode(\n convertedNode: Strong | Text,\n ): Emphasis {\n return { children: [convertedNode], type: this.unistNodeName() };\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n new MarkInputRule(\n /(?<!\\*)\\*([^\\s*](?:.*[^\\s])?)\\*([^*])$/u,\n proseMirrorSchema.marks[this.proseMirrorMarkName()],\n ),\n new MarkInputRule(\n /(?<!_)_([^\\s_](?:.*[^\\s])?)_([^_])$/u,\n proseMirrorSchema.marks[this.proseMirrorMarkName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const markType = proseMirrorSchema.marks[this.proseMirrorMarkName()];\n return {\n \"Mod-i\": toggleMark(markType),\n \"Mod-I\": toggleMark(markType),\n };\n }\n\n public override proseMirrorMarkName(): string {\n return \"em\";\n }\n\n public override proseMirrorMarkSpec(): MarkSpec {\n return {\n parseDOM: [\n { tag: \"i\" },\n { tag: \"em\" },\n {\n getAttrs: (value) => value === \"italic\" && null,\n style: \"font-style\",\n },\n ],\n toDOM(): DOMOutputSpec {\n return [\"em\", 0];\n },\n };\n }\n\n public override unistNodeName(): \"emphasis\" {\n return \"emphasis\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Emphasis,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return convertedChildren.map((child) =>\n child.mark(\n child.marks.concat([\n proseMirrorSchema.marks[this.proseMirrorMarkName()].create(),\n ]),\n ),\n );\n }\n}\n","import type { Link, Text } from \"mdast\";\nimport type {\n DOMOutputSpec,\n Mark,\n MarkSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport { MarkExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class LinkExtension extends MarkExtension<Link> {\n public override processConvertedUnistNode(\n convertedNode: Text,\n originalMark: Mark,\n ): Link {\n return {\n type: this.unistNodeName(),\n url: originalMark.attrs[\"href\"] as string,\n ...(originalMark.attrs[\"title\"] !== null && {\n title: originalMark.attrs[\"title\"] as string,\n }),\n children: [convertedNode],\n };\n }\n\n public override proseMirrorMarkName(): string {\n return \"link\";\n }\n\n public override proseMirrorMarkSpec(): MarkSpec {\n return {\n attrs: { href: {}, title: { default: null } },\n inclusive: false,\n parseDOM: [\n {\n getAttrs(dom: Node | string): {\n href: string | null;\n title: string | null;\n } {\n return {\n href: (dom as HTMLElement).getAttribute(\"href\"),\n title: (dom as HTMLElement).getAttribute(\"title\"),\n };\n },\n tag: \"a[href]\",\n },\n ],\n toDOM(node: Mark): DOMOutputSpec {\n return [\"a\", node.attrs, 0];\n },\n };\n }\n\n public override unistNodeName(): \"link\" {\n return \"link\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: Link,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return convertedChildren.map((child) =>\n child.mark(\n child.marks.concat([\n proseMirrorSchema.marks[this.proseMirrorMarkName()].create({\n href: node.url,\n title: node.title,\n }),\n ]),\n ),\n );\n }\n}\n","import type { LinkReference } from \"mdast\";\nimport type { Mark, Node as ProseMirrorNode, Schema } from \"prosemirror-model\";\n\nimport { type Extension, MarkExtension } from \"prosemirror-unified\";\n\nimport {\n DefinitionExtension,\n type DefinitionExtensionContext,\n} from \"./DefinitionExtension\";\nimport { LinkExtension } from \"./LinkExtension\";\n\n/**\n * @public\n */\nexport interface LinkReferenceExtensionContext {\n marks: Record<string, Mark>;\n}\n\n/**\n * @public\n */\nexport class LinkReferenceExtension extends MarkExtension<LinkReference> {\n public override dependencies(): Array<Extension> {\n return [new DefinitionExtension(), new LinkExtension()];\n }\n\n public override postUnistToProseMirrorHook(\n context: Partial<{\n DefinitionExtension: DefinitionExtensionContext;\n LinkReferenceExtension: LinkReferenceExtensionContext;\n }>,\n ): void {\n if (\n context.LinkReferenceExtension === undefined ||\n context.DefinitionExtension === undefined\n ) {\n return;\n }\n for (const id in context.LinkReferenceExtension.marks) {\n if (!(id in context.DefinitionExtension.definitions)) {\n continue;\n }\n const definition = context.DefinitionExtension.definitions[id];\n const attrs = context.LinkReferenceExtension.marks[id].attrs as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Attrs can be any\n any\n >;\n attrs[\"href\"] = definition.url;\n if (definition.title !== undefined) {\n attrs[\"title\"] = definition.title;\n }\n }\n }\n\n public override processConvertedUnistNode(\n convertedNode: LinkReference,\n ): LinkReference {\n return convertedNode;\n }\n\n public override proseMirrorMarkName(): null {\n return null;\n }\n\n public override proseMirrorMarkSpec(): null {\n return null;\n }\n\n public override unistNodeName(): \"linkReference\" {\n return \"linkReference\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: LinkReference,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n context: Partial<{\n LinkReferenceExtension: LinkReferenceExtensionContext;\n }>,\n ): Array<ProseMirrorNode> {\n const mark = proseMirrorSchema.marks[\"link\"].create({\n href: null,\n title: null,\n });\n context.LinkReferenceExtension ??= { marks: {} };\n context.LinkReferenceExtension.marks[node.identifier] = mark;\n return convertedChildren.map((child) =>\n child.mark(child.marks.concat([mark])),\n );\n }\n}\n","import type { BlockContent, DefinitionContent, ListItem } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\nimport type { Node as UnistNode } from \"unist\";\n\nimport {\n liftListItem,\n sinkListItem,\n splitListItem,\n} from \"prosemirror-schema-list\";\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class ListItemExtension extends NodeExtension<ListItem> {\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n const nodeType = proseMirrorSchema.nodes[this.proseMirrorNodeName()];\n return {\n Enter: splitListItem(nodeType),\n \"Shift-Tab\": liftListItem(nodeType),\n Tab: sinkListItem(nodeType),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"regular_list_item\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n content: \"paragraph block*\",\n defining: true,\n group: \"list_item\",\n parseDOM: [{ tag: \"li\" }],\n toDOM(): DOMOutputSpec {\n return [\"li\", 0];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n _node: ProseMirrorNode,\n convertedChildren: Array<BlockContent | DefinitionContent>,\n ): Array<ListItem> {\n return [\n {\n children: convertedChildren,\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"listItem\" {\n return \"listItem\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: ListItem,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n\n public override unistToProseMirrorTest(node: UnistNode): boolean {\n return (\n node.type === this.unistNodeName() &&\n (!(\"checked\" in node) || typeof node.checked !== \"boolean\")\n );\n }\n}\n","import type { List, ListContent } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\nimport type { Node as UnistNode } from \"unist\";\n\nimport { type InputRule, wrappingInputRule } from \"prosemirror-inputrules\";\nimport { wrapInList } from \"prosemirror-schema-list\";\nimport {\n createProseMirrorNode,\n type Extension,\n NodeExtension,\n} from \"prosemirror-unified\";\n\nimport { ListItemExtension } from \"./ListItemExtension\";\n\n/**\n * @public\n */\nexport class OrderedListExtension extends NodeExtension<List> {\n public override dependencies(): Array<Extension> {\n return [new ListItemExtension()];\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n wrappingInputRule(\n /^\\s{0,3}(\\d+)\\.\\s$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n (match) => ({ start: +match[1] }),\n (match, node) =>\n node.childCount + (node.attrs[\"start\"] as number) === +match[1],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n return {\n \"Shift-Mod-9\": wrapInList(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"ordered_list\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n attrs: { spread: { default: false }, start: { default: 1 } },\n content: \"list_item+\",\n group: \"block\",\n parseDOM: [\n {\n getAttrs(dom: Node | string): { spread: boolean; start: number } {\n const start = (dom as HTMLElement).getAttribute(\"start\");\n return {\n spread:\n (dom as HTMLElement).getAttribute(\"data-spread\") === \"true\",\n start: start !== null ? parseInt(start, 10) : 1,\n };\n },\n tag: \"ol\",\n },\n ],\n toDOM(node: ProseMirrorNode): DOMOutputSpec {\n return [\n \"ol\",\n {\n \"data-spread\": node.attrs[\"spread\"] as boolean,\n start: node.attrs[\"start\"] as number,\n },\n 0,\n ];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n node: ProseMirrorNode,\n convertedChildren: Array<ListContent>,\n ): Array<List> {\n const spread = node.attrs[\"spread\"] as boolean;\n return [\n {\n children: convertedChildren.map((child) => {\n child.spread = spread;\n return child;\n }),\n ordered: true,\n spread,\n start: node.attrs[\"start\"] as number,\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"list\" {\n return \"list\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: List,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n {\n spread: node.spread,\n start: node.start ?? 1,\n },\n );\n }\n\n public override unistToProseMirrorTest(node: UnistNode): boolean {\n return (\n node.type === this.unistNodeName() && (node as List).ordered === true\n );\n }\n}\n","import type { Root, RootContent } from \"mdast\";\nimport type {\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\n\nimport { createProseMirrorNode, NodeExtension } from \"prosemirror-unified\";\n\n/**\n * @public\n */\nexport class RootExtension extends NodeExtension<Root> {\n public override proseMirrorNodeName(): string {\n return \"doc\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return { content: \"block+\" };\n }\n\n public override proseMirrorNodeToUnistNodes(\n _node: ProseMirrorNode,\n convertedChildren: Array<RootContent>,\n ): Array<Root> {\n return [{ children: convertedChildren, type: this.unistNodeName() }];\n }\n\n public override unistNodeName(): \"root\" {\n return \"root\";\n }\n\n public override unistNodeToProseMirrorNodes(\n _node: Root,\n proseMirrorSchema: Schema<string, string>,\n convertedChildren: Array<ProseMirrorNode>,\n ): Array<ProseMirrorNode> {\n return createProseMirrorNode(\n this.proseMirrorNodeName(),\n proseMirrorSchema,\n convertedChildren,\n );\n }\n}\n","import type { List, ListContent } from \"mdast\";\nimport type {\n DOMOutputSpec,\n NodeSpec,\n Node as ProseMirrorNode,\n Schema,\n} from \"prosemirror-model\";\nimport type { Command } from \"prosemirror-state\";\nimport type { Node as UnistNode } from \"unist\";\n\nimport { type InputRule, wrappingInputRule } from \"prosemirror-inputrules\";\nimport { wrapInList } from \"prosemirror-schema-list\";\nimport {\n createProseMirrorNode,\n type Extension,\n NodeExtension,\n} from \"prosemirror-unified\";\n\nimport { ListItemExtension } from \"./ListItemExtension\";\n\n/**\n * @public\n */\nexport class UnorderedListExtension extends NodeExtension<List> {\n public override dependencies(): Array<Extension> {\n return [new ListItemExtension()];\n }\n\n public override proseMirrorInputRules(\n proseMirrorSchema: Schema<string, string>,\n ): Array<InputRule> {\n return [\n wrappingInputRule(\n /^\\s{0,3}([-+*])\\s$/u,\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n ];\n }\n\n public override proseMirrorKeymap(\n proseMirrorSchema: Schema<string, string>,\n ): Record<string, Command> {\n return {\n \"Shift-Mod-8\": wrapInList(\n proseMirrorSchema.nodes[this.proseMirrorNodeName()],\n ),\n };\n }\n\n public override proseMirrorNodeName(): string {\n return \"bullet_list\";\n }\n\n public override proseMirrorNodeSpec(): NodeSpec {\n return {\n attrs: { spread: { default: false } },\n content: \"list_item+\",\n group: \"block\",\n parseDOM: [\n {\n getAttrs(dom: Node | string): { spread: boolean } {\n return {\n spread:\n (dom as HTMLElement).getAttribute(\"data-spread\") === \"true\",\n };\n },\n tag: \"ul\",\n },\n ],\n toDOM(node: ProseMirrorNode): DOMOutputSpec {\n return [\"ul\", { \"data-spread\": node.attrs[\"spread\"] as boolean }, 0];\n },\n };\n }\n\n public override proseMirrorNodeToUnistNodes(\n node: ProseMirrorNode,\n convertedChildren: Array<ListContent>,\n ): Array<List> {\n const spread = node.attrs[\"spread\"] as boolean;\n return [\n {\n children: convertedChildren.map((child) => {\n child.spread = spread;\n return child;\n }),\n ordered: false,\n spread,\n type: this.unistNodeName(),\n },\n ];\n }\n\n public override unistNodeName(): \"list\" {\n return \"list\";\n }\n\n public override unistNodeToProseMirrorNodes(\n node: List,\n proseMirrorSchema: Schema<string, string>,\n