7
7
8
8
本文复盘了 ZigCC 社区网站从 Hugo 迁移至 Zine 的全过程,旨在分享其中的经验与思考,为有类似需求的朋友提供参考。
9
9
10
- # [为何选择 Zine?]($section.id("为何选择-Zine"))
10
+ # [一、 为何选择 Zine?]($section.id("为何选择-Zine"))
11
11
12
12
我们最初使用 Hugo 及其 Docsy 主题搭建网站,但在使用过程中遇到了一些痛点,促使我们寻找新的解决方案。选择迁移至 Zine 主要基于以下几点考量:
13
13
22
22
23
23
作为 Zig 社区的一份子,我们有责任参与到生态建设中。果不其然,这次迁移过程也让我们发现了 Zine 的一些待解决问题和潜在的改进点。
24
24
25
- # [Zine 简介 ]($section.id("Zine简介 "))
25
+ # [二、 Zine 核心概念解读 ]($section.id("Zine核心概念解读 "))
26
26
27
- Zine 是一个现代、高效的静态网站生成器。理解其核心组织结构是上手的第一步。一个最简化的 Zine 项目(通过 `zine init` 创建并删减后)目录结构如下:
27
+ Zine 是一个现代、高效的静态网站生成器。要理解它,首先要掌握其核心设计理念和文件结构。
28
+
29
+ ## [项目结构与配置]($section.id("项目结构与配置"))
30
+
31
+ 一个基础的 Zine 项目结构与 Hugo 等主流生成器类似,主要包含内容、布局和静态资源目录:
28
32
29
33
```sh
30
34
.
@@ -40,7 +44,7 @@ Zine 是一个现代、高效的静态网站生成器。理解其核心组织结
40
44
└── zine.ziggy # Zine 项目的全局配置文件
41
45
```
42
46
43
- 上面的目录结构和 Hugo 类似, `zine.ziggy` 是网站的配置文件, ZigCC 的配置如下 :
47
+ 项目的核心是 `zine.ziggy` 配置文件,它定义了网站的元数据和目录路径。以 ZigCC 的配置为例 :
44
48
```zig
45
49
Site {
46
50
.title = "Zig 语言中文社区",
@@ -52,47 +56,47 @@ Site {
52
56
}
53
57
```
54
58
55
- 在 HTML 渲染方面,Zine 与 Hugo 相差甚远,Zine 自创了两种新格式来进行数据的组织:
56
- - [SuperMD](https://zine-ssg.io/docs/supermd/) 格式 - 扩展了标准 Markdown,允许定义嵌入式资源和语义结构,解决了传统 Markdown 无法表达复杂内容而不使用内联 HTML 的局限性。
57
- - [SuperHTML](https://zine-ssg.io/docs/superhtml) 模板系统 - 扩展的 HTML 格式专注于正确的模板逻辑表达。设计确保“不可能生成语法错误的 HTML,大多数错误会在构建时被发现”。
59
+ ## [内容渲染:SuperMD、SuperHTML 与 Scripty]($section.id("内容渲染"))
60
+
61
+ Zine 在内容渲染上采用了与 Hugo 截然不同的哲学。它没有直接使用标准的 Markdown 和 HTML,而是引入了三个核心概念:
62
+
63
+ - **[SuperMD](https://zine-ssg.io/docs/supermd/)**: 一种扩展版的 Markdown。它解决了原生 Markdown 难以表达复杂结构(需内联 HTML)的痛点,允许开发者嵌入资源和定义更丰富的语义结构。
64
+ - **[SuperHTML](https://zine-ssg.io/docs/superhtml)**: 一种专为模板设计的扩展版 HTML。其设计目标是“从根本上杜绝生成语法错误的 HTML”,将大量潜在的运行时错误提前到构建时发现。
65
+ - **[Scripty](https://zine-ssg.io/docs/scripty/)**: 驱动前两者的微型表达式语言。
58
66
59
- 这两者本质上就是 markdown 与 html,Zine 做的增强是为它们实现了其自创的表达式语言 [scripty](https://zine-ssg.io/docs/scripty/)。因此下面重点介绍 Scripty 的用法 。
67
+ 本质上,SuperMD 和 SuperHTML 就是内嵌了 Scripty 动态能力的 Markdown 和 HTML。 Scripty 的语法简洁,专为字符串嵌入而设计,是实现 Zine 动态内容的关键 。
60
68
61
- ## [ Scripty]($section.id('scripty'))
69
+ ### Scripty 快速入门
62
70
63
- Scripty 是一个非常小的语言, 专门用于嵌入到字符串中,为 SuperMD 和 SuperHTML 提供动态内容生成能力。 因此 Scripty 没有任何类型的语句或代码块,只能用于构建表达式。
64
- - 所有表达式都以 `$` 开头
65
- - 支持字段导航: `$foo.bar.baz`
66
- - 支持函数调用: `$foo.bar.qux('arg1', "arg2")`
67
- - 支持基本字面量:字符串、整数、浮点数、布尔值
71
+ - 所有表达式都以 ` 符号开头。
72
+ - 支持链式字段访问:`$foo.bar.baz`
73
+ - 支持函数调用:`$foo.bar.qux('arg1', "arg2")`
74
+ - 支持字符串、数字、布尔等基本字面量。
68
75
69
- 这里举一示例来说明 Scripty 在 SuperMD 和 SuperHTML 中的写法 :
76
+ 下面是一个简单的示例,展示 Scripty 如何在 SuperHTML 和 SuperMD 中工作 :
70
77
78
+ **SuperHTML 示例:**
71
79
```html
72
80
<ctx about="$site.page('about')">
73
81
<a href="$ctx.about.link()" text="$ctx.about.title"></a>
74
82
</ctx>
75
83
```
76
84
85
+ **SuperMD 示例:**
77
86
```markdown
78
87
Check out our [about page]($link.page('about')).
79
88
```
80
89
81
- 既然是表达式语言,scripty 在多层嵌套时才能体现其威力:
82
-
83
- ```html
84
- <h1 class="$page.title.len().gt(25).then('long')">...</h1>
85
- ```
86
-
87
- 如果当前页面标题长度小于 25 时,就有输出:
90
+ Scripty 作为表达式语言,其威力在条件和嵌套逻辑中得以体现:
88
91
89
92
```html
90
- <h1 class="long">...</h1>
93
+ <h1 class="{$page.title.len().gt(25).then(' long-title')} ">...</h1>
91
94
```
95
+ 在上述代码中,如果页面标题长度大于25个字符,`<h1>` 标签就会被赋予 `long-title` 这个 class。
92
96
93
- 关于 SuperMD 和 SuperHTML 的用法这里不再赘述,推荐大家去阅读 Zine 的官方文章 。
97
+ 通过这三者的结合,Zine 在保证内容与布局分离的同时,提供了高度的灵活性和安全性。更详细的用法,推荐阅读 Zine 官方文档 。
94
98
95
- # [迁移步骤详解]($section.id("迁移步骤详解"))
99
+ # [三、 迁移步骤详解]($section.id("迁移步骤详解"))
96
100
97
101
整个迁移过程可以分为内容转换、布局设计、预览调试和最终部署几个关键步骤。
98
102
0 commit comments