增加多级目录
This commit is contained in:
parent
f110beb5dc
commit
339e637a50
@ -12,92 +12,54 @@ export async function getStaticPaths() {
|
|||||||
const articles = await getCollection('articles');
|
const articles = await getCollection('articles');
|
||||||
const views = ['grid', 'timeline'];
|
const views = ['grid', 'timeline'];
|
||||||
|
|
||||||
// 为每篇文章添加section信息
|
|
||||||
const articlesWithSections = articles.map(article => {
|
|
||||||
// 查找文章所属的目录
|
|
||||||
let section = '';
|
|
||||||
const findSection = (sections: SectionStructure[], articleId: string, parentPath = ''): string | null => {
|
|
||||||
for (const sec of sections) {
|
|
||||||
const sectionPath = parentPath ? `${parentPath}/${sec.name}` : sec.name;
|
|
||||||
|
|
||||||
// 检查文章是否在当前目录中
|
|
||||||
for (const artPath of sec.articles) {
|
|
||||||
const artId = getRelativePath(artPath);
|
|
||||||
const basename = getBasename(artPath);
|
|
||||||
const dirPath = getDirPath(artPath);
|
|
||||||
|
|
||||||
// 尝试多种可能的ID格式
|
|
||||||
const possibleIds = [
|
|
||||||
artId, // 完整相对路径
|
|
||||||
`${sectionPath}/${basename}`, // 目录路径/文件名
|
|
||||||
basename, // 仅文件名
|
|
||||||
dirPath ? `${dirPath}/${basename}` : basename, // 目录路径/文件名
|
|
||||||
`articles/${artId}`, // 添加集合名称前缀
|
|
||||||
`articles/${sectionPath}/${basename}` // 添加集合名称前缀和目录路径
|
|
||||||
];
|
|
||||||
|
|
||||||
// 精确匹配(不区分大小写)
|
|
||||||
if (possibleIds.some(id => id.toLowerCase() === articleId.toLowerCase())) {
|
|
||||||
return sectionPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查文章ID是否以某个可能的ID结尾(不区分大小写)
|
|
||||||
for (const possibleId of possibleIds) {
|
|
||||||
if (articleId.toLowerCase().endsWith(possibleId.toLowerCase())) {
|
|
||||||
return sectionPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 递归检查子目录
|
|
||||||
const foundInSubsection = findSection(sec.sections, articleId, sectionPath);
|
|
||||||
if (foundInSubsection) {
|
|
||||||
return foundInSubsection;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
section = findSection(contentStructure.sections, article.id) || '';
|
|
||||||
|
|
||||||
return {
|
|
||||||
...article,
|
|
||||||
section
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// 为每篇文章生成路由参数
|
// 为每篇文章生成路由参数
|
||||||
const paths = [];
|
const paths = [];
|
||||||
for (const article of articlesWithSections) {
|
for (const article of articles) {
|
||||||
// 检查文章ID是否需要特殊处理
|
// 获取所有可能的路径形式
|
||||||
const specialId = getSpecialPath(article.id);
|
const possiblePaths = new Set([
|
||||||
|
article.id // 只保留原始路径
|
||||||
// 添加基本路由
|
]);
|
||||||
paths.push({
|
|
||||||
params: { id: specialId },
|
// 如果是多级目录,检查是否需要特殊处理
|
||||||
props: {
|
if (article.id.includes('/')) {
|
||||||
article,
|
const parts = article.id.split('/');
|
||||||
section: article.section,
|
const fileName = parts[parts.length - 1];
|
||||||
originalId: specialId !== article.id ? article.id : undefined,
|
const dirName = parts[parts.length - 2];
|
||||||
view: undefined
|
|
||||||
|
// 只有当文件名与其父目录名相同时才添加特殊路径
|
||||||
|
if (fileName === dirName) {
|
||||||
|
possiblePaths.add(getSpecialPath(article.id));
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
// 为每个视图添加路由
|
// 为每个可能的路径生成路由
|
||||||
for (const view of views) {
|
for (const path of possiblePaths) {
|
||||||
|
// 添加基本路由
|
||||||
paths.push({
|
paths.push({
|
||||||
params: { id: `${specialId}/${view}` },
|
params: { id: path },
|
||||||
props: {
|
props: {
|
||||||
article,
|
article,
|
||||||
section: article.section,
|
section: article.id.includes('/') ? article.id.split('/').slice(0, -1).join('/') : '',
|
||||||
originalId: specialId !== article.id ? article.id : undefined,
|
originalId: path !== article.id ? article.id : undefined,
|
||||||
view
|
view: undefined
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 为每个视图添加路由
|
||||||
|
for (const view of views) {
|
||||||
|
paths.push({
|
||||||
|
params: { id: `${path}/${view}` },
|
||||||
|
props: {
|
||||||
|
article,
|
||||||
|
section: article.id.includes('/') ? article.id.split('/').slice(0, -1).join('/') : '',
|
||||||
|
originalId: path !== article.id ? article.id : undefined,
|
||||||
|
view
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,21 +66,28 @@ const { props } = Astro;
|
|||||||
|
|
||||||
// 解析路径参数
|
// 解析路径参数
|
||||||
const pathParts = (Astro.params.path as string | undefined)?.split('/') || [];
|
const pathParts = (Astro.params.path as string | undefined)?.split('/') || [];
|
||||||
|
|
||||||
|
// 初始化变量
|
||||||
let path = '';
|
let path = '';
|
||||||
let tag = '';
|
let tag = '';
|
||||||
let view = 'grid';
|
let view = 'grid';
|
||||||
|
|
||||||
if (pathParts[0] === 'tag' && pathParts.length >= 2) {
|
if (pathParts[0] === 'tag' && pathParts.length >= 2) {
|
||||||
// 标签路径
|
// 标签路径处理
|
||||||
tag = pathParts[1];
|
tag = pathParts[1];
|
||||||
view = pathParts[2] || 'grid';
|
view = pathParts[2] || 'grid';
|
||||||
} else if (['grid', 'timeline'].includes(pathParts[pathParts.length - 1])) {
|
|
||||||
// 视图路径
|
|
||||||
view = pathParts.pop() || 'grid';
|
|
||||||
path = pathParts.join('/');
|
|
||||||
} else {
|
} else {
|
||||||
// 普通目录路径
|
// 处理普通路径和视图
|
||||||
path = Astro.params.path || '';
|
const lastPart = pathParts[pathParts.length - 1];
|
||||||
|
|
||||||
|
if (['grid', 'timeline'].includes(lastPart)) {
|
||||||
|
// 如果最后一部分是视图类型,则移除它并设置视图
|
||||||
|
view = lastPart;
|
||||||
|
pathParts.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 剩余的部分都作为路径
|
||||||
|
path = pathParts.join('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 合并属性
|
// 合并属性
|
||||||
|
Loading…
Reference in New Issue
Block a user