zengen 0.2.6 → 0.3.1
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/.zen/meta.json +24 -7
- package/.zen/src/ar-SA/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ar-SA/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ar-SA/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/da-DK/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/da-DK/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/da-DK/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/de-DE/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/de-DE/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/de-DE/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/en-US/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/en-US/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/en-US/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/es-ES/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/es-ES/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/es-ES/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/es-MX/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/es-MX/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/es-MX/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/fi-FI/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/fi-FI/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/fi-FI/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/fr-FR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/fr-FR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/fr-FR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/hi-IN/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/hi-IN/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/hi-IN/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/id-ID/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/id-ID/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/id-ID/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/it-IT/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/it-IT/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/it-IT/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ja-JP/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ja-JP/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ja-JP/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ko-KR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ko-KR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ko-KR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/nl-NL/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/nl-NL/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/nl-NL/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/no-NO/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/no-NO/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/no-NO/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pl-PL/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pl-PL/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pl-PL/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pt-BR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pt-BR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pt-BR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pt-PT/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pt-PT/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pt-PT/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ru-RU/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ru-RU/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ru-RU/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/sv-SE/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/sv-SE/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/sv-SE/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/th-TH/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/th-TH/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/th-TH/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/tr-TR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/tr-TR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/tr-TR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/uk-UA/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/uk-UA/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/uk-UA/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/vi-VN/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/vi-VN/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/vi-VN/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/zh-Hans/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +123 -0
- package/.zen/src/zh-Hans/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +74 -0
- package/.zen/src/zh-Hans/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +75 -0
- package/.zen/src/zh-Hant/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +123 -0
- package/.zen/src/zh-Hant/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/zh-Hant/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/README.md +1 -2
- package/assets/templates/default/layout.html +82 -0
- package/dist/build/pipeline.d.ts.map +1 -1
- package/dist/build/pipeline.js +0 -1
- package/dist/build/pipeline.js.map +1 -1
- package/dist/cli.js +0 -2
- package/dist/cli.js.map +1 -1
- package/dist/process/template.d.ts.map +1 -1
- package/dist/process/template.js +3 -4
- package/dist/process/template.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -1
- package/dist/utils/convertMarkdownToHtml.js +75 -22
- package/dist/utils/convertMarkdownToHtml.js.map +1 -1
- package/docs/test-mermaid.md +105 -0
- package/package.json +2 -2
- package/src/build/pipeline.ts +0 -1
- package/src/cli.ts +0 -2
- package/src/process/template.ts +3 -9
- package/src/types.ts +0 -1
- package/src/utils/convertMarkdownToHtml.ts +80 -21
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zengen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "ZEN - A minimalist Markdown documentation site builder",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "npx rimraf dist && tsc",
|
|
12
12
|
"dev": "ts-node src/cli.ts",
|
|
13
|
-
"build:doc": "npm run build && node dist/cli.js build --
|
|
13
|
+
"build:doc": "npm run build && node dist/cli.js build --lang zh-Hans --lang en-US --lang ja-JP --lang ko-KR --lang es-ES --lang fr-FR --lang de-DE --lang ru-RU --lang pt-PT --lang it-IT --lang nl-NL --lang pl-PL --lang sv-SE --lang fi-FI --lang da-DK --lang no-NO --lang zh-Hant --lang hi-IN --lang ar-SA --lang th-TH --lang vi-VN --lang id-ID --lang pt-BR --lang es-MX --lang tr-TR --lang uk-UA --verbose",
|
|
14
14
|
"test": "npm run build && node --test dist/**/*.test.js",
|
|
15
15
|
"test:types": "tsc --noEmit",
|
|
16
16
|
"test:build": "npm run build && test -f dist/index.js && test -f dist/cli.js",
|
package/src/build/pipeline.ts
CHANGED
|
@@ -17,7 +17,6 @@ async function validateConfig(options: BuildOptions): Promise<void> {
|
|
|
17
17
|
|
|
18
18
|
if (verbose) {
|
|
19
19
|
console.log(`🚀 Starting ZEN build...`);
|
|
20
|
-
console.log(`🔗 Base URL: ${options.baseUrl || '(not set)'}`);
|
|
21
20
|
if (options.langs && options.langs.length > 0) {
|
|
22
21
|
console.log(`🌐 Target languages: ${options.langs.join(', ')}`);
|
|
23
22
|
}
|
package/src/cli.ts
CHANGED
|
@@ -22,7 +22,6 @@ class BuildCommand extends Command {
|
|
|
22
22
|
|
|
23
23
|
template = Option.String('-t,--template');
|
|
24
24
|
verbose = Option.Boolean('-v,--verbose');
|
|
25
|
-
baseUrl = Option.String('--base-url');
|
|
26
25
|
lang = Option.Array('--lang', {
|
|
27
26
|
description: 'Target languages for translation (e.g., en-US, ja-JP)',
|
|
28
27
|
});
|
|
@@ -44,7 +43,6 @@ class BuildCommand extends Command {
|
|
|
44
43
|
await buildSite({
|
|
45
44
|
template: this.template ? path.resolve(this.template) : undefined,
|
|
46
45
|
verbose: this.verbose,
|
|
47
|
-
baseUrl: this.baseUrl,
|
|
48
46
|
langs: this.lang,
|
|
49
47
|
});
|
|
50
48
|
|
package/src/process/template.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { parseFrontmatter } from '../utils/frontmatter';
|
|
|
15
15
|
*/
|
|
16
16
|
function generateLanguageSwitcher(templateData: TemplateData): string {
|
|
17
17
|
const {
|
|
18
|
-
options: { langs = []
|
|
18
|
+
options: { langs = [] },
|
|
19
19
|
} = MetaData;
|
|
20
20
|
|
|
21
21
|
const items = langs
|
|
@@ -50,10 +50,7 @@ const generateTagsHtml = (tags: string[]): string => {
|
|
|
50
50
|
* @returns 导航 HTML 字符串
|
|
51
51
|
*/
|
|
52
52
|
async function generateNavigationHtml(data: TemplateData): Promise<string> {
|
|
53
|
-
const {
|
|
54
|
-
files,
|
|
55
|
-
options: { baseUrl = '/' },
|
|
56
|
-
} = MetaData;
|
|
53
|
+
const { files } = MetaData;
|
|
57
54
|
|
|
58
55
|
const navigation = await Promise.all(
|
|
59
56
|
files.map(async file => {
|
|
@@ -161,10 +158,7 @@ async function renderTemplate(template: string, data: TemplateData): Promise<str
|
|
|
161
158
|
}
|
|
162
159
|
|
|
163
160
|
const renderRedirectTemplate = async (from: string, to: string): Promise<void> => {
|
|
164
|
-
const
|
|
165
|
-
options: { baseUrl = '/' },
|
|
166
|
-
} = MetaData;
|
|
167
|
-
const toURL = path.join(baseUrl, to);
|
|
161
|
+
const toURL = path.relative(path.dirname(from), to);
|
|
168
162
|
const html = `<!DOCTYPE html>
|
|
169
163
|
<html lang="en">
|
|
170
164
|
<head>
|
package/src/types.ts
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
1
|
import { marked } from 'marked';
|
|
2
2
|
import hljs from 'highlight.js';
|
|
3
3
|
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
return hljs.highlightAuto(code).value;
|
|
15
|
-
},
|
|
16
|
-
pedantic: false,
|
|
17
|
-
gfm: true,
|
|
18
|
-
breaks: false,
|
|
19
|
-
sanitize: false,
|
|
20
|
-
smartLists: true,
|
|
21
|
-
smartypants: false,
|
|
22
|
-
xhtml: false,
|
|
23
|
-
} as any);
|
|
4
|
+
// 辅助函数:转义 HTML 特殊字符
|
|
5
|
+
function escapeHtml(unsafe: string): string {
|
|
6
|
+
return unsafe
|
|
7
|
+
.replace(/&/g, '&')
|
|
8
|
+
.replace(/</g, '<')
|
|
9
|
+
.replace(/>/g, '>')
|
|
10
|
+
.replace(/"/g, '"')
|
|
11
|
+
.replace(/'/g, ''');
|
|
12
|
+
}
|
|
24
13
|
|
|
25
14
|
/**
|
|
26
15
|
* 将 Markdown 内容转换为 HTML
|
|
@@ -28,5 +17,75 @@ marked.setOptions({
|
|
|
28
17
|
* @returns 转换后的 HTML 字符串
|
|
29
18
|
*/
|
|
30
19
|
export const convertMarkdownToHtml = (mdContent: string): string => {
|
|
31
|
-
|
|
20
|
+
// 创建自定义渲染器
|
|
21
|
+
const renderer = new marked.Renderer();
|
|
22
|
+
const originalCodeRenderer = renderer.code;
|
|
23
|
+
|
|
24
|
+
// 重写代码块渲染器以支持 Mermaid - 使用 any 类型绕过类型检查
|
|
25
|
+
(renderer as any).code = function (code: any, language?: string, isEscaped?: boolean) {
|
|
26
|
+
// 在 marked 17+ 中,code 参数是一个对象,包含 text 和 lang 属性
|
|
27
|
+
const codeText = typeof code === 'string' ? code : code?.text || '';
|
|
28
|
+
// 语言信息在 code.lang 中,而不是 language 参数
|
|
29
|
+
const lang = code?.lang || language;
|
|
30
|
+
|
|
31
|
+
// 检测 Mermaid 代码块
|
|
32
|
+
if (lang === 'mermaid') {
|
|
33
|
+
// 生成唯一的 ID 用于图表容器
|
|
34
|
+
const chartId = 'mermaid-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
|
|
35
|
+
return `
|
|
36
|
+
<div class="mermaid-diagram" data-mermaid-id="${chartId}">
|
|
37
|
+
<pre class="mermaid">${escapeHtml(codeText)}</pre>
|
|
38
|
+
</div>
|
|
39
|
+
`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 其他代码块使用原有高亮逻辑
|
|
43
|
+
return (originalCodeRenderer as any).call(this, code, language, isEscaped);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// 使用 marked.parse 的同步版本
|
|
47
|
+
// marked 17+ 默认返回 Promise,但我们可以使用 marked.parseSync 或 marked.parse 的同步模式
|
|
48
|
+
// 这里我们使用 marked.parse 并假设它是同步的(对于简单情况)
|
|
49
|
+
try {
|
|
50
|
+
// 尝试同步解析
|
|
51
|
+
const result = marked.parse(mdContent, {
|
|
52
|
+
renderer,
|
|
53
|
+
highlight: function (code: string, lang: string) {
|
|
54
|
+
// 跳过 Mermaid 代码块的高亮
|
|
55
|
+
if (lang === 'mermaid') {
|
|
56
|
+
return code;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (lang && hljs.getLanguage(lang)) {
|
|
60
|
+
try {
|
|
61
|
+
return hljs.highlight(code, { language: lang }).value;
|
|
62
|
+
} catch (err) {
|
|
63
|
+
console.warn(`Failed to highlight code with language ${lang}:`, err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return hljs.highlightAuto(code).value;
|
|
67
|
+
},
|
|
68
|
+
pedantic: false,
|
|
69
|
+
gfm: true,
|
|
70
|
+
breaks: false,
|
|
71
|
+
sanitize: false,
|
|
72
|
+
smartLists: true,
|
|
73
|
+
smartypants: false,
|
|
74
|
+
xhtml: false,
|
|
75
|
+
async: false, // 强制同步模式
|
|
76
|
+
} as any);
|
|
77
|
+
|
|
78
|
+
// 如果结果是 Promise,等待它(虽然我们设置了 async: false)
|
|
79
|
+
if (result && typeof result.then === 'function') {
|
|
80
|
+
// 这不应该发生,但如果发生了,返回一个占位符
|
|
81
|
+
console.warn('marked.parse returned a Promise despite async: false');
|
|
82
|
+
return '<!-- Markdown conversion in progress -->';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return result as unknown as string;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error('Error converting Markdown to HTML:', error);
|
|
88
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
89
|
+
return `<div class="error">Error converting Markdown: ${errorMessage}</div>`;
|
|
90
|
+
}
|
|
32
91
|
};
|