// Helpers markdown partagés (côté serveur uniquement, exécutés au build). // - parseFrontmatter : même logique que src/lib/server/actualites.ts. // - renderAvecSources : rend le corps en HTML en traitant les notes de // référence au format [^67^] utilisé par les fichiers sources : // appels inline → avec ancre #src-67, définitions regroupées en // section « Sources » finale (
    ). import { marked } from 'marked'; /** Parse un front-matter YAML simple (clés scalaires, valeurs entre guillemets optionnelles). */ export function parseFrontmatter(raw: string): { data: Record; body: string } { const m = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/); if (!m) return { data: {}, body: raw }; const data: Record = {}; for (const line of m[1].split(/\r?\n/)) { const kv = line.match(/^([A-Za-z0-9_]+)\s*:\s*(.*)$/); if (!kv) continue; let val = kv[2].trim(); if ( (val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'")) ) { val = val.slice(1, -1); } data[kv[1]] = val; } return { data, body: m[2] }; } /** * Rend un corps markdown en HTML. * - Les définitions `[^N^]: https://...` sont retirées du corps et deviennent * une section finale « Sources » (

    +
      ). * - Les appels inline `[^N^]` deviennent [N]. * - Un appel sans définition est laissé en texte brut `[N]` (pas d'ancre morte : * le prérendu échouerait sinon, handleMissingId: 'fail'). */ export function renderAvecSources(body: string): string { const sources = new Map(); // 1. Extraction des définitions de notes (en fin de fichier). const corps = body.replace(/^\[\^(\d+)\^\]:\s*(https?:\/\/\S+)\s*$/gm, (_all, n: string, url: string) => { sources.set(Number(n), url); return ''; }); // 2. Remplacement des appels inline. const avecRefs = corps.replace(/\[\^(\d+)\^\]/g, (all, n: string) => { if (!sources.has(Number(n))) return `[${n}]`; return `[${n}]`; }); // 3. Section « Sources » finale (HTML brut, repris tel quel par marked). let html = marked.parse(avecRefs.trim(), { async: false }) as string; if (sources.size) { const items = [...sources.entries()] .sort((a, b) => a[0] - b[0]) .map( ([n, url]) => `
    1. ${url}
    2. ` ) .join('\n'); html += `\n

      Sources

      \n
        \n${items}\n
      `; } return html; }