czon 0.1.5 → 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.
Files changed (61) hide show
  1. package/.prettierignore +4 -1
  2. package/dist/ai/extractMetadataFromMarkdown.js +22 -7
  3. package/dist/ai/extractMetadataFromMarkdown.js.map +1 -1
  4. package/dist/build/pipeline.d.ts.map +1 -1
  5. package/dist/build/pipeline.js +8 -85
  6. package/dist/build/pipeline.js.map +1 -1
  7. package/dist/process/enhanceMarkdownSource.d.ts +5 -0
  8. package/dist/process/enhanceMarkdownSource.d.ts.map +1 -0
  9. package/dist/process/enhanceMarkdownSource.js +64 -0
  10. package/dist/process/enhanceMarkdownSource.js.map +1 -0
  11. package/dist/process/extractMetadataByAI.js +1 -1
  12. package/dist/process/extractMetadataByAI.js.map +1 -1
  13. package/dist/process/processTranslations.d.ts +5 -0
  14. package/dist/process/processTranslations.d.ts.map +1 -0
  15. package/dist/process/processTranslations.js +58 -0
  16. package/dist/process/processTranslations.js.map +1 -0
  17. package/dist/process/template.d.ts +2 -2
  18. package/dist/process/template.d.ts.map +1 -1
  19. package/dist/process/template.js +63 -155
  20. package/dist/process/template.js.map +1 -1
  21. package/dist/ssg/ContentPage.d.ts +9 -0
  22. package/dist/ssg/ContentPage.d.ts.map +1 -0
  23. package/{assets/templates/default/layout.html → dist/ssg/ContentPage.js} +68 -61
  24. package/dist/ssg/ContentPage.js.map +1 -0
  25. package/dist/ssg/RedirectPage.d.ts +6 -0
  26. package/dist/ssg/RedirectPage.d.ts.map +1 -0
  27. package/dist/ssg/RedirectPage.js +24 -0
  28. package/dist/ssg/RedirectPage.js.map +1 -0
  29. package/dist/ssg/app.d.ts +4 -0
  30. package/dist/ssg/app.d.ts.map +1 -0
  31. package/dist/ssg/app.js +44 -0
  32. package/dist/ssg/app.js.map +1 -0
  33. package/dist/ssg/components/LanguageSwitcher.d.ts +8 -0
  34. package/dist/ssg/components/LanguageSwitcher.d.ts.map +1 -0
  35. package/dist/ssg/components/LanguageSwitcher.js +21 -0
  36. package/dist/ssg/components/LanguageSwitcher.js.map +1 -0
  37. package/dist/ssg/components/Navigator.d.ts +7 -0
  38. package/dist/ssg/components/Navigator.d.ts.map +1 -0
  39. package/dist/ssg/components/Navigator.js +17 -0
  40. package/dist/ssg/components/Navigator.js.map +1 -0
  41. package/dist/ssg/components/TagList.d.ts +5 -0
  42. package/dist/ssg/components/TagList.d.ts.map +1 -0
  43. package/dist/ssg/components/TagList.js +12 -0
  44. package/dist/ssg/components/TagList.js.map +1 -0
  45. package/dist/ssg/index.d.ts +3 -0
  46. package/dist/ssg/index.d.ts.map +1 -0
  47. package/dist/ssg/index.js +14 -0
  48. package/dist/ssg/index.js.map +1 -0
  49. package/dist/types.d.ts +33 -0
  50. package/dist/types.d.ts.map +1 -1
  51. package/dist/utils/writeFile.d.ts +5 -0
  52. package/dist/utils/writeFile.d.ts.map +1 -1
  53. package/dist/utils/writeFile.js +5 -0
  54. package/dist/utils/writeFile.js.map +1 -1
  55. package/package.json +5 -1
  56. package/tsconfig.json +1 -0
  57. package/.github/workflows/bump-version.yml +0 -112
  58. package/.github/workflows/ci.yml +0 -64
  59. package/.github/workflows/pages.yml +0 -61
  60. package/.github/workflows/publish.yml +0 -81
  61. package/.husky/pre-commit +0 -1
@@ -33,175 +33,83 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.renderTemplates = renderTemplates;
36
+ exports.spiderStaticSiteGenerator = void 0;
37
37
  const fs = __importStar(require("fs/promises"));
