展示 HN:通过编写一个 Markdown 到 HTML 编译器来学习 Rust
嗨,我是安德里亚。我是 Rust 新手,认为接触它的一个非常实际的方法是写一些东西。我考虑过写自己 .md 到 .html 编译器已经有一段时间了。所以在这里,我们的微型博客和项目都得以实现。在开始撰写它之前,我正在使用 Hugo。它真的很好,但你知道,有时候这只是太复杂了,我只想要一个非常简单的工具,不想花一辈子的时间挑选主题和其他东西,或者也许作为一名软件工程师,我认为我可以自己构建它,经过 12-13 个小时的非闲暇时间,我最终想出了某种东西。它非常基础,没有使用生成 AI 工具,并尽可能多地包含文档。目前我已经实现了非常基本的 .md 语法,最终会在后续扩展。一段时间前我看过《龙书》,所以编写一个编译器并不是完全陌生,但看到我的一些选择与实际的 .md 到 .html 编译器相似,甚至和 Hugo 本身相似,这很有趣。编译过程遵循以下步骤:扫描 `post/` 目录中的每个文件,扫描块元素,扫描每个块的行内元素,最后我们会得到一个中间表示(构建 AST 始终很酷):[ 标题 { 级别: H1, 内容: [ 文本( "这一点\n", ), ], }, 标题 { 级别: H2, 内容: [ 文本( "是\n", ), ], }, 段落( [ 文本( "一个非常 ", ), 斜体( "简单", ), 文本( " ", ), 粗体( "帖子", ), 文本( "\n", ), ], ), ] 输出为 `.html` 格式并使用模板(非常基础)。输出到文件特别简单,因为在 Block => Inline 上重新定义 Display 使其与简单的显示没有区别。这里是生成的索引和几个帖子示例。现在让我们深入一些技术细节:每个帖子以 YAML 前置块开头,使用 --- 分隔: --- 标题: 构建一个 markdown 编译器 日期: 2026-07-27 描述: 在索引中显示的一行 标签: [rust, web] 草稿: false --- [markdown 内容] 标题和日期是必填项,其余为可选。日期格式为 YYYY-MM-DD,并驱动索引的排序。设置草稿: true 将完全跳过该帖子。这是当前 CommonMark 覆盖范围的列表:标题: `#` 到 `######` 段落: 由空行分隔的文本块 代码块: ``` 或 ~~~ 有序列表: `- [文本]` 无序列表: `n) [文本]` 或 `n. [文本]` 引用: `> 引用` 行内代码: `代码` 行内删除线: ~文本~ 行内粗体: **文本** 行内斜体: *文本* 链接: [文本](url) 图片: ,图片的 url 参考 `static/` 目录。 index.html 是整个帖子列表,没有分页和客户端路由,过滤可以通过页面顶部的搜索栏完成(搜索栏的快捷键是 /,搜索文本可以用 esc 删除),或者通过单个帖子的标签或者仍然在页面顶部。你可以通过类似 Vim 的移动在帖子之间和帖子内部导航(这是 vibe 编码和主题相关的,因此我不会跟踪它,试试吧,这很酷,你也可以复制文本 :) )。别觉得这个工具会对除了我以外的任何人有用,但制作它很有趣,也肯定会扩展,代码可以在这个仓库中找到。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