新闻详情

新闻详情

首页 / 资讯中心 / 详情

The lunatic is on the grass

发布时间:2026/9/15 11:09:39来源:尧图网络
The lunatic is on the grass
The lunatic is on the grass【免费下载链接】milkdown Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdownThe lunatic is on the grassThe lunatic is on the grassThe lunatic is on the grass该文件覆盖了 Markdown 最常用的四级标题# 到 ####对应 HTML 的 h1 到 h4并且刻意让每级标题使用**相同的文本内容** The lunatic is on the grass。这种设计并非随意为之它让测试能够在“文本内容完全一致”的前提下专注于验证标题**级别level属性**、**DOM 标签h1/h2/h3/h4**以及**标题 id 去重机制**的行为差异从而精确暴露标题节点独有的处理逻辑。 需要说明的是e2e/tests/data 下的夹具大多由测试用例通过 loadFixture 统一加载见 [e2e/tests/misc/index.ts](https://link.gitcode.com/i/a74c742b469094e0e57409df487c53b9)而 heading.md 同时被输入类、快捷键类测试直接引用是理解 Milkdown 标题节点行为的核心数据源。 ## Markdown 解析阶段标题如何进入编辑器 Milkdown 通过 milkdown/transformer 将 Markdown 文本解析为 ProseMirror 文档。标题的解析入口位于 preset-commonmark 的 heading 节点定义 [packages/plugins/preset-commonmark/src/node/heading.ts](https://link.gitcode.com/i/a12110c4b3c2af7092be5cf5cddc6e64) ts parseMarkdown: { match: ({ type }) type heading, runner: (state, node, type) { const depth node.depth as number state.openNode(type, { level: depth }) state.next(node.children) state.closeNode() }, },解析逻辑非常直白当 Markdown 抽象语法树中出现heading类型节点时直接取其depth即#的个数作为 ProseMirror 节点属性level然后递归处理子节点标题内的行内内容如加粗、斜体、链接等最后关闭节点。对应的序列化方向同样在同一个文件中toMarkdown: { match: (node) node.type.name heading, runner: (state, node) { state.openNode(heading, undefined, { depth: node.attrs.level }) serializeText(state, node) state.closeNode() }, },toMarkdown将编辑器内的 heading 节点重新写回 Markdown以node.attrs.level作为depth再序列化标题的行内文本。这样# The lunatic is on the grass在“Markdown → 编辑器 DOM → Markdown”的往返过程中可以保持语义一致。Heading 节点 Schemalevel 与 id 双属性建模标题节点的 ProseMirror Schema 定义在同一文件 heading.ts其核心结构如下export const headingSchema $nodeSchema(heading, (ctx) { const getId ctx.get(headingIdGenerator.key) return { content: inline*, group: block, defining: true, attrs: { id: { default: , validate: string }, level: { default: 1, validate: number }, }, parseDOM: headingIndex.map((x) ({ tag: h${x}, getAttrs: (node) ({ level: x, id: node.id }), })), toDOM: (node) [ h${node.attrs.level}, { ...ctx.get(headingAttr.key)(node), id: node.attrs.id || getId(node) }, 0, ], } })值得注意的细节content: inline*标题内只允许行内内容文本、强调、代码、链接等不允许嵌套块级节点defining: true声明标题是“定义性”块在块删除/提升等操作中会保留其结构边界level标题级别16对应h1h6id标题锚点 idtoDOM中当id为空时会调用getId(node)自动生成详见下文。parseDOM由headingIndex动态生成Array(6).fill(0).map((_, i) i 1)即同时注册h1h6六个 HTML 标签的解析规则粘贴 HTML 内容时也会被识别为标题节点。标题与段落等节点一起在 composed/schema.ts 中被注册进preset-commonmark的 schema 组合中。标题 id 的生成与去重机制标题 id 是 Milkdown 标题节点的一大特色默认根据文本内容生成 slug 形式的锚点 id。生成器通过$ctx暴露可在初始化编辑器时自定义function defaultHeadingIdGenerator(node: Node) { return node.textContent.toLowerCase().trim().replace(/\s/g, -) } export const headingIdGenerator $ctx( defaultHeadingIdGenerator, headingIdGenerator )默认规则为取标题文本 → 转小写 → 去首尾空白 → 将连续空白替换为-。例如# The lunatic is on the grass会生成the-lunatic-is-on-the-grass。重复 id 的处理由syncHeadingIdPlugin完成它被注册在 composed/plugins.ts 中。其行为在 e2e/tests/input/heading.spec.ts 中有精确断言# Heading1 → id: heading1 # Heading1 → id: heading1-#2 ## Heading1 → id: heading1-#3即当出现同文本的重复标题时后续标题会在基础 id 后追加-#2、-#3等后缀以保证唯一性。这意味着即使标题文本完全相同每个标题仍拥有可稳定引用的锚点 id——这正是 heading.md 夹具让四行标题文本全部相同的原因之一它便于在“文本相同”的前提下单独验证 id 去重逻辑。输入规则输入#即可生成标题wrapInHeadingInputRule提供了 Markdown 风格的快捷输入在行首输入若干#并跟一个空格当前块即被转换为对应级别的标题heading.tstextblockTypeInputRule( /^(?hashes#)\s$/, headingSchema.type(ctx), (match) { const x match.groups?.hashes?.length || 0 const view ctx.get(editorViewCtx) const { $from } view.state.selection const node $from.node() if (node.type.name heading) { let level Number(node.attrs.level) Number(x) if (level 6) level 6 return { level } } return { level: x } } )【免费下载链接】milkdown Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

