--- import { render } from "astro:content"; import * as path from "node:path"; import Comment from "@components/comment/index.astro"; import License from "@components/misc/License.astro"; import Markdown from "@components/misc/Markdown.astro"; import I18nKey from "@i18n/i18nKey"; import { i18n } from "@i18n/translation"; import MainGridLayout from "@layouts/MainGridLayout.astro"; import { getSortedPosts } from "@utils/content-utils"; import { getFileDirFromPath, getPostUrlBySlug, removeFileExtension, } from "@utils/url-utils"; import { Icon } from "astro-icon/components"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import PostMetadata from "@/components/content/PostMeta.astro"; import RandomCoverImage from "@/components/misc/RandomCoverImage.astro"; import SharePoster from "@/components/misc/SharePoster.svelte"; import { coverImageConfig } from "@/config/coverImageConfig"; import { licenseConfig } from "@/config/licenseConfig"; import { profileConfig } from "@/config/profileConfig"; import { siteConfig } from "@/config/siteConfig"; import { sponsorConfig } from "@/config/sponsorConfig"; import { formatDateToYYYYMMDD } from "@/utils/date-utils"; import { processCoverImageSync } from "@/utils/image-utils"; import { url } from "@/utils/url-utils"; export async function getStaticPaths() { const blogEntries = await getSortedPosts(); return blogEntries.map((entry) => { // 将 id 转换为 slug(移除扩展名)以匹配路由参数 const slug = removeFileExtension(entry.id); return { params: { slug }, props: { entry }, }; }); } const { entry } = Astro.props; const { Content, headings } = await render(entry); const { remarkPluginFrontmatter } = await render(entry); // 处理随机图:如果image为"api",则从配置的API获取随机图 const processedImage = processCoverImageSync(entry.data.image, entry.id); let posterCoverUrl = processedImage; if (processedImage) { const isLocal = !( processedImage.startsWith("/") || processedImage.startsWith("http") || processedImage.startsWith("https") || processedImage.startsWith("data:") ); if (isLocal) { const basePath = getFileDirFromPath(entry.filePath || ""); const files = import.meta.glob("../../**", { import: "default", }); let normalizedPath = path .normalize(path.join("../../", basePath, processedImage)) .replace(/\\/g, "/"); const file = files[normalizedPath]; if (file) { const img = await file(); posterCoverUrl = img.src; } } } dayjs.extend(utc); const jsonLd = { "@context": "https://schema.org", "@type": "BlogPosting", headline: entry.data.title, description: entry.data.description || entry.data.title, keywords: entry.data.tags, author: { "@type": "Person", name: profileConfig.name, url: Astro.site, }, datePublished: formatDateToYYYYMMDD(entry.data.published), inLanguage: entry.data.lang ? entry.data.lang.replace("_", "-") : siteConfig.lang.replace("_", "-"), // TODO include cover image here }; ---