czon 0.1.4 → 0.1.6
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/.prettierignore +4 -1
- package/README.md +24 -12
- package/dist/ai/extractMetadataFromMarkdown.js +22 -7
- package/dist/ai/extractMetadataFromMarkdown.js.map +1 -1
- package/dist/build/pipeline.d.ts.map +1 -1
- package/dist/build/pipeline.js +8 -85
- package/dist/build/pipeline.js.map +1 -1
- package/dist/process/enhanceMarkdownSource.d.ts +5 -0
- package/dist/process/enhanceMarkdownSource.d.ts.map +1 -0
- package/dist/process/enhanceMarkdownSource.js +64 -0
- package/dist/process/enhanceMarkdownSource.js.map +1 -0
- package/dist/process/extractMetadataByAI.js +1 -1
- package/dist/process/extractMetadataByAI.js.map +1 -1
- package/dist/process/processTranslations.d.ts +5 -0
- package/dist/process/processTranslations.d.ts.map +1 -0
- package/dist/process/processTranslations.js +58 -0
- package/dist/process/processTranslations.js.map +1 -0
- package/dist/process/template.d.ts +2 -2
- package/dist/process/template.d.ts.map +1 -1
- package/dist/process/template.js +63 -155
- package/dist/process/template.js.map +1 -1
- package/dist/ssg/ContentPage.d.ts +9 -0
- package/dist/ssg/ContentPage.d.ts.map +1 -0
- package/{assets/templates/default/layout.html → dist/ssg/ContentPage.js} +68 -61
- package/dist/ssg/ContentPage.js.map +1 -0
- package/dist/ssg/RedirectPage.d.ts +6 -0
- package/dist/ssg/RedirectPage.d.ts.map +1 -0
- package/dist/ssg/RedirectPage.js +24 -0
- package/dist/ssg/RedirectPage.js.map +1 -0
- package/dist/ssg/app.d.ts +4 -0
- package/dist/ssg/app.d.ts.map +1 -0
- package/dist/ssg/app.js +44 -0
- package/dist/ssg/app.js.map +1 -0
- package/dist/ssg/components/LanguageSwitcher.d.ts +8 -0
- package/dist/ssg/components/LanguageSwitcher.d.ts.map +1 -0
- package/dist/ssg/components/LanguageSwitcher.js +21 -0
- package/dist/ssg/components/LanguageSwitcher.js.map +1 -0
- package/dist/ssg/components/Navigator.d.ts +7 -0
- package/dist/ssg/components/Navigator.d.ts.map +1 -0
- package/dist/ssg/components/Navigator.js +17 -0
- package/dist/ssg/components/Navigator.js.map +1 -0
- package/dist/ssg/components/TagList.d.ts +5 -0
- package/dist/ssg/components/TagList.d.ts.map +1 -0
- package/dist/ssg/components/TagList.js +12 -0
- package/dist/ssg/components/TagList.js.map +1 -0
- package/dist/ssg/index.d.ts +3 -0
- package/dist/ssg/index.d.ts.map +1 -0
- package/dist/ssg/index.js +14 -0
- package/dist/ssg/index.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/writeFile.d.ts +5 -0
- package/dist/utils/writeFile.d.ts.map +1 -1
- package/dist/utils/writeFile.js +5 -0
- package/dist/utils/writeFile.js.map +1 -1
- package/package.json +6 -2
- package/tsconfig.json +1 -0
- package/.github/workflows/bump-version.yml +0 -112
- package/.github/workflows/ci.yml +0 -64
- package/.github/workflows/pages.yml +0 -61
- package/.github/workflows/publish.yml +0 -81
- package/.husky/pre-commit +0 -1
package/.prettierignore
CHANGED
package/README.md
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
|
-
# CZON -
|
|
1
|
+
# CZON - AI-Native Markdown 内容引擎
|
|
2
2
|
|
|
3
3
|
[> Website Demo](https://czon.zccz14.com/)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
AI 时代下,作为网站内容创作者,我们可以有更智能的内容创作引擎。
|
|
6
|
+
|
|
7
|
+
**回归内容:最小化打扰,专注写作**
|
|
8
|
+
|
|
9
|
+
让文档回归本质,让写作回归宁静。
|
|
10
|
+
|
|
11
|
+
其一,我不想做图书管理员。我有时想写下一些内容,但我可能还没有想好它的标题,还没有形成特别的组织。我希望 LLM 会自动帮我生成标题、做摘要、分类、导航等整理工作。
|
|
6
12
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
其二,我的书房必须打扫干净。我不想要配置复杂的构建工具,折腾复杂的文档配置,不喜欢复杂的结构。每次我看到 Docusaurus、VuePress、Astro 这些工具的配置文件和项目结构,我就头疼。现在,CZON 选择将所有的配置都隐藏到 .czon 目录下,扫到角落里,用户只需要专注于写作内容,其他的交给 CZON 来处理。其他的目录都是您的写作空间,您可以随意组织您的 Markdown 文件。
|
|
14
|
+
|
|
15
|
+
**回归母语:用母语写作,丝滑构建多语言版本**
|
|
16
|
+
|
|
17
|
+
人生苦短,我懒得翻译。人在使用母语时,才是最能发挥自身思考深度的。但同时与世界保持连接又是必要的,我不想放弃多语言的交流。于是我希望有一个工具,能让我用母语写作,同时又能让更多人看到我的内容。现在的 i18n 需要自己翻译不说,还得自己维护内容更新,太麻烦了。我选择使用 LLM 来帮我做翻译,省下了我很多时间,并且可以一键完成多国语言翻译。
|
|
18
|
+
|
|
19
|
+
## 基本功能
|
|
10
20
|
|
|
11
|
-
|
|
21
|
+
1. 🌍 **自动多语言翻译**:使用 AI 进行增量翻译,让用户使用母语编写 Markdown,但是用户可以是多语言的。
|
|
22
|
+
1. 💭 **自动摘要提取**:使用 AI 对原始文本进行内容分析和提取。
|
|
23
|
+
1. 🧭 **智能分类导航**:使用 AI 生成站点地图和导航,源文件的位置不敏感。
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
## 静态站点生成 (SSG)
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
CZON 内置了一个 SSG 方案,可以将任意一个包含 Markdown 的 git 文件夹构建成一个静态 HTML 站点。
|
|
16
28
|
|
|
17
|
-
|
|
29
|
+
⚠️ 请注意,CZON 不是专业的静态站点生成器(SSG),而是一个 AI 驱动的 Markdown 内容引擎,专注于内容创作和管理。
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
✅ CZON 旨在简化内容创作和发布的流程,让用户能够专注于写作本身,而不是被复杂的配置和工具所困扰。
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
❌ CZON 不会提供复杂的主题定制和插件生态,而是专注于通过 AI 提升内容的质量和可访问性。
|
|
22
34
|
|
|
23
|
-
|
|
35
|
+
🔔 但是,CZON 仍然可以生成静态站点,如果有必要的话,可以将 CZON 作为预处理器,集成其他 SSG 方案生成个性化的、美观的站点。
|
|
24
36
|
|
|
25
37
|
## 快速开始
|
|
26
38
|
|
|
@@ -49,20 +49,29 @@ ${truncatedContent}
|
|
|
49
49
|
|
|
50
50
|
请提取:
|
|
51
51
|
1. title: 文档的标题(简洁明了,不超过 30 个字)
|
|
52
|
-
2.
|
|
53
|
-
3.
|
|
54
|
-
4.
|
|
55
|
-
5.
|
|
56
|
-
6.
|
|
52
|
+
2. slug: URL 友好别名(使用小写字母、数字和连字符,仅包含英文和数字)
|
|
53
|
+
3. tags: 关键词列表(3-8 个关键词,使用中文或英文)
|
|
54
|
+
4. description: 文档的简短描述,微摘要(用一句话概括本文核心价值,不超过 100 字符),用于 SEO meta description,社交卡片短描述
|
|
55
|
+
5. summary: 文档中型摘要(用一段话总结文章,包含关键论点和结论,控制在 300 字以内),用于 邮件推送内容,newsletter 介绍
|
|
56
|
+
6. inferred_date: 文档中隐含的创建日期(如果有的话,格式:YYYY-MM-DD,没有就留空字符串)
|
|
57
|
+
7. inferred_lang: 文档使用的语言代码(例如:zh-Hans 表示简体中文,en-US 表示美式英语)
|
|
58
|
+
8. key_points: 文章的关键要点列表(5-10 个要点,简洁明了)
|
|
59
|
+
9. audience: 目标读者描述(简短描述,50 字以内)
|
|
60
|
+
10. short_summary: 文档的超短摘要(用 2-3 句话概括文章主要内容,突出核心观点),用于文章列表页摘要,RSS feed 描述
|
|
61
|
+
|
|
57
62
|
|
|
58
63
|
请严格按照以下 JSON 格式返回,不要包含任何其他文本:
|
|
59
64
|
{
|
|
60
65
|
"title": "文档标题",
|
|
61
|
-
"
|
|
66
|
+
"description": "用一句话概括本文核心价值,不超过 100 字符",
|
|
67
|
+
"summary": "中型摘要,用一段话总结文章,包含关键论点和结论",
|
|
68
|
+
"short_summary": "超短摘要,用 2-3 句话概括文章主要内容,突出核心观点",
|
|
62
69
|
"slug": "URL 友好别名",
|
|
63
70
|
"tags": ["关键词1", "关键词2", "关键词3"],
|
|
64
71
|
"inferred_date": "2023-01-01",
|
|
65
|
-
"inferred_lang": "zh-Hans"
|
|
72
|
+
"inferred_lang": "zh-Hans",
|
|
73
|
+
"key_points": ["要点1", "要点2", "要点3"],
|
|
74
|
+
"audience": "目标读者描述"
|
|
66
75
|
}`;
|
|
67
76
|
}
|
|
68
77
|
/**
|
|
@@ -74,6 +83,12 @@ function parseMetadataResponse(responseContent) {
|
|
|
74
83
|
// 验证和清理数据
|
|
75
84
|
return {
|
|
76
85
|
title: metadata.title?.trim() || '未命名文档',
|
|
86
|
+
description: metadata.description?.trim() || '',
|
|
87
|
+
short_summary: metadata.short_summary?.trim() || '',
|
|
88
|
+
audience: metadata.audience?.trim() || '',
|
|
89
|
+
key_points: Array.isArray(metadata.key_points)
|
|
90
|
+
? metadata.key_points.map((point) => point.trim()).filter(Boolean)
|
|
91
|
+
: [],
|
|
77
92
|
summary: metadata.summary?.trim() || '',
|
|
78
93
|
slug: metadata.slug?.trim() || '',
|
|
79
94
|
tags: Array.isArray(metadata.tags)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractMetadataFromMarkdown.js","sourceRoot":"","sources":["../../src/ai/extractMetadataFromMarkdown.ts"],"names":[],"mappings":";;AAQA,kEA4BC;AApCD,+CAAqE;AAGrE;;;;GAIG;AACI,KAAK,UAAU,2BAA2B,CAAC,OAAe;IAC/D,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAoB;QAChC;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EACL,mDAAmD;SACtD;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM;SAChB;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAgB,EAAC,QAAQ,EAAE;QAChD,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5E,iBAAiB;IACjB,QAAQ,CAAC,WAAW,GAAG;QACrB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;QACpC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB;QAC5C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;KACnC,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC1C,qBAAqB;IACrB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,cAAc;IACjD,MAAM,gBAAgB,GACpB,OAAO,CAAC,MAAM,GAAG,gBAAgB;QAC/B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,aAAa;QACxD,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO;;;;EAIP,gBAAgB
|
|
1
|
+
{"version":3,"file":"extractMetadataFromMarkdown.js","sourceRoot":"","sources":["../../src/ai/extractMetadataFromMarkdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAiDxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
|
package/dist/build/pipeline.js
CHANGED
|
@@ -36,13 +36,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.buildSite = buildSite;
|
|
37
37
|
const fs = __importStar(require("fs/promises"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
-
const translateMarkdown_1 = require("../ai/translateMarkdown");
|
|
40
39
|
const metadata_1 = require("../metadata");
|
|
41
40
|
const paths_1 = require("../paths");
|
|
41
|
+
const enhanceMarkdownSource_1 = require("../process/enhanceMarkdownSource");
|
|
42
42
|
const extractMetadataByAI_1 = require("../process/extractMetadataByAI");
|
|
43
|
+
const processTranslations_1 = require("../process/processTranslations");
|
|
43
44
|
const scanSourceFiles_1 = require("../process/scanSourceFiles");
|
|
44
45
|
const template_1 = require("../process/template");
|
|
45
|
-
const
|
|
46
|
+
const writeFile_1 = require("../utils/writeFile");
|
|
46
47
|
/**
|
|
47
48
|
* 验证构建配置
|
|
48
49
|
*/
|
|
@@ -57,83 +58,6 @@ async function validateConfig(options) {
|
|
|
57
58
|
}
|
|
58
59
|
metadata_1.MetaData.options = options;
|
|
59
60
|
}
|
|
60
|
-
/**
|
|
61
|
-
* 存储母语文件到 .czon/src
|
|
62
|
-
*/
|
|
63
|
-
async function storeNativeFiles() {
|
|
64
|
-
const { options: { verbose }, files, } = metadata_1.MetaData;
|
|
65
|
-
for (const file of metadata_1.MetaData.files) {
|
|
66
|
-
try {
|
|
67
|
-
if (!file.hash)
|
|
68
|
-
throw new Error(`Missing hash`);
|
|
69
|
-
if (!file.metadata?.inferred_lang)
|
|
70
|
-
throw new Error(`Missing inferred language`);
|
|
71
|
-
const filePath = path.join(paths_1.CZON_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md');
|
|
72
|
-
const originalContent = await fs.readFile(path.join(paths_1.INPUT_DIR, file.path), 'utf-8');
|
|
73
|
-
const enhancedContent = (0, frontmatter_1.updateFrontmatter)(originalContent, {
|
|
74
|
-
title: file.metadata.title,
|
|
75
|
-
summary: file.metadata.summary,
|
|
76
|
-
tags: file.metadata.tags,
|
|
77
|
-
date: file.metadata.inferred_date,
|
|
78
|
-
});
|
|
79
|
-
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
80
|
-
await fs.writeFile(filePath, enhancedContent, 'utf-8');
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
console.warn(`⚠️ Failed to store native file ${file.path}:`, error);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (verbose && files.length > 0) {
|
|
87
|
-
console.log(`💾 Stored ${files.length} native language files to .czon/src`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* 处理翻译
|
|
92
|
-
*/
|
|
93
|
-
async function processTranslations() {
|
|
94
|
-
const { files, options: { langs = [], verbose }, } = metadata_1.MetaData;
|
|
95
|
-
await Promise.all(files.flatMap(async (file) => {
|
|
96
|
-
return Promise.all(langs.map(async (lang) => {
|
|
97
|
-
if (verbose)
|
|
98
|
-
console.info(`📄 Processing file for translation: ${file.path}`);
|
|
99
|
-
if (!file.metadata) {
|
|
100
|
-
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
if (verbose)
|
|
104
|
-
console.log(`🌐 Translating to ${lang}...`);
|
|
105
|
-
// 存储翻译文件到 .czon/src/{lang}
|
|
106
|
-
const sourcePath = path.join(paths_1.CZON_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
107
|
-
const targetPath = path.join(paths_1.CZON_SRC_DIR, lang, file.hash + '.md');
|
|
108
|
-
try {
|
|
109
|
-
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
110
|
-
if (file.metadata.inferred_lang === lang) {
|
|
111
|
-
if (verbose)
|
|
112
|
-
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// 翻译
|
|
117
|
-
// 先检查是否已经有翻译文件存在
|
|
118
|
-
const exists = await fs.access(targetPath).then(() => true, () => false);
|
|
119
|
-
if (exists) {
|
|
120
|
-
if (verbose)
|
|
121
|
-
console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
const translatedContent = await (0, translateMarkdown_1.translateMarkdown)(content, lang);
|
|
126
|
-
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
127
|
-
await fs.writeFile(targetPath, translatedContent, 'utf-8');
|
|
128
|
-
if (verbose)
|
|
129
|
-
console.log(`✅ Translated file saved: ${targetPath}`);
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
133
|
-
}
|
|
134
|
-
}));
|
|
135
|
-
}));
|
|
136
|
-
}
|
|
137
61
|
/**
|
|
138
62
|
* 构建管道(函数组合)
|
|
139
63
|
*/
|
|
@@ -143,18 +67,17 @@ async function buildPipeline(options) {
|
|
|
143
67
|
// 清理输出目录
|
|
144
68
|
await fs.rm(paths_1.CZON_DIST_DIR, { recursive: true, force: true });
|
|
145
69
|
// 确保 .czon/.gitignore 文件
|
|
146
|
-
await
|
|
147
|
-
await fs.writeFile(path.join(paths_1.CZON_DIR, '.gitignore'), 'dist\n', 'utf-8');
|
|
70
|
+
await (0, writeFile_1.writeFile)(path.join(paths_1.CZON_DIR, '.gitignore'), 'dist\n');
|
|
148
71
|
// 扫描源文件
|
|
149
72
|
await (0, scanSourceFiles_1.scanSourceFiles)();
|
|
150
73
|
// 运行 AI 元数据提取
|
|
151
74
|
await (0, extractMetadataByAI_1.extractMetadataByAI)();
|
|
152
|
-
//
|
|
153
|
-
await storeNativeFiles();
|
|
75
|
+
// 存储母语文件,并进行内容增强预处理
|
|
76
|
+
await (0, enhanceMarkdownSource_1.storeNativeFiles)();
|
|
154
77
|
// 处理翻译
|
|
155
|
-
await processTranslations();
|
|
78
|
+
await (0, processTranslations_1.processTranslations)();
|
|
156
79
|
// 渲染模板
|
|
157
|
-
await (0, template_1.
|
|
80
|
+
await (0, template_1.spiderStaticSiteGenerator)();
|
|
158
81
|
}
|
|
159
82
|
/**
|
|
160
83
|
* 主构建函数
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,8BAgBC;AA7ED,gDAAkC;AAClC,2CAA6B;AAC7B,0CAAmE;AACnE,oCAAmD;AACnD,4EAAoE;AACpE,wEAAqE;AACrE,wEAAqE;AACrE,gEAA6D;AAC7D,kDAAgE;AAEhE,kDAA+C;AAE/C;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,OAAqB;IACjD,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,mBAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAqB;IAChD,OAAO;IACP,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9B,SAAS;IACT,MAAM,EAAE,CAAC,EAAE,CAAC,qBAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,yBAAyB;IACzB,MAAM,IAAA,qBAAS,EAAC,IAAI,CAAC,IAAI,CAAC,gBAAQ,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7D,QAAQ;IACR,MAAM,IAAA,iCAAe,GAAE,CAAC;IAExB,cAAc;IACd,MAAM,IAAA,yCAAmB,GAAE,CAAC;IAE5B,oBAAoB;IACpB,MAAM,IAAA,wCAAgB,GAAE,CAAC;IAEzB,OAAO;IACP,MAAM,IAAA,yCAAmB,GAAE,CAAC;IAE5B,OAAO;IACP,MAAM,IAAA,oCAAyB,GAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,OAAqB;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,IAAA,uBAAY,GAAE,CAAC;QACrB,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,IAAA,uBAAY,GAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanceMarkdownSource.d.ts","sourceRoot":"","sources":["../../src/process/enhanceMarkdownSource.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCtD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.storeNativeFiles = storeNativeFiles;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const metadata_1 = require("../metadata");
|
|
10
|
+
const paths_1 = require("../paths");
|
|
11
|
+
const frontmatter_1 = require("../utils/frontmatter");
|
|
12
|
+
const writeFile_1 = require("../utils/writeFile");
|
|
13
|
+
const replaceInnerLinks = (file, markdownContent) => {
|
|
14
|
+
let content = markdownContent;
|
|
15
|
+
for (const link of file.links) {
|
|
16
|
+
if (URL.canParse(link))
|
|
17
|
+
continue; // 跳过绝对 URL
|
|
18
|
+
const targetPath = path_1.default.resolve('/', path_1.default.dirname(file.path), link).slice(1);
|
|
19
|
+
const targetFile = metadata_1.MetaData.files.find(f => f.path === targetPath);
|
|
20
|
+
if (!targetFile) {
|
|
21
|
+
console.warn(`⚠️ Link target not found for ${link} in file ${file.path}`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// 替换链接 (使用相对链接)
|
|
25
|
+
const targetLink = `czon://${targetFile.hash}`;
|
|
26
|
+
// 全局替换链接
|
|
27
|
+
const linksRegex = new RegExp(`\\]\\(${link.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\)`, 'g');
|
|
28
|
+
content = content.replace(linksRegex, `](${targetLink})`);
|
|
29
|
+
}
|
|
30
|
+
return content;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* 存储母语文件到 .czon/src
|
|
34
|
+
*/
|
|
35
|
+
async function storeNativeFiles() {
|
|
36
|
+
const { options: { verbose }, files, } = metadata_1.MetaData;
|
|
37
|
+
for (const file of metadata_1.MetaData.files) {
|
|
38
|
+
try {
|
|
39
|
+
if (!file.hash)
|
|
40
|
+
throw new Error(`Missing hash`);
|
|
41
|
+
if (!file.metadata?.inferred_lang)
|
|
42
|
+
throw new Error(`Missing inferred language`);
|
|
43
|
+
const filePath = path_1.default.join(paths_1.CZON_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md');
|
|
44
|
+
const originalContent = await (0, promises_1.readFile)(path_1.default.join(paths_1.INPUT_DIR, file.path), 'utf-8');
|
|
45
|
+
// 增强 YAML Frontmatter
|
|
46
|
+
const enhancedContent = (0, frontmatter_1.updateFrontmatter)(originalContent, {
|
|
47
|
+
title: file.metadata.title,
|
|
48
|
+
summary: file.metadata.summary,
|
|
49
|
+
tags: file.metadata.tags,
|
|
50
|
+
date: file.metadata.inferred_date,
|
|
51
|
+
});
|
|
52
|
+
// 进行内链接替换, 将相对链接替换为基于 czon://hash 的链接
|
|
53
|
+
const replacedContent = replaceInnerLinks(file, enhancedContent);
|
|
54
|
+
await (0, writeFile_1.writeFile)(filePath, replacedContent);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.warn(`⚠️ Failed to store native file ${file.path}:`, error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (verbose && files.length > 0) {
|
|
61
|
+
console.log(`💾 Stored ${files.length} native language files to .czon/src`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=enhanceMarkdownSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanceMarkdownSource.js","sourceRoot":"","sources":["../../src/process/enhanceMarkdownSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ async function extractMetadataByAI() {
|
|
|
14
14
|
console.log(`🤖 Processing ${files.length} files with AI...`);
|
|
15
15
|
await Promise.all(files.map(async (file) => {
|
|
16
16
|
try {
|
|
17
|
-
if (file.metadata && file.metadata.slug) {
|
|
17
|
+
if (file.metadata && file.metadata.slug && file.metadata.short_summary) {
|
|
18
18
|
console.info(`ℹ️ Skipping ${file.path}, already has metadata`);
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
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,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;
|
|
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,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACvE,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processTranslations.d.ts","sourceRoot":"","sources":["../../src/process/processTranslations.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDzD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.processTranslations = processTranslations;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const translateMarkdown_1 = require("../ai/translateMarkdown");
|
|
10
|
+
const metadata_1 = require("../metadata");
|
|
11
|
+
const paths_1 = require("../paths");
|
|
12
|
+
const sha256_1 = require("../utils/sha256");
|
|
13
|
+
const writeFile_1 = require("../utils/writeFile");
|
|
14
|
+
/**
|
|
15
|
+
* 处理翻译
|
|
16
|
+
*/
|
|
17
|
+
async function processTranslations() {
|
|
18
|
+
const { files, options: { langs = [], verbose }, } = metadata_1.MetaData;
|
|
19
|
+
await Promise.all(files.flatMap(async (file) => {
|
|
20
|
+
return Promise.all(langs.map(async (lang) => {
|
|
21
|
+
if (verbose)
|
|
22
|
+
console.info(`📄 Processing file for translation: ${file.path}`);
|
|
23
|
+
if (!file.metadata) {
|
|
24
|
+
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (verbose)
|
|
28
|
+
console.log(`🌐 Translating to ${lang}...`);
|
|
29
|
+
// 存储翻译文件到 .czon/src/{lang}
|
|
30
|
+
const sourcePath = path_1.default.join(paths_1.CZON_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
31
|
+
const targetPath = path_1.default.join(paths_1.CZON_SRC_DIR, lang, file.hash + '.md');
|
|
32
|
+
try {
|
|
33
|
+
const content = await (0, promises_1.readFile)(sourcePath, 'utf-8');
|
|
34
|
+
if (file.metadata.inferred_lang === lang) {
|
|
35
|
+
if (verbose)
|
|
36
|
+
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const hash = (0, sha256_1.sha256)(content);
|
|
40
|
+
if (hash === file.nativeMarkdownHash) {
|
|
41
|
+
if (verbose)
|
|
42
|
+
console.info(`ℹ️ Content unchanged for ${file.path}, skipping translation.`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const translatedContent = await (0, translateMarkdown_1.translateMarkdown)(content, lang);
|
|
46
|
+
await (0, writeFile_1.writeFile)(targetPath, translatedContent);
|
|
47
|
+
// 存储已增强内容的哈希值
|
|
48
|
+
file.nativeMarkdownHash = hash;
|
|
49
|
+
if (verbose)
|
|
50
|
+
console.log(`✅ Translated file saved: ${targetPath}`);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
54
|
+
}
|
|
55
|
+
}));
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=processTranslations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processTranslations.js","sourceRoot":"","sources":["../../src/process/processTranslations.ts"],"names":[],"mappings":";;;;;AAWA,kDAuDC;AAlED,0CAAuC;AACvC,gDAAwB;AACxB,+DAA4D;AAC5D,0CAAuC;AACvC,oCAAwC;AACxC,4CAAyC;AACzC,kDAA+C;AAE/C;;GAEG;AACI,KAAK,UAAU,mBAAmB;IACvC,MAAM,EACJ,KAAK,EACL,OAAO,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,EAAE,GACjC,GAAG,mBAAQ,CAAC;IAEb,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,OAAO,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACzB,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACrB,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YACD,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,KAAK,CAAC,CAAC;YACzD,2BAA2B;YAC3B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAC1B,oBAAY,EACZ,IAAI,CAAC,QAAQ,CAAC,aAAa,EAC3B,IAAI,CAAC,IAAI,GAAG,KAAK,CAClB,CAAC,CAAC,gBAAgB;YACnB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YAEpE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;oBACzC,IAAI,OAAO;wBACT,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,IAAI,8BAA8B,CAAC,CAAC;oBACtF,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;gBAE7B,IAAI,IAAI,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACrC,IAAI,OAAO;wBACT,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;oBAC/E,OAAO;gBACT,CAAC;gBAED,MAAM,iBAAiB,GAAG,MAAM,IAAA,qCAAiB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAEjE,MAAM,IAAA,qBAAS,EAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;gBAE/C,cAAc;gBACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAE/B,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,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":"AAUA;;GAEG;AACH,eAAO,MAAM,yBAAyB,qBA4ErC,CAAC"}
|