From 81b53bd3f72c1490de153e04d10f7bf3e4d433ff Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Mon, 21 Jul 2025 14:22:57 +0800 Subject: [PATCH] refactor(docs): added content loader --- .../functions/all-documents.data.ts | 45 +++++++++++++++++++ .../{theme => functions}/blog.data.ts | 21 ++------- .../{theme => functions}/chronicles.data.ts | 21 ++------- docs/.vitepress/functions/utils.ts | 16 +++++++ docs/content/en/blog/index.md | 2 +- docs/content/zh-Hans/blog/index.md | 2 +- 6 files changed, 69 insertions(+), 38 deletions(-) create mode 100644 docs/.vitepress/functions/all-documents.data.ts rename docs/.vitepress/{theme => functions}/blog.data.ts (80%) rename docs/.vitepress/{theme => functions}/chronicles.data.ts (80%) create mode 100644 docs/.vitepress/functions/utils.ts diff --git a/docs/.vitepress/functions/all-documents.data.ts b/docs/.vitepress/functions/all-documents.data.ts new file mode 100644 index 000000000..89cc6eb74 --- /dev/null +++ b/docs/.vitepress/functions/all-documents.data.ts @@ -0,0 +1,45 @@ +import type { SiteConfig } from 'vitepress' + +import { createContentLoader } from 'vitepress' + +import { formatDate } from './utils' + +const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG + +interface Document { + title: string + url: string + urlWithoutLang: string + lang: string + date: ReturnType + frontmatter?: Record +} + +declare const data: Document[] +export { data } + +export default createContentLoader('**/*.md', { + transform(raw): Document[] { + return raw + .map(({ url, frontmatter }) => { + const foundLanguage = Object.values(config.userConfig.locales!).find((locale) => { + let normalizedLanguagePrefix = locale.lang || 'en' + if (!normalizedLanguagePrefix.startsWith('/')) { + normalizedLanguagePrefix = `/${normalizedLanguagePrefix}` + } + + return url.startsWith(normalizedLanguagePrefix) + }) + + return { + title: frontmatter.title, + url, + urlWithoutLang: url.replace(`/${foundLanguage?.lang || 'en'}`, ''), + date: formatDate(frontmatter.date), + lang: foundLanguage?.lang || 'en', + frontmatter, + } + }) + .sort((a, b) => b.date.time - a.date.time) + }, +}) diff --git a/docs/.vitepress/theme/blog.data.ts b/docs/.vitepress/functions/blog.data.ts similarity index 80% rename from docs/.vitepress/theme/blog.data.ts rename to docs/.vitepress/functions/blog.data.ts index b5759c4eb..a0c7e263a 100644 --- a/docs/.vitepress/theme/blog.data.ts +++ b/docs/.vitepress/functions/blog.data.ts @@ -2,6 +2,8 @@ import type { SiteConfig } from 'vitepress' import { createContentLoader } from 'vitepress' +import { formatDate } from './utils' + const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG interface Post { @@ -9,10 +11,7 @@ interface Post { url: string urlWithoutLang: string lang: string - date: { - time: number - string: string - } + date: ReturnType excerpt: string | undefined frontmatter?: Record } @@ -49,17 +48,3 @@ export default createContentLoader('**/blog/**/*.md', { .sort((a, b) => b.date.time - a.date.time) }, }) - -function formatDate(raw: string): Post['date'] { - const date = new Date(raw) - date.setUTCHours(12) - - return { - time: +date, - string: date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', - }), - } -} diff --git a/docs/.vitepress/theme/chronicles.data.ts b/docs/.vitepress/functions/chronicles.data.ts similarity index 80% rename from docs/.vitepress/theme/chronicles.data.ts rename to docs/.vitepress/functions/chronicles.data.ts index 8ffa4e90c..cd392b742 100644 --- a/docs/.vitepress/theme/chronicles.data.ts +++ b/docs/.vitepress/functions/chronicles.data.ts @@ -2,6 +2,8 @@ import type { SiteConfig } from 'vitepress' import { createContentLoader } from 'vitepress' +import { formatDate } from './utils' + const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG interface ChronicleEntry { @@ -9,10 +11,7 @@ interface ChronicleEntry { url: string urlWithoutLang: string lang: string - date: { - time: number - string: string - } + date: ReturnType excerpt: string | undefined frontmatter?: Record } @@ -49,17 +48,3 @@ export default createContentLoader('**/chronicles/**/*.md', { .sort((a, b) => b.date.time - a.date.time) }, }) - -function formatDate(raw: string): ChronicleEntry['date'] { - const date = new Date(raw) - date.setUTCHours(12) - - return { - time: +date, - string: date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', - }), - } -} diff --git a/docs/.vitepress/functions/utils.ts b/docs/.vitepress/functions/utils.ts new file mode 100644 index 000000000..3a5de409a --- /dev/null +++ b/docs/.vitepress/functions/utils.ts @@ -0,0 +1,16 @@ +export function formatDate(raw: string): { + time: number + string: string +} { + const date = new Date(raw) + date.setUTCHours(12) + + return { + time: +date, + string: date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }), + } +} diff --git a/docs/content/en/blog/index.md b/docs/content/en/blog/index.md index f8513387f..46db7e811 100644 --- a/docs/content/en/blog/index.md +++ b/docs/content/en/blog/index.md @@ -5,7 +5,7 @@ community: false --- diff --git a/docs/content/zh-Hans/blog/index.md b/docs/content/zh-Hans/blog/index.md index f8513387f..46db7e811 100644 --- a/docs/content/zh-Hans/blog/index.md +++ b/docs/content/zh-Hans/blog/index.md @@ -5,7 +5,7 @@ community: false ---