zengen 0.1.33 → 0.1.34
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/ci.yml +1 -1
- package/.github/workflows/pages.yml +1 -1
- package/.github/workflows/publish.yml +1 -1
- package/.github/workflows/version.yml +1 -1
- package/dist/gitignore.test.d.ts +2 -0
- package/dist/gitignore.test.d.ts.map +1 -0
- package/dist/gitignore.test.js +244 -0
- package/dist/gitignore.test.js.map +1 -0
- package/dist/markdown.d.ts +0 -4
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +4 -26
- package/dist/markdown.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +6 -6
- package/dist/navigation.js.map +1 -1
- package/dist/template.d.ts.map +1 -1
- package/dist/template.js +4 -26
- package/dist/template.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/gitignore.test.ts +253 -0
- package/src/markdown.ts +4 -31
- package/src/navigation.ts +7 -7
- package/src/template.ts +4 -29
- package/src/types.ts +2 -2
package/.github/workflows/ci.yml
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.test.d.ts","sourceRoot":"","sources":["../src/gitignore.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_test_1 = require("node:test");
|
|
40
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
41
|
+
const fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const gitignore_js_1 = require("./gitignore.js");
|
|
44
|
+
(0, node_test_1.describe)('GitIgnoreProcessor', () => {
|
|
45
|
+
let testDir;
|
|
46
|
+
let gitignorePath;
|
|
47
|
+
(0, node_test_1.beforeEach)(async () => {
|
|
48
|
+
// 创建临时测试目录
|
|
49
|
+
testDir = path.join(__dirname, 'test-temp');
|
|
50
|
+
gitignorePath = path.join(testDir, '.gitignore');
|
|
51
|
+
try {
|
|
52
|
+
await fs.mkdir(testDir, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// 目录可能已存在
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
(0, node_test_1.afterEach)(async () => {
|
|
59
|
+
// 清理测试目录
|
|
60
|
+
try {
|
|
61
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// 忽略清理错误
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.describe)('constructor', () => {
|
|
68
|
+
(0, node_test_1.it)('应该正确设置baseDir', () => {
|
|
69
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor('/test/dir');
|
|
70
|
+
node_assert_1.default.strictEqual(processor['baseDir'], '/test/dir');
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.it)('应该初始化空模式数组', () => {
|
|
73
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor('/test/dir');
|
|
74
|
+
const patterns = processor.getPatterns();
|
|
75
|
+
node_assert_1.default.deepStrictEqual(patterns, []);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
(0, node_test_1.describe)('loadFromFile', () => {
|
|
79
|
+
(0, node_test_1.it)('应该从.gitignore文件加载模式', async () => {
|
|
80
|
+
const gitignoreContent = `
|
|
81
|
+
# 注释行
|
|
82
|
+
node_modules/
|
|
83
|
+
*.log
|
|
84
|
+
dist/
|
|
85
|
+
.DS_Store
|
|
86
|
+
`;
|
|
87
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
88
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
89
|
+
await processor.loadFromFile('.gitignore');
|
|
90
|
+
const patterns = processor.getPatterns();
|
|
91
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '*.log', '**/dist', '**/.DS_Store']);
|
|
92
|
+
});
|
|
93
|
+
(0, node_test_1.it)('当.gitignore文件不存在时应该使用空模式', async () => {
|
|
94
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
95
|
+
await processor.loadFromFile('non-existent-file');
|
|
96
|
+
const patterns = processor.getPatterns();
|
|
97
|
+
node_assert_1.default.deepStrictEqual(patterns, []);
|
|
98
|
+
});
|
|
99
|
+
(0, node_test_1.it)('应该跳过空行和注释', async () => {
|
|
100
|
+
const gitignoreContent = `
|
|
101
|
+
# 这是一个注释
|
|
102
|
+
|
|
103
|
+
node_modules/
|
|
104
|
+
|
|
105
|
+
# 另一个注释
|
|
106
|
+
*.log
|
|
107
|
+
`;
|
|
108
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
109
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
110
|
+
await processor.loadFromFile('.gitignore');
|
|
111
|
+
const patterns = processor.getPatterns();
|
|
112
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
113
|
+
});
|
|
114
|
+
(0, node_test_1.it)('应该跳过否定模式', async () => {
|
|
115
|
+
const gitignoreContent = `
|
|
116
|
+
node_modules/
|
|
117
|
+
!node_modules/special/
|
|
118
|
+
*.log
|
|
119
|
+
`;
|
|
120
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
121
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
122
|
+
await processor.loadFromFile('.gitignore');
|
|
123
|
+
const patterns = processor.getPatterns();
|
|
124
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
(0, node_test_1.describe)('parsePatterns', () => {
|
|
128
|
+
(0, node_test_1.it)('应该正确处理目录模式', () => {
|
|
129
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
130
|
+
const content = `
|
|
131
|
+
node_modules/
|
|
132
|
+
dist/
|
|
133
|
+
`;
|
|
134
|
+
processor['parsePatterns'](content);
|
|
135
|
+
const patterns = processor.getPatterns();
|
|
136
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '**/dist']);
|
|
137
|
+
});
|
|
138
|
+
(0, node_test_1.it)('应该正确处理文件扩展名模式', () => {
|
|
139
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
140
|
+
const content = `
|
|
141
|
+
*.log
|
|
142
|
+
*.tmp
|
|
143
|
+
`;
|
|
144
|
+
processor['parsePatterns'](content);
|
|
145
|
+
const patterns = processor.getPatterns();
|
|
146
|
+
node_assert_1.default.deepStrictEqual(patterns, ['*.log', '*.tmp']);
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.it)('应该处理以/开头的模式', () => {
|
|
149
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
150
|
+
const content = `
|
|
151
|
+
/node_modules
|
|
152
|
+
/dist
|
|
153
|
+
`;
|
|
154
|
+
processor['parsePatterns'](content);
|
|
155
|
+
const patterns = processor.getPatterns();
|
|
156
|
+
node_assert_1.default.deepStrictEqual(patterns, ['node_modules', 'dist']);
|
|
157
|
+
});
|
|
158
|
+
(0, node_test_1.it)('应该处理包含通配符的模式', () => {
|
|
159
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
160
|
+
const content = `
|
|
161
|
+
**/node_modules
|
|
162
|
+
**/.vscode
|
|
163
|
+
`;
|
|
164
|
+
processor['parsePatterns'](content);
|
|
165
|
+
const patterns = processor.getPatterns();
|
|
166
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '**/.vscode']);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
(0, node_test_1.describe)('shouldIgnore', () => {
|
|
170
|
+
let processor;
|
|
171
|
+
(0, node_test_1.beforeEach)(() => {
|
|
172
|
+
processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
173
|
+
});
|
|
174
|
+
(0, node_test_1.it)('应该忽略匹配的文件', () => {
|
|
175
|
+
processor.addPattern('**/*.log');
|
|
176
|
+
processor.addPattern('**/node_modules');
|
|
177
|
+
const logFile = path.join(testDir, 'app.log');
|
|
178
|
+
const nodeModulesFile = path.join(testDir, 'node_modules', 'package.json');
|
|
179
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(logFile), true);
|
|
180
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(nodeModulesFile), true);
|
|
181
|
+
});
|
|
182
|
+
(0, node_test_1.it)('不应该忽略不匹配的文件', () => {
|
|
183
|
+
processor.addPattern('**/*.log');
|
|
184
|
+
processor.addPattern('**/node_modules');
|
|
185
|
+
const textFile = path.join(testDir, 'readme.txt');
|
|
186
|
+
const srcFile = path.join(testDir, 'src', 'index.ts');
|
|
187
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(textFile), false);
|
|
188
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(srcFile), false);
|
|
189
|
+
});
|
|
190
|
+
(0, node_test_1.it)('当文件在baseDir之外时不应该忽略', () => {
|
|
191
|
+
processor.addPattern('**/*.log');
|
|
192
|
+
const outsideFile = path.join('/outside', 'dir', 'app.log');
|
|
193
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(outsideFile), false);
|
|
194
|
+
});
|
|
195
|
+
(0, node_test_1.it)('应该正确处理点文件', () => {
|
|
196
|
+
processor.addPattern('**/.DS_Store');
|
|
197
|
+
processor.addPattern('**/.vscode');
|
|
198
|
+
const dsStoreFile = path.join(testDir, '.DS_Store');
|
|
199
|
+
const vscodeFile = path.join(testDir, '.vscode', 'settings.json');
|
|
200
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(dsStoreFile), true);
|
|
201
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(vscodeFile), true);
|
|
202
|
+
});
|
|
203
|
+
(0, node_test_1.it)('应该正确处理目录模式', () => {
|
|
204
|
+
processor.addPattern('node_modules/');
|
|
205
|
+
processor.addPattern('dist/');
|
|
206
|
+
const nodeModulesFile = path.join(testDir, 'node_modules', 'package.json');
|
|
207
|
+
const distFile = path.join(testDir, 'dist', 'index.js');
|
|
208
|
+
const srcFile = path.join(testDir, 'src', 'index.ts');
|
|
209
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(nodeModulesFile), true);
|
|
210
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(distFile), true);
|
|
211
|
+
node_assert_1.default.strictEqual(processor.shouldIgnore(srcFile), false);
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
(0, node_test_1.describe)('addPattern and clearPatterns', () => {
|
|
215
|
+
(0, node_test_1.it)('应该能够添加自定义模式', () => {
|
|
216
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
217
|
+
processor.addPattern('custom-pattern');
|
|
218
|
+
node_assert_1.default.deepStrictEqual(processor.getPatterns(), ['custom-pattern']);
|
|
219
|
+
processor.addPattern('another-pattern');
|
|
220
|
+
node_assert_1.default.deepStrictEqual(processor.getPatterns(), ['custom-pattern', 'another-pattern']);
|
|
221
|
+
});
|
|
222
|
+
(0, node_test_1.it)('应该能够清除所有模式', () => {
|
|
223
|
+
const processor = new gitignore_js_1.GitIgnoreProcessor(testDir);
|
|
224
|
+
processor.addPattern('pattern1');
|
|
225
|
+
processor.addPattern('pattern2');
|
|
226
|
+
node_assert_1.default.strictEqual(processor.getPatterns().length, 2);
|
|
227
|
+
processor.clearPatterns();
|
|
228
|
+
node_assert_1.default.deepStrictEqual(processor.getPatterns(), []);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
(0, node_test_1.describe)('createGitIgnoreProcessor', () => {
|
|
232
|
+
(0, node_test_1.it)('应该创建处理器并加载.gitignore文件', async () => {
|
|
233
|
+
const gitignoreContent = `
|
|
234
|
+
node_modules/
|
|
235
|
+
*.log
|
|
236
|
+
`;
|
|
237
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
238
|
+
const processor = await (0, gitignore_js_1.createGitIgnoreProcessor)(testDir);
|
|
239
|
+
const patterns = processor.getPatterns();
|
|
240
|
+
node_assert_1.default.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
//# sourceMappingURL=gitignore.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.test.js","sourceRoot":"","sources":["../src/gitignore.test.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.d.ts
CHANGED
package/dist/markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA0BtD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA2B;gBAEjC,UAAU,GAAE,iBAAiB,EAAO;IAIhD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAIhD;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+BpD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAiB1D;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBhF;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CA6C7D"}
|
package/dist/markdown.js
CHANGED
|
@@ -41,7 +41,6 @@ const marked_1 = require("marked");
|
|
|
41
41
|
const highlight_js_1 = __importDefault(require("highlight.js"));
|
|
42
42
|
const fs = __importStar(require("fs/promises"));
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
|
-
const yaml = __importStar(require("yaml"));
|
|
45
44
|
const gitignore_1 = require("./gitignore");
|
|
46
45
|
// 配置 marked 使用 highlight.js 进行代码高亮
|
|
47
46
|
marked_1.marked.setOptions({
|
|
@@ -75,25 +74,6 @@ class MarkdownConverter {
|
|
|
75
74
|
addProcessor(processor) {
|
|
76
75
|
this.processors.push(processor);
|
|
77
76
|
}
|
|
78
|
-
/**
|
|
79
|
-
* 解析 YAML frontmatter
|
|
80
|
-
*/
|
|
81
|
-
parseFrontmatter(content) {
|
|
82
|
-
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n/;
|
|
83
|
-
const match = content.match(frontmatterRegex);
|
|
84
|
-
if (!match) {
|
|
85
|
-
return { metadata: {}, content };
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
const metadata = yaml.parse(match[1]) || {};
|
|
89
|
-
const remainingContent = content.slice(match[0].length);
|
|
90
|
-
return { metadata, content: remainingContent };
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
console.warn('Failed to parse frontmatter:', error);
|
|
94
|
-
return { metadata: {}, content };
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
77
|
/**
|
|
98
78
|
* 从内容中提取标题
|
|
99
79
|
*/
|
|
@@ -114,7 +94,7 @@ class MarkdownConverter {
|
|
|
114
94
|
* 转换 Markdown 文件
|
|
115
95
|
*/
|
|
116
96
|
async convert(fileInfo) {
|
|
117
|
-
let
|
|
97
|
+
let content = fileInfo.content;
|
|
118
98
|
// 应用前置处理器
|
|
119
99
|
for (const processor of this.processors) {
|
|
120
100
|
if (processor.beforeParse) {
|
|
@@ -129,15 +109,13 @@ class MarkdownConverter {
|
|
|
129
109
|
html = await processor.afterParse(html, fileInfo);
|
|
130
110
|
}
|
|
131
111
|
}
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
metadata.title = this.extractTitle(content);
|
|
135
|
-
}
|
|
112
|
+
// 提取标题
|
|
113
|
+
const title = this.extractTitle(content);
|
|
136
114
|
return {
|
|
137
115
|
...fileInfo,
|
|
138
116
|
content,
|
|
139
117
|
html,
|
|
140
|
-
metadata,
|
|
118
|
+
metadata: { title }, // 只保留标题作为 metadata
|
|
141
119
|
};
|
|
142
120
|
}
|
|
143
121
|
/**
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAgC;AAChC,gEAAgC;AAEhC,gDAAkC;AAClC,2CAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/navigation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE;IAc7C;;OAEG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE;IAc7C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+D3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE;IAejD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IA4BrF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB5D;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM;CAIlD"}
|
package/dist/navigation.js
CHANGED
|
@@ -36,8 +36,10 @@ class NavigationGenerator {
|
|
|
36
36
|
const isMarkdownFile = part.endsWith('.md');
|
|
37
37
|
// 如果是 Markdown 文件,移除扩展名
|
|
38
38
|
const displayName = isMarkdownFile ? part.replace(/\.md$/, '') : part;
|
|
39
|
-
//
|
|
40
|
-
const title = file.metadata?.title
|
|
39
|
+
// 生成标题(对于 Markdown 文件优先使用提取的标题)
|
|
40
|
+
const title = isMarkdownFile && file.metadata?.title
|
|
41
|
+
? file.metadata.title
|
|
42
|
+
: this.formatTitle(displayName);
|
|
41
43
|
// 生成路径
|
|
42
44
|
const rawPath = isMarkdownFile
|
|
43
45
|
? `/${file.relativePath.replace(/\.md$/, '.html')}`
|
|
@@ -108,7 +110,7 @@ class NavigationGenerator {
|
|
|
108
110
|
generateFlat(files) {
|
|
109
111
|
return files
|
|
110
112
|
.map(file => {
|
|
111
|
-
const title = file.metadata?.title || this.formatTitle(file.name);
|
|
113
|
+
const title = file.metadata?.title || this.formatTitle(file.name); // 优先使用提取的标题
|
|
112
114
|
const rawPath = `/${file.relativePath.replace(/\.md$/, '.html')}`;
|
|
113
115
|
const itemPath = this.generatePath(rawPath);
|
|
114
116
|
return {
|
|
@@ -168,9 +170,7 @@ class NavigationGenerator {
|
|
|
168
170
|
const urls = files
|
|
169
171
|
.map(file => {
|
|
170
172
|
const path = `/${file.relativePath.replace(/\.md$/, '.html')}`;
|
|
171
|
-
const lastmod =
|
|
172
|
-
file.metadata?.date ||
|
|
173
|
-
new Date().toISOString().split('T')[0];
|
|
173
|
+
const lastmod = new Date().toISOString().split('T')[0];
|
|
174
174
|
return ` <url>
|
|
175
175
|
<loc>${effectiveBaseUrl}${path}</loc>
|
|
176
176
|
<lastmod>${lastmod}</lastmod>
|
package/dist/navigation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":";;;AAGA,MAAa,mBAAmB;IAG9B,YAAY,UAAkB,EAAE;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAiB;QACxB,QAAQ;QACR,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAE5F,SAAS;QACT,MAAM,IAAI,GAAqB,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,UAA4B,EAAE,IAAc;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,YAAY,GAAG,UAAU,CAAC;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE5C,wBAAwB;YACxB,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEtE,
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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"}
|
package/dist/template.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjE,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjE,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAuQhB;IAEP;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBxE;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,YAAY;IAUpF;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQlE"}
|
package/dist/template.js
CHANGED
|
@@ -287,12 +287,6 @@ class TemplateEngine {
|
|
|
287
287
|
<main class="content">
|
|
288
288
|
<header class="content-header">
|
|
289
289
|
<h1>{{title}}</h1>
|
|
290
|
-
{{#if metadata}}
|
|
291
|
-
<div class="meta">
|
|
292
|
-
{{#if metadata.author}}By {{metadata.author}} • {{/if}}
|
|
293
|
-
{{#if metadata.date}}{{metadata.date}}{{/if}}
|
|
294
|
-
</div>
|
|
295
|
-
{{/if}}
|
|
296
290
|
</header>
|
|
297
291
|
|
|
298
292
|
<article class="content-body">
|
|
@@ -336,25 +330,9 @@ class TemplateEngine {
|
|
|
336
330
|
// 替换导航
|
|
337
331
|
const navigationHtml = this.generateNavigationHtml(data.navigation, data.currentPath);
|
|
338
332
|
result = result.replace('{{navigation}}', navigationHtml);
|
|
339
|
-
// 替换其他变量
|
|
340
|
-
result = result.replace(
|
|
341
|
-
result = result.replace(
|
|
342
|
-
// 处理 metadata
|
|
343
|
-
if (data.metadata) {
|
|
344
|
-
// 简单的 metadata 替换逻辑
|
|
345
|
-
for (const [key, value] of Object.entries(data.metadata)) {
|
|
346
|
-
const placeholder = `{{metadata.${key}}}`;
|
|
347
|
-
if (result.includes(placeholder)) {
|
|
348
|
-
result = result.replace(new RegExp(placeholder, 'g'), String(value));
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// 替换 metadata 对象为 JSON(如果需要)
|
|
352
|
-
if (result.includes('{{metadata}}')) {
|
|
353
|
-
result = result.replace('{{metadata}}', JSON.stringify(data.metadata));
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// 移除未使用的 metadata 占位符
|
|
357
|
-
result = result.replace(/\{\{metadata\.[^}]*\}\}/g, '');
|
|
333
|
+
// 替换其他变量 - 使用全局替换
|
|
334
|
+
result = result.replace(/{{title}}/g, data.title || 'Untitled');
|
|
335
|
+
result = result.replace(/{{{content}}}/g, data.content || '');
|
|
358
336
|
return result;
|
|
359
337
|
}
|
|
360
338
|
/**
|
|
@@ -377,7 +355,7 @@ class TemplateEngine {
|
|
|
377
355
|
*/
|
|
378
356
|
generateTemplateData(fileInfo, navigation) {
|
|
379
357
|
return {
|
|
380
|
-
title: fileInfo.metadata?.title || fileInfo.name,
|
|
358
|
+
title: fileInfo.metadata?.title || fileInfo.name, // 优先使用提取的标题,如果没有则使用文件名
|
|
381
359
|
content: fileInfo.html || '',
|
|
382
360
|
navigation,
|
|
383
361
|
metadata: fileInfo.metadata,
|
package/dist/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,gDAAkC;AAClC,2CAA6B;AAE7B,MAAa,cAAc;IAA3B;QACU,oBAAe,GAAG
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -16,7 +16,9 @@ export interface FileInfo {
|
|
|
16
16
|
ext: string;
|
|
17
17
|
content: string;
|
|
18
18
|
html?: string;
|
|
19
|
-
metadata?:
|
|
19
|
+
metadata?: {
|
|
20
|
+
title: string;
|
|
21
|
+
};
|
|
20
22
|
}
|
|
21
23
|
export interface NavigationItem {
|
|
22
24
|
title: string;
|
|
@@ -27,7 +29,9 @@ export interface TemplateData {
|
|
|
27
29
|
title: string;
|
|
28
30
|
content: string;
|
|
29
31
|
navigation: NavigationItem[];
|
|
30
|
-
metadata?:
|
|
32
|
+
metadata?: {
|
|
33
|
+
title: string;
|
|
34
|
+
};
|
|
31
35
|
currentPath?: string;
|
|
32
36
|
}
|
|
33
37
|
export interface MarkdownProcessor {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zengen",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.34",
|
|
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
|
-
"test": "npm run
|
|
13
|
+
"test": "npm run build && node --test dist/**/*.test.js",
|
|
14
14
|
"test:types": "tsc --noEmit",
|
|
15
15
|
"test:build": "npm run build && test -f dist/index.js && test -f dist/cli.js",
|
|
16
16
|
"test:cli": "node -e \"const pkg = require('./package.json'); console.log('Package:', pkg.name, 'v' + pkg.version)\"",
|
|
@@ -57,7 +57,6 @@
|
|
|
57
57
|
"express": "^4.21.2",
|
|
58
58
|
"highlight.js": "^11.11.1",
|
|
59
59
|
"marked": "^17.0.1",
|
|
60
|
-
"minimatch": "^10.1.1"
|
|
61
|
-
"yaml": "^1.10.2"
|
|
60
|
+
"minimatch": "^10.1.1"
|
|
62
61
|
}
|
|
63
62
|
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import * as fs from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { GitIgnoreProcessor, createGitIgnoreProcessor } from './gitignore.js';
|
|
6
|
+
|
|
7
|
+
describe('GitIgnoreProcessor', () => {
|
|
8
|
+
let testDir: string;
|
|
9
|
+
let gitignorePath: string;
|
|
10
|
+
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
// 创建临时测试目录
|
|
13
|
+
testDir = path.join(__dirname, 'test-temp');
|
|
14
|
+
gitignorePath = path.join(testDir, '.gitignore');
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
await fs.mkdir(testDir, { recursive: true });
|
|
18
|
+
} catch (error) {
|
|
19
|
+
// 目录可能已存在
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
// 清理测试目录
|
|
25
|
+
try {
|
|
26
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
27
|
+
} catch (error) {
|
|
28
|
+
// 忽略清理错误
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('constructor', () => {
|
|
33
|
+
it('应该正确设置baseDir', () => {
|
|
34
|
+
const processor = new GitIgnoreProcessor('/test/dir');
|
|
35
|
+
assert.strictEqual(processor['baseDir'], '/test/dir');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('应该初始化空模式数组', () => {
|
|
39
|
+
const processor = new GitIgnoreProcessor('/test/dir');
|
|
40
|
+
const patterns = processor.getPatterns();
|
|
41
|
+
assert.deepStrictEqual(patterns, []);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('loadFromFile', () => {
|
|
46
|
+
it('应该从.gitignore文件加载模式', async () => {
|
|
47
|
+
const gitignoreContent = `
|
|
48
|
+
# 注释行
|
|
49
|
+
node_modules/
|
|
50
|
+
*.log
|
|
51
|
+
dist/
|
|
52
|
+
.DS_Store
|
|
53
|
+
`;
|
|
54
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
55
|
+
|
|
56
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
57
|
+
await processor.loadFromFile('.gitignore');
|
|
58
|
+
|
|
59
|
+
const patterns = processor.getPatterns();
|
|
60
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '*.log', '**/dist', '**/.DS_Store']);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('当.gitignore文件不存在时应该使用空模式', async () => {
|
|
64
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
65
|
+
await processor.loadFromFile('non-existent-file');
|
|
66
|
+
|
|
67
|
+
const patterns = processor.getPatterns();
|
|
68
|
+
assert.deepStrictEqual(patterns, []);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('应该跳过空行和注释', async () => {
|
|
72
|
+
const gitignoreContent = `
|
|
73
|
+
# 这是一个注释
|
|
74
|
+
|
|
75
|
+
node_modules/
|
|
76
|
+
|
|
77
|
+
# 另一个注释
|
|
78
|
+
*.log
|
|
79
|
+
`;
|
|
80
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
81
|
+
|
|
82
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
83
|
+
await processor.loadFromFile('.gitignore');
|
|
84
|
+
|
|
85
|
+
const patterns = processor.getPatterns();
|
|
86
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('应该跳过否定模式', async () => {
|
|
90
|
+
const gitignoreContent = `
|
|
91
|
+
node_modules/
|
|
92
|
+
!node_modules/special/
|
|
93
|
+
*.log
|
|
94
|
+
`;
|
|
95
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
96
|
+
|
|
97
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
98
|
+
await processor.loadFromFile('.gitignore');
|
|
99
|
+
|
|
100
|
+
const patterns = processor.getPatterns();
|
|
101
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('parsePatterns', () => {
|
|
106
|
+
it('应该正确处理目录模式', () => {
|
|
107
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
108
|
+
const content = `
|
|
109
|
+
node_modules/
|
|
110
|
+
dist/
|
|
111
|
+
`;
|
|
112
|
+
processor['parsePatterns'](content);
|
|
113
|
+
|
|
114
|
+
const patterns = processor.getPatterns();
|
|
115
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '**/dist']);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('应该正确处理文件扩展名模式', () => {
|
|
119
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
120
|
+
const content = `
|
|
121
|
+
*.log
|
|
122
|
+
*.tmp
|
|
123
|
+
`;
|
|
124
|
+
processor['parsePatterns'](content);
|
|
125
|
+
|
|
126
|
+
const patterns = processor.getPatterns();
|
|
127
|
+
assert.deepStrictEqual(patterns, ['*.log', '*.tmp']);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('应该处理以/开头的模式', () => {
|
|
131
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
132
|
+
const content = `
|
|
133
|
+
/node_modules
|
|
134
|
+
/dist
|
|
135
|
+
`;
|
|
136
|
+
processor['parsePatterns'](content);
|
|
137
|
+
|
|
138
|
+
const patterns = processor.getPatterns();
|
|
139
|
+
assert.deepStrictEqual(patterns, ['node_modules', 'dist']);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('应该处理包含通配符的模式', () => {
|
|
143
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
144
|
+
const content = `
|
|
145
|
+
**/node_modules
|
|
146
|
+
**/.vscode
|
|
147
|
+
`;
|
|
148
|
+
processor['parsePatterns'](content);
|
|
149
|
+
|
|
150
|
+
const patterns = processor.getPatterns();
|
|
151
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '**/.vscode']);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('shouldIgnore', () => {
|
|
156
|
+
let processor: GitIgnoreProcessor;
|
|
157
|
+
|
|
158
|
+
beforeEach(() => {
|
|
159
|
+
processor = new GitIgnoreProcessor(testDir);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('应该忽略匹配的文件', () => {
|
|
163
|
+
processor.addPattern('**/*.log');
|
|
164
|
+
processor.addPattern('**/node_modules');
|
|
165
|
+
|
|
166
|
+
const logFile = path.join(testDir, 'app.log');
|
|
167
|
+
const nodeModulesFile = path.join(testDir, 'node_modules', 'package.json');
|
|
168
|
+
|
|
169
|
+
assert.strictEqual(processor.shouldIgnore(logFile), true);
|
|
170
|
+
assert.strictEqual(processor.shouldIgnore(nodeModulesFile), true);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('不应该忽略不匹配的文件', () => {
|
|
174
|
+
processor.addPattern('**/*.log');
|
|
175
|
+
processor.addPattern('**/node_modules');
|
|
176
|
+
|
|
177
|
+
const textFile = path.join(testDir, 'readme.txt');
|
|
178
|
+
const srcFile = path.join(testDir, 'src', 'index.ts');
|
|
179
|
+
|
|
180
|
+
assert.strictEqual(processor.shouldIgnore(textFile), false);
|
|
181
|
+
assert.strictEqual(processor.shouldIgnore(srcFile), false);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('当文件在baseDir之外时不应该忽略', () => {
|
|
185
|
+
processor.addPattern('**/*.log');
|
|
186
|
+
|
|
187
|
+
const outsideFile = path.join('/outside', 'dir', 'app.log');
|
|
188
|
+
assert.strictEqual(processor.shouldIgnore(outsideFile), false);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('应该正确处理点文件', () => {
|
|
192
|
+
processor.addPattern('**/.DS_Store');
|
|
193
|
+
processor.addPattern('**/.vscode');
|
|
194
|
+
|
|
195
|
+
const dsStoreFile = path.join(testDir, '.DS_Store');
|
|
196
|
+
const vscodeFile = path.join(testDir, '.vscode', 'settings.json');
|
|
197
|
+
|
|
198
|
+
assert.strictEqual(processor.shouldIgnore(dsStoreFile), true);
|
|
199
|
+
assert.strictEqual(processor.shouldIgnore(vscodeFile), true);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('应该正确处理目录模式', () => {
|
|
203
|
+
processor.addPattern('node_modules/');
|
|
204
|
+
processor.addPattern('dist/');
|
|
205
|
+
|
|
206
|
+
const nodeModulesFile = path.join(testDir, 'node_modules', 'package.json');
|
|
207
|
+
const distFile = path.join(testDir, 'dist', 'index.js');
|
|
208
|
+
const srcFile = path.join(testDir, 'src', 'index.ts');
|
|
209
|
+
|
|
210
|
+
assert.strictEqual(processor.shouldIgnore(nodeModulesFile), true);
|
|
211
|
+
assert.strictEqual(processor.shouldIgnore(distFile), true);
|
|
212
|
+
assert.strictEqual(processor.shouldIgnore(srcFile), false);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('addPattern and clearPatterns', () => {
|
|
217
|
+
it('应该能够添加自定义模式', () => {
|
|
218
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
219
|
+
|
|
220
|
+
processor.addPattern('custom-pattern');
|
|
221
|
+
assert.deepStrictEqual(processor.getPatterns(), ['custom-pattern']);
|
|
222
|
+
|
|
223
|
+
processor.addPattern('another-pattern');
|
|
224
|
+
assert.deepStrictEqual(processor.getPatterns(), ['custom-pattern', 'another-pattern']);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('应该能够清除所有模式', () => {
|
|
228
|
+
const processor = new GitIgnoreProcessor(testDir);
|
|
229
|
+
|
|
230
|
+
processor.addPattern('pattern1');
|
|
231
|
+
processor.addPattern('pattern2');
|
|
232
|
+
assert.strictEqual(processor.getPatterns().length, 2);
|
|
233
|
+
|
|
234
|
+
processor.clearPatterns();
|
|
235
|
+
assert.deepStrictEqual(processor.getPatterns(), []);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('createGitIgnoreProcessor', () => {
|
|
240
|
+
it('应该创建处理器并加载.gitignore文件', async () => {
|
|
241
|
+
const gitignoreContent = `
|
|
242
|
+
node_modules/
|
|
243
|
+
*.log
|
|
244
|
+
`;
|
|
245
|
+
await fs.writeFile(gitignorePath, gitignoreContent);
|
|
246
|
+
|
|
247
|
+
const processor = await createGitIgnoreProcessor(testDir);
|
|
248
|
+
const patterns = processor.getPatterns();
|
|
249
|
+
|
|
250
|
+
assert.deepStrictEqual(patterns, ['**/node_modules', '*.log']);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
});
|
package/src/markdown.ts
CHANGED
|
@@ -3,7 +3,6 @@ import hljs from 'highlight.js';
|
|
|
3
3
|
import { FileInfo, MarkdownProcessor } from './types';
|
|
4
4
|
import * as fs from 'fs/promises';
|
|
5
5
|
import * as path from 'path';
|
|
6
|
-
import * as yaml from 'yaml';
|
|
7
6
|
import { GitIgnoreProcessor } from './gitignore';
|
|
8
7
|
|
|
9
8
|
// 配置 marked 使用 highlight.js 进行代码高亮
|
|
@@ -41,30 +40,6 @@ export class MarkdownConverter {
|
|
|
41
40
|
this.processors.push(processor);
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
/**
|
|
45
|
-
* 解析 YAML frontmatter
|
|
46
|
-
*/
|
|
47
|
-
private parseFrontmatter(content: string): {
|
|
48
|
-
metadata: Record<string, any>;
|
|
49
|
-
content: string;
|
|
50
|
-
} {
|
|
51
|
-
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n/;
|
|
52
|
-
const match = content.match(frontmatterRegex);
|
|
53
|
-
|
|
54
|
-
if (!match) {
|
|
55
|
-
return { metadata: {}, content };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
const metadata = yaml.parse(match[1]) || {};
|
|
60
|
-
const remainingContent = content.slice(match[0].length);
|
|
61
|
-
return { metadata, content: remainingContent };
|
|
62
|
-
} catch (error) {
|
|
63
|
-
console.warn('Failed to parse frontmatter:', error);
|
|
64
|
-
return { metadata: {}, content };
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
43
|
/**
|
|
69
44
|
* 从内容中提取标题
|
|
70
45
|
*/
|
|
@@ -88,7 +63,7 @@ export class MarkdownConverter {
|
|
|
88
63
|
* 转换 Markdown 文件
|
|
89
64
|
*/
|
|
90
65
|
async convert(fileInfo: FileInfo): Promise<FileInfo> {
|
|
91
|
-
let
|
|
66
|
+
let content = fileInfo.content;
|
|
92
67
|
|
|
93
68
|
// 应用前置处理器
|
|
94
69
|
for (const processor of this.processors) {
|
|
@@ -107,16 +82,14 @@ export class MarkdownConverter {
|
|
|
107
82
|
}
|
|
108
83
|
}
|
|
109
84
|
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
metadata.title = this.extractTitle(content);
|
|
113
|
-
}
|
|
85
|
+
// 提取标题
|
|
86
|
+
const title = this.extractTitle(content);
|
|
114
87
|
|
|
115
88
|
return {
|
|
116
89
|
...fileInfo,
|
|
117
90
|
content,
|
|
118
91
|
html,
|
|
119
|
-
metadata,
|
|
92
|
+
metadata: { title }, // 只保留标题作为 metadata
|
|
120
93
|
};
|
|
121
94
|
}
|
|
122
95
|
|
package/src/navigation.ts
CHANGED
|
@@ -47,8 +47,11 @@ export class NavigationGenerator {
|
|
|
47
47
|
// 如果是 Markdown 文件,移除扩展名
|
|
48
48
|
const displayName = isMarkdownFile ? part.replace(/\.md$/, '') : part;
|
|
49
49
|
|
|
50
|
-
//
|
|
51
|
-
const title =
|
|
50
|
+
// 生成标题(对于 Markdown 文件优先使用提取的标题)
|
|
51
|
+
const title =
|
|
52
|
+
isMarkdownFile && file.metadata?.title
|
|
53
|
+
? file.metadata.title
|
|
54
|
+
: this.formatTitle(displayName);
|
|
52
55
|
|
|
53
56
|
// 生成路径
|
|
54
57
|
const rawPath = isMarkdownFile
|
|
@@ -133,7 +136,7 @@ export class NavigationGenerator {
|
|
|
133
136
|
generateFlat(files: FileInfo[]): NavigationItem[] {
|
|
134
137
|
return files
|
|
135
138
|
.map(file => {
|
|
136
|
-
const title = file.metadata?.title || this.formatTitle(file.name);
|
|
139
|
+
const title = file.metadata?.title || this.formatTitle(file.name); // 优先使用提取的标题
|
|
137
140
|
const rawPath = `/${file.relativePath.replace(/\.md$/, '.html')}`;
|
|
138
141
|
const itemPath = this.generatePath(rawPath);
|
|
139
142
|
|
|
@@ -207,10 +210,7 @@ export class NavigationGenerator {
|
|
|
207
210
|
const urls = files
|
|
208
211
|
.map(file => {
|
|
209
212
|
const path = `/${file.relativePath.replace(/\.md$/, '.html')}`;
|
|
210
|
-
const lastmod =
|
|
211
|
-
file.metadata?.last_modified ||
|
|
212
|
-
file.metadata?.date ||
|
|
213
|
-
new Date().toISOString().split('T')[0];
|
|
213
|
+
const lastmod = new Date().toISOString().split('T')[0];
|
|
214
214
|
|
|
215
215
|
return ` <url>
|
|
216
216
|
<loc>${effectiveBaseUrl}${path}</loc>
|
package/src/template.ts
CHANGED
|
@@ -252,12 +252,6 @@ export class TemplateEngine {
|
|
|
252
252
|
<main class="content">
|
|
253
253
|
<header class="content-header">
|
|
254
254
|
<h1>{{title}}</h1>
|
|
255
|
-
{{#if metadata}}
|
|
256
|
-
<div class="meta">
|
|
257
|
-
{{#if metadata.author}}By {{metadata.author}} • {{/if}}
|
|
258
|
-
{{#if metadata.date}}{{metadata.date}}{{/if}}
|
|
259
|
-
</div>
|
|
260
|
-
{{/if}}
|
|
261
255
|
</header>
|
|
262
256
|
|
|
263
257
|
<article class="content-body">
|
|
@@ -308,28 +302,9 @@ export class TemplateEngine {
|
|
|
308
302
|
const navigationHtml = this.generateNavigationHtml(data.navigation, data.currentPath);
|
|
309
303
|
result = result.replace('{{navigation}}', navigationHtml);
|
|
310
304
|
|
|
311
|
-
// 替换其他变量
|
|
312
|
-
result = result.replace(
|
|
313
|
-
result = result.replace(
|
|
314
|
-
|
|
315
|
-
// 处理 metadata
|
|
316
|
-
if (data.metadata) {
|
|
317
|
-
// 简单的 metadata 替换逻辑
|
|
318
|
-
for (const [key, value] of Object.entries(data.metadata)) {
|
|
319
|
-
const placeholder = `{{metadata.${key}}}`;
|
|
320
|
-
if (result.includes(placeholder)) {
|
|
321
|
-
result = result.replace(new RegExp(placeholder, 'g'), String(value));
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// 替换 metadata 对象为 JSON(如果需要)
|
|
326
|
-
if (result.includes('{{metadata}}')) {
|
|
327
|
-
result = result.replace('{{metadata}}', JSON.stringify(data.metadata));
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// 移除未使用的 metadata 占位符
|
|
332
|
-
result = result.replace(/\{\{metadata\.[^}]*\}\}/g, '');
|
|
305
|
+
// 替换其他变量 - 使用全局替换
|
|
306
|
+
result = result.replace(/{{title}}/g, data.title || 'Untitled');
|
|
307
|
+
result = result.replace(/{{{content}}}/g, data.content || '');
|
|
333
308
|
|
|
334
309
|
return result;
|
|
335
310
|
}
|
|
@@ -359,7 +334,7 @@ export class TemplateEngine {
|
|
|
359
334
|
*/
|
|
360
335
|
generateTemplateData(fileInfo: FileInfo, navigation: NavigationItem[]): TemplateData {
|
|
361
336
|
return {
|
|
362
|
-
title: fileInfo.metadata?.title || fileInfo.name,
|
|
337
|
+
title: fileInfo.metadata?.title || fileInfo.name, // 优先使用提取的标题,如果没有则使用文件名
|
|
363
338
|
content: fileInfo.html || '',
|
|
364
339
|
navigation,
|
|
365
340
|
metadata: fileInfo.metadata,
|
package/src/types.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface FileInfo {
|
|
|
17
17
|
ext: string;
|
|
18
18
|
content: string;
|
|
19
19
|
html?: string;
|
|
20
|
-
metadata?:
|
|
20
|
+
metadata?: { title: string }; // 简化,只保留标题
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export interface NavigationItem {
|
|
@@ -30,7 +30,7 @@ export interface TemplateData {
|
|
|
30
30
|
title: string;
|
|
31
31
|
content: string;
|
|
32
32
|
navigation: NavigationItem[];
|
|
33
|
-
metadata?:
|
|
33
|
+
metadata?: { title: string }; // 简化,只保留标题
|
|
34
34
|
currentPath?: string;
|
|
35
35
|
}
|
|
36
36
|
|