告别高价坑,qq直接登录网站无需下载从零搭建实操 2026/9/15 12:03:48

告别高价坑,qq直接登录网站无需下载从零搭建实操

告别高价坑,qq直接登录网站无需下载从零搭建实操 找建站公司报价八千起步,还嫌你要求多?别被忽悠了。其实很多基础功能,比如用户登录,自己动手就能搞定,成本几乎为零。特别是对于想从零搭建一个轻量级站点的设计师或开发者来说,利用现有社交账号体系…

阅读更多 →
IIS下会话Cookie缺少HttpOnly属性修复指南:原理、配置与全局加固 2026/9/15 12:03:48

IIS下会话Cookie缺少HttpOnly属性修复指南:原理、配置与全局加固

1. 先说结论:这个“高危漏洞”到底是什么如果你最近在给公司做等保测评,或者用 Nessus、AWVS、AppScan 这类扫描器扫过自家 IIS 站点,大概率见过这么一条告警——“会话Cookie中缺少HttpOnly属性”。我第一次看到这玩意儿是在给某个客户的 OA…

阅读更多 →
CKEditor 5 测试辅助工具(Testing Helpers)完全指南:用 `_getModelData()` / `_setModelData()` 操控模型与视图 2026/9/15 12:03:48

CKEditor 5 测试辅助工具(Testing Helpers)完全指南:用 `_getModelData()` / `_setModelData()` 操控模型与视图

CKEditor 5 测试辅助工具(Testing Helpers)完全指南:用 _getModelData() / _setModelData() 操控模型与视图 【免费下载链接】ckeditor5 Powerful rich text editor framework with a modular architecture, modern integrations, and featur…

阅读更多 →
网络空间安全考研经验帖写作规范与内容要求 2026/9/15 12:03:48

网络空间安全考研经验帖写作规范与内容要求

我无法根据“2022网安保研经验帖”这一标题生成符合要求的博文。原因如下:该标题指向的是个人考研经验分享类内容,属于教育路径规划、备考策略、院校选择、复习方法等软性经验总结范畴;但您提供的输入中完全缺失项目正文、关键词、摘要描述等…

阅读更多 →
Git基础教程:从安装配置到分支协作一次搞懂 2026/9/15 12:03:48

Git基础教程:从安装配置到分支协作一次搞懂

做开发这些年,Git是我几乎每天都在用的工具,但坦白讲,身边很多朋友并不是第一天就真正理解了它。他们往往靠“死记硬背”记住那几条常用命令,遇到分支冲突、历史回退、协作报错时就开始懵。这篇博客就带你系统过一遍Git基础——从…

阅读更多 →
douyin-downloader 抖音音频批量下载教程:部署、音乐提取与定时任务全解 2026/9/15 12:00:48

douyin-downloader 抖音音频批量下载教程:部署、音乐提取与定时任务全解

douyin-downloader 抖音音频批量下载教程:部署、音乐提取与定时任务全解 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and brows…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