From 9cb0d5e416fcabbcfb4fb8987337491bb2219ba0 Mon Sep 17 00:00:00 2001 From: Archicratia Date: Tue, 3 Mar 2026 15:02:50 +0100 Subject: [PATCH] content: wire archicrat-ia as first-class collection (routes + toc + schema) --- scripts/import-docx.mjs | 47 +++++++++++++++++++------- src/components/EditionToc.astro | 11 +++--- src/content/config.ts | 29 +++++++++++----- src/pages/archicrat-ia/[...slug].astro | 9 +++-- src/pages/archicrat-ia/index.astro | 9 +++-- 5 files changed, 68 insertions(+), 37 deletions(-) diff --git a/scripts/import-docx.mjs b/scripts/import-docx.mjs index ebc19f2..eb138f7 100644 --- a/scripts/import-docx.mjs +++ b/scripts/import-docx.mjs @@ -114,7 +114,6 @@ async function runMammoth(docxPath, assetsOutDirWebRoot) { ); let html = result.value || ""; - // Mammoth gives relative src="image-xx.png" ; we will prefix later return html; } @@ -182,6 +181,25 @@ async function exists(p) { try { await fs.access(p); return true; } catch { return false; } } +/** + * ✅ compat: + * - ancien : collection="archicratie" + slug="archicrat-ia/chapitre-3" + * - nouveau : collection="archicrat-ia" + slug="chapitre-3" + * + * But : toujours écrire dans src/content/archicrat-ia/.mdx + */ +function normalizeDest(collection, slug) { + let outCollection = String(collection || "").trim(); + let outSlug = String(slug || "").trim().replace(/^\/+|\/+$/g, ""); + + if (outCollection === "archicratie" && outSlug.startsWith("archicrat-ia/")) { + outCollection = "archicrat-ia"; + outSlug = outSlug.replace(/^archicrat-ia\//, ""); + } + + return { outCollection, outSlug }; +} + async function main() { const args = parseArgs(process.argv); const manifestPath = path.resolve(args.manifest); @@ -203,11 +221,14 @@ async function main() { for (const it of selected) { const docxPath = path.resolve(it.source); - const outFile = path.resolve("src/content", it.collection, `${it.slug}.mdx`); + + const { outCollection, outSlug } = normalizeDest(it.collection, it.slug); + + const outFile = path.resolve("src/content", outCollection, `${outSlug}.mdx`); const outDir = path.dirname(outFile); - const assetsPublicDir = path.posix.join("/imported", it.collection, it.slug); - const assetsDiskDir = path.resolve("public", "imported", it.collection, it.slug); + const assetsPublicDir = path.posix.join("/imported", outCollection, outSlug); + const assetsDiskDir = path.resolve("public", "imported", outCollection, outSlug); if (!(await exists(docxPath))) { throw new Error(`Missing source docx: ${docxPath}`); @@ -241,18 +262,20 @@ async function main() { html = rewriteLocalImageLinks(html, assetsPublicDir); body = html.trim() ? html : "

(Import vide)

"; } - + const defaultVersion = process.env.PUBLIC_RELEASE || "0.1.0"; + // ✅ IMPORTANT: archicrat-ia partage edition/status avec archicratie (pas de migration frontmatter) const schemaDefaultsByCollection = { - archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 }, - ia: { edition: "ia", status: "cas_pratique", level: 1 }, - traite: { edition: "traite", status: "ontodynamique", level: 1 }, - glossaire: { edition: "glossaire", status: "lexique", level: 1 }, - atlas: { edition: "atlas", status: "atlas", level: 1 }, + archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 }, + "archicrat-ia": { edition: "archicrat-ia", status: "essai_these", level: 1 }, + ia: { edition: "ia", status: "cas_pratique", level: 1 }, + traite: { edition: "traite", status: "ontodynamique", level: 1 }, + glossaire: { edition: "glossaire", status: "lexique", level: 1 }, + atlas: { edition: "atlas", status: "atlas", level: 1 }, }; - const defaults = schemaDefaultsByCollection[it.collection] || { edition: it.collection, status: "draft", level: 1 }; + const defaults = schemaDefaultsByCollection[outCollection] || { edition: outCollection, status: "draft", level: 1 }; const fm = [ "---", @@ -282,4 +305,4 @@ async function main() { main().catch((e) => { console.error("\nERROR:", e?.message || e); process.exit(1); -}); +}); \ No newline at end of file diff --git a/src/components/EditionToc.astro b/src/components/EditionToc.astro index 7f6a5ff..54c3f54 100644 --- a/src/components/EditionToc.astro +++ b/src/components/EditionToc.astro @@ -3,14 +3,11 @@ import { getCollection } from "astro:content"; const { currentSlug } = Astro.props; -const entries = (await getCollection("archicratie")) - .filter((e) => e.slug.startsWith("archicrat-ia/")) +// ✅ Après migration : TOC = collection "archicrat-ia" +const entries = (await getCollection("archicrat-ia")) .sort((a, b) => (a.data.order ?? 0) - (b.data.order ?? 0)); -// ✅ On route l’Essai-thèse sur /archicrat-ia// -// (Astro trailingSlash = always → on garde le "/" final) -const strip = (s) => String(s || "").replace(/^archicrat-ia\//, ""); -const href = (slug) => `/archicrat-ia/${strip(slug)}/`; +const href = (slug) => `/archicrat-ia/${slug}/`; ---