Récupère les 3 numéros de Gong-Information depuis l'API Strapi

Les documents réels du GONG (journal Gong-Information) vivaient uniquement sur
l'API Strapi en ligne (api.gong.gp), pas dans le dépôt. Ils sont maintenant
récupérés et intégrés en dur (le back-office Strapi peut être définitivement retiré) :

- n° 16 (Mai-Juin 1966), n° spécial (Janv-Fév 1967), n° 19 (Mars-Avril-Mai 1967).
- Transcription intégrale (contenu first-party) + couverture optimisée WebP (~40 Ko).
- Scans PDF recompressés via Ghostscript (176 Mo → 28 Mo, 150 dpi lisibles).
- Nouvelle section /archives (index + fiche par numéro), schema Article/CreativeWork.
- Liens depuis nav, footer, accueil, publications ; ajout au sitemap ; PWA globIgnores.

npm run check : 0/0 · build : 32 pages.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sucupira
2026-07-25 00:31:39 -04:00
co-authored by Claude Opus 4.8
parent 9669edf8bc
commit 8ba1c2757a
20 changed files with 367 additions and 2 deletions
+1
View File
@@ -17,6 +17,7 @@
{
titre: 'Documents',
liens: [
{ href: '/archives/', label: 'Archives — Gong-Information' },
{ href: '/charte/', label: 'Charte de 1963' },
{ href: '/orientation/', label: 'Orientation & stratégie' },
{ href: '/publications/', label: 'Publications' },
+1
View File
@@ -12,6 +12,7 @@
];
const secondaires = [
{ href: '/proces-1968/', label: 'Procès de 1968' },
{ href: '/archives/', label: 'Archives — Gong-Information' },
{ href: '/publications/', label: 'Publications' },
{ href: '/charte/', label: 'Charte de 1963' },
{ href: '/orientation/', label: 'Orientation & stratégie' },
+68
View File
@@ -0,0 +1,68 @@
// Archives numérisées : les numéros du journal « Gong-Information » (sources primaires
// récupérées depuis l'ancien back-office Strapi). Transcriptions HTML first-party + PDF + couverture.
// $lib/server → chargé au build ; pages 100 % prérendues.
const contenus = import.meta.glob('/content/archives/*.html', {
query: '?raw',
import: 'default',
eager: true
}) as Record<string, string>;
export interface Archive {
slug: string;
numero: string;
titre: string;
date: string; // libellé d'époque (ex. « Mai-Juin 1966 »)
iso: string; // pour tri et lastmod
chapeau: string;
couverture: string; // webp
pdf: string;
html: string; // transcription first-party
}
const META: Omit<Archive, 'html'>[] = [
{
slug: 'gong-information-16',
numero: 'N° 16',
titre: 'Gong-Information n° 16',
date: 'Mai-Juin 1966',
iso: '1966-05-01',
chapeau:
"En Guadeloupe, les connaissances intellectuelles jouissent d'une grande faveur. Par extension les masses laborieuses attribuent un grand prestige aux intellectuels.",
couverture: '/images/archives/gong-info-16.webp',
pdf: '/archives/gong-information-16.pdf'
},
{
slug: 'gong-information-special',
numero: 'N° spécial',
titre: 'Gong-Information n° spécial',
date: 'Janvier-Février 1967',
iso: '1967-01-01',
chapeau: "Un peuple qui décide de se gouverner est un peuple qui entreprend de se critiquer et de s'organiser.",
couverture: '/images/archives/gong-info-special.webp',
pdf: '/archives/gong-information-special.pdf'
},
{
slug: 'gong-information-19',
numero: 'N° 19',
titre: 'Gong-Information n° 19',
date: 'Mars-Avril-Mai 1967',
iso: '1967-03-01',
chapeau:
"À l'intimidation constituée par l'envoi des « troupes d'intervention » colonialistes françaises, au chantage exercé par les services de la préfecture, à la corruption…",
couverture: '/images/archives/gong-info-19.webp',
pdf: '/archives/gong-information-19.pdf'
}
];
function html(slug: string): string {
return (contenus[`/content/archives/${slug}.html`] ?? '').trim();
}
export function getArchives(): Archive[] {
return META.map((m) => ({ ...m, html: html(m.slug) })).sort((a, b) => (a.iso < b.iso ? -1 : 1));
}
export function getArchive(slug: string): Archive | undefined {
return getArchives().find((a) => a.slug === slug);
}
+2 -1
View File
@@ -14,7 +14,8 @@
{ href: '/proces-1968/', icon: 'scale', titre: 'Procès de 1968', desc: '18 Guadeloupéens jugés à Paris ; Sartre et Césaire témoignent.' },
{ href: '/militants/', icon: 'users', titre: 'Militants', desc: 'Sainton, Nestor, Manville, Bangou, Glaude… les femmes et les hommes du GONG.' },
{ href: '/ideologie/', icon: 'glo', titre: 'Idéologie', desc: "Marxisme-léninisme, tiers-mondisme et lutte de libération nationale." },
{ href: '/heritage/', icon: 'memory', titre: 'Héritage', desc: 'UPLG, UGTG, mémoire de Mé 67 : ce que le GONG a laissé.' }
{ href: '/heritage/', icon: 'memory', titre: 'Héritage', desc: 'UPLG, UGTG, mémoire de Mé 67 : ce que le GONG a laissé.' },
{ href: '/archives/', icon: 'book', titre: 'Archives', desc: 'Les numéros numérisés du journal Gong-Information (1966-1967).' }
];
const webPage = [
+14
View File
@@ -0,0 +1,14 @@
import { getArchives } from '$lib/server/archives';
export function load() {
const archives = getArchives().map(({ slug, numero, titre, date, iso, chapeau, couverture }) => ({
slug,
numero,
titre,
date,
iso,
chapeau,
couverture
}));
return { archives };
}
+114
View File
@@ -0,0 +1,114 @@
<script lang="ts">
import Seo from '$lib/components/Seo.svelte';
import Breadcrumb from '$lib/components/Breadcrumb.svelte';
import Resume from '$lib/components/Resume.svelte';
import Icon from '$lib/components/Icon.svelte';
import { reveal } from '$lib/motion/reveal';
import { webPage } from '$lib/seo';
let { data } = $props();
const crumbs = [
{ name: 'Accueil', path: '/' },
{ name: 'Archives', path: '/archives/' }
];
</script>
<Seo
title="Archives — Gong-Information"
description="Les numéros numérisés du journal Gong-Information (« Journal du patriote guadeloupéen »), organe du GONG : n° 16 (1966), n° spécial (1967) et n° 19 (1967). Transcriptions et scans PDF."
path="/archives/"
graph={[webPage('/archives/', 'Archives — Gong-Information', 'Numéros numérisés du journal du GONG.')]}
breadcrumb={crumbs}
/>
<main id="contenu" class="section">
<div class="container">
<Breadcrumb items={crumbs} />
<h1>Archives — Gong-Information</h1>
<div class="lecture">
<Resume
lead="« Gong-Information — Journal du patriote guadeloupéen » était l'organe politique et théorique du GONG. Imprimé clandestinement en Belgique et diffusé de 1964 à 1967, il portait les analyses et mots d'ordre du mouvement. Voici les numéros numérisés, transcription et scan à l'appui."
points={[
'Sources primaires : les numéros mêmes du journal.',
'Transcription intégrale + scan PDF téléchargeable de chaque numéro.',
'« Un peuple qui décide de se gouverner est un peuple qui entreprend de se critiquer et de sorganiser. »'
]}
/>
</div>
<ul class="grille">
{#each data.archives as a, i (a.slug)}
<li>
<a class="card card--link" href="/archives/{a.slug}/" use:reveal={i}>
<img class="cover" src={a.couverture} alt="Couverture de {a.titre}" width="800" height="612" loading="lazy" decoding="async" />
<span class="num">{a.numero} · {a.date}</span>
<h2>{a.titre}</h2>
<p>{a.chapeau}</p>
<span class="more">Lire le numéro <Icon name="arrow-right" size="1em" /></span>
</a>
</li>
{/each}
</ul>
<p class="lecture note">
Documents issus du fonds du GONG, numérisés et transcrits. Voir aussi la présentation des
<a href="/publications/">publications du mouvement</a>.
</p>
</div>
</main>
<style>
.grille {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--space-3);
}
.cover {
width: calc(100% + 2 * var(--space-3));
margin: calc(-1 * var(--space-3)) calc(-1 * var(--space-3)) var(--space-2);
border-radius: var(--radius-md) var(--radius-md) 0 0;
aspect-ratio: 800 / 612;
object-fit: cover;
object-position: top;
background: var(--noir-profond);
}
.num {
font-family: var(--font-display);
font-weight: 700;
text-transform: uppercase;
font-size: 0.8rem;
letter-spacing: 0.04em;
color: var(--accent);
}
.grille h2 {
font-size: 1.15rem;
text-transform: none;
margin: 0.3rem 0;
}
.grille p {
color: var(--muted);
margin: 0;
font-size: 0.94rem;
}
.more {
margin-top: 0.8rem;
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-family: var(--font-display);
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
color: var(--accent);
}
.note {
margin-top: var(--space-4);
color: var(--muted-fort);
font-size: 0.88rem;
}
</style>
@@ -0,0 +1,11 @@
import { error } from '@sveltejs/kit';
import { getArchives, getArchive } from '$lib/server/archives';
import type { EntryGenerator } from './$types';
export const entries: EntryGenerator = () => getArchives().map((a) => ({ slug: a.slug }));
export function load({ params }) {
const archive = getArchive(params.slug);
if (!archive) error(404, 'Numéro introuvable');
return { archive };
}
+131
View File
@@ -0,0 +1,131 @@
<script lang="ts">
import Seo from '$lib/components/Seo.svelte';
import Breadcrumb from '$lib/components/Breadcrumb.svelte';
import Icon from '$lib/components/Icon.svelte';
import { SITE } from '$lib/data/gong';
let { data } = $props();
const a = $derived(data.archive);
const crumbs = $derived([
{ name: 'Accueil', path: '/' },
{ name: 'Archives', path: '/archives/' },
{ name: a.titre, path: `/archives/${a.slug}/` }
]);
const articleNode = $derived({
'@type': ['Article', 'CreativeWork'],
'@id': `${SITE.url}/archives/${a.slug}/#document`,
headline: a.titre,
alternativeHeadline: 'Gong-Information — Journal du patriote guadeloupéen',
description: a.chapeau,
datePublished: a.iso,
inLanguage: 'fr-FR',
image: SITE.url + a.couverture,
isPartOf: { '@id': `${SITE.url}/#website` },
publisher: { '@id': `${SITE.url}/#organization` },
about: { '@id': `${SITE.url}/#organization` },
associatedMedia: { '@type': 'MediaObject', contentUrl: SITE.url + a.pdf, encodingFormat: 'application/pdf' }
});
</script>
<Seo
title={a.titre}
description={a.chapeau}
path={`/archives/${a.slug}/`}
type="article"
image={a.couverture}
imageAlt={`Couverture de ${a.titre}`}
publishedTime={a.iso}
graph={[articleNode]}
breadcrumb={crumbs}
/>
<main id="contenu" class="section">
<div class="container">
<Breadcrumb items={crumbs} />
<article>
<header class="doc-head">
<p class="kicker"><span class="flag-chip" aria-hidden="true"></span> Gong-Information · {a.date}</p>
<h1>{a.titre}</h1>
<p class="chapeau">{a.chapeau}</p>
<a class="btn btn--ghost" href={a.pdf} rel="external noopener noreferrer" target="_blank">
Télécharger le scan (PDF) <Icon name="download" size="1em" />
</a>
</header>
<div class="doc-body">
<figure class="cover">
<img src={a.couverture} alt="Couverture de {a.titre}" width="800" height="612" loading="lazy" decoding="async" />
<figcaption>Couverture du numéro. Fonds du GONG.</figcaption>
</figure>
<div class="prose transcription">
<h2 class="sr-only">Transcription</h2>
<!-- Contenu first-party (transcription du journal, fonds du GONG). -->
{@html a.html}
</div>
</div>
</article>
<p><a class="btn btn--ghost" href="/archives/">← Tous les numéros</a></p>
</div>
</main>
<style>
.doc-head {
max-width: var(--container-lecture);
margin-bottom: var(--space-4);
}
.kicker {
display: inline-flex;
flex-direction: column;
gap: 0.5rem;
font-family: var(--font-display);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.85rem;
color: var(--muted);
}
.chapeau {
font-size: 1.15rem;
color: var(--muted);
font-style: italic;
margin-bottom: var(--space-2);
}
.doc-body {
display: grid;
grid-template-columns: 300px 1fr;
gap: var(--space-4);
align-items: start;
}
.cover {
margin: 0;
position: sticky;
top: calc(var(--nav-h) + 1rem);
}
.cover img {
width: 100%;
border: 1px solid var(--line);
border-radius: var(--radius-md);
background: var(--noir-profond);
}
.cover figcaption {
margin-top: 0.5rem;
font-size: 0.8rem;
color: var(--muted-fort);
}
.transcription {
max-width: none;
}
@media (max-width: 800px) {
.doc-body {
grid-template-columns: 1fr;
}
.cover {
position: static;
max-width: 300px;
}
}
</style>
+16
View File
@@ -38,6 +38,11 @@
/>
</div>
<p class="lecture cta-archives">
<Icon name="book" size="1.2rem" /> Les numéros de <strong>Gong-Information</strong> ont été numérisés :
<a href="/archives/">consulter les archives</a> (transcription + scan PDF).
</p>
<ul class="pubs">
{#each pubs as p, i (p.titre)}
<li class="card" use:reveal={i}>
@@ -58,6 +63,17 @@
</main>
<style>
.cta-archives {
display: flex;
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
background: color-mix(in srgb, var(--accent) 8%, transparent);
border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
border-radius: var(--radius-md);
padding: var(--space-2) var(--space-3);
margin-bottom: var(--space-4);
}
.pubs {
list-style: none;
margin: 0;
+5
View File
@@ -1,5 +1,6 @@
import { SITE, membres } from '$lib/data/gong';
import { getActualites } from '$lib/server/actualites';
import { getArchives } from '$lib/server/archives';
export const prerender = true;
@@ -12,6 +13,7 @@ const statiques: { path: string; priority: string; changefreq: string }[] = [
{ path: '/ideologie/', priority: '0.7', changefreq: 'yearly' },
{ path: '/heritage/', priority: '0.7', changefreq: 'yearly' },
{ path: '/publications/', priority: '0.6', changefreq: 'yearly' },
{ path: '/archives/', priority: '0.8', changefreq: 'yearly' },
{ path: '/charte/', priority: '0.7', changefreq: 'yearly' },
{ path: '/orientation/', priority: '0.7', changefreq: 'yearly' },
{ path: '/sources/', priority: '0.6', changefreq: 'yearly' },
@@ -36,6 +38,9 @@ export function GET() {
for (const a of getActualites()) {
urls.push(`<url><loc>${SITE.url}/actualites/${a.slug}/</loc><lastmod>${a.iso}</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url>`);
}
for (const a of getArchives()) {
urls.push(`<url><loc>${SITE.url}/archives/${a.slug}/</loc><lastmod>${a.iso}</lastmod><changefreq>yearly</changefreq><priority>0.6</priority></url>`);
}
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">