初始化仓库
初始化仓库
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const ROOT = process.cwd();
|
||||
const SKILL = '/Users/huanghui/.codebuddy/skills/halo-theme-dev/assets/theme-vite';
|
||||
|
||||
// 1. 创建目录
|
||||
for (const d of ['src', 'src/partials', 'src/css', 'src/js']) {
|
||||
fs.mkdirSync(path.join(ROOT, d), { recursive: true });
|
||||
}
|
||||
|
||||
// 2. 复制构建配置
|
||||
fs.copyFileSync(path.join(SKILL, 'package.json'), path.join(ROOT, 'package.json'));
|
||||
fs.copyFileSync(path.join(SKILL, 'vite.config.ts'), path.join(ROOT, 'vite.config.ts'));
|
||||
console.log('✓ 已复制 package.json / vite.config.ts');
|
||||
|
||||
// 3. 从 templates/index.html 提取 layout 骨架
|
||||
const idx = fs.readFileSync(path.join(ROOT, 'templates/index.html'), 'utf8');
|
||||
const header = idx.match(/<header class="site-header">[\s\S]*?<\/header>/)[0];
|
||||
const footer = idx.match(/<footer class="site-footer">[\s\S]*?<\/footer>/)[0];
|
||||
|
||||
const layout = `<!doctype html>
|
||||
<html
|
||||
lang="zh-CN"
|
||||
xmlns:th="https://www.thymeleaf.org"
|
||||
th:lang="\${#locale.toLanguageTag}"
|
||||
class="color-scheme-auto"
|
||||
data-color-scheme="auto"
|
||||
>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<slot name="head">
|
||||
<title th:text="\${site.title}">源蝶工作室</title>
|
||||
</slot>
|
||||
<script type="module" src="./js/main.ts"></script>
|
||||
</head>
|
||||
<body
|
||||
th:style="'--primary-color:' + (\${theme.config.style?.primary_color} ?: '#2563eb') + ';--radius:' + (\${theme.config.style?.border_radius} ?: '12px')"
|
||||
th:with="brandName = \${theme.config.brand?.brand_name ?: site.title}"
|
||||
>
|
||||
${header}
|
||||
|
||||
<main class="site-main">
|
||||
<slot />
|
||||
</main>
|
||||
|
||||
${footer}
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
fs.writeFileSync(path.join(ROOT, 'src/partials/layout.html'), layout);
|
||||
console.log('✓ 已生成 src/partials/layout.html');
|
||||
|
||||
// 4. 反推各页面(include + template + main 内容)
|
||||
const pages = [
|
||||
'index', 'post', 'category', 'tag', 'page',
|
||||
'archives', 'author', 'categories', 'tags'
|
||||
];
|
||||
|
||||
for (const name of pages) {
|
||||
const tpl = fs.readFileSync(path.join(ROOT, `templates/${name}.html`), 'utf8');
|
||||
const titleM = tpl.match(/<title[^>]*>[\s\S]*?<\/title>/);
|
||||
const mainM = tpl.match(/<main class="site-main">([\s\S]*?)<\/main>/);
|
||||
if (!mainM) {
|
||||
console.log('⚠ 跳过(无 main):', name);
|
||||
continue;
|
||||
}
|
||||
const title = titleM ? titleM[0] : `<title th:text="\${site.title}"></title>`;
|
||||
const content = mainM[1].replace(/\n$/, '');
|
||||
const out = `<include src="layout.html">
|
||||
<template name="head">
|
||||
${title}
|
||||
</template>
|
||||
${content}
|
||||
</include>
|
||||
`;
|
||||
fs.writeFileSync(path.join(ROOT, `src/${name}.html`), out);
|
||||
console.log('✓ 反推 src/' + name + '.html');
|
||||
}
|
||||
|
||||
// 5. 复制 fragment 文件(不含 layout,直接复制)
|
||||
for (const f of ['header-menu.html', 'user-menu.html', 'sidebar.html']) {
|
||||
fs.copyFileSync(path.join(ROOT, `templates/${f}`), path.join(ROOT, `src/${f}`));
|
||||
console.log('✓ 复制 src/' + f);
|
||||
}
|
||||
|
||||
console.log('\n全部 html 反推完成');
|
||||
Reference in New Issue
Block a user