|
| 1 | +--- |
| 2 | +.title = "迁移 zigcc 主页到 zine", |
| 3 | +.date = @date("2025-07-19"), |
| 4 | +.author = "xihale", |
| 5 | +.layout = "post.shtml", |
| 6 | +--- |
| 7 | + |
| 8 | +# [为什么要迁移]($section.id("为什么要迁移")) |
| 9 | + |
| 10 | +原先是基于 hugo 和 docsy 主题搭建的。 |
| 11 | + |
| 12 | +1. hugo 有一些小问题(比如 footer 里 md 解析得有些 奇怪的行为) |
| 13 | +2. docsy 主题不好看(Hugo 确实很强大,但是 Hugo 给我的初步印象是:生态太老了,无论是技术上和审美上。) |
| 14 | +3. 代码高亮难看 |
| 15 | + 主流的代码高亮库有 `highlight.js` `prime.js` `shiki.js`,效果最好的是 `shiki.js`,然而,zine 对于 zig 的高亮比他们都要更加细致,由此我可以做更多细粒控制。(代价是,对其他语言的 parse 做得很烂,这里我暂时也不清楚究竟是怎么回事,上有应该是调用 tree-sitter 来解析的) |
| 16 | +4. 生成到其他格式(比如 pdf )比较不方便 |
| 17 | + 但是 zine 的 layout 和 scripty 等支持天然让我们的组织结构具有了极大的灵活性,相信在不远的将来我们便可以实现 pdf generation!(RSS 生成也是同理) |
| 18 | +5. 迁移后,后端 build 性能和前端 render 性能都显著提高。(当然,这也是因为 组织结构的简化带来的好处,毕竟基于 zine 的架构,结构比较简单。 |
| 19 | + |
| 20 | +当然,还有一个很重要的原因是:使用 zine 可以反哺 zig 生态的发展,我觉得这是我们这些做社区的人应该背负的责任,正如 刘家财 对我说的一句话:“如果我们都不用,那更不会有别人用了。” |
| 21 | +不出意料,本次 迁移 就发现了很多 zine 的问题和可以改进的点子。 |
| 22 | + |
| 23 | +# [什么是 zine(zine 的组织结构)]($section.id("什么是zine")) |
| 24 | + |
| 25 | +首先我们看看 最简 sample 的 tree (基于 `zine init` 删减而来) |
| 26 | + |
| 27 | +```sh |
| 28 | +. |
| 29 | +├── assets # 资源文件 |
| 30 | +├── content # 内容文件 |
| 31 | +│ ├── about.smd |
| 32 | +│ ├── blog |
| 33 | +│ │ ├── first-post |
| 34 | +│ │ │ ├── fanzine.jpg |
| 35 | +│ │ │ └── index.smd |
| 36 | +│ │ ├── index.smd |
| 37 | +│ │ └── second-post.smd |
| 38 | +│ ├── devlog |
| 39 | +│ │ ├── 1989.smd |
| 40 | +│ │ ├── 1990.smd |
| 41 | +│ │ └── index.smd |
| 42 | +│ └── index.smd |
| 43 | +├── layouts # 所有的 smd 必须对应且只对应 一个 layout 文件 |
| 44 | +│ ├── blog.shtml |
| 45 | +│ ├── blog.xml # RSS 支持 |
| 46 | +│ ├── devlog-archive.shtml |
| 47 | +│ ├── devlog.shtml |
| 48 | +│ ├── devlog.xml # RSS 支持 |
| 49 | +│ ├── index.shtml |
| 50 | +│ ├── page.shtml |
| 51 | +│ ├── post.shtml |
| 52 | +│ └── templates # templates 可以被其他 layout 文件 extend 以达到代码复用的目的 |
| 53 | +│ └── base.shtml |
| 54 | +└── zine.ziggy # zine 配置文件 |
| 55 | +``` |
| 56 | + |
| 57 | +<https://zine-ssg.io/> |
| 58 | +一定要看一下官网文档。 |
| 59 | + |
| 60 | +content 和 layout 这个结构非常平凡,前端框架一般都会采用这种结构,而像 hexo, hugo 等则是已经帮你写好了 theme 文件,然后暴露配置来做细粒度控制。 |
| 61 | + |
| 62 | +# [如何迁移]($section.id("如何迁移")) |
| 63 | + |
| 64 | +最基本也是最重要的是:你需要将你的文件转换到 smd 和 shtml 的专属语法,他们很像,但还是有很多不一样的。 |
| 65 | +比如: |
| 66 | + |
| 67 | +1. smd 不推荐直接嵌入 html 代码,所以你的 html 代码要用 ` ```=html` 包裹 |
| 68 | +2. 小标题不会自动办理 warp 并且生成 id 和 hash 链接,要用 `$Section.id` (id 不能包含空格) |
| 69 | +3. 资源引入可以用 scripty api,也可以放在 public 下面再引用 `/xxx` |
| 70 | + |
| 71 | +下面是此次 zigcc 主页的迁移日志(大概版) |
| 72 | + |
| 73 | +由于本项目不涉及 Hugo 的专有语法(`{% ... %}`),所以此处不包括此内容的处理 |
| 74 | + |
| 75 | +# [转换文件到 smd]($section.id("content2smd")) |
| 76 | + |
| 77 | +一开始我没有考虑到 org 的复杂性,让 AI 帮忙写了 md to smd 的脚本,运作良好,但是 org 的脚本就不太行,所以改用 pandoc。 |
| 78 | +最终效果很好,但还是有一些东西要手动改,比如资源引入,html 代码块的嵌入等等。 |
| 79 | + |
| 80 | +以下是用来转换 org 到 smd 的 fish 脚本,理论来说 md 也可以这么做。 |
| 81 | + |
| 82 | +注意,这里其实是转换到了 md 格式。 |
| 83 | + |
| 84 | +```fish |
| 85 | +for f in *.org |
| 86 | + pandoc -s $f -t gfm -o (path change-extension "smd" $f) |
| 87 | +end |
| 88 | +``` |
| 89 | + |
| 90 | +暂时可以先不去手动去做 smd 适配,先把 layout 写好再搞要方便些(可以实时预览)。 |
| 91 | + |
| 92 | +# [frontmatter]($section.id("frontmatter")) |
| 93 | + |
| 94 | +zine 的 frontmatter 采用 `ziggy` 语法 |
| 95 | + |
| 96 | +ziggy 很简单,基本上是对标 zig 语法(某些细微处有些不一样) |
| 97 | + |
| 98 | +[ziggy 官网](https://ziggy-lang.io/) 提供了一个 [convertor](https://ziggy-lang.io/documentation/ziggy-convert/) ,可以将 YAML/TOML/JSON 转换到 ziggy 格式 |
| 99 | + |
| 100 | +```zig |
| 101 | +--- |
| 102 | +.title = "Zig comptime", |
| 103 | +.date = @date("2025-01-23T12:00:00+08:00"), |
| 104 | +.author = "xihale", |
| 105 | +.layout = "post.shtml", |
| 106 | +.draft = false, |
| 107 | +--- |
| 108 | +``` |
| 109 | + |
| 110 | +# [layout]($section.id("layout")) |
| 111 | + |
| 112 | +由于我不喜欢 docsy 的样式,所以我选择重新设计一套 layout,采用简约风格,也就是目前这个样子,有很多地方还是有点丑,toc 以后可能还要改。 |
| 113 | + |
| 114 | +1. zine 采用 [id Slot](https://zine-ssg.io/docs/superhtml/#super), 灵活性比普通的 Slot 要强一些,可以分开 head Slot 和 content Slot, 这样就很方便资源引用等操作的细粒度控制。 |
| 115 | +2. 需要注意的是,可以使用 `<ctx>` 来简化代码组织结构 |
| 116 | + |
| 117 | +更加细粒度的控制可以在 `smd` 文件中通过 ziggy frontmatter `.custom` 字段实现 |
| 118 | + |
| 119 | +比如这样: |
| 120 | + |
| 121 | +```zig |
| 122 | +.custom{ |
| 123 | + .math = true, |
| 124 | +} |
| 125 | +``` |
| 126 | + |
| 127 | +```html |
| 128 | +<ctx :if="$page.custom.getOr('math', false)"> |
| 129 | + <link |
| 130 | + href="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.15.2/katex.min.css" |
| 131 | + crossorigin="anonymous" |
| 132 | + rel="stylesheet" |
| 133 | + /> |
| 134 | + <script |
| 135 | + defer |
| 136 | + src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.15.2/katex.min.js" |
| 137 | + crossorigin="anonymous" |
| 138 | + ></script> |
| 139 | + <script |
| 140 | + defer |
| 141 | + src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.15.2/contrib/auto-render.min.js" |
| 142 | + crossorigin="anonymous" |
| 143 | + onload="renderMathInElement(document.body);" |
| 144 | + ></script> |
| 145 | +</ctx> |
| 146 | +``` |
| 147 | + |
| 148 | +# [预览+检查]($section.id("预览+检查")) |
| 149 | + |
| 150 | +这时候就要手动修改那些不合格的格式,通过 `zine` 预览,查看效果之后看看什么地方渲染不对,然后回到 smd 中修改即可! |
| 151 | + |
| 152 | +这一步骤比较繁琐,几乎相当于需要重新审一遍所有的文章,然后还要根据具体问题进行具体修改。(需要注意的是, zine 目前还不是很完善,很多东西的报错是有问题的,需要有点耐心) |
| 153 | + |
| 154 | +# [deploying]($section.id("deploying")) |
| 155 | + |
| 156 | +https://zine-ssg.io/docs/deploying/github-pages/ |
| 157 | +https://zine-ssg.io/docs/deploying/cloudflare-pages/ |
| 158 | + |
| 159 | +Actions 可以参考 zine-ssg 或者 zigcc 主页。 |
| 160 | + |
| 161 | +# [其他经验]($section.id("其他经验")) |
| 162 | + |
| 163 | +1. shtml 并非是只是基于 html 加东西,他对于 html 的语法有严苛的要求(某些要求可能会与编码者本身的习惯相冲突)。 |
| 164 | +2. scripty 采用链式语法。 |
| 165 | + |
| 166 | +遇到问题不要慌张,看看报错,看看文档,多翻翻 zine-ssg 和 ziglang 主页 的源码。 |
0 commit comments