--- import { getCollection, render } from "astro:content"; import TocList from "../../components/TocList.astro"; import Base from "../../layouts/Base.astro"; export async function getStaticPaths() { const writings = await getCollection("writings", ({ data }) => !data.draft); return writings.map((entry) => ({ params: { slug: entry.id }, props: { entry }, })); } const { entry } = Astro.props; const { Content, headings } = await render(entry); const allWritings = ( await getCollection("writings", ({ data }) => !data.draft) ).sort((a, b) => a.data.date.valueOf() - b.data.date.valueOf()); const index = allWritings.findIndex((w) => w.id === entry.id); const prev = index > 0 ? allWritings[index - 1] : undefined; const next = index < allWritings.length - 1 ? allWritings[index + 1] : undefined; const series = entry.data.extra?.series; const seriesEntries = series ? allWritings .filter((w) => w.data.extra?.series === series) .sort( (a, b) => (a.data.extra?.series_index ?? 0) - (b.data.extra?.series_index ?? 0), ) : []; const tags = entry.data.taxonomies?.tags ?? []; const related = tags.length ? allWritings .filter((w) => w.id !== entry.id) .map((w) => ({ entry: w, overlap: (w.data.taxonomies?.tags ?? []).filter((t) => tags.includes(t)) .length, })) .filter((w) => w.overlap > 0) .sort((a, b) => b.overlap - a.overlap) .slice(0, 3) .map((w) => w.entry) : []; const description = entry.data.extra?.llms_description ?? entry.data.description; const tocHeadings = headings.filter((h) => h.depth <= 3); ---

{entry.data.title}

{entry.data.date.toDateString()} {entry.data.readingMinutes && <> · {entry.data.readingMinutes} min read} {entry.data.updated && <> · updated {entry.data.updated.toDateString()}}

{tags.map((tag) => #{tag})} { series && ( ) } { tocHeadings.length > 0 && ( ) }
{ related.length > 0 && (

Related Posts

{related.map((w) => ( ))}
) }
{ tocHeadings.length > 0 && ( ) }