feat: make archive page dynamic (#469)

This commit is contained in:
saica.go
2025-05-30 00:21:07 +08:00
committed by GitHub
parent c5d95736ac
commit 2d89e4d53f
12 changed files with 172 additions and 201 deletions
+14
View File
@@ -0,0 +1,14 @@
---
import ArchivePanel from "@components/ArchivePanel.svelte";
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
import MainGridLayout from "@layouts/MainGridLayout.astro";
import { getSortedPosts } from "../utils/content-utils";
const sortedPosts = await getSortedPosts();
---
<MainGridLayout title={i18n(I18nKey.archive)}>
<ArchivePanel sortedPosts={sortedPosts} client:only="svelte"></ArchivePanel>
</MainGridLayout>
@@ -1,45 +0,0 @@
---
import ArchivePanel from "@components/ArchivePanel.astro";
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
import MainGridLayout from "@layouts/MainGridLayout.astro";
import { getCategoryList } from "@utils/content-utils";
export async function getStaticPaths() {
const categories = await getCategoryList();
const standardPaths = categories.map((category) => {
return {
params: {
category: encodeURIComponent(category.name.trim()),
},
props: {
decodedCategory: category.name.trim(),
},
};
});
const nonEncodedCJKPaths = categories
.filter((category) =>
/[\u3000-\u9fff\uac00-\ud7af\u4e00-\u9faf]/.test(category.name),
)
.map((category) => ({
params: {
category: category.name.trim(), // Do not encode CJK characters
},
props: {
decodedCategory: category.name.trim(),
},
}));
return [...standardPaths, ...nonEncodedCJKPaths];
}
const { decodedCategory } = Astro.props;
const category =
decodedCategory || decodeURIComponent(Astro.params.category as string);
---
<MainGridLayout title={i18n(I18nKey.archive)} description={i18n(I18nKey.archive)}>
<ArchivePanel categories={[category]}></ArchivePanel>
</MainGridLayout>
@@ -1,11 +0,0 @@
---
import ArchivePanel from "@components/ArchivePanel.astro";
import { UNCATEGORIZED } from "@constants/constants";
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
import MainGridLayout from "@layouts/MainGridLayout.astro";
---
<MainGridLayout title={i18n(I18nKey.archive)}>
<ArchivePanel categories={[UNCATEGORIZED]}></ArchivePanel>
</MainGridLayout>
-11
View File
@@ -1,11 +0,0 @@
---
import ArchivePanel from "@components/ArchivePanel.astro";
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
import MainGridLayout from "@layouts/MainGridLayout.astro";
---
<MainGridLayout title={i18n(I18nKey.archive)}>
<ArchivePanel></ArchivePanel>
</MainGridLayout>
-64
View File
@@ -1,64 +0,0 @@
---
import ArchivePanel from "@components/ArchivePanel.astro";
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
import MainGridLayout from "@layouts/MainGridLayout.astro";
import { getSortedPosts } from "@utils/content-utils";
import { decodePathSegment, encodePathSegment } from "@utils/encoding-utils";
export async function getStaticPaths() {
const posts = await getSortedPosts();
const allTags = posts.reduce<Set<string>>((acc, post) => {
if (Array.isArray(post.data.tags)) {
// biome-ignore lint/complexity/noForEach: <explanation>
post.data.tags.forEach((tag) => {
if (typeof tag === "string") {
acc.add(tag.trim());
} else {
acc.add(String(tag).trim());
}
});
} else if (post.data.tags && typeof post.data.tags === "string") {
// biome-ignore lint/complexity/noForEach: <explanation>
(post.data.tags as string)
.split(",")
.forEach((tag) => acc.add(tag.trim()));
}
return acc;
}, new Set());
const allTagsArray = Array.from(allTags);
// judge if the string is CJK
const isCJK = (str: string) =>
/[\u3000-\u9fff\uac00-\ud7af\u4e00-\u9faf]/.test(str);
const standardPaths = allTagsArray.map((tag) => ({
params: {
tag: encodePathSegment(tag),
},
props: {
decodedTag: tag,
},
}));
const nonEncodedCJKPaths = allTagsArray.filter(isCJK).map((tag) => ({
params: {
tag: tag, // keep CJK characters unencoded
},
props: {
decodedTag: tag,
},
}));
return [...standardPaths, ...nonEncodedCJKPaths];
}
const { decodedTag } = Astro.props;
const tag = decodedTag || decodePathSegment(Astro.params.tag as string);
---
<MainGridLayout title={i18n(I18nKey.archive)} description={i18n(I18nKey.archive)}>
<ArchivePanel tags={[tag]}></ArchivePanel>
</MainGridLayout>