czon 0.3.3 → 0.3.5

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 (124) hide show
  1. package/README.md +6 -0
  2. package/dist/ai/translateMarkdown.js +7 -12
  3. package/dist/cli.js +0 -1
  4. package/dist/process/category.js +17 -3
  5. package/dist/process/processTranslations.js +6 -1
  6. package/dist/services/openai.js +24 -3
  7. package/dist/ssg/ContentPage.js +1 -1
  8. package/dist/ssg/IndexPage.js +1 -1
  9. package/dist/ssg/components/CZONHeader.js +5 -3
  10. package/dist/ssg/components/LanguageSwitch.js +44 -0
  11. package/dist/ssg/style.js +134 -0
  12. package/package.json +1 -1
  13. package/dist/ai/extractMetadataFromMarkdown.d.ts +0 -7
  14. package/dist/ai/extractMetadataFromMarkdown.d.ts.map +0 -1
  15. package/dist/ai/extractMetadataFromMarkdown.js.map +0 -1
  16. package/dist/ai/translateMarkdown.d.ts +0 -8
  17. package/dist/ai/translateMarkdown.d.ts.map +0 -1
  18. package/dist/ai/translateMarkdown.js.map +0 -1
  19. package/dist/build/pipeline.d.ts +0 -6
  20. package/dist/build/pipeline.d.ts.map +0 -1
  21. package/dist/build/pipeline.js.map +0 -1
  22. package/dist/cli.d.ts +0 -3
  23. package/dist/cli.d.ts.map +0 -1
  24. package/dist/cli.js.map +0 -1
  25. package/dist/findEntries.d.ts +0 -10
  26. package/dist/findEntries.d.ts.map +0 -1
  27. package/dist/findEntries.js.map +0 -1
  28. package/dist/index.d.ts +0 -2
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/index.js.map +0 -1
  31. package/dist/languages.d.ts +0 -2
  32. package/dist/languages.d.ts.map +0 -1
  33. package/dist/languages.js.map +0 -1
  34. package/dist/metadata.d.ts +0 -14
  35. package/dist/metadata.d.ts.map +0 -1
  36. package/dist/metadata.js.map +0 -1
  37. package/dist/paths.d.ts +0 -7
  38. package/dist/paths.d.ts.map +0 -1
  39. package/dist/paths.js.map +0 -1
  40. package/dist/process/category.d.ts +0 -2
  41. package/dist/process/category.d.ts.map +0 -1
  42. package/dist/process/category.js.map +0 -1
  43. package/dist/process/enhanceMarkdownSource.d.ts +0 -5
  44. package/dist/process/enhanceMarkdownSource.d.ts.map +0 -1
  45. package/dist/process/enhanceMarkdownSource.js.map +0 -1
  46. package/dist/process/extractMetadataByAI.d.ts +0 -5
  47. package/dist/process/extractMetadataByAI.d.ts.map +0 -1
  48. package/dist/process/extractMetadataByAI.js.map +0 -1
  49. package/dist/process/processTranslations.d.ts +0 -5
  50. package/dist/process/processTranslations.d.ts.map +0 -1
  51. package/dist/process/processTranslations.js.map +0 -1
  52. package/dist/process/scanSourceFiles.d.ts +0 -5
  53. package/dist/process/scanSourceFiles.d.ts.map +0 -1
  54. package/dist/process/scanSourceFiles.js.map +0 -1
  55. package/dist/process/template.d.ts +0 -5
  56. package/dist/process/template.d.ts.map +0 -1
  57. package/dist/process/template.js.map +0 -1
  58. package/dist/services/openai.d.ts +0 -45
  59. package/dist/services/openai.d.ts.map +0 -1
  60. package/dist/services/openai.js.map +0 -1
  61. package/dist/ssg/ContentPage.d.ts +0 -9
  62. package/dist/ssg/ContentPage.d.ts.map +0 -1
  63. package/dist/ssg/ContentPage.js.map +0 -1
  64. package/dist/ssg/IndexPage.d.ts +0 -8
  65. package/dist/ssg/IndexPage.d.ts.map +0 -1
  66. package/dist/ssg/IndexPage.js.map +0 -1
  67. package/dist/ssg/RedirectPage.d.ts +0 -6
  68. package/dist/ssg/RedirectPage.d.ts.map +0 -1
  69. package/dist/ssg/RedirectPage.js.map +0 -1
  70. package/dist/ssg/RootPage.d.ts +0 -6
  71. package/dist/ssg/RootPage.d.ts.map +0 -1
  72. package/dist/ssg/RootPage.js.map +0 -1
  73. package/dist/ssg/app.d.ts +0 -4
  74. package/dist/ssg/app.d.ts.map +0 -1
  75. package/dist/ssg/app.js.map +0 -1
  76. package/dist/ssg/components/CZONFooter.d.ts +0 -3
  77. package/dist/ssg/components/CZONFooter.d.ts.map +0 -1
  78. package/dist/ssg/components/CZONFooter.js.map +0 -1
  79. package/dist/ssg/components/CZONHeader.d.ts +0 -6
  80. package/dist/ssg/components/CZONHeader.d.ts.map +0 -1
  81. package/dist/ssg/components/CZONHeader.js.map +0 -1
  82. package/dist/ssg/components/ContentMeta.d.ts +0 -10
  83. package/dist/ssg/components/ContentMeta.d.ts.map +0 -1
  84. package/dist/ssg/components/ContentMeta.js.map +0 -1
  85. package/dist/ssg/components/LanguageSwitcher.d.ts +0 -8
  86. package/dist/ssg/components/LanguageSwitcher.d.ts.map +0 -1
  87. package/dist/ssg/components/LanguageSwitcher.js.map +0 -1
  88. package/dist/ssg/components/Navigator.d.ts +0 -8
  89. package/dist/ssg/components/Navigator.d.ts.map +0 -1
  90. package/dist/ssg/components/Navigator.js.map +0 -1
  91. package/dist/ssg/components/TagList.d.ts +0 -5
  92. package/dist/ssg/components/TagList.d.ts.map +0 -1
  93. package/dist/ssg/components/TagList.js.map +0 -1
  94. package/dist/ssg/index.d.ts +0 -3
  95. package/dist/ssg/index.d.ts.map +0 -1
  96. package/dist/ssg/index.js.map +0 -1
  97. package/dist/ssg/layouts/PageLayout.d.ts +0 -8
  98. package/dist/ssg/layouts/PageLayout.d.ts.map +0 -1
  99. package/dist/ssg/layouts/PageLayout.js.map +0 -1
  100. package/dist/ssg/style.d.ts +0 -2
  101. package/dist/ssg/style.d.ts.map +0 -1
  102. package/dist/ssg/style.js.map +0 -1
  103. package/dist/types.d.ts +0 -73
  104. package/dist/types.d.ts.map +0 -1
  105. package/dist/types.js.map +0 -1
  106. package/dist/utils/convertMarkdownToHtml.d.ts +0 -7
  107. package/dist/utils/convertMarkdownToHtml.d.ts.map +0 -1
  108. package/dist/utils/convertMarkdownToHtml.js.map +0 -1
  109. package/dist/utils/frontmatter.d.ts +0 -6
  110. package/dist/utils/frontmatter.d.ts.map +0 -1
  111. package/dist/utils/frontmatter.js.map +0 -1
  112. package/dist/utils/sha256.d.ts +0 -3
  113. package/dist/utils/sha256.d.ts.map +0 -1
  114. package/dist/utils/sha256.js.map +0 -1
  115. package/dist/utils/sortBy.d.ts +0 -8
  116. package/dist/utils/sortBy.d.ts.map +0 -1
  117. package/dist/utils/sortBy.js.map +0 -1
  118. package/dist/utils/writeFile.d.ts +0 -8
  119. package/dist/utils/writeFile.d.ts.map +0 -1
  120. package/dist/utils/writeFile.js.map +0 -1
  121. package/dist/version.d.ts +0 -2
  122. package/dist/version.d.ts.map +0 -1
  123. package/dist/version.js.map +0 -1
  124. package/logo.png +0 -0
