zengen 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/pages.yml +4 -4
- package/.zen/meta.json +8 -139
- package/.zen/src/de-DE/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/de-DE/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/en-US/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +23 -23
- package/.zen/src/en-US/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/en-US/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +2 -2
- package/.zen/src/en-US/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +3 -3
- package/.zen/src/en-US/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/en-US/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +3 -3
- package/.zen/src/en-US/afbf4998656c97181d0edc711e388ad11e0f08f5c6f329861327202462a3a34a.md +63 -0
- package/.zen/src/en-US/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +2 -3
- package/.zen/src/en-US/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +5 -5
- package/.zen/src/es-ES/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/es-ES/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/fr-FR/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/fr-FR/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/ja-JP/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +71 -0
- package/.zen/src/ja-JP/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/ko-KR/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/pt-PT/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/pt-PT/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/ru-RU/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/ru-RU/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/zh-Hans/04319611d7cde718d0e82da8e034e04b15fb3bb37c3784d8f7313577c5178b06.md +73 -0
- package/.zen/src/zh-Hans/084ef1f6a0167df8621c673c79211309d4af6c588e7bbe3e043f7c244edd0ac6.md +80 -0
- package/.zen/src/zh-Hans/48eb2ad3e174cd06ed16c959fa58e0381dbc4a4147fa3456b21eea2b3d67c329.md +81 -0
- package/.zen/src/zh-Hans/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +10 -0
- package/.zen/src/zh-Hans/afbf4998656c97181d0edc711e388ad11e0f08f5c6f329861327202462a3a34a.md +63 -0
- package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +3 -4
- package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +2 -2
- package/README.md +27 -21
- package/dist/build/pipeline.d.ts.map +1 -1
- package/dist/build/pipeline.js +13 -12
- package/dist/build/pipeline.js.map +1 -1
- package/dist/languages.d.ts +2 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +14 -0
- package/dist/languages.js.map +1 -0
- package/dist/process/extractMetadataByAI.d.ts.map +1 -1
- package/dist/process/extractMetadataByAI.js +3 -3
- package/dist/process/extractMetadataByAI.js.map +1 -1
- package/dist/process/template.d.ts.map +1 -1
- package/dist/process/template.js +2 -7
- package/dist/process/template.js.map +1 -1
- package/package.json +2 -2
- package/src/build/pipeline.ts +48 -42
- package/src/languages.ts +10 -0
- package/src/process/extractMetadataByAI.ts +14 -12
- package/src/process/template.ts +2 -7
- package/.zen/src/zh-Hans/6ad8db715a1b60613fe934fefb29fa981ecad9b63145593accff144d73b44bde.md +0 -175
- package/.zen/src/zh-Hans/a1580f71c6c6c1ff4a314be72d410a8507af2f087d56360c7f5048d349c21953.md +0 -48
- package/.zen/src/zh-Hans/d49012f98c4367b34034063400e2f7826bf0615952210c82396920172d468e2c.md +0 -107
- package/docs/advanced-usage.md +0 -39
- package/docs/deployment/github-pages.md +0 -107
- package/docs/getting-started.md +0 -26
- package/docs/guides/best-practices.md +0 -175
- package/docs/guides/config.md +0 -48
- package/docs/guides/index.md +0 -51
- package/docs/testing/test-document.md +0 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ZEN - Markdown 文档站点构建工具
|
|
3
|
+
summary: ZEN 是一个极简的 Markdown 静态站点生成工具,强调内容优先,通过隐藏配置和 AI 赋能,让用户专注于母语写作,并支持多语言翻译和智能导航。
|
|
4
|
+
tags:
|
|
5
|
+
- Markdown
|
|
6
|
+
- 静态站点生成
|
|
7
|
+
- AI 翻译
|
|
8
|
+
- 多语言
|
|
9
|
+
- 极简主义
|
|
10
|
+
- 内容优先
|
|
11
|
+
- 文档工具
|
|
12
|
+
inferred_lang: zh-Hans
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# ZEN - 简洁的 Markdown 文档站点构建工具
|
|
16
|
+
|
|
17
|
+
[简体中文](https://zccz14.github.io/ZEN/zh-Hans) | [English](https://zccz14.github.io/ZEN/en-US)
|
|
18
|
+
|
|
19
|
+
为什么又搞了个 Markdown 静态站点生成器?
|
|
20
|
+
|
|
21
|
+
- 回归内容:最小化打扰,让您专注写作
|
|
22
|
+
|
|
23
|
+
让文档回归本质,让写作回归宁静。我不想要配置复杂的构建工具,折腾复杂的文档配置,不喜欢复杂的结构。每次我看到 Docusaurus、VuePress、Astro 这些工具的配置文件和项目结构,我就头疼。现在,ZEN 选择将所有的配置都隐藏到 .zen 目录下,扫到角落里,用户只需要专注于写作内容,其他的交给 ZEN 来处理。其他的目录都是您的写作空间,您可以随意组织您的 Markdown 文件。LLM 还会自动帮您生成标题、做摘要、分类、生成导航等工作。您真的只需要专注于写作。
|
|
24
|
+
|
|
25
|
+
- 回归母语:仅用母语写作,丝滑构建多语言版本
|
|
26
|
+
|
|
27
|
+
人生苦短,我懒得翻译。人在使用母语时,才是最能发挥自身思考深度的。但同时与世界保持连接又是必要的,我不想放弃多语言的交流。于是我希望有一个工具,能让我用母语写作,同时又能让更多人看到我的内容。现在的 i18n 需要自己翻译不说,还得自己维护内容更新,太麻烦了。我选择使用 LLM 来帮我做翻译,省下了我很多时间,并且可以一键完成多国语言翻译。
|
|
28
|
+
|
|
29
|
+
## 基本功能
|
|
30
|
+
|
|
31
|
+
1. **静态站点生成**
|
|
32
|
+
- 将任意一个包含 Markdown 的文件夹构建成一个静态 HTML 站点
|
|
33
|
+
|
|
34
|
+
2. **智能导航**
|
|
35
|
+
- 生成站点地图和导航,不需要保持原始的 Markdown 源文件的目录结构
|
|
36
|
+
|
|
37
|
+
3. **增量 i18n 翻译**
|
|
38
|
+
- 使用 LLM 进行增量 i18n 翻译,让用户使用母语编写 Markdown,但是用户可以是多语言的
|
|
39
|
+
|
|
40
|
+
## 设计理念
|
|
41
|
+
|
|
42
|
+
- **极简主义**: 最少的配置,最大的灵活性
|
|
43
|
+
- **内容优先**: 专注于写作,而不是工具配置
|
|
44
|
+
- **AI 赋能**: 利用 AI 处理翻译和内容组织
|
|
45
|
+
- **跨语言**: 支持多语言内容创作和展示
|
|
46
|
+
|
|
47
|
+
## 快速开始
|
|
48
|
+
|
|
49
|
+
### 推荐使用方式
|
|
50
|
+
|
|
51
|
+
**推荐用户切换到包含 Markdown 文件的目录下,直接使用以下命令开始构建:**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx zengen build
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**查看更多参数或帮助**:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx zengen
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**注意**:ZEN 强制使用当前目录作为源目录,输出到 `.zen/dist` 目录。不支持指定源目录和输出目录参数。
|
package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 快速开始指南
|
|
3
|
-
summary:
|
|
3
|
+
summary: 本文档介绍如何快速开始使用 ZEN 文档生成器,包括安装步骤、基本用法和主要特性。
|
|
4
4
|
tags:
|
|
5
|
-
- ZEN文档生成器
|
|
5
|
+
- ZEN 文档生成器
|
|
6
6
|
- 快速开始
|
|
7
7
|
- 安装
|
|
8
8
|
- 基本用法
|
|
9
9
|
- 特性
|
|
10
10
|
- Markdown
|
|
11
|
-
-
|
|
12
|
-
- 多语言支持
|
|
11
|
+
- 构建命令
|
|
13
12
|
inferred_lang: zh-Hans
|
|
14
13
|
---
|
|
15
14
|
|
package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: ZEN 文档站点示例
|
|
3
|
-
summary: 介绍 ZEN 文档构建工具,一个极简主义的 Markdown
|
|
3
|
+
summary: 介绍 ZEN 文档构建工具,一个极简主义的 Markdown 文档站点生成器,包括特性、快速开始指南、代码示例和下一步学习资源。
|
|
4
4
|
tags:
|
|
5
5
|
- ZEN
|
|
6
6
|
- 文档构建工具
|
|
7
7
|
- Markdown
|
|
8
8
|
- 站点生成器
|
|
9
|
-
- 极简主义
|
|
10
9
|
- 快速开始
|
|
10
|
+
- 代码示例
|
|
11
11
|
- 多语言支持
|
|
12
12
|
inferred_lang: zh-Hans
|
|
13
13
|
---
|
package/README.md
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
# ZEN - 简洁的 Markdown 文档站点构建工具
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[简体中文](https://zccz14.github.io/ZEN/zh-Hans) |
|
|
4
|
+
[English](https://zccz14.github.io/ZEN/en-US) |
|
|
5
|
+
[Español](https://zccz14.github.io/ZEN/es-ES) |
|
|
6
|
+
[Português](https://zccz14.github.io/ZEN/pt-PT) |
|
|
7
|
+
[Русский](https://zccz14.github.io/ZEN/ru-RU) |
|
|
8
|
+
[Français](https://zccz14.github.io/ZEN/fr-FR) |
|
|
9
|
+
[日本語](https://zccz14.github.io/ZEN/ja-JP) |
|
|
10
|
+
[한국어](https://zccz14.github.io/ZEN/ko-KR) |
|
|
11
|
+
[Deutsch](https://zccz14.github.io/ZEN/de-DE) |
|
|
4
12
|
|
|
5
|
-
|
|
13
|
+
为什么又搞了个 Markdown 静态站点生成器?我重新思考了 AI 时代下,文档工具可以如何更好地服务于写作者:
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
- 回归内容:最小化打扰,专注写作
|
|
8
16
|
|
|
9
|
-
|
|
17
|
+
让文档回归本质,让写作回归宁静。
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
其一,我不想做图书管理员。我有时想写下一些内容,但我可能还没有想好它的标题,还没有形成特别的组织。我希望 LLM 会自动帮我生成标题、做摘要、分类、导航等整理工作。
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
其二,我的书房必须打扫干净。我不想要配置复杂的构建工具,折腾复杂的文档配置,不喜欢复杂的结构。每次我看到 Docusaurus、VuePress、Astro 这些工具的配置文件和项目结构,我就头疼。现在,ZEN 选择将所有的配置都隐藏到 .zen 目录下,扫到角落里,用户只需要专注于写作内容,其他的交给 ZEN 来处理。其他的目录都是您的写作空间,您可以随意组织您的 Markdown 文件。
|
|
22
|
+
|
|
23
|
+
- 回归母语:用母语写作,丝滑构建多语言版本
|
|
24
|
+
|
|
25
|
+
人生苦短,我懒得翻译。人在使用母语时,才是最能发挥自身思考深度的。但同时与世界保持连接又是必要的,我不想放弃多语言的交流。于是我希望有一个工具,能让我用母语写作,同时又能让更多人看到我的内容。现在的 i18n 需要自己翻译不说,还得自己维护内容更新,太麻烦了。我选择使用 LLM 来帮我做翻译,省下了我很多时间,并且可以一键完成多国语言翻译。
|
|
14
26
|
|
|
15
27
|
## 基本功能
|
|
16
28
|
|
|
@@ -18,7 +30,7 @@
|
|
|
18
30
|
- 将任意一个包含 Markdown 的文件夹构建成一个静态 HTML 站点
|
|
19
31
|
|
|
20
32
|
2. **智能导航**
|
|
21
|
-
- 生成站点地图和导航,不需要保持原始的 Markdown
|
|
33
|
+
- 生成站点地图和导航,不需要保持原始的 Markdown 源文件的目录结构,可以随意移动源文件。
|
|
22
34
|
|
|
23
35
|
3. **增量 i18n 翻译**
|
|
24
36
|
- 使用 LLM 进行增量 i18n 翻译,让用户使用母语编写 Markdown,但是用户可以是多语言的
|
|
@@ -37,25 +49,19 @@
|
|
|
37
49
|
**推荐用户切换到包含 Markdown 文件的目录下,直接使用以下命令开始构建:**
|
|
38
50
|
|
|
39
51
|
```bash
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
# 设置环境变量 (根据您的实际情况修改)
|
|
53
|
+
export OPENAI_API_KEY="sk-xxxxxx" # 必须:请替换为您的 OpenAI API Key
|
|
54
|
+
export OPENAI_BASE_URL="https://api.openai.com/v1" # 可选,默认使用 OpenAI 官方 API
|
|
55
|
+
export OPENAI_MODEL="gpt-3.5-turbo" # 可选,默认使用 gpt-3.5-turbo 模型
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npx zengen build --watch
|
|
57
|
+
# 构建站点,支持多语言翻译
|
|
58
|
+
npx zengen@latest build --lang zh-Hans --lang en-US --verbose
|
|
49
59
|
```
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
**查看更多参数或帮助**:
|
|
52
62
|
|
|
53
63
|
```bash
|
|
54
64
|
npx zengen
|
|
55
65
|
```
|
|
56
66
|
|
|
57
|
-
**注意**:ZEN 强制使用当前目录作为源目录,输出到 `.zen/dist`
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
**ZEN** - 让文档回归本质,让写作回归宁静。
|
|
67
|
+
**注意**:ZEN 强制使用当前目录作为源目录,输出到 `.zen/dist` 目录。不支持指定源目录和输出目录参数。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4LxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
|
package/dist/build/pipeline.js
CHANGED
|
@@ -132,14 +132,14 @@ async function storeNativeFiles() {
|
|
|
132
132
|
*/
|
|
133
133
|
async function processTranslations() {
|
|
134
134
|
const { files, options: { langs = [], verbose }, } = metadata_1.MetaData;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
await Promise.all(files.flatMap(async (file) => {
|
|
136
|
+
return Promise.all(langs.map(async (lang) => {
|
|
137
|
+
if (verbose)
|
|
138
|
+
console.info(`📄 Processing file for translation: ${file.path}`);
|
|
139
|
+
if (!file.metadata) {
|
|
140
|
+
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
143
|
if (verbose)
|
|
144
144
|
console.log(`🌐 Translating to ${lang}...`);
|
|
145
145
|
// 存储翻译文件到 .zen/src/{lang}
|
|
@@ -150,7 +150,7 @@ async function processTranslations() {
|
|
|
150
150
|
if (file.metadata.inferred_lang === lang) {
|
|
151
151
|
if (verbose)
|
|
152
152
|
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
153
|
-
|
|
153
|
+
return;
|
|
154
154
|
}
|
|
155
155
|
else {
|
|
156
156
|
// 翻译
|
|
@@ -159,7 +159,7 @@ async function processTranslations() {
|
|
|
159
159
|
if (exists) {
|
|
160
160
|
if (verbose)
|
|
161
161
|
console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
162
|
-
|
|
162
|
+
return;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
const translatedContent = await (0, translateMarkdown_1.translateMarkdown)(content, lang);
|
|
@@ -171,8 +171,8 @@ async function processTranslations() {
|
|
|
171
171
|
catch (error) {
|
|
172
172
|
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
173
173
|
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
174
|
+
}));
|
|
175
|
+
}));
|
|
176
176
|
}
|
|
177
177
|
/**
|
|
178
178
|
* 构建管道(函数组合)
|
|
@@ -183,6 +183,7 @@ async function buildPipeline(options) {
|
|
|
183
183
|
// 清理输出目录
|
|
184
184
|
await fs.rm(paths_1.ZEN_DIST_DIR, { recursive: true, force: true });
|
|
185
185
|
// 确保 .zen/.gitignore 文件
|
|
186
|
+
await fs.mkdir(paths_1.ZEN_DIR, { recursive: true });
|
|
186
187
|
await fs.writeFile(path.join(paths_1.ZEN_DIR, '.gitignore'), 'dist\n', 'utf-8');
|
|
187
188
|
// 扫描源文件
|
|
188
189
|
await scanSourceFiles();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASjD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LANGUAGE_NAMES = void 0;
|
|
4
|
+
exports.LANGUAGE_NAMES = {
|
|
5
|
+
'zh-Hans': '简体中文',
|
|
6
|
+
'en-US': 'English',
|
|
7
|
+
'ja-JP': '日本語',
|
|
8
|
+
'ko-KR': '한국어',
|
|
9
|
+
'es-ES': 'Español',
|
|
10
|
+
'fr-FR': 'Français',
|
|
11
|
+
'de-DE': 'Deutsch',
|
|
12
|
+
'ru-RU': 'Русский',
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=languages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages.js","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAA2B;IACpD,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractMetadataByAI.d.ts","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"extractMetadataByAI.d.ts","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBzD"}
|
|
@@ -12,11 +12,11 @@ async function extractMetadataByAI() {
|
|
|
12
12
|
if (metadata_1.MetaData.options.verbose)
|
|
13
13
|
console.log(`🤖 Running AI metadata extraction...`);
|
|
14
14
|
console.log(`🤖 Processing ${files.length} files with AI...`);
|
|
15
|
-
|
|
15
|
+
await Promise.all(files.map(async (file) => {
|
|
16
16
|
try {
|
|
17
17
|
if (file.metadata) {
|
|
18
18
|
console.info(`ℹ️ Skipping ${file.path}, already has metadata`);
|
|
19
|
-
|
|
19
|
+
return;
|
|
20
20
|
}
|
|
21
21
|
const content = await (0, promises_1.readFile)(file.path, 'utf-8');
|
|
22
22
|
file.metadata = await (0, extractMetadataFromMarkdown_1.extractMetadataFromMarkdown)(content);
|
|
@@ -25,7 +25,7 @@ async function extractMetadataByAI() {
|
|
|
25
25
|
catch (error) {
|
|
26
26
|
console.error(`⚠️ Failed to process file ${file.path}:`, error);
|
|
27
27
|
}
|
|
28
|
-
}
|
|
28
|
+
}));
|
|
29
29
|
console.log(`✅ AI processing completed for ${files.length} files`);
|
|
30
30
|
}
|
|
31
31
|
//# sourceMappingURL=extractMetadataByAI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractMetadataByAI.js","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":";;AAOA,
|
|
1
|
+
{"version":3,"file":"extractMetadataByAI.js","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":";;AAOA,kDAuBC;AA9BD,0CAAuC;AACvC,mFAAgF;AAChF,0CAAuC;AAEvC;;GAEG;AACI,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAQ,CAAC;IAE3B,IAAI,mBAAQ,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAE9D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACrB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAA,yDAA2B,EAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"AAyJA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCrD"}
|
package/dist/process/template.js
CHANGED
|
@@ -36,16 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.renderTemplates = renderTemplates;
|
|
37
37
|
const fs = __importStar(require("fs/promises"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const languages_1 = require("../languages");
|
|
39
40
|
const metadata_1 = require("../metadata");
|
|
40
41
|
const paths_1 = require("../paths");
|
|
41
42
|
const convertMarkdownToHtml_1 = require("../utils/convertMarkdownToHtml");
|
|
42
43
|
const frontmatter_1 = require("../utils/frontmatter");
|
|
43
|
-
const langNames = {
|
|
44
|
-
'zh-Hans': '简体中文',
|
|
45
|
-
'en-US': 'English',
|
|
46
|
-
'ja-JP': '日本語',
|
|
47
|
-
'ko-KR': '한국어',
|
|
48
|
-
};
|
|
49
44
|
/**
|
|
50
45
|
* 生成语言切换器 HTML
|
|
51
46
|
* @param currentLang 当前语言
|
|
@@ -56,7 +51,7 @@ function generateLanguageSwitcher(templateData) {
|
|
|
56
51
|
const { options: { langs = [], baseUrl = '/' }, } = metadata_1.MetaData;
|
|
57
52
|
const items = langs
|
|
58
53
|
.map(lang => {
|
|
59
|
-
const langName =
|
|
54
|
+
const langName = languages_1.LANGUAGE_NAMES[lang] || lang;
|
|
60
55
|
const isCurrent = lang === templateData.lang;
|
|
61
56
|
const activeClass = isCurrent ? 'active' : '';
|
|
62
57
|
return `<li class="lang-item ${activeClass}">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zengen",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "ZEN - A minimalist Markdown documentation site builder",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "npx rimraf dist && tsc",
|
|
12
12
|
"dev": "ts-node src/cli.ts",
|
|
13
|
-
"build:doc": "npm run build && node dist/cli.js build --lang zh-Hans --lang en-US --verbose",
|
|
13
|
+
"build:doc": "npm run build && node dist/cli.js build --lang zh-Hans --lang en-US --lang es-ES --lang pt-PT --lang ja-JP --lang de-DE --lang fr-FR --lang ru-RU --lang ko-KR --verbose",
|
|
14
14
|
"test": "npm run build && node --test dist/**/*.test.js",
|
|
15
15
|
"test:types": "tsc --noEmit",
|
|
16
16
|
"test:build": "npm run build && test -f dist/index.js && test -f dist/cli.js",
|
package/src/build/pipeline.ts
CHANGED
|
@@ -115,49 +115,54 @@ async function processTranslations(): Promise<void> {
|
|
|
115
115
|
options: { langs = [], verbose },
|
|
116
116
|
} = MetaData;
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// 存储翻译文件到 .zen/src/{lang}
|
|
127
|
-
const sourcePath = path.join(ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
128
|
-
const targetPath = path.join(ZEN_SRC_DIR, lang, file.hash + '.md');
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
132
|
-
if (file.metadata.inferred_lang === lang) {
|
|
133
|
-
if (verbose)
|
|
134
|
-
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
135
|
-
continue;
|
|
136
|
-
} else {
|
|
137
|
-
// 翻译
|
|
138
|
-
// 先检查是否已经有翻译文件存在
|
|
139
|
-
|
|
140
|
-
const exists = await fs.access(targetPath).then(
|
|
141
|
-
() => true,
|
|
142
|
-
() => false
|
|
143
|
-
);
|
|
144
|
-
if (exists) {
|
|
145
|
-
if (verbose) console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
146
|
-
continue;
|
|
118
|
+
await Promise.all(
|
|
119
|
+
files.flatMap(async file => {
|
|
120
|
+
return Promise.all(
|
|
121
|
+
langs.map(async lang => {
|
|
122
|
+
if (verbose) console.info(`📄 Processing file for translation: ${file.path}`);
|
|
123
|
+
if (!file.metadata) {
|
|
124
|
+
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
125
|
+
return;
|
|
147
126
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
127
|
+
if (verbose) console.log(`🌐 Translating to ${lang}...`);
|
|
128
|
+
// 存储翻译文件到 .zen/src/{lang}
|
|
129
|
+
const sourcePath = path.join(ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
130
|
+
const targetPath = path.join(ZEN_SRC_DIR, lang, file.hash + '.md');
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
134
|
+
if (file.metadata.inferred_lang === lang) {
|
|
135
|
+
if (verbose)
|
|
136
|
+
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
137
|
+
return;
|
|
138
|
+
} else {
|
|
139
|
+
// 翻译
|
|
140
|
+
// 先检查是否已经有翻译文件存在
|
|
141
|
+
|
|
142
|
+
const exists = await fs.access(targetPath).then(
|
|
143
|
+
() => true,
|
|
144
|
+
() => false
|
|
145
|
+
);
|
|
146
|
+
if (exists) {
|
|
147
|
+
if (verbose)
|
|
148
|
+
console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const translatedContent = await translateMarkdown(content, lang);
|
|
154
|
+
|
|
155
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
156
|
+
await fs.writeFile(targetPath, translatedContent, 'utf-8');
|
|
157
|
+
|
|
158
|
+
if (verbose) console.log(`✅ Translated file saved: ${targetPath}`);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
})
|
|
165
|
+
);
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
/**
|
|
@@ -171,6 +176,7 @@ async function buildPipeline(options: BuildOptions): Promise<void> {
|
|
|
171
176
|
await fs.rm(ZEN_DIST_DIR, { recursive: true, force: true });
|
|
172
177
|
|
|
173
178
|
// 确保 .zen/.gitignore 文件
|
|
179
|
+
await fs.mkdir(ZEN_DIR, { recursive: true });
|
|
174
180
|
await fs.writeFile(path.join(ZEN_DIR, '.gitignore'), 'dist\n', 'utf-8');
|
|
175
181
|
|
|
176
182
|
// 扫描源文件
|
package/src/languages.ts
ADDED
|
@@ -11,19 +11,21 @@ export async function extractMetadataByAI(): Promise<void> {
|
|
|
11
11
|
if (MetaData.options.verbose) console.log(`🤖 Running AI metadata extraction...`);
|
|
12
12
|
console.log(`🤖 Processing ${files.length} files with AI...`);
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
await Promise.all(
|
|
15
|
+
files.map(async file => {
|
|
16
|
+
try {
|
|
17
|
+
if (file.metadata) {
|
|
18
|
+
console.info(`ℹ️ Skipping ${file.path}, already has metadata`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const content = await readFile(file.path, 'utf-8');
|
|
22
|
+
file.metadata = await extractMetadataFromMarkdown(content);
|
|
23
|
+
console.log(`✅ Extracted AI metadata for ${file.path}`, file.metadata.tokens_used);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error(`⚠️ Failed to process file ${file.path}:`, error);
|
|
19
26
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
console.log(`✅ Extracted AI metadata for ${file.path}`, file.metadata.tokens_used);
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error(`⚠️ Failed to process file ${file.path}:`, error);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
+
})
|
|
28
|
+
);
|
|
27
29
|
|
|
28
30
|
console.log(`✅ AI processing completed for ${files.length} files`);
|
|
29
31
|
}
|
package/src/process/template.ts
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
+
import { LANGUAGE_NAMES } from '../languages';
|
|
3
4
|
import { MetaData } from '../metadata';
|
|
4
5
|
import { ZEN_DIST_DIR, ZEN_SRC_DIR } from '../paths';
|
|
5
6
|
import { MetaDataStore } from '../types';
|
|
6
7
|
import { convertMarkdownToHtml } from '../utils/convertMarkdownToHtml';
|
|
7
8
|
import { parseFrontmatter } from '../utils/frontmatter';
|
|
8
9
|
|
|
9
|
-
const langNames: Record<string, string> = {
|
|
10
|
-
'zh-Hans': '简体中文',
|
|
11
|
-
'en-US': 'English',
|
|
12
|
-
'ja-JP': '日本語',
|
|
13
|
-
'ko-KR': '한국어',
|
|
14
|
-
};
|
|
15
10
|
/**
|
|
16
11
|
* 生成语言切换器 HTML
|
|
17
12
|
* @param currentLang 当前语言
|
|
@@ -25,7 +20,7 @@ function generateLanguageSwitcher(templateData: TemplateData): string {
|
|
|
25
20
|
|
|
26
21
|
const items = langs
|
|
27
22
|
.map(lang => {
|
|
28
|
-
const langName =
|
|
23
|
+
const langName = LANGUAGE_NAMES[lang] || lang;
|
|
29
24
|
const isCurrent = lang === templateData.lang;
|
|
30
25
|
const activeClass = isCurrent ? 'active' : '';
|
|
31
26
|
|