czon 0.1.0 → 0.1.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.
Files changed (79) hide show
  1. package/.github/workflows/bump-version.yml +112 -0
  2. package/.github/workflows/ci.yml +64 -0
  3. package/.github/workflows/pages.yml +61 -0
  4. package/.github/workflows/publish.yml +81 -0
  5. package/.husky/pre-commit +1 -0
  6. package/.prettierignore +14 -0
  7. package/.prettierrc.json +11 -0
  8. package/README.md +56 -0
  9. package/assets/templates/default/layout.html +421 -0
  10. package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
  11. package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
  12. package/dist/ai/extractMetadataFromMarkdown.js +88 -0
  13. package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
  14. package/dist/ai/translateMarkdown.d.ts +8 -0
  15. package/dist/ai/translateMarkdown.d.ts.map +1 -0
  16. package/dist/ai/translateMarkdown.js +60 -0
  17. package/dist/ai/translateMarkdown.js.map +1 -0
  18. package/dist/build/pipeline.d.ts +6 -0
  19. package/dist/build/pipeline.d.ts.map +1 -0
  20. package/dist/build/pipeline.js +180 -0
  21. package/dist/build/pipeline.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +102 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/findEntries.d.ts +10 -0
  27. package/dist/findEntries.d.ts.map +1 -0
  28. package/dist/findEntries.js +38 -0
  29. package/dist/findEntries.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/languages.d.ts +2 -0
  35. package/dist/languages.d.ts.map +1 -0
  36. package/dist/languages.js +37 -0
  37. package/dist/languages.js.map +1 -0
  38. package/dist/metadata.d.ts +14 -0
  39. package/dist/metadata.d.ts.map +1 -0
  40. package/dist/metadata.js +78 -0
  41. package/dist/metadata.js.map +1 -0
  42. package/dist/paths.d.ts +6 -0
  43. package/dist/paths.d.ts.map +1 -0
  44. package/dist/paths.js +10 -0
  45. package/dist/paths.js.map +1 -0
  46. package/dist/process/extractMetadataByAI.d.ts +5 -0
  47. package/dist/process/extractMetadataByAI.d.ts.map +1 -0
  48. package/dist/process/extractMetadataByAI.js +31 -0
  49. package/dist/process/extractMetadataByAI.js.map +1 -0
  50. package/dist/process/scanSourceFiles.d.ts +5 -0
  51. package/dist/process/scanSourceFiles.d.ts.map +1 -0
  52. package/dist/process/scanSourceFiles.js +70 -0
  53. package/dist/process/scanSourceFiles.js.map +1 -0
  54. package/dist/process/template.d.ts +5 -0
  55. package/dist/process/template.d.ts.map +1 -0
  56. package/dist/process/template.js +207 -0
  57. package/dist/process/template.js.map +1 -0
  58. package/dist/services/openai.d.ts +41 -0
  59. package/dist/services/openai.d.ts.map +1 -0
  60. package/dist/services/openai.js +54 -0
  61. package/dist/services/openai.js.map +1 -0
  62. package/dist/types.d.ts +35 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
  67. package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
  68. package/dist/utils/convertMarkdownToHtml.js +94 -0
  69. package/dist/utils/convertMarkdownToHtml.js.map +1 -0
  70. package/dist/utils/frontmatter.d.ts +6 -0
  71. package/dist/utils/frontmatter.d.ts.map +1 -0
  72. package/dist/utils/frontmatter.js +22 -0
  73. package/dist/utils/frontmatter.js.map +1 -0
  74. package/dist/utils/sha256.d.ts +2 -0
  75. package/dist/utils/sha256.d.ts.map +1 -0
  76. package/dist/utils/sha256.js +7 -0
  77. package/dist/utils/sha256.js.map +1 -0
  78. package/package.json +58 -6
  79. package/tsconfig.json +19 -0
