zengen 0.1.35 → 0.2.0
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/bump-version.yml +112 -0
- package/.github/workflows/ci.yml +2 -2
- package/.github/workflows/pages.yml +1 -7
- package/.zen/meta.json +155 -0
- package/.zen/src/en-US/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
- package/.zen/src/en-US/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +75 -0
- package/.zen/src/en-US/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
- package/.zen/src/en-US/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +53 -0
- package/.zen/src/en-US/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +11 -0
- package/.zen/src/en-US/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +61 -0
- package/.zen/src/en-US/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
- package/.zen/src/en-US/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
- package/.zen/src/zh-Hans/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
- package/.zen/src/zh-Hans/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +77 -0
- package/.zen/src/zh-Hans/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
- package/.zen/src/zh-Hans/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +55 -0
- package/.zen/src/zh-Hans/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +1 -0
- package/.zen/src/zh-Hans/6ad8db715a1b60613fe934fefb29fa981ecad9b63145593accff144d73b44bde.md +175 -0
- package/.zen/src/zh-Hans/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +63 -0
- package/.zen/src/zh-Hans/a1580f71c6c6c1ff4a314be72d410a8507af2f087d56360c7f5048d349c21953.md +48 -0
- package/.zen/src/zh-Hans/d49012f98c4367b34034063400e2f7826bf0615952210c82396920172d468e2c.md +107 -0
- package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
- package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
- package/assets/templates/default/layout.html +274 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
- package/dist/ai/extractMetadataFromMarkdown.js +88 -0
- package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
- package/dist/ai/translateMarkdown.d.ts +8 -0
- package/dist/ai/translateMarkdown.d.ts.map +1 -0
- package/dist/ai/translateMarkdown.js +29 -0
- package/dist/ai/translateMarkdown.js.map +1 -0
- package/dist/build/pipeline.d.ts +6 -0
- package/dist/build/pipeline.d.ts.map +1 -0
- package/dist/build/pipeline.js +218 -0
- package/dist/build/pipeline.js.map +1 -0
- package/dist/cli.js +17 -83
- package/dist/cli.js.map +1 -1
- package/dist/findEntries.d.ts +10 -0
- package/dist/findEntries.d.ts.map +1 -0
- package/dist/findEntries.js +38 -0
- package/dist/findEntries.js.map +1 -0
- package/dist/index.d.ts +1 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -35
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +78 -0
- package/dist/metadata.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/process/extractMetadataByAI.d.ts +5 -0
- package/dist/process/extractMetadataByAI.d.ts.map +1 -0
- package/dist/process/extractMetadataByAI.js +31 -0
- package/dist/process/extractMetadataByAI.js.map +1 -0
- package/dist/process/template.d.ts +5 -0
- package/dist/process/template.d.ts.map +1 -0
- package/dist/process/template.js +188 -0
- package/dist/process/template.js.map +1 -0
- package/dist/scan/files.d.ts +7 -0
- package/dist/scan/files.d.ts.map +1 -0
- package/dist/scan/files.js +54 -0
- package/dist/scan/files.js.map +1 -0
- package/dist/services/openai.d.ts +41 -0
- package/dist/services/openai.d.ts.map +1 -0
- package/dist/services/openai.js +54 -0
- package/dist/services/openai.js.map +1 -0
- package/dist/types.d.ts +26 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
- package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
- package/dist/utils/convertMarkdownToHtml.js +39 -0
- package/dist/utils/convertMarkdownToHtml.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +6 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +22 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/docs/advanced-usage.md +39 -0
- package/docs/deployment/github-pages.md +1 -2
- package/docs/getting-started.md +26 -0
- package/docs/guides/best-practices.md +4 -117
- package/docs/guides/config.md +0 -238
- package/package.json +5 -2
- package/src/ai/extractMetadataFromMarkdown.ts +95 -0
- package/src/ai/translateMarkdown.ts +29 -0
- package/src/build/pipeline.ts +211 -0
- package/src/cli.ts +18 -94
- package/src/findEntries.ts +37 -0
- package/src/index.ts +1 -40
- package/src/metadata.ts +44 -0
- package/src/paths.ts +7 -0
- package/src/process/extractMetadataByAI.ts +29 -0
- package/src/process/template.ts +201 -0
- package/src/scan/files.ts +17 -0
- package/src/services/openai.ts +92 -0
- package/src/types.ts +29 -47
- package/src/utils/convertMarkdownToHtml.ts +32 -0
- package/src/utils/frontmatter.ts +18 -0
- package/test-multilang.js +44 -0
- package/dist/builder.d.ts +0 -46
- package/dist/builder.d.ts.map +0 -1
- package/dist/builder.js +0 -443
- package/dist/builder.js.map +0 -1
- package/dist/gitignore.d.ts +0 -40
- package/dist/gitignore.d.ts.map +0 -1
- package/dist/gitignore.js +0 -184
- package/dist/gitignore.js.map +0 -1
- package/dist/gitignore.test.d.ts +0 -2
- package/dist/gitignore.test.d.ts.map +0 -1
- package/dist/gitignore.test.js +0 -244
- package/dist/gitignore.test.js.map +0 -1
- package/dist/markdown.d.ts +0 -30
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js +0 -199
- package/dist/markdown.js.map +0 -1
- package/dist/navigation.d.ts +0 -46
- package/dist/navigation.d.ts.map +0 -1
- package/dist/navigation.js +0 -196
- package/dist/navigation.js.map +0 -1
- package/dist/template.d.ts +0 -29
- package/dist/template.d.ts.map +0 -1
- package/dist/template.js +0 -385
- package/dist/template.js.map +0 -1
- package/docs/ci/github-ci-cd.md +0 -127
- package/docs/guides/api.md +0 -277
- package/src/builder.ts +0 -458
- package/src/gitignore.test.ts +0 -253
- package/src/gitignore.ts +0 -173
- package/src/markdown.ts +0 -184
- package/src/navigation.ts +0 -237
- package/src/template.ts +0 -365
|
@@ -0,0 +1,274 @@
|
|
|
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
|
+
body {
|
|
15
|
+
font-family:
|
|
16
|
+
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
17
|
+
line-height: 1.6;
|
|
18
|
+
color: #333;
|
|
19
|
+
background: #f8f9fa;
|
|
20
|
+
display: flex;
|
|
21
|
+
min-height: 100vh;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.sidebar {
|
|
25
|
+
width: 280px;
|
|
26
|
+
background: #fff;
|
|
27
|
+
border-right: 1px solid #e9ecef;
|
|
28
|
+
padding: 2rem 1rem;
|
|
29
|
+
overflow-y: auto;
|
|
30
|
+
position: fixed;
|
|
31
|
+
height: 100vh;
|
|
32
|
+
left: 0;
|
|
33
|
+
top: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.sidebar-header {
|
|
37
|
+
margin-bottom: 2rem;
|
|
38
|
+
padding-bottom: 1rem;
|
|
39
|
+
border-bottom: 1px solid #e9ecef;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.sidebar-header h1 {
|
|
43
|
+
font-size: 1.5rem;
|
|
44
|
+
font-weight: 600;
|
|
45
|
+
color: #212529;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.sidebar-header p {
|
|
49
|
+
color: #6c757d;
|
|
50
|
+
font-size: 0.875rem;
|
|
51
|
+
margin-top: 0.5rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.nav-list {
|
|
55
|
+
list-style: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.nav-item {
|
|
59
|
+
margin-bottom: 0.5rem;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.nav-link {
|
|
63
|
+
display: block;
|
|
64
|
+
padding: 0.5rem 1rem;
|
|
65
|
+
color: #495057;
|
|
66
|
+
text-decoration: none;
|
|
67
|
+
border-radius: 4px;
|
|
68
|
+
transition: all 0.2s;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.nav-link:hover {
|
|
72
|
+
background: #e9ecef;
|
|
73
|
+
color: #212529;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.nav-link.active {
|
|
77
|
+
background: #007bff;
|
|
78
|
+
color: white;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.nav-submenu {
|
|
82
|
+
list-style: none;
|
|
83
|
+
margin-left: 1rem;
|
|
84
|
+
margin-top: 0.25rem;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.content {
|
|
88
|
+
flex: 1;
|
|
89
|
+
margin-left: 280px;
|
|
90
|
+
padding: 3rem 4rem;
|
|
91
|
+
max-width: 900px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.content-header {
|
|
95
|
+
margin-bottom: 2rem;
|
|
96
|
+
padding-bottom: 1rem;
|
|
97
|
+
border-bottom: 1px solid #e9ecef;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.content-header h1 {
|
|
101
|
+
font-size: 2.5rem;
|
|
102
|
+
font-weight: 700;
|
|
103
|
+
color: #212529;
|
|
104
|
+
margin-bottom: 0.5rem;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.content-header .meta {
|
|
108
|
+
color: #6c757d;
|
|
109
|
+
font-size: 0.875rem;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.content-body {
|
|
113
|
+
font-size: 1.125rem;
|
|
114
|
+
line-height: 1.8;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.content-body h1 {
|
|
118
|
+
font-size: 2rem;
|
|
119
|
+
margin: 2rem 0 1rem;
|
|
120
|
+
color: #212529;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.content-body h2 {
|
|
124
|
+
font-size: 1.75rem;
|
|
125
|
+
margin: 1.75rem 0 0.875rem;
|
|
126
|
+
color: #343a40;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.content-body h3 {
|
|
130
|
+
font-size: 1.5rem;
|
|
131
|
+
margin: 1.5rem 0 0.75rem;
|
|
132
|
+
color: #495057;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.content-body p {
|
|
136
|
+
margin: 1rem 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.content-body ul,
|
|
140
|
+
.content-body ol {
|
|
141
|
+
margin: 1rem 0 1rem 2rem;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.content-body li {
|
|
145
|
+
margin: 0.5rem 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.content-body blockquote {
|
|
149
|
+
border-left: 4px solid #007bff;
|
|
150
|
+
padding: 0.5rem 1rem;
|
|
151
|
+
margin: 1rem 0;
|
|
152
|
+
background: #f8f9fa;
|
|
153
|
+
color: #495057;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.content-body code {
|
|
157
|
+
background: #f8f9fa;
|
|
158
|
+
padding: 0.2rem 0.4rem;
|
|
159
|
+
border-radius: 3px;
|
|
160
|
+
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
|
|
161
|
+
font-size: 0.875em;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.content-body pre {
|
|
165
|
+
background: #f8f9fa;
|
|
166
|
+
padding: 1rem;
|
|
167
|
+
border-radius: 6px;
|
|
168
|
+
overflow-x: auto;
|
|
169
|
+
margin: 1rem 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.content-body pre code {
|
|
173
|
+
background: none;
|
|
174
|
+
padding: 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.content-body table {
|
|
178
|
+
width: 100%;
|
|
179
|
+
border-collapse: collapse;
|
|
180
|
+
margin: 1rem 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.content-body th,
|
|
184
|
+
.content-body td {
|
|
185
|
+
border: 1px solid #dee2e6;
|
|
186
|
+
padding: 0.75rem;
|
|
187
|
+
text-align: left;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.content-body th {
|
|
191
|
+
background: #f8f9fa;
|
|
192
|
+
font-weight: 600;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.content-body img {
|
|
196
|
+
max-width: 100%;
|
|
197
|
+
height: auto;
|
|
198
|
+
border-radius: 6px;
|
|
199
|
+
margin: 1rem 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.content-body a {
|
|
203
|
+
color: #007bff;
|
|
204
|
+
text-decoration: none;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.content-body a:hover {
|
|
208
|
+
text-decoration: underline;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.footer {
|
|
212
|
+
margin-top: 3rem;
|
|
213
|
+
padding-top: 2rem;
|
|
214
|
+
border-top: 1px solid #e9ecef;
|
|
215
|
+
color: #6c757d;
|
|
216
|
+
font-size: 0.875rem;
|
|
217
|
+
text-align: center;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@media (max-width: 768px) {
|
|
221
|
+
body {
|
|
222
|
+
flex-direction: column;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.sidebar {
|
|
226
|
+
width: 100%;
|
|
227
|
+
height: auto;
|
|
228
|
+
position: static;
|
|
229
|
+
border-right: none;
|
|
230
|
+
border-bottom: 1px solid #e9ecef;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.content {
|
|
234
|
+
margin-left: 0;
|
|
235
|
+
padding: 2rem;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
</style>
|
|
239
|
+
<link
|
|
240
|
+
rel="stylesheet"
|
|
241
|
+
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css"
|
|
242
|
+
/>
|
|
243
|
+
</head>
|
|
244
|
+
<body>
|
|
245
|
+
<nav class="sidebar">
|
|
246
|
+
<div class="sidebar-header">
|
|
247
|
+
<h1>ZEN Documentation</h1>
|
|
248
|
+
<p>A minimalist Markdown documentation site builder</p>
|
|
249
|
+
</div>
|
|
250
|
+
{{navigation}}
|
|
251
|
+
<div>{{language_switcher}}</div>
|
|
252
|
+
</nav>
|
|
253
|
+
|
|
254
|
+
<main class="content">
|
|
255
|
+
<header class="content-header">
|
|
256
|
+
<h1>{{title}}</h1>
|
|
257
|
+
</header>
|
|
258
|
+
|
|
259
|
+
<article class="content-body">{{content}}</article>
|
|
260
|
+
|
|
261
|
+
<footer class="footer">
|
|
262
|
+
<p>
|
|
263
|
+
Generated by <strong>ZEN</strong> •
|
|
264
|
+
<a href="https://github.com/zccz14/ZEN" target="_blank">View on GitHub</a>
|
|
265
|
+
</p>
|
|
266
|
+
</footer>
|
|
267
|
+
</main>
|
|
268
|
+
|
|
269
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
|
|
270
|
+
<script>
|
|
271
|
+
hljs.highlightAll();
|
|
272
|
+
</script>
|
|
273
|
+
</body>
|
|
274
|
+
</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 = 8000;
|
|
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: 文档的标题(简洁明了,不超过 20 个字)
|
|
52
|
+
2. summary: 文档摘要(控制在 100 字以内,概括主要内容)
|
|
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,IAAI,CAAC;IAC9B,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
|
+
* 将 markdown 翻译为指定的语言
|
|
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":"AAEA;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB5F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.translateMarkdown = translateMarkdown;
|
|
4
|
+
const openai_1 = require("../services/openai");
|
|
5
|
+
/**
|
|
6
|
+
* 将 markdown 翻译为指定的语言
|
|
7
|
+
* @param content Markdown 内容
|
|
8
|
+
* @param targetLang 目标语言代码(例如:zh-Hans, en-US)
|
|
9
|
+
* @returns Promise<string> 翻译后的 Markdown 内容
|
|
10
|
+
*/
|
|
11
|
+
async function translateMarkdown(content, targetLang) {
|
|
12
|
+
const messages = [
|
|
13
|
+
{
|
|
14
|
+
role: 'system',
|
|
15
|
+
content: `你是一个专业的翻译助手,擅长将文档翻译成不同语言,同时保持原有的格式和结构。请将用户输入翻译成 ${targetLang},注意保持 Markdown 格式不变,链接不变,不要翻译代码,但是可以翻译代码中的注释。`,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
role: 'user',
|
|
19
|
+
content: content,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
const response = await (0, openai_1.completeMessages)(messages);
|
|
23
|
+
const translatedContent = response.choices[0]?.message?.content?.trim() || '';
|
|
24
|
+
if (!translatedContent) {
|
|
25
|
+
throw new Error('Empty translation response');
|
|
26
|
+
}
|
|
27
|
+
return translatedContent;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=translateMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translateMarkdown.js","sourceRoot":"","sources":["../../src/ai/translateMarkdown.ts"],"names":[],"mappings":";;AAQA,8CAoBC;AA5BD,+CAAqE;AAErE;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,UAAkB;IACzE,MAAM,QAAQ,GAAoB;QAChC;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,mDAAmD,UAAU,+CAA+C;SACtH;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 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAsLxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.buildSite = buildSite;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const translateMarkdown_1 = require("../ai/translateMarkdown");
|
|
40
|
+
const findEntries_1 = require("../findEntries");
|
|
41
|
+
const metadata_1 = require("../metadata");
|
|
42
|
+
const paths_1 = require("../paths");
|
|
43
|
+
const extractMetadataByAI_1 = require("../process/extractMetadataByAI");
|
|
44
|
+
const template_1 = require("../process/template");
|
|
45
|
+
const files_1 = require("../scan/files");
|
|
46
|
+
const frontmatter_1 = require("../utils/frontmatter");
|
|
47
|
+
/**
|
|
48
|
+
* 验证构建配置
|
|
49
|
+
*/
|
|
50
|
+
async function validateConfig(options) {
|
|
51
|
+
const { verbose = false } = options;
|
|
52
|
+
if (verbose) {
|
|
53
|
+
console.log(`🚀 Starting ZEN build...`);
|
|
54
|
+
console.log(`🔗 Base URL: ${options.baseUrl || '(not set)'}`);
|
|
55
|
+
if (options.langs && options.langs.length > 0) {
|
|
56
|
+
console.log(`🌐 Target languages: ${options.langs.join(', ')}`);
|
|
57
|
+
}
|
|
58
|
+
console.log(`🔍 Verbose mode enabled`);
|
|
59
|
+
}
|
|
60
|
+
metadata_1.MetaData.options = options;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 扫描源文件
|
|
64
|
+
*/
|
|
65
|
+
async function scanSourceFiles() {
|
|
66
|
+
console.log(`🔍 Scanning source directory...`);
|
|
67
|
+
const markdownFiles = await (0, findEntries_1.findMarkdownEntries)(paths_1.INPUT_DIR);
|
|
68
|
+
const hashes = new Set();
|
|
69
|
+
for (const relativePath of markdownFiles) {
|
|
70
|
+
const fullPath = path.join(paths_1.INPUT_DIR, relativePath);
|
|
71
|
+
try {
|
|
72
|
+
// 检查文件是否存在
|
|
73
|
+
await fs.access(fullPath);
|
|
74
|
+
const hash = await (0, files_1.calculateFileHash)(fullPath);
|
|
75
|
+
hashes.add(hash);
|
|
76
|
+
const metaWithSameHash = metadata_1.MetaData.files.find(f => f.hash === hash);
|
|
77
|
+
if (metaWithSameHash) {
|
|
78
|
+
metaWithSameHash.path = relativePath;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// 如果没有相同哈希的元数据,则添加一个新的占位符
|
|
82
|
+
metadata_1.MetaData.files.push({
|
|
83
|
+
hash,
|
|
84
|
+
path: relativePath,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.warn(`⚠️ File not found or inaccessible: ${fullPath}`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// 移除不再存在的文件元数据
|
|
93
|
+
metadata_1.MetaData.files = metadata_1.MetaData.files.filter(f => hashes.has(f.hash));
|
|
94
|
+
console.log(`✅ Found ${metadata_1.MetaData.files.length} Markdown files`);
|
|
95
|
+
if (metadata_1.MetaData.files.length === 0) {
|
|
96
|
+
console.warn(`⚠️ No Markdown files found in ${paths_1.INPUT_DIR}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 存储母语文件到 .zen/src
|
|
101
|
+
*/
|
|
102
|
+
async function storeNativeFiles() {
|
|
103
|
+
const { options: { verbose }, files, } = metadata_1.MetaData;
|
|
104
|
+
for (const file of metadata_1.MetaData.files) {
|
|
105
|
+
try {
|
|
106
|
+
if (!file.hash)
|
|
107
|
+
throw new Error(`Missing hash`);
|
|
108
|
+
if (!file.metadata?.inferred_lang)
|
|
109
|
+
throw new Error(`Missing inferred language`);
|
|
110
|
+
const filePath = path.join(paths_1.ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md');
|
|
111
|
+
const originalContent = await fs.readFile(path.join(paths_1.INPUT_DIR, file.path), 'utf-8');
|
|
112
|
+
const enhancedContent = (0, frontmatter_1.updateFrontmatter)(originalContent, {
|
|
113
|
+
title: file.metadata.title,
|
|
114
|
+
summary: file.metadata.summary,
|
|
115
|
+
tags: file.metadata.tags,
|
|
116
|
+
inferred_date: file.metadata.inferred_date,
|
|
117
|
+
inferred_lang: file.metadata.inferred_lang,
|
|
118
|
+
});
|
|
119
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
120
|
+
await fs.writeFile(filePath, enhancedContent, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.warn(`⚠️ Failed to store native file ${file.path}:`, error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (verbose && files.length > 0) {
|
|
127
|
+
console.log(`💾 Stored ${files.length} native language files to .zen/src`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 处理翻译
|
|
132
|
+
*/
|
|
133
|
+
async function processTranslations() {
|
|
134
|
+
const { files, options: { langs = [], verbose }, } = metadata_1.MetaData;
|
|
135
|
+
for (const file of files) {
|
|
136
|
+
if (verbose)
|
|
137
|
+
console.info(`📄 Processing file for translation: ${file.path}`);
|
|
138
|
+
if (!file.metadata) {
|
|
139
|
+
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
for (const lang of langs) {
|
|
143
|
+
if (verbose)
|
|
144
|
+
console.log(`🌐 Translating to ${lang}...`);
|
|
145
|
+
// 存储翻译文件到 .zen/src/{lang}
|
|
146
|
+
const sourcePath = path.join(paths_1.ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
147
|
+
const targetPath = path.join(paths_1.ZEN_SRC_DIR, lang, file.hash + '.md');
|
|
148
|
+
try {
|
|
149
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
150
|
+
if (file.metadata.inferred_lang === lang) {
|
|
151
|
+
if (verbose)
|
|
152
|
+
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// 翻译
|
|
157
|
+
// 先检查是否已经有翻译文件存在
|
|
158
|
+
const exists = await fs.access(targetPath).then(() => true, () => false);
|
|
159
|
+
if (exists) {
|
|
160
|
+
if (verbose)
|
|
161
|
+
console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const translatedContent = await (0, translateMarkdown_1.translateMarkdown)(content, lang);
|
|
166
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
167
|
+
await fs.writeFile(targetPath, translatedContent, 'utf-8');
|
|
168
|
+
if (verbose)
|
|
169
|
+
console.log(`✅ Translated file saved: ${targetPath}`);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 构建管道(函数组合)
|
|
179
|
+
*/
|
|
180
|
+
async function buildPipeline(options) {
|
|
181
|
+
// 验证配置
|
|
182
|
+
await validateConfig(options);
|
|
183
|
+
// 清理输出目录
|
|
184
|
+
await fs.rm(paths_1.ZEN_DIST_DIR, { recursive: true, force: true });
|
|
185
|
+
// 确保 .zen/.gitignore 文件
|
|
186
|
+
await fs.writeFile(path.join(paths_1.ZEN_DIR, '.gitignore'), 'dist\n', 'utf-8');
|
|
187
|
+
// 扫描源文件
|
|
188
|
+
await scanSourceFiles();
|
|
189
|
+
// 运行 AI 元数据提取
|
|
190
|
+
await (0, extractMetadataByAI_1.extractMetadataByAI)();
|
|
191
|
+
// 存储母语文件
|
|
192
|
+
await storeNativeFiles();
|
|
193
|
+
// 处理翻译
|
|
194
|
+
await processTranslations();
|
|
195
|
+
// 渲染模板
|
|
196
|
+
await (0, template_1.renderTemplates)();
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 主构建函数
|
|
200
|
+
*/
|
|
201
|
+
async function buildSite(options) {
|
|
202
|
+
const startTime = Date.now();
|
|
203
|
+
try {
|
|
204
|
+
await (0, metadata_1.loadMetaData)();
|
|
205
|
+
await buildPipeline(options);
|
|
206
|
+
const endTime = Date.now();
|
|
207
|
+
const duration = ((endTime - startTime) / 1000).toFixed(2);
|
|
208
|
+
console.log(`🎉 Build completed in ${duration}s`);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
console.error(`❌ Build failed:`, error);
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
await (0, metadata_1.saveMetaData)();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"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"}
|