fix: 修复外部资源、图标模式与嵌套交互(#30)

Fixes: https://github.com/rbetree/menav/issues/30

- Font Awesome:bootcdn→Cloudflare cdnjs
- favicon:gstatic `.com` 失败自动回退 `.cn`
- `icons.mode`:修复 `site.yml` 配置未生效(提升到顶层)
- 站点级图标覆盖:支持 `faviconUrl` / `forceIconMode`(优先级:`faviconUrl` > `forceIconMode` > `icons.mode`)
- 折叠交互:恢复二级分组折叠按钮(桌面端悬停显示)
- 新标签页:递归补齐多级 `sites.external` 默认值
This commit is contained in:
rbetree
2026-01-02 14:58:53 +08:00
parent d2ceeb674f
commit 30d50ebcd7
13 changed files with 613 additions and 97 deletions

View File

@@ -0,0 +1,49 @@
const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const { loadConfig } = require('../src/generator.js');
function withTempCwd(callback) {
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'menav-icons-mode-test-'));
const originalCwd = process.cwd();
try {
process.chdir(tmpDir);
callback(tmpDir);
} finally {
process.chdir(originalCwd);
fs.rmSync(tmpDir, { recursive: true, force: true });
}
}
test('site.yml 的 icons.mode 应提升为顶层 icons.modemanual 不应被默认 favicon 覆盖)', () => {
withTempCwd((tmpDir) => {
const defaultConfigDir = path.join(tmpDir, 'config', '_default');
fs.mkdirSync(defaultConfigDir, { recursive: true });
fs.writeFileSync(
path.join(defaultConfigDir, 'site.yml'),
['title: Test', 'icons:', ' mode: manual', ''].join('\n'),
'utf8'
);
const config = loadConfig();
assert.equal(config.icons.mode, 'manual');
});
});
test('未配置 icons.mode 时应回退为默认 favicon', () => {
withTempCwd((tmpDir) => {
const defaultConfigDir = path.join(tmpDir, 'config', '_default');
fs.mkdirSync(defaultConfigDir, { recursive: true });
fs.writeFileSync(path.join(defaultConfigDir, 'site.yml'), 'title: Test\n', 'utf8');
const config = loadConfig();
assert.equal(config.icons.mode, 'favicon');
});
});