package/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  # CZON - AI-Native Markdown 内容引擎
4
4
 
5
+ - **C**: **C**ontent oriented | 内容为王,专注内容
6
+ - **Z**: **Z**ero Configuration | 零配置写作,减少打扰
7
+ - **O**: **O**rganic AI-Native | 有机的 AI 原生,深度集成 AI
8
+ - **N**: **N**-shape Energy Curve | N 型能量曲线,介入创作-分发-反馈的各个环节
9
+
5
10
  [> Website Demo](https://czon.zccz14.com/)
6
11
 
7
12
  AI 时代下,作为网站内容创作者,我们可以有更智能的内容创作引擎。
@@ -53,6 +58,7 @@ CZON 内置了一个 SSG 方案,可以将任意一个包含 Markdown 的 git
53
58
  export OPENAI_API_KEY="sk-xxxxxx" # 必须:请替换为您的 OpenAI API Key
54
59
  export OPENAI_BASE_URL="https://api.openai.com/v1" # 可选,默认使用 OpenAI 官方 API
55
60
  export OPENAI_MODEL="gpt-3.5-turbo" # 可选,默认使用 gpt-3.5-turbo 模型
61
+ export OPENAI_MAX_TOKENS="4096" # 可选,设置最大 token 数量限制 (忽略则使用模型的默认值,对于长文本翻译建议设置更高的值,例如 8192,具体取决于所使用的模型支持的最大 token 数量)
56
62
  ```
57
63
 
58
64
  构建站点,支持多语言翻译。使用当前目录作为源目录,输出到 `.czon/dist` 目录。
@@ -16,8 +16,8 @@ async function translateMarkdown(filePath, content, targetLang) {
16
16
  {
17
17
  role: 'system',
18
18
  content: [
19
- `You are a professional document translator.`,
20
- `Translate the following markdown content into ${lang}`,
19
+ `你是一名专业的翻译人员,精通多种语言之间的翻译。`,
20
+ `将以下 Markdown 内容翻译成 ${lang}`,
21
21
  targetLang === 'ja-JP'
22
22
  ? [
23
23
  //
@@ -39,10 +39,10 @@ async function translateMarkdown(filePath, content, targetLang) {
39
39
  '10. “験” - 使用“験”而非“驗”',
40
40
  ].join('\n')
41
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.`,
42
+ '保留原有的 Markdown 格式,包括标题、列表、代码块、链接和图片。',
43
+ '不要更改任何非文本元素或其格式。',
44
+ '确保技术术语和代码片段保持不变。',
45
+ '提供自然流畅的翻译,适合熟悉该主题的读者阅读。',
46
46
  ].join('\n'),