38
38
  const path = __importStar(require("path"));
39
- const languages_1 = require("../languages");
40
39
  const metadata_1 = require("../metadata");
41
40
  const paths_1 = require("../paths");
41
+ const ssg_1 = require("../ssg");
42
42
  const convertMarkdownToHtml_1 = require("../utils/convertMarkdownToHtml");
43
43
  const frontmatter_1 = require("../utils/frontmatter");
44
44
  const writeFile_1 = require("../utils/writeFile");
45
45
  /**
46
- * 生成语言切换器 HTML
47
- * @param currentLang 当前语言
48
- * @param availableLangs 可用语言列表
49
- * @returns 语言切换器 HTML 字符串
46
+ * 使用简单的爬虫抓取生成的站点页面
50
47
  */
51
- function generateLanguageSwitcher(templateData) {
52
- const { options: { langs = [] }, } = metadata_1.MetaData;
53
- const items = langs
54
- .map(lang => {
55
- const langName = languages_1.LANGUAGE_NAMES[lang] || lang;
56
- const isCurrent = lang === templateData.lang;
57
- const activeClass = isCurrent ? 'active' : '';
58
- const link = path.join('..', lang, templateData.file.metadata.slug + '.html');
59
- return `<li class="lang-item ${activeClass}">
60
- <a href="${link}" class="lang-link">${langName}</a>
61
- </li>`;
62
- })
63
- .join('');
64
- return `<div class="language-switcher">
65
- <ul class="lang-list">${items}</ul>
66
- </div>`;
67
- }
68
- const generateTagsHtml = (tags) => {
69
- return `<ul class="tags-list">${tags
70
- .map(tag => `<li class="tag-item">${tag}</li>`)
71
- .join('')}</ul>`;
72
- };
73
- /**
74
- * 生成导航 HTML
75
- * @param navigation 导航树
76
- * @param currentPath 当前路径(可选,用于高亮当前页面)
77
- * @returns 导航 HTML 字符串
78
- */
79
- async function generateNavigationHtml(data) {
80
- const { files } = metadata_1.MetaData;
81
- const navigation = await Promise.all(files.map(async (file) => {
82
- const content = await fs.readFile(path.join(paths_1.CZON_SRC_DIR, data.lang, file.hash + '.md'), 'utf-8');
83
- const { frontmatter } = (0, frontmatter_1.parseFrontmatter)(content);
84
- const title = frontmatter.title || file.metadata?.title || file.path; // 优先使用提取的标题
85
- // 使用相对链接
86
- const link = file.metadata.slug + '.html';
87
- return {
88
- title,
89
- link,
90
- isActive: data.file.hash === file.hash,
91
- };
92
- }));
93
- return `<ul class="nav-list">${navigation
94
- .map(item => {
95
- const activeClass = item.isActive ? 'active' : '';
96
- let html = `<li class="nav-item">`;
97
- html += `<a href="${item.link}" class="nav-link ${activeClass}">${item.title}</a>`;
98
- html += `</li>`;
99
- return html;
100
- })
101
- .join('')}</ul>`;
102
- }
103
- const replaceInnerLinks = (data, markdownContent) => {
104
- let content = markdownContent;
105
- for (const link of data.file.links) {
106
- if (URL.canParse(link))
107
- continue; // 跳过绝对 URL
108
- const targetPath = path.resolve('/', path.dirname(data.file.path), link).slice(1);
109
- const targetFile = metadata_1.MetaData.files.find(f => f.path === targetPath);
110
- if (!targetFile) {
111
- console.warn(`⚠️ Link target not found for ${link} in file ${data.file.path}`);
112
- continue;
113
- }
114
- // 替换链接 (使用相对链接)
115
- const targetLink = path.join(targetFile.hash + '.html');
116
- // 全局替换链接
117
- const linksRegex = new RegExp(`\\]\\(${link.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\)`, 'g');
118
- content = content.replace(linksRegex, `](${targetLink})`);
48
+ const spiderStaticSiteGenerator = async () => {
49
+ const queue = ['/index.html', '/404.html'];
50
+ // 将每个语言的首页加入队列
51
+ for (const lang of metadata_1.MetaData.options.langs || []) {
52
+ queue.push(`/${lang}/index.html`);
119
53
  }
120
- return content;
121
- };
122
- /**
123
- * 简单的模板变量替换
124
- * @param template 模板字符串
125
- * @param data 模板数据
126
- * @returns 渲染后的 HTML 字符串
127
- */
128
- async function renderTemplate(template, data) {
129
- const { options: { langs = [] }, } = metadata_1.MetaData;
130
- const markdownContent = data.content;
131
- const { frontmatter, body } = (0, frontmatter_1.parseFrontmatter)(markdownContent);
132
- const htmlContent = (0, convertMarkdownToHtml_1.convertMarkdownToHtml)(replaceInnerLinks(data, body));
133
- let result = template;
134
- // 替换导航
135
- const navigationHtml = await generateNavigationHtml(data);
136
- result = result.replace(/{{navigation}}/g, navigationHtml);
137
- // 替换其他变量 - 使用全局替换
138
- result = result.replace(/{{title}}/g, frontmatter.title || 'Untitled');
139
- result = result.replace(/{{content}}/g, htmlContent);
140
- // 替换元数据变量
141
- if (frontmatter) {
142
- result = result.replace(/{{summary}}/g, frontmatter.summary || '');
143
- result = result.replace(/{{tags}}/g, generateTagsHtml(frontmatter.tags || []));
144
- result = result.replace(/{{date}}/g, frontmatter.date || '--');
145
- }
146
- // 替换语言相关变量
147
- result = result.replace(/{{lang}}/g, data.lang || '');
148
- if (langs && langs.length > 1 && data.lang) {
149
- const langSwitcher = generateLanguageSwitcher(data);
150
- result = result.replace(/{{language_switcher}}/g, langSwitcher);
54
+ const isVisited = new Set();
55
+ const contents = [];
56
+ // 预加载所有 Markdown 内容
57
+ for (const file of metadata_1.MetaData.files) {
58
+ for (const lang of metadata_1.MetaData.options.langs || []) {
59
+ const markdown = await fs.readFile(path.join(paths_1.CZON_SRC_DIR, lang, file.hash + '.md'), 'utf-8');
60
+ const { frontmatter, body } = (0, frontmatter_1.parseFrontmatter)(markdown);
61
+ const markdownHtml = (0, convertMarkdownToHtml_1.convertMarkdownToHtml)(body);
62
+ contents.push({
63
+ lang,
64
+ hash: file.hash,
65
+ body: markdownHtml,
66
+ frontmatter,
67
+ });
68
+ }
151
69
  }
152
- return result;
153
- }
154
- const renderRedirectTemplate = async (from, to) => {
155
- const toURL = path.relative(path.dirname(from), to);
156
- const html = `<!DOCTYPE html>
157
- <html lang="en">
158
- <head>
159
- <meta charset="UTF-8">
160
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
161
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
162
- <meta http-equiv="refresh" content="0; url=${toURL}">
163
- <title>Redirecting...</title>
164
- </head>
165
- <body>
166
- <p>Redirecting to <a href="${toURL}">${toURL}</a></p>
167
- </body>
168
- </html>`;
169
- const targetPath = path.join(paths_1.CZON_DIST_DIR, from);
170
- await fs.mkdir(path.dirname(targetPath), { recursive: true });
171
- await fs.writeFile(targetPath, html, 'utf-8');
172
- };
173
- /**
174
- * 渲染模板并保存文件
175
- */
176
- async function renderTemplates() {
177
- const { files, options: { langs, verbose }, } = metadata_1.MetaData;
178
- if (verbose)
179
- console.log(`⚡ Processing files...`);
180
- const layoutTemplate = await fs.readFile(path.join(__dirname, '../../assets/templates/default/layout.html'), 'utf-8');
181
- for (const file of files) {
182
- for (const lang of langs || []) {
183
- console.info(`📄 Preparing file for language: ${file.path} [${file.hash}] [${lang}]`);
184
- const content = await fs.readFile(path.join(paths_1.CZON_SRC_DIR, lang, file.hash + '.md'), 'utf-8');
185
- try {
186
- const html = await renderTemplate(layoutTemplate, {
187
- file,
188
- content,
189
- lang,
190
- });
191
- if (file.metadata?.slug) {
192
- await (0, writeFile_1.writeFile)(path.join(paths_1.CZON_DIST_DIR, lang, file.metadata.slug + '.html'), html);
70
+ while (queue.length > 0) {
71
+ const currentPath = queue.shift();
72
+ if (isVisited.has(currentPath))
73
+ continue;
74
+ isVisited.add(currentPath);
75
+ let html = (0, ssg_1.renderToHTML)({
76
+ path: currentPath,
77
+ site: metadata_1.MetaData,
78
+ contents,
79
+ });
80
+ // 内部链接: czon://hash 格式的链接替换为 /{lang}/{slug}.html
81
+ html = html.replace(/href="([^"]+)"/g, (match, link) => {
82
+ console.info(`🕷️ Processing link: ${link} in path: ${currentPath}`);
83
+ if (link.startsWith('czon://')) {
84
+ const hash = link.replace('czon://', '');
85
+ console.info(` 🔗 Replacing internal link for hash: ${hash}`);
86
+ const file = metadata_1.MetaData.files.find(f => f.hash === hash);
87
+ if (!file || !file.metadata) {
88
+ console.warn(`⚠️ Link target not found for hash ${hash} in path ${currentPath}`);
89
+ return match;
193
90
  }
91
+ const slug = file.metadata.slug;
92
+ const targetPath = path.resolve('/', path.dirname(currentPath), `${slug}.html`);
93
+ const href = path.relative(path.dirname(currentPath), targetPath);
94
+ return `href="${href}"`;
194
95
  }
195
- catch (error) {
196
- console.error(`❌ Failed to render ${file.path}:`, error);
96
+ return match;
97
+ });
98
+ console.info(`🕷️ Crawled ${currentPath}`);
99
+ await (0, writeFile_1.writeFile)(path.join(paths_1.CZON_DIST_DIR, currentPath), html);
100
+ // 提取生成的 HTML 中的站内链接,加入爬取队列
101
+ const linkRegex = /href="([^"]+)"/g;
102
+ for (const match of html.matchAll(linkRegex)) {
103
+ const link = match[1];
104
+ if (URL.canParse(link))
105
+ continue; // 跳过绝对 URL
106
+ const resolvedPath = path.resolve('/', path.dirname(currentPath), link);
107
+ console.info(` ➕ Found link: ${link} -> ${resolvedPath} (${isVisited.has(resolvedPath) ? 'visited' : 'new'})`);
108
+ if (!isVisited.has(resolvedPath)) {
109
+ queue.push(resolvedPath);
197
110
  }
198
111
  }
199
112
  }
200
- for (const lang of langs || []) {
201
- await renderRedirectTemplate(path.join(lang, 'index.html'), path.join(lang, files[0].metadata.slug + '.html'));
202
- }
203
- await renderRedirectTemplate('index.html', path.join(langs?.[0] || 'en-US', 'index.html'));
204
- // 404 页面重定向到首页
205
- await renderRedirectTemplate('404.html', 'index.html');
206
- }
113
+ };
114
+ exports.spiderStaticSiteGenerator = spiderStaticSiteGenerator;
207
115
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { IRenderContext } from '../types';
3
+ export declare const ContentPage: React.FC<{
4
+ ctx: IRenderContext;
5
+ file: IRenderContext['site']['files'][0];
6
+ lang: string;
7
+ content: IRenderContext['contents'][0];
8
+ }>;
9
+ //# sourceMappingURL=ContentPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentPage.d.ts","sourceRoot":"","sources":["../../src/ssg/ContentPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK1C,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,CA4bA,CAAC"}
@@ -1,11 +1,22 @@
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
- * {
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.ContentPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const LanguageSwitcher_1 = require("./components/LanguageSwitcher");
9
+ const Navigator_1 = require("./components/Navigator");
10
+ const TagList_1 = require("./components/TagList");
11
+ const ContentPage = props => {
12
+ return (react_1.default.createElement("html", { lang: props.lang },
13
+ react_1.default.createElement("head", null,
14
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
15
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
16
+ react_1.default.createElement("title", null, props.file.metadata.title),
17
+ react_1.default.createElement("style", { dangerouslySetInnerHTML: {
18
+ __html: `
19
+ * {
9
20
  margin: 0;
10
21
  padding: 0;
11
22
  box-sizing: border-box;
@@ -287,21 +298,15 @@
287
298
  padding: 2rem;
288
299
  }
289
300
  }
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>
301
+
302
+
303
+ `,
304
+ } }),
305
+ react_1.default.createElement("link", { rel: "stylesheet", href: "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css" }),
306
+ react_1.default.createElement("link", { rel: "stylesheet", href: "https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css", integrity: "sha384-GvrOXuhMATgEsSwCs4smul74iXGOixntILdUW9XmUC6+HX0sLNAK3q71HotJqlAn", crossOrigin: "anonymous" }),
307
+ react_1.default.createElement("script", { src: "https://cdn.jsdelivr.net/npm/mermaid@11.4.0/dist/mermaid.min.js" }),
308
+ react_1.default.createElement("style", { dangerouslySetInnerHTML: {
309
+ __html: `
305
310
  /* Mermaid diagram styles */
306
311
  .mermaid-diagram {
307
312
  margin: 1.5rem 0;
@@ -348,41 +353,38 @@
348
353
  display: block;
349
354
  margin: 0 auto;
350
355
  }
351
- </style>
352
- </head>
353
- <body>
354
- <nav class="sidebar">
355
- {{navigation}}
356
- <hr />
357
- <div>{{language_switcher}}</div>
358
- </nav>
359
-
360
- <main class="content">
361
- <header class="content-header">
362
- <h2>{{title}}</h2>
363
- <blockquote>{{summary}}</blockquote>
364
- <div>📅 {{date}}</div>
365
- <div class="tags">{{tags}}</div>
366
- </header>
367
-
368
- <hr />
369
-
370
- <article class="content-body">{{content}}</article>
371
-
372
- <footer class="footer">
373
- <p>
374
- Generated by <strong>CZON</strong> •
375
- <a href="https://github.com/zccz14/CZON" target="_blank">View on GitHub</a>
376
- </p>
377
- </footer>
378
- </main>
379
-
380
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
381
- <script>
382
- hljs.highlightAll();
383
- </script>
384
- <!-- Mermaid initialization -->
385
- <script>
356
+
357
+
358
+ `,
359
+ } })),
360
+ react_1.default.createElement("body", null,
361
+ react_1.default.createElement("nav", { className: "sidebar" },
362
+ react_1.default.createElement(Navigator_1.Navigator, { ctx: props.ctx, file: props.file }),
363
+ react_1.default.createElement("hr", null),
364
+ react_1.default.createElement("div", null,
365
+ react_1.default.createElement(LanguageSwitcher_1.LanguageSwitcher, { ctx: props.ctx, lang: props.lang, file: props.file }))),
366
+ react_1.default.createElement("main", { className: "content" },
367
+ react_1.default.createElement("header", { className: "content-header" },
368
+ react_1.default.createElement("h2", null, props.file.metadata.title),
369
+ react_1.default.createElement("blockquote", null, props.file.metadata.summary),
370
+ react_1.default.createElement("div", null,
371
+ "\uD83D\uDCC5 ",
372
+ props.file.metadata.inferred_date || '--'),
373
+ react_1.default.createElement("div", { className: "tags" },
374
+ react_1.default.createElement(TagList_1.TagList, { tags: props.file.metadata.tags || [] }))),
375
+ react_1.default.createElement("hr", null),
376
+ react_1.default.createElement("article", { className: "content-body", dangerouslySetInnerHTML: { __html: props.content.body } }),
377
+ react_1.default.createElement("footer", { className: "footer" },
378
+ react_1.default.createElement("p", null,
379
+ "Generated by ",
380
+ react_1.default.createElement("strong", null, "CZON"),
381
+ " \u2022",
382
+ react_1.default.createElement("a", { href: "https://github.com/zccz14/CZON", target: "_blank" }, "View on GitHub")))),
383
+ react_1.default.createElement("script", { src: "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js" }),
384
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: 'hljs.highlightAll();' } }),
385
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: {
386
+ __html: `
387
+
386
388
  (function () {
387
389
  // Wait for page to fully load
388
390
  window.addEventListener('load', function () {
@@ -412,6 +414,11 @@
412
414
  }
413
415
  });
414
416
  })();
415
- </script>
416
- </body>
417
- </html>
417
+
418
+
419
+
420
+ `,
421
+ } }))));
422
+ };
423
+ exports.ContentPage = ContentPage;
424
+ //# sourceMappingURL=ContentPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentPage.js","sourceRoot":"","sources":["../../src/ssg/ContentPage.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,oEAAiE;AACjE,sDAAmD;AACnD,kDAA+C;AAExC,MAAM,WAAW,GAKnB,KAAK,CAAC,EAAE;IACX,OAAO,CACL,wCAAM,IAAI,EAAE,KAAK,CAAC,IAAI;QACpB;YACE,wCAAM,OAAO,EAAC,OAAO,GAAG;YACxB,wCAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,uCAAuC,GAAG;YACxE,6CAAQ,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,KAAK,CAAS;YAC3C,yCACE,uBAAuB,EAAE;oBACvB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA6RX;iBACE,GACM;YACT,wCACE,GAAG,EAAC,YAAY,EAChB,IAAI,EAAC,mFAAmF,GACxF;YACF,wCACE,GAAG,EAAC,YAAY,EAChB,IAAI,EAAC,8DAA8D,EACnE,SAAS,EAAC,yEAAyE,EACnF,WAAW,EAAC,WAAW,GACvB;YAEF,0CAAQ,GAAG,EAAC,iEAAiE,GAAU;YACvF,yCACE,uBAAuB,EAAE;oBACvB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAiDX;iBACE,GACM,CACJ;QACP;YACE,uCAAK,SAAS,EAAC,SAAS;gBACtB,8BAAC,qBAAS,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI;gBAC/C,yCAAM;gBACN;oBACE,8BAAC,mCAAgB,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,CACpE,CACF;YAEN,wCAAM,SAAS,EAAC,SAAS;gBACvB,0CAAQ,SAAS,EAAC,gBAAgB;oBAChC,0CAAK,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,KAAK,CAAM;oBACrC,kDAAa,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,OAAO,CAAc;oBACvD;;wBAAS,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,aAAa,IAAI,IAAI,CAAO;oBAC1D,uCAAK,SAAS,EAAC,MAAM;wBACnB,8BAAC,iBAAO,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,IAAI,IAAI,EAAE,GAAI,CAC9C,CACC;gBAET,yCAAM;gBAEN,2CACE,SAAS,EAAC,cAAc,EACxB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GACvD;gBAEF,0CAAQ,SAAS,EAAC,QAAQ;oBACxB;;wBACe,qDAAqB;;wBAClC,qCAAG,IAAI,EAAC,gCAAgC,EAAC,MAAM,EAAC,QAAQ,qBAEpD,CACF,CACG,CACJ;YAEP,0CAAQ,GAAG,EAAC,8EAA8E,GAAU;YACpG,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAI;YACvE,0CACE,uBAAuB,EAAE;oBACvB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAkCX;iBACE,GACO,CACL,CACF,CACR,CAAC;AACJ,CAAC,CAAC;AAjcW,QAAA,WAAW,eAictB"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare const RedirectPage: React.FC<{
3
+ from: string;
4
+ to: string;
5
+ }>;
6
+ //# sourceMappingURL=RedirectPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedirectPage.d.ts","sourceRoot":"","sources":["../../src/ssg/RedirectPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAmB/D,CAAC"}
@@ -0,0 +1,24 @@
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.RedirectPage = void 0;
7
+ const node_path_1 = require("node:path");
8
+ const react_1 = __importDefault(require("react"));
9
+ const RedirectPage = props => {
10
+ const toURL = (0, node_path_1.relative)((0, node_path_1.dirname)(props.from), props.to);
11
+ return (react_1.default.createElement("html", { lang: "en" },
12
+ react_1.default.createElement("head", null,
13
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
14
+ react_1.default.createElement("meta", { httpEquiv: "X-UA-Compatible", content: "IE=edge" }),
15
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
16
+ react_1.default.createElement("meta", { httpEquiv: "refresh", content: `0; url=${toURL}` }),
17
+ react_1.default.createElement("title", null, "Redirecting...")),
18
+ react_1.default.createElement("body", null,
19
+ react_1.default.createElement("p", null,
20
+ "Redirecting to ",
21
+ react_1.default.createElement("a", { href: toURL }, toURL)))));
22
+ };
23
+ exports.RedirectPage = RedirectPage;
24
+ //# sourceMappingURL=RedirectPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedirectPage.js","sourceRoot":"","sources":["../../src/ssg/RedirectPage.tsx"],"names":[],"mappings":";;;;;;AAAA,yCAA8C;AAC9C,kDAA0B;AAEnB,MAAM,YAAY,GAA2C,KAAK,CAAC,EAAE;IAC1E,MAAM,KAAK,GAAG,IAAA,oBAAQ,EAAC,IAAA,mBAAO,EAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CACL,wCAAM,IAAI,EAAC,IAAI;QACb;YACE,wCAAM,OAAO,EAAC,OAAO,GAAG;YACxB,wCAAM,SAAS,EAAC,iBAAiB,EAAC,OAAO,EAAC,SAAS,GAAG;YACtD,wCAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,uCAAuC,GAAG;YACxE,wCAAM,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,UAAU,KAAK,EAAE,GAAI;YACxD,8DAA6B,CACxB;QAEP;YACE;;gBACiB,qCAAG,IAAI,EAAE,KAAK,IAAG,KAAK,CAAK,CACxC,CACC,CACF,CACR,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,YAAY,gBAmBvB"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { IRenderContext } from '../types';
3
+ export declare const App: (props: IRenderContext) => React.JSX.Element;
4
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/ssg/app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,eAAO,MAAM,GAAG,GAAI,OAAO,cAAc,sBAsCxC,CAAC"}
@@ -0,0 +1,44 @@
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.App = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ContentPage_1 = require("./ContentPage");
9
+ const RedirectPage_1 = require("./RedirectPage");
10
+ const App = (props) => {
11
+ if (props.path === '/index.html') {
12
+ return react_1.default.createElement(RedirectPage_1.RedirectPage, { from: props.path, to: `/${props.site.options.langs[0]}/index.html` });
13
+ }
14
+ // 每个语言的首页
15
+ for (const lang of props.site.options.langs || []) {
16
+ if (props.path === `/${lang}/index.html`) {
17
+ return (react_1.default.createElement(RedirectPage_1.RedirectPage, { from: props.path, to: `/${lang}/${props.site.files[0].metadata.slug}.html` }));
18
+ // TODO: 渲染多语言首页列表
19
+ // return (
20
+ // <div>
21
+ // {props.site.files.map(file => (
22
+ // <div key={file.metadata?.slug}>
23
+ // <h2>{file.metadata?.title}</h2>
24
+ // <p>{file.metadata?.short_summary}</p>
25
+ // <a href={`${file.metadata?.slug}.html`}>阅读更多</a>
26
+ // </div>
27
+ // ))}
28
+ // </div>
29
+ // );
30
+ }
31
+ // 渲染文章页面
32
+ for (const file of props.site.files) {
33
+ if (props.path === `/${lang}/${file.metadata?.slug}.html`) {
34
+ const theContent = props.contents.find(c => c.lang === lang && c.hash === file.hash);
35
+ if (!theContent)
36
+ return react_1.default.createElement(RedirectPage_1.RedirectPage, { from: props.path, to: `/index.html` });
37
+ return react_1.default.createElement(ContentPage_1.ContentPage, { ctx: props, file: file, lang: lang, content: theContent });
38
+ }
39
+ }
40
+ }
41
+ return react_1.default.createElement(RedirectPage_1.RedirectPage, { from: props.path, to: `/index.html` });
42
+ };
43
+ exports.App = App;
44
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/ssg/app.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,+CAA4C;AAC5C,iDAA8C;AAEvC,MAAM,GAAG,GAAG,CAAC,KAAqB,EAAE,EAAE;IAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,OAAO,8BAAC,2BAAY,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,aAAa,GAAI,CAAC;IAC/F,CAAC;IAED,UAAU;IACV,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,aAAa,EAAE,CAAC;YACzC,OAAO,CACL,8BAAC,2BAAY,IACX,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,EAAE,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAS,CAAC,IAAI,OAAO,GACzD,CACH,CAAC;YACF,kBAAkB;YAClB,WAAW;YACX,UAAU;YACV,sCAAsC;YACtC,wCAAwC;YACxC,0CAA0C;YAC1C,gDAAgD;YAChD,2DAA2D;YAC3D,eAAe;YACf,UAAU;YACV,WAAW;YACX,KAAK;QACP,CAAC;QACD,SAAS;QACT,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrF,IAAI,CAAC,UAAU;oBAAE,OAAO,8BAAC,2BAAY,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,GAAI,CAAC;gBAC9E,OAAO,8BAAC,yBAAW,IAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAW,GAAI,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,8BAAC,2BAAY,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,GAAI,CAAC;AAC/D,CAAC,CAAC;AAtCW,QAAA,GAAG,OAsCd"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { IRenderContext } from '../../types';
3
+ export declare const LanguageSwitcher: React.FC<{
4
+ ctx: IRenderContext;
5
+ lang: string;
6
+ file: IRenderContext['site']['files'][0];
7
+ }>;
8
+ //# sourceMappingURL=LanguageSwitcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSwitcher.d.ts","sourceRoot":"","sources":["../../../src/ssg/components/LanguageSwitcher.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IACtC,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1C,CAmBA,CAAC"}
@@ -0,0 +1,21 @@
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.LanguageSwitcher = void 0;
7
+ const node_path_1 = require("node:path");
8
+ const react_1 = __importDefault(require("react"));
9
+ const languages_1 = require("../../languages");
10
+ const LanguageSwitcher = props => {
11
+ return (react_1.default.createElement("div", { className: "language-switcher" },
12
+ react_1.default.createElement("ul", { className: "lang-list" }, props.ctx.site.options.langs?.map(lang => {
13
+ const isActive = lang === props.lang;
14
+ const langName = languages_1.LANGUAGE_NAMES[lang] || lang;
15
+ const link = (0, node_path_1.join)('..', lang, `${props.file.metadata.slug}.html`);
16
+ return (react_1.default.createElement("li", { className: `lang-item ${isActive ? 'active' : ''}`, key: lang },
17
+ react_1.default.createElement("a", { href: link, className: "lang-link" }, langName)));
18
+ }))));
19
+ };
20
+ exports.LanguageSwitcher = LanguageSwitcher;
21
+ //# sourceMappingURL=LanguageSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSwitcher.js","sourceRoot":"","sources":["../../../src/ssg/components/LanguageSwitcher.tsx"],"names":[],"mappings":";;;;;;AAAA,yCAAiC;AACjC,kDAA0B;AAC1B,+CAAiD;AAG1C,MAAM,gBAAgB,GAIxB,KAAK,CAAC,EAAE;IACX,OAAO,CACL,uCAAK,SAAS,EAAC,mBAAmB;QAChC,sCAAI,SAAS,EAAC,WAAW,IACtB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM,QAAQ,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;YACrC,MAAM,QAAQ,GAAG,0BAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,IAAI,OAAO,CAAC,CAAC;YACnE,OAAO,CACL,sCAAI,SAAS,EAAE,aAAa,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI;gBAC/D,qCAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,WAAW,IACjC,QAAQ,CACP,CACD,CACN,CAAC;QACJ,CAAC,CAAC,CACC,CACD,CACP,CAAC;AACJ,CAAC,CAAC;AAvBW,QAAA,gBAAgB,oBAuB3B"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { IRenderContext } from '../../types';
3
+ export declare const Navigator: React.FC<{
4
+ ctx: IRenderContext;
5
+ file: IRenderContext['site']['files'][0];
6
+ }>;
7
+ //# sourceMappingURL=Navigator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navigator.d.ts","sourceRoot":"","sources":["../../../src/ssg/components/Navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IAC/B,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1C,CAiBA,CAAC"}
@@ -0,0 +1,17 @@
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.Navigator = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const Navigator = props => {
9
+ return (react_1.default.createElement("ul", { className: "nav-list" }, props.ctx.site.files.map(file => {
10
+ const link = file.metadata.slug + '.html';
11
+ const isActive = props.file.hash === file.hash;
12
+ return (react_1.default.createElement("li", { className: "nav-item", key: file.hash },
13
+ react_1.default.createElement("a", { href: link, className: `nav-link ${isActive ? 'active' : ''}` }, file.metadata.title)));
14
+ })));
15
+ };
16
+ exports.Navigator = Navigator;
17
+ //# sourceMappingURL=Navigator.js.map