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

发布时间:2026/9/16 17:22:14

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/9/16 17:22:14

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

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

2026/9/16 18:07:22

IPA 包脱壳、Mach-O 解析与 Info.plist 信息提取实战

手上要是拿到一个 ipa 包,很多人第一反应是双击解压,翻出Payload目录,然后兴冲冲地对着里面的可执行文件跑class-dump,结果要么导出个空目录,要么报一堆错——原因很简单,从 App Store 渠道下来的应用&…

2026/9/16 18:07:22

React+SpringBoot前后端分离项目:从解压到云部署全流程实战

简介:这是基于React与Spring Boot的前后端分离校园社交平台项目,面向Java后端或前端学习者,提供从零搭建完整业务系统的参考,适合课程设计、毕业设计或项目实战练手。功能上实现用户注册登录、动态发布与点赞、个人资料维护&#…

2026/9/16 18:07:22

把 Cursor 的模型通道指向 TaoToken 之后,Chat 请求能发出

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

2026/9/16 18:07:22

Matlab机械臂RRT避障规划:从关节空间建模到真机部署

简介:本资源是一套基于RRT系列算法(含RRT、Bi-RRT及改进型a_biRRTs)实现机械臂避障轨迹规划的完整MATLAB工程,面向计算机、自动化、机械电子与人工智能方向的本科生及研究生,适用于课程设计、期末大作业与毕业设计等实…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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