Markdown有序列表以数字加英文句点开头,生成语义化结构,序号仅标识起始与层级,不参与渲染;嵌套需缩进,标准解析器忽略start等HTML属性,兼容性依赖CommonMark规范。

Markdown 有序列表语法直接对应 ol 结构
Markdown 的有序列表(1.、2.、123. 等)在标准解析器中默认生成语义正确的 ,不是靠计数器或 CSS 模拟。关键在于:**序号数字本身不参与渲染,只用于识别列表起始和嵌套层级**。
常见错误现象:3. item 被转成 但父容器仍是 —— 这是合法 HTML,但部分 Markdown 渲染器(如旧版 marked)会忽略 start 属性,统一从 1 开始编号。
- 标准行为:只要每行以
\d+\.开头且缩进一致,就进入同一 - 嵌套时用 4 空格或 1 Tab 缩进,会生成嵌套
,而非等变体 - 不支持
type="I"或reversed等 HTML 属性,这些需手动插入 HTML 或通过扩展语法(如 pandoc 的 `^` 标记)
html2text 默认把 ol 转回数字序号,但不保留原始起始值
当你用 html2text 反向转换 HTML 到 Markdown 时,它会把 输出为 5. foo —— 看似还原,实则丢失了「该列表是否独立于前文」的语义。后续若再转回 HTML,可能被解析为新列表而非延续。
真正影响输出的是 HTML 结构本身是否规整:
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
- 如果原 HTML 的
包含start、reversed或type,html2text -g会尝试保留(但type="A"会被降级为1.) - 若
出现在中间项,html2text通常忽略该属性,仍按顺序输出1.–n. - 混用
和嵌套时,-g模式能正确识别层级,但非-g模式可能把内层当作普通段落
自研解析器里处理 ol 的两个硬约束
如果你在写自己的 Markdown → HTML 解析器(比如基于正则或状态机),ol 是少数必须维护上下文状态的元素之一。不能单行处理,必须跟踪:
-
当前是否在列表中:遇到
1.时要判断是新开,还是继续上一个(依据缩进和数字连续性) -
数字是否“合理递增”:
1.后跟3.通常视为新列表起点,而非跳过第 2 项;但1.→1.(相同数字)大概率是用户误写,应合并为同一下的两个
多数成熟解析器(如 remark、marked)对非连续数字采取「重置计数」策略,即 1. a\n3. b 会生成 —— 这符合 HTML 规范,但和作者本意可能不符。
pandoc 和 remark 对 ol 的差异处理
pandoc 把有序列表当「带元数据的块」处理,支持显式指定起始值和样式:
-
1) first→;a) first→ - 用
1. [^1]这类脚注语法不会打断列表,而 remark 会认为这是新段落 -
remark更严格遵循 CommonMark:只认.(点)结尾的数字序号,)结尾需插件支持(如remark-gfm) - 两者都默认忽略
start属性的语义,除非你用pandoc --from=html+startnum显式启用
真正容易被忽略的是:**浏览器渲染 时,CSS 的 counter-reset 和 counter-increment 会覆盖 HTML 的 start 值**。所以即使你生成了 ,若页面加载了 GitHub 的 github-markdown-css,序号仍从 1 开始 —— 因为它的 CSS 强制重置了计数器。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










