# MarkdownEditor 块级编辑设计文档 ## 概述 `MarkdownEditor` 是 yurou(语柔)的核心编辑组件,支持两种编辑模式: | 模式 | 说明 | |---|---| | **双栏**(split) | 左侧 textarea 编辑源码,右侧 unified 渲染 HTML 预览,滚动同步 | | **单栏**(wysiwyg) | 逐块渲染与编辑:点击任意块弹出其原始 markdown 源码,失焦后自动重新渲染 | ## 技术栈 - **解析**:`remark-parse` + `remark-gfm`(GFM 扩展:表格、任务列表、删除线) - **转换**:`remark-rehype`(mdast → hast) - **安全**:`rehype-sanitize`(过滤 XSS,保留 `data-*` 属性) - **输出**:`rehype-stringify`(hast → HTML 字符串) - **框架**:Vue 3 Composition API + TypeScript ## 整体架构 ``` modelValue (markdown 字符串) │ ├─── split 模式 ────────────────────────── │ │ │ ├── textarea (左栏,编辑源码) │ │ 输入 → emit('update:modelValue') │ │ │ └── div.markdown-preview (右栏,v-html) │ unified.processSync(md) → HTML │ 滚动同步:textarea.scrollTop ↔ div.scrollTop │ └─── wysiwyg 模式 ──────────────────────── │ ├── remark-parse → mdast │ 提取每个顶层子节点的 position (offset) │ ├── 每个 block: │ source = md.slice(start, end) // 原始源码 │ html = unified.processSync(source) // 渲染 HTML │ ├── blocks[] = [{id, source, html, startOffset, endOffset}, ...] │ └── 模板中 v-for: editingBlockId === block.id ?