czon 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/bump-version.yml +112 -0
- package/.github/workflows/ci.yml +64 -0
- package/.github/workflows/pages.yml +61 -0
- package/.github/workflows/publish.yml +81 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +14 -0
- package/.prettierrc.json +11 -0
- package/README.md +56 -0
- package/assets/templates/default/layout.html +421 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
- package/dist/ai/extractMetadataFromMarkdown.js +88 -0
- package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
- package/dist/ai/translateMarkdown.d.ts +8 -0
- package/dist/ai/translateMarkdown.d.ts.map +1 -0
- package/dist/ai/translateMarkdown.js +60 -0
- package/dist/ai/translateMarkdown.js.map +1 -0
- package/dist/build/pipeline.d.ts +6 -0
- package/dist/build/pipeline.d.ts.map +1 -0
- package/dist/build/pipeline.js +180 -0
- package/dist/build/pipeline.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +102 -0
- package/dist/cli.js.map +1 -0
- package/dist/findEntries.d.ts +10 -0
- package/dist/findEntries.d.ts.map +1 -0
- package/dist/findEntries.js +38 -0
- package/dist/findEntries.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/languages.d.ts +2 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +37 -0
- package/dist/languages.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +78 -0
- package/dist/metadata.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/process/extractMetadataByAI.d.ts +5 -0
- package/dist/process/extractMetadataByAI.d.ts.map +1 -0
- package/dist/process/extractMetadataByAI.js +31 -0
- package/dist/process/extractMetadataByAI.js.map +1 -0
- package/dist/process/scanSourceFiles.d.ts +5 -0
- package/dist/process/scanSourceFiles.d.ts.map +1 -0
- package/dist/process/scanSourceFiles.js +70 -0
- package/dist/process/scanSourceFiles.js.map +1 -0
- package/dist/process/template.d.ts +5 -0
- package/dist/process/template.d.ts.map +1 -0
- package/dist/process/template.js +207 -0
- package/dist/process/template.js.map +1 -0
- package/dist/services/openai.d.ts +41 -0
- package/dist/services/openai.d.ts.map +1 -0
- package/dist/services/openai.js +54 -0
- package/dist/services/openai.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
- package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
- package/dist/utils/convertMarkdownToHtml.js +94 -0
- package/dist/utils/convertMarkdownToHtml.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +6 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +22 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/sha256.d.ts +2 -0
- package/dist/utils/sha256.d.ts.map +1 -0
- package/dist/utils/sha256.js +7 -0
- package/dist/utils/sha256.js.map +1 -0
- package/package.json +58 -6
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,70 @@
|
|
|
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.scanSourceFiles = scanSourceFiles;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const findEntries_1 = require("../findEntries");
|
|
10
|
+
const metadata_1 = require("../metadata");
|
|
11
|
+
const paths_1 = require("../paths");
|
|
12
|
+
const sha256_1 = require("../utils/sha256");
|
|
13
|
+
const extractLinksFromMarkdown = (content) => {
|
|
14
|
+
const linkRegex = /\[.*?\]\((.*?)\)/g;
|
|
15
|
+
const links = [];
|
|
16
|
+
let match;
|
|
17
|
+
while ((match = linkRegex.exec(content)) !== null) {
|
|
18
|
+
links.push(match[1]);
|
|
19
|
+
}
|
|
20
|
+
return links;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 扫描源文件
|
|
24
|
+
*/
|
|
25
|
+
async function scanSourceFiles() {
|
|
26
|
+
console.log(`🔍 Scanning source directory...`);
|
|
27
|
+
const markdownFiles = await (0, findEntries_1.findMarkdownEntries)(paths_1.INPUT_DIR);
|
|
28
|
+
const hashes = new Set();
|
|
29
|
+
for (const relativePath of markdownFiles) {
|
|
30
|
+
const fullPath = path_1.default.join(paths_1.INPUT_DIR, relativePath);
|
|
31
|
+
try {
|
|
32
|
+
// 检查文件是否存在
|
|
33
|
+
const content = await (0, promises_1.readFile)(fullPath, 'utf-8'); // 确保文件可读
|
|
34
|
+
const hash = (0, sha256_1.sha256)(content);
|
|
35
|
+
const links = extractLinksFromMarkdown(content);
|
|
36
|
+
console.info(` - Found file: ${relativePath} (hash: ${hash})`);
|
|
37
|
+
console.info(` Links: ${links.join(', ') || 'None'}`);
|
|
38
|
+
hashes.add(hash);
|
|
39
|
+
const metaWithSameHash = metadata_1.MetaData.files.find(f => f.hash === hash);
|
|
40
|
+
if (metaWithSameHash) {
|
|
41
|
+
metaWithSameHash.path = relativePath;
|
|
42
|
+
metaWithSameHash.links = links;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// 如果没有相同哈希的元数据,则添加一个新的占位符
|
|
46
|
+
metadata_1.MetaData.files.push({
|
|
47
|
+
hash,
|
|
48
|
+
path: relativePath,
|
|
49
|
+
links,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn(`⚠️ File not found or inaccessible: ${fullPath}`, error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 移除不再存在的文件元数据
|
|
58
|
+
metadata_1.MetaData.files = metadata_1.MetaData.files.filter(f => hashes.has(f.hash));
|
|
59
|
+
// 按路径降序排序 (通常外层目录优先)
|
|
60
|
+
metadata_1.MetaData.files.sort((a, b) =>
|
|
61
|
+
// 第一级按目录排序
|
|
62
|
+
path_1.default.dirname(a.path).localeCompare(path_1.default.dirname(b.path)) ||
|
|
63
|
+
// 第二级按文件名排序
|
|
64
|
+
a.path.localeCompare(b.path));
|
|
65
|
+
console.log(`✅ Found ${metadata_1.MetaData.files.length} Markdown files`);
|
|
66
|
+
if (metadata_1.MetaData.files.length === 0) {
|
|
67
|
+
console.warn(`⚠️ No Markdown files found in ${paths_1.INPUT_DIR}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=scanSourceFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanSourceFiles.js","sourceRoot":"","sources":["../../src/process/scanSourceFiles.ts"],"names":[],"mappings":";;;;;AAoBA,0CAoDC;AAxED,0CAAuC;AACvC,gDAAwB;AACxB,gDAAqD;AACrD,0CAAuC;AACvC,oCAAqC;AACrC,4CAAyC;AAEzC,MAAM,wBAAwB,GAAG,CAAC,OAAe,EAAY,EAAE;IAC7D,MAAM,SAAS,GAAG,mBAAmB,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,IAAA,iCAAmB,EAAC,iBAAS,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAS,EAAE,YAAY,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,WAAW;YAEX,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;YAE5D,MAAM,IAAI,GAAG,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,mBAAmB,YAAY,WAAW,IAAI,GAAG,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;YAEzD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjB,MAAM,gBAAgB,GAAG,mBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACnE,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,IAAI,GAAG,YAAY,CAAC;gBACrC,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,mBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;oBAClB,IAAI;oBACJ,IAAI,EAAE,YAAY;oBAClB,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,eAAe;IACf,mBAAQ,CAAC,KAAK,GAAG,mBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,qBAAqB;IACrB,mBAAQ,CAAC,KAAK,CAAC,IAAI,CACjB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACP,WAAW;IACX,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,YAAY;QACZ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/B,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,WAAW,mBAAQ,CAAC,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAE/D,IAAI,mBAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,iCAAiC,iBAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"AAmLA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCrD"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.renderTemplates = renderTemplates;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const languages_1 = require("../languages");
|
|
40
|
+
const metadata_1 = require("../metadata");
|
|
41
|
+
const paths_1 = require("../paths");
|
|
42
|
+
const convertMarkdownToHtml_1 = require("../utils/convertMarkdownToHtml");
|
|
43
|
+
const frontmatter_1 = require("../utils/frontmatter");
|
|
44
|
+
/**
|
|
45
|
+
* 生成语言切换器 HTML
|
|
46
|
+
* @param currentLang 当前语言
|
|
47
|
+
* @param availableLangs 可用语言列表
|
|
48
|
+
* @returns 语言切换器 HTML 字符串
|
|
49
|
+
*/
|
|
50
|
+
function generateLanguageSwitcher(templateData) {
|
|
51
|
+
const { options: { langs = [] }, } = metadata_1.MetaData;
|
|
52
|
+
const items = langs
|
|
53
|
+
.map(lang => {
|
|
54
|
+
const langName = languages_1.LANGUAGE_NAMES[lang] || lang;
|
|
55
|
+
const isCurrent = lang === templateData.lang;
|
|
56
|
+
const activeClass = isCurrent ? 'active' : '';
|
|
57
|
+
const link = path.join('..', lang, templateData.file.hash + '.html');
|
|
58
|
+
return `<li class="lang-item ${activeClass}">
|
|
59
|
+
<a href="${link}" class="lang-link">${langName}</a>
|
|
60
|
+
</li>`;
|
|
61
|
+
})
|
|
62
|
+
.join('');
|
|
63
|
+
return `<div class="language-switcher">
|
|
64
|
+
<ul class="lang-list">${items}</ul>
|
|
65
|
+
</div>`;
|
|
66
|
+
}
|
|
67
|
+
const generateTagsHtml = (tags) => {
|
|
68
|
+
return `<ul class="tags-list">${tags
|
|
69
|
+
.map(tag => `<li class="tag-item">${tag}</li>`)
|
|
70
|
+
.join('')}</ul>`;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* 生成导航 HTML
|
|
74
|
+
* @param navigation 导航树
|
|
75
|
+
* @param currentPath 当前路径(可选,用于高亮当前页面)
|
|
76
|
+
* @returns 导航 HTML 字符串
|
|
77
|
+
*/
|
|
78
|
+
async function generateNavigationHtml(data) {
|
|
79
|
+
const { files } = metadata_1.MetaData;
|
|
80
|
+
const navigation = await Promise.all(files.map(async (file) => {
|
|
81
|
+
const content = await fs.readFile(path.join(paths_1.ZEN_SRC_DIR, data.lang, file.hash + '.md'), 'utf-8');
|
|
82
|
+
const { frontmatter } = (0, frontmatter_1.parseFrontmatter)(content);
|
|
83
|
+
const title = frontmatter.title || file.metadata?.title || file.path; // 优先使用提取的标题
|
|
84
|
+
// 使用相对链接
|
|
85
|
+
const link = file.hash + '.html';
|
|
86
|
+
return {
|
|
87
|
+
title,
|
|
88
|
+
link,
|
|
89
|
+
isActive: data.file.hash === file.hash,
|
|
90
|
+
};
|
|
91
|
+
}));
|
|
92
|
+
return `<ul class="nav-list">${navigation
|
|
93
|
+
.map(item => {
|
|
94
|
+
const activeClass = item.isActive ? 'active' : '';
|
|
95
|
+
let html = `<li class="nav-item">`;
|
|
96
|
+
html += `<a href="${item.link}" class="nav-link ${activeClass}">${item.title}</a>`;
|
|
97
|
+
html += `</li>`;
|
|
98
|
+
return html;
|
|
99
|
+
})
|
|
100
|
+
.join('')}</ul>`;
|
|
101
|
+
}
|
|
102
|
+
const replaceInnerLinks = (data, markdownContent) => {
|
|
103
|
+
let content = markdownContent;
|
|
104
|
+
for (const link of data.file.links) {
|
|
105
|
+
if (URL.canParse(link))
|
|
106
|
+
continue; // 跳过绝对 URL
|
|
107
|
+
const targetPath = path.resolve('/', path.dirname(data.file.path), link).slice(1);
|
|
108
|
+
const targetFile = metadata_1.MetaData.files.find(f => f.path === targetPath);
|
|
109
|
+
if (!targetFile) {
|
|
110
|
+
console.warn(`⚠️ Link target not found for ${link} in file ${data.file.path}`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// 替换链接 (使用相对链接)
|
|
114
|
+
const targetLink = path.join(targetFile.hash + '.html');
|
|
115
|
+
// 全局替换链接
|
|
116
|
+
const linksRegex = new RegExp(`\\]\\(${link.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\)`, 'g');
|
|
117
|
+
content = content.replace(linksRegex, `](${targetLink})`);
|
|
118
|
+
}
|
|
119
|
+
return content;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* 简单的模板变量替换
|
|
123
|
+
* @param template 模板字符串
|
|
124
|
+
* @param data 模板数据
|
|
125
|
+
* @returns 渲染后的 HTML 字符串
|
|
126
|
+
*/
|
|
127
|
+
async function renderTemplate(template, data) {
|
|
128
|
+
const { options: { langs = [] }, } = metadata_1.MetaData;
|
|
129
|
+
const markdownContent = data.content;
|
|
130
|
+
const { frontmatter, body } = (0, frontmatter_1.parseFrontmatter)(markdownContent);
|
|
131
|
+
const htmlContent = (0, convertMarkdownToHtml_1.convertMarkdownToHtml)(replaceInnerLinks(data, body));
|
|
132
|
+
let result = template;
|
|
133
|
+
// 替换导航
|
|
134
|
+
const navigationHtml = await generateNavigationHtml(data);
|
|
135
|
+
result = result.replace(/{{navigation}}/g, navigationHtml);
|
|
136
|
+
// 替换其他变量 - 使用全局替换
|
|
137
|
+
result = result.replace(/{{title}}/g, frontmatter.title || 'Untitled');
|
|
138
|
+
result = result.replace(/{{content}}/g, htmlContent);
|
|
139
|
+
// 替换元数据变量
|
|
140
|
+
if (frontmatter) {
|
|
141
|
+
result = result.replace(/{{summary}}/g, frontmatter.summary || '');
|
|
142
|
+
result = result.replace(/{{tags}}/g, generateTagsHtml(frontmatter.tags || []));
|
|
143
|
+
result = result.replace(/{{inferred_date}}/g, frontmatter.inferred_date || '--');
|
|
144
|
+
result = result.replace(/{{inferred_lang}}/g, frontmatter.inferred_lang || '--');
|
|
145
|
+
}
|
|
146
|
+
// 替换语言相关变量
|
|
147
|
+
result = result.replace(/{{lang}}/g, data.lang || '');
|
|
148
|
+
if (langs && langs.length > 1 && data.lang) {
|
|
149
|
+
const langSwitcher = generateLanguageSwitcher(data);
|
|
150
|
+
result = result.replace(/{{language_switcher}}/g, langSwitcher);
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
const renderRedirectTemplate = async (from, to) => {
|
|
155
|
+
const toURL = path.relative(path.dirname(from), to);
|
|
156
|
+
const html = `<!DOCTYPE html>
|
|
157
|
+
<html lang="en">
|
|
158
|
+
<head>
|
|
159
|
+
<meta charset="UTF-8">
|
|
160
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
161
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
162
|
+
<meta http-equiv="refresh" content="0; url=${toURL}">
|
|
163
|
+
<title>Redirecting...</title>
|
|
164
|
+
</head>
|
|
165
|
+
<body>
|
|
166
|
+
<p>Redirecting to <a href="${toURL}">${toURL}</a></p>
|
|
167
|
+
</body>
|
|
168
|
+
</html>`;
|
|
169
|
+
const targetPath = path.join(paths_1.ZEN_DIST_DIR, from);
|
|
170
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
171
|
+
await fs.writeFile(targetPath, html, 'utf-8');
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* 渲染模板并保存文件
|
|
175
|
+
*/
|
|
176
|
+
async function renderTemplates() {
|
|
177
|
+
const { files, options: { langs, verbose }, } = metadata_1.MetaData;
|
|
178
|
+
if (verbose)
|
|
179
|
+
console.log(`⚡ Processing files...`);
|
|
180
|
+
const layoutTemplate = await fs.readFile(path.join(__dirname, '../../assets/templates/default/layout.html'), 'utf-8');
|
|
181
|
+
for (const file of files) {
|
|
182
|
+
for (const lang of langs || []) {
|
|
183
|
+
console.info(`📄 Preparing file for language: ${file.path} [${file.hash}] [${lang}]`);
|
|
184
|
+
const targetPath = path.join(paths_1.ZEN_DIST_DIR, lang, file.hash + '.html');
|
|
185
|
+
const content = await fs.readFile(path.join(paths_1.ZEN_SRC_DIR, lang, file.hash + '.md'), 'utf-8');
|
|
186
|
+
try {
|
|
187
|
+
const html = await renderTemplate(layoutTemplate, {
|
|
188
|
+
file,
|
|
189
|
+
content,
|
|
190
|
+
lang,
|
|
191
|
+
});
|
|
192
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
193
|
+
await fs.writeFile(targetPath, html, 'utf-8');
|
|
194
|
+
if (verbose)
|
|
195
|
+
console.log(`✅ Rendered: ${targetPath}`);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error(`❌ Failed to render ${file.path}:`, error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
for (const lang of langs || []) {
|
|
203
|
+
await renderRedirectTemplate(path.join(lang, 'index.html'), path.join(lang, files[0].hash + '.html'));
|
|
204
|
+
}
|
|
205
|
+
await renderRedirectTemplate('index.html', path.join(langs?.[0] || 'en-US', 'index.html'));
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI 消息接口
|
|
3
|
+
*/
|
|
4
|
+
export interface OpenAIMessage {
|
|
5
|
+
role: 'system' | 'user' | 'assistant';
|
|
6
|
+
content: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* OpenAI 响应接口
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenAIResponse {
|
|
12
|
+
id: string;
|
|
13
|
+
object: string;
|
|
14
|
+
created: number;
|
|
15
|
+
model: string;
|
|
16
|
+
choices: Array<{
|
|
17
|
+
index: number;
|
|
18
|
+
message: {
|
|
19
|
+
role: string;
|
|
20
|
+
content: string;
|
|
21
|
+
};
|
|
22
|
+
finish_reason: string;
|
|
23
|
+
}>;
|
|
24
|
+
usage: {
|
|
25
|
+
prompt_tokens: number;
|
|
26
|
+
completion_tokens: number;
|
|
27
|
+
total_tokens: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 使用 OpenAI API 补全消息
|
|
32
|
+
* @param messages 消息数组
|
|
33
|
+
* @param options 可选配置
|
|
34
|
+
* @returns Promise<OpenAIResponse> 返回完整的OpenAI响应
|
|
35
|
+
*/
|
|
36
|
+
export declare const completeMessages: (messages: OpenAIMessage[], options?: {
|
|
37
|
+
response_format?: {
|
|
38
|
+
type: "json_object" | "text";
|
|
39
|
+
};
|
|
40
|
+
}) => Promise<OpenAIResponse>;
|
|
41
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/services/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,aAAa,EAAE,EACzB,UAAU;IACR,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD,KACA,OAAO,CAAC,cAAc,CAiDxB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.completeMessages = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 使用 OpenAI API 补全消息
|
|
6
|
+
* @param messages 消息数组
|
|
7
|
+
* @param options 可选配置
|
|
8
|
+
* @returns Promise<OpenAIResponse> 返回完整的OpenAI响应
|
|
9
|
+
*/
|
|
10
|
+
const completeMessages = async (messages, options) => {
|
|
11
|
+
// 从环境变量读取配置
|
|
12
|
+
const apiKey = process.env.OPENAI_API_KEY || '';
|
|
13
|
+
const baseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
|
|
14
|
+
const model = process.env.OPENAI_MODEL || 'gpt-3.5-turbo';
|
|
15
|
+
if (!apiKey) {
|
|
16
|
+
throw new Error('OPENAI_API_KEY environment variable is not set');
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const requestBody = {
|
|
20
|
+
model,
|
|
21
|
+
messages,
|
|
22
|
+
temperature: 0, // 总是设置为 0,提取内容不需要随机性
|
|
23
|
+
// 不设置 max_tokens,让API自动决定
|
|
24
|
+
};
|
|
25
|
+
// 添加可选的response_format
|
|
26
|
+
if (options?.response_format) {
|
|
27
|
+
requestBody.response_format = options.response_format;
|
|
28
|
+
}
|
|
29
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: {
|
|
32
|
+
'Content-Type': 'application/json',
|
|
33
|
+
Authorization: `Bearer ${apiKey}`,
|
|
34
|
+
},
|
|
35
|
+
body: JSON.stringify(requestBody),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const errorText = await response.text();
|
|
39
|
+
throw new Error(`OpenAI API error (${response.status}): ${errorText}`);
|
|
40
|
+
}
|
|
41
|
+
const data = await response.json();
|
|
42
|
+
// 验证响应
|
|
43
|
+
if (!data.choices?.[0]?.message?.content?.trim()) {
|
|
44
|
+
throw new Error('Empty response from OpenAI API');
|
|
45
|
+
}
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error('❌ Failed to call OpenAI API:', error);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.completeMessages = completeMessages;
|
|
54
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/services/openai.ts"],"names":[],"mappings":";;;AA+BA;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,QAAyB,EACzB,OAEC,EACwB,EAAE;IAC3B,YAAY;IACZ,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAQ;YACvB,KAAK;YACL,QAAQ;YACR,WAAW,EAAE,CAAC,EAAE,qBAAqB;YACrC,0BAA0B;SAC3B,CAAC;QAEF,uBAAuB;QACvB,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;YAC7B,WAAW,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAmB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnD,OAAO;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAtDW,QAAA,gBAAgB,oBAsD3B"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单个文件的元数据缓存项
|
|
3
|
+
*/
|
|
4
|
+
export interface FileMetaData {
|
|
5
|
+
hash: string;
|
|
6
|
+
path: string;
|
|
7
|
+
links: string[];
|
|
8
|
+
metadata?: AIMetadata;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* .zen/meta.json 文件结构
|
|
12
|
+
*/
|
|
13
|
+
export interface MetaDataStore {
|
|
14
|
+
version: string;
|
|
15
|
+
options: BuildOptions;
|
|
16
|
+
files: FileMetaData[];
|
|
17
|
+
}
|
|
18
|
+
export interface BuildOptions {
|
|
19
|
+
template?: string;
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
langs?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface AIMetadata {
|
|
24
|
+
title: string;
|
|
25
|
+
summary: string;
|
|
26
|
+
tags: string[];
|
|
27
|
+
inferred_date?: string;
|
|
28
|
+
inferred_lang: string;
|
|
29
|
+
tokens_used?: {
|
|
30
|
+
prompt: number;
|
|
31
|
+
completion: number;
|
|
32
|
+
total: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertMarkdownToHtml.d.ts","sourceRoot":"","sources":["../../src/utils/convertMarkdownToHtml.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,KAAG,MAwEzD,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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.convertMarkdownToHtml = void 0;
|
|
7
|
+
const highlight_js_1 = __importDefault(require("highlight.js"));
|
|
8
|
+
const marked_1 = require("marked");
|
|
9
|
+
const marked_katex_extension_1 = __importDefault(require("marked-katex-extension"));
|
|
10
|
+
// 辅助函数:转义 HTML 特殊字符
|
|
11
|
+
function escapeHtml(unsafe) {
|
|
12
|
+
return unsafe
|
|
13
|
+
.replace(/&/g, '&')
|
|
14
|
+
.replace(/</g, '<')
|
|
15
|
+
.replace(/>/g, '>')
|
|
16
|
+
.replace(/"/g, '"')
|
|
17
|
+
.replace(/'/g, ''');
|
|
18
|
+
}
|
|
19
|
+
marked_1.marked.use((0, marked_katex_extension_1.default)({ throwOnError: false, nonStandard: true }));
|
|
20
|
+
/**
|
|
21
|
+
* 将 Markdown 内容转换为 HTML
|
|
22
|
+
* @param mdContent Markdown 内容字符串
|
|
23
|
+
* @returns 转换后的 HTML 字符串
|
|
24
|
+
*/
|
|
25
|
+
const convertMarkdownToHtml = (mdContent) => {
|
|
26
|
+
// 创建自定义渲染器
|
|
27
|
+
const renderer = new marked_1.marked.Renderer();
|
|
28
|
+
const originalCodeRenderer = renderer.code;
|
|
29
|
+
// 重写代码块渲染器以支持 Mermaid - 使用 any 类型绕过类型检查
|
|
30
|
+
renderer.code = function (code, language, isEscaped) {
|
|
31
|
+
// 在 marked 17+ 中,code 参数是一个对象,包含 text 和 lang 属性
|
|
32
|
+
const codeText = typeof code === 'string' ? code : code?.text || '';
|
|
33
|
+
// 语言信息在 code.lang 中,而不是 language 参数
|
|
34
|
+
const lang = code?.lang || language;
|
|
35
|
+
// 检测 Mermaid 代码块
|
|
36
|
+
if (lang === 'mermaid') {
|
|
37
|
+
// 生成唯一的 ID 用于图表容器
|
|
38
|
+
const chartId = 'mermaid-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
|
|
39
|
+
return `
|
|
40
|
+
<div class="mermaid-diagram" data-mermaid-id="${chartId}">
|
|
41
|
+
<pre class="mermaid">${escapeHtml(codeText)}</pre>
|
|
42
|
+
</div>
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
// 其他代码块使用原有高亮逻辑
|
|
46
|
+
return originalCodeRenderer.call(this, code, language, isEscaped);
|
|
47
|
+
};
|
|
48
|
+
// 使用 marked.parse 的同步版本
|
|
49
|
+
// marked 17+ 默认返回 Promise,但我们可以使用 marked.parseSync 或 marked.parse 的同步模式
|
|
50
|
+
// 这里我们使用 marked.parse 并假设它是同步的(对于简单情况)
|
|
51
|
+
try {
|
|
52
|
+
// 尝试同步解析
|
|
53
|
+
const result = marked_1.marked.parse(mdContent, {
|
|
54
|
+
renderer,
|
|
55
|
+
highlight: function (code, lang) {
|
|
56
|
+
// 跳过 Mermaid 代码块的高亮
|
|
57
|
+
if (lang === 'mermaid') {
|
|
58
|
+
return code;
|
|
59
|
+
}
|
|
60
|
+
if (lang && highlight_js_1.default.getLanguage(lang)) {
|
|
61
|
+
try {
|
|
62
|
+
return highlight_js_1.default.highlight(code, { language: lang }).value;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.warn(`Failed to highlight code with language ${lang}:`, err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return highlight_js_1.default.highlightAuto(code).value;
|
|
69
|
+
},
|
|
70
|
+
pedantic: false,
|
|
71
|
+
gfm: true,
|
|
72
|
+
breaks: false,
|
|
73
|
+
sanitize: false,
|
|
74
|
+
smartLists: true,
|
|
75
|
+
smartypants: false,
|
|
76
|
+
xhtml: false,
|
|
77
|
+
async: false, // 强制同步模式
|
|
78
|
+
});
|
|
79
|
+
// 如果结果是 Promise,等待它(虽然我们设置了 async: false)
|
|
80
|
+
if (result && typeof result.then === 'function') {
|
|
81
|
+
// 这不应该发生,但如果发生了,返回一个占位符
|
|
82
|
+
console.warn('marked.parse returned a Promise despite async: false');
|
|
83
|
+
return '<!-- Markdown conversion in progress -->';
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('Error converting Markdown to HTML:', error);
|
|
89
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
90
|
+
return `<div class="error">Error converting Markdown: ${errorMessage}</div>`;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.convertMarkdownToHtml = convertMarkdownToHtml;
|
|
94
|
+
//# sourceMappingURL=convertMarkdownToHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertMarkdownToHtml.js","sourceRoot":"","sources":["../../src/utils/convertMarkdownToHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG;IAAE,WAAW,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CASlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,gBAAgB,GAAG,KAAG,MAIxE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateFrontmatter = exports.parseFrontmatter = void 0;
|
|
4
|
+
const yaml_1 = require("yaml");
|
|
5
|
+
const parseFrontmatter = (content) => {
|
|
6
|
+
const frontmatterRegex = /^---\n([\s\S]*?)\n---/;
|
|
7
|
+
const match = content.match(frontmatterRegex);
|
|
8
|
+
if (match) {
|
|
9
|
+
const frontmatterContent = match[1];
|
|
10
|
+
const body = content.slice(match[0].length).trim();
|
|
11
|
+
return { frontmatter: (0, yaml_1.parse)(frontmatterContent.trim()), body };
|
|
12
|
+
}
|
|
13
|
+
return { frontmatter: {}, body: content };
|
|
14
|
+
};
|
|
15
|
+
exports.parseFrontmatter = parseFrontmatter;
|
|
16
|
+
const updateFrontmatter = (content, newFrontmatter) => {
|
|
17
|
+
const { body } = (0, exports.parseFrontmatter)(content);
|
|
18
|
+
const frontmatterContent = `---\n${(0, yaml_1.stringify)(newFrontmatter, { defaultStringType: 'QUOTE_DOUBLE' })}---\n\n`;
|
|
19
|
+
return frontmatterContent + body;
|
|
20
|
+
};
|
|
21
|
+
exports.updateFrontmatter = updateFrontmatter;
|
|
22
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":";;;AAAA,+BAAwC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAsC,EAAE;IACtF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO,EAAE,WAAW,EAAE,IAAA,YAAK,EAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B;AAEK,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,cAAmB,EAAU,EAAE;IAChF,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,kBAAkB,GAAG,QAAQ,IAAA,gBAAS,EAAC,cAAc,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,SAAS,CAAC;IAC7G,OAAO,kBAAkB,GAAG,IAAI,CAAC;AACnC,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/utils/sha256.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,GAAI,SAAS,MAAM,KAAG,MACW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sha256 = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const sha256 = (content) => (0, crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
6
|
+
exports.sha256 = sha256;
|
|
7
|
+
//# sourceMappingURL=sha256.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/utils/sha256.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAE7B,MAAM,MAAM,GAAG,CAAC,OAAe,EAAU,EAAE,CAChD,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AADxC,QAAA,MAAM,UACkC"}
|