remons-markdown-editor 1.0.0 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MarkdownEditor.d.ts +24 -5
- package/dist/components/Dialog/EditDialog.d.ts +3 -2
- package/dist/components/Editor/codemirrorExtensions.d.ts +4 -4
- package/dist/components/Editor/containerWidget.d.ts +13 -8
- package/dist/components/Editor/index.d.ts +2 -1
- package/dist/components/Icon/config.d.ts +9 -0
- package/dist/components/Preview/index.d.ts +6 -5
- package/dist/components/Toolbar/buttons.d.ts +3 -3
- package/dist/components/Toolbar/config.d.ts +9 -2
- package/dist/components/Toolbar/hooks/useToolbar.d.ts +3 -1
- package/dist/components/Toolbar/index.d.ts +6 -3
- package/dist/components/Toolbar/renderers/TablePicker/TableDropdown.d.ts +1 -2
- package/dist/hooks/useRegisterToolbar.d.ts +3 -0
- package/dist/hooks/useScrollSync.d.ts +5 -2
- package/dist/index.cjs +2010 -392
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +51 -80
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2031 -394
- package/dist/index.js.map +1 -1
- package/dist/registry/componentRegistry.d.ts +17 -4
- package/dist/types/index.d.ts +19 -10
- package/dist/utils/parseContainer.d.ts +20 -6
- package/dist/utils/writeContainer.d.ts +10 -7
- package/package.json +12 -15
- package/readme.md +26 -22
- package/dist/App.d.ts +0 -2
- package/dist/main.d.ts +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/utils/parseContainer.ts","../src/registry/componentRegistry.tsx","../src/components/Editor/containerWidget.ts","../src/components/Toolbar/buttons.tsx","../src/components/Editor/codemirrorExtensions.ts","../src/components/Editor/index.tsx","../src/components/Preview/index.tsx","../src/components/Panel/SplitPanels.tsx","../src/components/Icon/index.tsx","../src/components/Toolbar/config.ts","../src/components/Toolbar/hooks/useToolbar.ts","../src/components/Toolbar/renderers/ToolbarItemRenderer.tsx","../src/components/Toolbar/renderers/TablePicker/index.module.less","../src/components/Toolbar/renderers/TablePicker/index.tsx","../src/components/Toolbar/renderers/TablePicker/TableDropdown.tsx","../src/components/Toolbar/index.tsx","../src/components/Dialog/EditDialog.tsx","../src/utils/writeContainer.ts","../src/hooks/useFullscreen.ts","../src/hooks/useScrollSync.ts","../src/MarkdownEditor.tsx","../src/hooks/useRegisterToolbar.ts"],"sourcesContent":["/**\r\n * 解析容器属性 JSON 字符串。\r\n * 支持标准 JSON 和宽松格式: { key: 'value', key2: 'value2' }\r\n */\r\nexport function parseContainerProps(jsonStr: string): Record<string, string> {\r\n try {\r\n const props: Record<string, string> = {}\r\n const trimmed = jsonStr.trim()\r\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\r\n const inner = trimmed.slice(1, -1).trim()\r\n if (!inner) return props\r\n // 匹配 key: 'value' 或 key: \"value\" 格式\r\n const matches = inner.matchAll(/(?:[\"']?)(\\w+)(?:[\"']?)\\s*:\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\d+))/g)\r\n for (const m of matches) {\r\n props[m[1]] = m[2] ?? m[3] ?? m[4] ?? ''\r\n }\r\n }\r\n return props\r\n } catch {\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * 在编辑器文档中查找容器块。\r\n * 返回包含类型、属性和行位置的容器位置数组。\r\n */\r\nexport interface ContainerBlock {\r\n startPos: number // ::: 打开行位置\r\n typeName: string // 组件类型名称 (如 \"linkCard\")\r\n propsLineFrom: number // JSON 属性行起始位置\r\n propsLineTo: number // JSON 属性行结束位置\r\n props: Record<string, string>\r\n endPos: number // ::: 关闭行位置\r\n}\r\n\r\nexport function findContainers(\r\n docText: string\r\n): ContainerBlock[] {\r\n const containers: ContainerBlock[] = []\r\n const lines = docText.split('\\n')\r\n\r\n let i = 0\r\n while (i < lines.length) {\r\n const line = lines[i]\r\n const match = line.match(/^:::(\\w+)$/)\r\n if (match) {\r\n const typeName = match[1]\r\n // 计算字符位置\r\n let charPos = 0\r\n for (let l = 0; l < i; l++) {\r\n charPos += lines[l].length + 1 // +1 for newline\r\n }\r\n\r\n // 查找下一行的 JSON 属性\r\n let props: Record<string, string> = {}\r\n let propsLineFrom = 0\r\n let propsLineTo = 0\r\n let propsLineIndex = i + 1\r\n\r\n if (propsLineIndex < lines.length) {\r\n const propsLine = lines[propsLineIndex].trim()\r\n const propsMatch = propsLine.match(/^\\{[\\s\\S]*\\}$/)\r\n if (propsMatch) {\r\n props = parseContainerProps(propsLine)\r\n propsLineFrom = charPos + line.length + 1\r\n propsLineTo = propsLineFrom + lines[propsLineIndex].length\r\n }\r\n }\r\n\r\n // 查找闭合 :::\r\n let endPos = 0\r\n for (let j = i + 1; j < lines.length; j++) {\r\n if (lines[j].trim() === ':::') {\r\n let endCharPos = 0\r\n for (let l = 0; l < j; l++) {\r\n endCharPos += lines[l].length + 1\r\n }\r\n endPos = endCharPos\r\n i = j + 1\r\n break\r\n }\r\n }\r\n\r\n containers.push({\r\n startPos: charPos,\r\n typeName,\r\n propsLineFrom,\r\n propsLineTo,\r\n props,\r\n endPos,\r\n })\r\n }\r\n i++\r\n }\r\n\r\n return containers\r\n}","import type { ComponentSchema } from '../types'\r\n\r\n/**\r\n * 组件注册中心,用于管理自定义组件的 schema。\r\n * 每个容器组件(如 :::linkCard)在此注册其可编辑字段。\r\n */\r\nclass ComponentRegistry {\r\n private schemas = new Map<string, ComponentSchema>()\r\n\r\n /**\r\n * 注册组件 schema\r\n */\r\n register(name: string, schema: ComponentSchema): void {\r\n this.schemas.set(name, schema)\r\n }\r\n\r\n /**\r\n * 根据组件名获取已注册的 schema\r\n */\r\n get(name: string): ComponentSchema | undefined {\r\n return this.schemas.get(name)\r\n }\r\n\r\n /**\r\n * 检查组件类型是否已注册\r\n */\r\n has(name: string): boolean {\r\n return this.schemas.has(name)\r\n }\r\n\r\n /**\r\n * 获取所有已注册的组件名\r\n */\r\n getAllNames(): string[] {\r\n return Array.from(this.schemas.keys())\r\n }\r\n\r\n /**\r\n * 获取所有已注册的 schema\r\n */\r\n getAll(): ComponentSchema[] {\r\n return Array.from(this.schemas.values())\r\n }\r\n\r\n /**\r\n * 移除组件注册\r\n */\r\n unregister(name: string): void {\r\n this.schemas.delete(name)\r\n }\r\n}\r\n\r\n// 单例实例\r\nconst componentRegistry = new ComponentRegistry()\r\n\r\nexport default componentRegistry","import { ViewPlugin, Decoration, WidgetType } from '@codemirror/view'\r\nimport type { DecorationSet } from '@codemirror/view'\r\nimport { EditorState, Facet } from '@codemirror/state'\r\nimport { findContainers } from '../../utils/parseContainer'\r\nimport componentRegistry from '../../registry/componentRegistry'\r\n\r\n/**\r\n * 编辑容器属性的回调函数类型\r\n */\r\nexport interface OnEditContainer {\r\n (view: any, typeName: string, propsLineFrom: number, propsLineTo: number, currentProps: Record<string, string>): void\r\n}\r\n\r\n/**\r\n * 自定义 facet 用于传递编辑回调\r\n */\r\nexport const containerEditCallback = Facet.define<any, OnEditContainer>({\r\n combine: (values) => values[0],\r\n})\r\n\r\n/**\r\n * 只读的容器头行 Widget(显示 :::typeName + 编辑按钮)\r\n * 使用 Decoration.replace 替换原始文本,使其不可直接编辑\r\n */\r\nclass ContainerHeaderWidget extends WidgetType {\r\n public typeName: string\r\n\r\n constructor(typeName: string) {\r\n super()\r\n this.typeName = typeName\r\n }\r\n\r\n public toDOM(): HTMLElement {\r\n const container = document.createElement('span')\r\n container.className = 'container-widget-header'\r\n\r\n const text = document.createElement('span')\r\n text.className = 'container-widget-text'\r\n text.textContent = `:::${this.typeName}`\r\n\r\n const button = document.createElement('button')\r\n button.className = 'container-edit-btn'\r\n button.title = `编辑 ${componentRegistry.get(this.typeName)?.label ?? this.typeName}`\r\n button.textContent = '✎'\r\n ;(button as any).__typeName = this.typeName\r\n\r\n container.appendChild(text)\r\n container.appendChild(button)\r\n return container\r\n }\r\n\r\n public eq(other: ContainerHeaderWidget): boolean {\r\n return this.typeName === other.typeName\r\n }\r\n\r\n public ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 只读的容器属性行 Widget(显示 { key: value, ... })\r\n * 使用 Decoration.replace 替换原始文本,使其不可直接编辑\r\n */\r\nclass ContainerPropsWidget extends WidgetType {\r\n public propsText: string\r\n\r\n constructor(propsText: string) {\r\n super()\r\n this.propsText = propsText\r\n }\r\n\r\n public toDOM(): HTMLElement {\r\n const span = document.createElement('span')\r\n span.className = 'container-widget-props'\r\n span.textContent = this.propsText\r\n return span\r\n }\r\n\r\n public eq(other: ContainerPropsWidget): boolean {\r\n return this.propsText === other.propsText\r\n }\r\n\r\n public ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 只读的容器结束行 Widget(显示 :::)\r\n * 使用 Decoration.replace 替换原始文本,使其不可直接编辑\r\n */\r\nclass ContainerCloseWidget extends WidgetType {\r\n public toDOM(): HTMLElement {\r\n const span = document.createElement('span')\r\n span.className = 'container-widget-text'\r\n span.textContent = ':::'\r\n return span\r\n }\r\n\r\n public eq(): boolean {\r\n return true\r\n }\r\n\r\n public ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 查找文档中的容器,创建 Decoration 装饰物\r\n * 将 ::: 头行、{} 属性行和 ::: 结束行替换为只读 widget,使其无法在编辑器中直接编辑\r\n */\r\nfunction findContainerDecorations(state: EditorState): Array<{ from: number; to: number; value: Decoration }> {\r\n const docText = state.doc.toString()\r\n const containers = findContainers(docText)\r\n const decorations: Array<{ from: number; to: number; value: Decoration }> = []\r\n\r\n for (const container of containers) {\r\n const headerLine = state.doc.lineAt(container.startPos)\r\n\r\n // 替换 :::typeName 头行为只读 widget\r\n decorations.push({\r\n from: headerLine.from,\r\n to: headerLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerHeaderWidget(container.typeName),\r\n }),\r\n })\r\n\r\n // 替换 {} 属性行为只读 widget\r\n if (container.propsLineFrom > 0 && container.propsLineTo > 0) {\r\n const propsLine = state.doc.lineAt(container.propsLineFrom)\r\n const propsText = propsLine.text\r\n\r\n decorations.push({\r\n from: propsLine.from,\r\n to: propsLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerPropsWidget(propsText),\r\n }),\r\n })\r\n }\r\n\r\n // 替换 ::: 结束行为只读 widget\r\n if (container.endPos > 0) {\r\n const endLine = state.doc.lineAt(container.endPos)\r\n decorations.push({\r\n from: endLine.from,\r\n to: endLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerCloseWidget(),\r\n }),\r\n })\r\n }\r\n }\r\n\r\n return decorations\r\n}\r\n\r\n/**\r\n * 容器编辑 ViewPlugin\r\n * 将容器的 ::: 头行和 {} 属性行替换为只读 widget,使其无法在编辑器中直接编辑\r\n */\r\nexport const containerWidgetPlugin = ViewPlugin.fromClass(\r\n class {\r\n public decorations: DecorationSet\r\n\r\n constructor(view: any) {\r\n this.decorations = Decoration.set(findContainerDecorations(view.state), true)\r\n }\r\n\r\n public update(update: any) {\r\n if (update.docChanged || update.selectionSet) {\r\n this.decorations = Decoration.set(findContainerDecorations(update.state), true)\r\n }\r\n }\r\n },\r\n {\r\n decorations: (value) => value.decorations,\r\n eventHandlers: {\r\n // 阻止编辑按钮的 mousedown 事件,防止焦点移动\r\n mousedown: (event: MouseEvent, view: any) => {\r\n const target = event.target as HTMLElement\r\n if (target.classList.contains('container-edit-btn')) {\r\n event.preventDefault()\r\n return true\r\n }\r\n return false\r\n },\r\n // 点击编辑按钮时触发回调\r\n click: (event: MouseEvent, view: any) => {\r\n const target = event.target as HTMLElement\r\n if (target.classList.contains('container-edit-btn')) {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n const typeName = (target as any).__typeName\r\n if (typeName) {\r\n const docText = view.state.doc.toString()\r\n const containers = findContainers(docText)\r\n const buttonPos = view.posAtDOM(target)\r\n\r\n // 通过 button 位置匹配最近的容器头行,避免多个同类型容器匹配错误\r\n for (const container of containers) {\r\n const headerLine = view.state.doc.lineAt(container.startPos)\r\n // 按钮位置在头行的范围内(允许一定偏差,因为 widget 替换后位置可能略有偏移)\r\n if (buttonPos >= headerLine.from - 5 && buttonPos <= headerLine.to + 5) {\r\n const callback = view.state.facet(containerEditCallback)\r\n if (callback) {\r\n callback(view, container.typeName, container.propsLineFrom, container.propsLineTo, { ...container.props })\r\n }\r\n return true\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n return false\r\n },\r\n },\r\n }\r\n)","import { EditorView } from '@codemirror/view'\r\nimport type { EditorState } from '@codemirror/state'\r\nimport { syntaxTree } from '@codemirror/language'\r\nimport type { SyntaxNode } from '@lezer/common'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\n/**\r\n * 在光标位置插入文本\r\n */\r\nexport function insertAtCursor(view: EditorView, before: string, after: string = '', placeholder: string = ''): void {\r\n const { from, to } = view.state.selection.main\r\n const selectedText = view.state.doc.sliceString(from, to)\r\n const insert = selectedText\r\n ? `${before}${selectedText}${after}`\r\n : `${before}${placeholder}${after}`\r\n view.dispatch({ changes: { from, to, insert } })\r\n if (!selectedText && placeholder) {\r\n view.dispatch({ selection: { anchor: from + before.length } })\r\n }\r\n}\r\n\r\n/**\r\n * 在当前行行首插入文本\r\n */\r\nexport function insertAtLineStart(view: EditorView, text: string): void {\r\n const { from } = view.state.selection.main\r\n const line = view.state.doc.lineAt(from)\r\n view.dispatch({ changes: { from: line.from, to: line.from, insert: text } })\r\n view.dispatch({ selection: { anchor: line.from + text.length } })\r\n}\r\n\r\n/**\r\n * 切换标题:\r\n * - 当前行已是目标级别标题 → 移除行首 # 前缀(变回普通文本)\r\n * - 当前行是其他级别标题 → 替换为目标级别\r\n * - 当前行是普通文本 → 插入目标级别前缀\r\n * @param view - CodeMirror 编辑器实例\r\n * @param level - 标题级别(1-6)\r\n */\r\nexport function toggleHeading(view: EditorView, level: number): void {\r\n const line = view.state.doc.lineAt(view.state.selection.main.from)\r\n const m = line.text.match(/^(\\s*)(#{1,6})(\\s+|\\s*$)/)\r\n const indent = m ? m[1] : ''\r\n const text = '#'.repeat(level) + ' '\r\n if (m && m[2].length === level) {\r\n // 已是目标级别:移除 # 前缀,保留行首缩进\r\n view.dispatch({ changes: { from: line.from, to: line.from + m[0].length, insert: indent } })\r\n } else {\r\n view.dispatch({ changes: { from: line.from, to: m ? line.from + m[0].length : line.from, insert: indent + text } })\r\n view.dispatch({ selection: { anchor: line.from + indent.length + text.length } })\r\n }\r\n}\r\n\r\n/**\r\n * 切换任务列表(checkbox 待办)\r\n * - 支持多行:对选区内每一行应用 `- [ ] `\r\n * - 普通列表项(如 `- 内容`)直接转换为 `- [ ] 内容`\r\n * - 切换:若所有目标行都已是任务项,则移除行首前缀\r\n */\r\nexport function toggleTaskList(view: EditorView): void {\r\n const doc = view.state.doc\r\n const { from, to } = view.state.selection.main\r\n const first = doc.lineAt(from)\r\n const last = doc.lineAt(to)\r\n\r\n const lines: Array<ReturnType<typeof doc.line>> = []\r\n for (let n = first.number; n <= last.number; n++) {\r\n lines.push(doc.line(n))\r\n }\r\n\r\n const taskRe = /^(\\s*)([-*+])\\s\\[( |x)\\]\\s?/\r\n const allTask = lines.every((line) => taskRe.test(line.text))\r\n\r\n const changes: Array<{ from: number; to: number; insert: string }> = []\r\n for (const line of lines) {\r\n const taskMatch = line.text.match(taskRe)\r\n if (taskMatch) {\r\n changes.push({\r\n from: line.from,\r\n to: line.from + taskMatch[0].length,\r\n insert: allTask ? '' : `${taskMatch[1]}${taskMatch[2]} [ ] `,\r\n })\r\n } else {\r\n const bulletMatch = line.text.match(/^(\\s*)([-*+])\\s/)\r\n if (bulletMatch) {\r\n // 普通列表项:把 bullet 后第一个空格替换为 \" [ ] \"\r\n const idx = line.from + bulletMatch[1].length + bulletMatch[2].length\r\n changes.push({ from: idx, to: idx + 1, insert: ' [ ] ' })\r\n } else {\r\n changes.push({ from: line.from, to: line.from, insert: '- [ ] ' })\r\n }\r\n }\r\n }\r\n view.dispatch({ changes })\r\n}\r\n\r\n/**\r\n * 切换行首前缀(支持多行选区)\r\n * - 已是对应前缀的行 → 移除前缀(变回普通文本)\r\n * - 未加前缀的行 → 在行首插入前缀\r\n * @param view - CodeMirror 编辑器实例\r\n * @param pattern - 匹配行首前缀的正则\r\n * @param insertText - 未匹配时插入的前缀文本\r\n */\r\nexport function toggleLinePrefix(view: EditorView, pattern: RegExp, insertText: string): void {\r\n const doc = view.state.doc\r\n const { from, to } = view.state.selection.main\r\n const first = doc.lineAt(from)\r\n const last = doc.lineAt(Math.max(to, from))\r\n\r\n const changes: Array<{ from: number; to: number; insert: string }> = []\r\n for (let n = first.number; n <= last.number; n++) {\r\n const line = doc.line(n)\r\n const m = line.text.match(pattern)\r\n if (m) {\r\n // 已有前缀:移除\r\n changes.push({ from: line.from, to: line.from + m[0].length, insert: '' })\r\n } else {\r\n // 无前缀:行首插入\r\n changes.push({ from: line.from, to: line.from, insert: insertText })\r\n }\r\n }\r\n view.dispatch({ changes })\r\n}\r\n\r\n/** Markdown 列表行:缩进 + 列表标记(无序/有序)+ 空白 */\r\nconst LIST_LINE_RE = /^(\\s*)([-*+]|\\d+\\.)([ \\t]+)/\r\n/** 列表缩进台阶:4 个空格,确保缩进后能被解析为子列表 */\r\nconst LIST_INDENT_WIDTH = 4\r\n\r\ninterface ListLineInfo {\r\n /** 当前缩进宽度 */\r\n indent: number\r\n /** 缩进调整后的宽度 */\r\n nextIndent: number\r\n /** 当前有序列表序号(无序列表为 null) */\r\n order: number | null\r\n /** 缩进调整后的序号 */\r\n nextOrder: number | null\r\n}\r\n\r\n/** 判断位置是否位于代码块内(代码块内不参与列表缩进逻辑) */\r\nfunction isInCodeBlock(state: EditorState, pos: number): boolean {\r\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(pos, 1)\r\n while (node) {\r\n if (node.name === 'FencedCode' || node.name === 'CodeBlock') return true\r\n node = node.parent\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 向上查找同缩进的前一个列表项,返回其序号\r\n * - 跳过更深的子列表行和空行\r\n * - 遇到非列表内容或更浅层列表时结束\r\n */\r\nfunction findPrevSiblingOrder(\r\n state: EditorState,\r\n plans: Map<number, ListLineInfo>,\r\n lineNo: number,\r\n indent: number\r\n): number | null {\r\n const doc = state.doc\r\n for (let n = lineNo - 1; n >= 1; n--) {\r\n const plan = plans.get(n)\r\n if (plan) {\r\n if (plan.nextIndent === indent) return plan.nextOrder\r\n if (plan.nextIndent < indent) return null\r\n continue\r\n }\r\n\r\n const text = doc.line(n).text\r\n if (!text.trim()) continue\r\n const m = text.match(LIST_LINE_RE)\r\n if (!m) return null\r\n const lineIndent = m[1].length\r\n if (lineIndent === indent) {\r\n return /^\\d+\\.$/.test(m[2]) ? parseInt(m[2], 10) : null\r\n }\r\n if (lineIndent < indent) return null\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 计算列表行缩进/反缩进的变更\r\n * - 仅当所有选区行都是列表行时生效,否则返回 null 交给默认缩进行为\r\n * - 有序列表缩进后重新编号,保证新一级子列表从 1 开始\r\n */\r\nfunction planListIndent(\r\n view: EditorView,\r\n direction: 1 | -1\r\n): Array<{ from: number; to: number; insert: string }> | null {\r\n const { state } = view\r\n const doc = state.doc\r\n const plans = new Map<number, ListLineInfo>()\r\n\r\n for (const range of state.selection.ranges) {\r\n const first = doc.lineAt(range.from).number\r\n const last = doc.lineAt(range.to).number\r\n for (let n = first; n <= last; n++) {\r\n if (plans.has(n)) continue\r\n const line = doc.line(n)\r\n if (isInCodeBlock(state, line.from)) return null\r\n const m = line.text.match(LIST_LINE_RE)\r\n if (!m) return null\r\n const indent = m[1].length\r\n plans.set(n, {\r\n indent,\r\n nextIndent: direction === 1 ? indent + LIST_INDENT_WIDTH : Math.max(0, indent - LIST_INDENT_WIDTH),\r\n order: /^\\d+\\.$/.test(m[2]) ? parseInt(m[2], 10) : null,\r\n nextOrder: null,\r\n })\r\n }\r\n }\r\n\r\n if (plans.size === 0) return null\r\n\r\n // 按行号升序计算缩进后的序号\r\n const ordered = [...plans.entries()].sort((a, b) => a[0] - b[0])\r\n for (const [lineNo, info] of ordered) {\r\n if (info.order === null) continue\r\n const prevOrder = findPrevSiblingOrder(state, plans, lineNo, info.nextIndent)\r\n info.nextOrder = prevOrder === null ? 1 : prevOrder + 1\r\n }\r\n\r\n // 每行只替换行首前缀,避免多个变更位置重叠\r\n return ordered.map(([lineNo, info]) => {\r\n const line = doc.line(lineNo)\r\n const m = line.text.match(LIST_LINE_RE)!\r\n const indentChanged = direction === 1 || info.indent > 0\r\n const useNextOrder =\r\n indentChanged && info.order !== null && info.nextOrder !== null && info.order !== info.nextOrder\r\n return {\r\n from: line.from,\r\n to: line.from + m[0].length,\r\n insert: ' '.repeat(info.nextIndent) + (useNextOrder ? `${info.nextOrder}.` : m[2]) + m[3],\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Tab:列表行缩进一级(4 空格)\r\n * - 普通行返回 false,继续走默认缩进\r\n * - 有序列表缩进后重排序号,子列表从 1 开始\r\n */\r\nexport function indentMarkdownList(view: EditorView): boolean {\r\n const changes = planListIndent(view, 1)\r\n if (!changes) return false\r\n view.dispatch({ changes, userEvent: 'input.indent' })\r\n return true\r\n}\r\n\r\n/**\r\n * Shift-Tab:列表行反缩进一级\r\n * - 普通行返回 false,继续走默认缩进\r\n * - 有序列表反缩进后并入上一层并重排序号\r\n */\r\nexport function dedentMarkdownList(view: EditorView): boolean {\r\n const changes = planListIndent(view, -1)\r\n if (!changes) return false\r\n view.dispatch({ changes, userEvent: 'delete.dedent' })\r\n return true\r\n}\r\n\r\n/**\r\n * 上传图片\r\n * @param file - 要上传的文件\r\n * @param uploadConfig - 上传配置\r\n */\r\nexport async function uploadFileToServer(\r\n file: File,\r\n uploadConfig: ImageUploadConfig\r\n): Promise<string | null> {\r\n // 优先使用自定义上传函数\r\n if (uploadConfig.onUploadImage) {\r\n return uploadConfig.onUploadImage(file)\r\n }\r\n\r\n // 使用 uploadUrl 上传\r\n if (uploadConfig.uploadUrl) {\r\n const formData = new FormData()\r\n formData.append('file', file)\r\n\r\n const response = await fetch(uploadConfig.uploadUrl, {\r\n method: 'POST',\r\n body: formData,\r\n })\r\n\r\n if (!response.ok) return null\r\n\r\n const result = await response.json()\r\n \r\n // 如果外部提供了 URL 提取回调,使用它\r\n if (uploadConfig.onGetUploadUrl) {\r\n return uploadConfig.onGetUploadUrl(result)\r\n }\r\n \r\n // 默认行为\r\n return result.data?.path || null\r\n }\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * 判断是否配置了图片上传\r\n */\r\nexport function isUploadConfigured(\r\n uploadConfig?: ImageUploadConfig\r\n): boolean {\r\n return !!(uploadConfig?.uploadUrl || uploadConfig?.onUploadImage)\r\n}\r\n\r\n/**\r\n * 图片上传:创建隐藏的 file input 触发选择,上传后插入 markdown 图片语法\r\n * @param view - CodeMirror 编辑器实例\r\n * @param uploadConfig - 上传配置(包含 uploadUrl 或 onUploadImage)\r\n */\r\nexport function uploadImage(\r\n view: EditorView,\r\n uploadConfig: ImageUploadConfig\r\n): void {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = 'image/*'\r\n input.style.display = 'none'\r\n\r\n input.addEventListener('change', async () => {\r\n if (!input.files || input.files.length === 0) return\r\n\r\n const file = input.files[0]\r\n const { from, to } = view.state.selection.main\r\n const selectedText = view.state.doc.sliceString(from, to) || '描述'\r\n\r\n const url = await uploadFileToServer(file, uploadConfig)\r\n if (url) {\r\n const insert = ``\r\n view.dispatch({ changes: { from, to, insert } })\r\n }\r\n\r\n input.remove()\r\n })\r\n\r\n document.body.appendChild(input)\r\n input.click()\r\n}\r\n\r\n/**\r\n * 用前缀和后缀包裹选中文本\r\n */\r\nexport function wrapSelection(view: EditorView, prefix: string, suffix: string): void {\r\n const { from, to, empty } = view.state.selection.main\r\n if (empty) return\r\n const selected = view.state.doc.sliceString(from, to)\r\n view.dispatch({ changes: { from, to, insert: `${prefix}${selected}${suffix}` } })\r\n}\r\n\r\n/**\r\n * 切换包裹:选中的文本已包含标签则移除,否则添加\r\n */\r\nexport function toggleWrap(\r\n view: EditorView,\r\n openTag: string,\r\n closeTag: string\r\n): void {\r\n const { from, to, empty } = view.state.selection.main\r\n const doc = view.state.doc\r\n\r\n // 选区完整包含标签 → 移除\r\n if (!empty) {\r\n const selected = doc.sliceString(from, to)\r\n if (selected.startsWith(openTag) && selected.endsWith(closeTag)) {\r\n const inner = selected.slice(openTag.length, -closeTag.length)\r\n view.dispatch({ changes: { from, to, insert: inner } })\r\n return\r\n }\r\n }\r\n\r\n // 光标/选区在标签内部 → 查找当前行的标签并移除\r\n {\r\n const cursorPos = empty ? from : to\r\n const line = doc.lineAt(cursorPos)\r\n const lineText = doc.sliceString(line.from, line.to)\r\n const openIdx = lineText.indexOf(openTag)\r\n const closeIdx = lineText.lastIndexOf(closeTag)\r\n\r\n if (openIdx >= 0 && closeIdx > openIdx) {\r\n const absOpen = line.from + openIdx\r\n const absClose = line.from + closeIdx\r\n // 确认光标/选区在标签范围内\r\n if (cursorPos >= absOpen + openTag.length && cursorPos <= absClose) {\r\n const inner = doc.sliceString(absOpen + openTag.length, absClose)\r\n view.dispatch({\r\n changes: {\r\n from: absOpen,\r\n to: absClose + closeTag.length,\r\n insert: inner,\r\n },\r\n })\r\n return\r\n }\r\n }\r\n }\r\n\r\n // 默认:添加包裹\r\n wrapSelection(view, openTag, closeTag)\r\n}","import { EditorView, keymap } from '@codemirror/view'\r\nimport { defaultKeymap, indentWithTab } from '@codemirror/commands'\r\nimport { markdown } from '@codemirror/lang-markdown'\r\nimport { oneDark } from '@codemirror/theme-one-dark'\r\nimport { Facet } from '@codemirror/state'\r\nimport { containerWidgetPlugin, containerEditCallback } from './containerWidget'\r\nimport type { OnEditContainer } from './containerWidget'\r\nimport { uploadFileToServer, isUploadConfigured, indentMarkdownList, dedentMarkdownList } from '../Toolbar/buttons'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\n/** 图片上传配置 facet */\r\nconst uploadConfigFacet = Facet.define<ImageUploadConfig | undefined, ImageUploadConfig | undefined>({\r\n combine: (values) => values[values.length - 1],\r\n})\r\n\r\n/** 未配置上传时的提示回调 facet */\r\nconst messageFacet = Facet.define<(() => void) | undefined, (() => void) | undefined>({\r\n combine: (values) => values[values.length - 1],\r\n})\r\n\r\n/** 粘贴事件处理:拦截图片并上传 */\r\nconst pasteHandler = EditorView.domEventHandlers({\r\n paste: (event: ClipboardEvent, view: EditorView) => {\r\n const files = event.clipboardData?.files\r\n if (!files) return false\r\n\r\n const imageFiles = Array.from(files).filter((f) => f.type.startsWith('image/'))\r\n if (imageFiles.length === 0) return false\r\n\r\n event.preventDefault()\r\n\r\n const uploadConfig = view.state.facet(uploadConfigFacet)\r\n const showMessage = view.state.facet(messageFacet)\r\n\r\n if (!isUploadConfigured(uploadConfig)) {\r\n showMessage?.()\r\n return true\r\n }\r\n\r\n // 上传所有粘贴的图片\r\n const { from, to } = view.state.selection.main\r\n let offset = 0\r\n\r\n for (const file of imageFiles) {\r\n uploadFileToServer(file, uploadConfig!).then((url) => {\r\n if (url) {\r\n const name = file.name.replace(/\\.[^.]+$/, '')\r\n const insert = ``\r\n view.dispatch({ changes: { from: from + offset, to: to + offset, insert } })\r\n offset += insert.length\r\n }\r\n })\r\n }\r\n\r\n return true\r\n },\r\n})\r\n\r\ninterface GetCodeMirrorExtensionsOptions {\r\n /** 编辑容器属性的回调函数 */\r\n onEditContainer?: OnEditContainer\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /** 未配置上传时的提示回调 */\r\n onMessageNoUploadConfig?: () => void\r\n}\r\n\r\nexport const getCodeMirrorExtensions = (opts?: GetCodeMirrorExtensionsOptions) => {\r\n const extensions = [\r\n markdown(),\r\n oneDark,\r\n // Tab/Shift-Tab 优先接管列表行:缩进 4 空格并重排子列表序号\r\n keymap.of([\r\n { key: 'Tab', run: indentMarkdownList },\r\n { key: 'Shift-Tab', run: dedentMarkdownList },\r\n ...defaultKeymap,\r\n indentWithTab,\r\n ]),\r\n EditorView.lineWrapping,\r\n pasteHandler,\r\n EditorView.baseTheme({\r\n '.cm-scroller': {\r\n height: '100%',\r\n overflow: 'auto',\r\n },\r\n // 容器头行 Widget 样式\r\n '.container-widget-header': {\r\n display: 'inline',\r\n fontSize: 'inherit',\r\n fontFamily: 'inherit',\r\n },\r\n '.container-widget-text': {\r\n fontWeight: 'bold',\r\n color: '#79c0ff',\r\n },\r\n // 容器属性行 Widget 样式\r\n '.container-widget-props': {\r\n display: 'inline',\r\n fontSize: 'inherit',\r\n fontFamily: 'inherit',\r\n color: '#a5d6ff',\r\n },\r\n // 容器编辑按钮样式\r\n '.container-edit-btn': {\r\n display: 'inline-block',\r\n padding: '0 4px',\r\n fontSize: '12px',\r\n color: '#58a6ff',\r\n background: 'transparent',\r\n border: 'none',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n marginRight: '4px',\r\n verticalAlign: 'middle',\r\n },\r\n '.container-edit-btn:hover': {\r\n background: 'rgba(88, 166, 255, 0.16)',\r\n },\r\n }),\r\n ]\r\n\r\n // 添加容器 widget 插件\r\n extensions.push(containerWidgetPlugin)\r\n\r\n // 如果有编辑回调,注册 facet\r\n if (opts?.onEditContainer) {\r\n extensions.push(containerEditCallback.of(opts.onEditContainer))\r\n }\r\n\r\n // 如果有图片上传配置,注册 facet\r\n if (opts?.uploadConfig) {\r\n extensions.push(uploadConfigFacet.of(opts.uploadConfig))\r\n }\r\n\r\n // 如果有消息回调,注册 facet\r\n if (opts?.onMessageNoUploadConfig) {\r\n extensions.push(messageFacet.of(opts.onMessageNoUploadConfig))\r\n }\r\n\r\n return extensions\r\n}\r\n\r\nexport default getCodeMirrorExtensions","import { useEffect, useRef } from 'react'\r\nimport { EditorView, basicSetup } from 'codemirror'\r\nimport { EditorState } from '@codemirror/state'\r\nimport { getCodeMirrorExtensions } from './codemirrorExtensions'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\ninterface EditorProps {\r\n value: string\r\n onChange: (value: string) => void\r\n onScrollReady?: (scrollDOM: HTMLElement) => void\r\n onViewReady?: (view: EditorView) => void\r\n /** 编辑容器属性的回调 */\r\n onEditContainer?: (view: any, typeName: string, propsLineFrom: number, propsLineTo: number, currentProps: Record<string, string>) => void\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /** 未配置上传时的提示回调 */\r\n onMessageNoUploadConfig?: () => void\r\n}\r\n\r\nexport default function Editor({ value, onChange, onScrollReady, onViewReady, onEditContainer, uploadConfig, onMessageNoUploadConfig }: EditorProps) {\r\n const editorRef = useRef<HTMLDivElement>(null)\r\n const viewRef = useRef<EditorView | null>(null)\r\n\r\n useEffect(() => {\r\n if (!editorRef.current) return\r\n\r\n const extensions = [\r\n basicSetup,\r\n ...getCodeMirrorExtensions({ onEditContainer, uploadConfig, onMessageNoUploadConfig }),\r\n EditorView.updateListener.of((update) => {\r\n if (update.docChanged) {\r\n onChange(update.state.doc.toString())\r\n }\r\n }),\r\n ]\r\n\r\n const state = EditorState.create({\r\n doc: value,\r\n extensions,\r\n })\r\n\r\n viewRef.current = new EditorView({\r\n state,\r\n parent: editorRef.current,\r\n })\r\n\r\n if (onScrollReady && viewRef.current) {\r\n onScrollReady(viewRef.current.scrollDOM)\r\n }\r\n\r\n if (onViewReady) {\r\n onViewReady(viewRef.current)\r\n }\r\n\r\n return () => {\r\n viewRef.current?.destroy()\r\n }\r\n }, [])\r\n\r\n // 外部 value 变化时更新编辑器内容\r\n useEffect(() => {\r\n if (viewRef.current && viewRef.current.state.doc.toString() !== value) {\r\n viewRef.current.dispatch({\r\n changes: { from: 0, to: viewRef.current.state.doc.length, insert: value },\r\n })\r\n }\r\n }, [value])\r\n\r\n return <div ref={editorRef} className=\"editor\" />\r\n}","import { forwardRef, useEffect } from 'react'\r\nimport RenderMarkdown, { languagesCommon, initHighlighter } from 'remons-render-markdown';\r\nimport type { RenderMarkdownProps } from 'remons-render-markdown';\r\nimport 'remons-render-markdown/dist/index.css';\r\n\r\nexport type PreviewOptions = Omit<RenderMarkdownProps, 'content'> & {\r\n languages?: Record<string, any> | null | undefined\r\n}\r\n\r\nexport interface PreviewProps {\r\n content: string\r\n previewOptions?: PreviewOptions\r\n}\r\n\r\n\r\nconst Preview = forwardRef<HTMLDivElement, PreviewProps>(({ content, previewOptions }, ref) => {\r\n useEffect(() => {\r\n initHighlighter({\r\n ...languagesCommon,\r\n ...(previewOptions?.languages ? previewOptions?.languages : {})\r\n })\r\n }, [previewOptions?.languages])\r\n\r\n return (\r\n <div ref={ref} className=\"preview\">\r\n <RenderMarkdown content={content} {...previewOptions} />\r\n </div>\r\n )\r\n})\r\n\r\nPreview.displayName = 'Preview'\r\n\r\nexport default Preview","import React from 'react'\r\nimport { Splitter } from 'antd'\r\n\r\nconst { Panel } = Splitter\r\n\r\ninterface SplitPanelsProps {\r\n leftPanel: React.ReactNode\r\n rightPanel: React.ReactNode\r\n}\r\n\r\nexport default function SplitPanels({ leftPanel, rightPanel }: SplitPanelsProps) {\r\n return (\r\n <Splitter className=\"split-panels\">\r\n <Panel defaultSize=\"50%\" min=\"20%\" max=\"80%\">\r\n {leftPanel}\r\n </Panel>\r\n <Panel>{rightPanel}</Panel>\r\n </Splitter>\r\n )\r\n}","import { createFromIconfontCN } from '@ant-design/icons';\r\n\r\nconst Icon = createFromIconfontCN({\r\n scriptUrl: 'https://at.alicdn.com/t/c/font_5241307_xoojyr52dqn.js',\r\n});\r\n\r\nfunction IconComponent(type: string, className?: string) {\r\n return (\r\n <Icon type={`icon-${type}`} className={className} />\r\n )\r\n}\r\n\r\nexport default IconComponent;","import { message } from 'antd';\r\nimport type { ToolbarButtonConfig, ImageUploadConfig } from '../../types'\r\nimport {\r\n BoldOutlined,\r\n ItalicOutlined,\r\n StrikethroughOutlined,\r\n UnderlineOutlined,\r\n UnorderedListOutlined,\r\n OrderedListOutlined,\r\n LinkOutlined,\r\n PictureOutlined,\r\n CodeOutlined,\r\n MinusOutlined,\r\n FontSizeOutlined,\r\n CheckSquareOutlined\r\n} from '@ant-design/icons';\r\nimport IconComponent from '../Icon'\r\nimport { insertAtCursor, insertAtLineStart, wrapSelection, uploadImage, isUploadConfigured, toggleTaskList, toggleHeading, toggleWrap, toggleLinePrefix } from './buttons'\r\n\r\nfunction Quote() {\r\n return IconComponent('quote')\r\n}\r\n\r\nfunction InlineCode() {\r\n return IconComponent('inlinecode')\r\n}\r\n\r\n/** 未配置图片上传时的提示文案 */\r\nconst UPLOAD_CONFIG_MISSING_MESSAGE = '请先配置图片上传功能'\r\n\r\n/**\r\n * 创建工具栏配置\r\n * @param options - 配置选项\r\n */\r\nexport function createToolbarConfig(options?: ImageUploadConfig): ToolbarButtonConfig[] {\r\n // 判断是否配置了图片上传\r\n const hasUploadConfig = isUploadConfigured(options)\r\n return [\r\n {\r\n id: 'heading',\r\n icon: FontSizeOutlined,\r\n label: '标题',\r\n children: [\r\n { id: 'heading1', label: 'H1', handler: (v) => toggleHeading(v, 1) },\r\n { id: 'heading2', label: 'H2', handler: (v) => toggleHeading(v, 2) },\r\n { id: 'heading3', label: 'H3', handler: (v) => toggleHeading(v, 3) },\r\n { id: 'heading4', label: 'H4', handler: (v) => toggleHeading(v, 4) },\r\n { id: 'heading5', label: 'H5', handler: (v) => toggleHeading(v, 5) },\r\n { id: 'heading6', label: 'H6', handler: (v) => toggleHeading(v, 6) },\r\n ],\r\n },\r\n { separatorBefore: true },\r\n { id: 'bold', label: '加粗', icon: BoldOutlined, handler: (v) => toggleWrap(v, '**', '**') },\r\n { id: 'italic', label: '斜体', icon: ItalicOutlined, handler: (v) => toggleWrap(v, '*', '*') },\r\n { id: 'strikethrough', label: '删除线', icon: StrikethroughOutlined, handler: (v) => toggleWrap(v, '~~', '~~') },\r\n { id: 'underline', label: '下划线', icon: UnderlineOutlined, handler: (v) => toggleWrap(v, '<u>', '</u>') },\r\n { separatorBefore: true },\r\n // 列表按钮:切换式,行已是列表项则点击移除前缀(无序列表不匹配待办行 `- [ ]`)\r\n { id: 'ul', label: '无序列表', icon: UnorderedListOutlined, handler: (v) => toggleLinePrefix(v, /^(\\s*)-(?!\\s*\\[)\\s/, '- ') },\r\n { id: 'ol', label: '有序列表', icon: OrderedListOutlined, handler: (v) => toggleLinePrefix(v, /^(\\s*)\\d+\\.\\s/, '1. ') },\r\n { id: 'checkbox', label: '待办', icon: CheckSquareOutlined, handler: (v) => toggleTaskList(v) },\r\n { separatorBefore: true },\r\n { id: 'link', label: '链接', icon: LinkOutlined, handler: (v) => insertAtCursor(v, '[', '](url)', '文本') },\r\n // 图片按钮:未配置上传时点击提示(不置灰)\r\n {\r\n id: 'image',\r\n label: '图片',\r\n icon: PictureOutlined,\r\n handler: hasUploadConfig && options\r\n ? (v) => uploadImage(v, options)\r\n : () => message.warning(UPLOAD_CONFIG_MISSING_MESSAGE),\r\n },\r\n { separatorBefore: true },\r\n { id: 'code', label: '行内代码', icon: InlineCode, handler: (v) => wrapSelection(v, '`', '`') },\r\n {\r\n id: 'codeblock',\r\n label: '代码块',\r\n icon: CodeOutlined,\r\n handler: (v) => {\r\n const { from, to } = v.state.selection.main\r\n const selected = v.state.doc.sliceString(from, to)\r\n const insert = selected ? '```\\n' + selected + '\\n```' : '```\\n\\n```'\r\n v.dispatch({ changes: { from, to, insert } })\r\n },\r\n },\r\n { id: 'quote', label: '引用', icon: Quote, handler: (v) => insertAtLineStart(v, '> ') },\r\n {\r\n id: 'hr',\r\n label: '分割线',\r\n icon: MinusOutlined,\r\n handler: (v) => {\r\n const { from } = v.state.selection.main\r\n v.dispatch({ changes: { from, insert: '\\n---\\n' } })\r\n },\r\n },\r\n ]\r\n}","import { useCallback, useMemo } from 'react'\r\nimport type { EditorView } from '@codemirror/view'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig } from '../../../types'\r\nimport { createToolbarConfig } from '../config'\r\nimport { toggleWrap } from '../buttons'\r\n\r\nexport interface UseToolbarOptions {\r\n /** 第三方扩展的按钮配置,将追加到工具栏末尾 */\r\n extraItems?: ToolbarButtonConfig[]\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n}\r\n\r\nexport interface UseToolbarReturn {\r\n config: ToolbarButtonConfig[]\r\n extraItemsConfig: ToolbarButtonConfig[]\r\n handleClick: (button: ToolbarButtonConfig) => void\r\n}\r\n\r\nexport function useToolbar(\r\n editorView: EditorView | null,\r\n options?: UseToolbarOptions\r\n): UseToolbarReturn {\r\n const { extraItems, uploadConfig } = options || {}\r\n const config = useMemo(() => {\r\n const base = createToolbarConfig(uploadConfig)\r\n return base\r\n }, [uploadConfig])\r\n\r\n const extraItemsConfig = useMemo(() => {\r\n return extraItems || []\r\n }, [extraItems])\r\n\r\n const handleClick = useCallback((button: ToolbarButtonConfig) => {\r\n if (!editorView) return\r\n\r\n // 如果配置了 wrapTags,优先使用 toggleWrap\r\n if (button.wrapTags) {\r\n const [openTag, closeTag] = button.wrapTags\r\n toggleWrap(editorView, openTag, closeTag)\r\n return\r\n }\r\n\r\n // 有 handler 则执行自定义逻辑\r\n if (button.handler) {\r\n editorView.focus()\r\n button.handler(editorView, editorView.state)\r\n }\r\n }, [editorView])\r\n\r\n return { config, extraItemsConfig, handleClick }\r\n}","import { Button, Dropdown, Tooltip } from 'antd'\r\nimport { DownOutlined } from '@ant-design/icons'\r\nimport type { ComponentType } from 'react'\r\nimport type { ToolbarButtonConfig } from '../../../types'\r\n\r\ninterface Props {\r\n item: ToolbarButtonConfig\r\n onClick: (item: ToolbarButtonConfig) => void\r\n}\r\n\r\nexport function ToolbarItemRenderer({ item, onClick }: Props) {\r\n const Icon = item.icon as ComponentType\r\n\r\n // 有 children 的渲染为下拉菜单\r\n if (item.children && item.children.length > 0) {\r\n return (\r\n <>\r\n {item.separatorBefore && <div className=\"toolbar-separator\" />}\r\n <div className=\"toolbar-group\">\r\n <Tooltip title={item.label}>\r\n <Dropdown\r\n menu={{\r\n items: item.children.map(child => ({\r\n type: 'item',\r\n key: child.id ?? '',\r\n label: (\r\n <span onClick={() => onClick(child)}>\r\n {child.icon && (() => { const ChildIcon = child.icon as ComponentType; return <ChildIcon />; })()}\r\n {' '}{child.label}\r\n </span>\r\n ),\r\n })),\r\n }}\r\n placement=\"bottomLeft\"\r\n >\r\n <Button className=\"toolbar-button\" type=\"text\" size=\"small\">\r\n <Icon />\r\n <DownOutlined style={{ fontSize: 10 }} />\r\n </Button>\r\n </Dropdown>\r\n </Tooltip>\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n // 普通按钮\r\n const isDisabled = item.disabled\r\n return (\r\n <>\r\n {item.separatorBefore && <div className=\"toolbar-separator\" />}\r\n <div className=\"toolbar-group\">\r\n <Tooltip title={item.label}>\r\n <Button\r\n id={item.id}\r\n className=\"toolbar-button\"\r\n type=\"text\"\r\n size=\"small\"\r\n disabled={isDisabled}\r\n onClick={() => !isDisabled && onClick(item)}\r\n >\r\n <Icon />\r\n </Button>\r\n </Tooltip>\r\n </div>\r\n </>\r\n )\r\n}",".container {\r\n padding: 4px;\r\n display: block;\r\n min-width: 200px;\r\n background: var(--remons-md-editor-bg-picker);\r\n border: 1px solid var(--remons-md-editor-color-border-light);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.grid {\r\n display: grid;\r\n gap: 2px;\r\n transition: all 0.1s ease;\r\n justify-content: flex-start;\r\n\r\n .cell {\r\n width: 24px;\r\n height: 24px;\r\n border: 1px solid var(--remons-md-editor-color-border-light);\r\n border-radius: 2px;\r\n background: transparent;\r\n cursor: pointer;\r\n transition: all 0.1s ease;\r\n\r\n &.cellActive {\r\n border-color: var(--remons-md-editor-color-cell-active);\r\n background: var(--remons-md-editor-bg-cell-active);\r\n }\r\n }\r\n}\r\n\r\n.hint {\r\n padding: 12px 16px;\r\n color: var(--remons-md-editor-color-hint);\r\n font-size: 12px;\r\n text-align: center;\r\n cursor: pointer;\r\n}\r\n\r\n.label {\r\n margin-top: 8px;\r\n font-size: 13px;\r\n color: var(--remons-md-editor-color-label);\r\n font-weight: 500;\r\n min-height: 20px;\r\n text-align: center;\r\n}\r\n","import { useState, useRef, useEffect, useCallback } from 'react'\r\nimport styles from './index.module.less'\r\n\r\ninterface TableSize {\r\n rows: number\r\n cols: number\r\n}\r\n\r\ninterface TablePickerProps {\r\n onSelect: (size: TableSize) => void\r\n}\r\n\r\nconst MAX_ROW = 8\r\nconst MAX_COL = 8\r\n\r\nexport default function TablePicker({ onSelect }: TablePickerProps) {\r\n const [hoverSize, setHoverSize] = useState({ row: 0, col: 0 })\r\n const [confirmedSize, setConfirmedSize] = useState({ row: 0, col: 0 })\r\n const maxColRef = useRef(0)\r\n const prevRowRef = useRef(0)\r\n const timerIdRef = useRef<any>(null)\r\n const refreshTimerRef = useRef<any>(null)\r\n const commitRef = useRef<{ cols: number; rows: number } | null>(null)\r\n\r\n const clearTimer = useCallback(() => {\r\n if (timerIdRef.current) {\r\n clearTimeout(timerIdRef.current)\r\n timerIdRef.current = null\r\n }\r\n }, [])\r\n\r\n const clearFlash = useCallback(() => {\r\n if (refreshTimerRef.current) {\r\n clearInterval(refreshTimerRef.current)\r\n refreshTimerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(\r\n () => () => {\r\n // 组件卸载时清理定时器\r\n if (timerIdRef.current) clearTimeout(timerIdRef.current)\r\n if (refreshTimerRef.current) clearInterval(refreshTimerRef.current)\r\n },\r\n []\r\n )\r\n\r\n /**\r\n * 扩展选中区域至 (col, row)\r\n */\r\n function extend(col: number, row: number) {\r\n if (row < prevRowRef.current || col < maxColRef.current) {\r\n // 鼠标回撤(向上或向左),重置列跟踪\r\n maxColRef.current = 0\r\n }\r\n if (col > maxColRef.current) {\r\n maxColRef.current = col\r\n }\r\n setHoverSize({ row, col })\r\n setConfirmedSize({ row, col: maxColRef.current })\r\n\r\n if (row === 1) {\r\n commitRef.current = { cols: maxColRef.current, rows: 1 }\r\n }\r\n }\r\n\r\n /**\r\n * 跳跃动画效果\r\n */\r\n function flash(\r\n col: number,\r\n dir: 1 | -1,\r\n limit: number,\r\n finalCallback: (finalCol: number, finalRow: number) => void\r\n ) {\r\n let current = dir === 1 ? 1 : limit\r\n const step = dir === 1 ? 1 : -1\r\n\r\n refreshTimerRef.current = setInterval(() => {\r\n setHoverSize({ row: current, col })\r\n if (current > confirmedSize.row || dir === -1) {\r\n maxColRef.current = Math.min(MAX_COL, col)\r\n }\r\n current += step\r\n if ((dir === 1 && current > limit) || (dir === -1 && current < 1)) {\r\n clearInterval(refreshTimerRef.current)\r\n refreshTimerRef.current = null\r\n const finalRow = current - step\r\n setHoverSize({ row: finalRow, col })\r\n finalCallback(col, finalRow)\r\n }\r\n }, 50)\r\n }\r\n\r\n /**\r\n * 核心逻辑:鼠标进入格子\r\n */\r\n function onCellEnterCheck(index: number) {\r\n clearTimer()\r\n clearFlash()\r\n const row = Math.floor(index / MAX_COL) + 1\r\n const col = (index % MAX_COL) + 1\r\n\r\n const prevRow = prevRowRef.current\r\n const isJump = Math.abs(row - prevRow) > 1\r\n const isDown = row > prevRow\r\n prevRowRef.current = row\r\n\r\n if (!isJump) {\r\n // 正常悬停:相邻行或同一行\r\n extend(col, row)\r\n } else if (isDown) {\r\n // 快速向下跳跃\r\n if (col > maxColRef.current || maxColRef.current >= MAX_COL) {\r\n const finalRow = Math.min(row, MAX_ROW)\r\n flash(col, 1, finalRow, (c, r) => {\r\n setConfirmedSize({ row: r, col: c })\r\n })\r\n } else {\r\n extend(col, row)\r\n }\r\n } else {\r\n // 快速向上跳跃:重置列跟踪并播放动画\r\n maxColRef.current = 0\r\n flash(col, -1, row, (c, r) => {\r\n setConfirmedSize({ row: r, col: c })\r\n if (r === 1) {\r\n commitRef.current = { cols: Math.min(MAX_COL, col), rows: 1 }\r\n setConfirmedSize({ row: 1, col: Math.min(MAX_COL, col) })\r\n }\r\n })\r\n }\r\n }\r\n\r\n function onMouseDown() {\r\n const size = commitRef.current || { cols: maxColRef.current, rows: confirmedSize.row }\r\n if (size.rows > 0 && size.cols > 0) {\r\n onSelect(size)\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={styles.container}\r\n onMouseDown={onMouseDown}\r\n >\r\n <div\r\n className={styles.grid}\r\n style={{ gridTemplateColumns: `repeat(${MAX_COL}, 24px)` }}\r\n >\r\n {Array.from({ length: MAX_ROW * MAX_COL }).map((_, i) => {\r\n const row = Math.floor(i / MAX_COL) + 1\r\n const col = (i % MAX_COL) + 1\r\n const isSelected = row <= hoverSize.row && col <= maxColRef.current\r\n return (\r\n <div\r\n key={i}\r\n className={`${styles.cell} ${isSelected ? styles.cellActive : ''}`}\r\n onMouseEnter={() => onCellEnterCheck(i)}\r\n />\r\n )\r\n })}\r\n </div>\r\n <div className={styles.label}>\r\n {hoverSize.row} x {maxColRef.current || 1}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import React, { useCallback, useRef } from 'react'\r\nimport { EditorView } from '@codemirror/view'\r\nimport { Button, Dropdown } from 'antd'\r\nimport { TableOutlined } from '@ant-design/icons'\r\nimport TablePicker from './index'\r\n\r\nexport default function TableDropdown({ editorView }: { editorView: EditorView | null }) {\r\n const [open, setOpen] = React.useState(false)\r\n const openCountRef = useRef(0)\r\n\r\n const handleTableSelect = useCallback((rows: number, cols: number) => {\r\n if (!editorView || rows <= 0 || cols <= 0) return\r\n editorView.focus()\r\n const headerCells = Array(cols).fill(null).map((_, i) => ` 列${i + 1} `).join('|')\r\n const separator = Array(cols).fill(' --- ').join('|')\r\n const dataCell = Array(cols).fill(' 内容 ').join('|')\r\n const dataRows = Array(rows).fill(`|${dataCell}|`).join('\\n')\r\n const table = `\\n|${headerCells}|\\n|${separator}|\\n${dataRows}\\n`\r\n const { from } = editorView.state.selection.main\r\n editorView.dispatch({ changes: { from, insert: table } })\r\n }, [editorView])\r\n\r\n return (\r\n <Dropdown\r\n trigger={['click']}\r\n open={open}\r\n onOpenChange={setOpen}\r\n popupRender={() => {\r\n openCountRef.current++\r\n return (\r\n <div style={{ padding: 4 }} onClick={(e) => e.stopPropagation()}>\r\n <TablePicker\r\n key={openCountRef.current}\r\n onSelect={(size) => {\r\n handleTableSelect(size.rows, size.cols)\r\n setOpen(false)\r\n }}\r\n />\r\n </div>\r\n )\r\n }}\r\n placement=\"bottomLeft\"\r\n >\r\n <Button className=\"toolbar-button\" type=\"text\" size=\"small\" title=\"表格\">\r\n <TableOutlined />\r\n </Button>\r\n </Dropdown>\r\n )\r\n}","import { useCallback } from 'react'\r\nimport { EditorView } from '@codemirror/view'\r\nimport { Button } from 'antd'\r\nimport { FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons'\r\nimport { useToolbar } from './hooks/useToolbar'\r\nimport { ToolbarItemRenderer } from './renderers/ToolbarItemRenderer'\r\nimport TableDropdown from './renderers/TablePicker/TableDropdown'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig } from '../../types'\r\n\r\ninterface ToolbarProps {\r\n editorView: EditorView | null\r\n fullscreen?: boolean\r\n onToggleFullscreen?: () => void\r\n /** 第三方扩展的按钮配置,将追加到工具栏末尾 */\r\n extraItems?: ToolbarButtonConfig[]\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n}\r\n\r\nexport default function Toolbar({ editorView, fullscreen = true, onToggleFullscreen, extraItems, uploadConfig }: ToolbarProps) {\r\n const { config, extraItemsConfig, handleClick } = useToolbar(editorView, { extraItems, uploadConfig })\r\n\r\n const renderFullscreen = useCallback(() => {\r\n if (!onToggleFullscreen) return null\r\n const Icon = fullscreen ? FullscreenExitOutlined : FullscreenOutlined\r\n return (\r\n <Button\r\n className=\"toolbar-button\"\r\n type=\"text\"\r\n size=\"small\"\r\n title={fullscreen ? '退出全屏' : '全屏'}\r\n onClick={() => {\r\n onToggleFullscreen()\r\n }}\r\n >\r\n <Icon />\r\n </Button>\r\n )\r\n }, [fullscreen, onToggleFullscreen])\r\n\r\n function isSeparator(item: ToolbarButtonConfig): boolean {\r\n return !!(!item.id && item.separatorBefore)\r\n }\r\n\r\n return (\r\n <div className=\"toolbar\">\r\n {config.map((item, idx) => {\r\n if (isSeparator(item)) {\r\n return <div key={`sep-${idx}`} className=\"toolbar-separator\" />\r\n }\r\n return (\r\n <ToolbarItemRenderer\r\n key={item.id}\r\n item={item}\r\n onClick={handleClick}\r\n />\r\n )\r\n })}\r\n <TableDropdown editorView={editorView} />\r\n {extraItemsConfig?.map((item, idx) => {\r\n if (isSeparator(item)) {\r\n return <div key={`extra-sep-${idx}`} className=\"toolbar-separator\" />\r\n }\r\n return (\r\n <ToolbarItemRenderer\r\n key={item.id}\r\n item={item}\r\n onClick={handleClick}\r\n />\r\n )\r\n })}\r\n {renderFullscreen()}\r\n </div>\r\n )\r\n}","import { useState, useMemo, useEffect, useRef, type FC } from 'react'\r\nimport { Modal, Form, Input, InputNumber, Select, Switch, Slider, Rate, DatePicker, ColorPicker } from 'antd'\r\nimport type { FormInstance, FormItemProps } from 'antd'\r\nimport componentRegistry from '../../registry/componentRegistry'\r\nimport type { DialogField } from '../../types'\r\n\r\n/**\r\n * 组件类型到 antd 表单组件的映射\r\n */\r\nconst FormComponents: Record<string, FC<any>> = {\r\n input: Input,\r\n textarea: Input.TextArea,\r\n number: InputNumber,\r\n select: Select,\r\n switch: Switch,\r\n slider: Slider,\r\n rate: Rate,\r\n color: ColorPicker,\r\n date: DatePicker,\r\n dateRange: DatePicker.RangePicker,\r\n}\r\n\r\n/**\r\n * 渲染对应类型的 antd 表单组件\r\n */\r\nfunction renderFormItemComponent(field: DialogField) {\r\n const props = field.componentProps || {}\r\n const Component = field.componentType ? FormComponents[field.componentType] : Input\r\n return <Component {...props} />\r\n}\r\n\r\n/**\r\n * 根据 fields 自动生成 Form.Item 列表\r\n */\r\nfunction renderAutoForm(form: FormInstance, fields: DialogField[]) {\r\n if (!fields || fields.length === 0) {\r\n return null\r\n }\r\n\r\n return (\r\n <Form form={form} layout=\"vertical\">\r\n {fields.map(field => {\r\n if (!field.componentType) {\r\n return null\r\n }\r\n\r\n const formItemProps: FormItemProps = {\r\n name: field.key,\r\n label: field.name || field.key,\r\n valuePropName: field.componentType === 'switch' ? 'checked' : undefined,\r\n ...field.componentProps,\r\n }\r\n\r\n return (\r\n <Form.Item key={field.key} {...formItemProps}>\r\n {renderFormItemComponent(field)}\r\n </Form.Item>\r\n )\r\n })}\r\n </Form>\r\n )\r\n}\r\n\r\n/**\r\n * 弹窗编辑容器属性的组件\r\n */\r\ninterface EditDialogProps {\r\n /** 弹窗是否显示 */\r\n visible: boolean\r\n /** 容器类型名称 */\r\n typeName: string\r\n /** 当前属性值 */\r\n currentProps: Record<string, string>\r\n /** 保存回调 */\r\n onSave: (props: Record<string, string>) => void\r\n /** 关闭回调 */\r\n onClose: () => void\r\n}\r\n\r\n/**\r\n * 属性编辑弹窗组件\r\n * 根据组件 schema 的 renderDialog 函数渲染弹窗内容\r\n */\r\nexport default function EditDialog({ visible, typeName, currentProps, onSave, onClose }: EditDialogProps) {\r\n const schema = componentRegistry.get(typeName)\r\n const [formProps, setFormProps] = useState<Record<string, string>>({})\r\n const [form] = Form.useForm()\r\n\r\n const onSaveRef = useRef(onSave)\r\n onSaveRef.current = onSave\r\n const dirtyRef = useRef(false)\r\n\r\n // 当弹窗打开时,初始化表单值\r\n const mergedProps = useMemo(() => {\r\n if (!schema) return currentProps\r\n const defaults: Record<string, string> = {}\r\n for (const field of schema.fields || []) {\r\n defaults[field.key] = field.defaultValue ?? ''\r\n }\r\n return { ...defaults, ...currentProps }\r\n }, [schema, currentProps])\r\n\r\n // 弹窗打开时设置表单值\r\n useEffect(() => {\r\n if (visible) {\r\n form.setFieldsValue(mergedProps)\r\n setFormProps({})\r\n }\r\n }, [visible, mergedProps, form])\r\n\r\n const handleDialogChange = (key: string, value: string) => {\r\n setFormProps(prev => ({ ...prev, [key]: value }))\r\n }\r\n\r\n const handleOk = async () => {\r\n let finalProps: Record<string, any> = visible ? { ...mergedProps, ...formProps } : mergedProps\r\n\r\n // 尝试从 Form 获取值(如果用户使用了 Form.Item 或自动表单)\r\n try {\r\n const formValues = await form.validateFields()\r\n finalProps = { ...finalProps, ...formValues }\r\n } catch {\r\n // 用户没有使用 Form.Item,使用原有的逻辑\r\n }\r\n\r\n onSaveRef.current(finalProps)\r\n dirtyRef.current = false\r\n onClose()\r\n }\r\n\r\n const handleClose = () => {\r\n setFormProps({})\r\n dirtyRef.current = false\r\n onClose()\r\n }\r\n\r\n if (!schema) {\r\n return null\r\n }\r\n\r\n // 构建 context 对象,供 renderDialog 使用\r\n // context.onSave 为包装函数:仅写回编辑器并标记脏状态,不触发弹窗关闭;\r\n // 弹窗关闭由 onOk / onCancel 最终统一处理\r\n const contextSave = (props: Record<string, string>) => {\r\n setFormProps(prev => ({ ...prev, ...props }))\r\n dirtyRef.current = true\r\n }\r\n\r\n const context = {\r\n props: mergedProps,\r\n form,\r\n onChange: handleDialogChange,\r\n onSave: contextSave,\r\n }\r\n\r\n // 渲染策略:\r\n // 1. 如果有 renderDialog,使用自定义渲染\r\n // 2. 否则如果 fields 中有 componentType,自动生成表单\r\n // 3. 否则不渲染任何内容\r\n const renderDialogContent = () => {\r\n if (schema.renderDialog) {\r\n return schema.renderDialog(context)\r\n }\r\n // 检查是否有字段配置了 componentType\r\n const hasComponentType = schema.fields?.some(f => f.componentType)\r\n if (hasComponentType && schema.fields) {\r\n return renderAutoForm(form, schema.fields)\r\n }\r\n return null\r\n }\r\n\r\n return (\r\n <Modal\r\n title={`${schema.label} 属性编辑`}\r\n open={visible}\r\n onOk={handleOk}\r\n onCancel={handleClose}\r\n okText=\"保存\"\r\n cancelText=\"取消\"\r\n >\r\n {renderDialogContent()}\r\n </Modal>\r\n )\r\n}","import type { EditorView } from '@codemirror/view'\r\n\r\n/**\r\n * 从属性对象生成 JSON 属性行。\r\n * 格式: { key: 'value', key2: 'value2' }\r\n */\r\nexport function writeContainerProps(props: Record<string, string>): string {\r\n const entries = Object.entries(props)\r\n .map(([k, v]) => `${k}: '${v}'`)\r\n .join(', ')\r\n return entries ? `{ ${entries} }` : '{}'\r\n}\r\n\r\n/**\r\n * 更新编辑器文档中的容器属性。\r\n * 替换 JSON 属性行(::: 打开行之后的一行)为新属性。\r\n */\r\nexport function updateContainerProps(\r\n view: EditorView,\r\n propsLineFrom: number,\r\n propsLineTo: number,\r\n newProps: Record<string, string>\r\n): void {\r\n const newPropsLine = writeContainerProps(newProps)\r\n view.dispatch({\r\n changes: {\r\n from: propsLineFrom,\r\n to: propsLineTo,\r\n insert: newPropsLine,\r\n },\r\n })\r\n}\r\n\r\n/**\r\n * 在当前光标位置插入新容器。\r\n * 创建 :::type 打开行 + JSON 属性 + ::: 关闭行的结构。\r\n */\r\nexport function insertContainer(\r\n view: EditorView,\r\n typeName: string,\r\n defaultProps: Record<string, string>\r\n): void {\r\n const { from } = view.state.selection.main\r\n const propsLine = writeContainerProps(defaultProps)\r\n const container = `:::${typeName}\\n${propsLine}\\n:::\\n`\r\n view.dispatch({ changes: { from, insert: container } })\r\n}","import { useState, useEffect, useCallback } from 'react'\r\n\r\nexport function useFullscreen() {\r\n const [fullscreen, setFullscreen] = useState(false)\r\n\r\n const toggleFullscreen = useCallback(() => {\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen().catch((e) => {\r\n console.error('退出全屏失败:', e)\r\n })\r\n } else {\r\n const el = document.documentElement\r\n const requestMethod = el.requestFullscreen ||\r\n (el as any).webkitRequestFullscreen ||\r\n (el as any).mozRequestFullScreen ||\r\n (el as any).msRequestFullscreen\r\n if (requestMethod) {\r\n requestMethod.call(el).catch((e) => {\r\n console.error('进入全屏失败:', e)\r\n })\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n const handleFullscreenChange = () => {\r\n setFullscreen(!!document.fullscreenElement)\r\n }\r\n document.addEventListener('fullscreenchange', handleFullscreenChange)\r\n document.addEventListener('webkitfullscreenchange', handleFullscreenChange)\r\n return () => {\r\n document.removeEventListener('fullscreenchange', handleFullscreenChange)\r\n document.removeEventListener('webkitfullscreenchange', handleFullscreenChange)\r\n }\r\n }, [])\r\n\r\n return { fullscreen, toggleFullscreen }\r\n}\r\n","import { useEffect, useRef } from 'react'\r\n\r\n/**\r\n * 双向滚动同步 Hook\r\n * 编辑器与预览区互相同步滚动位置(基于比例)\r\n * 使用 síncing 锁防止双向循环触发\r\n */\r\nexport function useScrollSync(\r\n sourceRef: React.RefObject<HTMLElement | null>,\r\n targetRef: React.RefObject<HTMLDivElement | null>\r\n) {\r\n const rafIdRef = useRef<number | null>(null)\r\n // 锁:'source' 表示正在同步 source→target,'target' 表示反向\r\n const syncingRef = useRef<'source' | 'target' | null>(null)\r\n\r\n const syncScroll = (\r\n from: 'source' | 'target',\r\n fromEl: HTMLElement,\r\n toEl: HTMLElement\r\n ) => {\r\n if (rafIdRef.current) return\r\n rafIdRef.current = requestAnimationFrame(() => {\r\n const fromScrollHeight = fromEl.scrollHeight - fromEl.clientHeight\r\n if (fromScrollHeight <= 0) { rafIdRef.current = null; syncingRef.current = null; return }\r\n const ratio = fromEl.scrollTop / fromScrollHeight\r\n const toScrollHeight = toEl.scrollHeight - toEl.clientHeight\r\n if (toScrollHeight > 0) {\r\n syncingRef.current = from // 加锁\r\n toEl.scrollTop = ratio * toScrollHeight\r\n // 下一帧解锁,让对面的 listener 可以响应新的一次滚动\r\n requestAnimationFrame(() => { syncingRef.current = null })\r\n }\r\n rafIdRef.current = null\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n const source = sourceRef.current\r\n const target = targetRef.current\r\n if (!source || !target) return\r\n\r\n const onSourceScroll = () => {\r\n if (syncingRef.current !== null) return // 锁住,正在被反向同步\r\n const s = sourceRef.current!\r\n const t = targetRef.current!\r\n syncScroll('source', s, t)\r\n }\r\n\r\n const onTargetScroll = () => {\r\n if (syncingRef.current !== null) return // 锁住,正在被正向同步\r\n const s = sourceRef.current!\r\n const t = targetRef.current!\r\n syncScroll('target', t, s)\r\n }\r\n\r\n source.addEventListener('scroll', onSourceScroll, { passive: true })\r\n target.addEventListener('scroll', onTargetScroll, { passive: true })\r\n\r\n return () => {\r\n source.removeEventListener('scroll', onSourceScroll)\r\n target.removeEventListener('scroll', onTargetScroll)\r\n if (rafIdRef.current) cancelAnimationFrame(rafIdRef.current)\r\n }\r\n }, [sourceRef, targetRef])\r\n}\r\n","import { useState, useRef, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react'\r\nimport { message } from 'antd'\r\nimport Editor from './components/Editor'\r\nimport Preview from './components/Preview'\r\nimport SplitPanels from './components/Panel/SplitPanels'\r\nimport Toolbar from './components/Toolbar'\r\nimport EditDialog from './components/Dialog/EditDialog'\r\nimport componentRegistry from './registry/componentRegistry'\r\nimport { updateContainerProps, insertContainer } from './utils/writeContainer'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig } from './types'\r\nimport type { PreviewOptions } from './components/Preview'\r\nimport { ReadOutlined } from '@ant-design/icons'\r\nimport { useFullscreen } from './hooks/useFullscreen'\r\nimport { useScrollSync } from './hooks/useScrollSync'\r\n\r\nexport interface MarkdownEditorRef {\r\n getContent: () => string\r\n}\r\n\r\nexport interface MarkdownEditorProps {\r\n /** 初始内容 */\r\n defaultValue?: string\r\n /** 受控内容 */\r\n value?: string\r\n /** 内容变化回调 */\r\n onChange?: (value: string) => void\r\n /** 是否显示预览面板 */\r\n showPreview?: boolean\r\n /** 是否支持全屏 */\r\n fullscreen?: boolean\r\n /** Preview 渲染配置 */\r\n previewOptions?: PreviewOptions\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n}\r\n\r\nexport default forwardRef<MarkdownEditorRef, MarkdownEditorProps>(function MarkdownEditor({\r\n defaultValue = '',\r\n value,\r\n onChange,\r\n showPreview = true,\r\n fullscreen: fullscreenProp = true,\r\n previewOptions,\r\n uploadConfig,\r\n}, ref) {\r\n const [content, setContent] = useState(value ?? defaultValue)\r\n const [editorView, setEditorView] = useState<any>(null)\r\n const scrollDOMRef = useRef<HTMLElement | null>(null)\r\n const previewElRef = useRef<HTMLDivElement | null>(null)\r\n const { fullscreen, toggleFullscreen } = useFullscreen()\r\n useScrollSync(scrollDOMRef, previewElRef)\r\n\r\n // 容器编辑弹窗状态\r\n const [dialogVisible, setDialogVisible] = useState(false)\r\n const [dialogTypeName, setDialogTypeName] = useState('')\r\n const [dialogProps, setDialogProps] = useState<Record<string, string>>({})\r\n const [dialogPropsRange, setDialogPropsRange] = useState<[number, number]>([0, 0])\r\n\r\n // 受控模式:外部 value 变化时同步\r\n useEffect(() => {\r\n if (value !== undefined) {\r\n setContent(value)\r\n }\r\n }, [value])\r\n\r\n const internalSetContent = useCallback((newContent: string) => {\r\n setContent(newContent)\r\n onChange?.(newContent)\r\n }, [onChange])\r\n\r\n // 暴露 getContent 方法\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => content,\r\n }), [content])\r\n\r\n // 从注册中心自动生成工具栏按钮\r\n const extraToolbarItems: ToolbarButtonConfig[] = componentRegistry.getAll().flatMap(schema => {\r\n // 支持 wrapTags 的标签包裹模式\r\n if (schema.wrapTags) {\r\n return {\r\n id: `wrap-${schema.name}`,\r\n label: schema.label,\r\n icon: () => (schema.icon ?? <ReadOutlined />),\r\n wrapTags: schema.wrapTags,\r\n }\r\n }\r\n // 容器插入模式\r\n const defaultProps: Record<string, string> = {}\r\n for (const field of schema?.fields ?? []) {\r\n defaultProps[field.key] = field.defaultValue ?? ''\r\n }\r\n return {\r\n id: `container-${schema.name}`,\r\n label: schema.label,\r\n icon: () => (schema.icon ?? <ReadOutlined />),\r\n handler: (view, _state) => insertContainer(view, schema.name, defaultProps),\r\n }\r\n })\r\n\r\n // 滚动同步 (already handled by useScrollSync hook)\r\n const handleScrollReady = useCallback((scrollDOM: HTMLElement) => {\r\n scrollDOMRef.current = scrollDOM\r\n }, [])\r\n\r\n const handlePreviewRef = useCallback((node: HTMLDivElement | null) => {\r\n previewElRef.current = node\r\n }, [])\r\n\r\n const handleViewReady = useCallback((view: any) => {\r\n setEditorView(view)\r\n }, [])\r\n\r\n // 编辑容器属性时触发\r\n const handleEditContainer = useCallback((_view: any, typeName: string, propsLineFrom: number, propsLineTo: number, currentProps: Record<string, string>) => {\r\n setDialogTypeName(typeName)\r\n setDialogProps({ ...currentProps })\r\n setDialogPropsRange([propsLineFrom, propsLineTo])\r\n setDialogVisible(true)\r\n }, [])\r\n\r\n // 保存容器属性(仅写回编辑器,不关闭弹窗;关闭由 EditDialog 内部控制)\r\n const handleDialogSave = useCallback((newProps: Record<string, string>) => {\r\n if (editorView) {\r\n updateContainerProps(editorView, dialogPropsRange[0], dialogPropsRange[1], newProps)\r\n }\r\n }, [editorView, dialogPropsRange])\r\n\r\n // 关闭弹窗\r\n const handleDialogClose = useCallback(() => {\r\n setDialogVisible(false)\r\n }, [])\r\n\r\n return (\r\n <div className={fullscreen ? 'markdown-editor-app fullscreen' : 'markdown-editor-app'}>\r\n <Toolbar\r\n editorView={editorView}\r\n fullscreen={fullscreen}\r\n onToggleFullscreen={fullscreenProp ? toggleFullscreen : undefined}\r\n extraItems={extraToolbarItems}\r\n uploadConfig={uploadConfig}\r\n />\r\n {showPreview ? (\r\n <SplitPanels\r\n leftPanel={\r\n <Editor\r\n value={content}\r\n onChange={internalSetContent}\r\n onScrollReady={handleScrollReady}\r\n onViewReady={handleViewReady}\r\n onEditContainer={handleEditContainer}\r\n uploadConfig={uploadConfig}\r\n onMessageNoUploadConfig={() => message.warning('请先配置图片上传功能')}\r\n />\r\n }\r\n rightPanel={\r\n <Preview\r\n content={content}\r\n ref={handlePreviewRef}\r\n previewOptions={previewOptions}\r\n />\r\n }\r\n />\r\n ) : (\r\n <Editor\r\n value={content}\r\n onChange={internalSetContent}\r\n onScrollReady={handleScrollReady}\r\n onViewReady={handleViewReady}\r\n onEditContainer={handleEditContainer}\r\n uploadConfig={uploadConfig}\r\n onMessageNoUploadConfig={() => message.warning('请先配置图片上传功能')}\r\n />\r\n )}\r\n {/* 容器属性编辑弹窗 */}\r\n <EditDialog\r\n visible={dialogVisible}\r\n typeName={dialogTypeName}\r\n currentProps={dialogProps}\r\n onSave={handleDialogSave}\r\n onClose={handleDialogClose}\r\n />\r\n </div>\r\n )\r\n})\r\n","import { useEffect } from 'react'\r\nimport componentRegistry from '../registry/componentRegistry'\r\nimport type { ComponentSchema } from '../types'\r\n\r\n/**\r\n * 注册自定义容器组件到工具栏。支持单个或批量注册。\r\n * 支持两种模式:\r\n * \r\n * 1. 容器模式(linkCard):name + fields + renderDialog\r\n * 插入 :::name 格式的容器,支持弹窗编辑属性\r\n * \r\n * 2. 标签包裹模式:name + wrapTags\r\n * 插入简单的标签包裹文本,如 <plugin-container>...</plugin-container>\r\n * \r\n * @example 容器模式 - 使用 fields 自动生成表单(最简)\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [\r\n * { key: 'type', name: '类型', componentType: 'select',\r\n * componentProps: { options: [{ value: 'price', label: '价格' }, { value: 'info', label: '信息' }] } },\r\n * { key: 'content', name: '内容', componentType: 'textarea',\r\n * componentProps: { rows: 3 } },\r\n * { key: 'enabled', name: '启用', componentType: 'switch' },\r\n * ],\r\n * }\r\n * // 支持的 componentType: 'input' | 'textarea' | 'number' | 'select' | 'switch' | 'slider' | 'rate' | 'color' | 'date' | 'dateRange'\r\n * ```\r\n * \r\n * @example 容器模式 - 使用 Form.Item 自动绑定(推荐)\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ form }) => (\r\n * <Form form={form} layout=\"vertical\">\r\n * <Form.Item name=\"level\" label=\"级别\">\r\n * <Input />\r\n * </Form.Item>\r\n * </Form>\r\n * ),\r\n * }\r\n * \r\n * function MyPage() {\r\n * useRegisterToolbar(schema)\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n * \r\n * @example 容器模式 - 手动控制\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ props, onChange }) => (\r\n * <Input value={props.level} onChange={e => onChange('level', e.target.value)} />\r\n * ),\r\n * }\r\n * ```\r\n * \r\n * @example 容器模式 - 完全自定义弹窗\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ props, onSave }) => (\r\n * <MyCustomEditor\r\n * value={props.level}\r\n * onSave={({ level }) => onSave({ level })}\r\n * />\r\n * ),\r\n * }\r\n * ```\r\n * \r\n * @example 标签包裹模式\r\n * ```tsx\r\n * function MyPage() {\r\n * useRegisterToolbar({\r\n * name: 'plugin-container',\r\n * label: '自定义容器',\r\n * icon: <AlertOutlined />,\r\n * wrapTags: ['<plugin-container>', '</plugin-container>'],\r\n * })\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n * \r\n * @example 批量注册\r\n * ```tsx\r\n * function MyPage() {\r\n * useRegisterToolbar([schema1, schema2, schema3])\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n */\r\nexport function useRegisterToolbar(schemas: ComponentSchema | ComponentSchema[]) {\r\n const schemaList: ComponentSchema[] = Array.isArray(schemas) ? schemas : [schemas]\r\n\r\n useEffect(() => {\r\n schemaList.forEach(schema => {\r\n componentRegistry.register(schema.name, schema)\r\n })\r\n return () => {\r\n schemaList.forEach(schema => {\r\n componentRegistry.unregister(schema.name)\r\n })\r\n }\r\n }, [schemaList])\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["module","exports"],"sources":["../node_modules/json5/dist/index.js","../src/registry/componentRegistry.tsx","../src/utils/parseContainer.ts","../src/components/Editor/containerWidget.ts","../src/components/Toolbar/buttons.tsx","../src/components/Editor/codemirrorExtensions.ts","../src/components/Editor/index.tsx","../src/components/Preview/index.tsx","../src/components/Panel/SplitPanels.tsx","../src/components/Icon/config.ts","../src/components/Icon/index.tsx","../src/components/Toolbar/config.ts","../src/components/Toolbar/hooks/useToolbar.ts","../src/components/Toolbar/renderers/ToolbarItemRenderer.tsx","../src/components/Toolbar/renderers/TablePicker/index.module.less","../src/components/Toolbar/renderers/TablePicker/index.tsx","../src/components/Toolbar/renderers/TablePicker/TableDropdown.tsx","../src/components/Toolbar/index.tsx","../node_modules/dayjs/dayjs.min.js","../src/components/Dialog/EditDialog.tsx","../src/utils/writeContainer.ts","../src/hooks/useFullscreen.ts","../src/hooks/useScrollSync.ts","../src/MarkdownEditor.tsx","../src/hooks/useRegisterToolbar.ts"],"sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.JSON5 = factory());\n}(this, (function () { 'use strict';\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar _global = createCommonjsModule(function (module) {\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n\t ? window : typeof self != 'undefined' && self.Math == Math ? self\n\t // eslint-disable-next-line no-new-func\n\t : Function('return this')();\n\tif (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef\n\t});\n\n\tvar _core = createCommonjsModule(function (module) {\n\tvar core = module.exports = { version: '2.6.5' };\n\tif (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef\n\t});\n\tvar _core_1 = _core.version;\n\n\tvar _isObject = function (it) {\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\tvar _anObject = function (it) {\n\t if (!_isObject(it)) { throw TypeError(it + ' is not an object!'); }\n\t return it;\n\t};\n\n\tvar _fails = function (exec) {\n\t try {\n\t return !!exec();\n\t } catch (e) {\n\t return true;\n\t }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar _descriptors = !_fails(function () {\n\t return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n\t});\n\n\tvar document = _global.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar is = _isObject(document) && _isObject(document.createElement);\n\tvar _domCreate = function (it) {\n\t return is ? document.createElement(it) : {};\n\t};\n\n\tvar _ie8DomDefine = !_descriptors && !_fails(function () {\n\t return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;\n\t});\n\n\t// 7.1.1 ToPrimitive(input [, PreferredType])\n\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar _toPrimitive = function (it, S) {\n\t if (!_isObject(it)) { return it; }\n\t var fn, val;\n\t if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }\n\t if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }\n\t if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar dP = Object.defineProperty;\n\n\tvar f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n\t _anObject(O);\n\t P = _toPrimitive(P, true);\n\t _anObject(Attributes);\n\t if (_ie8DomDefine) { try {\n\t return dP(O, P, Attributes);\n\t } catch (e) { /* empty */ } }\n\t if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }\n\t if ('value' in Attributes) { O[P] = Attributes.value; }\n\t return O;\n\t};\n\n\tvar _objectDp = {\n\t\tf: f\n\t};\n\n\tvar _propertyDesc = function (bitmap, value) {\n\t return {\n\t enumerable: !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable: !(bitmap & 4),\n\t value: value\n\t };\n\t};\n\n\tvar _hide = _descriptors ? function (object, key, value) {\n\t return _objectDp.f(object, key, _propertyDesc(1, value));\n\t} : function (object, key, value) {\n\t object[key] = value;\n\t return object;\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\tvar _has = function (it, key) {\n\t return hasOwnProperty.call(it, key);\n\t};\n\n\tvar id = 0;\n\tvar px = Math.random();\n\tvar _uid = function (key) {\n\t return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n\t};\n\n\tvar _library = false;\n\n\tvar _shared = createCommonjsModule(function (module) {\n\tvar SHARED = '__core-js_shared__';\n\tvar store = _global[SHARED] || (_global[SHARED] = {});\n\n\t(module.exports = function (key, value) {\n\t return store[key] || (store[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t version: _core.version,\n\t mode: _library ? 'pure' : 'global',\n\t copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar _functionToString = _shared('native-function-to-string', Function.toString);\n\n\tvar _redefine = createCommonjsModule(function (module) {\n\tvar SRC = _uid('src');\n\n\tvar TO_STRING = 'toString';\n\tvar TPL = ('' + _functionToString).split(TO_STRING);\n\n\t_core.inspectSource = function (it) {\n\t return _functionToString.call(it);\n\t};\n\n\t(module.exports = function (O, key, val, safe) {\n\t var isFunction = typeof val == 'function';\n\t if (isFunction) { _has(val, 'name') || _hide(val, 'name', key); }\n\t if (O[key] === val) { return; }\n\t if (isFunction) { _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }\n\t if (O === _global) {\n\t O[key] = val;\n\t } else if (!safe) {\n\t delete O[key];\n\t _hide(O, key, val);\n\t } else if (O[key]) {\n\t O[key] = val;\n\t } else {\n\t _hide(O, key, val);\n\t }\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, TO_STRING, function toString() {\n\t return typeof this == 'function' && this[SRC] || _functionToString.call(this);\n\t});\n\t});\n\n\tvar _aFunction = function (it) {\n\t if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }\n\t return it;\n\t};\n\n\t// optional / simple context binding\n\n\tvar _ctx = function (fn, that, length) {\n\t _aFunction(fn);\n\t if (that === undefined) { return fn; }\n\t switch (length) {\n\t case 1: return function (a) {\n\t return fn.call(that, a);\n\t };\n\t case 2: return function (a, b) {\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function (a, b, c) {\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function (/* ...args */) {\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n\tvar PROTOTYPE = 'prototype';\n\n\tvar $export = function (type, name, source) {\n\t var IS_FORCED = type & $export.F;\n\t var IS_GLOBAL = type & $export.G;\n\t var IS_STATIC = type & $export.S;\n\t var IS_PROTO = type & $export.P;\n\t var IS_BIND = type & $export.B;\n\t var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];\n\t var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});\n\t var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n\t var key, own, out, exp;\n\t if (IS_GLOBAL) { source = name; }\n\t for (key in source) {\n\t // contains in native\n\t own = !IS_FORCED && target && target[key] !== undefined;\n\t // export native or passed\n\t out = (own ? target : source)[key];\n\t // bind timers to global for call from export context\n\t exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;\n\t // extend global\n\t if (target) { _redefine(target, key, out, type & $export.U); }\n\t // export\n\t if (exports[key] != out) { _hide(exports, key, exp); }\n\t if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }\n\t }\n\t};\n\t_global.core = _core;\n\t// type bitmap\n\t$export.F = 1; // forced\n\t$export.G = 2; // global\n\t$export.S = 4; // static\n\t$export.P = 8; // proto\n\t$export.B = 16; // bind\n\t$export.W = 32; // wrap\n\t$export.U = 64; // safe\n\t$export.R = 128; // real proto method for `library`\n\tvar _export = $export;\n\n\t// 7.1.4 ToInteger\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\tvar _toInteger = function (it) {\n\t return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n\t};\n\n\t// 7.2.1 RequireObjectCoercible(argument)\n\tvar _defined = function (it) {\n\t if (it == undefined) { throw TypeError(\"Can't call method on \" + it); }\n\t return it;\n\t};\n\n\t// true -> String#at\n\t// false -> String#codePointAt\n\tvar _stringAt = function (TO_STRING) {\n\t return function (that, pos) {\n\t var s = String(_defined(that));\n\t var i = _toInteger(pos);\n\t var l = s.length;\n\t var a, b;\n\t if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }\n\t a = s.charCodeAt(i);\n\t return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n\t ? TO_STRING ? s.charAt(i) : a\n\t : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n\t };\n\t};\n\n\tvar $at = _stringAt(false);\n\t_export(_export.P, 'String', {\n\t // 21.1.3.3 String.prototype.codePointAt(pos)\n\t codePointAt: function codePointAt(pos) {\n\t return $at(this, pos);\n\t }\n\t});\n\n\tvar codePointAt = _core.String.codePointAt;\n\n\tvar max = Math.max;\n\tvar min = Math.min;\n\tvar _toAbsoluteIndex = function (index, length) {\n\t index = _toInteger(index);\n\t return index < 0 ? max(index + length, 0) : min(index, length);\n\t};\n\n\tvar fromCharCode = String.fromCharCode;\n\tvar $fromCodePoint = String.fromCodePoint;\n\n\t// length should be 1, old FF problem\n\t_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n\t // 21.1.2.2 String.fromCodePoint(...codePoints)\n\t fromCodePoint: function fromCodePoint(x) {\n\t var arguments$1 = arguments;\n\t // eslint-disable-line no-unused-vars\n\t var res = [];\n\t var aLen = arguments.length;\n\t var i = 0;\n\t var code;\n\t while (aLen > i) {\n\t code = +arguments$1[i++];\n\t if (_toAbsoluteIndex(code, 0x10ffff) !== code) { throw RangeError(code + ' is not a valid code point'); }\n\t res.push(code < 0x10000\n\t ? fromCharCode(code)\n\t : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n\t );\n\t } return res.join('');\n\t }\n\t});\n\n\tvar fromCodePoint = _core.String.fromCodePoint;\n\n\t// This is a generated file. Do not edit.\n\tvar Space_Separator = /[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\n\tvar ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\n\tvar ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\n\tvar unicode = {\n\t\tSpace_Separator: Space_Separator,\n\t\tID_Start: ID_Start,\n\t\tID_Continue: ID_Continue\n\t};\n\n\tvar util = {\n\t isSpaceSeparator: function isSpaceSeparator (c) {\n\t return typeof c === 'string' && unicode.Space_Separator.test(c)\n\t },\n\n\t isIdStartChar: function isIdStartChar (c) {\n\t return typeof c === 'string' && (\n\t (c >= 'a' && c <= 'z') ||\n\t (c >= 'A' && c <= 'Z') ||\n\t (c === '$') || (c === '_') ||\n\t unicode.ID_Start.test(c)\n\t )\n\t },\n\n\t isIdContinueChar: function isIdContinueChar (c) {\n\t return typeof c === 'string' && (\n\t (c >= 'a' && c <= 'z') ||\n\t (c >= 'A' && c <= 'Z') ||\n\t (c >= '0' && c <= '9') ||\n\t (c === '$') || (c === '_') ||\n\t (c === '\\u200C') || (c === '\\u200D') ||\n\t unicode.ID_Continue.test(c)\n\t )\n\t },\n\n\t isDigit: function isDigit (c) {\n\t return typeof c === 'string' && /[0-9]/.test(c)\n\t },\n\n\t isHexDigit: function isHexDigit (c) {\n\t return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)\n\t },\n\t};\n\n\tvar source;\n\tvar parseState;\n\tvar stack;\n\tvar pos;\n\tvar line;\n\tvar column;\n\tvar token;\n\tvar key;\n\tvar root;\n\n\tvar parse = function parse (text, reviver) {\n\t source = String(text);\n\t parseState = 'start';\n\t stack = [];\n\t pos = 0;\n\t line = 1;\n\t column = 0;\n\t token = undefined;\n\t key = undefined;\n\t root = undefined;\n\n\t do {\n\t token = lex();\n\n\t // This code is unreachable.\n\t // if (!parseStates[parseState]) {\n\t // throw invalidParseState()\n\t // }\n\n\t parseStates[parseState]();\n\t } while (token.type !== 'eof')\n\n\t if (typeof reviver === 'function') {\n\t return internalize({'': root}, '', reviver)\n\t }\n\n\t return root\n\t};\n\n\tfunction internalize (holder, name, reviver) {\n\t var value = holder[name];\n\t if (value != null && typeof value === 'object') {\n\t if (Array.isArray(value)) {\n\t for (var i = 0; i < value.length; i++) {\n\t var key = String(i);\n\t var replacement = internalize(value, key, reviver);\n\t if (replacement === undefined) {\n\t delete value[key];\n\t } else {\n\t Object.defineProperty(value, key, {\n\t value: replacement,\n\t writable: true,\n\t enumerable: true,\n\t configurable: true,\n\t });\n\t }\n\t }\n\t } else {\n\t for (var key$1 in value) {\n\t var replacement$1 = internalize(value, key$1, reviver);\n\t if (replacement$1 === undefined) {\n\t delete value[key$1];\n\t } else {\n\t Object.defineProperty(value, key$1, {\n\t value: replacement$1,\n\t writable: true,\n\t enumerable: true,\n\t configurable: true,\n\t });\n\t }\n\t }\n\t }\n\t }\n\n\t return reviver.call(holder, name, value)\n\t}\n\n\tvar lexState;\n\tvar buffer;\n\tvar doubleQuote;\n\tvar sign;\n\tvar c;\n\n\tfunction lex () {\n\t lexState = 'default';\n\t buffer = '';\n\t doubleQuote = false;\n\t sign = 1;\n\n\t for (;;) {\n\t c = peek();\n\n\t // This code is unreachable.\n\t // if (!lexStates[lexState]) {\n\t // throw invalidLexState(lexState)\n\t // }\n\n\t var token = lexStates[lexState]();\n\t if (token) {\n\t return token\n\t }\n\t }\n\t}\n\n\tfunction peek () {\n\t if (source[pos]) {\n\t return String.fromCodePoint(source.codePointAt(pos))\n\t }\n\t}\n\n\tfunction read () {\n\t var c = peek();\n\n\t if (c === '\\n') {\n\t line++;\n\t column = 0;\n\t } else if (c) {\n\t column += c.length;\n\t } else {\n\t column++;\n\t }\n\n\t if (c) {\n\t pos += c.length;\n\t }\n\n\t return c\n\t}\n\n\tvar lexStates = {\n\t default: function default$1 () {\n\t switch (c) {\n\t case '\\t':\n\t case '\\v':\n\t case '\\f':\n\t case ' ':\n\t case '\\u00A0':\n\t case '\\uFEFF':\n\t case '\\n':\n\t case '\\r':\n\t case '\\u2028':\n\t case '\\u2029':\n\t read();\n\t return\n\n\t case '/':\n\t read();\n\t lexState = 'comment';\n\t return\n\n\t case undefined:\n\t read();\n\t return newToken('eof')\n\t }\n\n\t if (util.isSpaceSeparator(c)) {\n\t read();\n\t return\n\t }\n\n\t // This code is unreachable.\n\t // if (!lexStates[parseState]) {\n\t // throw invalidLexState(parseState)\n\t // }\n\n\t return lexStates[parseState]()\n\t },\n\n\t comment: function comment () {\n\t switch (c) {\n\t case '*':\n\t read();\n\t lexState = 'multiLineComment';\n\t return\n\n\t case '/':\n\t read();\n\t lexState = 'singleLineComment';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t multiLineComment: function multiLineComment () {\n\t switch (c) {\n\t case '*':\n\t read();\n\t lexState = 'multiLineCommentAsterisk';\n\t return\n\n\t case undefined:\n\t throw invalidChar(read())\n\t }\n\n\t read();\n\t },\n\n\t multiLineCommentAsterisk: function multiLineCommentAsterisk () {\n\t switch (c) {\n\t case '*':\n\t read();\n\t return\n\n\t case '/':\n\t read();\n\t lexState = 'default';\n\t return\n\n\t case undefined:\n\t throw invalidChar(read())\n\t }\n\n\t read();\n\t lexState = 'multiLineComment';\n\t },\n\n\t singleLineComment: function singleLineComment () {\n\t switch (c) {\n\t case '\\n':\n\t case '\\r':\n\t case '\\u2028':\n\t case '\\u2029':\n\t read();\n\t lexState = 'default';\n\t return\n\n\t case undefined:\n\t read();\n\t return newToken('eof')\n\t }\n\n\t read();\n\t },\n\n\t value: function value () {\n\t switch (c) {\n\t case '{':\n\t case '[':\n\t return newToken('punctuator', read())\n\n\t case 'n':\n\t read();\n\t literal('ull');\n\t return newToken('null', null)\n\n\t case 't':\n\t read();\n\t literal('rue');\n\t return newToken('boolean', true)\n\n\t case 'f':\n\t read();\n\t literal('alse');\n\t return newToken('boolean', false)\n\n\t case '-':\n\t case '+':\n\t if (read() === '-') {\n\t sign = -1;\n\t }\n\n\t lexState = 'sign';\n\t return\n\n\t case '.':\n\t buffer = read();\n\t lexState = 'decimalPointLeading';\n\t return\n\n\t case '0':\n\t buffer = read();\n\t lexState = 'zero';\n\t return\n\n\t case '1':\n\t case '2':\n\t case '3':\n\t case '4':\n\t case '5':\n\t case '6':\n\t case '7':\n\t case '8':\n\t case '9':\n\t buffer = read();\n\t lexState = 'decimalInteger';\n\t return\n\n\t case 'I':\n\t read();\n\t literal('nfinity');\n\t return newToken('numeric', Infinity)\n\n\t case 'N':\n\t read();\n\t literal('aN');\n\t return newToken('numeric', NaN)\n\n\t case '\"':\n\t case \"'\":\n\t doubleQuote = (read() === '\"');\n\t buffer = '';\n\t lexState = 'string';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t identifierNameStartEscape: function identifierNameStartEscape () {\n\t if (c !== 'u') {\n\t throw invalidChar(read())\n\t }\n\n\t read();\n\t var u = unicodeEscape();\n\t switch (u) {\n\t case '$':\n\t case '_':\n\t break\n\n\t default:\n\t if (!util.isIdStartChar(u)) {\n\t throw invalidIdentifier()\n\t }\n\n\t break\n\t }\n\n\t buffer += u;\n\t lexState = 'identifierName';\n\t },\n\n\t identifierName: function identifierName () {\n\t switch (c) {\n\t case '$':\n\t case '_':\n\t case '\\u200C':\n\t case '\\u200D':\n\t buffer += read();\n\t return\n\n\t case '\\\\':\n\t read();\n\t lexState = 'identifierNameEscape';\n\t return\n\t }\n\n\t if (util.isIdContinueChar(c)) {\n\t buffer += read();\n\t return\n\t }\n\n\t return newToken('identifier', buffer)\n\t },\n\n\t identifierNameEscape: function identifierNameEscape () {\n\t if (c !== 'u') {\n\t throw invalidChar(read())\n\t }\n\n\t read();\n\t var u = unicodeEscape();\n\t switch (u) {\n\t case '$':\n\t case '_':\n\t case '\\u200C':\n\t case '\\u200D':\n\t break\n\n\t default:\n\t if (!util.isIdContinueChar(u)) {\n\t throw invalidIdentifier()\n\t }\n\n\t break\n\t }\n\n\t buffer += u;\n\t lexState = 'identifierName';\n\t },\n\n\t sign: function sign$1 () {\n\t switch (c) {\n\t case '.':\n\t buffer = read();\n\t lexState = 'decimalPointLeading';\n\t return\n\n\t case '0':\n\t buffer = read();\n\t lexState = 'zero';\n\t return\n\n\t case '1':\n\t case '2':\n\t case '3':\n\t case '4':\n\t case '5':\n\t case '6':\n\t case '7':\n\t case '8':\n\t case '9':\n\t buffer = read();\n\t lexState = 'decimalInteger';\n\t return\n\n\t case 'I':\n\t read();\n\t literal('nfinity');\n\t return newToken('numeric', sign * Infinity)\n\n\t case 'N':\n\t read();\n\t literal('aN');\n\t return newToken('numeric', NaN)\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t zero: function zero () {\n\t switch (c) {\n\t case '.':\n\t buffer += read();\n\t lexState = 'decimalPoint';\n\t return\n\n\t case 'e':\n\t case 'E':\n\t buffer += read();\n\t lexState = 'decimalExponent';\n\t return\n\n\t case 'x':\n\t case 'X':\n\t buffer += read();\n\t lexState = 'hexadecimal';\n\t return\n\t }\n\n\t return newToken('numeric', sign * 0)\n\t },\n\n\t decimalInteger: function decimalInteger () {\n\t switch (c) {\n\t case '.':\n\t buffer += read();\n\t lexState = 'decimalPoint';\n\t return\n\n\t case 'e':\n\t case 'E':\n\t buffer += read();\n\t lexState = 'decimalExponent';\n\t return\n\t }\n\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t return\n\t }\n\n\t return newToken('numeric', sign * Number(buffer))\n\t },\n\n\t decimalPointLeading: function decimalPointLeading () {\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t lexState = 'decimalFraction';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t decimalPoint: function decimalPoint () {\n\t switch (c) {\n\t case 'e':\n\t case 'E':\n\t buffer += read();\n\t lexState = 'decimalExponent';\n\t return\n\t }\n\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t lexState = 'decimalFraction';\n\t return\n\t }\n\n\t return newToken('numeric', sign * Number(buffer))\n\t },\n\n\t decimalFraction: function decimalFraction () {\n\t switch (c) {\n\t case 'e':\n\t case 'E':\n\t buffer += read();\n\t lexState = 'decimalExponent';\n\t return\n\t }\n\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t return\n\t }\n\n\t return newToken('numeric', sign * Number(buffer))\n\t },\n\n\t decimalExponent: function decimalExponent () {\n\t switch (c) {\n\t case '+':\n\t case '-':\n\t buffer += read();\n\t lexState = 'decimalExponentSign';\n\t return\n\t }\n\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t lexState = 'decimalExponentInteger';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t decimalExponentSign: function decimalExponentSign () {\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t lexState = 'decimalExponentInteger';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t decimalExponentInteger: function decimalExponentInteger () {\n\t if (util.isDigit(c)) {\n\t buffer += read();\n\t return\n\t }\n\n\t return newToken('numeric', sign * Number(buffer))\n\t },\n\n\t hexadecimal: function hexadecimal () {\n\t if (util.isHexDigit(c)) {\n\t buffer += read();\n\t lexState = 'hexadecimalInteger';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t hexadecimalInteger: function hexadecimalInteger () {\n\t if (util.isHexDigit(c)) {\n\t buffer += read();\n\t return\n\t }\n\n\t return newToken('numeric', sign * Number(buffer))\n\t },\n\n\t string: function string () {\n\t switch (c) {\n\t case '\\\\':\n\t read();\n\t buffer += escape();\n\t return\n\n\t case '\"':\n\t if (doubleQuote) {\n\t read();\n\t return newToken('string', buffer)\n\t }\n\n\t buffer += read();\n\t return\n\n\t case \"'\":\n\t if (!doubleQuote) {\n\t read();\n\t return newToken('string', buffer)\n\t }\n\n\t buffer += read();\n\t return\n\n\t case '\\n':\n\t case '\\r':\n\t throw invalidChar(read())\n\n\t case '\\u2028':\n\t case '\\u2029':\n\t separatorChar(c);\n\t break\n\n\t case undefined:\n\t throw invalidChar(read())\n\t }\n\n\t buffer += read();\n\t },\n\n\t start: function start () {\n\t switch (c) {\n\t case '{':\n\t case '[':\n\t return newToken('punctuator', read())\n\n\t // This code is unreachable since the default lexState handles eof.\n\t // case undefined:\n\t // return newToken('eof')\n\t }\n\n\t lexState = 'value';\n\t },\n\n\t beforePropertyName: function beforePropertyName () {\n\t switch (c) {\n\t case '$':\n\t case '_':\n\t buffer = read();\n\t lexState = 'identifierName';\n\t return\n\n\t case '\\\\':\n\t read();\n\t lexState = 'identifierNameStartEscape';\n\t return\n\n\t case '}':\n\t return newToken('punctuator', read())\n\n\t case '\"':\n\t case \"'\":\n\t doubleQuote = (read() === '\"');\n\t lexState = 'string';\n\t return\n\t }\n\n\t if (util.isIdStartChar(c)) {\n\t buffer += read();\n\t lexState = 'identifierName';\n\t return\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t afterPropertyName: function afterPropertyName () {\n\t if (c === ':') {\n\t return newToken('punctuator', read())\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t beforePropertyValue: function beforePropertyValue () {\n\t lexState = 'value';\n\t },\n\n\t afterPropertyValue: function afterPropertyValue () {\n\t switch (c) {\n\t case ',':\n\t case '}':\n\t return newToken('punctuator', read())\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t beforeArrayValue: function beforeArrayValue () {\n\t if (c === ']') {\n\t return newToken('punctuator', read())\n\t }\n\n\t lexState = 'value';\n\t },\n\n\t afterArrayValue: function afterArrayValue () {\n\t switch (c) {\n\t case ',':\n\t case ']':\n\t return newToken('punctuator', read())\n\t }\n\n\t throw invalidChar(read())\n\t },\n\n\t end: function end () {\n\t // This code is unreachable since it's handled by the default lexState.\n\t // if (c === undefined) {\n\t // read()\n\t // return newToken('eof')\n\t // }\n\n\t throw invalidChar(read())\n\t },\n\t};\n\n\tfunction newToken (type, value) {\n\t return {\n\t type: type,\n\t value: value,\n\t line: line,\n\t column: column,\n\t }\n\t}\n\n\tfunction literal (s) {\n\t for (var i = 0, list = s; i < list.length; i += 1) {\n\t var c = list[i];\n\n\t var p = peek();\n\n\t if (p !== c) {\n\t throw invalidChar(read())\n\t }\n\n\t read();\n\t }\n\t}\n\n\tfunction escape () {\n\t var c = peek();\n\t switch (c) {\n\t case 'b':\n\t read();\n\t return '\\b'\n\n\t case 'f':\n\t read();\n\t return '\\f'\n\n\t case 'n':\n\t read();\n\t return '\\n'\n\n\t case 'r':\n\t read();\n\t return '\\r'\n\n\t case 't':\n\t read();\n\t return '\\t'\n\n\t case 'v':\n\t read();\n\t return '\\v'\n\n\t case '0':\n\t read();\n\t if (util.isDigit(peek())) {\n\t throw invalidChar(read())\n\t }\n\n\t return '\\0'\n\n\t case 'x':\n\t read();\n\t return hexEscape()\n\n\t case 'u':\n\t read();\n\t return unicodeEscape()\n\n\t case '\\n':\n\t case '\\u2028':\n\t case '\\u2029':\n\t read();\n\t return ''\n\n\t case '\\r':\n\t read();\n\t if (peek() === '\\n') {\n\t read();\n\t }\n\n\t return ''\n\n\t case '1':\n\t case '2':\n\t case '3':\n\t case '4':\n\t case '5':\n\t case '6':\n\t case '7':\n\t case '8':\n\t case '9':\n\t throw invalidChar(read())\n\n\t case undefined:\n\t throw invalidChar(read())\n\t }\n\n\t return read()\n\t}\n\n\tfunction hexEscape () {\n\t var buffer = '';\n\t var c = peek();\n\n\t if (!util.isHexDigit(c)) {\n\t throw invalidChar(read())\n\t }\n\n\t buffer += read();\n\n\t c = peek();\n\t if (!util.isHexDigit(c)) {\n\t throw invalidChar(read())\n\t }\n\n\t buffer += read();\n\n\t return String.fromCodePoint(parseInt(buffer, 16))\n\t}\n\n\tfunction unicodeEscape () {\n\t var buffer = '';\n\t var count = 4;\n\n\t while (count-- > 0) {\n\t var c = peek();\n\t if (!util.isHexDigit(c)) {\n\t throw invalidChar(read())\n\t }\n\n\t buffer += read();\n\t }\n\n\t return String.fromCodePoint(parseInt(buffer, 16))\n\t}\n\n\tvar parseStates = {\n\t start: function start () {\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t push();\n\t },\n\n\t beforePropertyName: function beforePropertyName () {\n\t switch (token.type) {\n\t case 'identifier':\n\t case 'string':\n\t key = token.value;\n\t parseState = 'afterPropertyName';\n\t return\n\n\t case 'punctuator':\n\t // This code is unreachable since it's handled by the lexState.\n\t // if (token.value !== '}') {\n\t // throw invalidToken()\n\t // }\n\n\t pop();\n\t return\n\n\t case 'eof':\n\t throw invalidEOF()\n\t }\n\n\t // This code is unreachable since it's handled by the lexState.\n\t // throw invalidToken()\n\t },\n\n\t afterPropertyName: function afterPropertyName () {\n\t // This code is unreachable since it's handled by the lexState.\n\t // if (token.type !== 'punctuator' || token.value !== ':') {\n\t // throw invalidToken()\n\t // }\n\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t parseState = 'beforePropertyValue';\n\t },\n\n\t beforePropertyValue: function beforePropertyValue () {\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t push();\n\t },\n\n\t beforeArrayValue: function beforeArrayValue () {\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t if (token.type === 'punctuator' && token.value === ']') {\n\t pop();\n\t return\n\t }\n\n\t push();\n\t },\n\n\t afterPropertyValue: function afterPropertyValue () {\n\t // This code is unreachable since it's handled by the lexState.\n\t // if (token.type !== 'punctuator') {\n\t // throw invalidToken()\n\t // }\n\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t switch (token.value) {\n\t case ',':\n\t parseState = 'beforePropertyName';\n\t return\n\n\t case '}':\n\t pop();\n\t }\n\n\t // This code is unreachable since it's handled by the lexState.\n\t // throw invalidToken()\n\t },\n\n\t afterArrayValue: function afterArrayValue () {\n\t // This code is unreachable since it's handled by the lexState.\n\t // if (token.type !== 'punctuator') {\n\t // throw invalidToken()\n\t // }\n\n\t if (token.type === 'eof') {\n\t throw invalidEOF()\n\t }\n\n\t switch (token.value) {\n\t case ',':\n\t parseState = 'beforeArrayValue';\n\t return\n\n\t case ']':\n\t pop();\n\t }\n\n\t // This code is unreachable since it's handled by the lexState.\n\t // throw invalidToken()\n\t },\n\n\t end: function end () {\n\t // This code is unreachable since it's handled by the lexState.\n\t // if (token.type !== 'eof') {\n\t // throw invalidToken()\n\t // }\n\t },\n\t};\n\n\tfunction push () {\n\t var value;\n\n\t switch (token.type) {\n\t case 'punctuator':\n\t switch (token.value) {\n\t case '{':\n\t value = {};\n\t break\n\n\t case '[':\n\t value = [];\n\t break\n\t }\n\n\t break\n\n\t case 'null':\n\t case 'boolean':\n\t case 'numeric':\n\t case 'string':\n\t value = token.value;\n\t break\n\n\t // This code is unreachable.\n\t // default:\n\t // throw invalidToken()\n\t }\n\n\t if (root === undefined) {\n\t root = value;\n\t } else {\n\t var parent = stack[stack.length - 1];\n\t if (Array.isArray(parent)) {\n\t parent.push(value);\n\t } else {\n\t Object.defineProperty(parent, key, {\n\t value: value,\n\t writable: true,\n\t enumerable: true,\n\t configurable: true,\n\t });\n\t }\n\t }\n\n\t if (value !== null && typeof value === 'object') {\n\t stack.push(value);\n\n\t if (Array.isArray(value)) {\n\t parseState = 'beforeArrayValue';\n\t } else {\n\t parseState = 'beforePropertyName';\n\t }\n\t } else {\n\t var current = stack[stack.length - 1];\n\t if (current == null) {\n\t parseState = 'end';\n\t } else if (Array.isArray(current)) {\n\t parseState = 'afterArrayValue';\n\t } else {\n\t parseState = 'afterPropertyValue';\n\t }\n\t }\n\t}\n\n\tfunction pop () {\n\t stack.pop();\n\n\t var current = stack[stack.length - 1];\n\t if (current == null) {\n\t parseState = 'end';\n\t } else if (Array.isArray(current)) {\n\t parseState = 'afterArrayValue';\n\t } else {\n\t parseState = 'afterPropertyValue';\n\t }\n\t}\n\n\t// This code is unreachable.\n\t// function invalidParseState () {\n\t// return new Error(`JSON5: invalid parse state '${parseState}'`)\n\t// }\n\n\t// This code is unreachable.\n\t// function invalidLexState (state) {\n\t// return new Error(`JSON5: invalid lex state '${state}'`)\n\t// }\n\n\tfunction invalidChar (c) {\n\t if (c === undefined) {\n\t return syntaxError((\"JSON5: invalid end of input at \" + line + \":\" + column))\n\t }\n\n\t return syntaxError((\"JSON5: invalid character '\" + (formatChar(c)) + \"' at \" + line + \":\" + column))\n\t}\n\n\tfunction invalidEOF () {\n\t return syntaxError((\"JSON5: invalid end of input at \" + line + \":\" + column))\n\t}\n\n\t// This code is unreachable.\n\t// function invalidToken () {\n\t// if (token.type === 'eof') {\n\t// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n\t// }\n\n\t// const c = String.fromCodePoint(token.value.codePointAt(0))\n\t// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n\t// }\n\n\tfunction invalidIdentifier () {\n\t column -= 5;\n\t return syntaxError((\"JSON5: invalid identifier character at \" + line + \":\" + column))\n\t}\n\n\tfunction separatorChar (c) {\n\t console.warn((\"JSON5: '\" + (formatChar(c)) + \"' in strings is not valid ECMAScript; consider escaping\"));\n\t}\n\n\tfunction formatChar (c) {\n\t var replacements = {\n\t \"'\": \"\\\\'\",\n\t '\"': '\\\\\"',\n\t '\\\\': '\\\\\\\\',\n\t '\\b': '\\\\b',\n\t '\\f': '\\\\f',\n\t '\\n': '\\\\n',\n\t '\\r': '\\\\r',\n\t '\\t': '\\\\t',\n\t '\\v': '\\\\v',\n\t '\\0': '\\\\0',\n\t '\\u2028': '\\\\u2028',\n\t '\\u2029': '\\\\u2029',\n\t };\n\n\t if (replacements[c]) {\n\t return replacements[c]\n\t }\n\n\t if (c < ' ') {\n\t var hexString = c.charCodeAt(0).toString(16);\n\t return '\\\\x' + ('00' + hexString).substring(hexString.length)\n\t }\n\n\t return c\n\t}\n\n\tfunction syntaxError (message) {\n\t var err = new SyntaxError(message);\n\t err.lineNumber = line;\n\t err.columnNumber = column;\n\t return err\n\t}\n\n\tvar stringify = function stringify (value, replacer, space) {\n\t var stack = [];\n\t var indent = '';\n\t var propertyList;\n\t var replacerFunc;\n\t var gap = '';\n\t var quote;\n\n\t if (\n\t replacer != null &&\n\t typeof replacer === 'object' &&\n\t !Array.isArray(replacer)\n\t ) {\n\t space = replacer.space;\n\t quote = replacer.quote;\n\t replacer = replacer.replacer;\n\t }\n\n\t if (typeof replacer === 'function') {\n\t replacerFunc = replacer;\n\t } else if (Array.isArray(replacer)) {\n\t propertyList = [];\n\t for (var i = 0, list = replacer; i < list.length; i += 1) {\n\t var v = list[i];\n\n\t var item = (void 0);\n\n\t if (typeof v === 'string') {\n\t item = v;\n\t } else if (\n\t typeof v === 'number' ||\n\t v instanceof String ||\n\t v instanceof Number\n\t ) {\n\t item = String(v);\n\t }\n\n\t if (item !== undefined && propertyList.indexOf(item) < 0) {\n\t propertyList.push(item);\n\t }\n\t }\n\t }\n\n\t if (space instanceof Number) {\n\t space = Number(space);\n\t } else if (space instanceof String) {\n\t space = String(space);\n\t }\n\n\t if (typeof space === 'number') {\n\t if (space > 0) {\n\t space = Math.min(10, Math.floor(space));\n\t gap = ' '.substr(0, space);\n\t }\n\t } else if (typeof space === 'string') {\n\t gap = space.substr(0, 10);\n\t }\n\n\t return serializeProperty('', {'': value})\n\n\t function serializeProperty (key, holder) {\n\t var value = holder[key];\n\t if (value != null) {\n\t if (typeof value.toJSON5 === 'function') {\n\t value = value.toJSON5(key);\n\t } else if (typeof value.toJSON === 'function') {\n\t value = value.toJSON(key);\n\t }\n\t }\n\n\t if (replacerFunc) {\n\t value = replacerFunc.call(holder, key, value);\n\t }\n\n\t if (value instanceof Number) {\n\t value = Number(value);\n\t } else if (value instanceof String) {\n\t value = String(value);\n\t } else if (value instanceof Boolean) {\n\t value = value.valueOf();\n\t }\n\n\t switch (value) {\n\t case null: return 'null'\n\t case true: return 'true'\n\t case false: return 'false'\n\t }\n\n\t if (typeof value === 'string') {\n\t return quoteString(value, false)\n\t }\n\n\t if (typeof value === 'number') {\n\t return String(value)\n\t }\n\n\t if (typeof value === 'object') {\n\t return Array.isArray(value) ? serializeArray(value) : serializeObject(value)\n\t }\n\n\t return undefined\n\t }\n\n\t function quoteString (value) {\n\t var quotes = {\n\t \"'\": 0.1,\n\t '\"': 0.2,\n\t };\n\n\t var replacements = {\n\t \"'\": \"\\\\'\",\n\t '\"': '\\\\\"',\n\t '\\\\': '\\\\\\\\',\n\t '\\b': '\\\\b',\n\t '\\f': '\\\\f',\n\t '\\n': '\\\\n',\n\t '\\r': '\\\\r',\n\t '\\t': '\\\\t',\n\t '\\v': '\\\\v',\n\t '\\0': '\\\\0',\n\t '\\u2028': '\\\\u2028',\n\t '\\u2029': '\\\\u2029',\n\t };\n\n\t var product = '';\n\n\t for (var i = 0; i < value.length; i++) {\n\t var c = value[i];\n\t switch (c) {\n\t case \"'\":\n\t case '\"':\n\t quotes[c]++;\n\t product += c;\n\t continue\n\n\t case '\\0':\n\t if (util.isDigit(value[i + 1])) {\n\t product += '\\\\x00';\n\t continue\n\t }\n\t }\n\n\t if (replacements[c]) {\n\t product += replacements[c];\n\t continue\n\t }\n\n\t if (c < ' ') {\n\t var hexString = c.charCodeAt(0).toString(16);\n\t product += '\\\\x' + ('00' + hexString).substring(hexString.length);\n\t continue\n\t }\n\n\t product += c;\n\t }\n\n\t var quoteChar = quote || Object.keys(quotes).reduce(function (a, b) { return (quotes[a] < quotes[b]) ? a : b; });\n\n\t product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);\n\n\t return quoteChar + product + quoteChar\n\t }\n\n\t function serializeObject (value) {\n\t if (stack.indexOf(value) >= 0) {\n\t throw TypeError('Converting circular structure to JSON5')\n\t }\n\n\t stack.push(value);\n\n\t var stepback = indent;\n\t indent = indent + gap;\n\n\t var keys = propertyList || Object.keys(value);\n\t var partial = [];\n\t for (var i = 0, list = keys; i < list.length; i += 1) {\n\t var key = list[i];\n\n\t var propertyString = serializeProperty(key, value);\n\t if (propertyString !== undefined) {\n\t var member = serializeKey(key) + ':';\n\t if (gap !== '') {\n\t member += ' ';\n\t }\n\t member += propertyString;\n\t partial.push(member);\n\t }\n\t }\n\n\t var final;\n\t if (partial.length === 0) {\n\t final = '{}';\n\t } else {\n\t var properties;\n\t if (gap === '') {\n\t properties = partial.join(',');\n\t final = '{' + properties + '}';\n\t } else {\n\t var separator = ',\\n' + indent;\n\t properties = partial.join(separator);\n\t final = '{\\n' + indent + properties + ',\\n' + stepback + '}';\n\t }\n\t }\n\n\t stack.pop();\n\t indent = stepback;\n\t return final\n\t }\n\n\t function serializeKey (key) {\n\t if (key.length === 0) {\n\t return quoteString(key, true)\n\t }\n\n\t var firstChar = String.fromCodePoint(key.codePointAt(0));\n\t if (!util.isIdStartChar(firstChar)) {\n\t return quoteString(key, true)\n\t }\n\n\t for (var i = firstChar.length; i < key.length; i++) {\n\t if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {\n\t return quoteString(key, true)\n\t }\n\t }\n\n\t return key\n\t }\n\n\t function serializeArray (value) {\n\t if (stack.indexOf(value) >= 0) {\n\t throw TypeError('Converting circular structure to JSON5')\n\t }\n\n\t stack.push(value);\n\n\t var stepback = indent;\n\t indent = indent + gap;\n\n\t var partial = [];\n\t for (var i = 0; i < value.length; i++) {\n\t var propertyString = serializeProperty(String(i), value);\n\t partial.push((propertyString !== undefined) ? propertyString : 'null');\n\t }\n\n\t var final;\n\t if (partial.length === 0) {\n\t final = '[]';\n\t } else {\n\t if (gap === '') {\n\t var properties = partial.join(',');\n\t final = '[' + properties + ']';\n\t } else {\n\t var separator = ',\\n' + indent;\n\t var properties$1 = partial.join(separator);\n\t final = '[\\n' + indent + properties$1 + ',\\n' + stepback + ']';\n\t }\n\t }\n\n\t stack.pop();\n\t indent = stepback;\n\t return final\n\t }\n\t};\n\n\tvar JSON5 = {\n\t parse: parse,\n\t stringify: stringify,\n\t};\n\n\tvar lib = JSON5;\n\n\tvar es5 = lib;\n\n\treturn es5;\n\n})));\n","import type { ComponentSchema } from '../types'\r\n\r\n/**\r\n * 组件注册中心,用于管理自定义组件的 schema。\r\n * 每个容器组件(如 :::linkCard)在此注册其可编辑字段。\r\n * 内置版本计数 + 订阅:注册/移除后通知监听方(如编辑器工具栏)刷新。\r\n */\r\ntype Listener = (version: number) => void\r\n\r\nclass ComponentRegistry {\r\n private schemas = new Map<string, ComponentSchema>()\r\n private listeners = new Set<Listener>()\r\n private version = 0\r\n\r\n /**\r\n * 注册组件 schema\r\n */\r\n register(name: string, schema: ComponentSchema): void {\r\n this.schemas.set(name, schema)\r\n this.emit()\r\n }\r\n\r\n /**\r\n * 移除组件注册\r\n */\r\n unregister(name: string): void {\r\n if (this.schemas.delete(name)) {\r\n this.emit()\r\n }\r\n }\r\n\r\n /**\r\n * 当前版本号,任意注册变更都会自增\r\n */\r\n getVersion(): number {\r\n return this.version\r\n }\r\n\r\n /**\r\n * 订阅注册变更,返回退订函数\r\n */\r\n subscribe(listener: Listener): () => void {\r\n this.listeners.add(listener)\r\n return () => {\r\n this.listeners.delete(listener)\r\n }\r\n }\r\n\r\n private emit(): void {\r\n this.version += 1\r\n this.listeners.forEach((listener) => listener(this.version))\r\n }\r\n\r\n /**\r\n * 根据组件名获取已注册的 schema\r\n */\r\n get(name: string): ComponentSchema | undefined {\r\n return this.schemas.get(name)\r\n }\r\n\r\n /**\r\n * 检查组件类型是否已注册\r\n */\r\n has(name: string): boolean {\r\n return this.schemas.has(name)\r\n }\r\n\r\n /**\r\n * 获取所有已注册的组件名\r\n */\r\n getAllNames(): string[] {\r\n return Array.from(this.schemas.keys())\r\n }\r\n\r\n /**\r\n * 获取所有已注册的 schema\r\n */\r\n getAll(): ComponentSchema[] {\r\n return Array.from(this.schemas.values())\r\n }\r\n}\r\n\r\n// 单例实例\r\nconst componentRegistry = new ComponentRegistry()\r\n\r\nexport default componentRegistry","import JSON5 from 'json5'\r\nimport componentRegistry from '../registry/componentRegistry'\r\n\r\n/** 容器属性对象:值保留原始类型(string/number/boolean),写回时统一序列化 */\r\nexport type ContainerProps = Record<string, string | number | boolean>\r\n\r\n/**\r\n * 解析容器属性行。\r\n * 优先按 JSON5 解析(兼容标准 JSON 与 { key: 'value' } 宽松写法),\r\n * 失败时返回空对象,保证往返编辑不丢数据。\r\n */\r\nexport function parseContainerProps(line: string): ContainerProps {\r\n const trimmed = line.trim()\r\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) return {}\r\n try {\r\n const parsed: unknown = JSON5.parse(trimmed)\r\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return {}\r\n const props: ContainerProps = {}\r\n for (const [key, value] of Object.entries(parsed as Record<string, unknown>)) {\r\n if (value === null || value === undefined) continue\r\n if (typeof value === 'object') continue\r\n props[key] = value as string | number | boolean\r\n }\r\n return props\r\n } catch {\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * 容器块位置信息(基于文档的绝对字符偏移)\r\n */\r\nexport interface ContainerBlock {\r\n /** ::: 打开行行首位置 */\r\n startPos: number\r\n /** 组件类型名称 (如 \"linkCard\") */\r\n typeName: string\r\n /** 属性行起始位置(0 表示无属性行) */\r\n propsLineFrom: number\r\n /** 属性行结束位置(0 表示无属性行) */\r\n propsLineTo: number\r\n /** 解析出的属性 */\r\n props: ContainerProps\r\n /** ::: 关闭行行首位置(0 表示未闭合) */\r\n endPos: number\r\n /** 类型是否已在注册中心登记(未登记的仅装饰、不可编辑) */\r\n registered: boolean\r\n}\r\n\r\n/**\r\n * 在编辑器文档中查找容器块。\r\n * 单次遍历 + 预累计行偏移,复杂度 O(行数)。\r\n */\r\nexport function findContainers(docText: string): ContainerBlock[] {\r\n const containers: ContainerBlock[] = []\r\n const lines = docText.split('\\n')\r\n\r\n // 每行行首的绝对偏移,offsets[i] = 前 i 行总长 + i 个换行符\r\n const offsets: number[] = new Array(lines.length)\r\n let pos = 0\r\n for (let i = 0; i < lines.length; i++) {\r\n offsets[i] = pos\r\n pos += lines[i].length + 1\r\n }\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const match = lines[i].match(/^:::(\\w+)$/)\r\n if (!match) continue\r\n const typeName = match[1]\r\n // 先固定头行位置:下方闭合搜索会把 i 改为闭合行下标,不能再依赖 i\r\n const headerPos = offsets[i]\r\n\r\n // 属性行:打开行之后以 { 开头的行\r\n let props: ContainerProps = {}\r\n let propsLineFrom = 0\r\n let propsLineTo = 0\r\n const propsLine = lines[i + 1]\r\n if (propsLine && propsLine.trim().startsWith('{') && propsLine.trim().endsWith('}')) {\r\n props = parseContainerProps(propsLine)\r\n propsLineFrom = offsets[i + 1]\r\n propsLineTo = propsLineFrom + propsLine.length\r\n }\r\n\r\n // 查找闭合 :::\r\n let endPos = 0\r\n for (let j = i + 1; j < lines.length; j++) {\r\n if (lines[j].trim() === ':::') {\r\n endPos = offsets[j]\r\n i = j\r\n break\r\n }\r\n }\r\n\r\n containers.push({\r\n startPos: headerPos,\r\n typeName,\r\n propsLineFrom,\r\n propsLineTo,\r\n props,\r\n endPos,\r\n registered: componentRegistry.has(typeName),\r\n })\r\n }\r\n\r\n return containers\r\n}\r\n","import { ViewPlugin, Decoration, WidgetType, EditorView } from '@codemirror/view'\r\nimport type { DecorationSet } from '@codemirror/view'\r\nimport { EditorState, Facet } from '@codemirror/state'\r\nimport { findContainers } from '../../utils/parseContainer'\r\nimport type { ContainerBlock } from '../../utils/parseContainer'\r\n\r\n/**\r\n * 编辑容器属性的回调函数类型\r\n * @param view 当前编辑器实例\r\n * @param container 被点击编辑的容器块(含位置与最新属性)\r\n */\r\nexport type OnEditContainer = (view: EditorView, container: ContainerBlock) => void\r\n\r\n/**\r\n * 自定义 facet 用于传递编辑回调\r\n */\r\nexport const containerEditCallback = Facet.define<OnEditContainer, OnEditContainer | null>({\r\n combine: (values) => (values.length ? values[values.length - 1] : null),\r\n})\r\n\r\n/**\r\n * 只读的容器头行 Widget(显示 :::typeName + 编辑按钮)\r\n * 使用 Decoration.replace 替换原始文本,使其不可直接编辑。\r\n * widget 直接携带所属容器索引与类型,点击时无需再做位置猜测。\r\n */\r\nclass ContainerHeaderWidget extends WidgetType {\r\n constructor(\r\n private typeName: string,\r\n private containerIndex: number,\r\n private registered: boolean\r\n ) {\r\n super()\r\n }\r\n\r\n toDOM(): HTMLElement {\r\n const container = document.createElement('span')\r\n container.className = 'container-widget-header'\r\n\r\n const text = document.createElement('span')\r\n text.className = 'container-widget-text'\r\n text.textContent = `:::${this.typeName}`\r\n container.appendChild(text)\r\n\r\n // 仅已注册的类型提供编辑入口,未注册容器(如 :::note)保持只读展示\r\n if (this.registered) {\r\n const button = document.createElement('button')\r\n button.className = 'container-edit-btn'\r\n button.title = `编辑 ${this.typeName}`\r\n button.textContent = '✎'\r\n button.dataset.containerIndex = String(this.containerIndex)\r\n button.dataset.typeName = this.typeName\r\n container.appendChild(button)\r\n }\r\n return container\r\n }\r\n\r\n eq(other: ContainerHeaderWidget): boolean {\r\n return (\r\n this.typeName === other.typeName &&\r\n this.containerIndex === other.containerIndex &&\r\n this.registered === other.registered\r\n )\r\n }\r\n\r\n ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 只读的容器属性行 Widget(显示 { key: value, ... })\r\n */\r\nclass ContainerPropsWidget extends WidgetType {\r\n constructor(private propsText: string) {\r\n super()\r\n }\r\n\r\n toDOM(): HTMLElement {\r\n const span = document.createElement('span')\r\n span.className = 'container-widget-props'\r\n span.textContent = this.propsText\r\n return span\r\n }\r\n\r\n eq(other: ContainerPropsWidget): boolean {\r\n return this.propsText === other.propsText\r\n }\r\n\r\n ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 只读的容器结束行 Widget(显示 :::)\r\n */\r\nclass ContainerCloseWidget extends WidgetType {\r\n toDOM(): HTMLElement {\r\n const span = document.createElement('span')\r\n span.className = 'container-widget-text'\r\n span.textContent = ':::'\r\n return span\r\n }\r\n\r\n eq(): boolean {\r\n return true\r\n }\r\n\r\n ignoreEvent(): boolean {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * 查找文档中的容器,创建 Decoration 装饰物\r\n * 将 ::: 头行、{} 属性行和 ::: 结束行替换为只读 widget,使其无法在编辑器中直接编辑\r\n */\r\nfunction findContainerDecorations(state: EditorState): Array<{ from: number; to: number; value: Decoration }> {\r\n const containers = findContainers(state.doc.toString())\r\n const decorations: Array<{ from: number; to: number; value: Decoration }> = []\r\n\r\n containers.forEach((container, index) => {\r\n const headerLine = state.doc.lineAt(container.startPos)\r\n\r\n // 替换 :::typeName 头行为只读 widget\r\n decorations.push({\r\n from: headerLine.from,\r\n to: headerLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerHeaderWidget(container.typeName, index, container.registered),\r\n }),\r\n })\r\n\r\n // 替换 {} 属性行为只读 widget\r\n if (container.propsLineFrom > 0 && container.propsLineTo > 0) {\r\n const propsLine = state.doc.lineAt(container.propsLineFrom)\r\n decorations.push({\r\n from: propsLine.from,\r\n to: propsLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerPropsWidget(propsLine.text),\r\n }),\r\n })\r\n }\r\n\r\n // 替换 ::: 结束行为只读 widget\r\n if (container.endPos > 0) {\r\n const endLine = state.doc.lineAt(container.endPos)\r\n decorations.push({\r\n from: endLine.from,\r\n to: endLine.to,\r\n value: Decoration.replace({\r\n widget: new ContainerCloseWidget(),\r\n }),\r\n })\r\n }\r\n })\r\n\r\n return decorations\r\n}\r\n\r\n/**\r\n * 点击编辑按钮时,依据按钮携带的容器索引回查最新属性并触发回调\r\n */\r\nfunction handleEditButtonClick(event: MouseEvent, view: EditorView): boolean {\r\n const target = event.target as HTMLElement\r\n if (!target.classList.contains('container-edit-btn')) return false\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n const indexAttr = target.dataset.containerIndex\r\n if (indexAttr === undefined) return false\r\n\r\n const containers = findContainers(view.state.doc.toString())\r\n const container = containers[Number(indexAttr)]\r\n if (!container || !container.registered) return false\r\n\r\n const callback = view.state.facet(containerEditCallback)\r\n if (callback) {\r\n // 传入编辑时的最新属性,避免弹窗保存时使用过期位置\r\n callback(view, { ...container, props: { ...container.props } })\r\n }\r\n return true\r\n}\r\n\r\n/**\r\n * 容器编辑 ViewPlugin\r\n * 将容器的 ::: 头行和 {} 属性行替换为只读 widget,使其无法在编辑器中直接编辑。\r\n * 仅在文档内容变化时重建装饰,光标移动不触发全文扫描。\r\n */\r\nexport const containerWidgetPlugin = ViewPlugin.fromClass(\r\n class {\r\n decorations: DecorationSet\r\n\r\n constructor(view: EditorView) {\r\n this.decorations = Decoration.set(findContainerDecorations(view.state), true)\r\n }\r\n\r\n update(update: { docChanged: boolean; state: EditorState }) {\r\n if (update.docChanged) {\r\n this.decorations = Decoration.set(findContainerDecorations(update.state), true)\r\n }\r\n }\r\n },\r\n {\r\n decorations: (value) => value.decorations,\r\n eventHandlers: {\r\n // 阻止编辑按钮的 mousedown 事件,防止焦点移动\r\n mousedown: (event: MouseEvent, _view: EditorView) => {\r\n const target = event.target as HTMLElement\r\n if (target.classList.contains('container-edit-btn')) {\r\n event.preventDefault()\r\n return true\r\n }\r\n return false\r\n },\r\n // 点击编辑按钮时触发回调\r\n click: handleEditButtonClick,\r\n },\r\n }\r\n)\r\n","import { EditorView } from '@codemirror/view'\r\nimport type { EditorState } from '@codemirror/state'\r\nimport { syntaxTree } from '@codemirror/language'\r\nimport type { SyntaxNode } from '@lezer/common'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\n/**\r\n * 在光标位置插入文本\r\n */\r\nexport function insertAtCursor(view: EditorView, before: string, after: string = '', placeholder: string = ''): void {\r\n const { from, to } = view.state.selection.main\r\n const selectedText = view.state.doc.sliceString(from, to)\r\n const insert = selectedText\r\n ? `${before}${selectedText}${after}`\r\n : `${before}${placeholder}${after}`\r\n view.dispatch({ changes: { from, to, insert } })\r\n if (!selectedText && placeholder) {\r\n view.dispatch({ selection: { anchor: from + before.length } })\r\n }\r\n}\r\n\r\n/**\r\n * 在当前行行首插入文本\r\n */\r\nexport function insertAtLineStart(view: EditorView, text: string): void {\r\n const { from } = view.state.selection.main\r\n const line = view.state.doc.lineAt(from)\r\n view.dispatch({ changes: { from: line.from, to: line.from, insert: text } })\r\n view.dispatch({ selection: { anchor: line.from + text.length } })\r\n}\r\n\r\n/**\r\n * 切换标题:\r\n * - 当前行已是目标级别标题 → 移除行首 # 前缀(变回普通文本)\r\n * - 当前行是其他级别标题 → 替换为目标级别\r\n * - 当前行是普通文本 → 插入目标级别前缀\r\n * @param view - CodeMirror 编辑器实例\r\n * @param level - 标题级别(1-6)\r\n */\r\nexport function toggleHeading(view: EditorView, level: number): void {\r\n const line = view.state.doc.lineAt(view.state.selection.main.from)\r\n const m = line.text.match(/^(\\s*)(#{1,6})(\\s+|\\s*$)/)\r\n const indent = m ? m[1] : ''\r\n const text = '#'.repeat(level) + ' '\r\n if (m && m[2].length === level) {\r\n // 已是目标级别:移除 # 前缀,保留行首缩进\r\n view.dispatch({ changes: { from: line.from, to: line.from + m[0].length, insert: indent } })\r\n } else {\r\n view.dispatch({ changes: { from: line.from, to: m ? line.from + m[0].length : line.from, insert: indent + text } })\r\n view.dispatch({ selection: { anchor: line.from + indent.length + text.length } })\r\n }\r\n}\r\n\r\n/**\r\n * 切换任务列表(checkbox 待办)\r\n * - 支持多行:对选区内每一行应用 `- [ ] `\r\n * - 普通列表项(如 `- 内容`)直接转换为 `- [ ] 内容`\r\n * - 切换:若所有目标行都已是任务项,则移除行首前缀\r\n */\r\nexport function toggleTaskList(view: EditorView): void {\r\n const doc = view.state.doc\r\n const { from, to } = view.state.selection.main\r\n const first = doc.lineAt(from)\r\n const last = doc.lineAt(to)\r\n\r\n const lines: Array<ReturnType<typeof doc.line>> = []\r\n for (let n = first.number; n <= last.number; n++) {\r\n lines.push(doc.line(n))\r\n }\r\n\r\n const taskRe = /^(\\s*)([-*+])\\s\\[( |x)\\]\\s?/\r\n const allTask = lines.every((line) => taskRe.test(line.text))\r\n\r\n const changes: Array<{ from: number; to: number; insert: string }> = []\r\n for (const line of lines) {\r\n const taskMatch = line.text.match(taskRe)\r\n if (taskMatch) {\r\n changes.push({\r\n from: line.from,\r\n to: line.from + taskMatch[0].length,\r\n insert: allTask ? '' : `${taskMatch[1]}${taskMatch[2]} [ ] `,\r\n })\r\n } else {\r\n const bulletMatch = line.text.match(/^(\\s*)([-*+])\\s/)\r\n if (bulletMatch) {\r\n // 普通列表项:把 bullet 后第一个空格替换为 \" [ ] \"\r\n const idx = line.from + bulletMatch[1].length + bulletMatch[2].length\r\n changes.push({ from: idx, to: idx + 1, insert: ' [ ] ' })\r\n } else {\r\n changes.push({ from: line.from, to: line.from, insert: '- [ ] ' })\r\n }\r\n }\r\n }\r\n // 行首插入前缀后,把光标映射到插入内容的后侧(空行场景下默认会落到行首,期望在前缀之后)\r\n const anchor = view.state.changes(changes).mapPos(from, 1)\r\n view.dispatch({ changes, selection: { anchor } })\r\n}\r\n\r\n/**\r\n * 切换行首前缀(支持多行选区)\r\n * - 已是对应前缀的行 → 移除前缀(变回普通文本)\r\n * - 未加前缀的行 → 在行首插入前缀\r\n * @param view - CodeMirror 编辑器实例\r\n * @param pattern - 匹配行首前缀的正则\r\n * @param insertText - 未匹配时插入的前缀文本\r\n */\r\nexport function toggleLinePrefix(view: EditorView, pattern: RegExp, insertText: string): void {\r\n const doc = view.state.doc\r\n const { from, to } = view.state.selection.main\r\n const first = doc.lineAt(from)\r\n const last = doc.lineAt(Math.max(to, from))\r\n\r\n const changes: Array<{ from: number; to: number; insert: string }> = []\r\n for (let n = first.number; n <= last.number; n++) {\r\n const line = doc.line(n)\r\n const m = line.text.match(pattern)\r\n if (m) {\r\n // 已有前缀:移除\r\n changes.push({ from: line.from, to: line.from + m[0].length, insert: '' })\r\n } else {\r\n // 无前缀:行首插入\r\n changes.push({ from: line.from, to: line.from, insert: insertText })\r\n }\r\n }\r\n // 行首插入前缀后,把光标映射到插入内容的后侧(空行场景下默认会落到行首,期望在前缀之后)\r\n const anchor = view.state.changes(changes).mapPos(from, 1)\r\n view.dispatch({ changes, selection: { anchor } })\r\n}\r\n\r\n/** Markdown 列表行:缩进 + 列表标记(无序/有序)+ 空白 */\r\nconst LIST_LINE_RE = /^(\\s*)([-*+]|\\d+\\.)([ \\t]+)/\r\n/** 列表缩进台阶:4 个空格,确保缩进后能被解析为子列表 */\r\nconst LIST_INDENT_WIDTH = 4\r\n\r\ninterface ListLineInfo {\r\n /** 当前缩进宽度 */\r\n indent: number\r\n /** 缩进调整后的宽度 */\r\n nextIndent: number\r\n /** 当前有序列表序号(无序列表为 null) */\r\n order: number | null\r\n /** 缩进调整后的序号 */\r\n nextOrder: number | null\r\n}\r\n\r\n/** 判断位置是否位于代码块内(代码块内不参与列表缩进逻辑) */\r\nfunction isInCodeBlock(state: EditorState, pos: number): boolean {\r\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(pos, 1)\r\n while (node) {\r\n if (node.name === 'FencedCode' || node.name === 'CodeBlock') return true\r\n node = node.parent\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 向上查找同缩进的前一个列表项,返回其序号\r\n * - 跳过更深的子列表行和空行\r\n * - 遇到非列表内容或更浅层列表时结束\r\n */\r\nfunction findPrevSiblingOrder(\r\n state: EditorState,\r\n plans: Map<number, ListLineInfo>,\r\n lineNo: number,\r\n indent: number\r\n): number | null {\r\n const doc = state.doc\r\n for (let n = lineNo - 1; n >= 1; n--) {\r\n const plan = plans.get(n)\r\n if (plan) {\r\n if (plan.nextIndent === indent) return plan.nextOrder\r\n if (plan.nextIndent < indent) return null\r\n continue\r\n }\r\n\r\n const text = doc.line(n).text\r\n if (!text.trim()) continue\r\n const m = text.match(LIST_LINE_RE)\r\n if (!m) return null\r\n const lineIndent = m[1].length\r\n if (lineIndent === indent) {\r\n return /^\\d+\\.$/.test(m[2]) ? parseInt(m[2], 10) : null\r\n }\r\n if (lineIndent < indent) return null\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 计算列表行缩进/反缩进的变更\r\n * - 仅当所有选区行都是列表行时生效,否则返回 null 交给默认缩进行为\r\n * - 有序列表缩进后重新编号,保证新一级子列表从 1 开始\r\n */\r\nfunction planListIndent(\r\n view: EditorView,\r\n direction: 1 | -1\r\n): Array<{ from: number; to: number; insert: string }> | null {\r\n const { state } = view\r\n const doc = state.doc\r\n const plans = new Map<number, ListLineInfo>()\r\n\r\n for (const range of state.selection.ranges) {\r\n const first = doc.lineAt(range.from).number\r\n const last = doc.lineAt(range.to).number\r\n for (let n = first; n <= last; n++) {\r\n if (plans.has(n)) continue\r\n const line = doc.line(n)\r\n if (isInCodeBlock(state, line.from)) return null\r\n const m = line.text.match(LIST_LINE_RE)\r\n if (!m) return null\r\n const indent = m[1].length\r\n plans.set(n, {\r\n indent,\r\n nextIndent: direction === 1 ? indent + LIST_INDENT_WIDTH : Math.max(0, indent - LIST_INDENT_WIDTH),\r\n order: /^\\d+\\.$/.test(m[2]) ? parseInt(m[2], 10) : null,\r\n nextOrder: null,\r\n })\r\n }\r\n }\r\n\r\n if (plans.size === 0) return null\r\n\r\n // 按行号升序计算缩进后的序号\r\n const ordered = [...plans.entries()].sort((a, b) => a[0] - b[0])\r\n for (const [lineNo, info] of ordered) {\r\n if (info.order === null) continue\r\n const prevOrder = findPrevSiblingOrder(state, plans, lineNo, info.nextIndent)\r\n info.nextOrder = prevOrder === null ? 1 : prevOrder + 1\r\n }\r\n\r\n // 每行只替换行首前缀,避免多个变更位置重叠\r\n return ordered.map(([lineNo, info]) => {\r\n const line = doc.line(lineNo)\r\n const m = line.text.match(LIST_LINE_RE)!\r\n const indentChanged = direction === 1 || info.indent > 0\r\n const useNextOrder =\r\n indentChanged && info.order !== null && info.nextOrder !== null && info.order !== info.nextOrder\r\n return {\r\n from: line.from,\r\n to: line.from + m[0].length,\r\n insert: ' '.repeat(info.nextIndent) + (useNextOrder ? `${info.nextOrder}.` : m[2]) + m[3],\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Tab:列表行缩进一级(4 空格)\r\n * - 普通行返回 false,继续走默认缩进\r\n * - 有序列表缩进后重排序号,子列表从 1 开始\r\n */\r\nexport function indentMarkdownList(view: EditorView): boolean {\r\n const changes = planListIndent(view, 1)\r\n if (!changes) return false\r\n view.dispatch({ changes, userEvent: 'input.indent' })\r\n return true\r\n}\r\n\r\n/**\r\n * Shift-Tab:列表行反缩进一级\r\n * - 普通行返回 false,继续走默认缩进\r\n * - 有序列表反缩进后并入上一层并重排序号\r\n */\r\nexport function dedentMarkdownList(view: EditorView): boolean {\r\n const changes = planListIndent(view, -1)\r\n if (!changes) return false\r\n view.dispatch({ changes, userEvent: 'delete.dedent' })\r\n return true\r\n}\r\n\r\n/**\r\n * 上传图片:失败(含网络异常)统一返回 null,不抛错\r\n * @param file - 要上传的文件\r\n * @param uploadConfig - 上传配置\r\n */\r\nexport async function uploadFileToServer(\r\n file: File,\r\n uploadConfig: ImageUploadConfig\r\n): Promise<string | null> {\r\n try {\r\n // 优先使用自定义上传函数\r\n if (uploadConfig.onUploadImage) {\r\n return await uploadConfig.onUploadImage(file)\r\n }\r\n\r\n // 使用 uploadUrl 上传\r\n if (uploadConfig.uploadUrl) {\r\n const formData = new FormData()\r\n formData.append('file', file)\r\n\r\n const response = await fetch(uploadConfig.uploadUrl, {\r\n method: 'POST',\r\n body: formData,\r\n })\r\n\r\n if (!response.ok) return null\r\n\r\n const result: unknown = await response.json()\r\n\r\n // 如果外部提供了 URL 提取回调,使用它\r\n if (uploadConfig.onGetUploadUrl) {\r\n return uploadConfig.onGetUploadUrl(result)\r\n }\r\n\r\n // 默认行为\r\n const path = (result as { data?: { path?: string } })?.data?.path\r\n return path ?? null\r\n }\r\n\r\n return null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * 判断是否配置了图片上传(类型谓词,守卫后可安全访问配置)\r\n */\r\nexport function isUploadConfigured(\r\n uploadConfig?: ImageUploadConfig\r\n): uploadConfig is ImageUploadConfig {\r\n return !!(uploadConfig?.uploadUrl || uploadConfig?.onUploadImage)\r\n}\r\n\r\n/**\r\n * 图片上传:创建隐藏的 file input 触发选择,上传后插入 markdown 图片语法\r\n * @param view - CodeMirror 编辑器实例\r\n * @param uploadConfig - 上传配置(包含 uploadUrl 或 onUploadImage)\r\n */\r\nexport function uploadImage(\r\n view: EditorView,\r\n uploadConfig: ImageUploadConfig\r\n): void {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = 'image/*'\r\n\r\n input.addEventListener('change', async () => {\r\n if (!input.files || input.files.length === 0) return\r\n\r\n const file = input.files[0]\r\n const { from, to } = view.state.selection.main\r\n const selectedText = view.state.doc.sliceString(from, to) || '描述'\r\n\r\n const url = await uploadFileToServer(file, uploadConfig)\r\n if (url) {\r\n const insert = ``\r\n view.dispatch({ changes: { from, to, insert } })\r\n }\r\n\r\n input.remove()\r\n })\r\n\r\n input.click()\r\n}\r\n\r\n/**\r\n * 用前缀和后缀包裹选中文本\r\n */\r\nexport function wrapSelection(view: EditorView, prefix: string, suffix: string): void {\r\n const { from, to, empty } = view.state.selection.main\r\n if (empty) return\r\n const selected = view.state.doc.sliceString(from, to)\r\n view.dispatch({ changes: { from, to, insert: `${prefix}${selected}${suffix}` } })\r\n}\r\n\r\n/**\r\n * 切换包裹:选中的文本已包含标签则移除,否则添加\r\n */\r\nexport function toggleWrap(\r\n view: EditorView,\r\n openTag: string,\r\n closeTag: string\r\n): void {\r\n const { from, to, empty } = view.state.selection.main\r\n const doc = view.state.doc\r\n\r\n // 选区完整包含标签 → 移除\r\n if (!empty) {\r\n const selected = doc.sliceString(from, to)\r\n if (selected.startsWith(openTag) && selected.endsWith(closeTag)) {\r\n const inner = selected.slice(openTag.length, -closeTag.length)\r\n view.dispatch({ changes: { from, to, insert: inner } })\r\n return\r\n }\r\n }\r\n\r\n // 光标/选区在标签内部 → 查找当前行的标签并移除\r\n {\r\n const cursorPos = empty ? from : to\r\n const line = doc.lineAt(cursorPos)\r\n const lineText = doc.sliceString(line.from, line.to)\r\n const openIdx = lineText.indexOf(openTag)\r\n const closeIdx = lineText.lastIndexOf(closeTag)\r\n\r\n if (openIdx >= 0 && closeIdx > openIdx) {\r\n const absOpen = line.from + openIdx\r\n const absClose = line.from + closeIdx\r\n // 确认光标/选区在标签范围内\r\n if (cursorPos >= absOpen + openTag.length && cursorPos <= absClose) {\r\n const inner = doc.sliceString(absOpen + openTag.length, absClose)\r\n view.dispatch({\r\n changes: {\r\n from: absOpen,\r\n to: absClose + closeTag.length,\r\n insert: inner,\r\n },\r\n })\r\n return\r\n }\r\n }\r\n }\r\n\r\n // 默认:添加包裹\r\n wrapSelection(view, openTag, closeTag)\r\n}","import { EditorView, keymap } from '@codemirror/view'\r\nimport { defaultKeymap, indentWithTab } from '@codemirror/commands'\r\nimport { markdown } from '@codemirror/lang-markdown'\r\nimport { oneDark } from '@codemirror/theme-one-dark'\r\nimport { Facet } from '@codemirror/state'\r\nimport { containerWidgetPlugin, containerEditCallback } from './containerWidget'\r\nimport type { OnEditContainer } from './containerWidget'\r\nimport { uploadFileToServer, isUploadConfigured, indentMarkdownList, dedentMarkdownList } from '../Toolbar/buttons'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\n/**\r\n * 图片上传配置 facet。\r\n * 传入 getter 而非配置本身:扩展只在 mount 时创建一次,\r\n * 运行期通过 getter 读取最新配置,避免闭包过期。\r\n */\r\nconst uploadConfigFacet = Facet.define<() => ImageUploadConfig | undefined, (() => ImageUploadConfig | undefined) | null>({\r\n combine: (values) => (values.length ? values[values.length - 1] : null),\r\n})\r\n\r\n/** 未配置上传时的提示回调 facet(同为 getter 形式) */\r\nconst messageFacet = Facet.define<() => (() => void) | undefined, (() => (() => void) | undefined) | null>({\r\n combine: (values) => (values.length ? values[values.length - 1] : null),\r\n})\r\n\r\n/** 粘贴事件处理:拦截图片并上传 */\r\nconst pasteHandler = EditorView.domEventHandlers({\r\n paste: (event: ClipboardEvent, view: EditorView) => {\r\n const files = event.clipboardData?.files\r\n if (!files) return false\r\n\r\n const imageFiles = Array.from(files).filter((f) => f.type.startsWith('image/'))\r\n if (imageFiles.length === 0) return false\r\n\r\n event.preventDefault()\r\n\r\n const uploadConfig = view.state.facet(uploadConfigFacet)?.()\r\n const showMessage = view.state.facet(messageFacet)?.()\r\n\r\n if (!isUploadConfigured(uploadConfig)) {\r\n showMessage?.()\r\n return true\r\n }\r\n\r\n // 首个插入替换粘贴时的选区;后续插入基于\"最新文档末尾\"追加,\r\n // 避免异步上传完成后使用过期位置导致插入错乱\r\n const config = uploadConfig\r\n let isFirst = true\r\n\r\n for (const file of imageFiles) {\r\n uploadFileToServer(file, config).then((url) => {\r\n if (!url) return\r\n const name = file.name.replace(/\\.[^.]+$/, '')\r\n const insert = ``\r\n const { state } = view\r\n if (isFirst) {\r\n isFirst = false\r\n const { from, to } = state.selection.main\r\n view.dispatch({\r\n changes: { from, to, insert },\r\n selection: { anchor: from + insert.length },\r\n })\r\n } else {\r\n const end = state.doc.length\r\n view.dispatch({\r\n changes: { from: end, insert: `\\n${insert}` },\r\n selection: { anchor: end + insert.length + 1 },\r\n })\r\n }\r\n })\r\n }\r\n\r\n return true\r\n },\r\n})\r\n\r\ninterface GetCodeMirrorExtensionsOptions {\r\n /** 编辑容器属性的回调函数 */\r\n onEditContainer?: OnEditContainer\r\n /** 获取最新图片上传配置(运行期求值) */\r\n getUploadConfig?: () => ImageUploadConfig | undefined\r\n /** 获取最新\"未配置上传\"提示回调(运行期求值) */\r\n getOnMessageNoUploadConfig?: () => (() => void) | undefined\r\n}\r\n\r\nexport const getCodeMirrorExtensions = (opts?: GetCodeMirrorExtensionsOptions) => {\r\n const extensions = [\r\n markdown(),\r\n oneDark,\r\n // Tab/Shift-Tab 优先接管列表行:缩进 4 空格并重排子列表序号\r\n keymap.of([\r\n { key: 'Tab', run: indentMarkdownList },\r\n { key: 'Shift-Tab', run: dedentMarkdownList },\r\n ...defaultKeymap,\r\n indentWithTab,\r\n ]),\r\n EditorView.lineWrapping,\r\n pasteHandler,\r\n EditorView.baseTheme({\r\n '.cm-scroller': {\r\n height: '100%',\r\n overflow: 'auto',\r\n },\r\n // 容器头行 Widget 样式\r\n '.container-widget-header': {\r\n display: 'inline',\r\n fontSize: 'inherit',\r\n fontFamily: 'inherit',\r\n },\r\n '.container-widget-text': {\r\n fontWeight: 'bold',\r\n color: '#79c0ff',\r\n },\r\n // 容器属性行 Widget 样式\r\n '.container-widget-props': {\r\n display: 'inline',\r\n fontSize: 'inherit',\r\n fontFamily: 'inherit',\r\n color: '#a5d6ff',\r\n },\r\n // 容器编辑按钮样式\r\n '.container-edit-btn': {\r\n display: 'inline-block',\r\n padding: '0 4px',\r\n fontSize: '12px',\r\n color: '#58a6ff',\r\n background: 'transparent',\r\n border: 'none',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n marginRight: '4px',\r\n verticalAlign: 'middle',\r\n },\r\n '.container-edit-btn:hover': {\r\n background: 'rgba(88, 166, 255, 0.16)',\r\n },\r\n }),\r\n ]\r\n\r\n // 添加容器 widget 插件\r\n extensions.push(containerWidgetPlugin)\r\n\r\n // 注册各类回调/配置 facet(getter 形式,运行期读取最新值)\r\n if (opts?.onEditContainer) {\r\n extensions.push(containerEditCallback.of(opts.onEditContainer))\r\n }\r\n if (opts?.getUploadConfig) {\r\n extensions.push(uploadConfigFacet.of(opts.getUploadConfig))\r\n }\r\n if (opts?.getOnMessageNoUploadConfig) {\r\n extensions.push(messageFacet.of(opts.getOnMessageNoUploadConfig))\r\n }\r\n\r\n return extensions\r\n}\r\n\r\nexport default getCodeMirrorExtensions\r\n","import { useEffect, useRef } from 'react'\r\nimport { EditorView, basicSetup } from 'codemirror'\r\nimport { EditorState } from '@codemirror/state'\r\nimport { getCodeMirrorExtensions } from './codemirrorExtensions'\r\nimport type { OnEditContainer } from './containerWidget'\r\nimport type { ImageUploadConfig } from '../../types'\r\n\r\ninterface EditorProps {\r\n value: string\r\n onChange: (value: string) => void\r\n onScrollReady?: (scrollDOM: HTMLElement) => void\r\n onViewReady?: (view: EditorView) => void\r\n /** 编辑容器属性的回调 */\r\n onEditContainer?: OnEditContainer\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /** 未配置上传时的提示回调 */\r\n onMessageNoUploadConfig?: () => void\r\n}\r\n\r\nexport default function Editor({ value, onChange, onScrollReady, onViewReady, onEditContainer, uploadConfig, onMessageNoUploadConfig }: EditorProps) {\r\n const editorRef = useRef<HTMLDivElement>(null)\r\n const viewRef = useRef<EditorView | null>(null)\r\n\r\n // 回调/配置经 ref 中转:扩展仅在 mount 时创建,getter 形式保证运行期始终读到最新引用\r\n const latestRef = useRef({ onChange, onEditContainer, uploadConfig, onMessageNoUploadConfig })\r\n latestRef.current = { onChange, onEditContainer, uploadConfig, onMessageNoUploadConfig }\r\n\r\n useEffect(() => {\r\n if (!editorRef.current) return\r\n\r\n const extensions = [\r\n basicSetup,\r\n ...getCodeMirrorExtensions({\r\n getUploadConfig: () => latestRef.current.uploadConfig,\r\n getOnMessageNoUploadConfig: () => latestRef.current.onMessageNoUploadConfig,\r\n onEditContainer: (view, container) => latestRef.current.onEditContainer?.(view, container),\r\n }),\r\n EditorView.updateListener.of((update) => {\r\n if (update.docChanged) {\r\n latestRef.current.onChange(update.state.doc.toString())\r\n }\r\n }),\r\n ]\r\n\r\n const state = EditorState.create({\r\n doc: value,\r\n extensions,\r\n })\r\n\r\n viewRef.current = new EditorView({\r\n state,\r\n parent: editorRef.current,\r\n })\r\n\r\n if (viewRef.current) {\r\n onScrollReady?.(viewRef.current.scrollDOM)\r\n onViewReady?.(viewRef.current)\r\n }\r\n\r\n return () => {\r\n viewRef.current?.destroy()\r\n viewRef.current = null\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n // 外部 value 变化时更新编辑器内容:scrollSnapshot 保持滚动视口,避免整篇替换后跳顶\r\n // (新版 @codemirror/view 的 dispatch 为变长 TransactionSpec,效果需并入同一个 spec)\r\n useEffect(() => {\r\n const view = viewRef.current\r\n if (view && view.state.doc.toString() !== value) {\r\n view.dispatch({\r\n changes: { from: 0, to: view.state.doc.length, insert: value },\r\n effects: view.scrollSnapshot(),\r\n scrollIntoView: false,\r\n })\r\n }\r\n }, [value])\r\n\r\n return <div ref={editorRef} className=\"editor\" />\r\n}\r\n","import { forwardRef, useEffect, memo } from 'react'\r\nimport RenderMarkdown, { languagesCommon, initHighlighter } from 'remons-render-markdown';\r\nimport type { RenderMarkdownProps } from 'remons-render-markdown';\r\nimport 'remons-render-markdown/dist/index.css';\r\n\r\nexport type PreviewOptions = Omit<RenderMarkdownProps, 'content'>\r\n\r\nexport interface PreviewProps {\r\n content: string\r\n /** 透传给 RenderMarkdown 的渲染配置 */\r\n previewOptions?: PreviewOptions\r\n /** 额外的高亮语言包(与 languagesCommon 合并注册) */\r\n languages?: Record<string, any> | null\r\n}\r\n\r\n\r\nconst Preview = forwardRef<HTMLDivElement, PreviewProps>(({ content, previewOptions, languages }, ref) => {\r\n useEffect(() => {\r\n initHighlighter({\r\n ...languagesCommon,\r\n ...(languages ?? {})\r\n })\r\n }, [languages])\r\n\r\n // 防御旧用法:即使运行时把 languages 传进了 previewOptions,也不会流入 RenderMarkdown\r\n const { languages: _ignored, ...restOptions } = (previewOptions ?? {}) as Record<string, unknown>\r\n\r\n return (\r\n <div ref={ref} className=\"preview\">\r\n <RenderMarkdown content={content} {...(restOptions as PreviewOptions)} />\r\n </div>\r\n )\r\n})\r\n\r\nPreview.displayName = 'Preview'\r\n\r\n// memo:content/previewOptions 引用不变时跳过重渲染,\r\n// 避免编辑器其它 state(弹窗、全屏、view 就绪)连带 RenderMarkdown 重跑\r\nexport default memo(Preview)\r\n","import React from 'react'\r\nimport { Splitter } from 'antd'\r\n\r\nconst { Panel } = Splitter\r\n\r\ninterface SplitPanelsProps {\r\n leftPanel: React.ReactNode\r\n rightPanel: React.ReactNode\r\n}\r\n\r\nexport default function SplitPanels({ leftPanel, rightPanel }: SplitPanelsProps) {\r\n return (\r\n <Splitter className=\"split-panels\">\r\n <Panel defaultSize=\"50%\" min=\"20%\" max=\"80%\">\r\n {leftPanel}\r\n </Panel>\r\n <Panel>{rightPanel}</Panel>\r\n </Splitter>\r\n )\r\n}","import { createFromIconfontCN } from '@ant-design/icons';\r\n\r\n/**\r\n * iconfont 运行时配置。\r\n * 与图标组件分离,避免组件模块混导非组件内容影响 Fast Refresh。\r\n */\r\n\r\n/** 默认 iconfont 脚本地址 */\r\nconst DEFAULT_ICONFONT_SCRIPT_URL = 'https://at.alicdn.com/t/c/font_5241307_xoojyr52dqn.js'\r\n\r\nlet scriptUrl = DEFAULT_ICONFONT_SCRIPT_URL\r\nlet IconComp: ReturnType<typeof createFromIconfontCN> | null = null\r\n\r\n/**\r\n * 配置 iconfont 脚本地址(宿主在应用入口调用),需在首次渲染前设置;\r\n * 变更后重置内部缓存,下次渲染时以新地址重建图标组件。\r\n */\r\nexport function setIconfontScriptUrl(url: string) {\r\n if (url === scriptUrl) return\r\n scriptUrl = url\r\n IconComp = null\r\n}\r\n\r\n/** 读取当前 iconfont 脚本地址 */\r\nexport function getIconfontScriptUrl(): string {\r\n return scriptUrl\r\n}\r\n\r\n/** 懒创建图标组件:首次渲染时才注入 iconfont 脚本,避免模块层副作用 */\r\nexport function getIconComponent() {\r\n if (!IconComp) {\r\n IconComp = createFromIconfontCN({ scriptUrl })\r\n }\r\n return IconComp\r\n}\r\n","import { getIconComponent } from './config'\r\n\r\nfunction IconComponent(type: string, className?: string) {\r\n const Icon = getIconComponent()\r\n return (\r\n <Icon type={`icon-${type}`} className={className} />\r\n )\r\n}\r\n\r\nexport default IconComponent;\r\n","import type { ToolbarButtonConfig, ImageUploadConfig, NotifyFn } from '../../types'\r\nimport {\r\n BoldOutlined,\r\n ItalicOutlined,\r\n StrikethroughOutlined,\r\n UnderlineOutlined,\r\n UnorderedListOutlined,\r\n OrderedListOutlined,\r\n LinkOutlined,\r\n PictureOutlined,\r\n CodeOutlined,\r\n MinusOutlined,\r\n FontSizeOutlined,\r\n CheckSquareOutlined\r\n} from '@ant-design/icons';\r\nimport IconComponent from '../Icon'\r\nimport { insertAtCursor, insertAtLineStart, wrapSelection, uploadImage, isUploadConfigured, toggleTaskList, toggleHeading, toggleWrap, toggleLinePrefix } from './buttons'\r\n\r\nfunction Quote() {\r\n return IconComponent('quote')\r\n}\r\n\r\nfunction InlineCode() {\r\n return IconComponent('inlinecode')\r\n}\r\n\r\n/** 未配置图片上传时的提示文案 */\r\nconst UPLOAD_CONFIG_MISSING_MESSAGE = '请先配置图片上传功能'\r\n\r\ninterface ToolbarConfigOptions {\r\n /** 图片上传配置 */\r\n upload?: ImageUploadConfig\r\n /** 提示注入点(由宿主提供,如 antd App 上下文的 message) */\r\n notify?: NotifyFn\r\n}\r\n\r\n/**\r\n * 创建工具栏配置\r\n * @param options - 配置选项\r\n */\r\nexport function createToolbarConfig(options?: ToolbarConfigOptions): ToolbarButtonConfig[] {\r\n // 判断是否配置了图片上传\r\n const hasUploadConfig = isUploadConfigured(options?.upload)\r\n const notify = options?.notify\r\n return [\r\n {\r\n id: 'heading',\r\n icon: FontSizeOutlined,\r\n label: '标题',\r\n children: [\r\n { id: 'heading1', label: 'H1', handler: (v) => toggleHeading(v, 1) },\r\n { id: 'heading2', label: 'H2', handler: (v) => toggleHeading(v, 2) },\r\n { id: 'heading3', label: 'H3', handler: (v) => toggleHeading(v, 3) },\r\n { id: 'heading4', label: 'H4', handler: (v) => toggleHeading(v, 4) },\r\n { id: 'heading5', label: 'H5', handler: (v) => toggleHeading(v, 5) },\r\n { id: 'heading6', label: 'H6', handler: (v) => toggleHeading(v, 6) },\r\n ],\r\n },\r\n { separatorBefore: true },\r\n { id: 'bold', label: '加粗', icon: BoldOutlined, handler: (v) => toggleWrap(v, '**', '**') },\r\n { id: 'italic', label: '斜体', icon: ItalicOutlined, handler: (v) => toggleWrap(v, '*', '*') },\r\n { id: 'strikethrough', label: '删除线', icon: StrikethroughOutlined, handler: (v) => toggleWrap(v, '~~', '~~') },\r\n { id: 'underline', label: '下划线', icon: UnderlineOutlined, handler: (v) => toggleWrap(v, '<u>', '</u>') },\r\n { separatorBefore: true },\r\n // 列表按钮:切换式,行已是列表项则点击移除前缀(无序列表不匹配待办行 `- [ ]`)\r\n { id: 'ul', label: '无序列表', icon: UnorderedListOutlined, handler: (v) => toggleLinePrefix(v, /^(\\s*)-(?!\\s*\\[)\\s/, '- ') },\r\n { id: 'ol', label: '有序列表', icon: OrderedListOutlined, handler: (v) => toggleLinePrefix(v, /^(\\s*)\\d+\\.\\s/, '1. ') },\r\n { id: 'checkbox', label: '待办', icon: CheckSquareOutlined, handler: (v) => toggleTaskList(v) },\r\n { separatorBefore: true },\r\n { id: 'link', label: '链接', icon: LinkOutlined, handler: (v) => insertAtCursor(v, '[', '](url)', '文本') },\r\n // 图片按钮:未配置上传时点击提示(不置灰)\r\n {\r\n id: 'image',\r\n label: '图片',\r\n icon: PictureOutlined,\r\n handler: hasUploadConfig && options?.upload\r\n ? (v) => uploadImage(v, options.upload!)\r\n : () => notify?.('warning', UPLOAD_CONFIG_MISSING_MESSAGE),\r\n },\r\n { separatorBefore: true },\r\n { id: 'code', label: '行内代码', icon: InlineCode, handler: (v) => wrapSelection(v, '`', '`') },\r\n {\r\n id: 'codeblock',\r\n label: '代码块',\r\n icon: CodeOutlined,\r\n handler: (v) => {\r\n const { from, to } = v.state.selection.main\r\n const selected = v.state.doc.sliceString(from, to)\r\n const insert = selected ? '```\\n' + selected + '\\n```' : '```\\n\\n```'\r\n v.dispatch({ changes: { from, to, insert } })\r\n },\r\n },\r\n { id: 'quote', label: '引用', icon: Quote, handler: (v) => insertAtLineStart(v, '> ') },\r\n {\r\n id: 'hr',\r\n label: '分割线',\r\n icon: MinusOutlined,\r\n handler: (v) => {\r\n const { from } = v.state.selection.main\r\n v.dispatch({ changes: { from, insert: '\\n---\\n' } })\r\n },\r\n },\r\n ]\r\n}","import { useCallback, useMemo } from 'react'\r\nimport type { EditorView } from '@codemirror/view'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig, NotifyFn } from '../../../types'\r\nimport { createToolbarConfig } from '../config'\r\nimport { toggleWrap } from '../buttons'\r\n\r\nexport interface UseToolbarOptions {\r\n /** 第三方扩展的按钮配置,将追加到工具栏末尾 */\r\n extraItems?: ToolbarButtonConfig[]\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /** 提示注入点(由宿主提供) */\r\n notify?: NotifyFn\r\n}\r\n\r\nexport interface UseToolbarReturn {\r\n config: ToolbarButtonConfig[]\r\n extraItemsConfig: ToolbarButtonConfig[]\r\n handleClick: (button: ToolbarButtonConfig) => void\r\n}\r\n\r\nexport function useToolbar(\r\n editorView: EditorView | null,\r\n options?: UseToolbarOptions\r\n): UseToolbarReturn {\r\n const { extraItems, uploadConfig, notify } = options || {}\r\n const config = useMemo(() => {\r\n return createToolbarConfig({ upload: uploadConfig, notify })\r\n }, [uploadConfig, notify])\r\n\r\n const extraItemsConfig = useMemo(() => {\r\n return extraItems || []\r\n }, [extraItems])\r\n\r\n const handleClick = useCallback((button: ToolbarButtonConfig) => {\r\n if (!editorView) return\r\n\r\n // 如果配置了 wrapTags,优先使用 toggleWrap\r\n if (button.wrapTags) {\r\n const [openTag, closeTag] = button.wrapTags\r\n toggleWrap(editorView, openTag, closeTag)\r\n return\r\n }\r\n\r\n // 有 handler 则执行自定义逻辑\r\n if (button.handler) {\r\n editorView.focus()\r\n button.handler(editorView, editorView.state)\r\n }\r\n }, [editorView])\r\n\r\n return { config, extraItemsConfig, handleClick }\r\n}","import { Button, Dropdown, Tooltip } from 'antd'\r\nimport { DownOutlined } from '@ant-design/icons'\r\nimport type { ComponentType, ReactNode } from 'react'\r\nimport type { ToolbarButtonConfig } from '../../../types'\r\n\r\ninterface Props {\r\n item: ToolbarButtonConfig\r\n onClick: (item: ToolbarButtonConfig) => void\r\n}\r\n\r\n/**\r\n * 渲染图标:统一接受组件类型;兼容传入 ReactNode 的旧用法。\r\n * 组件类型不仅指函数/class,也包括 forwardRef、memo 包装出的对象\r\n * (@ant-design/icons 即为 forwardRef,不能当作普通 child 直接渲染)。\r\n */\r\nconst REACT_FORWARD_REF = Symbol.for('react.forward_ref')\r\nconst REACT_MEMO = Symbol.for('react.memo')\r\n\r\nfunction isComponentType(icon: unknown): boolean {\r\n if (typeof icon === 'function') return true\r\n if (typeof icon === 'object' && icon !== null) {\r\n const t = (icon as { $$typeof?: symbol }).$$typeof\r\n return t === REACT_FORWARD_REF || t === REACT_MEMO\r\n }\r\n return false\r\n}\r\n\r\nfunction renderIcon(icon: ComponentType | ReactNode): ReactNode {\r\n if (isComponentType(icon)) {\r\n const Icon = icon as ComponentType\r\n return <Icon />\r\n }\r\n // 非组件类型(string / number / 已构造的 React 元素等)直接作为节点渲染\r\n return icon as ReactNode\r\n}\r\n\r\nexport function ToolbarItemRenderer({ item, onClick }: Props) {\r\n // 有 children 的渲染为下拉菜单:点击经 menu.onClick 分发,键盘选择菜单项同样生效\r\n if (item.children && item.children.length > 0) {\r\n return (\r\n <>\r\n {item.separatorBefore && <div className=\"toolbar-separator\" />}\r\n <div className=\"toolbar-group\">\r\n <Tooltip title={item.label}>\r\n <Dropdown\r\n menu={{\r\n items: item.children.map(child => ({\r\n key: child.id ?? '',\r\n label: (\r\n <span>\r\n {child.icon && renderIcon(child.icon)}\r\n {' '}{child.label}\r\n </span>\r\n ),\r\n disabled: child.disabled,\r\n })),\r\n onClick: ({ key }) => {\r\n const child = item.children?.find(c => c.id === key)\r\n if (child && !child.disabled) onClick(child)\r\n },\r\n }}\r\n placement=\"bottomLeft\"\r\n >\r\n <Button className=\"toolbar-button\" type=\"text\" size=\"small\">\r\n {item.icon && renderIcon(item.icon)}\r\n <DownOutlined style={{ fontSize: 10 }} />\r\n </Button>\r\n </Dropdown>\r\n </Tooltip>\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n // 普通按钮\r\n const isDisabled = item.disabled\r\n return (\r\n <>\r\n {item.separatorBefore && <div className=\"toolbar-separator\" />}\r\n <div className=\"toolbar-group\">\r\n <Tooltip title={item.label}>\r\n <Button\r\n id={item.id}\r\n className=\"toolbar-button\"\r\n type=\"text\"\r\n size=\"small\"\r\n disabled={isDisabled}\r\n onClick={() => !isDisabled && onClick(item)}\r\n >\r\n {item.icon && renderIcon(item.icon)}\r\n </Button>\r\n </Tooltip>\r\n </div>\r\n </>\r\n )\r\n}\r\n",".container {\r\n padding: 4px;\r\n display: block;\r\n min-width: 200px;\r\n background: var(--remons-md-editor-bg-picker);\r\n border: 1px solid var(--remons-md-editor-color-border-light);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.grid {\r\n display: grid;\r\n gap: 2px;\r\n transition: all 0.1s ease;\r\n justify-content: flex-start;\r\n\r\n .cell {\r\n width: 24px;\r\n height: 24px;\r\n border: 1px solid var(--remons-md-editor-color-border-light);\r\n border-radius: 2px;\r\n background: transparent;\r\n cursor: pointer;\r\n transition: all 0.1s ease;\r\n\r\n &.cellActive {\r\n border-color: var(--remons-md-editor-color-cell-active);\r\n background: var(--remons-md-editor-bg-cell-active);\r\n }\r\n }\r\n}\r\n\r\n.hint {\r\n padding: 12px 16px;\r\n color: var(--remons-md-editor-color-hint);\r\n font-size: 12px;\r\n text-align: center;\r\n cursor: pointer;\r\n}\r\n\r\n.label {\r\n margin-top: 8px;\r\n font-size: 13px;\r\n color: var(--remons-md-editor-color-label);\r\n font-weight: 500;\r\n min-height: 20px;\r\n text-align: center;\r\n}\r\n","import { useState, useRef, useEffect, useCallback } from 'react'\r\nimport styles from './index.module.less'\r\n\r\ninterface TableSize {\r\n rows: number\r\n cols: number\r\n}\r\n\r\ninterface TablePickerProps {\r\n onSelect: (size: TableSize) => void\r\n}\r\n\r\nconst MAX_ROW = 8\r\nconst MAX_COL = 8\r\n\r\nexport default function TablePicker({ onSelect }: TablePickerProps) {\r\n /** 当前高亮区域(rows x cols),渲染唯一依赖此状态 */\r\n const [size, setSize] = useState<TableSize>({ rows: 0, cols: 0 })\r\n /** 鼠标回撤(向上/向左)后需要重置列跟踪,prevRow 与 pending 成对出现,仅事件处理内使用 */\r\n const prevRowRef = useRef(0)\r\n const pendingColsRef = useRef(0)\r\n const flashTimerRef = useRef<ReturnType<typeof setInterval> | null>(null)\r\n\r\n const clearFlash = useCallback(() => {\r\n if (flashTimerRef.current) {\r\n clearInterval(flashTimerRef.current)\r\n flashTimerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(\r\n () => () => {\r\n // 组件卸载时清理动画定时器(下拉关闭时 destroyOnHidden 会卸载本组件)\r\n clearFlash()\r\n },\r\n [clearFlash]\r\n )\r\n\r\n /**\r\n * 扩展选中区域至 (col, row)\r\n */\r\n function extend(col: number, row: number) {\r\n if (row < prevRowRef.current || col < pendingColsRef.current) {\r\n // 鼠标回撤(向上或向左),重置列跟踪\r\n pendingColsRef.current = 0\r\n }\r\n if (col > pendingColsRef.current) {\r\n pendingColsRef.current = col\r\n }\r\n const cols = pendingColsRef.current\r\n setSize({ rows: row, cols })\r\n prevRowRef.current = row\r\n }\r\n\r\n /**\r\n * 跳跃动画效果:逐行推进高亮,结束后落到 (col, limit)\r\n */\r\n function flash(col: number, dir: 1 | -1, limit: number) {\r\n clearFlash()\r\n let current = dir === 1 ? 1 : limit\r\n const step = dir === 1 ? 1 : -1\r\n\r\n flashTimerRef.current = setInterval(() => {\r\n if ((dir === 1 && current > limit) || (dir === -1 && current < 1)) {\r\n clearFlash()\r\n const finalRow = current - step\r\n setSize({ rows: finalRow, cols: col })\r\n return\r\n }\r\n setSize({ rows: current, cols: col })\r\n current += step\r\n }, 50)\r\n }\r\n\r\n /**\r\n * 核心逻辑:鼠标进入格子\r\n */\r\n function onCellEnter(index: number) {\r\n clearFlash()\r\n const row = Math.floor(index / MAX_COL) + 1\r\n const col = (index % MAX_COL) + 1\r\n const maxCol = pendingColsRef.current\r\n\r\n const isJump = Math.abs(row - prevRowRef.current) > 1\r\n prevRowRef.current = row\r\n\r\n if (!isJump) {\r\n // 正常悬停:相邻行或同一行\r\n extend(col, row)\r\n } else if (row > 0 && (col > maxCol || maxCol >= MAX_COL)) {\r\n // 向下跳跃:逐行推进动画\r\n pendingColsRef.current = Math.min(MAX_COL, col)\r\n flash(Math.min(MAX_COL, col), 1, Math.min(row, MAX_ROW))\r\n } else {\r\n // 向上跳跃:重置列跟踪并播放动画\r\n pendingColsRef.current = 0\r\n extend(col, row)\r\n }\r\n }\r\n\r\n function onMouseDown() {\r\n // 提交当前高亮区域(size 始终与视觉高亮一致)\r\n if (size.rows > 0 && size.cols > 0) {\r\n onSelect(size)\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={styles.container}\r\n onMouseDown={onMouseDown}\r\n >\r\n <div\r\n className={styles.grid}\r\n style={{ gridTemplateColumns: `repeat(${MAX_COL}, 24px)` }}\r\n >\r\n {Array.from({ length: MAX_ROW * MAX_COL }).map((_, i) => {\r\n const row = Math.floor(i / MAX_COL) + 1\r\n const col = (i % MAX_COL) + 1\r\n const isSelected = row <= size.rows && col <= size.cols\r\n return (\r\n <div\r\n key={i}\r\n className={`${styles.cell} ${isSelected ? styles.cellActive : ''}`}\r\n onMouseEnter={() => onCellEnter(i)}\r\n />\r\n )\r\n })}\r\n </div>\r\n <div className={styles.label}>\r\n {size.rows} x {size.cols || 1}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useCallback, useState } from 'react'\r\nimport { EditorView } from '@codemirror/view'\r\nimport { Button, Dropdown } from 'antd'\r\nimport { TableOutlined } from '@ant-design/icons'\r\nimport TablePicker from './index'\r\n\r\nexport default function TableDropdown({ editorView }: { editorView: EditorView | null }) {\r\n const [open, setOpen] = useState(false)\r\n\r\n const handleOpenChange = useCallback((next: boolean) => {\r\n setOpen(next)\r\n }, [])\r\n\r\n const handleTableSelect = useCallback((rows: number, cols: number) => {\r\n if (!editorView || rows <= 0 || cols <= 0) return\r\n editorView.focus()\r\n const headerCells = Array(cols).fill(null).map((_, i) => ` 列${i + 1} `).join('|')\r\n const separator = Array(cols).fill(' --- ').join('|')\r\n const dataCell = Array(cols).fill(' 内容 ').join('|')\r\n const dataRows = Array(rows).fill(`|${dataCell}|`).join('\\n')\r\n const table = `\\n|${headerCells}|\\n|${separator}|\\n${dataRows}\\n`\r\n const { from } = editorView.state.selection.main\r\n editorView.dispatch({ changes: { from, insert: table } })\r\n }, [editorView])\r\n\r\n return (\r\n <Dropdown\r\n trigger={['click']}\r\n open={open}\r\n onOpenChange={handleOpenChange}\r\n destroyOnHidden\r\n popupRender={() => (\r\n <div style={{ padding: 4 }}>\r\n <TablePicker\r\n onSelect={(size) => {\r\n handleTableSelect(size.rows, size.cols)\r\n setOpen(false)\r\n }}\r\n />\r\n </div>\r\n )}\r\n placement=\"bottomLeft\"\r\n >\r\n <Button className=\"toolbar-button\" type=\"text\" size=\"small\" title=\"表格\">\r\n <TableOutlined />\r\n </Button>\r\n </Dropdown>\r\n )\r\n}\r\n","import { useCallback, memo } from 'react'\r\nimport type { EditorView } from '@codemirror/view'\r\nimport { Button } from 'antd'\r\nimport { FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons'\r\nimport { useToolbar } from './hooks/useToolbar'\r\nimport { ToolbarItemRenderer } from './renderers/ToolbarItemRenderer'\r\nimport TableDropdown from './renderers/TablePicker/TableDropdown'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig, NotifyFn } from '../../types'\r\n\r\ninterface ToolbarProps {\r\n editorView: EditorView | null\r\n fullscreen?: boolean\r\n onToggleFullscreen?: () => void\r\n /** 第三方扩展的按钮配置,将追加到工具栏末尾 */\r\n extraItems?: ToolbarButtonConfig[]\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /** 提示注入点(由宿主提供) */\r\n notify?: NotifyFn\r\n}\r\n\r\nfunction Toolbar({ editorView, fullscreen = true, onToggleFullscreen, extraItems, uploadConfig, notify }: ToolbarProps) {\r\n const { config, extraItemsConfig, handleClick } = useToolbar(editorView, { extraItems, uploadConfig, notify })\r\n\r\n const renderFullscreen = useCallback(() => {\r\n if (!onToggleFullscreen) return null\r\n const Icon = fullscreen ? FullscreenExitOutlined : FullscreenOutlined\r\n return (\r\n <Button\r\n className=\"toolbar-button\"\r\n type=\"text\"\r\n size=\"small\"\r\n title={fullscreen ? '退出全屏' : '全屏'}\r\n onClick={() => {\r\n onToggleFullscreen()\r\n }}\r\n >\r\n <Icon />\r\n </Button>\r\n )\r\n }, [fullscreen, onToggleFullscreen])\r\n\r\n function isSeparator(item: ToolbarButtonConfig): boolean {\r\n return !!(!item.id && item.separatorBefore)\r\n }\r\n\r\n return (\r\n <div className=\"toolbar\">\r\n {config.map((item, idx) => {\r\n if (isSeparator(item)) {\r\n return <div key={`sep-${idx}`} className=\"toolbar-separator\" />\r\n }\r\n return (\r\n <ToolbarItemRenderer\r\n key={item.id}\r\n item={item}\r\n onClick={handleClick}\r\n />\r\n )\r\n })}\r\n <TableDropdown editorView={editorView} />\r\n {extraItemsConfig?.map((item, idx) => {\r\n if (isSeparator(item)) {\r\n return <div key={`extra-sep-${idx}`} className=\"toolbar-separator\" />\r\n }\r\n return (\r\n <ToolbarItemRenderer\r\n key={item.id}\r\n item={item}\r\n onClick={handleClick}\r\n />\r\n )\r\n })}\r\n {renderFullscreen()}\r\n </div>\r\n )\r\n}\r\n\r\n// memo:工具栏是 props 的纯函数(无内部 state),各项 props 在输入时引用均稳定,\r\n// content 变化不应连带重渲染整个工具栏\r\nexport default memo(Toolbar)","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","import { useState, useMemo, useEffect, useRef, type FC } from 'react'\r\nimport { Modal, Form, Input, InputNumber, Select, Switch, Slider, Rate, DatePicker, ColorPicker } from 'antd'\r\nimport type { FormInstance, FormItemProps } from 'antd'\r\nimport dayjs from 'dayjs'\r\nimport type { Dayjs } from 'dayjs'\r\nimport componentRegistry from '../../registry/componentRegistry'\r\nimport type { DialogField } from '../../types'\r\nimport type { ContainerProps } from '../../utils/parseContainer'\r\n\r\n/**\r\n * 组件类型到 antd 表单组件的映射\r\n */\r\nconst FormComponents: Record<string, FC<any>> = {\r\n input: Input,\r\n textarea: Input.TextArea,\r\n number: InputNumber,\r\n select: Select,\r\n switch: Switch,\r\n slider: Slider,\r\n rate: Rate,\r\n color: ColorPicker,\r\n date: DatePicker,\r\n dateRange: DatePicker.RangePicker,\r\n}\r\n\r\n/**\r\n * 渲染对应类型的 antd 表单组件(仅接收 componentProps,不再与 Form.Item props 混用)\r\n */\r\nfunction renderFormItemComponent(field: DialogField) {\r\n const props = field.componentProps || {}\r\n const Component = field.componentType ? FormComponents[field.componentType] : Input\r\n return <Component {...props} />\r\n}\r\n\r\n/**\r\n * 根据 fields 自动生成 Form.Item 列表\r\n */\r\nfunction renderAutoForm(form: FormInstance, fields: DialogField[]) {\r\n if (!fields || fields.length === 0) {\r\n return null\r\n }\r\n\r\n return (\r\n <Form form={form} layout=\"vertical\" preserve={false}>\r\n {fields.map(field => {\r\n if (!field.componentType) {\r\n return null\r\n }\r\n\r\n const formItemProps: FormItemProps = {\r\n name: field.key,\r\n label: field.name || field.key,\r\n valuePropName: field.componentType === 'switch' ? 'checked' : undefined,\r\n ...field.formItemProps,\r\n }\r\n\r\n return (\r\n <Form.Item key={field.key} {...formItemProps}>\r\n {renderFormItemComponent(field)}\r\n </Form.Item>\r\n )\r\n })}\r\n </Form>\r\n )\r\n}\r\n\r\n/** 字符串形式的历史属性值('true'/'false')还原为布尔,供 Switch 初始化 */\r\nfunction toFormInitialValue(field: DialogField, value: string | number | boolean | undefined): unknown {\r\n if (value === undefined) return field.defaultValue ?? (field.componentType === 'switch' ? false : undefined)\r\n if (field.componentType === 'switch') {\r\n if (typeof value === 'boolean') return value\r\n return value === 'true' || value === 1 || value === '1'\r\n }\r\n if (field.componentType === 'number' || field.componentType === 'slider' || field.componentType === 'rate') {\r\n const num = Number(value)\r\n return Number.isNaN(num) ? undefined : num\r\n }\r\n if (field.componentType === 'date') {\r\n const d = dayjs(typeof value === 'boolean' ? String(value) : (value as string | number))\r\n return d.isValid() ? d : undefined\r\n }\r\n if (field.componentType === 'dateRange') {\r\n // 属性值为单行字符串,约定以 ',' 分隔两个日期\r\n const parts = String(value).split(',').map(s => s.trim()).filter(Boolean)\r\n if (parts.length !== 2) return undefined\r\n const [start, end] = parts.map(p => dayjs(p))\r\n return start.isValid() && end.isValid() ? [start, end] : undefined\r\n }\r\n return value\r\n}\r\n\r\n/** 表单控件值归一化为容器属性可存储的字符串(容器语法仅支持扁平原始值) */\r\nfunction normalizeValue(field: DialogField | undefined, value: unknown): string | number | boolean {\r\n if (value === null || value === undefined) return ''\r\n if (field?.componentType === 'date' && dayjs.isDayjs(value)) {\r\n return (value as Dayjs).format('YYYY-MM-DD')\r\n }\r\n if (field?.componentType === 'dateRange' && Array.isArray(value)) {\r\n return value\r\n .filter(v => dayjs.isDayjs(v))\r\n .map(v => (v as Dayjs).format('YYYY-MM-DD'))\r\n .join(', ')\r\n }\r\n // ColorPicker 在 Form 中可能给出 string 或 { toHexString } 对象\r\n const colorLike = value as { toHexString?: () => string }\r\n if (colorLike && typeof colorLike === 'object' && typeof colorLike.toHexString === 'function') {\r\n return colorLike.toHexString()\r\n }\r\n if (typeof value === 'boolean' || typeof value === 'number') {\r\n return value\r\n }\r\n return String(value)\r\n}\r\n\r\n/**\r\n * 弹窗编辑容器属性的组件\r\n */\r\ninterface EditDialogProps {\r\n /** 弹窗是否显示 */\r\n visible: boolean\r\n /** 容器类型名称 */\r\n typeName: string\r\n /** 当前属性值 */\r\n currentProps: ContainerProps\r\n /** 保存回调 */\r\n onSave: (props: ContainerProps) => void\r\n /** 关闭回调 */\r\n onClose: () => void\r\n}\r\n\r\n/**\r\n * 属性编辑弹窗组件\r\n * 根据组件 schema 的 renderDialog 函数渲染弹窗内容\r\n */\r\nexport default function EditDialog({ visible, typeName, currentProps, onSave, onClose }: EditDialogProps) {\r\n const schema = componentRegistry.get(typeName)\r\n const [formProps, setFormProps] = useState<ContainerProps>({})\r\n const [form] = Form.useForm()\r\n\r\n const onSaveRef = useRef(onSave)\r\n onSaveRef.current = onSave\r\n const dirtyRef = useRef(false)\r\n\r\n // 容器属性值统一按字符串读取(写入时也统一序列化为字符串)\r\n const mergedProps = useMemo<ContainerProps>(() => {\r\n if (!schema) return currentProps\r\n const merged: ContainerProps = {}\r\n for (const field of schema.fields || []) {\r\n if (field.defaultValue !== undefined) merged[field.key] = field.defaultValue\r\n }\r\n return { ...merged, ...currentProps }\r\n }, [schema, currentProps])\r\n\r\n // 仅在弹窗\"由关到开\"的瞬间初始化一次,避免重渲染覆盖用户正在编辑的内容\r\n useEffect(() => {\r\n if (visible) {\r\n setFormProps({})\r\n const initial: Record<string, unknown> = {}\r\n for (const [key, value] of Object.entries(mergedProps)) {\r\n const field = schema?.fields?.find(f => f.key === key)\r\n const formValue = toFormInitialValue(field ?? { key }, value)\r\n if (formValue !== undefined) initial[key] = formValue\r\n }\r\n form.setFieldsValue(initial)\r\n dirtyRef.current = false\r\n }\r\n // mergedProps 仅作为开弹窗时的快照,刻意不响应其后续变化\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [visible, form])\r\n\r\n const handleDialogChange = (key: string, value: string | number | boolean) => {\r\n setFormProps(prev => ({ ...prev, [key]: value }))\r\n dirtyRef.current = true\r\n }\r\n\r\n const handleOk = async () => {\r\n try {\r\n const formValues = await form.validateFields()\r\n for (const [key, value] of Object.entries(formValues)) {\r\n // 非归一化的控件值(dayjs/Color 等)先以 unknown 充入,后续统一 normalizeValue\r\n ;(formProps as Record<string, unknown>)[key] = value\r\n }\r\n } catch {\r\n // 校验失败:保持弹窗打开,由 antd 展示字段错误\r\n return\r\n }\r\n\r\n // 统一归一化:日期/颜色/布尔/数字 → 容器可存储的原始值\r\n const finalProps: ContainerProps = {}\r\n for (const [key, value] of Object.entries({ ...mergedProps, ...formProps })) {\r\n const field = schema?.fields?.find(f => f.key === key)\r\n finalProps[key] = normalizeValue(field, value)\r\n }\r\n\r\n onSaveRef.current(finalProps)\r\n dirtyRef.current = false\r\n onClose()\r\n }\r\n\r\n const handleClose = () => {\r\n if (dirtyRef.current && !window.confirm('属性修改尚未保存,确定关闭吗?')) {\r\n return\r\n }\r\n setFormProps({})\r\n dirtyRef.current = false\r\n onClose()\r\n }\r\n\r\n if (!schema) {\r\n return null\r\n }\r\n\r\n // 构建 context 对象,供 renderDialog 使用\r\n // context.onSave 为包装函数:仅更新弹窗内属性并标记脏状态;\r\n // 弹窗关闭由 onOk / onCancel 最终统一处理\r\n const contextSave = (props: ContainerProps) => {\r\n setFormProps(prev => ({ ...prev, ...props }))\r\n dirtyRef.current = true\r\n }\r\n\r\n const context = {\r\n props: { ...mergedProps, ...formProps },\r\n form,\r\n onChange: handleDialogChange,\r\n onSave: contextSave,\r\n }\r\n\r\n // 渲染策略:\r\n // 1. 如果有 renderDialog,使用自定义渲染\r\n // 2. 否则如果 fields 中有 componentType,自动生成表单\r\n // 3. 否则不渲染任何内容\r\n const renderDialogContent = () => {\r\n if (schema.renderDialog) {\r\n return schema.renderDialog(context)\r\n }\r\n // 检查是否有字段配置了 componentType\r\n const hasComponentType = schema.fields?.some(f => f.componentType)\r\n if (hasComponentType && schema.fields) {\r\n return renderAutoForm(form, schema.fields)\r\n }\r\n return null\r\n }\r\n\r\n return (\r\n <Modal\r\n title={`${schema.label} 属性编辑`}\r\n open={visible}\r\n onOk={handleOk}\r\n onCancel={handleClose}\r\n okText=\"保存\"\r\n cancelText=\"取消\"\r\n >\r\n {renderDialogContent()}\r\n </Modal>\r\n )\r\n}\r\n","import type { EditorView } from '@codemirror/view'\r\nimport JSON5 from 'json5'\r\nimport type { ContainerProps } from './parseContainer'\r\n\r\n/**\r\n * 从属性对象生成属性行。\r\n * 使用 JSON5 序列化:单引号风格与旧格式兼容,特殊字符会被正确转义,\r\n * 配合 parseContainerProps 保证读写往返无损。\r\n */\r\nexport function writeContainerProps(props: ContainerProps): string {\r\n return JSON5.stringify(props) ?? '{}'\r\n}\r\n\r\n/**\r\n * 更新编辑器文档中的容器属性。\r\n * 已有属性行则整行替换;没有属性行则在容器头行后插入一行。\r\n * @param headerPos 容器头行(:::type)任意位置,用于无属性行时定位插入点\r\n */\r\nexport function updateContainerProps(\r\n view: EditorView,\r\n headerPos: number,\r\n propsLineFrom: number,\r\n propsLineTo: number,\r\n newProps: ContainerProps\r\n): void {\r\n const newPropsLine = writeContainerProps(newProps)\r\n if (propsLineTo > propsLineFrom) {\r\n view.dispatch({\r\n changes: { from: propsLineFrom, to: propsLineTo, insert: newPropsLine },\r\n })\r\n } else {\r\n const headerLine = view.state.doc.lineAt(headerPos)\r\n view.dispatch({\r\n changes: { from: headerLine.to, insert: `\\n${newPropsLine}` },\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * 在当前光标位置插入新容器。\r\n * 创建 :::type 打开行 + 属性行 + ::: 关闭行的结构。\r\n */\r\nexport function insertContainer(\r\n view: EditorView,\r\n typeName: string,\r\n defaultProps: ContainerProps\r\n): void {\r\n const { from } = view.state.selection.main\r\n const propsLine = writeContainerProps(defaultProps)\r\n const container = `\\n:::${typeName}\\n${propsLine}\\n:::\\n`\r\n view.dispatch({ changes: { from, insert: container } })\r\n // 光标停在容器正文起始处\r\n view.dispatch({ selection: { anchor: from + `\\n:::${typeName}\\n${propsLine}\\n`.length } })\r\n}\r\n","import { useState, useEffect, useCallback } from 'react'\r\n\r\nexport function useFullscreen() {\r\n const [fullscreen, setFullscreen] = useState(false)\r\n\r\n const toggleFullscreen = useCallback(() => {\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen().catch((e) => {\r\n console.error('退出全屏失败:', e)\r\n })\r\n } else {\r\n const el = document.documentElement\r\n const requestMethod = el.requestFullscreen ||\r\n (el as any).webkitRequestFullscreen ||\r\n (el as any).mozRequestFullScreen ||\r\n (el as any).msRequestFullscreen\r\n if (requestMethod) {\r\n requestMethod.call(el).catch((e) => {\r\n console.error('进入全屏失败:', e)\r\n })\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n const handleFullscreenChange = () => {\r\n setFullscreen(!!document.fullscreenElement)\r\n }\r\n document.addEventListener('fullscreenchange', handleFullscreenChange)\r\n document.addEventListener('webkitfullscreenchange', handleFullscreenChange)\r\n return () => {\r\n document.removeEventListener('fullscreenchange', handleFullscreenChange)\r\n document.removeEventListener('webkitfullscreenchange', handleFullscreenChange)\r\n }\r\n }, [])\r\n\r\n return { fullscreen, toggleFullscreen }\r\n}\r\n","import { useEffect, useRef } from 'react'\r\n\r\n/**\r\n * 双向滚动同步 Hook\r\n * 编辑器与预览区互相同步滚动位置(基于比例)\r\n * 使用 syncing 锁防止双向循环触发\r\n *\r\n * 直接接收滚动容器元素(而非 ref):元素变化时 effect 重新执行并重新绑定监听,\r\n * 避免\"挂载时容器尚未就绪 / 编辑器 view 被重建\"导致监听永久失效或绑到旧节点。\r\n */\r\nexport function useScrollSync(\r\n source: HTMLElement | null,\r\n target: HTMLElement | null\r\n) {\r\n const rafIdRef = useRef<number | null>(null)\r\n // 锁:'source' 表示正在同步 source→target,'target' 表示反向\r\n const syncingRef = useRef<'source' | 'target' | null>(null)\r\n\r\n const syncScroll = (\r\n from: 'source' | 'target',\r\n fromEl: HTMLElement,\r\n toEl: HTMLElement\r\n ) => {\r\n if (rafIdRef.current) return\r\n rafIdRef.current = requestAnimationFrame(() => {\r\n const fromScrollHeight = fromEl.scrollHeight - fromEl.clientHeight\r\n if (fromScrollHeight <= 0) { rafIdRef.current = null; syncingRef.current = null; return }\r\n const ratio = fromEl.scrollTop / fromScrollHeight\r\n const toScrollHeight = toEl.scrollHeight - toEl.clientHeight\r\n if (toScrollHeight > 0) {\r\n syncingRef.current = from // 加锁\r\n toEl.scrollTop = ratio * toScrollHeight\r\n // 下一帧解锁,让对面的 listener 可以响应新的一次滚动\r\n requestAnimationFrame(() => { syncingRef.current = null })\r\n }\r\n rafIdRef.current = null\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n if (!source || !target) return\r\n\r\n const onSourceScroll = () => {\r\n if (syncingRef.current !== null) return // 锁住,正在被反向同步\r\n syncScroll('source', source, target)\r\n }\r\n\r\n const onTargetScroll = () => {\r\n if (syncingRef.current !== null) return // 锁住,正在被正向同步\r\n syncScroll('target', target, source)\r\n }\r\n\r\n source.addEventListener('scroll', onSourceScroll, { passive: true })\r\n target.addEventListener('scroll', onTargetScroll, { passive: true })\r\n\r\n return () => {\r\n source.removeEventListener('scroll', onSourceScroll)\r\n target.removeEventListener('scroll', onTargetScroll)\r\n if (rafIdRef.current) {\r\n cancelAnimationFrame(rafIdRef.current)\r\n rafIdRef.current = null\r\n }\r\n syncingRef.current = null\r\n }\r\n }, [source, target])\r\n}\r\n","import { useState, useRef, useCallback, useEffect, useMemo, useSyncExternalStore, forwardRef, useImperativeHandle } from 'react'\r\nimport type React from 'react'\r\nimport { App, message } from 'antd'\r\nimport Editor from './components/Editor'\r\nimport Preview from './components/Preview'\r\nimport SplitPanels from './components/Panel/SplitPanels'\r\nimport Toolbar from './components/Toolbar'\r\nimport EditDialog from './components/Dialog/EditDialog'\r\nimport componentRegistry from './registry/componentRegistry'\r\nimport { updateContainerProps, insertContainer } from './utils/writeContainer'\r\nimport type { ContainerBlock, ContainerProps } from './utils/parseContainer'\r\nimport type { ToolbarButtonConfig, ImageUploadConfig, ComponentSchema, NotifyFn } from './types'\r\nimport type { PreviewOptions } from './components/Preview'\r\nimport { ReadOutlined } from '@ant-design/icons'\r\nimport type { EditorView } from '@codemirror/view'\r\nimport { useFullscreen } from './hooks/useFullscreen'\r\nimport { useScrollSync } from './hooks/useScrollSync'\r\n\r\nexport interface MarkdownEditorRef {\r\n getContent: () => string\r\n}\r\n\r\nexport interface MarkdownEditorProps {\r\n /** 初始内容(非受控) */\r\n defaultValue?: string\r\n /** 受控内容;传入时请同时提供 onChange,否则外部更新会覆盖本地编辑 */\r\n value?: string\r\n /** 内容变化回调 */\r\n onChange?: (value: string) => void\r\n /** 是否显示预览面板 */\r\n showPreview?: boolean\r\n /** 是否支持全屏 */\r\n fullscreen?: boolean\r\n /** Preview 渲染配置 */\r\n previewOptions?: PreviewOptions\r\n /** 图片上传配置 */\r\n uploadConfig?: ImageUploadConfig\r\n /**\r\n * 局部注册的容器 schema:仅对当前编辑器实例生效,\r\n * 同名时覆盖全局注册(useRegisterToolbar)的 schema。\r\n * 请传入稳定引用(组件外常量或 useMemo)。\r\n */\r\n schemas?: ComponentSchema[]\r\n /**\r\n * 提示注入点(如\"请先配置图片上传功能\")。\r\n * 缺省使用宿主 antd App 上下文的 message,其次回退 console。\r\n */\r\n onNotify?: NotifyFn\r\n}\r\n\r\n/** 订阅注册中心版本,注册变化时触发重渲染 */\r\nfunction useRegistryVersion(): number {\r\n const subscribe = useCallback((onChange: () => void) => componentRegistry.subscribe(onChange), [])\r\n const getSnapshot = useCallback(() => componentRegistry.getVersion(), [])\r\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\r\n}\r\n\r\nconst MarkdownEditorInner = (\r\n {\r\n defaultValue = '',\r\n value,\r\n onChange,\r\n showPreview = true,\r\n fullscreen: fullscreenProp = true,\r\n previewOptions,\r\n uploadConfig,\r\n schemas,\r\n onNotify,\r\n }: MarkdownEditorProps,\r\n ref: React.Ref<MarkdownEditorRef>\r\n) => {\r\n const [content, setContent] = useState(value ?? defaultValue)\r\n const [editorView, setEditorView] = useState<EditorView | null>(null)\r\n const [scrollDOM, setScrollDOM] = useState<HTMLElement | null>(null)\r\n const [previewEl, setPreviewEl] = useState<HTMLDivElement | null>(null)\r\n const { fullscreen, toggleFullscreen } = useFullscreen()\r\n useScrollSync(scrollDOM, previewEl)\r\n\r\n // 容器编辑弹窗状态\r\n const [dialogVisible, setDialogVisible] = useState(false)\r\n const [dialogTypeName, setDialogTypeName] = useState('')\r\n const [dialogContainer, setDialogContainer] = useState<ContainerBlock | null>(null)\r\n\r\n const app = App.useApp()\r\n const notify = useCallback<NotifyFn>((type, text) => {\r\n if (onNotify) {\r\n onNotify(type, text)\r\n return\r\n }\r\n const messageApi = app?.message ?? message\r\n messageApi[type](text)\r\n }, [onNotify, app])\r\n\r\n // 受控模式:外部 value 变化时同步(跳过自身 onChange 引发的回环)\r\n const lastEmittedRef = useRef<string | undefined>(undefined)\r\n useEffect(() => {\r\n if (value !== undefined && value !== lastEmittedRef.current) {\r\n setContent(value)\r\n }\r\n }, [value])\r\n\r\n const internalSetContent = useCallback((newContent: string) => {\r\n setContent(newContent)\r\n lastEmittedRef.current = newContent\r\n onChange?.(newContent)\r\n }, [onChange])\r\n\r\n // 暴露 getContent 方法\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => content,\r\n }), [content])\r\n\r\n // 注册中心变化时重新生成工具栏按钮\r\n const registryVersion = useRegistryVersion()\r\n\r\n // 从注册中心(全局 + 局部)自动生成工具栏按钮\r\n const extraToolbarItems = useMemo<ToolbarButtonConfig[]>(() => {\r\n const merged = new Map<string, ComponentSchema>()\r\n for (const schema of componentRegistry.getAll()) {\r\n merged.set(schema.name, schema)\r\n }\r\n for (const schema of schemas ?? []) {\r\n merged.set(schema.name, schema)\r\n }\r\n return [...merged.values()].flatMap(schema => {\r\n // 支持 wrapTags 的标签包裹模式\r\n if (schema.wrapTags) {\r\n return {\r\n id: `wrap-${schema.name}`,\r\n label: schema.label,\r\n icon: schema.icon ?? ReadOutlined,\r\n wrapTags: schema.wrapTags,\r\n }\r\n }\r\n // 容器插入模式\r\n const defaultProps: ContainerProps = {}\r\n for (const field of schema.fields ?? []) {\r\n if (field.defaultValue !== undefined) {\r\n defaultProps[field.key] = field.defaultValue\r\n }\r\n }\r\n return {\r\n id: `container-${schema.name}`,\r\n label: schema.label,\r\n icon: schema.icon ?? ReadOutlined,\r\n handler: (view: EditorView) => insertContainer(view, schema.name, defaultProps),\r\n }\r\n })\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [registryVersion, schemas])\r\n\r\n const handleScrollReady = useCallback((dom: HTMLElement) => {\r\n setScrollDOM(dom)\r\n }, [])\r\n\r\n const handlePreviewRef = useCallback((node: HTMLDivElement | null) => {\r\n setPreviewEl(node)\r\n }, [])\r\n\r\n const handleViewReady = useCallback((view: EditorView) => {\r\n setEditorView(view)\r\n }, [])\r\n\r\n // 编辑容器属性时触发\r\n const handleEditContainer = useCallback((_view: EditorView, container: ContainerBlock) => {\r\n setDialogTypeName(container.typeName)\r\n setDialogContainer(container)\r\n setDialogVisible(true)\r\n }, [])\r\n\r\n // 保存容器属性(仅写回编辑器,不关闭弹窗;关闭由 EditDialog 内部控制)\r\n const handleDialogSave = useCallback((newProps: ContainerProps) => {\r\n if (editorView && dialogContainer) {\r\n updateContainerProps(\r\n editorView,\r\n dialogContainer.startPos,\r\n dialogContainer.propsLineFrom,\r\n dialogContainer.propsLineTo,\r\n newProps\r\n )\r\n }\r\n }, [editorView, dialogContainer])\r\n\r\n // 关闭弹窗\r\n const handleDialogClose = useCallback(() => {\r\n setDialogVisible(false)\r\n }, [])\r\n\r\n const editorNode = (\r\n <Editor\r\n value={content}\r\n onChange={internalSetContent}\r\n onScrollReady={handleScrollReady}\r\n onViewReady={handleViewReady}\r\n onEditContainer={handleEditContainer}\r\n uploadConfig={uploadConfig}\r\n onMessageNoUploadConfig={() => notify('warning', '请先配置图片上传功能')}\r\n />\r\n )\r\n\r\n return (\r\n <div className={fullscreen ? 'markdown-editor-app fullscreen' : 'markdown-editor-app'}>\r\n <Toolbar\r\n editorView={editorView}\r\n fullscreen={fullscreen}\r\n onToggleFullscreen={fullscreenProp ? toggleFullscreen : undefined}\r\n extraItems={extraToolbarItems}\r\n uploadConfig={uploadConfig}\r\n notify={notify}\r\n />\r\n {showPreview ? (\r\n <SplitPanels\r\n leftPanel={editorNode}\r\n rightPanel={\r\n <Preview\r\n content={content}\r\n ref={handlePreviewRef}\r\n previewOptions={previewOptions}\r\n />\r\n }\r\n />\r\n ) : editorNode}\r\n {/* 容器属性编辑弹窗 */}\r\n <EditDialog\r\n visible={dialogVisible}\r\n typeName={dialogTypeName}\r\n currentProps={dialogContainer?.props ?? {}}\r\n onSave={handleDialogSave}\r\n onClose={handleDialogClose}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nconst MarkdownEditor = forwardRef<MarkdownEditorRef, MarkdownEditorProps>(MarkdownEditorInner)\r\n\r\ninterface WrapperProps extends MarkdownEditorProps {\r\n ref?: React.Ref<MarkdownEditorRef>\r\n}\r\n\r\n/**\r\n * 包一层 antd App:为库内部的 message 等反馈组件提供上下文;\r\n * 宿主已有 App 包裹时内层仅作兜底(component={false} 不额外渲染 DOM)。\r\n */\r\nexport default function MarkdownEditorWithApp({ ref, ...props }: WrapperProps) {\r\n return (\r\n <App component={false}>\r\n <MarkdownEditor {...props} ref={ref} />\r\n </App>\r\n )\r\n}\r\n","import { useEffect } from 'react'\r\nimport componentRegistry from '../registry/componentRegistry'\r\nimport type { ComponentSchema } from '../types'\r\n\r\n/**\r\n * 注册自定义容器组件到工具栏。支持单个或批量注册。\r\n * 支持两种模式:\r\n * \r\n * 1. 容器模式(linkCard):name + fields + renderDialog\r\n * 插入 :::name 格式的容器,支持弹窗编辑属性\r\n * \r\n * 2. 标签包裹模式:name + wrapTags\r\n * 插入简单的标签包裹文本,如 <plugin-container>...</plugin-container>\r\n * \r\n * @example 容器模式 - 使用 fields 自动生成表单(最简)\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [\r\n * { key: 'type', name: '类型', componentType: 'select',\r\n * componentProps: { options: [{ value: 'price', label: '价格' }, { value: 'info', label: '信息' }] } },\r\n * { key: 'content', name: '内容', componentType: 'textarea',\r\n * componentProps: { rows: 3 } },\r\n * { key: 'enabled', name: '启用', componentType: 'switch' },\r\n * ],\r\n * }\r\n * // 支持的 componentType: 'input' | 'textarea' | 'number' | 'select' | 'switch' | 'slider' | 'rate' | 'color' | 'date' | 'dateRange'\r\n * ```\r\n * \r\n * @example 容器模式 - 使用 Form.Item 自动绑定(推荐)\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ form }) => (\r\n * <Form form={form} layout=\"vertical\">\r\n * <Form.Item name=\"level\" label=\"级别\">\r\n * <Input />\r\n * </Form.Item>\r\n * </Form>\r\n * ),\r\n * }\r\n * \r\n * function MyPage() {\r\n * useRegisterToolbar(schema)\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n * \r\n * @example 容器模式 - 手动控制\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ props, onChange }) => (\r\n * <Input value={props.level} onChange={e => onChange('level', e.target.value)} />\r\n * ),\r\n * }\r\n * ```\r\n * \r\n * @example 容器模式 - 完全自定义弹窗\r\n * ```tsx\r\n * const schema: ComponentSchema = {\r\n * name: 'alert',\r\n * label: '警告框',\r\n * icon: <AlertOutlined />,\r\n * fields: [{ key: 'level', defaultValue: 'info' }],\r\n * renderDialog: ({ props, onSave }) => (\r\n * <MyCustomEditor\r\n * value={props.level}\r\n * onSave={({ level }) => onSave({ level })}\r\n * />\r\n * ),\r\n * }\r\n * ```\r\n * \r\n * @example 标签包裹模式\r\n * ```tsx\r\n * function MyPage() {\r\n * useRegisterToolbar({\r\n * name: 'plugin-container',\r\n * label: '自定义容器',\r\n * icon: <AlertOutlined />,\r\n * wrapTags: ['<plugin-container>', '</plugin-container>'],\r\n * })\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n * \r\n * @example 批量注册\r\n * ```tsx\r\n * function MyPage() {\r\n * // 注意:schema 需声明为稳定引用(组件外常量或 useMemo),\r\n * // 否则每次渲染都会重新注册;多实例互不干扰的场景请改用\r\n * // <MarkdownEditor schemas={[...]} /> 局部注册\r\n * useRegisterToolbar([schema1, schema2, schema3])\r\n * return <MarkdownEditor />\r\n * }\r\n * ```\r\n */\r\nexport function useRegisterToolbar(schemas: ComponentSchema | ComponentSchema[]) {\r\n useEffect(() => {\r\n const schemaList: ComponentSchema[] = Array.isArray(schemas) ? schemas : [schemas]\r\n schemaList.forEach(schema => {\r\n componentRegistry.register(schema.name, schema)\r\n })\r\n return () => {\r\n schemaList.forEach(schema => {\r\n componentRegistry.unregister(schema.name)\r\n })\r\n }\r\n }, [schemas])\r\n}\r\n"],"x_google_ignoreList":[0,18],"mappings":"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"}
|