Files.md如何手写Markdown解析器:放弃AST后代码量减少3倍的实战

发布时间:2026/11/12 0:08:07

Files.md如何手写Markdown解析器:放弃AST后代码量减少3倍的实战 Files.md如何手写Markdown解析器放弃AST后代码量减少3倍的实战【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.mdFiles.md 是一个本地优先、纯.md文件驱动的笔记应用私有、安静的思考空间。本文分享它在手写 Markdown 解析器上的实战经验当年放弃通用的 AST抽象语法树方案后解析代码量直接减少 3 倍理解和维护的心智负担也随之大幅下降。这是一个少即是多的典型工程决策。 为什么放弃 AST边界情况太多认知负荷太重很多开发者处理 Markdown 时的第一反应是引入成熟解析库把文本解析成 AST再遍历节点渲染成 HTML。这条路在 Files.md 上也走过但很快被放弃原因写在了项目的架构决策记录ADR里走 AST 时遇到太多边界情况代码也愈发复杂。Markdown 并不那么难解析老老实实写直白的代码就好。最终代码量降到原来的 1/3理解起来也轻松多了。—— README.md核心矛盾在于你只需要支持自己业务用到的那一点点语法子集加粗、斜体、代码块、链接、清单却要承担整套 AST 机制带来的复杂度。对一个人或一个 LLM就能装进脑子里的小项目来说这是典型的过度设计。✂️ 手写解析的核心思路只做字符串到字符串的直白转换Files.md 的服务端用 Go 编写Markdown 处理全部集中在 server/pkg/txt/md.go 中。它的哲学可以概括为一句话不建树直接变换字符串。以 server/pkg/txt/md.go 中的MarkdownToHTML为例它要把用户的 Markdown 转成 Telegram 支持的那一小撮 HTML 标签。整个流程只有四步全部是正则 字符串替换先转义 HTML避免用户的破坏输出用占位符把代码块和行内代码临时替换掉占位符写成c0debl0ck、inl1ne这种不会自然出现的字符串保护它们不被后续转换误伤按空行\n{2,}切段对每段跑一个轻量级的手写解析器处理加粗、斜体恢复占位符再用正则把代码块、标题补上pre、code、b标签。代码注释里写得很直白We dont need to implement full-blown AST parser because TG only supports a few HTML tags.我们不需要实现完整的 AST 解析器因为 Telegram 只支持少数 HTML 标签。—— server/pkg/txt/md.go这就是手写解析器最重要的原则按需求的天花板来设计。你不需要解析完整 CommonMark你只需要解析业务真正用到的那一小部分。 轻量手写解析器用解析器组合子拼出语法server/pkg/txt/md.go 里有一个不到百行的迷你解析器没有 AST、没有节点对象核心类型只是一个函数type parser func(input string) []result每个解析器吃进一段字符串吐出已消费的部分 剩余的部分。在此之上只用三个组合子拼出全部语法and(a, b, c)按顺序依次匹配or(a, b)任一匹配即可some(p)重复匹配。于是加粗、斜体的语法树其实是函数嵌套就是几行声明式的拼装比如加粗 ** 若干(文本或斜体) **。项目明确只支持一层嵌套见 server/pkg/txt/md.go 注释因为笔记场景里两层以上的嵌套加粗几乎没有价值——主动砍掉语法代码自然简单。 反向转换也手写Telegram 实体 → Markdown解析器是双向的。用户在 Telegram Bot 里发的加粗、斜体消息需要还原成 Markdown 存进文件。这个逆向转换在 server/pkg/txt/tgtxt.go 中完成遍历 Telegram 的 message entities计算 UTF-16 偏移把**、*、等标记精确地插回文本里。同样是逐字符的直白逻辑没有引入任何第三方 Markdown 库。 前端同款思路逐行处理不引入任何构建浏览器端同样贯彻手写路线。web/lib/md.js 顶部的注释写着Various string functions, ported from Golang bot——前端逻辑就是从服务端逐字移植过去的。比如 web/lib/md.js 的extractHeaderAndBody取第一行做标题、截断过长标题、去重标题全靠split(\n) 前缀判断十几行解决从一段文本里提取标题这种 AST 方案里需要好几个节点遍历器才能做的事。更关键的是这种手写代码是双向可维护的改服务端的清单逻辑前端的移植版本几乎一比一对应新人读代码时所见即所得没有任何抽象层。 实战收益代码量减 3 倍理解成本大幅下降这次重构带来的直接收益项目 ADR 总结得很清楚维度AST 方案手写方案代码量基线约 1/3边界情况节点遍历的组合爆炸正则前缀匹配一眼看穿依赖引入成熟大库零依赖纯正则与字符串扩展方式写节点访问器加一个组合子或一条正则配套的原则也写进了 ADRTolerant Reader遇到乱码就跳过遇到有效标志如###但数据无效则明确报错。容错策略同样简单直接例如 server/habits/habits.go 解析习惯文件时逐行校验月标题失败就返回带上下文的错误。 小结什么时候该手写解析器Files.md 的经验可以浓缩成三条判断标准你的语法子集足够小——只处理加粗、斜体、代码块、清单就不需要通用 AST你要双向转换——Markdown ↔ 目标格式HTML、Telegram 实体都能用字符串进、字符串出的函数表达维护者是一个人 LLM——直白的代码能被完整装进工作记忆改一行不会牵动整个解析树。如果你的场景是渲染任意用户提交的复杂文档完整表格、嵌套列表、脚注成熟解析库仍是正解但如果是 Files.md 这种自己掌控输入格式的本地优先应用手写那个刚刚好的解析器往往比引入大轮子更省钱、更耐用。 延伸阅读docs/sync-flow.md 了解这些.md文件如何在设备间同步web/lib/md.js 可直接对照服务端 server/pkg/txt/md.go 阅读。【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.md创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/4 16:12:39

LunaTV 配置订阅:三分钟同步播放源,告别手改配置

LunaTV 配置订阅:三分钟同步播放源,告别手改配置 【免费下载链接】LunaTV 本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源 项目地址: https://gitcode.com/GitHub_Trending/l…

2026/11/12 0:04:01

西昌市电工作业查询通过率揭秘:怕考不过白交培训费?这几点要记牢

西昌市电工作业查询通过率揭秘:怕考不过白交培训费?这几点要记牢 怕考不过白交培训费?这事儿真不是危言耸听。不少在西昌市准备报考电工作业的朋友,最担心的就是花了几千块培训费,最后考试却挂了,钱打水漂不说,还得重新来过。尤其是现在特种作业证在建…

2026/11/12 0:04:01

西昌市电工作业查询怎么查?郑州报考避坑指南帮你少走弯路

西昌市电工作业查询怎么查?郑州报考避坑指南帮你少走弯路 实操考试心里没底怕挂科,这是很多准备考电工证的小伙伴最真实的感受。尤其是在西昌市,不少人在报考前对流程、考试内容和证书效力都存在疑惑,尤其是从郑州等外地转介过来的考生,更是对跨省办理和…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/11 23:59:01

凿岩工是不是特种工具?怎么报名才不踩坑

凿岩工是不是特种工具?怎么报名才不踩坑 实操考试心里没底怕挂科?凿岩工是不是特种工具?这个问题直接关系到你能不能顺利报名、考试、取证。今天咱们就从驻马店在职建筑工人的角度出发,一步一步带你搞清楚这些问题,报名流程、备考技巧、证书查询全讲透,…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