content: wire archicrat-ia as first-class collection (routes + toc + schema)
This commit is contained in:
@@ -114,7 +114,6 @@ async function runMammoth(docxPath, assetsOutDirWebRoot) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let html = result.value || "";
|
let html = result.value || "";
|
||||||
|
|
||||||
// Mammoth gives relative src="image-xx.png" ; we will prefix later
|
// Mammoth gives relative src="image-xx.png" ; we will prefix later
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
@@ -182,6 +181,25 @@ async function exists(p) {
|
|||||||
try { await fs.access(p); return true; } catch { return false; }
|
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/<slugSansPrefix>.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() {
|
async function main() {
|
||||||
const args = parseArgs(process.argv);
|
const args = parseArgs(process.argv);
|
||||||
const manifestPath = path.resolve(args.manifest);
|
const manifestPath = path.resolve(args.manifest);
|
||||||
@@ -203,11 +221,14 @@ async function main() {
|
|||||||
|
|
||||||
for (const it of selected) {
|
for (const it of selected) {
|
||||||
const docxPath = path.resolve(it.source);
|
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 outDir = path.dirname(outFile);
|
||||||
|
|
||||||
const assetsPublicDir = path.posix.join("/imported", it.collection, it.slug);
|
const assetsPublicDir = path.posix.join("/imported", outCollection, outSlug);
|
||||||
const assetsDiskDir = path.resolve("public", "imported", it.collection, it.slug);
|
const assetsDiskDir = path.resolve("public", "imported", outCollection, outSlug);
|
||||||
|
|
||||||
if (!(await exists(docxPath))) {
|
if (!(await exists(docxPath))) {
|
||||||
throw new Error(`Missing source docx: ${docxPath}`);
|
throw new Error(`Missing source docx: ${docxPath}`);
|
||||||
@@ -241,18 +262,20 @@ async function main() {
|
|||||||
html = rewriteLocalImageLinks(html, assetsPublicDir);
|
html = rewriteLocalImageLinks(html, assetsPublicDir);
|
||||||
body = html.trim() ? html : "<p>(Import vide)</p>";
|
body = html.trim() ? html : "<p>(Import vide)</p>";
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultVersion = process.env.PUBLIC_RELEASE || "0.1.0";
|
const defaultVersion = process.env.PUBLIC_RELEASE || "0.1.0";
|
||||||
|
|
||||||
|
// ✅ IMPORTANT: archicrat-ia partage edition/status avec archicratie (pas de migration frontmatter)
|
||||||
const schemaDefaultsByCollection = {
|
const schemaDefaultsByCollection = {
|
||||||
archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 },
|
archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 },
|
||||||
ia: { edition: "ia", status: "cas_pratique", level: 1 },
|
"archicrat-ia": { edition: "archicrat-ia", status: "essai_these", level: 1 },
|
||||||
traite: { edition: "traite", status: "ontodynamique", level: 1 },
|
ia: { edition: "ia", status: "cas_pratique", level: 1 },
|
||||||
glossaire: { edition: "glossaire", status: "lexique", level: 1 },
|
traite: { edition: "traite", status: "ontodynamique", level: 1 },
|
||||||
atlas: { edition: "atlas", status: "atlas", 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 = [
|
const fm = [
|
||||||
"---",
|
"---",
|
||||||
@@ -282,4 +305,4 @@ async function main() {
|
|||||||
main().catch((e) => {
|
main().catch((e) => {
|
||||||
console.error("\nERROR:", e?.message || e);
|
console.error("\nERROR:", e?.message || e);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
@@ -3,14 +3,11 @@ import { getCollection } from "astro:content";
|
|||||||
|
|
||||||
const { currentSlug } = Astro.props;
|
const { currentSlug } = Astro.props;
|
||||||
|
|
||||||
const entries = (await getCollection("archicratie"))
|
// ✅ Après migration : TOC = collection "archicrat-ia"
|
||||||
.filter((e) => e.slug.startsWith("archicrat-ia/"))
|
const entries = (await getCollection("archicrat-ia"))
|
||||||
.sort((a, b) => (a.data.order ?? 0) - (b.data.order ?? 0));
|
.sort((a, b) => (a.data.order ?? 0) - (b.data.order ?? 0));
|
||||||
|
|
||||||
// ✅ On route l’Essai-thèse sur /archicrat-ia/<slug-sans-prefix>/
|
const href = (slug) => `/archicrat-ia/${slug}/`;
|
||||||
// (Astro trailingSlash = always → on garde le "/" final)
|
|
||||||
const strip = (s) => String(s || "").replace(/^archicrat-ia\//, "");
|
|
||||||
const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<nav class="toc-global" aria-label="Table des matières — ArchiCraT-IA">
|
<nav class="toc-global" aria-label="Table des matières — ArchiCraT-IA">
|
||||||
@@ -163,4 +160,4 @@ const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
|
|||||||
const active = document.querySelector(".toc-global .toc-item.is-active");
|
const active = document.querySelector(".toc-global .toc-item.is-active");
|
||||||
if (active) active.scrollIntoView({ block: "nearest" });
|
if (active) active.scrollIntoView({ block: "nearest" });
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
@@ -2,7 +2,7 @@ import { defineCollection, z } from "astro:content";
|
|||||||
|
|
||||||
const linkSchema = z.object({
|
const linkSchema = z.object({
|
||||||
type: z.enum(["definition", "appui", "transposition"]),
|
type: z.enum(["definition", "appui", "transposition"]),
|
||||||
target: z.string().min(1), // URL interne (ex: /glossaire/archicratie/) ou slug
|
target: z.string().min(1),
|
||||||
note: z.string().optional()
|
note: z.string().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ const baseTextSchema = z.object({
|
|||||||
version: z.string().min(1),
|
version: z.string().min(1),
|
||||||
concepts: z.array(z.string().min(1)).default([]),
|
concepts: z.array(z.string().min(1)).default([]),
|
||||||
links: z.array(linkSchema).default([]),
|
links: z.array(linkSchema).default([]),
|
||||||
// optionnels mais utiles dès maintenant
|
|
||||||
order: z.number().int().nonnegative().optional(),
|
order: z.number().int().nonnegative().optional(),
|
||||||
summary: z.string().optional()
|
summary: z.string().optional()
|
||||||
});
|
});
|
||||||
@@ -50,20 +49,31 @@ const atlas = defineCollection({
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ✅ NOUVELLE collection : archicrat-ia (Essai-thèse)
|
||||||
|
// NOTE : on accepte temporairement edition/status "archicratie/modele_sociopolitique"
|
||||||
|
// si tes MDX n’ont pas encore été normalisés.
|
||||||
|
// Quand tu voudras "strict", on passera à edition="archicrat-ia" status="essai_these"
|
||||||
|
// + update frontmatter des 7 fichiers.
|
||||||
|
const archicratIa = defineCollection({
|
||||||
|
type: "content",
|
||||||
|
schema: baseTextSchema.extend({
|
||||||
|
edition: z.union([z.literal("archicrat-ia"), z.literal("archicratie")]),
|
||||||
|
status: z.union([z.literal("essai_these"), z.literal("modele_sociopolitique")])
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
// Glossaire (référentiel terminologique)
|
// Glossaire (référentiel terminologique)
|
||||||
const glossaire = defineCollection({
|
const glossaire = defineCollection({
|
||||||
type: "content",
|
type: "content",
|
||||||
schema: z.object({
|
schema: z.object({
|
||||||
title: z.string().min(1), // Titre public (souvent identique au terme)
|
title: z.string().min(1),
|
||||||
term: z.string().min(1), // Terme canonique
|
term: z.string().min(1),
|
||||||
aliases: z.array(z.string().min(1)).default([]),
|
aliases: z.array(z.string().min(1)).default([]),
|
||||||
edition: z.literal("glossaire"),
|
edition: z.literal("glossaire"),
|
||||||
status: z.literal("referentiel"),
|
status: z.literal("referentiel"),
|
||||||
version: z.string().min(1),
|
version: z.string().min(1),
|
||||||
// Micro-définition affichable en popover (courte, stable)
|
|
||||||
definitionShort: z.string().min(1),
|
definitionShort: z.string().min(1),
|
||||||
concepts: z.array(z.string().min(1)).default([]),
|
concepts: z.array(z.string().min(1)).default([]),
|
||||||
// Liens typés (vers ouvrages ou autres termes)
|
|
||||||
links: z.array(linkSchema).default([])
|
links: z.array(linkSchema).default([])
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -73,5 +83,8 @@ export const collections = {
|
|||||||
archicratie,
|
archicratie,
|
||||||
ia,
|
ia,
|
||||||
glossaire,
|
glossaire,
|
||||||
atlas
|
atlas,
|
||||||
};
|
|
||||||
|
// ⚠️ clé avec tiret => doit être quotée
|
||||||
|
"archicrat-ia": archicratIa
|
||||||
|
};
|
||||||
@@ -5,12 +5,11 @@ import EditionToc from "../../components/EditionToc.astro";
|
|||||||
import LocalToc from "../../components/LocalToc.astro";
|
import LocalToc from "../../components/LocalToc.astro";
|
||||||
|
|
||||||
export async function getStaticPaths() {
|
export async function getStaticPaths() {
|
||||||
const entries = (await getCollection("archicratie"))
|
// ✅ Après migration : plus de filtre par prefix, on prend toute la collection
|
||||||
.filter((e) => e.slug.startsWith("archicrat-ia/"));
|
const entries = await getCollection("archicrat-ia");
|
||||||
|
|
||||||
return entries.map((entry) => ({
|
return entries.map((entry) => ({
|
||||||
// ✅ inline : jamais de helper externe (évite "stripPrefix is not defined")
|
params: { slug: entry.slug },
|
||||||
params: { slug: entry.slug.replace(/^archicrat-ia\//, "") },
|
|
||||||
props: { entry },
|
props: { entry },
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -35,4 +34,4 @@ const { Content, headings } = await entry.render();
|
|||||||
|
|
||||||
<h1>{entry.data.title}</h1>
|
<h1>{entry.data.title}</h1>
|
||||||
<Content />
|
<Content />
|
||||||
</EditionLayout>
|
</EditionLayout>
|
||||||
@@ -2,13 +2,12 @@
|
|||||||
import SiteLayout from "../../layouts/SiteLayout.astro";
|
import SiteLayout from "../../layouts/SiteLayout.astro";
|
||||||
import { getCollection } from "astro:content";
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
const entries = (await getCollection("archicratie"))
|
// ✅ Après migration physique : collection = "archicrat-ia", slug = "chapitre-3" (sans prefix)
|
||||||
.filter((e) => e.slug.startsWith("archicrat-ia/"));
|
const entries = await getCollection("archicrat-ia");
|
||||||
|
|
||||||
entries.sort((a, b) => (a.data.order ?? 9999) - (b.data.order ?? 9999));
|
entries.sort((a, b) => (a.data.order ?? 9999) - (b.data.order ?? 9999));
|
||||||
|
|
||||||
const strip = (slug) => slug.replace(/^archicrat-ia\//, "");
|
const href = (slug) => `/archicrat-ia/${slug}/`;
|
||||||
const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<SiteLayout title="Essai-thèse — ArchiCraT-IA">
|
<SiteLayout title="Essai-thèse — ArchiCraT-IA">
|
||||||
@@ -19,4 +18,4 @@ const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
|
|||||||
<li><a href={href(e.slug)}>{e.data.title}</a></li>
|
<li><a href={href(e.slug)}>{e.data.title}</a></li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</SiteLayout>
|
</SiteLayout>
|
||||||
Reference in New Issue
Block a user