作者使用tree-sitter为博客添加了语法高亮,分享了学习过程中的一些经验和抱怨:
- 静态站点生成器:几年前将博客迁移到自己的网站,使用 Rust 程序将 Markdown 文件转换为 HTML,并从Handlebars模板生成完整页面,部分原因是学习 Rust,且自己编写模板能更好地控制页面逻辑。
- Markdown 摄入:对每个 Markdown 文件进行处理,包括分离和反序列化YAML 前端内容、找到
<cut>
或<toc>
标记以确定摘要结束位置和插入目录的位置、为标题添加自链接锚点等,之前使用正则表达式处理,现在为了语法高亮在pulldown-cmark
的解析器和渲染器之间添加了代码,减少了正则表达式的使用,但子标题链接化和目录构建变得更复杂但更稳定,检测代码块并通过高亮器传递相对简单。可查看 Markdown 处理代码。 高亮显示:参考tree-sitter-highlight 文档和femark,遇到一些问题。
- 不兼容?!:按照文档无法使最新的
tree-sitter-highlight
正常工作,认为当前的 tree-sitter 包不兼容,最终解决问题,文档中某些代码写法有误。 - 高亮名称:对
tree-sitter-highlight
期望硬编码高亮名称且未解释来源和含义感到不满,找到tree_sitter_javascript::HIGHLIGHT_QUERY
对应highlights.scm
文件,决定将其包含的所有名称作为正确的高亮名称列表。 - 类名:
tree-sitter-highlight
的HtmlRenderer
有attribute_callback
,将点分隔的高亮名称转换为空格分隔的类属性,使 Rust 代码无需了解语言的tree-sitter
语法或高亮查询,语法高亮名称自动成为 CSS 类名。 - 样式代码:可以编写简单的 CSS 为代码添加颜色,如使类型名称为绿色等。
- 结果:可查看
tree-sitter-highlight
包装器,添加新语言支持相对简单。
- 不兼容?!:按照文档无法使最新的
未来工作:
- 前端内容:简化每页源格式旋钮,使用
pulldown-cmark
的 YAML 前端内容支持,处理特殊情况页面。 - 模板:对Handlebars不完全满意,考虑寻找更静态的 Rust 模板系统,保持模板主要为 HTML 并少量插入内容。
- Feed 样式:Atom Feed 中没有 CSS,不确定 feed 阅读器是否接受
<style>
标签或是否必须为内联样式。 - 高亮质量:对
tree-sitter
语言语法和高亮查询提供的细节和一致性不满意,如 CSS 中类名和属性名颜色相同等,但目前认为足够好,至少不涉及 JavaScript。
- 前端内容:简化每页源格式旋钮,使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。