是时候构建 Markdown 解析器和处理器了(MDL 日志 #1)
我需要编写一个 Markdown 解析器和处理器。我的写作项目已经超出了我现有工具的能力范围。此外,高质量的写作工具也十分匮乏——这是我在撰写书籍时发现的。我最终决定必须解决这个问题,希望它也能对其他人有所帮助。
我觉得最好的开始方式就是在 dev.to 上发帖。也许我有点拖延,但我发帖是有原因的。我想让大家有机会从一开始就关注开发过程。目前我有一个代码仓库,但是里面是空的。
我鼓励你们提出问题,质疑项目中遇到的任何问题。
要求
正确的入手点应该是用户故事。不过,用用户故事来描述我自己有点尴尬。而且,我的需求比较明确,所以要求也比较严格。尽管如此,随着项目的推进,我会再回到正式的用户故事。目前有些功能还缺少一些动机。
以下是我需要的一些关键物品:
- 我在技术博客文章中所做的所有操作。这包括标准格式,包括代码、图片和 LaTeX 公式。(用更好的技术替代 LaTeX 是一个长期计划。)
- 目标平台众多。我会在自己的网站、dev.to、Medium、我的烹饪网站以及一些写作网站上发布内容。这些平台对格式和编码的要求各不相同。
- 电子书和印刷版都已准备就绪。我对写作领域现有的工具感到震惊。原本应该只需使用基本的 Markdown 就能出版一本精美的书籍。
我会根据时间情况,用用户故事来完善这些内容。这能帮助你理解我为什么需要这些功能,以及它们应该如何运作。我还在 Skillshare 上准备一个关于编写用户故事的课程;之后我会回复你相关信息。
建筑学
我写过的解析器和树处理器多到数不清。我不会评估任何现有的解决方案——我想我已经做了二十多年了,但仍然对现有的方案不满意。我最近在 Leaf 项目中使用了一个堪称典范的解析器结构,我想我会借鉴它。
该文档系统的工作原理与编译器类似,包含以下几个阶段:
- 树形解析器:将原始文档解析成一个节点树。它处理底层源代码细节并进行部分语法处理。通过使用通用树,我们可以将许多语言细节排除在解析器之外;因此,它更简单。
- 语法分析树转换器:在这里,语法分析树会被扫描并转换为抽象语法树(AST)。这会将底层结构提升到高层语法。
- AST 处理:许多工具都将在此阶段构建。输入树会被添加更多信息进行注释,用户模板等内容会被解析,并将各个部分整合在一起。虽然导出模式会影响此阶段,但它仍然是一棵抽象树。
- 降级/导出:AST 被导出为最终文档格式。这包括处理语法高亮、LaTeX 图形创建、将源代码上传到 gist 等功能。
随着工作的推进,我会提供每个阶段的更多信息。这种结构提供了几个不同的层级,可以在其中添加扩展功能。
虽然我会用 Python 编写代码,但树形解析器最终会用 C++ 实现。它是处理过程中最耗费资源的部分——逐个字符扫描对于解释型或动态语言来说都是个难题。不过,我最初的需求是处理单个文档,所以目前速度并不是主要考虑因素。
第一个目标
我的首要目标是实现一个基本的树形解析器。这是一个可测试的组件,也是整个组件链中的第一个,是所有其他组件的入口点。
完成后我会更新进度。在此期间,欢迎随时提问。您可以查看代码仓库,但它暂时会是空的,之后会比较混乱。我认为重构比设计更重要。
文章来源:https://dev.to/mortoray/time-to-build-a-markdown-parser-and-processor-edl-log-1-44b1