--- import { type CollectionEntry, getCollection } from 'astro:content'; import getReadingTime from 'reading-time'; import { readItems, readSingleton } from '@directus/sdk'; import directus from '@lib/directus'; import { marked } from 'marked'; import markedShiki from 'marked-shiki'; import { createHighlighter } from 'shiki'; import { getDirectusImageURL } from '@lib/directusFunctions'; import BaseLayout from '@layouts/BaseLayout.astro'; import Image from '@components/ui/images/Image.astro'; import { formatDateTime } from '@support/time'; export async function getStaticPaths() { const posts = await directus.request(readItems('posts')); return posts.map((post) => ({ params: { slug: post.slug }, props: post, })); } const post = Astro.props; const global = await directus.request(readSingleton('site_global')); const category: CollectionEntry<'categories'> = (await getCollection('categories')) .filter((c) => c.slug === post.category) .pop() as CollectionEntry<'categories'>; const readingTime = getReadingTime(post.content); const highlighter = await createHighlighter({ themes: ['github-light', 'github-dark', 'monokai'], langs: ['typescript', 'python', 'css', 'html', 'yaml', 'bash', 'json'], }); marked.use(markedShiki({ highlight(code, lang) { return highlighter.codeToHtml(code, { lang: lang || 'plaintext', themes: { light: 'github-light', dark: 'github-dark', }, defaultColor: false, }); } })); const content = marked.parse(post.content); --- {post.title} {category?.data?.title} {formatDateTime(post.published_date)} {readingTime.minutes.toPrecision(1)} minutes to read { post.tags.map((tag: string) => ( {tag} )) }