Chapitre 17Exploiter
Reprendre un site existant
Faire passer un site statique déjà en ligne sous inline, sans le refaire. Annoter le HTML, extraire le contenu, rendre la page — page par page, rien n'oblige à tout convertir d'un coup.
Ce que ça n'est pas
Ce n'est pas une conversion automatique. L'outil sait extraire des valeurs d'une page annotée ; il ne sait pas décider ce que le client a le droit de changer. Cette décision est le vrai travail, et elle ne s'automatise pas :
- un titre de section, oui ; le nom de l'entreprise en pied de page, sans doute pas ;
- un témoignage, oui ; la structure de la grille qui les affiche, non ;
- une photo d'illustration, oui ; le logo, à discuter.
Compter une heure par page pour ce tri, et quelques minutes pour le reste. L'opération se fait page par page : une page reprise et une page non reprise cohabitent sans se gêner.
1. Annoter la page
Sur le HTML existant, poser des attributs. Rien d'autre ne change : pas une balise déplacée, pas une classe retirée.
<h1 data-cms="blocks.hero.title">Le pain au levain, tous les matins</h1>
<p data-cms="blocks.about.body" data-cms-type="richtext">
Nous <strong>pétrissons</strong> chaque nuit.
</p>
<img data-cms="blocks.about.photo" data-cms-type="media"
src="/img/fournil.jpg" alt="Le fournil au petit matin"
width="1600" height="900" />
<figure data-cms="blocks.about.film" data-cms-type="media">
<iframe src="https://www.youtube.com/embed/aqz-KE-bpKQ" title="Une nuit au fournil"></iframe>
</figure>
<ul data-cms-list="collections.avis">
<li data-cms-item="a-001">
<blockquote data-cms="collections.avis.a-001.quote">Le meilleur pain de la ville.</blockquote>
<cite data-cms="collections.avis.a-001.author">Claire D.</cite>
</li>
</ul>Trois règles, et elles suffisent :
- un champ simple vit sous
blocks.; un champ de liste souscollections.{liste}.{id}.; - chaque item porte un identifiant stable et jamais réattribué (
a-001,a-002) — c'est le lien entre la page et le contenu ; - une image a besoin d'un
alt, d'unwidthet d'unheight. Sans eux, l'amorçage refuse d'écrire.
Si l'ancien HTML porte déjà des classes cms-* — parce qu'il a été construit avec
cette convention — l'amorçage en déduit les tokens de style. Sinon, les valeurs par défaut
s'appliquent et le style vient de votre CSS.
2. Extraire le contenu
# Essai : n'écrit rien, montre ce qui serait produit
npm run bootstrap -- --html ancien-site/accueil.html --page accueil --langue fr --essai
# Écrit src/content/pages/fr/accueil.json
npm run bootstrap -- --html ancien-site/accueil.html --page accueil --langue fr| Option | Défaut | Rôle |
|---|---|---|
--html | — | Le fichier à lire. Obligatoire. |
--page | home | Nom du fichier de contenu produit. |
--langue | fr | Dossier de langue de destination. |
--essai | — | N'écrit rien ; affiche le résultat et ce qui n'a pas pu être déduit. |
--sortie | — | Écrire ailleurs qu'à l'emplacement standard. |
Ce qui est repris automatiquement
- les textes et leurs variantes de style ;
- le richtext, avec son balisage autorisé — le reste est retiré ;
- les images, avec leur description et leurs dimensions ;
- les vidéos, converties en fournisseur + identifiant ;
- les listes, avec leurs identifiants ;
- le titre et la meta description de la page.
Si une image n'a pas de description, l'amorçage échoue au lieu de mettre une chaîne vide. Une valeur plausible inventée à ce stade se retrouve en production, invisible en revue, et personne ne la corrige jamais. Le schéma appliqué ici est celui du build et de la publication : ce qui passe ici passera partout.
Un fichier existant n'est jamais écrasé. Un amorçage relancé par erreur ne doit pas effacer ce que le client a déjà modifié.
3. Rendre la page avec Astro
Le HTML annoté sert de modèle. Chaque data-cms devient un composant qui lit le
contenu :
<Editable data={data} path="blocks.hero.title" as="h1" />
<Media data={data} path="blocks.about.photo" />
<Collection data={data} name="avis" item={Avis} blank={{ … }} />Deux points à ne pas manquer :
-
aucune directive
client:*sur un composant qui affiche du contenu. Le texte doit être dans le HTML brut, sinon il sort de l'index des moteurs et des assistants ; -
chaque liste a besoin de son
<template>dans la page, sinon l'ajout d'un item obligerait à réimplémenter un moteur de rendu côté navigateur. Le composantCollections'en charge.
npm run check vérifie les deux.
4. Les images
Copier les fichiers dans src/media/, en minuscules, sans accent ni espace —
l'amorçage a déjà normalisé les noms dans le JSON, il faut que les fichiers suivent.
Ne pas les mettre dans public/ : <Image /> ne les traiterait
pas, et le site perdrait AVIF, WebP et le jeu de largeurs qu'il avait peut-être déjà.
5. Vérifier
npm run build && npm run checkPuis, sur le site déployé :
curl -s https://le-site.fr/fr/ | grep -c "un titre de la page" # doit renvoyer 1
Si cela renvoie 0, le contenu n'est pas dans le HTML brut : chercher une directive
client:*.
Ce qui ne se reprend pas
| Cas | Pourquoi |
|---|---|
| Les formulaires | Hors périmètre. Ils restent ce qu'ils étaient — un service tiers, un mailto:, ce qui existait déjà. |
| Le contenu généré côté navigateur | S'il n'est pas dans le HTML, il n'y a rien à extraire. C'est un problème de référencement avant d'être un problème de reprise. |
| Les pages dont la structure change à chaque visite | Un carousel doit contenir tous ses éléments en dur ; le JavaScript ne fait que les faire défiler. |
Si le site repose largement sur ces trois points, la reprise n'est pas le bon outil : c'est le signe qu'il faut d'abord le rendre statique.
Un ordre de reprise qui marche
-
La page d'accueil, seule
C'est celle qui change le plus souvent, et celle qui prouve la chaîne complète.
-
La faire valider par le client
Avant de reprendre dix pages sur la même convention. C'est le moment où l'on découvre qu'il voulait aussi modifier les horaires du pied de page.
-
Les pages à contenu changeant
Services, tarifs, actualités. Celles qui motivaient la reprise.
-
Les pages figées, en dernier — ou jamais
Mentions légales, page 404 : les rendre éditables n'apporte rien et ajoute des zones à surveiller.
scripts/fixtures/site-existant.html contient une page annotée couvrant tous les
cas — texte, richtext, image, vidéo, liste. C'est aussi ce que lit
npm run test:bootstrap.