From ad06b34a857f45161f876865cc29d7016320c142 Mon Sep 17 00:00:00 2001 From: Archicratia Date: Wed, 25 Mar 2026 14:15:39 +0100 Subject: [PATCH] refactor(glossaire): centralize glossary relation helpers --- src/components/GlossaryAside.astro | 280 +++--------------- src/components/GlossaryHomeAside.astro | 79 +---- src/lib/glossary.ts | 385 +++++++++++++++++++++++++ src/pages/glossaire/[...slug].astro | 127 +------- src/pages/glossaire/index.astro | 98 ++----- 5 files changed, 473 insertions(+), 496 deletions(-) create mode 100644 src/lib/glossary.ts diff --git a/src/components/GlossaryAside.astro b/src/components/GlossaryAside.astro index e5d39aa..38f07c8 100644 --- a/src/components/GlossaryAside.astro +++ b/src/components/GlossaryAside.astro @@ -1,258 +1,46 @@ --- +import { + familyOf, + getContextualTheory, + getDisplayDomain, + getDisplayFamily, + getDisplayLevel, + getEntriesOfSameFamily, + getFondamentaux, + getRelationSections, + getSameFamilyTitle, + hrefOfGlossaryEntry, + slugOfGlossaryEntry, +} from "../lib/glossary"; + 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(String(slug || "").trim())) - .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; -} - -function sortByTerm(entries = []) { - return [...entries].sort((a, b) => collator.compare(a.data.term, b.data.term)); -} - -function familyOf(entry) { - return entry?.data?.family ?? ""; -} - -function kindOf(entry) { - return entry?.data?.kind ?? ""; -} - -const relatedEntries = sortByTerm( - uniqueBySlug(resolveList(currentEntry.data.related ?? [])) -); - -const opposedEntries = sortByTerm( - uniqueBySlug(resolveList(currentEntry.data.opposedTo ?? [])) -); - -const seeAlsoEntries = sortByTerm( - uniqueBySlug(resolveList(currentEntry.data.seeAlso ?? [])) -); - -const familyLabels = { - "concept-fondamental": "Concept fondamental", - scene: "Scène", - dynamique: "Dynamique", - pathologie: "Pathologie", - topologie: "Topologie", - "meta-regime": "Méta-régime", - paradigme: "Paradigme", - doctrine: "Doctrine", - verbe: "Verbe", - "dispositif-ia": "Dispositif IA", - "tension-irreductible": "Tension irréductible", - figure: "Figure", - qualification: "Qualification", - epistemologie: "Épistémologie", -}; - -const kindLabels = { - concept: "Concept", - diagnostic: "Diagnostic", - topologie: "Topologie", - verbe: "Verbe", - paradigme: "Paradigme", - doctrine: "Doctrine", - dispositif: "Dispositif", - figure: "Figure", - qualification: "Qualification", - epistemologie: "Épistémologie", -}; - -const domainLabels = { - transversal: "Transversal", - theorie: "Théorie", - "cas-ia": "Cas IA", -}; - -const levelLabels = { - fondamental: "Fondamental", - intermediaire: "Intermédiaire", - avance: "Avancé", -}; - +const currentSlug = slugOfGlossaryEntry(currentEntry); const currentFamily = familyOf(currentEntry); -const displayFamily = - familyLabels[currentFamily] ?? - kindLabels[currentEntry.data.kind] ?? - "Fiche"; -const displayDomain = - domainLabels[currentEntry.data.domain] ?? - currentEntry.data.domain; +const fondamentaux = getFondamentaux(allEntries); -const displayLevel = - levelLabels[currentEntry.data.level] ?? - currentEntry.data.level; +const displayFamily = getDisplayFamily(currentEntry); +const displayDomain = getDisplayDomain(currentEntry); +const displayLevel = getDisplayLevel(currentEntry); -function entriesOfSameFamily(entry) { - const family = familyOf(entry); +const sameFamilyEntries = getEntriesOfSameFamily(currentEntry, allEntries); +const sameFamilyTitle = getSameFamilyTitle(currentEntry); - if (!family) return []; +const contextualTheory = getContextualTheory(currentEntry, allEntries); - if (family === "concept-fondamental") { - return fondamentaux; - } - - return sortByTerm( - allEntries.filter((item) => familyOf(item) === family) - ); -} - -const sameFamilyEntries = entriesOfSameFamily(currentEntry); - -const familySectionTitles = { - "concept-fondamental": "Noyau archicratique", - scene: "Scènes archicratiques", - dynamique: "Dynamiques archicratiques", - pathologie: "Pathologies archicratiques", - topologie: "Topologies voisines", - "meta-regime": "Méta-régimes archicratiques", - paradigme: "Paradigmes voisins", - doctrine: "Doctrines fondatrices", - verbe: "Verbes de la scène", - "dispositif-ia": "Dispositifs IA", - "tension-irreductible": "Tensions irréductibles", - figure: "Figures archicratiques", - qualification: "Qualifications archicratiques", - epistemologie: "Outillage épistémologique", -}; - -const sameFamilyTitle = - familySectionTitles[currentFamily] ?? "Même famille"; - -function isTheoryEntry(entry) { - const family = familyOf(entry); - const kind = kindOf(entry); - - return ( - family === "paradigme" || - family === "doctrine" || - kind === "paradigme" || - kind === "doctrine" - ); -} - -function contextualTheoryFor(entry) { - const fromRelations = uniqueBySlug([ - ...resolveList(entry.data.related ?? []), - ...resolveList(entry.data.seeAlso ?? []), - ...resolveList(entry.data.opposedTo ?? []), - ]) - .filter((item) => slugOf(item) !== currentSlug) - .filter((item) => isTheoryEntry(item)); - - if (fromRelations.length > 0) { - return sortByTerm(fromRelations).slice(0, 6); - } - - if (familyOf(entry) === "paradigme") { - const preferred = [ - "gouvernementalite", - "gouvernementalite-algorithmique", - "cybernetique", - "biopolitique", - "domination-legale-rationnelle", - "democratie-deliberative", - "gouvernance-des-communs", - "agencement-machinique", - "pharmacologie-technique", - "preemption-algorithmique", - "dissensus-politique", - "lieu-vide-du-pouvoir", - "habitus-et-violence-symbolique", - "theorie-de-la-resonance", - "conatus-et-multitude", - "configuration-et-interdependance", - "technodiversite-et-cosmotechnie", - "grammatisation-et-proletarisation-cognitive", - ]; - - return uniqueBySlug( - preferred - .filter((slug) => slug !== currentSlug) - .map((slug) => bySlug.get(slug)) - .filter(Boolean) - ).slice(0, 8); - } - - if (familyOf(entry) === "doctrine") { - const preferred = [ - "contractualisme-hobbesien", - "droit-naturel-et-propriete", - "volonte-generale", - "decisionnisme-souverain", - ]; - - return uniqueBySlug( - preferred - .filter((slug) => slug !== currentSlug) - .map((slug) => bySlug.get(slug)) - .filter(Boolean) - ).slice(0, 6); - } - - return []; -} - -const contextualTheory = contextualTheoryFor(currentEntry); - -const showNoyau = currentFamily !== "concept-fondamental" && fondamentaux.length > 0; +const showNoyau = + currentFamily !== "concept-fondamental" && + fondamentaux.length > 0; const showSameFamily = - sameFamilyEntries.length > 0 && currentFamily !== "concept-fondamental"; + sameFamilyEntries.length > 0 && + currentFamily !== "concept-fondamental"; -const relationSections = [ - { - title: "Concepts liés", - items: relatedEntries, - }, - { - title: "En tension avec", - items: opposedEntries, - }, - { - title: "Voir aussi", - items: seeAlsoEntries, - }, -].filter((section) => section.items.length > 0); +const relationSections = getRelationSections(currentEntry, allEntries); ---