Files
archicratie-edition/src/pages/glossaire/[...slug].astro
Archicratia e6c18d6b16
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 44s
refactor(glossaire): componentize glossary entry page
2026-03-25 19:18:58 +01:00

103 lines
2.9 KiB
Plaintext

---
import GlossaryLayout from "../../layouts/GlossaryLayout.astro";
import GlossaryAside from "../../components/GlossaryAside.astro";
import GlossaryRelationCards from "../../components/GlossaryRelationCards.astro";
import GlossaryEntryLegacyNote from "../../components/GlossaryEntryLegacyNote.astro";
import GlossaryEntryHero from "../../components/GlossaryEntryHero.astro";
import GlossaryEntryBody from "../../components/GlossaryEntryBody.astro";
import GlossaryEntryStickySync from "../../components/GlossaryEntryStickySync.astro";
import { getCollection, render } from "astro:content";
import {
getDisplayDomain,
getDisplayFamily,
getDisplayLevel,
getRelationBlocks,
normalizeGlossarySlug,
} from "../../lib/glossary";
export async function getStaticPaths() {
const entries = await getCollection("glossaire");
const paths = [];
const seen = new Set();
for (const entry of entries) {
const canonicalSlug = normalizeGlossarySlug(entry.id);
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(canonicalSlug)) continue;
const addPath = (rawSlug) => {
const requestedSlug = normalizeGlossarySlug(rawSlug);
if (!requestedSlug) return;
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(requestedSlug)) return;
if (seen.has(requestedSlug)) return;
seen.add(requestedSlug);
paths.push({
params: { slug: requestedSlug },
props: {
entry,
requestedSlug,
canonicalSlug,
},
});
};
addPath(canonicalSlug);
for (const alias of entry.data.urlAliases ?? []) {
addPath(alias);
}
}
return paths;
}
const { entry, requestedSlug, canonicalSlug } = Astro.props;
const allEntries = await getCollection("glossaire");
const { Content } = await render(entry);
const isAliasRoute = requestedSlug !== canonicalSlug;
const canonicalHref = `/glossaire/${canonicalSlug}/`;
const relationBlocks = getRelationBlocks(entry, allEntries);
const displayFamily = getDisplayFamily(entry);
const displayDomain = getDisplayDomain(entry);
const displayLevel = getDisplayLevel(entry);
---
<GlossaryLayout
title={entry.data.title}
version={entry.data.version}
stickyMode="glossary-entry"
>
<Fragment slot="aside">
<GlossaryAside currentEntry={entry} allEntries={allEntries} />
</Fragment>
{isAliasRoute && (
<GlossaryEntryLegacyNote
canonicalHref={canonicalHref}
term={entry.data.term}
/>
)}
<GlossaryEntryHero
term={entry.data.term}
definitionShort={entry.data.definitionShort}
displayFamily={displayFamily}
displayDomain={displayDomain}
displayLevel={displayLevel}
mobilizedAuthors={entry.data.mobilizedAuthors ?? []}
comparisonTraditions={entry.data.comparisonTraditions ?? []}
/>
<GlossaryEntryBody>
<Content />
</GlossaryEntryBody>
<GlossaryRelationCards relationBlocks={relationBlocks} />
<GlossaryEntryStickySync />
</GlossaryLayout>