在本站中
本站的 Markdown 全部由框架仓库 crates/widgets 里的 mdx.rs 渲染:文档、博客、课程、案例这些站点作者写的内容,以及评论和论坛帖子这些用户写的内容,走的是同一个 Markdown 组件,后者多一个 untrusted: true。它只用 pulldown-cmark 的解析器,不用 html 模块:事件流先收进一个 Vec,再递归地变成 Dioxus 的 RSX 元素,也就是说本站自己写了一条输出主线,替掉了 HTML 写出器。
用到 pulldown-cmark 的代码只有两个文件:mdx.rs 1313 行(第 924 行起是单元测试),sanitize.rs 569 行。写这一部分时,框架仓库 main 分支锁的是 pulldown-cmark 0.13.4,这一卷基于 0.13.5;两者的差别在怎么读这一卷里列过,对本站的影响在本部分唯一的一页里实测。
- 本站的 Markdown 渲染:七个
Options各管什么;解析之前自己切 frontmatter、把:::note改写成 GFM 提示块;render_stream递归消费事件,代码块、图片、表头三处自己吃掉子事件;标题锚点按 github-slugger 生成,标题末尾的空Text不影响它;表格对齐、任务列表标记、脚注引用在渲染时丢失;HTML 事件一律当文字显示;sanitize.rs在解析前按字符串剥标签,会误伤代码。本站内容仓库 1116 篇在 0.13.4 和 0.13.5 上事件流逐篇相同,解析约 48 ms,占整页服务端渲染的八分之一。
flowchart TB
src["Markdown 原文"] --> un{"untrusted"}
un -->|是| san["sanitize_user_html"]
un -->|否| fm["parse_mdx"]
san --> fm
fm --> adm["convert_admonitions"]
adm --> pe["parse_events"]
pe --> ids["assign_heading_ids"]
ids --> rs["render_stream"]
rs --> el["Dioxus Element"]
RSX、组件和服务端渲染本身是 dioxus 卷的内容:rsx! 怎么变成模板见 rsx! 展开成什么,水合时服务端和客户端要建出同一棵树见水合,代码块和 mermaid 为什么写进 dangerous_inner_html 见本站的页面怎么取数据。
💬 关联讨论
发起讨论加载中...