miyuan-editor 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +525 -0
  2. package/dist/core/index.cjs.js +40 -0
  3. package/dist/core/index.esm.js +4 -0
  4. package/dist/dist-5Q_Z9Ell.js +6390 -0
  5. package/dist/dist-5Q_Z9Ell.js.map +1 -0
  6. package/dist/dist-CMM6n8DO.cjs +4629 -0
  7. package/dist/dist-CMM6n8DO.cjs.map +1 -0
  8. package/dist/dist-CRSJDo2G.cjs +6617 -0
  9. package/dist/dist-CRSJDo2G.cjs.map +1 -0
  10. package/dist/dist-CZw77IJK.js +4612 -0
  11. package/dist/dist-CZw77IJK.js.map +1 -0
  12. package/dist/dist-CnVrDtsI.js +556 -0
  13. package/dist/dist-CnVrDtsI.js.map +1 -0
  14. package/dist/dist-rItBfhNb.cjs +591 -0
  15. package/dist/dist-rItBfhNb.cjs.map +1 -0
  16. package/dist/export-utils-CYaNoyVg.cjs +167 -0
  17. package/dist/export-utils-CYaNoyVg.cjs.map +1 -0
  18. package/dist/export-utils-DN0Gu8Vu.js +144 -0
  19. package/dist/export-utils-DN0Gu8Vu.js.map +1 -0
  20. package/dist/extension-BPFuYyzN.cjs +338 -0
  21. package/dist/extension-BPFuYyzN.cjs.map +1 -0
  22. package/dist/extension-Cl6x5MDR.js +321 -0
  23. package/dist/extension-Cl6x5MDR.js.map +1 -0
  24. package/dist/extensions/index.cjs.js +3462 -0
  25. package/dist/extensions/index.cjs.js.map +1 -0
  26. package/dist/extensions/index.esm.js +3412 -0
  27. package/dist/extensions/index.esm.js.map +1 -0
  28. package/dist/prompt-B4AOP8f_.js +24143 -0
  29. package/dist/prompt-B4AOP8f_.js.map +1 -0
  30. package/dist/prompt-CGLw2O21.cjs +25530 -0
  31. package/dist/prompt-CGLw2O21.cjs.map +1 -0
  32. package/dist/react/index.cjs.js +839 -0
  33. package/dist/react/index.cjs.js.map +1 -0
  34. package/dist/react/index.esm.js +820 -0
  35. package/dist/react/index.esm.js.map +1 -0
  36. package/dist/shortcut-panel-BskGXV8n.js +49468 -0
  37. package/dist/shortcut-panel-BskGXV8n.js.map +1 -0
  38. package/dist/shortcut-panel-yP4RPTFt.cjs +49563 -0
  39. package/dist/shortcut-panel-yP4RPTFt.cjs.map +1 -0
  40. package/dist/toc-extension-BESc0uEW.js +150 -0
  41. package/dist/toc-extension-BESc0uEW.js.map +1 -0
  42. package/dist/toc-extension-SRvSuskn.cjs +173 -0
  43. package/dist/toc-extension-SRvSuskn.cjs.map +1 -0
  44. package/dist/toolbar-config-Cgc9mV2v.js +243 -0
  45. package/dist/toolbar-config-Cgc9mV2v.js.map +1 -0
  46. package/dist/toolbar-config-Cjt_fPMi.cjs +260 -0
  47. package/dist/toolbar-config-Cjt_fPMi.cjs.map +1 -0
  48. package/dist/ui/index.cjs.js +18 -0
  49. package/dist/ui/index.esm.js +3 -0
  50. package/dist/vue/index.cjs.js +323 -0
  51. package/dist/vue/index.cjs.js.map +1 -0
  52. package/dist/vue/index.esm.js +307 -0
  53. package/dist/vue/index.esm.js.map +1 -0
  54. package/dist/vue2/index.cjs.js +323 -0
  55. package/dist/vue2/index.cjs.js.map +1 -0
  56. package/dist/vue2/index.esm.js +307 -0
  57. package/dist/vue2/index.esm.js.map +1 -0
  58. package/package.json +116 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","names":["Plugin"],"sources":["../../src/extensions/doc-extension.ts","../../src/extensions/text-paragraph-extension.ts","../../src/extensions/mark-extensions.ts","../../node_modules/.pnpm/prosemirror-inputrules@1.5.1/node_modules/prosemirror-inputrules/dist/index.js","../../src/extensions/node-extensions.ts","../../src/extensions/table-extension.ts","../../src/extensions/behavior-extensions.ts","../../src/extensions/line-height-extension.ts","../../src/extensions/version-history-extension.ts","../../src/extensions/toc-node-extension.ts","../../src/extensions/code-block-enhanced-extension.ts","../../src/extensions/dark-mode-extension.ts","../../src/extensions/html-block-extension.ts"],"sourcesContent":["import type { Extension } from '../core/extension'\r\nimport type { NodeSpec } from 'prosemirror-model'\r\n\r\n/**\r\n * DocExtension: the root document node.\r\n */\r\nexport function DocExtension(): Extension {\r\n return {\r\n name: 'doc',\r\n type: 'extension',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n content: 'block+',\r\n }\r\n return { doc: spec }\r\n },\r\n }\r\n}\r\n","import type { Extension } from '../core/extension'\r\nimport type { NodeSpec } from 'prosemirror-model'\r\nimport type { Command } from 'prosemirror-state'\r\n\r\nconst MAX_INDENT = 7\r\nconst INDENT_STEP = 2 // em per level\r\n\r\n/**\r\n * TextExtension: the inline text leaf node.\r\n */\r\nexport function TextExtension(): Extension {\r\n return {\r\n name: 'text',\r\n type: 'extension',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'inline',\r\n }\r\n return { text: spec }\r\n },\r\n }\r\n}\r\n\r\ntype TextAlign = 'left' | 'center' | 'right' | null\r\n\r\n/** Helper: compute inline style from attrs (textAlign + indent + lineHeight) */\r\nfunction blockStyle(attrs: Record<string, unknown>): string | undefined {\r\n const parts: string[] = []\r\n const align = attrs.textAlign as TextAlign\r\n if (align && align !== 'left') parts.push(`text-align: ${align}`)\r\n const indent = (attrs.indent as number) || 0\r\n if (indent > 0) parts.push(`margin-left: ${indent * INDENT_STEP}em`)\r\n const lineHeight = attrs.lineHeight as number\r\n if (lineHeight) parts.push(`line-height: ${lineHeight}`)\r\n return parts.length ? parts.join('; ') : undefined\r\n}\r\n\r\n/** Helper: parse text-align from DOM element */\r\nfunction parseAlign(dom: HTMLElement): TextAlign {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/text-align:\\s*(left|center|right)/)\r\n if (match) return match[1] as TextAlign\r\n return null\r\n}\r\n\r\n/** Helper: parse indent level from DOM element */\r\nfunction parseIndent(dom: HTMLElement): number {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/margin-left:\\s*([\\d.]+)em/)\r\n if (!match) return 0\r\n const em = parseFloat(match[1])\r\n return Math.round(em / INDENT_STEP)\r\n}\r\n\r\n/** Helper: parse line-height from DOM element */\r\nfunction parseLineHeight(dom: HTMLElement): number | null {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/line-height:\\s*([\\d.]+)/)\r\n if (!match) return null\r\n return parseFloat(match[1])\r\n}\r\n\r\n/**\r\n * ParagraphExtension: the basic block node for text content.\r\n * Supports textAlign attribute.\r\n */\r\nexport function ParagraphExtension(): Extension {\r\n return {\r\n name: 'paragraph',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n content: 'inline*',\r\n attrs: { textAlign: { default: null }, indent: { default: 0 }, lineHeight: { default: null } },\r\n toDOM(node) {\r\n const style = blockStyle(node.attrs)\r\n return style ? ['p', { style }, 0] : ['p', 0]\r\n },\r\n parseDOM: [{\r\n tag: 'p',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n return {\r\n textAlign: parseAlign(el),\r\n indent: parseIndent(el),\r\n lineHeight: parseLineHeight(el),\r\n }\r\n },\r\n }],\r\n }\r\n return { paragraph: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setTextAlign: (...args: unknown[]) => {\r\n const align = args[0] as TextAlign\r\n return setTextAlignCommand(align, ['paragraph', 'heading'])\r\n },\r\n indent: () => indentCommand(1, ['paragraph', 'heading']),\r\n outdent: () => indentCommand(-1, ['paragraph', 'heading']),\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n Tab: indentCommand(1, ['paragraph', 'heading']),\r\n 'Shift-Tab': indentCommand(-1, ['paragraph', 'heading']),\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Create a command that sets textAlign on the given block types.\r\n */\r\nfunction setTextAlignCommand(align: TextAlign, nodeNames: string[]): Command {\r\n return (state, dispatch) => {\r\n const { from, to } = state.selection\r\n let applicable = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (!nodeNames.includes(node.type.name)) return\r\n applicable = true\r\n\r\n if (dispatch) {\r\n const tr = state.tr\r\n const currentAlign = node.attrs.textAlign as TextAlign\r\n // Toggle: if already set to the same align, reset to null\r\n const newAlign = currentAlign === align ? null : align\r\n tr.setNodeMarkup(pos, null, { ...node.attrs, textAlign: newAlign })\r\n dispatch(tr)\r\n }\r\n })\r\n\r\n return applicable\r\n }\r\n}\r\n\r\n/**\r\n * Create a command that changes indent level by delta (+1 or -1).\r\n */\r\nfunction indentCommand(delta: number, nodeNames: string[]): Command {\r\n return (state, dispatch) => {\r\n const { from, to } = state.selection\r\n let applicable = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (!nodeNames.includes(node.type.name)) return\r\n const current = (node.attrs.indent as number) || 0\r\n const next = Math.max(0, Math.min(MAX_INDENT, current + delta))\r\n if (next === current) return\r\n applicable = true\r\n\r\n if (dispatch) {\r\n const tr = state.tr\r\n tr.setNodeMarkup(pos, null, { ...node.attrs, indent: next })\r\n dispatch(tr)\r\n }\r\n })\r\n\r\n return applicable\r\n }\r\n}\r\n","import type { Extension } from '../core/extension'\r\nimport type { MarkSpec } from 'prosemirror-model'\r\nimport { toggleMark } from 'prosemirror-commands'\r\n\r\n// ---------------------------------------------------------------------------\r\n// Bold\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function BoldExtension(): Extension {\r\n return {\r\n name: 'bold',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n toDOM() { return ['strong', 0] },\r\n parseDOM: [\r\n { tag: 'strong' },\r\n { tag: 'b', getAttrs: (node) => (node as HTMLElement).style.fontWeight !== 'normal' && null },\r\n ],\r\n }\r\n return { bold: spec }\r\n },\r\n addCommands() {\r\n return {\r\n bold: () => (state, dispatch) => {\r\n const mt = state.schema.marks['bold']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-b': (state, dispatch) => {\r\n const mt = state.schema.marks['bold']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Italic\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function ItalicExtension(): Extension {\r\n return {\r\n name: 'italic',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n toDOM() { return ['em', 0] },\r\n parseDOM: [{ tag: 'em' }, { tag: 'i' }],\r\n }\r\n return { italic: spec }\r\n },\r\n addCommands() {\r\n return {\r\n italic: () => (state, dispatch) => {\r\n const mt = state.schema.marks['italic']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-i': (state, dispatch) => {\r\n const mt = state.schema.marks['italic']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Code (inline)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function CodeExtension(): Extension {\r\n return {\r\n name: 'code',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n excludes: '_',\r\n toDOM() { return ['code', 0] },\r\n parseDOM: [{ tag: 'code' }],\r\n }\r\n return { code: spec }\r\n },\r\n addCommands() {\r\n return {\r\n code: () => (state, dispatch) => {\r\n const mt = state.schema.marks['code']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-e': (state, dispatch) => {\r\n const mt = state.schema.marks['code']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Strikethrough\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function StrikeExtension(): Extension {\r\n return {\r\n name: 'strike',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n toDOM() { return ['s', 0] },\r\n parseDOM: [{ tag: 's' }, { tag: 'del' }, { tag: 'strike' }],\r\n }\r\n return { strike: spec }\r\n },\r\n addCommands() {\r\n return {\r\n strike: () => (state, dispatch) => {\r\n const mt = state.schema.marks['strike']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Underline\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function UnderlineExtension(): Extension {\r\n return {\r\n name: 'underline',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n toDOM() { return ['u', 0] },\r\n parseDOM: [{ tag: 'u' }],\r\n }\r\n return { underline: spec }\r\n },\r\n addCommands() {\r\n return {\r\n underline: () => (state, dispatch) => {\r\n const mt = state.schema.marks['underline']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-u': (state, dispatch) => {\r\n const mt = state.schema.marks['underline']\r\n if (!mt) return false\r\n return toggleMark(mt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Link\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function LinkExtension(): Extension {\r\n return {\r\n name: 'link',\r\n type: 'mark',\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n attrs: {\r\n href: {},\r\n target: { default: '_blank' },\r\n },\r\n inclusive: false,\r\n toDOM(mark) {\r\n const { href, target } = mark.attrs\r\n return ['a', { href, target }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'a[href]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n return { href: el.getAttribute('href'), target: el.getAttribute('target') }\r\n },\r\n }],\r\n }\r\n return { link: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setLink: (...args: unknown[]) => {\r\n const attrs = (args[0] ?? {}) as Record<string, unknown>\r\n return (state, dispatch) => {\r\n const mt = state.schema.marks['link']\r\n if (!mt) return false\r\n return toggleMark(mt, attrs)(state, dispatch)\r\n }\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Color Presets\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const DEFAULT_COLORS: string[] = [\r\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#ffffff',\r\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff',\r\n '#9900ff', '#ff00ff', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8',\r\n '#e4d7f5', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#a4c2f4', '#d5a6bd',\r\n]\r\n\r\nexport interface ColorConfig {\r\n colors?: string[]\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Text Color\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function TextColorExtension(config?: ColorConfig): Extension {\r\n const colors = config?.colors ?? DEFAULT_COLORS\r\n return {\r\n name: 'textColor',\r\n type: 'mark',\r\n options: { colors },\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n attrs: { color: {} },\r\n toDOM(mark) {\r\n return ['span', { style: `color: ${mark.attrs.color}` }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'span[style*=\"color\"]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const color = el.style.color\r\n return color ? { color } : false\r\n },\r\n }],\r\n }\r\n return { textColor: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setTextColor: (...args: unknown[]) => {\r\n const color = args[0] as string\r\n return (state, dispatch) => {\r\n const mt = state.schema.marks['textColor']\r\n if (!mt) return false\r\n const { from, to } = state.selection\r\n if (from === to) return false\r\n if (dispatch) {\r\n let tr = state.tr\r\n // Remove existing textColor mark first\r\n tr = tr.removeMark(from, to, mt)\r\n // Add new color mark if color is provided\r\n if (color) {\r\n tr = tr.addMark(from, to, mt.create({ color }))\r\n }\r\n dispatch(tr)\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Background Color (Highlight)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function BackgroundColorExtension(config?: ColorConfig): Extension {\r\n const colors = config?.colors ?? DEFAULT_COLORS\r\n return {\r\n name: 'backgroundColor',\r\n type: 'mark',\r\n options: { colors },\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n attrs: { color: {} },\r\n toDOM(mark) {\r\n return ['span', { style: `background-color: ${mark.attrs.color}` }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'span[style*=\"background-color\"]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const color = el.style.backgroundColor\r\n return color ? { color } : false\r\n },\r\n }],\r\n }\r\n return { backgroundColor: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setBackgroundColor: (...args: unknown[]) => {\r\n const color = args[0] as string\r\n return (state, dispatch) => {\r\n const mt = state.schema.marks['backgroundColor']\r\n if (!mt) return false\r\n const { from, to } = state.selection\r\n if (from === to) return false\r\n if (dispatch) {\r\n let tr = state.tr\r\n tr = tr.removeMark(from, to, mt)\r\n if (color) {\r\n tr = tr.addMark(from, to, mt.create({ color }))\r\n }\r\n dispatch(tr)\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Font Size\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface FontSizePreset {\r\n label: string\r\n value: string\r\n}\r\n\r\nexport const DEFAULT_FONT_SIZES: FontSizePreset[] = [\r\n { label: '12', value: '12px' },\r\n { label: '14', value: '14px' },\r\n { label: '16', value: '16px' },\r\n { label: '18', value: '18px' },\r\n { label: '20', value: '20px' },\r\n { label: '24', value: '24px' },\r\n { label: '28', value: '28px' },\r\n { label: '32', value: '32px' },\r\n { label: '36', value: '36px' },\r\n { label: '48', value: '48px' },\r\n]\r\n\r\nexport interface FontSizeConfig {\r\n sizes?: FontSizePreset[]\r\n}\r\n\r\nfunction normalizeFontSize(value: string | number): string {\r\n const num = typeof value === 'string' ? parseFloat(value) : value\r\n if (isNaN(num) || num <= 0) return ''\r\n return `${Math.round(num)}px`\r\n}\r\n\r\nexport function FontSizeExtension(config?: FontSizeConfig): Extension {\r\n const sizes = config?.sizes ?? DEFAULT_FONT_SIZES\r\n return {\r\n name: 'fontSize',\r\n type: 'mark',\r\n options: { sizes },\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n attrs: { size: {} },\r\n toDOM(mark) {\r\n const size = normalizeFontSize(mark.attrs.size as string)\r\n return ['span', { style: `font-size: ${size}` }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'span[style*=\"font-size\"]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const raw = el.style.fontSize\r\n const size = normalizeFontSize(raw)\r\n return size ? { size } : false\r\n },\r\n }],\r\n }\r\n return { fontSize: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: (...args: unknown[]) => {\r\n const size = normalizeFontSize(args[0] as string | number)\r\n return (state, dispatch) => {\r\n const mt = state.schema.marks['fontSize']\r\n if (!mt) return false\r\n const { from, to } = state.selection\r\n if (from === to) return false\r\n if (dispatch) {\r\n let tr = state.tr\r\n tr = tr.removeMark(from, to, mt)\r\n if (size) {\r\n tr = tr.addMark(from, to, mt.create({ size }))\r\n }\r\n dispatch(tr)\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Font Family\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface FontFamilyPreset {\r\n label: string\r\n value: string\r\n}\r\n\r\nexport const DEFAULT_FONT_FAMILIES: FontFamilyPreset[] = [\r\n { label: '默认', value: '' },\r\n { label: '宋体', value: 'SimSun, serif' },\r\n { label: '黑体', value: 'SimHei, sans-serif' },\r\n { label: '微软雅黑', value: 'Microsoft YaHei, sans-serif' },\r\n { label: '楷体', value: 'KaiTi, serif' },\r\n { label: 'Arial', value: 'Arial, sans-serif' },\r\n { label: 'Times New Roman', value: 'Times New Roman, serif' },\r\n { label: 'Courier New', value: 'Courier New, monospace' },\r\n { label: 'Georgia', value: 'Georgia, serif' },\r\n { label: 'Verdana', value: 'Verdana, sans-serif' },\r\n]\r\n\r\nexport interface FontFamilyConfig {\r\n families?: FontFamilyPreset[]\r\n}\r\n\r\nexport function FontFamilyExtension(config?: FontFamilyConfig): Extension {\r\n const families = config?.families ?? DEFAULT_FONT_FAMILIES\r\n return {\r\n name: 'fontFamily',\r\n type: 'mark',\r\n options: { families },\r\n addMarks() {\r\n const spec: MarkSpec = {\r\n attrs: { family: {} },\r\n toDOM(mark) {\r\n const family = mark.attrs.family as string\r\n return ['span', { style: `font-family: ${family}` }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'span[style*=\"font-family\"]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const family = el.style.fontFamily\r\n return family ? { family } : false\r\n },\r\n }],\r\n }\r\n return { fontFamily: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setFontFamily: (...args: unknown[]) => {\r\n const family = args[0] as string\r\n return (state, dispatch) => {\r\n const mt = state.schema.marks['fontFamily']\r\n if (!mt) return false\r\n const { from, to } = state.selection\r\n if (from === to) return false\r\n if (dispatch) {\r\n let tr = state.tr\r\n tr = tr.removeMark(from, to, mt)\r\n if (family) {\r\n tr = tr.addMark(from, to, mt.create({ family }))\r\n }\r\n dispatch(tr)\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {}\r\n },\r\n addPlugins() {\r\n return []\r\n },\r\n }\r\n}\r\n","import { Plugin } from 'prosemirror-state';\nimport { findWrapping, canJoin } from 'prosemirror-transform';\n\n/**\nInput rules are regular expressions describing a piece of text\nthat, when typed, causes something to happen. This might be\nchanging two dashes into an emdash, wrapping a paragraph starting\nwith `\"> \"` into a blockquote, or something entirely different.\n*/\nclass InputRule {\n /**\n Create an input rule. The rule applies when the user typed\n something and the text directly in front of the cursor matches\n `match`, which should end with `$`.\n \n The `handler` can be a string, in which case the matched text, or\n the first matched group in the regexp, is replaced by that\n string.\n \n Or a it can be a function, which will be called with the match\n array produced by\n [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec),\n as well as the start and end of the matched range, and which can\n return a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) that describes the\n rule's effect, or null to indicate the input was not handled.\n */\n constructor(\n /**\n @internal\n */\n match, handler, options = {}) {\n this.match = match;\n this.match = match;\n this.handler = typeof handler == \"string\" ? stringHandler(handler) : handler;\n this.undoable = options.undoable !== false;\n this.inCode = options.inCode || false;\n this.inCodeMark = options.inCodeMark !== false;\n }\n}\nfunction stringHandler(string) {\n return function (state, match, start, end) {\n let insert = string;\n if (match[1]) {\n let offset = match[0].lastIndexOf(match[1]);\n insert += match[0].slice(offset + match[1].length);\n start += offset;\n let cutOff = start - end;\n if (cutOff > 0) {\n insert = match[0].slice(offset - cutOff, offset) + insert;\n start = end;\n }\n }\n return state.tr.insertText(insert, start, end);\n };\n}\nconst MAX_MATCH = 500;\n/**\nCreate an input rules plugin. When enabled, it will cause text\ninput that matches any of the given rules to trigger the rule's\naction.\n*/\nfunction inputRules({ rules }) {\n let plugin = new Plugin({\n state: {\n init() { return null; },\n apply(tr, prev) {\n let stored = tr.getMeta(this);\n if (stored)\n return stored;\n return tr.selectionSet || tr.docChanged ? null : prev;\n }\n },\n props: {\n handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin);\n },\n handleDOMEvents: {\n compositionend: (view) => {\n setTimeout(() => {\n let { $cursor } = view.state.selection;\n if ($cursor)\n run(view, $cursor.pos, $cursor.pos, \"\", rules, plugin);\n });\n }\n }\n },\n isInputRules: true\n });\n return plugin;\n}\nfunction run(view, from, to, text, rules, plugin) {\n if (view.composing)\n return false;\n let state = view.state, $from = state.doc.resolve(from);\n let textBefore = $from.parent.textBetween(Math.max(0, $from.parentOffset - MAX_MATCH), $from.parentOffset, null, \"\\ufffc\") + text;\n for (let i = 0; i < rules.length; i++) {\n let rule = rules[i];\n if (!rule.inCodeMark && $from.marks().some(m => m.type.spec.code))\n continue;\n if ($from.parent.type.spec.code) {\n if (!rule.inCode)\n continue;\n }\n else if (rule.inCode === \"only\") {\n continue;\n }\n let match = rule.match.exec(textBefore);\n if (!match || match[0].length < text.length)\n continue;\n let startPos = from - (match[0].length - text.length);\n if (!rule.inCodeMark) {\n let hasMark = false;\n state.doc.nodesBetween(startPos, $from.pos, node => {\n if (node.isInline && node.marks.some(m => m.type.spec.code))\n hasMark = true;\n });\n if (hasMark)\n continue;\n }\n let tr = rule.handler(state, match, startPos, to);\n if (!tr)\n continue;\n if (rule.undoable)\n tr.setMeta(plugin, { transform: tr, from, to, text });\n view.dispatch(tr);\n return true;\n }\n return false;\n}\n/**\nThis is a command that will undo an input rule, if applying such a\nrule was the last thing that the user did.\n*/\nconst undoInputRule = (state, dispatch) => {\n let plugins = state.plugins;\n for (let i = 0; i < plugins.length; i++) {\n let plugin = plugins[i], undoable;\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n let tr = state.tr, toUndo = undoable.transform;\n for (let j = toUndo.steps.length - 1; j >= 0; j--)\n tr.step(toUndo.steps[j].invert(toUndo.docs[j]));\n if (undoable.text) {\n let marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n }\n else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true;\n }\n }\n return false;\n};\n\n/**\nConverts double dashes to an emdash.\n*/\nconst emDash = new InputRule(/--$/, \"—\", { inCodeMark: false });\n/**\nConverts three dots to an ellipsis character.\n*/\nconst ellipsis = new InputRule(/\\.\\.\\.$/, \"…\", { inCodeMark: false });\n/**\n“Smart” opening double quotes.\n*/\nconst openDoubleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(\")$/, \"“\", { inCodeMark: false });\n/**\n“Smart” closing double quotes.\n*/\nconst closeDoubleQuote = new InputRule(/\"$/, \"”\", { inCodeMark: false });\n/**\n“Smart” opening single quotes.\n*/\nconst openSingleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(')$/, \"‘\", { inCodeMark: false });\n/**\n“Smart” closing single quotes.\n*/\nconst closeSingleQuote = new InputRule(/'$/, \"’\", { inCodeMark: false });\n/**\nSmart-quote related input rules.\n*/\nconst smartQuotes = [openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote];\n\n/**\nBuild an input rule for automatically wrapping a textblock when a\ngiven string is typed. The `regexp` argument is\ndirectly passed through to the `InputRule` constructor. You'll\nprobably want the regexp to start with `^`, so that the pattern can\nonly occur at the start of a textblock.\n\n`nodeType` is the type of node to wrap in. If it needs attributes,\nyou can either pass them directly, or pass a function that will\ncompute them from the regular expression match.\n\nBy default, if there's a node with the same type above the newly\nwrapped node, the rule will try to [join](https://prosemirror.net/docs/ref/#transform.Transform.join) those\ntwo nodes. You can pass a join predicate, which takes a regular\nexpression match and the node before the wrapped node, and can\nreturn a boolean to indicate whether a join should happen.\n*/\nfunction wrappingInputRule(regexp, nodeType, getAttrs = null, joinPredicate) {\n return new InputRule(regexp, (state, match, start, end) => {\n let attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n let tr = state.tr.delete(start, end);\n let $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping)\n return null;\n tr.wrap(range, wrapping);\n let before = tr.doc.resolve(start - 1).nodeBefore;\n if (before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before)))\n tr.join(start - 1);\n return tr;\n });\n}\n/**\nBuild an input rule that changes the type of a textblock when the\nmatched text is typed into it. You'll usually want to start your\nregexp with `^` to that it is only matched at the start of a\ntextblock. The optional `getAttrs` parameter can be used to compute\nthe new node's attributes, and works the same as in the\n`wrappingInputRule` function.\n*/\nfunction textblockTypeInputRule(regexp, nodeType, getAttrs = null) {\n return new InputRule(regexp, (state, match, start, end) => {\n let $start = state.doc.resolve(start);\n let attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType))\n return null;\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, nodeType, attrs);\n });\n}\n\nexport { InputRule, closeDoubleQuote, closeSingleQuote, ellipsis, emDash, inputRules, openDoubleQuote, openSingleQuote, smartQuotes, textblockTypeInputRule, undoInputRule, wrappingInputRule };\n","import type { Extension } from '../core/extension'\r\nimport type { NodeSpec } from 'prosemirror-model'\r\nimport type { Command } from 'prosemirror-state'\r\nimport { Plugin, PluginKey, NodeSelection } from 'prosemirror-state'\r\nimport { setBlockType, wrapIn } from 'prosemirror-commands'\r\nimport { splitListItem } from 'prosemirror-schema-list'\r\nimport { inputRules, InputRule } from 'prosemirror-inputrules'\r\nimport type { EditorState } from 'prosemirror-state'\r\nimport type { EditorView } from 'prosemirror-view'\r\nimport type { Node } from 'prosemirror-model'\r\nimport type { NodeView as PMNodeView } from 'prosemirror-view'\r\n\r\n/** Parse text-align from DOM element style attribute */\r\nfunction parseAlignFromDOM(dom: HTMLElement): string | null {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/text-align:\\s*(left|center|right)/)\r\n return match ? match[1] : null\r\n}\r\n\r\n/** Parse indent level from DOM element (margin-left in em) */\r\nfunction parseIndentFromDOM(dom: HTMLElement): number {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/margin-left:\\s*([\\d.]+)em/)\r\n if (!match) return 0\r\n return Math.round(parseFloat(match[1]) / 2)\r\n}\r\n\r\n/** Build inline style string from align + indent + lineHeight attrs */\r\nfunction buildBlockStyle(attrs: Record<string, unknown>): string | undefined {\r\n const parts: string[] = []\r\n const align = attrs.textAlign as string | null\r\n if (align && align !== 'left') parts.push(`text-align: ${align}`)\r\n const indent = (attrs.indent as number) || 0\r\n if (indent > 0) parts.push(`margin-left: ${indent * 2}em`)\r\n const lineHeight = attrs.lineHeight as number | null\r\n if (lineHeight) parts.push(`line-height: ${lineHeight}`)\r\n return parts.length ? parts.join('; ') : undefined\r\n}\r\n\r\n/** Helper: parse line-height from DOM element */\r\nfunction parseLineHeightFromDOM(dom: HTMLElement): number | null {\r\n const style = dom.getAttribute('style') || ''\r\n const match = style.match(/line-height:\\s*([\\d.]+)/)\r\n if (!match) return null\r\n return parseFloat(match[1])\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Heading\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function HeadingExtension(): Extension {\r\n return {\r\n name: 'heading',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n content: 'inline*',\r\n attrs: { level: { default: 1 }, textAlign: { default: null }, indent: { default: 0 }, lineHeight: { default: null } },\r\n defining: true,\r\n toDOM(node) {\r\n const style = buildBlockStyle(node.attrs)\r\n const tag = `h${node.attrs.level}`\r\n return style ? [tag, { style }, 0] : [tag, 0]\r\n },\r\n parseDOM: [\r\n { tag: 'h1', getAttrs: (dom) => ({ level: 1, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n { tag: 'h2', getAttrs: (dom) => ({ level: 2, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n { tag: 'h3', getAttrs: (dom) => ({ level: 3, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n { tag: 'h4', getAttrs: (dom) => ({ level: 4, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n { tag: 'h5', getAttrs: (dom) => ({ level: 5, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n { tag: 'h6', getAttrs: (dom) => ({ level: 6, textAlign: parseAlignFromDOM(dom as HTMLElement), indent: parseIndentFromDOM(dom as HTMLElement), lineHeight: parseLineHeightFromDOM(dom as HTMLElement) }) },\r\n ],\r\n }\r\n return { heading: spec }\r\n },\r\n addCommands() {\r\n return {\r\n heading: (...args: unknown[]) => {\r\n const level = (args[0] as number) ?? 1\r\n return (state, dispatch) => {\r\n const headingType = state.schema.nodes['heading']\r\n const paraType = state.schema.nodes['paragraph']\r\n if (!headingType || !paraType) return false\r\n // Toggle: if current block is already this heading level, revert to paragraph\r\n const { $from } = state.selection\r\n const parent = $from.parent\r\n if (parent.type === headingType && parent.attrs.level === level) {\r\n return setBlockType(paraType)(state, dispatch)\r\n }\r\n return setBlockType(headingType, { level })(state, dispatch)\r\n }\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n const shortcuts: Record<string, Command> = {}\r\n for (let i = 1; i <= 6; i++) {\r\n const level = i\r\n shortcuts[`Mod-Alt-${i}`] = (state, dispatch) => {\r\n const headingType = state.schema.nodes['heading']\r\n const paraType = state.schema.nodes['paragraph']\r\n if (!headingType || !paraType) return false\r\n const { $from } = state.selection\r\n const parent = $from.parent\r\n if (parent.type === headingType && parent.attrs.level === level) {\r\n return setBlockType(paraType)(state, dispatch)\r\n }\r\n return setBlockType(headingType, { level })(state, dispatch)\r\n }\r\n }\r\n return shortcuts\r\n },\r\n addPlugins() {\r\n return [\r\n inputRules({\r\n rules: [\r\n new InputRule(/^(#{1,6})\\s$/, (state: EditorState, match: RegExpMatchArray, start: number, end: number) => {\r\n const level = match[1].length\r\n const nt = state.schema.nodes['heading']\r\n if (!nt) return null\r\n const tr = state.tr\r\n tr.delete(start, end)\r\n const $start = tr.doc.resolve(start)\r\n const range = $start.blockRange()\r\n if (!range) return null\r\n tr.setBlockType(range.start, range.end, nt, { level })\r\n return tr\r\n }),\r\n ],\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Blockquote\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function BlockquoteExtension(): Extension {\r\n return {\r\n name: 'blockquote',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n content: 'block+',\r\n defining: true,\r\n toDOM() { return ['blockquote', 0] },\r\n parseDOM: [{ tag: 'blockquote' }],\r\n }\r\n return { blockquote: spec }\r\n },\r\n addCommands() {\r\n return {\r\n blockquote: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['blockquote']\r\n if (!nt) return false\r\n return wrapIn(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Shift-b': (state, dispatch) => {\r\n const nt = state.schema.nodes['blockquote']\r\n if (!nt) return false\r\n return wrapIn(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Bullet List\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function BulletListExtension(): Extension {\r\n return {\r\n name: 'bullet_list',\r\n type: 'node',\r\n addNodes() {\r\n const listSpec: NodeSpec = {\r\n group: 'block',\r\n content: 'list_item+',\r\n toDOM() { return ['ul', 0] },\r\n parseDOM: [{ tag: 'ul' }],\r\n }\r\n const itemSpec: NodeSpec = {\r\n content: 'paragraph block*',\r\n toDOM() { return ['li', 0] },\r\n parseDOM: [{ tag: 'li' }],\r\n }\r\n return { bullet_list: listSpec, list_item: itemSpec }\r\n },\r\n addCommands() {\r\n return {\r\n bulletList: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['bullet_list']\r\n if (!nt) return false\r\n return wrapIn(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n Enter: (state, dispatch) => {\r\n const nt = state.schema.nodes['list_item']\r\n if (!nt) return false\r\n return splitListItem(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Ordered List\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function OrderedListExtension(): Extension {\r\n return {\r\n name: 'ordered_list',\r\n type: 'node',\r\n addNodes() {\r\n const listSpec: NodeSpec = {\r\n group: 'block',\r\n content: 'list_item+',\r\n attrs: { order: { default: 1 } },\r\n toDOM(node) {\r\n return node.attrs.order === 1\r\n ? ['ol', 0]\r\n : ['ol', { start: node.attrs.order }, 0]\r\n },\r\n parseDOM: [{\r\n tag: 'ol',\r\n getAttrs(dom) {\r\n return { order: (dom as HTMLElement).hasAttribute('start') ? +(dom as HTMLElement).getAttribute('start')! : 1 }\r\n },\r\n }],\r\n }\r\n return { ordered_list: listSpec }\r\n },\r\n addCommands() {\r\n return {\r\n orderedList: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['ordered_list']\r\n if (!nt) return false\r\n return wrapIn(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n Enter: (state, dispatch) => {\r\n const nt = state.schema.nodes['list_item']\r\n if (!nt) return false\r\n return splitListItem(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Task List (Todo / Checkbox List)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function TaskListExtension(): Extension {\r\n return {\r\n name: 'task_list',\r\n type: 'node',\r\n addNodes() {\r\n const listSpec: NodeSpec = {\r\n group: 'block',\r\n content: 'task_item+',\r\n toDOM() { return ['ul', { class: 'mi-task-list' }, 0] },\r\n parseDOM: [{ tag: 'ul.mi-task-list' }, { tag: 'ul[data-task-list]' }],\r\n }\r\n const itemSpec: NodeSpec = {\r\n content: 'paragraph block*',\r\n attrs: { checked: { default: false } },\r\n toDOM(node) {\r\n const checked = node.attrs.checked ? 'checked' : null\r\n return ['li', { 'data-task-item': '', class: 'mi-task-item' },\r\n ['input', { type: 'checkbox', checked, 'data-checked': String(node.attrs.checked) }],\r\n ['div', { class: 'mi-task-content' }, 0],\r\n ]\r\n },\r\n parseDOM: [{\r\n tag: 'li[data-task-item]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const input = el.querySelector('input[type=\"checkbox\"]') as HTMLInputElement | null\r\n return { checked: input?.checked ?? false }\r\n },\r\n }],\r\n }\r\n return { task_list: listSpec, task_item: itemSpec }\r\n },\r\n addCommands() {\r\n return {\r\n taskList: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['task_list']\r\n if (!nt) return false\r\n return wrapIn(nt)(state, dispatch)\r\n },\r\n toggleTaskItem: () => (state, dispatch) => {\r\n const { $from } = state.selection\r\n // Find the task_item node\r\n let taskItemPos = -1\r\n let taskItemNode: import('prosemirror-model').Node | null = null\r\n state.doc.nodesBetween($from.pos, $from.pos, (node, pos) => {\r\n if (node.type.name === 'task_item') {\r\n taskItemPos = pos\r\n taskItemNode = node\r\n return false\r\n }\r\n })\r\n // Walk up to find task_item\r\n for (let d = $from.depth; d > 0; d--) {\r\n const node = $from.node(d)\r\n if (node.type.name === 'task_item') {\r\n taskItemPos = $from.before(d)\r\n taskItemNode = node\r\n break\r\n }\r\n }\r\n if (taskItemPos < 0 || !taskItemNode) return false\r\n if (dispatch) {\r\n const tr = state.tr\r\n tr.setNodeMarkup(taskItemPos, null, {\r\n ...taskItemNode.attrs,\r\n checked: !taskItemNode.attrs.checked,\r\n })\r\n dispatch(tr)\r\n }\r\n return true\r\n },\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n Enter: (state, dispatch) => {\r\n const nt = state.schema.nodes['task_item']\r\n if (!nt) return false\r\n return splitListItem(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDOMEvents: {\r\n click(view: EditorView, event: MouseEvent) {\r\n const target = event.target as HTMLElement\r\n if (target.tagName === 'INPUT' && (target as HTMLInputElement).type === 'checkbox' && target.closest('.mi-task-item')) {\r\n event.preventDefault()\r\n // Find the task_item node position\r\n const li = target.closest('.mi-task-item') as HTMLElement\r\n if (!li) return false\r\n const pos = view.posAtDOM(li, 0)\r\n const node = view.state.doc.nodeAt(pos)\r\n if (!node || node.type.name !== 'task_item') return false\r\n const tr = view.state.tr\r\n tr.setNodeMarkup(pos, null, { ...node.attrs, checked: !node.attrs.checked })\r\n view.dispatch(tr)\r\n return true\r\n }\r\n return false\r\n },\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Code Block\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function CodeBlockExtension(): Extension {\r\n return {\r\n name: 'code_block',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n content: 'text*',\r\n marks: '',\r\n code: true,\r\n defining: true,\r\n toDOM() { return ['pre', ['code', 0]] },\r\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\r\n }\r\n return { code_block: spec }\r\n },\r\n addCommands() {\r\n return {\r\n codeBlock: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['code_block']\r\n if (!nt) return false\r\n return setBlockType(nt)(state, dispatch)\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n inputRules({\r\n rules: [\r\n new InputRule(/^```$/, (state: EditorState, _match: RegExpMatchArray, start: number, end: number) => {\r\n const nt = state.schema.nodes['code_block']\r\n if (!nt) return null\r\n const tr = state.tr\r\n tr.delete(start, end)\r\n const $start = tr.doc.resolve(start)\r\n const range = $start.blockRange()\r\n if (!range) return null\r\n tr.setBlockType(range.start, range.end, nt)\r\n return tr\r\n }),\r\n ],\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Horizontal Rule\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function HorizontalRuleExtension(): Extension {\r\n return {\r\n name: 'horizontal_rule',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n toDOM() { return ['hr'] },\r\n parseDOM: [{ tag: 'hr' }],\r\n }\r\n return { horizontal_rule: spec }\r\n },\r\n addCommands() {\r\n return {\r\n horizontalRule: () => (state, dispatch) => {\r\n const nt = state.schema.nodes['horizontal_rule']\r\n if (!nt) return false\r\n const tr = state.tr\r\n tr.replaceSelectionWith(nt.create())\r\n if (dispatch) dispatch(tr)\r\n return true\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Hard Break\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function HardBreakExtension(): Extension {\r\n return {\r\n name: 'hard_break',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'inline',\r\n inline: true,\r\n selectable: false,\r\n toDOM() { return ['br'] },\r\n parseDOM: [{ tag: 'br' }],\r\n }\r\n return { hard_break: spec }\r\n },\r\n addKeyboardShortcuts() {\r\n const insertHardBreak: Command = (state, dispatch) => {\r\n const nt = state.schema.nodes['hard_break']\r\n if (!nt) return false\r\n const tr = state.tr.replaceSelectionWith(nt.create())\r\n if (dispatch) dispatch(tr.scrollIntoView())\r\n return true\r\n }\r\n return {\r\n 'Mod-Enter': insertHardBreak,\r\n 'Shift-Enter': insertHardBreak,\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Image (with resize support)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst MIN_IMG_SIZE = 30\r\nconst IMG_PRESET_SIZES = [25, 50, 75, 100]\r\ntype ResizeDir = 'nw' | 'ne' | 'sw' | 'se'\r\n\r\nclass ImageNodeView implements PMNodeView {\r\n dom: HTMLElement\r\n private node: Node\r\n private view: EditorView\r\n private getPos: () => number | undefined\r\n private img: HTMLImageElement\r\n private wrapper: HTMLElement\r\n private handles: HTMLElement\r\n private toolbar: HTMLElement\r\n private selected = false\r\n\r\n constructor(node: Node, view: EditorView, getPos: () => number | undefined) {\r\n this.node = node\r\n this.view = view\r\n this.getPos = getPos\r\n\r\n const { src, alt, title, width, height, align } = node.attrs\r\n\r\n this.wrapper = document.createElement('span')\r\n this.wrapper.className = `mi-img-wrap mi-img-align-${align || 'center'}`\r\n this.wrapper.style.display = 'inline-block'\r\n this.wrapper.style.position = 'relative'\r\n this.wrapper.style.lineHeight = '0'\r\n this.wrapper.style.verticalAlign = 'middle'\r\n if (width) {\r\n this.wrapper.style.width = typeof width === 'number' ? `${width}px` : String(width)\r\n }\r\n\r\n this.img = document.createElement('img')\r\n this.img.src = src || ''\r\n if (alt) this.img.alt = alt\r\n if (title) this.img.title = title\r\n if (width) this.img.style.width = typeof width === 'number' ? `${width}px` : String(width)\r\n if (height) this.img.style.height = typeof height === 'number' ? `${height}px` : String(height)\r\n this.img.style.display = 'block'\r\n this.img.style.maxWidth = '100%'\r\n this.img.style.height = height ? (typeof height === 'number' ? `${height}px` : String(height)) : 'auto'\r\n this.img.style.borderRadius = '6px'\r\n this.img.style.cursor = 'pointer'\r\n this.img.draggable = false\r\n\r\n this.handles = document.createElement('div')\r\n this.handles.style.cssText = 'display:none;position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;'\r\n ;(['nw', 'ne', 'sw', 'se'] as ResizeDir[]).forEach(dir => {\r\n const h = document.createElement('div')\r\n const isTop = dir.includes('n')\r\n const isLeft = dir.includes('w')\r\n h.style.cssText = `\r\n position:absolute;width:10px;height:10px;background:#fff;border:2px solid #1a73e8;\r\n border-radius:2px;pointer-events:all;cursor:${dir}-resize;z-index:10;\r\n top:${isTop ? '-5px' : 'auto'};bottom:${!isTop ? '-5px' : 'auto'};\r\n left:${isLeft ? '-5px' : 'auto'};right:${!isLeft ? '-5px' : 'auto'};\r\n `\r\n h.addEventListener('mousedown', e => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.startResize(e as MouseEvent, dir)\r\n })\r\n this.handles.appendChild(h)\r\n })\r\n\r\n this.toolbar = document.createElement('div')\r\n this.toolbar.style.cssText = 'display:none;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:3px 6px;box-shadow:0 2px 10px rgba(0,0,0,0.12);z-index:20;white-space:nowrap;line-height:1;'\r\n this.buildToolbar()\r\n\r\n this.wrapper.appendChild(this.img)\r\n this.wrapper.appendChild(this.handles)\r\n this.wrapper.appendChild(this.toolbar)\r\n this.dom = this.wrapper\r\n\r\n this.wrapper.addEventListener('mousedown', e => {\r\n if (e.target === this.img || e.target === this.wrapper) {\r\n e.preventDefault()\r\n }\r\n })\r\n\r\n this.wrapper.addEventListener('click', e => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.select()\r\n })\r\n\r\n const onDocMouseDown = (e: MouseEvent) => {\r\n if (!this.wrapper.contains(e.target as globalThis.Node)) {\r\n this.deselect()\r\n }\r\n }\r\n document.addEventListener('mousedown', onDocMouseDown)\r\n this._onDocMouseDown = onDocMouseDown\r\n }\r\n\r\n private buildToolbar(): void {\r\n this.toolbar.innerHTML = ''\r\n const sizeGroup = document.createElement('span')\r\n sizeGroup.style.cssText = 'display:inline-flex;gap:2px;align-items:center;'\r\n IMG_PRESET_SIZES.forEach(pct => {\r\n const btn = document.createElement('button')\r\n btn.textContent = `${pct}%`\r\n btn.style.cssText = 'padding:2px 6px;border:none;border-radius:3px;background:transparent;color:#555;cursor:pointer;font-size:11px;'\r\n btn.addEventListener('mousedown', e => { e.preventDefault(); e.stopPropagation() })\r\n btn.addEventListener('click', e => { e.preventDefault(); e.stopPropagation(); this.applyPreset(pct) })\r\n btn.addEventListener('mouseenter', () => { btn.style.background = '#f0f0f0' })\r\n btn.addEventListener('mouseleave', () => { btn.style.background = 'transparent' })\r\n sizeGroup.appendChild(btn)\r\n })\r\n\r\n const divider = document.createElement('span')\r\n divider.style.cssText = 'display:inline-block;width:1px;height:16px;background:#e0e0e0;margin:0 4px;vertical-align:middle;'\r\n\r\n const alignGroup = document.createElement('span')\r\n alignGroup.style.cssText = 'display:inline-flex;gap:2px;align-items:center;'\r\n const currentAlign = (this.node.attrs.align as string) || 'center'\r\n ;([['left', '◀'], ['center', '◆'], ['right', '▶']] as const).forEach(([val, icon]) => {\r\n const btn = document.createElement('button')\r\n btn.textContent = icon\r\n btn.style.cssText = `padding:2px 5px;border:none;border-radius:3px;background:${currentAlign === val ? '#e8f0fe' : 'transparent'};color:${currentAlign === val ? '#1a73e8' : '#555'};cursor:pointer;font-size:11px;`\r\n btn.addEventListener('mousedown', e => { e.preventDefault(); e.stopPropagation() })\r\n btn.addEventListener('click', e => { e.preventDefault(); e.stopPropagation(); this.setAlign(val) })\r\n alignGroup.appendChild(btn)\r\n })\r\n\r\n this.toolbar.appendChild(sizeGroup)\r\n this.toolbar.appendChild(divider)\r\n this.toolbar.appendChild(alignGroup)\r\n }\r\n\r\n private select(): void {\r\n if (this.selected) return\r\n this.selected = true\r\n this.handles.style.display = ''\r\n this.toolbar.style.display = ''\r\n this.img.style.outline = '2px solid rgba(26,115,232,0.5)'\r\n this.img.style.outlineOffset = '1px'\r\n const pos = this.getPos()\r\n if (pos === undefined) return\r\n try {\r\n const tr = this.view.state.tr.setSelection(NodeSelection.create(this.view.state.doc, pos))\r\n this.view.dispatch(tr)\r\n } catch { /* ignore */ }\r\n }\r\n\r\n private deselect(): void {\r\n if (!this.selected) return\r\n this.selected = false\r\n this.handles.style.display = 'none'\r\n this.toolbar.style.display = 'none'\r\n this.img.style.outline = ''\r\n this.img.style.outlineOffset = ''\r\n }\r\n\r\n private startResize(e: MouseEvent, dir: ResizeDir): void {\r\n const startX = e.clientX\r\n const startY = e.clientY\r\n const startW = this.img.offsetWidth\r\n const startH = this.img.offsetHeight\r\n const aspect = startW / startH\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n let dx = ev.clientX - startX\r\n let dy = ev.clientY - startY\r\n if (dir.includes('w')) dx = -dx\r\n if (dir.includes('n')) dy = -dy\r\n const scale = Math.max(dx / startW, dy / startH)\r\n let newW = Math.max(MIN_IMG_SIZE, Math.round(startW * (1 + scale)))\r\n let newH = Math.round(newW / aspect)\r\n if (newH < MIN_IMG_SIZE) { newH = MIN_IMG_SIZE; newW = Math.round(newH * aspect) }\r\n this.img.style.width = `${newW}px`\r\n this.img.style.height = `${newH}px`\r\n this.wrapper.style.width = `${newW}px`\r\n }\r\n\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n const pos = this.getPos()\r\n if (pos === undefined) return\r\n const cur = this.view.state.doc.nodeAt(pos)\r\n if (!cur || cur.type.name !== 'image') return\r\n const tr = this.view.state.tr.setNodeMarkup(pos, null, {\r\n ...cur.attrs, width: this.img.offsetWidth, height: this.img.offsetHeight,\r\n })\r\n this.view.dispatch(tr)\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n }\r\n\r\n private applyPreset(pct: number): void {\r\n const pos = this.getPos()\r\n if (pos === undefined) return\r\n const cur = this.view.state.doc.nodeAt(pos)\r\n if (!cur || cur.type.name !== 'image') return\r\n const baseW = this.img.naturalWidth || this.img.offsetWidth\r\n const baseH = this.img.naturalHeight || this.img.offsetHeight\r\n const newW = Math.max(MIN_IMG_SIZE, Math.round(baseW * pct / 100))\r\n const newH = Math.round(newW / (baseW / baseH))\r\n this.img.style.width = `${newW}px`\r\n this.img.style.height = `${newH}px`\r\n this.wrapper.style.width = `${newW}px`\r\n const tr = this.view.state.tr.setNodeMarkup(pos, null, { ...cur.attrs, width: newW, height: newH })\r\n this.view.dispatch(tr)\r\n }\r\n\r\n private setAlign(align: string): void {\r\n const pos = this.getPos()\r\n if (pos === undefined) return\r\n const cur = this.view.state.doc.nodeAt(pos)\r\n if (!cur || cur.type.name !== 'image') return\r\n this.wrapper.className = `mi-img-wrap mi-img-align-${align}`\r\n this.buildToolbar()\r\n const tr = this.view.state.tr.setNodeMarkup(pos, null, { ...cur.attrs, align })\r\n this.view.dispatch(tr)\r\n }\r\n\r\n update(node: Node): boolean {\r\n if (node.type.name !== 'image') return false\r\n this.node = node\r\n const { src, alt, title, width, height, align } = node.attrs\r\n this.wrapper.className = `mi-img-wrap mi-img-align-${align || 'center'}`\r\n if (this.img.src !== src) this.img.src = src || ''\r\n if (alt) this.img.alt = alt\r\n if (title) this.img.title = title\r\n if (width) {\r\n const w = typeof width === 'number' ? `${width}px` : String(width)\r\n this.img.style.width = w\r\n this.wrapper.style.width = w\r\n } else {\r\n this.img.style.width = ''\r\n this.wrapper.style.width = ''\r\n }\r\n if (height) {\r\n this.img.style.height = typeof height === 'number' ? `${height}px` : String(height)\r\n } else {\r\n this.img.style.height = ''\r\n }\r\n this.buildToolbar()\r\n return true\r\n }\r\n\r\n stopEvent(): boolean { return true }\r\n ignoreMutation(): boolean { return true }\r\n private _onDocMouseDown: ((e: MouseEvent) => void) | null = null\r\n destroy(): void {\r\n if (this._onDocMouseDown) {\r\n document.removeEventListener('mousedown', this._onDocMouseDown)\r\n this._onDocMouseDown = null\r\n }\r\n this.deselect()\r\n }\r\n}\r\n\r\nexport function ImageExtension(): Extension {\r\n return {\r\n name: 'image',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'inline',\r\n inline: true,\r\n attrs: {\r\n src: {},\r\n alt: { default: null },\r\n title: { default: null },\r\n width: { default: null },\r\n height: { default: null },\r\n align: { default: 'center' },\r\n },\r\n selectable: true,\r\n draggable: true,\r\n toDOM(node) {\r\n const { src, alt, title, width, height } = node.attrs\r\n const attrs: Record<string, string> = { src: src || '', draggable: 'false' }\r\n if (alt) attrs.alt = alt\r\n if (title) attrs.title = title\r\n if (width) {\r\n const w = typeof width === 'number' ? `${width}px` : String(width)\r\n const h = height ? (typeof height === 'number' ? `${height}px` : String(height)) : 'auto'\r\n attrs.style = `width: ${w}; height: ${h};`\r\n }\r\n return ['img', attrs]\r\n },\r\n parseDOM: [{\r\n tag: 'img[src]',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const style = el.getAttribute('style') || ''\r\n const wMatch = style.match(/width:\\s*(\\d+)px/)\r\n const hMatch = style.match(/height:\\s*(\\d+)px/)\r\n return {\r\n src: el.getAttribute('src'),\r\n alt: el.getAttribute('alt'),\r\n title: el.getAttribute('title'),\r\n width: wMatch ? parseInt(wMatch[1]) : (el.getAttribute('width') ? parseInt(el.getAttribute('width')!) : null),\r\n height: hMatch ? parseInt(hMatch[1]) : (el.getAttribute('height') ? parseInt(el.getAttribute('height')!) : null),\r\n align: 'center',\r\n }\r\n },\r\n }],\r\n }\r\n return { image: spec }\r\n },\r\n addCommands() {\r\n return {\r\n setImageSize: (...args: unknown[]) => {\r\n const width = args[0] as number\r\n const height = args[1] as number | undefined\r\n return (state, dispatch) => {\r\n const { $from } = state.selection\r\n let imagePos = -1\r\n for (let d = $from.depth; d > 0; d--) {\r\n if ($from.node(d).type.name === 'image') { imagePos = $from.before(d); break }\r\n }\r\n if (imagePos < 0) return false\r\n const node = state.doc.nodeAt(imagePos)\r\n if (!node || node.type.name !== 'image') return false\r\n const aspect = node.attrs.width && node.attrs.height\r\n ? (node.attrs.width as number) / (node.attrs.height as number) : 1\r\n const finalH = height ?? Math.round(width / aspect)\r\n if (dispatch) {\r\n dispatch(state.tr.setNodeMarkup(imagePos, null, { ...node.attrs, width, height: finalH }))\r\n }\r\n return true\r\n }\r\n },\r\n setImageAlign: (...args: unknown[]) => {\r\n const align = args[0] as string\r\n return (state, dispatch) => {\r\n const { $from } = state.selection\r\n let imagePos = -1\r\n for (let d = $from.depth; d > 0; d--) {\r\n if ($from.node(d).type.name === 'image') { imagePos = $from.before(d); break }\r\n }\r\n if (imagePos < 0) return false\r\n const node = state.doc.nodeAt(imagePos)\r\n if (!node || node.type.name !== 'image') return false\r\n if (dispatch) {\r\n dispatch(state.tr.setNodeMarkup(imagePos, null, { ...node.attrs, align }))\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n key: new PluginKey('imageNodeView'),\r\n props: {\r\n nodeViews: {\r\n image(node: Node, view: EditorView, getPos: () => number | undefined) {\r\n return new ImageNodeView(node, view, getPos)\r\n },\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Card\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function CardExtension(): Extension {\r\n return {\r\n name: 'card',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n content: 'block+',\r\n defining: true,\r\n attrs: { title: { default: '' } },\r\n toDOM(node) {\r\n return ['div', { class: 'mi-card', 'data-card-title': node.attrs.title || '' },\r\n ['div', { class: 'mi-card-header' },\r\n ['div', { class: 'mi-card-title', contenteditable: 'false', 'data-card-title': '' },\r\n node.attrs.title || '卡片标题',\r\n ],\r\n ],\r\n ['div', { class: 'mi-card-body' }, 0],\r\n ]\r\n },\r\n parseDOM: [{\r\n tag: 'div.mi-card',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const titleEl = el.querySelector('.mi-card-title')\r\n return { title: titleEl?.textContent || el.getAttribute('data-card-title') || '' }\r\n },\r\n }],\r\n }\r\n return { card: spec }\r\n },\r\n addCommands() {\r\n return {\r\n card: (...args: unknown[]) => {\r\n const title = (args[0] as string) ?? ''\r\n return (state, dispatch) => {\r\n const nt = state.schema.nodes['card']\r\n const paraType = state.schema.nodes['paragraph']\r\n if (!nt || !paraType) return false\r\n const { from, to } = state.selection\r\n const para = paraType.createAndFill()!\r\n const card = nt.create({ title }, para)\r\n if (dispatch) {\r\n const tr = state.tr.replaceWith(from, to, card)\r\n dispatch(tr.scrollIntoView())\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDOMEvents: {\r\n click(view: EditorView, event: MouseEvent) {\r\n const target = event.target as HTMLElement\r\n const titleEl = target.closest('.mi-card-title') as HTMLElement | null\r\n if (!titleEl) return false\r\n const card = titleEl.closest('.mi-card') as HTMLElement | null\r\n if (!card) return false\r\n event.preventDefault()\r\n const pos = view.posAtDOM(card, 0)\r\n const tr = view.state.tr\r\n const resolved = tr.doc.resolve(pos)\r\n let nodePos = -1\r\n for (let d = resolved.depth; d >= 0; d--) {\r\n if (resolved.node(d).type.name === 'card') {\r\n nodePos = resolved.before(d)\r\n break\r\n }\r\n }\r\n if (nodePos < 0) return false\r\n const node = tr.doc.nodeAt(nodePos)\r\n if (!node || node.type.name !== 'card') return false\r\n const currentTitle = node.attrs.title as string\r\n const newTitle = prompt('编辑卡片标题:', currentTitle)\r\n if (newTitle !== null && newTitle !== currentTitle) {\r\n tr.setNodeMarkup(nodePos, null, { ...node.attrs, title: newTitle })\r\n view.dispatch(tr)\r\n }\r\n return true\r\n },\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Product Card\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ProductCardAttrs {\r\n productName: string\r\n productImage: string\r\n productPrice: string\r\n productOriginalPrice: string\r\n productDescription: string\r\n productLink: string\r\n productTags: string\r\n}\r\n\r\nexport function ProductCardExtension(): Extension {\r\n return {\r\n name: 'product_card',\r\n type: 'node',\r\n addNodes() {\r\n const spec: NodeSpec = {\r\n group: 'block',\r\n atom: true,\r\n attrs: {\r\n productName: { default: '' },\r\n productImage: { default: '' },\r\n productPrice: { default: '' },\r\n productOriginalPrice: { default: '' },\r\n productDescription: { default: '' },\r\n productLink: { default: '' },\r\n productTags: { default: '' },\r\n },\r\n toDOM(node) {\r\n const a = node.attrs as ProductCardAttrs\r\n const tags = a.productTags\r\n ? a.productTags.split(',').map((t: string) => t.trim()).filter(Boolean)\r\n : []\r\n\r\n const imgWrap: import('prosemirror-model').DOMOutputSpec = a.productImage\r\n ? ['div', { class: 'mi-product-card-img-wrap' },\r\n ['img', { src: a.productImage, alt: a.productName, class: 'mi-product-card-img', draggable: 'false' }],\r\n ]\r\n : ['div', { class: 'mi-product-card-img-wrap mi-product-card-img-empty' },\r\n ['span', { class: 'mi-product-card-img-placeholder' }, '📦'],\r\n ]\r\n\r\n const contentChildren: import('prosemirror-model').DOMOutputSpec[] = [\r\n ['div', { class: 'mi-product-card-title' }, a.productName || '商品名称'],\r\n ]\r\n\r\n if (a.productDescription) {\r\n contentChildren.push(['div', { class: 'mi-product-card-desc' }, a.productDescription])\r\n }\r\n\r\n if (tags.length > 0) {\r\n const tagElements: import('prosemirror-model').DOMOutputSpec[] = tags.map(tag =>\r\n ['span', { class: 'mi-product-card-tag' }, tag] as import('prosemirror-model').DOMOutputSpec\r\n )\r\n contentChildren.push(['div', { class: 'mi-product-card-tags' }, ...tagElements])\r\n }\r\n\r\n if (a.productPrice || a.productOriginalPrice) {\r\n const priceElements: import('prosemirror-model').DOMOutputSpec[] = []\r\n if (a.productPrice) {\r\n priceElements.push(['span', { class: 'mi-product-card-price' }, `¥${a.productPrice}`])\r\n }\r\n if (a.productOriginalPrice) {\r\n priceElements.push(['span', { class: 'mi-product-card-original-price' }, `¥${a.productOriginalPrice}`])\r\n }\r\n contentChildren.push(['div', { class: 'mi-product-card-price-row' }, ...priceElements])\r\n }\r\n\r\n if (a.productLink) {\r\n contentChildren.push(['a', { class: 'mi-product-card-link', href: a.productLink, target: '_blank', rel: 'noopener noreferrer' }, '查看详情 →'])\r\n }\r\n\r\n return ['div', { class: 'mi-product-card', contenteditable: 'false' },\r\n ['div', { class: 'mi-product-card-inner' },\r\n imgWrap,\r\n ['div', { class: 'mi-product-card-content' }, ...contentChildren],\r\n ],\r\n ['button', { class: 'mi-product-card-delete', title: '删除卡片' }, '×'],\r\n ] as import('prosemirror-model').DOMOutputSpec\r\n },\r\n parseDOM: [{\r\n tag: 'div.mi-product-card',\r\n getAttrs(dom) {\r\n const el = dom as HTMLElement\r\n const get = (sel: string) => el.querySelector(sel)?.textContent?.trim() || ''\r\n const img = el.querySelector('.mi-product-card-img') as HTMLImageElement | null\r\n const link = el.querySelector('.mi-product-card-link') as HTMLAnchorElement | null\r\n const tags = Array.from(el.querySelectorAll('.mi-product-card-tag')).map(t => t.textContent?.trim() || '').filter(Boolean).join(',')\r\n return {\r\n productName: get('.mi-product-card-title'),\r\n productImage: img?.getAttribute('src') || '',\r\n productPrice: get('.mi-product-card-price')?.replace(/^¥/, '') || '',\r\n productOriginalPrice: get('.mi-product-card-original-price')?.replace(/^¥/, '') || '',\r\n productDescription: get('.mi-product-card-desc'),\r\n productLink: link?.getAttribute('href') || '',\r\n productTags: tags,\r\n }\r\n },\r\n }],\r\n }\r\n return { product_card: spec }\r\n },\r\n addCommands() {\r\n return {\r\n insertProductCard: (...args: unknown[]) => {\r\n const attrs = args[0] as Partial<ProductCardAttrs> | undefined\r\n return (state, dispatch) => {\r\n const nt = state.schema.nodes['product_card']\r\n if (!nt) return false\r\n const { from, to } = state.selection\r\n const node = nt.create({\r\n productName: attrs?.productName ?? '',\r\n productImage: attrs?.productImage ?? '',\r\n productPrice: attrs?.productPrice ?? '',\r\n productOriginalPrice: attrs?.productOriginalPrice ?? '',\r\n productDescription: attrs?.productDescription ?? '',\r\n productLink: attrs?.productLink ?? '',\r\n productTags: attrs?.productTags ?? '',\r\n })\r\n if (dispatch) {\r\n const tr = state.tr.replaceWith(from, to, node)\r\n dispatch(tr.scrollIntoView())\r\n }\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDOMEvents: {\r\n click(view: EditorView, event: MouseEvent) {\r\n const target = event.target as HTMLElement\r\n if (target.classList.contains('mi-product-card-delete')) {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n const card = target.closest('.mi-product-card') as HTMLElement | null\r\n if (!card || !view.dom.contains(card)) return false\r\n const pos = view.posAtDOM(card, 0)\r\n const node = view.state.doc.nodeAt(pos)\r\n if (!node || node.type.name !== 'product_card') return false\r\n const tr = view.state.tr.delete(pos, pos + node.nodeSize)\r\n view.dispatch(tr)\r\n return true\r\n }\r\n return false\r\n },\r\n dblclick(view: EditorView, event: MouseEvent) {\r\n const target = event.target as HTMLElement\r\n if (target.classList.contains('mi-product-card-delete')) return false\r\n const card = target.closest('.mi-product-card') as HTMLElement | null\r\n if (!card || !view.dom.contains(card)) return false\r\n event.preventDefault()\r\n const pos = view.posAtDOM(card, 0)\r\n const node = view.state.doc.nodeAt(pos)\r\n if (!node || node.type.name !== 'product_card') return false\r\n const a = node.attrs as ProductCardAttrs\r\n const name = prompt('商品名称:', a.productName)\r\n if (name === null) return true\r\n const price = prompt('商品价格:', a.productPrice)\r\n if (price === null) return true\r\n const desc = prompt('商品描述:', a.productDescription)\r\n if (desc === null) return true\r\n const tr = view.state.tr\r\n tr.setNodeMarkup(pos, null, { ...node.attrs, productName: name, productPrice: price, productDescription: desc })\r\n view.dispatch(tr)\r\n return true\r\n },\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n","import type { Extension } from '../core/extension'\nimport type { NodeSpec, Schema, Node as PMNode } from 'prosemirror-model'\nimport type { Command, EditorState, Transaction } from 'prosemirror-state'\nimport { Plugin, PluginKey, TextSelection, NodeSelection } from 'prosemirror-state'\nimport { inputRules, InputRule } from 'prosemirror-inputrules'\nimport type { EditorView } from 'prosemirror-view'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type TableStyle = 'default' | 'borderless' | 'striped' | 'minimal' | 'header-only'\n\nexport interface TableAttrs {\n class?: string | null\n tableStyle?: TableStyle | null\n}\n\nexport interface CellAttrs {\n colspan?: number\n rowspan?: number\n colwidth?: number[] | null\n style?: string | null\n}\n\nexport const TABLE_STYLES: { label: string; value: TableStyle; description: string }[] = [\n { label: '默认', value: 'default', description: '带边框的标准表格' },\n { label: '无边框', value: 'borderless', description: '无外边框的简洁表格' },\n { label: '条纹', value: 'striped', description: '交替行背景色' },\n { label: '极简', value: 'minimal', description: '仅保留表头分隔线' },\n { label: '仅表头', value: 'header-only', description: '仅表头有背景色' },\n]\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nfunction cellAttrs(attrs: Record<string, unknown>): CellAttrs {\n return {\n colspan: (attrs.colspan as number) || 1,\n rowspan: (attrs.rowspan as number) || 1,\n colwidth: (attrs.colwidth as number[]) || null,\n style: (attrs.style as string) || null,\n }\n}\n\nfunction cellAttrsToDOM(attrs: CellAttrs): Record<string, string> {\n const result: Record<string, string> = {}\n if (attrs.colspan && attrs.colspan > 1) result.colspan = String(attrs.colspan)\n if (attrs.rowspan && attrs.rowspan > 1) result.rowspan = String(attrs.rowspan)\n if (attrs.colwidth && attrs.colwidth.length > 0) {\n result.style = `width: ${attrs.colwidth[0]}px`\n }\n if (attrs.style) {\n result.style = result.style ? `${result.style}; ${attrs.style}` : attrs.style\n }\n return result\n}\n\nfunction parseCellAttrs(dom: HTMLElement): CellAttrs {\n const colspan = parseInt(dom.getAttribute('colspan') || '1', 10)\n const rowspan = parseInt(dom.getAttribute('rowspan') || '1', 10)\n const colwidth = dom.getAttribute('colwidth')\n ? dom.getAttribute('colwidth')!.split(',').map(Number)\n : null\n const style = dom.getAttribute('style') || null\n return { colspan, rowspan, colwidth, style }\n}\n\nfunction tableNodes() {\n const table: NodeSpec = {\n group: 'block',\n content: 'table_row+',\n tableRole: 'table',\n isolating: true,\n attrs: {\n class: { default: null },\n tableStyle: { default: 'default' },\n },\n parseDOM: [\n {\n tag: 'table',\n getAttrs: (dom) => ({\n class: (dom as HTMLElement).getAttribute('class'),\n tableStyle: ((dom as HTMLElement).getAttribute('data-table-style') as TableStyle) || 'default',\n }),\n },\n ],\n toDOM(node) {\n const style = (node.attrs.tableStyle as TableStyle) || 'default'\n const attrs: Record<string, string> = { \n class: `miyuan-table miyuan-table-${style}`,\n 'data-table-style': style,\n }\n if (node.attrs.class) attrs.class += ` ${node.attrs.class}`\n return ['div', { class: 'miyuan-table-wrapper' }, ['table', attrs, ['tbody', 0]]]\n },\n }\n\n const table_row: NodeSpec = {\n content: '(table_cell | table_header)+',\n tableRole: 'row',\n parseDOM: [{ tag: 'tr' }],\n toDOM() {\n return ['tr', 0]\n },\n }\n\n const table_cell: NodeSpec = {\n content: 'block+',\n tableRole: 'cell',\n isolating: true,\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n style: { default: null },\n },\n parseDOM: [\n {\n tag: 'td',\n getAttrs: (dom) => parseCellAttrs(dom as HTMLElement),\n },\n ],\n toDOM(node) {\n const attrs = cellAttrsToDOM(cellAttrs(node.attrs))\n return ['td', attrs, 0]\n },\n }\n\n const table_header: NodeSpec = {\n content: 'block+',\n tableRole: 'header_cell',\n isolating: true,\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null },\n style: { default: null },\n },\n parseDOM: [\n {\n tag: 'th',\n getAttrs: (dom) => parseCellAttrs(dom as HTMLElement),\n },\n ],\n toDOM(node) {\n const attrs = cellAttrsToDOM(cellAttrs(node.attrs))\n return ['th', attrs, 0]\n },\n }\n\n return { table, table_row, table_cell, table_header }\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nfunction findTable(state: EditorState) {\n const { $from } = state.selection\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === 'table') {\n return { pos: $from.before(d), node: $from.node(d), depth: d }\n }\n }\n return null\n}\n\nfunction findCellPosition(state: EditorState) {\n const { $from } = state.selection\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d)\n if (node.type.name === 'table_cell' || node.type.name === 'table_header') {\n return {\n cellPos: $from.before(d),\n cellNode: node,\n rowPos: $from.before(d - 1),\n rowNode: $from.node(d - 1),\n tablePos: $from.before(d - 2),\n tableNode: $from.node(d - 2),\n }\n }\n }\n return null\n}\n\nfunction createCell(type: string, schema: Schema, isHeader = false) {\n const cellType = isHeader ? schema.nodes.table_header : schema.nodes[tableType]\n const paraType = schema.nodes.paragraph\n return cellType.createAndFill({}, paraType.createAndFill()!)\n}\n\nconst tableType = 'table_cell'\n\nexport function insertTable(rows = 3, cols = 3): Command {\n return (state, dispatch) => {\n const { schema } = state\n const tableNodeType = schema.nodes.table\n const rowType = schema.nodes.table_row\n const cellType = schema.nodes.table_cell\n const headerType = schema.nodes.table_header\n const paraType = schema.nodes.paragraph\n\n if (!tableNodeType || !rowType || !cellType || !headerType || !paraType) {\n return false\n }\n\n const tableRows: PMNode[] = []\n\n // Create header row\n const headerCells: PMNode[] = []\n for (let c = 0; c < cols; c++) {\n headerCells.push(headerType.createAndFill({}, paraType.createAndFill()!)!)\n }\n tableRows.push(rowType.create(null, headerCells))\n\n // Create data rows\n for (let r = 1; r < rows; r++) {\n const cells: PMNode[] = []\n for (let c = 0; c < cols; c++) {\n cells.push(cellType.createAndFill({}, paraType.createAndFill()!)!)\n }\n tableRows.push(rowType.create(null, cells))\n }\n\n const table = tableNodeType.create(null, tableRows)\n\n if (dispatch) {\n const { from, to } = state.selection\n const tr = state.tr.replaceWith(from, to, table)\n const newSelection = TextSelection.near(tr.doc.resolve(from + 2))\n tr.setSelection(newSelection)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function addRowBefore(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n if (dispatch) {\n const { schema } = state\n const rowType = schema.nodes.table_row\n const cellType = schema.nodes.table_cell\n const paraType = schema.nodes.paragraph\n\n const colCount = cellPos.rowNode.childCount\n const cells: PMNode[] = []\n for (let i = 0; i < colCount; i++) {\n cells.push(cellType.createAndFill({}, paraType.createAndFill()!)!)\n }\n const newRow = rowType.create(null, cells)\n\n const tr = state.tr.insert(cellPos.rowPos, newRow)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function addRowAfter(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n if (dispatch) {\n const { schema } = state\n const rowType = schema.nodes.table_row\n const cellType = schema.nodes.table_cell\n const paraType = schema.nodes.paragraph\n\n const colCount = cellPos.rowNode.childCount\n const cells: PMNode[] = []\n for (let i = 0; i < colCount; i++) {\n cells.push(cellType.createAndFill({}, paraType.createAndFill()!)!)\n }\n const newRow = rowType.create(null, cells)\n\n const tr = state.tr.insert(cellPos.rowPos + cellPos.rowNode.nodeSize, newRow)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function addColumnBefore(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n if (dispatch) {\n const { schema } = state\n const table = cellPos.tableNode\n const colIndex = getCellColumnIndex(cellPos.rowNode, cellPos.cellPos - cellPos.rowPos - 1)\n\n let tr = state.tr\n\n // Process rows from bottom to top to avoid position shifts\n for (let i = table.childCount - 1; i >= 0; i--) {\n const row = table.child(i)\n const isHeader = i === 0\n const cellType = isHeader ? schema.nodes.table_header : schema.nodes.table_cell\n const paraType = schema.nodes.paragraph\n const newCell = cellType.createAndFill({}, paraType.createAndFill()!)!\n\n // Calculate the position before the target column in this row\n let insertPos = cellPos.tablePos + 1 // Start after table opening\n for (let r = 0; r < i; r++) {\n insertPos += table.child(r).nodeSize\n }\n insertPos += 1 // After row opening\n \n // Add sizes of cells before the target column\n for (let j = 0; j < colIndex && j < row.childCount; j++) {\n insertPos += row.child(j).nodeSize\n }\n\n tr = tr.insert(insertPos, newCell)\n }\n\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function addColumnAfter(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n if (dispatch) {\n const { schema } = state\n const table = cellPos.tableNode\n const colIndex = getCellColumnIndex(cellPos.rowNode, cellPos.cellPos - cellPos.rowPos - 1)\n\n let tr = state.tr\n\n // Process rows from bottom to top to avoid position shifts\n for (let i = table.childCount - 1; i >= 0; i--) {\n const row = table.child(i)\n const isHeader = i === 0\n const cellType = isHeader ? schema.nodes.table_header : schema.nodes.table_cell\n const paraType = schema.nodes.paragraph\n const newCell = cellType.createAndFill({}, paraType.createAndFill()!)!\n\n // Calculate the position after the target column in this row\n let insertPos = cellPos.tablePos + 1 // Start after table opening\n for (let r = 0; r < i; r++) {\n insertPos += table.child(r).nodeSize\n }\n insertPos += 1 // After row opening\n \n // Add sizes of cells up to and including the target column\n for (let j = 0; j <= colIndex && j < row.childCount; j++) {\n insertPos += row.child(j).nodeSize\n }\n\n tr = tr.insert(insertPos, newCell)\n }\n\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function deleteRow(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n // Don't delete if it's the only row\n if (cellPos.tableNode.childCount === 1) {\n return deleteTable()(state, dispatch)\n }\n\n if (dispatch) {\n const tr = state.tr.delete(cellPos.rowPos, cellPos.rowPos + cellPos.rowNode.nodeSize)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function deleteColumn(): Command {\n return (state, dispatch) => {\n const cellPos = findCellPosition(state)\n if (!cellPos) return false\n\n // Don't delete if it's the only column\n if (cellPos.rowNode.childCount === 1) {\n return deleteTable()(state, dispatch)\n }\n\n if (dispatch) {\n const { schema } = state\n const table = cellPos.tableNode\n const colIndex = getCellColumnIndex(cellPos.rowNode, cellPos.cellPos - cellPos.rowPos - 1)\n\n let tr = state.tr\n let offset = 0\n\n // Delete cell from each row\n for (let i = 0; i < table.childCount; i++) {\n const row = table.child(i)\n const rowPos = cellPos.tablePos + offset + 1\n\n let cellDeletePos = rowPos + 1\n for (let j = 0; j < colIndex && j < row.childCount; j++) {\n cellDeletePos += row.child(j).nodeSize\n }\n\n const cellToDelete = row.child(Math.min(colIndex, row.childCount - 1))\n tr = tr.delete(cellDeletePos, cellDeletePos + cellToDelete.nodeSize)\n offset -= cellToDelete.nodeSize\n }\n\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function deleteTable(): Command {\n return (state, dispatch) => {\n const table = findTable(state)\n if (!table) return false\n\n if (dispatch) {\n const tr = state.tr.delete(table.pos, table.pos + table.node.nodeSize)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function toggleHeaderRow(): Command {\n return (state, dispatch) => {\n const table = findTable(state)\n if (!table) return false\n\n if (dispatch) {\n const { schema } = state\n const tableNode = table.node\n const firstRow = tableNode.child(0)\n const tr = state.tr\n\n // Check if first row is already all headers\n const allHeaders = Array.from({ length: firstRow.childCount }, (_, i) => firstRow.child(i).type.name).every(\n (type) => type === 'table_header'\n )\n\n // Toggle first row cells\n let offset = 0\n for (let i = 0; i < firstRow.childCount; i++) {\n const cell = firstRow.child(i)\n const cellPos = table.pos + 1 + offset\n const newType = allHeaders ? schema.nodes.table_cell : schema.nodes.table_header\n tr.setNodeMarkup(cellPos, newType, cell.attrs)\n offset += cell.nodeSize\n }\n\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\nexport function setTableStyle(style: TableStyle): Command {\n return (state, dispatch) => {\n const table = findTable(state)\n if (!table) return false\n\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(table.pos, null, {\n ...table.node.attrs,\n tableStyle: style,\n })\n dispatch(tr)\n }\n return true\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nfunction getCellColumnIndex(row: PMNode, cellOffset: number): number {\n let offset = 0\n for (let i = 0; i < row.childCount; i++) {\n if (offset === cellOffset) return i\n offset += row.child(i).nodeSize\n }\n return row.childCount - 1\n}\n\n// ---------------------------------------------------------------------------\n// Plugin\n// ---------------------------------------------------------------------------\n\nconst tablePluginKey = new PluginKey('table')\n\nfunction tablePlugin() {\n return new Plugin({\n key: tablePluginKey,\n props: {\n handleKeyDown(view, event) {\n const state = view.state\n const cellPos = findCellPosition(state)\n\n // Tab key navigation\n if (event.key === 'Tab') {\n if (!cellPos) return false\n\n event.preventDefault()\n const { schema } = state\n const table = cellPos.tableNode\n const row = cellPos.rowNode\n const colIndex = getCellColumnIndex(row, cellPos.cellPos - cellPos.rowPos - 1)\n const rowIndex = getRowIndex(table, cellPos.rowPos - cellPos.tablePos - 1)\n\n let targetRow: number\n let targetCol: number\n\n if (event.shiftKey) {\n // Move to previous cell\n if (colIndex > 0) {\n targetRow = rowIndex\n targetCol = colIndex - 1\n } else if (rowIndex > 0) {\n targetRow = rowIndex - 1\n targetCol = table.child(rowIndex - 1).childCount - 1\n } else {\n return true\n }\n } else {\n // Move to next cell\n if (colIndex < row.childCount - 1) {\n targetRow = rowIndex\n targetCol = colIndex + 1\n } else if (rowIndex < table.childCount - 1) {\n targetRow = rowIndex + 1\n targetCol = 0\n } else {\n // At last cell, add new row\n return addRowAfter()(state, view.dispatch)\n }\n }\n\n // Move to target cell\n const targetCellPos = getCellPos(table, targetRow, targetCol, cellPos.tablePos)\n if (targetCellPos !== null) {\n const $pos = state.doc.resolve(targetCellPos + 1)\n const tr = state.tr.setSelection(TextSelection.near($pos, 1))\n view.dispatch(tr.scrollIntoView())\n }\n return true\n }\n\n // Enter key behavior\n if (event.key === 'Enter' && !event.shiftKey && !event.ctrlKey && !event.metaKey) {\n if (!cellPos) return false\n return false\n }\n\n // Backspace key behavior\n if (event.key === 'Backspace') {\n if (!cellPos) return false\n \n const { from, empty } = state.selection\n \n // If selection is not empty, let default behavior handle it\n if (!empty) return false\n \n // Check if cursor is at the start of a cell (after cell opening + paragraph opening)\n const cellContentStart = cellPos.cellPos + 2\n if (from === cellContentStart) {\n event.preventDefault()\n \n // If it's the first cell of the first row, delete the entire table\n const table = cellPos.tableNode\n const firstRow = table.child(0)\n const firstCellPos = cellPos.tablePos + 2\n \n if (cellPos.cellPos === firstCellPos - 1) {\n return deleteTable()(state, view.dispatch)\n }\n \n // Otherwise, move to previous cell\n const row = cellPos.rowNode\n const colIndex = getCellColumnIndex(row, cellPos.cellPos - cellPos.rowPos - 1)\n const rowIndex = getRowIndex(table, cellPos.rowPos - cellPos.tablePos - 1)\n \n let prevRow: number\n let prevCol: number\n \n if (colIndex > 0) {\n prevRow = rowIndex\n prevCol = colIndex - 1\n } else if (rowIndex > 0) {\n prevRow = rowIndex - 1\n prevCol = table.child(rowIndex - 1).childCount - 1\n } else {\n return true\n }\n \n const prevCellPos = getCellPos(table, prevRow, prevCol, cellPos.tablePos)\n if (prevCellPos !== null) {\n const $pos = state.doc.resolve(prevCellPos + 1)\n const tr = state.tr.setSelection(TextSelection.near($pos, 1))\n view.dispatch(tr.scrollIntoView())\n }\n return true\n }\n }\n\n return false\n },\n },\n })\n}\n\nfunction getRowIndex(table: PMNode, rowOffset: number): number {\n let offset = 0\n for (let i = 0; i < table.childCount; i++) {\n if (offset === rowOffset) return i\n offset += table.child(i).nodeSize\n }\n return table.childCount - 1\n}\n\nfunction getCellPos(table: PMNode, rowIndex: number, colIndex: number, tablePos: number): number | null {\n if (rowIndex < 0 || rowIndex >= table.childCount) return null\n const row = table.child(rowIndex)\n if (colIndex < 0 || colIndex >= row.childCount) return null\n\n let offset = 1 // Start after table opening\n for (let r = 0; r < rowIndex; r++) {\n offset += table.child(r).nodeSize\n }\n\n let cellOffset = 1 // Start after row opening\n for (let c = 0; c < colIndex; c++) {\n cellOffset += row.child(c).nodeSize\n }\n\n return tablePos + offset + cellOffset\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\nexport function TableExtension(): Extension {\n return {\n name: 'table',\n type: 'node',\n addNodes() {\n return tableNodes()\n },\n addCommands() {\n return {\n insertTable:\n (...args: unknown[]) =>\n (state, dispatch) => {\n const rows = (args[0] as number) || 3\n const cols = (args[1] as number) || 3\n return insertTable(rows, cols)(state, dispatch)\n },\n addRowBefore: () => addRowBefore(),\n addRowAfter: () => addRowAfter(),\n addColumnBefore: () => addColumnBefore(),\n addColumnAfter: () => addColumnAfter(),\n deleteRow: () => deleteRow(),\n deleteColumn: () => deleteColumn(),\n deleteTable: () => deleteTable(),\n toggleHeaderRow: () => toggleHeaderRow(),\n setTableStyle: (...args: unknown[]) => setTableStyle((args[0] as TableStyle) || 'default'),\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-t': insertTable(3, 3),\n }\n },\n addPlugins() {\n return [tablePlugin()]\n },\n }\n}\n","import type { Extension } from '../core/extension'\r\nimport { Plugin, PluginKey } from 'prosemirror-state'\r\nimport type { EditorState } from 'prosemirror-state'\r\nimport { Decoration, DecorationSet } from 'prosemirror-view'\r\nimport { history, undo, redo } from 'prosemirror-history'\r\n\r\n// ---------------------------------------------------------------------------\r\n// History Extension\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function HistoryExtension(): Extension {\r\n return {\r\n name: 'history',\r\n type: 'extension',\r\n addPlugins() {\r\n return [history()]\r\n },\r\n addCommands() {\r\n return {\r\n undo: () => undo,\r\n redo: () => redo,\r\n }\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-z': undo,\r\n 'Mod-y': redo,\r\n 'Mod-Shift-z': redo,\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Placeholder Extension\r\n// ---------------------------------------------------------------------------\r\n\r\nconst placeholderKey = new PluginKey('placeholder')\r\n\r\nexport function PlaceholderExtension(config?: { placeholder: string }): Extension {\r\n const text = config?.placeholder ?? '开始输入...'\r\n\r\n return {\r\n name: 'placeholder',\r\n type: 'extension',\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n key: placeholderKey,\r\n state: {\r\n init(_, state) {\r\n return buildDecorations(state, text)\r\n },\r\n apply(tr, oldDecorations, _oldState, newState) {\r\n if (tr.docChanged) {\r\n return buildDecorations(newState, text)\r\n }\r\n return oldDecorations\r\n },\r\n },\r\n props: {\r\n decorations(state) {\r\n return this.getState(state)\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n\r\nfunction buildDecorations(state: EditorState, text: string): DecorationSet {\r\n const doc = state.doc\r\n if (doc.childCount !== 1) return DecorationSet.empty\r\n const first = doc.firstChild\r\n if (!first || first.type.name !== 'paragraph' || first.content.size > 0) return DecorationSet.empty\r\n\r\n const deco = Decoration.node(0, first.nodeSize, {\r\n class: 'mi-placeholder',\r\n 'data-placeholder': text,\r\n })\r\n return DecorationSet.create(doc, [deco])\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Image Upload Extension (paste & drop)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ImageUploadConfig {\r\n /** Upload handler: returns a promise with the image URL */\r\n upload?: (file: File) => Promise<string>\r\n /** Max file size in bytes (default 5MB) */\r\n maxSize?: number\r\n}\r\n\r\nconst imageUploadKey = new PluginKey('imageUpload')\r\n\r\n/** Default: convert file to base64 data URL */\r\nfunction fileToDataURL(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = () => resolve(reader.result as string)\r\n reader.onerror = reject\r\n reader.readAsDataURL(file)\r\n })\r\n}\r\n\r\nexport function ImageUploadExtension(config?: ImageUploadConfig): Extension {\r\n const upload = config?.upload ?? fileToDataURL\r\n const maxSize = config?.maxSize ?? 5 * 1024 * 1024\r\n\r\n function insertImage(view: { state: EditorState; dispatch: (tr: import('prosemirror-state').Transaction) => void }, src: string) {\r\n const imageType = view.state.schema.nodes['image']\r\n if (!imageType) return\r\n const tr = view.state.tr.replaceSelectionWith(imageType.create({ src }))\r\n view.dispatch(tr.scrollIntoView())\r\n }\r\n\r\n async function handleFile(file: File, view: Parameters<typeof insertImage>[0]) {\r\n if (!file.type.startsWith('image/')) return\r\n if (file.size > maxSize) {\r\n console.warn(`Image too large: ${(file.size / 1024 / 1024).toFixed(1)}MB > ${(maxSize / 1024 / 1024).toFixed(1)}MB`)\r\n return\r\n }\r\n try {\r\n const src = await upload(file)\r\n insertImage(view, src)\r\n } catch (e) {\r\n console.error('Image upload failed:', e)\r\n }\r\n }\r\n\r\n return {\r\n name: 'imageUpload',\r\n type: 'extension',\r\n addCommands() {\r\n return {\r\n insertImage: (...args: unknown[]) => {\r\n const src = args[0] as string\r\n return (state, dispatch) => {\r\n const imageType = state.schema.nodes['image']\r\n if (!imageType) return false\r\n const tr = state.tr.replaceSelectionWith(imageType.create({ src }))\r\n if (dispatch) dispatch(tr.scrollIntoView())\r\n return true\r\n }\r\n },\r\n }\r\n },\r\n addPlugins() {\r\n return [\r\n new Plugin({\r\n key: imageUploadKey,\r\n props: {\r\n handlePaste(view, event) {\r\n const files = event.clipboardData?.files\r\n if (!files || files.length === 0) return false\r\n const imageFile = Array.from(files).find((f) => f.type.startsWith('image/'))\r\n if (!imageFile) return false\r\n event.preventDefault()\r\n handleFile(imageFile, view)\r\n return true\r\n },\r\n handleDrop(view, event) {\r\n const files = event.dataTransfer?.files\r\n if (!files || files.length === 0) return false\r\n const imageFile = Array.from(files).find((f) => f.type.startsWith('image/'))\r\n if (!imageFile) return false\r\n event.preventDefault()\r\n handleFile(imageFile, view)\r\n return true\r\n },\r\n },\r\n }),\r\n ]\r\n },\r\n }\r\n}\r\n","import type { Extension } from '../core/extension'\nimport type { Command } from 'prosemirror-state'\n\nexport interface LineHeightPreset {\n label: string\n value: number\n}\n\nexport const DEFAULT_LINE_HEIGHTS: LineHeightPreset[] = [\n { label: '单倍行距', value: 1.0 },\n { label: '1.15 倍行距', value: 1.15 },\n { label: '1.5 倍行距', value: 1.5 },\n { label: '双倍行距', value: 2.0 },\n { label: '2.5 倍行距', value: 2.5 },\n { label: '3 倍行距', value: 3.0 },\n]\n\nexport interface LineHeightConfig {\n lineHeights?: LineHeightPreset[]\n}\n\nexport function LineHeightExtension(config?: LineHeightConfig): Extension {\n const lineHeights = config?.lineHeights ?? DEFAULT_LINE_HEIGHTS\n return {\n name: 'lineHeight',\n type: 'extension',\n options: { lineHeights },\n addCommands() {\n return {\n setLineHeight: (...args: unknown[]) => {\n const value = args[0] as number | null\n return setLineHeightCommand(value)\n },\n }\n },\n }\n}\n\nfunction setLineHeightCommand(value: number | null): Command {\n return (state, dispatch) => {\n const { from, to } = state.selection\n let applicable = false\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.name !== 'paragraph' && node.type.name !== 'heading') return\n applicable = true\n\n if (dispatch) {\n const tr = state.tr\n tr.setNodeMarkup(pos, null, { ...node.attrs, lineHeight: value })\n dispatch(tr)\n }\n })\n\n return applicable\n }\n}\n","import type { Extension } from '../core/extension'\nimport { Plugin, PluginKey } from 'prosemirror-state'\nimport type { EditorState, Transaction } from 'prosemirror-state'\nimport { Node as ProsemirrorNode } from 'prosemirror-model'\n\nexport interface DocumentVersion {\n id: string\n name: string\n timestamp: number\n docJSON: Record<string, unknown>\n}\n\nexport interface VersionHistoryConfig {\n maxVersions?: number\n autoSaveInterval?: number\n onVersionsChange?: (versions: DocumentVersion[]) => void\n storage?: VersionStorage\n}\n\nexport interface VersionStorage {\n save(versions: DocumentVersion[]): void | Promise<void>\n load(): DocumentVersion[] | null | Promise<DocumentVersion[] | null>\n}\n\nexport interface VersionHistoryState {\n versions: DocumentVersion[]\n}\n\nconst versionHistoryKey = new PluginKey('versionHistory')\n\nfunction generateId(): string {\n return `v_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n}\n\nfunction createInitialState(versions: DocumentVersion[]): VersionHistoryState {\n return { versions }\n}\n\nexport function getVersions(state: EditorState): DocumentVersion[] {\n const pluginState = versionHistoryKey.getState(state) as VersionHistoryState | undefined\n return pluginState?.versions ?? []\n}\n\nexport function saveVersion(name?: string): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean {\n return (state, dispatch) => {\n if (dispatch) {\n const tr = state.tr.setMeta(versionHistoryKey, {\n type: 'save',\n name: name ?? `版本 ${new Date().toLocaleString('zh-CN')}`,\n })\n dispatch(tr)\n }\n return true\n }\n}\n\nexport function restoreVersion(versionId: string): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean {\n return (state, dispatch) => {\n const pluginState = versionHistoryKey.getState(state) as VersionHistoryState | undefined\n if (!pluginState) return false\n\n const version = pluginState.versions.find((v) => v.id === versionId)\n if (!version) return false\n\n if (dispatch) {\n const doc = ProsemirrorNode.fromJSON(state.schema, version.docJSON)\n const tr = state.tr.replaceWith(0, state.doc.content.size, doc.content)\n tr.setMeta(versionHistoryKey, { type: 'restore' })\n dispatch(tr)\n }\n return true\n }\n}\n\nexport function deleteVersion(versionId: string): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean {\n return (state, dispatch) => {\n if (dispatch) {\n const tr = state.tr.setMeta(versionHistoryKey, { type: 'delete', versionId })\n dispatch(tr)\n }\n return true\n }\n}\n\nexport function renameVersion(versionId: string, newName: string): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean {\n return (state, dispatch) => {\n if (dispatch) {\n const tr = state.tr.setMeta(versionHistoryKey, { type: 'rename', versionId, name: newName })\n dispatch(tr)\n }\n return true\n }\n}\n\nexport function VersionHistoryExtension(config?: VersionHistoryConfig): Extension {\n const maxVersions = config?.maxVersions ?? 50\n const autoSaveInterval = config?.autoSaveInterval ?? 0\n const onVersionsChange = config?.onVersionsChange\n const storage = config?.storage\n\n let autoSaveTimer: ReturnType<typeof setInterval> | null = null\n let currentEditorState: EditorState | null = null\n let currentDispatch: ((tr: Transaction) => void) | null = null\n\n return {\n name: 'versionHistory',\n type: 'extension',\n\n addCommands() {\n return {\n saveVersion: (...args: unknown[]) => {\n const name = args[0] as string | undefined\n return saveVersion(name)\n },\n restoreVersion: (...args: unknown[]) => {\n const versionId = args[0] as string\n return restoreVersion(versionId)\n },\n deleteVersion: (...args: unknown[]) => {\n const versionId = args[0] as string\n return deleteVersion(versionId)\n },\n renameVersion: (...args: unknown[]) => {\n const versionId = args[0] as string\n const newName = args[1] as string\n return renameVersion(versionId, newName)\n },\n listVersions: () => {\n return (state, dispatch) => {\n const versions = getVersions(state)\n if (dispatch && onVersionsChange) {\n onVersionsChange(versions)\n }\n return true\n }\n },\n }\n },\n\n addPlugins() {\n return [\n new Plugin({\n key: versionHistoryKey,\n state: {\n init() {\n const loaded = storage?.load()\n if (loaded && !(typeof (loaded as Promise<DocumentVersion[] | null>).then === 'function')) {\n return createInitialState(loaded as DocumentVersion[])\n }\n return createInitialState([])\n },\n apply(tr, value: VersionHistoryState, _oldState, newState) {\n const meta = tr.getMeta(versionHistoryKey) as\n | { type: string; name?: string; versionId?: string }\n | undefined\n\n if (!meta) return value\n\n let newVersions: DocumentVersion[]\n\n switch (meta.type) {\n case 'save': {\n const version: DocumentVersion = {\n id: generateId(),\n name: meta.name ?? `版本 ${new Date().toLocaleString('zh-CN')}`,\n timestamp: Date.now(),\n docJSON: newState.doc.toJSON() as Record<string, unknown>,\n }\n newVersions = [version, ...value.versions]\n if (newVersions.length > maxVersions) {\n newVersions = newVersions.slice(0, maxVersions)\n }\n break\n }\n case 'delete': {\n newVersions = value.versions.filter((v) => v.id !== meta.versionId)\n break\n }\n case 'rename': {\n newVersions = value.versions.map((v) =>\n v.id === meta.versionId ? { ...v, name: meta.name ?? v.name } : v,\n )\n break\n }\n case 'restore': {\n return value\n }\n case 'init': {\n const versions = (meta as unknown as { versions: DocumentVersion[] }).versions\n return createInitialState(versions)\n }\n default:\n return value\n }\n\n if (onVersionsChange) {\n onVersionsChange(newVersions)\n }\n\n if (storage) {\n const result = storage.save(newVersions)\n if (result && typeof (result as Promise<void>).then === 'function') {\n ;(result as Promise<void>).catch((err) => {\n console.error('[VersionHistory] Failed to save versions to storage:', err)\n })\n }\n }\n\n return createInitialState(newVersions)\n },\n },\n view(editorView) {\n currentEditorState = editorView.state\n currentDispatch = editorView.dispatch.bind(editorView)\n\n if (storage) {\n const loadResult = storage.load()\n if (loadResult && typeof (loadResult as Promise<DocumentVersion[] | null>).then === 'function') {\n ;(loadResult as Promise<DocumentVersion[] | null>).then((loaded) => {\n if (loaded && currentDispatch && currentEditorState) {\n const tr = currentEditorState.tr.setMeta(versionHistoryKey, {\n type: 'init',\n versions: loaded,\n })\n currentDispatch(tr)\n }\n })\n } else if (loadResult) {\n const tr = editorView.state.tr.setMeta(versionHistoryKey, {\n type: 'init',\n versions: loadResult,\n })\n editorView.dispatch(tr)\n }\n }\n\n if (autoSaveInterval > 0) {\n autoSaveTimer = setInterval(() => {\n if (currentEditorState && currentDispatch) {\n const tr = currentEditorState.tr.setMeta(versionHistoryKey, {\n type: 'save',\n name: `自动保存 ${new Date().toLocaleString('zh-CN')}`,\n })\n currentDispatch(tr)\n }\n }, autoSaveInterval)\n }\n\n return {\n update(view) {\n currentEditorState = view.state\n currentDispatch = view.dispatch.bind(view)\n },\n destroy() {\n if (autoSaveTimer) {\n clearInterval(autoSaveTimer)\n autoSaveTimer = null\n }\n currentEditorState = null\n currentDispatch = null\n },\n }\n },\n }),\n ]\n },\n }\n}\n\nexport function createLocalStorage(key = 'mibao-editor-versions'): VersionStorage {\n return {\n save(versions) {\n try {\n localStorage.setItem(key, JSON.stringify(versions))\n } catch (err) {\n console.error('[VersionHistory] localStorage save failed:', err)\n }\n },\n load() {\n try {\n const data = localStorage.getItem(key)\n return data ? (JSON.parse(data) as DocumentVersion[]) : null\n } catch {\n return null\n }\n },\n }\n}\n","import type { Extension } from '../core/extension'\nimport type { NodeSpec } from 'prosemirror-model'\nimport { Plugin } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\n\nexport function TocNodeExtension(): Extension {\n return {\n name: 'tocNode',\n type: 'node',\n addNodes() {\n const spec: NodeSpec = {\n group: 'block',\n atom: true,\n attrs: {\n items: { default: '[]' },\n title: { default: '目录' },\n },\n toDOM(node) {\n const items = JSON.parse(node.attrs.items as string) as Array<{\n id: string\n text: string\n level: number\n }>\n const title = node.attrs.title as string\n\n const container = document.createElement('div')\n container.className = 'mi-toc'\n container.contentEditable = 'false'\n\n const header = document.createElement('div')\n header.className = 'mi-toc-header'\n const titleSpan = document.createElement('span')\n titleSpan.className = 'mi-toc-title'\n titleSpan.textContent = title\n header.appendChild(titleSpan)\n container.appendChild(header)\n\n if (items.length === 0) {\n const empty = document.createElement('div')\n empty.className = 'mi-toc-empty'\n empty.textContent = '暂无标题,添加标题后将自动生成目录'\n container.appendChild(empty)\n } else {\n const list = document.createElement('ul')\n list.className = 'mi-toc-list'\n\n const minLevel = Math.min(...items.map(i => i.level))\n\n items.forEach((item) => {\n const li = document.createElement('li')\n li.className = `mi-toc-item mi-toc-level-${item.level}`\n li.style.paddingLeft = `${(item.level - minLevel) * 16}px`\n const a = document.createElement('a')\n a.href = `#${item.id}`\n a.className = 'mi-toc-link'\n a.textContent = item.text\n li.appendChild(a)\n list.appendChild(li)\n })\n\n container.appendChild(list)\n }\n\n const deleteBtn = document.createElement('button')\n deleteBtn.className = 'mi-toc-delete'\n deleteBtn.textContent = '×'\n deleteBtn.title = '删除目录'\n container.appendChild(deleteBtn)\n\n return container\n },\n parseDOM: [{\n tag: 'div.mi-toc',\n getAttrs(dom) {\n const el = dom as HTMLElement\n const titleEl = el.querySelector('.mi-toc-title')\n return {\n items: el.getAttribute('data-items') || '[]',\n title: titleEl?.textContent || '目录',\n }\n },\n }],\n }\n return { toc: spec }\n },\n addCommands() {\n return {\n insertTocNode: (...args: unknown[]) => {\n const attrs = args[0] as { items?: string; title?: string } | undefined\n return (state, dispatch) => {\n const tocType = state.schema.nodes['toc']\n if (!tocType) return false\n const { from, to } = state.selection\n const node = tocType.create({\n items: attrs?.items || '[]',\n title: attrs?.title || '目录',\n })\n if (dispatch) {\n const tr = state.tr.replaceWith(from, to, node)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n },\n }\n },\n addPlugins() {\n return [\n new Plugin({\n props: {\n handleDOMEvents: {\n click(view: EditorView, event: MouseEvent) {\n const target = event.target as HTMLElement\n\n if (target.classList.contains('mi-toc-delete')) {\n event.preventDefault()\n event.stopPropagation()\n const toc = target.closest('.mi-toc') as HTMLElement | null\n if (!toc || !view.dom.contains(toc)) return false\n const pos = view.posAtDOM(toc, 0)\n const node = view.state.doc.nodeAt(pos)\n if (!node || node.type.name !== 'toc') return false\n const tr = view.state.tr.delete(pos, pos + node.nodeSize)\n view.dispatch(tr)\n return true\n }\n\n if (target.classList.contains('mi-toc-link')) {\n event.preventDefault()\n const href = target.getAttribute('href')\n if (!href || !href.startsWith('#')) return false\n const id = href.slice(1)\n const targetEl = document.getElementById(id)\n if (targetEl) {\n targetEl.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n return true\n }\n\n return false\n },\n },\n },\n }),\n ]\n },\n }\n}\n","import type { Extension } from '../core/extension'\nimport type { NodeSpec } from 'prosemirror-model'\nimport { Fragment } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\nimport type { Command } from 'prosemirror-state'\nimport { setBlockType } from 'prosemirror-commands'\nimport { inputRules, InputRule } from 'prosemirror-inputrules'\nimport type { EditorState } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport type { Node } from 'prosemirror-model'\nimport type { NodeView as PMNodeView } from 'prosemirror-view'\nimport type { Decoration } from 'prosemirror-view'\n\nexport interface CodeBlockConfig {\n defaultLanguage?: string\n languages?: string[]\n}\n\nconst codeBlockKey = new PluginKey('codeBlockEnhanced')\n\nconst DEFAULT_LANGUAGES = [\n 'javascript', 'typescript', 'python', 'java', 'cpp', 'c', 'go', 'rust',\n 'html', 'css', 'scss', 'json', 'yaml', 'markdown', 'bash', 'sql',\n 'php', 'ruby', 'swift', 'kotlin', 'xml', 'dockerfile', 'plaintext',\n]\n\nclass CodeBlockNodeView implements PMNodeView {\n dom: HTMLElement\n contentDOM: HTMLElement\n private node: Node\n private view: EditorView\n private getPos: () => number | undefined\n private languages: string[]\n\n constructor(\n node: Node,\n view: EditorView,\n getPos: () => number | undefined,\n _decorations: readonly Decoration[],\n languages: string[],\n ) {\n this.node = node\n this.view = view\n this.getPos = getPos\n this.languages = languages\n\n const language = node.attrs.language as string\n\n this.dom = document.createElement('div')\n this.dom.className = 'mi-code-block'\n this.dom.setAttribute('data-language', language)\n\n const header = document.createElement('div')\n header.className = 'mi-code-block-header'\n\n const langSelect = document.createElement('select')\n langSelect.className = 'mi-code-block-lang'\n languages.forEach(lang => {\n const option = document.createElement('option')\n option.value = lang\n option.textContent = lang\n if (lang === language) option.selected = true\n langSelect.appendChild(option)\n })\n\n langSelect.addEventListener('mousedown', (e) => {\n e.stopPropagation()\n })\n\n langSelect.addEventListener('change', () => {\n const pos = this.getPos()\n if (pos === undefined) return\n const currentNode = this.view.state.doc.nodeAt(pos)\n if (!currentNode || currentNode.type.name !== 'code_block') return\n const tr = this.view.state.tr.setNodeMarkup(pos, null, {\n ...currentNode.attrs,\n language: langSelect.value,\n })\n this.view.dispatch(tr)\n })\n\n const copyBtn = document.createElement('button')\n copyBtn.className = 'mi-code-block-copy'\n copyBtn.textContent = '复制'\n copyBtn.title = '复制代码'\n copyBtn.addEventListener('mousedown', (e) => {\n e.preventDefault()\n e.stopPropagation()\n })\n copyBtn.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n const pos = this.getPos()\n if (pos === undefined) return\n const currentNode = this.view.state.doc.nodeAt(pos)\n if (!currentNode) return\n const text = currentNode.textContent || ''\n navigator.clipboard.writeText(text).then(() => {\n copyBtn.textContent = '已复制 ✓'\n setTimeout(() => { copyBtn.textContent = '复制' }, 2000)\n }).catch(() => {\n try {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.style.cssText = 'position:fixed;left:-9999px;top:-9999px;opacity:0'\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n document.body.removeChild(textarea)\n } catch { /* clipboard API not available */ }\n copyBtn.textContent = '已复制 ✓'\n setTimeout(() => { copyBtn.textContent = '复制' }, 2000)\n })\n })\n\n header.appendChild(langSelect)\n header.appendChild(copyBtn)\n\n const deleteBtn = document.createElement('button')\n deleteBtn.className = 'mi-code-block-delete'\n deleteBtn.textContent = '×'\n deleteBtn.title = '删除代码块'\n deleteBtn.addEventListener('mousedown', (e) => {\n e.preventDefault()\n e.stopPropagation()\n })\n deleteBtn.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n const pos = this.getPos()\n if (pos === undefined) return\n const currentNode = this.view.state.doc.nodeAt(pos)\n if (!currentNode || currentNode.type.name !== 'code_block') return\n const tr = this.view.state.tr.delete(pos, pos + currentNode.nodeSize)\n this.view.dispatch(tr)\n })\n\n header.appendChild(deleteBtn)\n\n const pre = document.createElement('pre')\n pre.className = 'mi-code-block-pre'\n const codeEl = document.createElement('code')\n codeEl.className = `language-${language}`\n codeEl.spellcheck = false\n\n this.contentDOM = codeEl\n\n pre.appendChild(codeEl)\n this.dom.appendChild(header)\n this.dom.appendChild(pre)\n }\n\n update(node: Node): boolean {\n if (node.type !== this.node.type) return false\n this.node = node\n const language = node.attrs.language as string\n this.dom.setAttribute('data-language', language)\n const codeEl = this.contentDOM\n codeEl.className = `language-${language}`\n const select = this.dom.querySelector('.mi-code-block-lang') as HTMLSelectElement | null\n if (select && select.value !== language) {\n select.value = language\n }\n return true\n }\n\n stopEvent(): boolean {\n return false\n }\n\n ignoreMutation(): boolean {\n return false\n }\n}\n\nexport function CodeBlockEnhancedExtension(config?: CodeBlockConfig): Extension {\n const defaultLanguage = config?.defaultLanguage || 'plaintext'\n const languages = config?.languages || DEFAULT_LANGUAGES\n\n return {\n name: 'codeBlockEnhanced',\n type: 'node',\n addNodes() {\n const spec: NodeSpec = {\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n attrs: {\n language: { default: defaultLanguage },\n },\n toDOM(node) {\n return ['div', { class: 'mi-code-block', 'data-language': node.attrs.language as string },\n ['div', { class: 'mi-code-block-header' },\n ['select', { class: 'mi-code-block-lang' }],\n ['button', { class: 'mi-code-block-copy' }, '复制'],\n ['button', { class: 'mi-code-block-delete' }, '×'],\n ],\n ['pre', { class: 'mi-code-block-pre' },\n ['code', { class: `language-${node.attrs.language as string}`, spellcheck: 'false' }, 0],\n ],\n ]\n },\n parseDOM: [{\n tag: 'div.mi-code-block',\n getAttrs(dom) {\n const el = dom as HTMLElement\n const langSelect = el.querySelector('.mi-code-block-lang') as HTMLSelectElement | null\n return {\n language: langSelect?.value || el.getAttribute('data-language') || defaultLanguage,\n }\n },\n getContent: (dom, schema) => {\n const el = dom as HTMLElement\n const codeEl = el.querySelector('code')\n const text = codeEl?.textContent || ''\n return Fragment.from(schema.text(text))\n },\n preserveWhitespace: 'full' as const,\n }],\n }\n return { code_block: spec }\n },\n addCommands() {\n return {\n codeBlock: (...args: unknown[]) => {\n const language = (args[0] as string) || defaultLanguage\n return (state, dispatch) => {\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n const { $from } = state.selection\n const parent = $from.parent\n if (parent.type === nt) {\n const paraType = state.schema.nodes['paragraph']\n if (!paraType) return false\n return setBlockType(paraType)(state, dispatch)\n }\n return setBlockType(nt, { language })(state, dispatch)\n }\n },\n setCodeBlockLanguage: (...args: unknown[]) => {\n const language = args[0] as string\n return (state, dispatch) => {\n const { $from } = state.selection\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n\n let codeBlockPos = -1\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === nt) {\n codeBlockPos = $from.before(d)\n break\n }\n }\n\n if (codeBlockPos < 0) return false\n\n if (dispatch) {\n const node = state.doc.nodeAt(codeBlockPos)\n if (!node) return false\n const tr = state.tr.setNodeMarkup(codeBlockPos, null, {\n ...node.attrs,\n language,\n })\n dispatch(tr)\n }\n return true\n }\n },\n deleteCodeBlock: () => {\n return (state, dispatch) => {\n const { $from } = state.selection\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n\n let codeBlockPos = -1\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === nt) {\n codeBlockPos = $from.before(d)\n break\n }\n }\n\n if (codeBlockPos < 0) return false\n\n if (dispatch) {\n const node = state.doc.nodeAt(codeBlockPos)\n if (!node) return false\n const tr = state.tr.delete(codeBlockPos, codeBlockPos + node.nodeSize)\n dispatch(tr)\n }\n return true\n }\n },\n }\n },\n addKeyboardShortcuts() {\n const shortcuts: Record<string, Command> = {\n 'Mod-Shift-c': (state, dispatch) => {\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n const { $from } = state.selection\n if ($from.parent.type === nt) {\n const paraType = state.schema.nodes['paragraph']\n if (!paraType) return false\n return setBlockType(paraType)(state, dispatch)\n }\n return setBlockType(nt)(state, dispatch)\n },\n 'Enter': (state, dispatch) => {\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n const { $from } = state.selection\n if ($from.parent.type !== nt) return false\n if ($from.parent.content.size > 0) return false\n const paraType = state.schema.nodes['paragraph']\n if (!paraType) return false\n return setBlockType(paraType)(state, dispatch)\n },\n 'Backspace': (state, dispatch) => {\n const nt = state.schema.nodes['code_block']\n if (!nt) return false\n const { $from } = state.selection\n if ($from.parent.type !== nt) return false\n if ($from.parent.content.size > 0) return false\n const paraType = state.schema.nodes['paragraph']\n if (!paraType) return false\n return setBlockType(paraType)(state, dispatch)\n },\n }\n return shortcuts\n },\n addPlugins() {\n return [\n inputRules({\n rules: [\n new InputRule(/^```(\\w*)$/, (state: EditorState, match: RegExpMatchArray, start: number, end: number) => {\n const nt = state.schema.nodes['code_block']\n if (!nt) return null\n const language = match[1] || defaultLanguage\n const tr = state.tr\n tr.delete(start, end)\n const $start = tr.doc.resolve(start)\n const range = $start.blockRange()\n if (!range) return null\n tr.setBlockType(range.start, range.end, nt, { language })\n return tr\n }),\n ],\n }),\n new Plugin({\n key: codeBlockKey,\n props: {\n nodeViews: {\n code_block(node: Node, view: EditorView, getPos: () => number | undefined, decorations: readonly Decoration[]) {\n return new CodeBlockNodeView(node, view, getPos, decorations, languages)\n },\n },\n },\n }),\n ]\n },\n }\n}\n","import type { Extension } from '../core/extension'\nimport { Plugin, PluginKey } from 'prosemirror-state'\nimport type { EditorState } from 'prosemirror-state'\n\nexport interface DarkModeConfig {\n defaultDark?: boolean\n onChange?: (isDark: boolean) => void\n}\n\nconst darkModeKey = new PluginKey('darkMode')\n\nexport function DarkModeExtension(config?: DarkModeConfig): Extension {\n const defaultDark = config?.defaultDark ?? false\n\n return {\n name: 'darkMode',\n type: 'extension',\n addPlugins() {\n return [\n new Plugin({\n key: darkModeKey,\n state: {\n init() {\n return { isDark: defaultDark }\n },\n apply(tr, prev) {\n const meta = tr.getMeta(darkModeKey)\n if (meta?.type === 'toggle') {\n const isDark = !prev.isDark\n if (config?.onChange) {\n setTimeout(() => config.onChange!(isDark), 0)\n }\n return { isDark }\n }\n if (meta?.type === 'set') {\n const isDark = !!meta.isDark\n if (config?.onChange) {\n setTimeout(() => config.onChange!(isDark), 0)\n }\n return { isDark }\n }\n return prev\n },\n },\n props: {\n attributes(state) {\n const pluginState = darkModeKey.getState(state) as { isDark: boolean } | undefined\n if (pluginState?.isDark) {\n return { 'data-theme': 'dark', 'class': 'mi-dark-mode' } as Record<string, string>\n }\n return {} as Record<string, string>\n },\n },\n }),\n ]\n },\n addCommands() {\n return {\n toggleDarkMode: () => (state, dispatch) => {\n if (dispatch) {\n dispatch(state.tr.setMeta(darkModeKey, { type: 'toggle' }))\n }\n return true\n },\n setDarkMode: (...args: unknown[]) => {\n const isDark = args[0] as boolean\n return (state, dispatch) => {\n if (dispatch) {\n dispatch(state.tr.setMeta(darkModeKey, { type: 'set', isDark }))\n }\n return true\n }\n },\n }\n },\n }\n}\n\nexport function isDarkMode(state: EditorState): boolean {\n const pluginState = darkModeKey.getState(state) as { isDark: boolean } | undefined\n return pluginState?.isDark ?? false\n}\n","import type { Extension } from '../core/extension'\nimport type { NodeSpec } from 'prosemirror-model'\n\n/**\n * HTMLBlockExtension: supports parsing and preserving arbitrary HTML block elements\n * like div, section, etc. This is useful for pasting complex HTML content from\n * external sources (e.g., 135编辑器, wangEditor) while preserving the structure.\n */\nexport function HTMLBlockExtension(): Extension {\n return {\n name: 'html_block',\n type: 'node',\n addNodes() {\n const spec: NodeSpec = {\n group: 'block',\n content: 'block*',\n atom: false,\n defining: true,\n attrs: {\n tagName: { default: 'div' },\n className: { default: '' },\n style: { default: '' },\n dataAttributes: { default: {} },\n },\n toDOM(node) {\n const { tagName, className, style, dataAttributes } = node.attrs\n const attrs: Record<string, string> = {}\n if (className) attrs.class = className\n if (style) attrs.style = style\n // Add data attributes\n if (dataAttributes && typeof dataAttributes === 'object') {\n for (const [key, value] of Object.entries(dataAttributes)) {\n if (value !== null && value !== undefined) {\n attrs[key] = String(value)\n }\n }\n }\n return [tagName || 'div', attrs, 0]\n },\n parseDOM: [\n {\n tag: 'div:not(.mi-card):not(.mi-product-card):not(.mi-code-block):not(.mi-toc):not(.mi-task-list):not(.mi-task-item)',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'div')\n },\n },\n {\n tag: 'section',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'section')\n },\n },\n {\n tag: 'article',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'article')\n },\n },\n {\n tag: 'aside',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'aside')\n },\n },\n {\n tag: 'main',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'main')\n },\n },\n {\n tag: 'header',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'header')\n },\n },\n {\n tag: 'footer',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'footer')\n },\n },\n {\n tag: 'nav',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return extractAttributes(el, 'nav')\n },\n },\n ],\n }\n return { html_block: spec }\n },\n }\n}\n\n/**\n * Extract attributes from a DOM element for the html_block node\n */\nfunction extractAttributes(el: HTMLElement, tagName: string): Record<string, unknown> {\n const className = el.className || ''\n const style = el.getAttribute('style') || ''\n \n // Extract all data-* attributes\n const dataAttributes: Record<string, string> = {}\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-')) {\n dataAttributes[attr.name] = attr.value\n }\n }\n \n return {\n tagName,\n className,\n style,\n dataAttributes,\n }\n}\n"],"x_google_ignoreList":[3],"mappings":"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"}