47
47
  },
48
48
  {
@@ -50,13 +50,8 @@ async function translateMarkdown(filePath, content, targetLang) {
50
50
  content: content,
51
51
  },
52
52
  ];
53
- const response = await (0, openai_1.completeMessages)(messages, {
53
+ return (0, openai_1.completeMessages)(messages, {
54
54
  task_id: `translate-markdown:${filePath}-${targetLang}`,
55
55
  });
56
- const translatedContent = response.choices[0]?.message?.content?.trim() || '';
57
- if (!translatedContent) {
58
- throw new Error('Empty translation response');
59
- }
60
- return translatedContent;
61
56
  }
62
57
  //# sourceMappingURL=translateMarkdown.js.map
package/dist/cli.js CHANGED
@@ -58,7 +58,6 @@ class BuildCommand extends clipanion_1.Command {
58
58
  verbose: this.verbose,
59
59
  langs: this.lang,
60
60
  });
61
- process.exit(0);
62
61
  return 0;
63
62
  }
64
63
  catch (error) {
@@ -3,6 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.processExtractCategory = void 0;
4
4
  const metadata_1 = require("../metadata");
5
5
  const openai_1 = require("../services/openai");
6
+ const formatFileForCategoryExtraction = (file) => {
7
+ return [
8
+ //
9
+ `Hash: ${file.hash}`,
10
+ `Path: ${file.path}`,
11
+ `Metadata: ${JSON.stringify(file.metadata)}`,
12
+ ].join('\n');
13
+ };
6
14
  const processExtractCategory = async () => {
7
15
  const verbose = metadata_1.MetaData.options.verbose;
8
16
  // 如果所有文件都已经有 category,则跳过本阶段
@@ -15,7 +23,6 @@ const processExtractCategory = async () => {
15
23
  // 这倒也合理,因为类别标签是整体相关的
16
24
  // 如果是内容改动导致的呢?
17
25
  const markdownFiles = metadata_1.MetaData.files.filter(f => f.path.endsWith('.md') && f.metadata);
18
- const markdownFilesWithoutCategory = markdownFiles.filter(f => !f.category);
19
26
  if (verbose) {
20
27
  console.info(`📂 Extracting categories for ${markdownFiles.length} markdown files...`);
21
28
  for (const file of markdownFiles) {
@@ -48,9 +55,16 @@ const processExtractCategory = async () => {
48
55
  `目前已有的标签有: `,
49
56
  JSON.stringify([...new Set(markdownFiles.map(f => f.category).filter(Boolean))]),
50
57
  `目前尚未分类的文件有:`,
51
- JSON.stringify(markdownFilesWithoutCategory),
58
+ markdownFiles
59
+ .filter(f => !f.category)
60
+ .map(f => formatFileForCategoryExtraction(f))
61
+ .join('\n\n'),
62
+ '',
52
63
  `已经分类的文件有:`,
53
- JSON.stringify(markdownFiles.filter(f => f.category)),
64
+ markdownFiles
65
+ .filter(f => f.category)
66
+ .map(f => formatFileForCategoryExtraction(f))
67
+ .join('\n\n'),
54
68
  ].join('\n'),
55
69
  },
56
70
  ], { response_format: { type: 'json_object' }, task_id: 'extract-categories' });
@@ -23,6 +23,7 @@ async function processTranslations() {
23
23
  return;
24
24
  }
25
25
  return Promise.all(langs.map(async (lang) => {
26
+ var _a;
26
27
  if (verbose)
27
28
  console.info(`📄 Processing file for translation: ${file.path}`);
28
29
  if (!file.metadata) {
@@ -48,7 +49,11 @@ async function processTranslations() {
48
49
  console.info(`ℹ️ Content unchanged for ${file.path}, skipping translation.`);
49
50
  return;
50
51
  }
51
- const translatedContent = await (0, translateMarkdown_1.translateMarkdown)(sourcePath, content, lang);
52
+ const translatedResponse = await (0, translateMarkdown_1.translateMarkdown)(sourcePath, content, lang);
53
+ const translatedContent = translatedResponse.choices?.[0].message.content?.trim() || '';
54
+ const translationMeta = ((_a = (file.translations ?? (file.translations = {})))[lang] ?? (_a[lang] = {}));
55
+ translationMeta.content_length = translatedContent.length; // 记录翻译后内容长度
56
+ translationMeta.token_used = translatedResponse.usage; // 记录 token 使用情况
52
57
  await (0, writeFile_1.writeFile)(targetPath, translatedContent);
53
58
  // 存储已增强内容的哈希值
54
59
  file.nativeMarkdownHash = hash;
@@ -5,7 +5,7 @@ const metadata_1 = require("../metadata");
5
5
  const startTime = Date.now();
6
6
  let totalContentGenerated = 0;
7
7
  const processingTaskIds = new Set();
8
- setInterval(() => {
8
+ const printReport = () => {
9
9
  const speed = (totalContentGenerated / ((Date.now() - startTime) / 1000)).toFixed(2);
10
10
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
11
11
  console.error(`⏳ AI Processing output speed=${speed} total=${totalContentGenerated} elapsed=${elapsed} s tasks=${processingTaskIds.size}`);
@@ -16,7 +16,20 @@ setInterval(() => {
16
16
  break;
17
17
  console.error(` - processing task: ${id}`);
18
18
  }
19
- }, 1000);
19
+ };
20
+ let isReporting = false;
21
+ const setupReport = async () => {
22
+ if (isReporting)
23
+ return;
24
+ isReporting = true;
25
+ while (processingTaskIds.size > 0) {
26
+ try {
27
+ printReport();
28
+ }
29
+ catch (e) { }
30
+ await new Promise(resolve => setTimeout(resolve, 1000));
31
+ }
32
+ };
20
33
  /**
21
34
  * 使用 OpenAI API 补全消息
22
35
  * @param messages 消息数组
@@ -26,11 +39,13 @@ setInterval(() => {
26
39
  const completeMessages = async (messages, options) => {
27
40
  if (options?.task_id) {
28
41
  processingTaskIds.add(options.task_id);
42
+ setupReport();
29
43
  }
30
44
  // 从环境变量读取配置
31
45
  const apiKey = process.env.OPENAI_API_KEY || '';
32
46
  const baseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
33
47
  const model = process.env.OPENAI_MODEL || 'gpt-3.5-turbo';
48
+ const max_tokens = process.env.OPENAI_MAX_TOKENS ? +process.env.OPENAI_MAX_TOKENS : undefined; // 不填就使用模型默认值
34
49
  if (!apiKey) {
35
50
  throw new Error('OPENAI_API_KEY environment variable is not set');
36
51
  }
@@ -45,12 +60,18 @@ const completeMessages = async (messages, options) => {
45
60
  messages,
46
61
  temperature: 0, // 总是设置为 0,提取内容不需要随机性
47
62
  stream: true, // 启用流式响应
48
- // 不设置 max_tokens,让API自动决定
63
+ max_tokens, // 可选的最大 token 数量
49
64
  };
50
65
  // 添加可选的response_format
51
66
  if (options?.response_format) {
52
67
  requestBody.response_format = options.response_format;
53
68
  }
69
+ // 打印请求信息 (for debug)
70
+ // if (MetaData.options.verbose) {
71
+ // for (const msg of messages) {
72
+ // console.info(`💬 [${msg.role}] ${msg.content}`);
73
+ // }
74
+ // }
54
75
  const response = await fetch(`${baseUrl}/chat/completions`, {
55
76
  method: 'POST',
56
77
  headers: {
@@ -29,7 +29,7 @@ const ContentPage = props => {
29
29
  react_1.default.createElement("script", { src: "https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4", defer: true }),
30
30
  react_1.default.createElement("style", null, style_1.style)),
31
31
  react_1.default.createElement("body", null,
32
- react_1.default.createElement(PageLayout_1.PageLayout, { header: react_1.default.createElement(CZONHeader_1.CZONHeader, { ctx: props.ctx }), navigator: react_1.default.createElement("nav", { className: "sidebar" },
32
+ react_1.default.createElement(PageLayout_1.PageLayout, { header: react_1.default.createElement(CZONHeader_1.CZONHeader, { ctx: props.ctx, lang: props.lang, file: props.file }), navigator: react_1.default.createElement("nav", { className: "sidebar" },
33
33
  react_1.default.createElement(Navigator_1.Navigator, { ctx: props.ctx, file: props.file, lang: props.lang })), main: react_1.default.createElement("main", { className: "content" },
34
34
  react_1.default.createElement(ContentMeta_1.ContentMeta, { ctx: props.ctx, file: props.file, lang: props.lang }),
35
35
  react_1.default.createElement("div", { className: "content-body" },
@@ -30,7 +30,7 @@ const IndexPage = props => {
30
30
  react_1.default.createElement("meta", { name: "description", content: `Index page for language ${props.lang}` }),
31
31
  react_1.default.createElement("style", null, style_1.style)),
32
32
  react_1.default.createElement("body", null,
33
- react_1.default.createElement(PageLayout_1.PageLayout, { header: react_1.default.createElement(CZONHeader_1.CZONHeader, { ctx: props.ctx }), navigator: undefined, main: react_1.default.createElement("div", { className: "p-6 max-w-3xl mx-auto" },
33
+ react_1.default.createElement(PageLayout_1.PageLayout, { header: react_1.default.createElement(CZONHeader_1.CZONHeader, { ctx: props.ctx, lang: props.lang }), navigator: undefined, main: react_1.default.createElement("div", { className: "p-6 max-w-3xl mx-auto" },
34
34
  react_1.default.createElement("div", null,
35
35
  react_1.default.createElement("span", { className: "font-bold" }),
36
36
  react_1.default.createElement("div", { className: "mb-6 gap-6 flex flex-wrap" }, allCategories.map(category => {
@@ -5,10 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CZONHeader = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
+ const LanguageSwitch_1 = require("./LanguageSwitch");
8
9
  const CZONHeader = props => {
9
- return (react_1.default.createElement("header", { className: "czon-header py-4 border-b" },
10
- react_1.default.createElement("h1", { className: "text-2xl font-bold px-6" },
11
- react_1.default.createElement("a", { href: "index.html" }, "CZON"))));
10
+ return (react_1.default.createElement("header", { className: "czon-header py-4 border-b flex justify-between items-center px-6" },
11
+ react_1.default.createElement("h1", { className: "text-2xl font-bold" },
12
+ react_1.default.createElement("a", { href: "index.html" }, "CZON")),
13
+ props.lang && (react_1.default.createElement(LanguageSwitch_1.LanguageSwitch, { ctx: props.ctx, lang: props.lang, file: props.file }))));
12
14
  };
13
15
  exports.CZONHeader = CZONHeader;
14
16
  //# sourceMappingURL=CZONHeader.js.map
@@ -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.LanguageSwitch = 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 LanguageSwitch = props => {
11
+ // 获取当前语言名称
12
+ const currentLangName = languages_1.LANGUAGE_NAMES[props.lang] || props.lang;
13
+ // 获取所有支持的语言
14
+ const languages = props.ctx.site.options.langs || [];
15
+ // 生成语言链接(纯静态,无状态)
16
+ const getLanguageLink = (lang) => {
17
+ const target = props.file ? `${props.file.metadata.slug}.html` : 'index.html';
18
+ return (0, node_path_1.join)('..', lang, target);
19
+ };
20
+ return (react_1.default.createElement("div", { className: "language-switch-container relative inline-block" },
21
+ react_1.default.createElement("button", { type: "button", className: "language-switch-trigger px-4 py-2 border border-gray-300 rounded-md flex items-center gap-2 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors", "aria-label": `Language switcher. Current language: ${currentLangName}`, "aria-haspopup": "true", "aria-expanded": "false", "aria-controls": "language-dropdown" },
22
+ react_1.default.createElement("span", { className: "text-sm font-medium" }, currentLangName),
23
+ react_1.default.createElement("svg", { className: "language-switch-icon w-4 h-4 transition-transform", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true" },
24
+ react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))),
25
+ react_1.default.createElement("div", { id: "language-dropdown", className: "language-switch-dropdown absolute top-full mt-1 w-96 md:w-2xl lg:w-3xl max-h-96 overflow-y-auto bg-white border border-gray-300 rounded-md shadow-lg z-50", role: "menu", "aria-label": "Available languages" },
26
+ react_1.default.createElement("div", { className: "p-4" },
27
+ react_1.default.createElement("div", { className: "language-switch-grid grid grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-2" }, languages.map(lang => {
28
+ const langName = languages_1.LANGUAGE_NAMES[lang] || lang;
29
+ const isActive = lang === props.lang;
30
+ return (react_1.default.createElement("a", { key: lang, href: getLanguageLink(lang), className: `
31
+ language-switch-option block px-3 py-2 rounded text-sm text-center
32
+ ${isActive
33
+ ? 'bg-blue-100 text-blue-700 font-semibold'
34
+ : 'text-gray-700 hover:bg-gray-100'}
35
+ transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500
36
+ `, role: "menuitem", "aria-current": isActive ? 'page' : undefined, lang: lang }, langName));
37
+ })),
38
+ react_1.default.createElement("div", { className: "language-switch-info mt-3 pt-3 border-t border-gray-200" },
39
+ react_1.default.createElement("p", { className: "language-switch-count text-xs text-gray-500 text-center" },
40
+ languages.length,
41
+ " languages available"))))));
42
+ };
43
+ exports.LanguageSwitch = LanguageSwitch;
44
+ //# sourceMappingURL=LanguageSwitch.js.map
package/dist/ssg/style.js CHANGED
@@ -300,5 +300,139 @@ exports.style = `
300
300
  display: block;
301
301
  margin: 0 auto;
302
302
  }
303
+
304
+ /* LanguageSwitch dropdown styles - Pure CSS version */
305
+ .language-switch-container {
306
+ position: relative;
307
+ display: inline-block;
308
+ }
309
+
310
+ .language-switch-trigger {
311
+ transition: all 0.2s ease;
312
+ }
313
+
314
+ .language-switch-trigger:hover {
315
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
316
+ }
317
+
318
+ .language-switch-trigger:focus {
319
+ outline: 2px solid #3b82f6;
320
+ outline-offset: 2px;
321
+ }
322
+
323
+ .language-switch-icon {
324
+ transition: transform 0.2s ease;
325
+ }
326
+
327
+ .language-switch-option {
328
+ transition: all 0.15s ease;
329
+ }
330
+
331
+ .language-switch-option:hover {
332
+ transform: translateY(-1px);
333
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
334
+ }
335
+
336
+ .language-switch-option:focus {
337
+ outline: 2px solid #3b82f6;
338
+ outline-offset: 2px;
339
+ }
340
+
341
+ /* Pure CSS dropdown using :focus-within */
342
+ .language-switch-dropdown {
343
+ opacity: 0;
344
+ visibility: hidden;
345
+ transform: translateY(-10px);
346
+ transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease;
347
+ }
348
+
349
+ .language-switch-container:focus-within .language-switch-dropdown {
350
+ opacity: 1;
351
+ visibility: visible;
352
+ transform: translateY(0);
353
+ }
354
+
355
+ .language-switch-container:focus-within .language-switch-icon {
356
+ transform: rotate(180deg);
357
+ }
358
+
359
+ /* Ensure dropdown stays visible when focusing inside it */
360
+ .language-switch-dropdown:focus-within {
361
+ opacity: 1;
362
+ visibility: visible;
363
+ transform: translateY(0);
364
+ }
365
+
366
+ .language-switch-dropdown {
367
+ max-width: 80vw;
368
+ inset-inline-start: auto;
369
+ inset-inline-end: 0;
370
+ margin-inline-start: 0;
371
+ margin-inline-end: 0;
372
+ }
373
+
374
+
375
+ /* Mobile responsiveness for language dropdown */
376
+ @media (max-width: 768px) {
377
+ .language-switch-trigger {
378
+ padding: 0.5rem 0.75rem;
379
+ font-size: 0.875rem;
380
+ }
381
+
382
+
383
+ .language-switch-option {
384
+ padding: 0.5rem 0.75rem;
385
+ font-size: 0.8125rem;
386
+ }
387
+
388
+ .language-switch-grid {
389
+ grid-template-columns: repeat(2, 1fr);
390
+ }
391
+ }
392
+
393
+ @media (max-width: 480px) {
394
+ .language-switch-grid {
395
+ grid-template-columns: 1fr;
396
+ }
397
+ }
398
+
399
+ /* Scrollbar styling for dropdown */
400
+ .language-switch-dropdown::-webkit-scrollbar {
401
+ width: 8px;
402
+ }
403
+
404
+ .language-switch-dropdown::-webkit-scrollbar-track {
405
+ background: #f1f1f1;
406
+ border-radius: 4px;
407
+ }
408
+
409
+ .language-switch-dropdown::-webkit-scrollbar-thumb {
410
+ background: #c1c1c1;
411
+ border-radius: 4px;
412
+ }
413
+
414
+ .language-switch-dropdown::-webkit-scrollbar-thumb:hover {
415
+ background: #a8a8a8;
416
+ }
417
+
418
+ /* Browser compatibility fallback for :focus-within */
419
+ @supports not selector(:focus-within) {
420
+ .language-switch-dropdown {
421
+ display: none;
422
+ }
423
+
424
+ .language-switch-container:hover .language-switch-dropdown,
425
+ .language-switch-container:focus .language-switch-dropdown {
426
+ display: block;
427
+ opacity: 1;
428
+ visibility: visible;
429
+ transform: translateY(0);
430
+ }
431
+
432
+ .language-switch-container:hover .language-switch-icon,
433
+ .language-switch-container:focus .language-switch-icon {
434
+ transform: rotate(180deg);
435
+ }
436
+ }
303
437
  `;
304
438
  //# sourceMappingURL=style.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "czon",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "CZone - AI enhanced Markdown content engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,7 +0,0 @@
1
- import { AIMetadata } from '../types';
2
- /**
3
- * 从 markdown 内容中提取 metadata
4
- * @returns Promise<AIMetadata> 提取的元数据,失败时抛出错误
5
- */
6
- export declare function extractMetadataFromMarkdown(filePath: string, content: string): Promise<AIMetadata>;
7
- //# sourceMappingURL=extractMetadataFromMarkdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractMetadataFromMarkdown.d.ts","sourceRoot":"","sources":["../../src/ai/extractMetadataFromMarkdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CA6BrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractMetadataFromMarkdown.js","sourceRoot":"","sources":["../../src/ai/extractMetadataFromMarkdown.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
-
3
- * @param content Markdown 内容
4
- * @param targetLang 目标语言代码(例如:zh-Hans, en-US)
5
- * @returns Promise<string> 翻译后的 Markdown 内容
6
- */
7
- export declare function translateMarkdown(filePath: string, content: string, targetLang: string): Promise<string>;
8
- //# sourceMappingURL=translateMarkdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translateMarkdown.d.ts","sourceRoot":"","sources":["../../src/ai/translateMarkdown.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAoDjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"translateMarkdown.js","sourceRoot":"","sources":["../../src/ai/translateMarkdown.ts"],"names":[],"mappings":";;AASA,8CAwDC;AAjED,4CAA8C;AAC9C,+CAAqE;AAErE;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAAe,EACf,UAAkB;IAElB,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,EAAE;QAChD,OAAO,EAAE,sBAAsB,QAAQ,IAAI,UAAU,EAAE;KACxD,CAAC,CAAC;IACH,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"}
@@ -1,6 +0,0 @@
1
- import { BuildOptions } from '../types';
2
- /**
3
- * 主构建函数
4
- */
5
- export declare function buildSite(options: BuildOptions): Promise<void>;
6
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAmExC;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/build/pipeline.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAiD;AACjD,mCAAgC;AAChC,2CAA6B;AAC7B,+CAA6C;AAC7C,uCAAyC;AAEzC,mBAAmB;AACnB,IAAA,eAAM,GAAE,CAAC;AAET,WAAW;AACX,MAAM,YAAa,SAAQ,mBAAO;IAAlC;;QAGE,aAAQ,GAAG,kBAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1C,YAAO,GAAG,kBAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,SAAI,GAAG,kBAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5B,WAAW,EAAE,uDAAuD;SACrE,CAAC,CAAC;IA8BL,CAAC;IAhBC,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,IAAA,oBAAS,EAAC;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBACjE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,IAAI;aACjB,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEhB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;;AAnCM,kBAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,AAAd,CAAe;AAQpB,kBAAK,GAAG,mBAAO,CAAC,KAAK,CAAC;IAC3B,WAAW,EAAE,mEAAmE;IAChF,OAAO,EAAE;;;;;;;KAOR;CACF,CAAC,AAVU,CAUT;AAoBL,YAAY;AACZ,MAAM,GAAG,GAAG,IAAI,eAAG,CAAC;IAClB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,yDAAyD;IACtE,aAAa,EAAE,sBAAY;CAC5B,CAAC,CAAC;AAEH,OAAO;AACP,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAE3B,SAAS;AACT,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACjC,GAAG,eAAG,CAAC,cAAc;IACrB,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * 使用git命令查找所有Markdown文件
3
- * 使用git ls-files --others --cached --exclude-standard获取所有文件
4
- * 然后过滤掉.czon目录和只保留.md文件
5
- *
6
- * @param dirPath 要扫描的目录路径
7
- * @returns Promise<string[]> 返回Markdown文件的相对路径数组
8
- */
9
- export declare const findMarkdownEntries: (dirPath: string) => Promise<string[]>;
10
- //# sourceMappingURL=findEntries.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"findEntries.d.ts","sourceRoot":"","sources":["../src/findEntries.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAwB3E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"findEntries.js","sourceRoot":"","sources":["../src/findEntries.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC;;;;;;;GAOG;AACI,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAe,EAAqB,EAAE;IAC9E,IAAI,CAAC;QACH,8BAA8B;QAC9B,iBAAiB;QACjB,+CAA+C;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,sDAAsD,EAAE;YACzF,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QAEH,UAAU;QACV,MAAM,KAAK,GAAG,MAAM;aACjB,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY;aACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO;aAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB;aAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW;QAEpD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QAExD,kBAAkB;QAClB,yBAAyB;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAxBW,QAAA,mBAAmB,uBAwB9B"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import './cli';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,iBAAe"}
@@ -1,2 +0,0 @@
1
- export declare const LANGUAGE_NAMES: Record<string, string>;
2
- //# sourceMappingURL=languages.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoCjD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"languages.js","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAA2B;IACpD,OAAO;IACP,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAElB,cAAc;IACd,OAAO,EAAE,WAAW;IAEpB,SAAS;IACT,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAEhB,SAAS;IACT,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,kBAAkB;IAE3B,SAAS;IACT,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,YAAY;CACtB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { MetaDataStore } from './types';
2
- /**
3
- * 全局 MetaDataStore 单例
4
- */
5
- export declare const MetaData: MetaDataStore;
6
- /**
7
- * 从文件中读取数据,覆盖 store,但是要保持它仍然是同一个对象
8
- */
9
- export declare function loadMetaData(): Promise<void>;
10
- /**
11
- * 将 MetaData 写入 store
12
- */
13
- export declare function saveMetaData(): Promise<void>;
14
- //# sourceMappingURL=metadata.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,aAKtB,CAAC;AAEF;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAalD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,oCAaC;AAKD,oCAGC;AAvCD,gDAAkC;AAClC,2CAA6B;AAC7B,mCAAyC;AAGzC;;GAEG;AACU,QAAA,QAAQ,GAAkB;IACrC,OAAO;IACP,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;CACV,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,sBAAc,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAc,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpC,6BAA6B;QAC7B,MAAM,CAAC,MAAM,CAAC,gBAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB;QACjB,gBAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,gBAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,CAAC,SAAS,CAAC,sBAAc,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC"}
package/dist/paths.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export declare const INPUT_DIR: string;
2
- export declare const CZON_DIR: string;
3
- export declare const CZON_DIST_DIR: string;
4
- export declare const CZON_DIST_RAW_CONTENT_DIR: string;
5
- export declare const CZON_SRC_DIR: string;
6
- export declare const CZON_META_PATH: string;
7
- //# sourceMappingURL=paths.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,aAAa,QAAyB,CAAC;AACpD,eAAO,MAAM,yBAAyB,QAAiC,CAAC;AACxE,eAAO,MAAM,YAAY,QAAwB,CAAC;AAClD,eAAO,MAAM,cAAc,QAA8B,CAAC"}
package/dist/paths.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAEf,QAAA,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC1B,QAAA,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AACxC,QAAA,aAAa,GAAG,IAAA,WAAI,EAAC,gBAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,QAAA,yBAAyB,GAAG,IAAA,WAAI,EAAC,qBAAa,EAAE,SAAS,CAAC,CAAC;AAC3D,QAAA,YAAY,GAAG,IAAA,WAAI,EAAC,gBAAQ,EAAE,KAAK,CAAC,CAAC;AACrC,QAAA,cAAc,GAAG,IAAA,WAAI,EAAC,gBAAQ,EAAE,WAAW,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const processExtractCategory: () => Promise<void>;
2
- //# sourceMappingURL=category.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"category.d.ts","sourceRoot":"","sources":["../../src/process/category.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,IAAI,CAyE3D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"category.js","sourceRoot":"","sources":["../../src/process/category.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * 存储母语文件到 .czon/src
3
- */
4
- export declare function storeNativeFiles(): Promise<void>;
5
- //# sourceMappingURL=enhanceMarkdownSource.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enhanceMarkdownSource.d.ts","sourceRoot":"","sources":["../../src/process/enhanceMarkdownSource.ts"],"names":[],"mappings":"AA+BA;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCtD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"enhanceMarkdownSource.js","sourceRoot":"","sources":["../../src/process/enhanceMarkdownSource.ts"],"names":[],"mappings":"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"}