diff --git a/src/components/GlossaryAside.astro b/src/components/GlossaryAside.astro new file mode 100644 index 0000000..8355148 --- /dev/null +++ b/src/components/GlossaryAside.astro @@ -0,0 +1,297 @@ +--- +const { + currentEntry, + allEntries = [], +} = Astro.props; + +const slugOf = (entry) => String(entry.id).replace(/\.(md|mdx)$/i, ""); +const hrefOf = (entry) => `/glossaire/${slugOf(entry)}/`; + +const collator = new Intl.Collator("fr", { sensitivity: "base", numeric: true }); +const bySlug = new Map(allEntries.map((entry) => [slugOf(entry), entry])); +const currentSlug = slugOf(currentEntry); + +const fondamentauxWanted = [ + "archicratie", + "tension", + "arcalite", + "cratialite", + "archicration", + "co-viabilite", +]; + +const fondamentaux = fondamentauxWanted + .map((slug) => bySlug.get(slug)) + .filter(Boolean); + +function resolveList(slugs = []) { + return slugs + .map((slug) => bySlug.get(slug)) + .filter(Boolean); +} + +function uniqueBySlug(entries) { + const seen = new Set(); + const out = []; + for (const entry of entries) { + const slug = slugOf(entry); + if (seen.has(slug)) continue; + seen.add(slug); + out.push(entry); + } + return out; +} + +const relatedEntries = uniqueBySlug(resolveList(currentEntry.data.related ?? [])) + .sort((a, b) => collator.compare(a.data.term, b.data.term)); + +const opposedEntries = uniqueBySlug(resolveList(currentEntry.data.opposedTo ?? [])) + .sort((a, b) => collator.compare(a.data.term, b.data.term)); + +const seeAlsoEntries = uniqueBySlug(resolveList(currentEntry.data.seeAlso ?? [])) + .sort((a, b) => collator.compare(a.data.term, b.data.term)); + +const paradigmes = [...allEntries] + .filter((e) => e.data.kind === "paradigme" && slugOf(e) !== currentSlug) + .sort((a, b) => collator.compare(a.data.term, b.data.term)); + +function contextualParadigmsFor(entry) { + const relatedParadigms = (entry.data.related ?? []) + .map((slug) => bySlug.get(slug)) + .filter((e) => e && e.data.kind === "paradigme"); + + const seeAlsoParadigms = (entry.data.seeAlso ?? []) + .map((slug) => bySlug.get(slug)) + .filter((e) => e && e.data.kind === "paradigme"); + + const opposedParadigms = (entry.data.opposedTo ?? []) + .map((slug) => bySlug.get(slug)) + .filter((e) => e && e.data.kind === "paradigme"); + + const merged = uniqueBySlug([ + ...relatedParadigms, + ...seeAlsoParadigms, + ...opposedParadigms, + ]); + + if (merged.length > 0) { + return merged.slice(0, 5); + } + + if (entry.data.kind === "paradigme") { + const preferred = [ + "gouvernementalite", + "gouvernementalite-algorithmique", + "cybernetique", + "biopolitique", + "bureaucratie", + "contractualisme-hobbesien", + "liberalisme-proprietaire", + "volonte-generale", + ]; + + return uniqueBySlug( + preferred + .filter((slug) => slug !== currentSlug) + .map((slug) => bySlug.get(slug)) + .filter(Boolean) + ).slice(0, 5); + } + + return paradigmes.slice(0, 4); +} + +const contextualParadigms = contextualParadigmsFor(currentEntry); + +const kindLabels = { + concept: "Concept", + diagnostic: "Diagnostic", + topologie: "Topologie", + verbe: "Verbe", + paradigme: "Paradigme", +}; + +const domainLabels = { + transversal: "Transversal", + theorie: "Théorie", + "cas-ia": "Cas IA", +}; + +const levelLabels = { + fondamental: "Fondamental", + intermediaire: "Intermédiaire", + avance: "Avancé", +}; + +const metaLabel = [ + kindLabels[currentEntry.data.kind] ?? currentEntry.data.kind, + domainLabels[currentEntry.data.domain] ?? currentEntry.data.domain, + levelLabels[currentEntry.data.level] ?? currentEntry.data.level, +].join(" · "); +--- + + + + \ No newline at end of file diff --git a/src/pages/glossaire/[...slug].astro b/src/pages/glossaire/[...slug].astro index aed8f34..da3cdca 100644 --- a/src/pages/glossaire/[...slug].astro +++ b/src/pages/glossaire/[...slug].astro @@ -1,9 +1,11 @@ --- import EditionLayout from "../../layouts/EditionLayout.astro"; +import GlossaryAside from "../../components/GlossaryAside.astro"; import { getCollection, render } from "astro:content"; export async function getStaticPaths() { const entries = await getCollection("glossaire"); + return entries.map((entry) => ({ params: { slug: String(entry.id).replace(/\.(md|mdx)$/i, "") }, props: { entry }, @@ -11,6 +13,7 @@ export async function getStaticPaths() { } const { entry } = Astro.props; +const allEntries = await getCollection("glossaire"); const { Content } = await render(entry); --- @@ -18,11 +21,15 @@ const { Content } = await render(entry); title={entry.data.title} editionLabel="Glossaire" editionKey="glossaire" - statusLabel="référentiel" + statusLabel="Référentiel" statusKey="referentiel" level={1} version={entry.data.version} > + + + +

{entry.data.term}

{entry.data.definitionShort}