@@ -0,0 +1,421 @@
1
+ <!doctype html>
2
+ <html lang="{{lang}}">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{title}}</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ html[lang='ar-SA'] {
15
+ direction: rtl;
16
+ }
17
+
18
+ body {
19
+ font-family:
20
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
21
+ line-height: 1.6;
22
+ color: #333;
23
+ background: #f8f9fa;
24
+ display: flex;
25
+ align-items: stretch;
26
+ min-height: 100vh;
27
+ }
28
+
29
+ .sidebar {
30
+ width: 280px;
31
+ background: #fff;
32
+ border-right: 1px solid #e9ecef;
33
+ padding: 2rem 1rem;
34
+ overflow-y: auto;
35
+
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ .sidebar-header {
40
+ margin-bottom: 2rem;
41
+ padding-bottom: 1rem;
42
+ border-bottom: 1px solid #e9ecef;
43
+ }
44
+
45
+ .sidebar-header h1 {
46
+ font-size: 1.5rem;
47
+ font-weight: 600;
48
+ color: #212529;
49
+ }
50
+
51
+ .sidebar-header p {
52
+ color: #6c757d;
53
+ font-size: 0.875rem;
54
+ margin-top: 0.5rem;
55
+ }
56
+
57
+ .nav-list {
58
+ list-style: none;
59
+ }
60
+
61
+ .nav-item {
62
+ margin-bottom: 0.5rem;
63
+ }
64
+
65
+ .nav-link {
66
+ display: block;
67
+ padding: 0.5rem 1rem;
68
+ color: #495057;
69
+ text-decoration: none;
70
+ border-radius: 4px;
71
+ transition: all 0.2s;
72
+ }
73
+
74
+ .nav-link:hover {
75
+ background: #e9ecef;
76
+ color: #212529;
77
+ }
78
+
79
+ .nav-link.active {
80
+ background: #007bff;
81
+ color: white;
82
+ }
83
+
84
+ .nav-submenu {
85
+ list-style: none;
86
+ margin-left: 1rem;
87
+ margin-top: 0.25rem;
88
+ }
89
+
90
+ blockquote {
91
+ border-left: 4px solid #007bff;
92
+ padding: 0.5rem 1rem;
93
+ margin: 1rem 0;
94
+ background: #f8f9fa;
95
+ color: #495057;
96
+ }
97
+
98
+ .content {
99
+ flex: 1;
100
+ margin-inline-start: 80px;
101
+ padding: 3rem 4rem;
102
+ max-width: 900px;
103
+ }
104
+
105
+ .content-header {
106
+ margin-bottom: 2rem;
107
+ padding-bottom: 1rem;
108
+ border-bottom: 1px solid #e9ecef;
109
+ }
110
+
111
+ .content-header h1 {
112
+ font-size: 2.5rem;
113
+ font-weight: 700;
114
+ color: #212529;
115
+ margin-bottom: 0.5rem;
116
+ }
117
+
118
+ .content-header .meta {
119
+ color: #6c757d;
120
+ font-size: 0.875rem;
121
+ }
122
+
123
+ .content-body {
124
+ font-size: 1.125rem;
125
+ line-height: 1.8;
126
+ }
127
+
128
+ .content-body h1 {
129
+ font-size: 2rem;
130
+ margin: 2rem 0 1rem;
131
+ color: #212529;
132
+ }
133
+
134
+ .content-body h2 {
135
+ font-size: 1.75rem;
136
+ margin: 1.75rem 0 0.875rem;
137
+ color: #343a40;
138
+ }
139
+
140
+ .content-body h3 {
141
+ font-size: 1.5rem;
142
+ margin: 1.5rem 0 0.75rem;
143
+ color: #495057;
144
+ }
145
+
146
+ .content-body p {
147
+ margin: 1rem 0;
148
+ }
149
+
150
+ .content-body ul,
151
+ .content-body ol {
152
+ margin: 1rem 0 1rem 2rem;
153
+ }
154
+
155
+ .content-body li {
156
+ margin: 0.5rem 0;
157
+ }
158
+
159
+ .content-body blockquote {
160
+ border-left: 4px solid #007bff;
161
+ padding: 0.5rem 1rem;
162
+ margin: 1rem 0;
163
+ background: #f8f9fa;
164
+ color: #495057;
165
+ }
166
+
167
+ .content-body code {
168
+ background: #f8f9fa;
169
+ padding: 0.2rem 0.4rem;
170
+ border-radius: 3px;
171
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
172
+ font-size: 0.875em;
173
+ }
174
+
175
+ .content-body pre {
176
+ background: #f8f9fa;
177
+ padding: 1rem;
178
+ border-radius: 6px;
179
+ overflow-x: auto;
180
+ margin: 1rem 0;
181
+ }
182
+
183
+ .content-body pre code {
184
+ background: none;
185
+ padding: 0;
186
+ }
187
+
188
+ .content-body table {
189
+ width: 100%;
190
+ border-collapse: collapse;
191
+ margin: 1rem 0;
192
+ }
193
+
194
+ .content-body th,
195
+ .content-body td {
196
+ border: 1px solid #dee2e6;
197
+ padding: 0.75rem;
198
+ text-align: left;
199
+ }
200
+
201
+ .content-body th {
202
+ background: #f8f9fa;
203
+ font-weight: 600;
204
+ }
205
+
206
+ .content-body img {
207
+ max-width: 100%;
208
+ height: auto;
209
+ border-radius: 6px;
210
+ margin: 1rem 0;
211
+ }
212
+
213
+ .content-body a {
214
+ color: #007bff;
215
+ text-decoration: none;
216
+ }
217
+
218
+ .content-body a:hover {
219
+ text-decoration: underline;
220
+ }
221
+
222
+ .footer {
223
+ margin-top: 3rem;
224
+ padding-top: 2rem;
225
+ border-top: 1px solid #e9ecef;
226
+ color: #6c757d;
227
+ font-size: 0.875rem;
228
+ text-align: center;
229
+ }
230
+
231
+ .language-switcher {
232
+ margin-top: 2rem;
233
+ text-align: center;
234
+ }
235
+
236
+ .lang-list {
237
+ list-style: none;
238
+ padding: 0;
239
+ /* display: flex; */
240
+ /* justify-content: center; */
241
+ /* flex-wrap: wrap; */
242
+ gap: 1rem;
243
+ }
244
+
245
+ .lang-item a {
246
+ color: #495057;
247
+ text-decoration: none;
248
+ font-weight: 500;
249
+ }
250
+ .lang-item.active a {
251
+ font-weight: 700;
252
+ color: #007bff;
253
+ }
254
+
255
+ .tags-list {
256
+ list-style: none;
257
+ padding: 0;
258
+ display: flex;
259
+ gap: 0.5rem;
260
+ margin-top: 0.5rem;
261
+ flex-wrap: wrap;
262
+ }
263
+
264
+ .tag-item {
265
+ background: #e9ecef;
266
+ color: #495057;
267
+ padding: 0.25rem 0.5rem;
268
+ border-radius: 4px;
269
+ font-size: 0.875rem;
270
+ }
271
+
272
+ @media (max-width: 768px) {
273
+ body {
274
+ flex-direction: column;
275
+ }
276
+
277
+ .sidebar {
278
+ width: 100%;
279
+ height: auto;
280
+ position: static;
281
+ border-right: none;
282
+ border-bottom: 1px solid #e9ecef;
283
+ }
284
+
285
+ .content {
286
+ margin-left: 0;
287
+ padding: 2rem;
288
+ }
289
+ }
290
+ </style>
291
+ <link
292
+ rel="stylesheet"
293
+ href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css"
294
+ />
295
+ <link
296
+ rel="stylesheet"
297
+ href="https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css"
298
+ integrity="sha384-GvrOXuhMATgEsSwCs4smul74iXGOixntILdUW9XmUC6+HX0sLNAK3q71HotJqlAn"
299
+ crossorigin="anonymous"
300
+ />
301
+
302
+ <!-- Mermaid.js for diagram rendering -->
303
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@11.4.0/dist/mermaid.min.js"></script>
304
+ <style>
305
+ /* Mermaid diagram styles */
306
+ .mermaid-diagram {
307
+ margin: 1.5rem 0;
308
+ border: 1px solid #e9ecef;
309
+ border-radius: 6px;
310
+ overflow: hidden;
311
+ background: #fff;
312
+ }
313
+
314
+ .mermaid-placeholder {
315
+ padding: 2rem;
316
+ background: #f8f9fa;
317
+ min-height: 200px;
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
322
+ }
323
+
324
+ .mermaid-loading {
325
+ color: #6c757d;
326
+ font-style: italic;
327
+ font-size: 0.875rem;
328
+ }
329
+
330
+ .mermaid-error {
331
+ color: #dc3545;
332
+ padding: 1rem;
333
+ background: #f8d7da;
334
+ border-radius: 4px;
335
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
336
+ font-size: 0.875rem;
337
+ line-height: 1.5;
338
+ }
339
+
340
+ .mermaid-source {
341
+ display: none;
342
+ }
343
+
344
+ /* Ensure Mermaid diagrams are responsive */
345
+ .mermaid-diagram svg {
346
+ max-width: 100%;
347
+ height: auto;
348
+ display: block;
349
+ margin: 0 auto;
350
+ }
351
+ </style>
352
+ </head>
353
+ <body>
354
+ <nav class="sidebar">
355
+ <!-- <div class="sidebar-header">
356
+ <h1>ZEN Documentation</h1>
357
+ <p>A minimalist Markdown documentation site builder</p>
358
+ </div> -->
359
+ {{navigation}}
360
+ <hr />
361
+ <div>{{language_switcher}}</div>
362
+ </nav>
363
+
364
+ <main class="content">
365
+ <header class="content-header">
366
+ <h2>{{title}}</h2>
367
+ <blockquote>{{summary}}</blockquote>
368
+ <div>📅 {{inferred_date}}</div>
369
+ <div class="tags">{{tags}}</div>
370
+ </header>
371
+
372
+ <hr />
373
+
374
+ <article class="content-body">{{content}}</article>
375
+
376
+ <footer class="footer">
377
+ <p>
378
+ Generated by <strong>ZEN</strong> •
379
+ <a href="https://github.com/zccz14/ZEN" target="_blank">View on GitHub</a>
380
+ </p>
381
+ </footer>
382
+ </main>
383
+
384
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
385
+ <script>
386
+ hljs.highlightAll();
387
+ </script>
388
+ <!-- Mermaid initialization -->
389
+ <script>
390
+ (function () {
391
+ // Wait for page to fully load
392
+ window.addEventListener('load', function () {
393
+ // Initialize Mermaid with default configuration
394
+ if (typeof mermaid !== 'undefined') {
395
+ mermaid.initialize({
396
+ startOnLoad: false,
397
+ theme: 'default',
398
+ securityLevel: 'strict',
399
+ flowchart: {
400
+ useMaxWidth: true,
401
+ htmlLabels: true,
402
+ curve: 'basis',
403
+ },
404
+ sequence: {
405
+ useMaxWidth: true,
406
+ diagramMarginX: 50,
407
+ diagramMarginY: 10,
408
+ actorMargin: 50,
409
+ },
410
+ gantt: {
411
+ useMaxWidth: true,
412
+ barHeight: 20,
413
+ barGap: 4,
414
+ },
415
+ });
416
+ }
417
+ });
418
+ })();
419
+ </script>
420
+ </body>
421
+ </html>
@@ -0,0 +1,8 @@
1
+ import { AIMetadata } from '../types';
2
+ /**
3
+ * 从 markdown 内容中提取 metadata
4
+ * @param content Markdown 内容
5
+ * @returns Promise<AIMetadata> 提取的元数据,失败时抛出错误
6
+ */
7
+ export declare function extractMetadataFromMarkdown(content: string): Promise<AIMetadata>;
8
+ //# sourceMappingURL=extractMetadataFromMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMetadataFromMarkdown.d.ts","sourceRoot":"","sources":["../../src/ai/extractMetadataFromMarkdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BtF"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractMetadataFromMarkdown = extractMetadataFromMarkdown;
4
+ const openai_1 = require("../services/openai");
5
+ /**
6
+ * 从 markdown 内容中提取 metadata
7
+ * @param content Markdown 内容
8
+ * @returns Promise<AIMetadata> 提取的元数据,失败时抛出错误
9
+ */
10
+ async function extractMetadataFromMarkdown(content) {
11
+ const prompt = buildMetadataPrompt(content);
12
+ const messages = [
13
+ {
14
+ role: 'system',
15
+ content: '你是一个专业的文档分析助手,擅长从文档中提取结构化信息。请严格按照要求的 JSON 格式返回结果。',
16
+ },
17
+ {
18
+ role: 'user',
19
+ content: prompt,
20
+ },
21
+ ];
22
+ const response = await (0, openai_1.completeMessages)(messages, {
23
+ response_format: { type: 'json_object' },
24
+ });
25
+ const metadata = parseMetadataResponse(response.choices[0].message.content);
26
+ // 添加 tokens 使用情况
27
+ metadata.tokens_used = {
28
+ prompt: response.usage.prompt_tokens,
29
+ completion: response.usage.completion_tokens,
30
+ total: response.usage.total_tokens,
31
+ };
32
+ return metadata;
33
+ }
34
+ /**
35
+ * 构建提取 metadata 的 prompt
36
+ */
37
+ function buildMetadataPrompt(content) {
38
+ // 限制内容长度以避免 token 超限
39
+ const maxContentLength = Infinity; // 可根据需要调整长度限制
40
+ const truncatedContent = content.length > maxContentLength
41
+ ? content.substring(0, maxContentLength) + '... [内容已截断]'
42
+ : content;
43
+ return `请分析以下文档内容,提取以下信息并返回 JSON 格式:
44
+
45
+ 文档内容:
46
+ """
47
+ ${truncatedContent}
48
+ """
49
+
50
+ 请提取:
51
+ 1. title: 文档的标题(简洁明了,不超过 30 个字)
52
+ 2. summary: 文档摘要(控制在 300 字以内,概括主要内容)
53
+ 3. tags: 关键词列表(3-8 个关键词,使用中文或英文)
54
+ 4. inferred_date: 文档中隐含的创建日期(如果有的话,格式:YYYY-MM-DD,没有就留空字符串)
55
+ 5. inferred_lang: 文档使用的语言代码(例如:zh-Hans 表示简体中文,en-US 表示美式英语)
56
+
57
+ 请严格按照以下 JSON 格式返回,不要包含任何其他文本:
58
+ {
59
+ "title": "文档标题",
60
+ "summary": "文档摘要...",
61
+ "tags": ["关键词1", "关键词2", "关键词3"],
62
+ "inferred_date": "2023-01-01",
63
+ "inferred_lang": "zh-Hans"
64
+ }`;
65
+ }
66
+ /**
67
+ * 解析 AI 返回的 metadata
68
+ */
69
+ function parseMetadataResponse(responseContent) {
70
+ try {
71
+ const metadata = JSON.parse(responseContent);
72
+ // 验证和清理数据
73
+ return {
74
+ title: metadata.title?.trim() || '未命名文档',
75
+ summary: metadata.summary?.trim() || '',
76
+ tags: Array.isArray(metadata.tags)
77
+ ? metadata.tags.map((tag) => tag.trim()).filter(Boolean)
78
+ : [],
79
+ inferred_date: metadata.inferred_date?.trim() || undefined,
80
+ inferred_lang: metadata.inferred_lang?.trim() || 'zh-Hans',
81
+ };
82
+ }
83
+ catch (error) {
84
+ console.error('❌ Failed to parse AI response:', error, 'Response:', responseContent);
85
+ throw error;
86
+ }
87
+ }
88
+ //# sourceMappingURL=extractMetadataFromMarkdown.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;EAiBhB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,eAAuB;IACpD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAE7C,UAAU;QACV,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO;YACxC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;YACvC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAChE,CAAC,CAAC,EAAE;YACN,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS;YAC1D,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS;SAC3D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QACrF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+
3
+ * @param content Markdown 内容
4
+ * @param targetLang 目标语言代码(例如:zh-Hans, en-US)
5
+ * @returns Promise<string> 翻译后的 Markdown 内容
6
+ */
7
+ export declare function translateMarkdown(content: string, targetLang: string): Promise<string>;
8
+ //# sourceMappingURL=translateMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translateMarkdown.d.ts","sourceRoot":"","sources":["../../src/ai/translateMarkdown.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD5F"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.translateMarkdown = translateMarkdown;
4
+ const languages_1 = require("../languages");
5
+ const openai_1 = require("../services/openai");
6
+ /**
7
+
8
+ * @param content Markdown 内容
9
+ * @param targetLang 目标语言代码(例如:zh-Hans, en-US)
10
+ * @returns Promise<string> 翻译后的 Markdown 内容
11
+ */
12
+ async function translateMarkdown(content, targetLang) {
13
+ const langName = languages_1.LANGUAGE_NAMES[targetLang];
14
+ const lang = `${langName} (${targetLang})`;
15
+ const messages = [
16
+ {
17
+ role: 'system',
18
+ content: [
19
+ `You are a professional document translator.`,
20
+ `Translate the following markdown content into ${lang}`,
21
+ targetLang === 'ja-JP'
22
+ ? [
23
+ //
24
+ '使用日语母语者自然的表达方式。',
25
+ '采用适合技术/专业文档的礼貌、正式语体(丁寧体/です・ます体)',
26
+ '确保语法和字符集完全符合日语规范。',
27
+ '绝对禁止使用繁体中文汉字。',
28
+ '所有日语汉字必须使用标准的 **日本常用汉字(Jōyō kanji)** 字形。',
29
+ '特别检查以下字形示例,确保使用日文标准字形:',
30
+ '1. “国” - 使用“国”而非“國”',
31
+ '2. “学” - 使用“学”而非“學”',
32
+ '3. “広” - 使用“広”而非“廣”',
33
+ '4. “円” - 使用“円”而非“圓”',
34
+ '5. “医” - 使用“医”而非“醫”',
35
+ '6. “図” - 使用“図”而非“圖”',
36
+ '7. “対” - 使用“対”而非“對”',
37
+ '8. “声” - 使用“声”而非“聲”',
38
+ '9. “芸” - 使用“芸”而非“藝”',
39
+ '10. “験” - 使用“験”而非“驗”',
40
+ ].join('\n')
41
+ : ``,
42
+ `Preserve the original markdown formatting, including headings, lists, code blocks, links, and images.`,
43
+ `Do not change any non-text elements or their formatting.`,
44
+ `Ensure that technical terms and code snippets remain unchanged.`,
45
+ `Provide a natural and fluent translation suitable for readers familiar with the subject matter.`,
46
+ ].join('\n'),
47
+ },
48
+ {
49
+ role: 'user',
50
+ content: content,
51
+ },
52
+ ];
53
+ const response = await (0, openai_1.completeMessages)(messages);
54
+ const translatedContent = response.choices[0]?.message?.content?.trim() || '';
55
+ if (!translatedContent) {
56
+ throw new Error('Empty translation response');
57
+ }
58
+ return translatedContent;
59
+ }
60
+ //# sourceMappingURL=translateMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translateMarkdown.js","sourceRoot":"","sources":["../../src/ai/translateMarkdown.ts"],"names":[],"mappings":";;AASA,8CAkDC;AA3DD,4CAA8C;AAC9C,+CAAqE;AAErE;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,UAAkB;IACzE,MAAM,QAAQ,GAAG,0BAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,GAAG,QAAQ,KAAK,UAAU,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAoB;QAChC;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,6CAA6C;gBAC7C,iDAAiD,IAAI,EAAE;gBACvD,UAAU,KAAK,OAAO;oBACpB,CAAC,CAAC;wBACE,EAAE;wBACF,iBAAiB;wBACjB,iCAAiC;wBACjC,mBAAmB;wBACnB,eAAe;wBACf,0CAA0C;wBAC1C,wBAAwB;wBACxB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,qBAAqB;wBACrB,sBAAsB;qBACvB,CAAC,IAAI,CAAC,IAAI,CAAC;oBACd,CAAC,CAAC,EAAE;gBACN,uGAAuG;gBACvG,0DAA0D;gBAC1D,iEAAiE;gBACjE,iGAAiG;aAClG,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;SACjB;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAgB,EAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE9E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { BuildOptions } from '../types';
2
+ /**
3
+ * 主构建函数
4
+ */
5
+ export declare function buildSite(options: BuildOptions): Promise<void>;
6
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAgJxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}