markdown解析器
1 python markdown 解析器
- mistletoe Star 665
- 主要支持 CommonMark Markdown
- mistune Star 2.3k
- 较量级
- markdown_it Start 16.1k
- javascript 库
- markdown Star 3.4k
- 对 pandoc 支持相对较好
- 功能比较强大
- 帮助页:https://python-markdown.github.io/
- markdown2 Start 2.5k
- 用于转 html
2 mistune
2.1 github 地址
https://github.com/lepture/mistune
2.2 输入 markdown,输出 html 文本。
1 | import mistune |
mistune 还支持插件,显示更复杂的界面。
主要这是一个纯 python 的,不涉及前端工具链。
2.3 输出树型结构
1 | import mistune |
2.4 处理特定格式
1 | import mistune |
注意
有一些包含关系,如果使用 render,可能被忽略掉了。
2.6 参考
1 | $ pip install mistune |
3 commonmark
1 | import commonmark |
AST 意为抽象语法树
pandocfilter
1 | # my_filter |
运行:
1 | pandoc -s xx.docx -f docx -t json|python my_filter.py |
选库
选库的核心逻辑如下:
- 编码:markdown 语法非常简单,因此不需要特定库来输出
- 解码:理论上来说,也可以自己实现解码,按行解析可能有以下问题
- 代码块跨行
- 引用块跨行
- 表格跨行
- 转换:上述多数的库目标在于将 markdown 转换成其它格式,而多数是转换成 html 格式
解决方法:
- 使用如 python-markdown 将文档切分成 block
- 切块以两个回车作为 block 的分界,可能将程序段一分为二
讨论:
- 如果 markdown 是我们自己写的,则可能的问题都可以处理掉:
- 如多余的空行
- 多余的字体,加粗,斜体设置
Markdown 格式
列表的显示只需要在文字前加上 - 或 * 即可变为无序列表,有序列表则直接在文字前加 1. 2. 3. 符号要和文字之间加上一个字符的空格。
多级编号,使用四个空格,或者一个 Tab 缩进。
1 | 1. 一级项目 |
如果识别了目录或者附录,可将其作为一级标题。
因此优先级是:
第一级:各级标题,目录,附录
第二级:有序列表,无序列表,按缩进分子级
其它:包含关键字的短行,数字标号,如 1,2,3
问题:
- 无法确定数字/关键字标号,与文档中标题的格式的上下级关系
- 在所在块内部,继续向下分级
- 设立相对级别号和绝对级别号
- 有时候库解决出来不对
- 这种情况下,也可能是我们转换生成的 markdown 文件本身格式有问题
- 可以做一个包含正常格式的文档,用不同解析器测试其效果
- 多级编号,都是 "1." 看起来很怪
- 如果能确定,可以使用多级无序编号格式,把序号作为标题的一部分
1 | - (a) 第一层 |
- 标题1
- 标题2
- 标题3 # 表头 header = ["姓名", "年龄", "城市"] # 数据 data = [ ["Alice", 25, "New York"], ["Bob", 30, "San Francisco"], ["Charlie", 22, "Los Angeles"],]
1
2
3
4
5
6
可固定写成上述模式,并在内部在特殊格式存储,并可对比正文的标题,进行对齐
* 表格
* 不用太考虑排版,主要是让使用到的解码库识别成表即可
生成Markdown表格
markdown_table = "| " + " | ".join(header) + " |" markdown_table += "| " + " | ".join(["---"] * len(header)) + " |"
for row in data: markdown_table += "| " + " | ".join(map(str, row)) + " |"
打印Markdown表格
print(markdown_table) ```
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.