Faire migrer un site statique vers SPIP

Attention, cette contribution est EN CHANTIER : elle n’est peut-être pas fonctionnelle.

Récupérer des pages HTML pour les intégrer dans SPIP est fastidieux, surtout quand on veut migrer un site statique entier vers ce gestionnaire dynamique de site web. Face à ce problème, j’ai du développer un outil pour m’y aider qui prend la forme d’un squelette.

Nota Spip-contrib
Une contrib pas complètement bordée, mais qui devrait intéresser du monde, donc publication. N’hésitez pas à utiliser ce forum pour vos suggestions et contributions.

Il existe désormais un plugin pour SPIP>1.9 réalisé par chryjs, qui rempli encore mieux cette fonction que ce squelette : Migre static - plugin de migration d’un site. À moins que vous n’utilisiez une version de SPIP plus ancienne que la 1.9, vous avez tout intérêt à vous tourner vers le plugin.

Objectifs du squelette :

Récupérer toutes les pages d’un site web statique pour en faire des articles dans SPIP. Tout cela en prenant quelques précautions :
-  Veiller à améliorer le coté sémantique et à rendre l’article modifiable dans SPIP par des rédacteurs : transformer autant que possible le HTML des pages web en raccourcis typographiques de SPIP.
-  Rendre les images, documents et liens valides dans SPIP : donc transformer les adresses web qui seraient relatives à l’ancien site en adresses absolues.
-  Veiller à ce que les transformations ne soient pas destructives.
-  Garder de la « traçabilité » : il doit être possible de comparer facilement le nouvel article (dans SPIP) avec l’ancien (sur le site statique).

Comment l’installer et l’utiliser :

Pour l’installer c’est très simple : placez le fichier « migration.html » dans votre répertoire de squelettes (en général « squelettes »).

Pour l’utiliser, il faut d’abord y faire des petites modifications :

Dans le code source du squelette il y a des commentaires comme :
« //***À modifier par les utilisateurs*** » aux alentours des lignes 34 et 57.

-  Au premier endroit, ligne 34 :

//***À modifier par les utilisateurs***
$dochtml=recup_page('http://undomaine.truc/la_liste_des_pages.html');     //renseigner avec l'URL de la liste des pages

Vous devez modifier l’URL « http://undomaine.truc/la_liste_des_pages.html » par l’adresse internet d’un fichier qui contient la liste des pages à migrer sous forme de liens absolus (du type « <a href="http://mondomaine.tld/chemin/truc/bidule/unedespages.html">titre ou bien http://mondomaine.tld/chemin/truc/bidule/unedespages.html</a> »).

-  Au second endroit, ligne 57 :

//Quelques variables qu'il faut changer en fonction des cas:
//***À modifier par les utilisateurs***
        $auteur=18;     //id_auteur de tous les articles récupérés dans SPIP
        $id_rub=12;     //id_rubrique de ces articles
        $id_mot=151;    //id_mot à affecter à chaque article.

Vous devez modifier les variables avec l’id [1] de l’auteur que vous affectez à l’article (ici n°18), de la rubrique dans laquelle vous mettez —sans doute temporairement— l’article (ici n°12) et d’un mot-clé que vous associez à l’article (ici le mot clé n°151. Cela me sert à identifier facilement les articles migrés automatiquement).

Si vous utilisez SPIP 1.8.3 ou des versions antérieures, vous devez créer à la racine de votre site SPIP un fichier nommé « migration.php3 » qui contient :

<?php
	$fond='migration';
	$delais = 12 * 3600;
	include ('inc-public.php3');
?>

Pour Spip 1.9 et suivants, cette manipulation n’est pas nécessaire [2]

Ensuite il ne reste plus qu’à appeler la page du squelette concernée pour que la migration démarre : avec SPIP 1.9 et suivants c’est « http//votresite/spip.php?page=migration », avec un SPIP plus ancien c’est « http//votresite/migrations.php3 ».

Ce que ce script fait en détail :

  1. Ce squelette récupère une liste d’adresses internet contenues
    dans la page web http://undomaine.truc/la_liste_des_pages.html (à changer bien sûr), qui contient une suite de liens hypertexte vers les pages à migrer dans spip.
  2. Pour chaque adresse du site statique récupérée, il extrait le titre (ce sera le titre de l’article SPIP), isole le <body></body> de la page et le traite de la façon suivante :
    1. complétion des chemins relatifs, afin d’obtenir des chemins absolus,
    2. transformation des balises p, b, i, em, strong, hx en raccourcis typo de SPIP,
    3. transformation des liens type <a href=""></a> en [->] à la SPIP.
  3. Puis le <body></body> modifié est intégré dans un nouvel article SPIP avec :
    • un auteur choisi
    • un mot-clé choisi
    • un lien vers la page originelle
    • le tout dans une rubrique choisie
    • l’article a le statut « en cours de rédaction »
  4. Affiche dans le navigateur le résumé de tous les travaux du script.

Les limites de la solution proposée :

La limite principale est que je ne sais pas du tout programmer ! J’ai bidouillé à droite à gauche, le nez dans la doc de php et en jetant des coups d’œils ailleurs sur le web. J’ai fait de nombreux tests chez moi et ça marche même si je ne suis pas encore satisfait.

Il est évident que compte tenu de mon absence de compétence en php, le code doit être particulièrement « gruik » comme disent les Geeks et donc truffé de bogues et amplement perfectible (donc, à vos contributions !)...

Ce qui me manque encore (TODO par quelqu’un d’autre parce que moi je suis pas sûr d’y arriver en moins de 10 ans) :

-  Rendre le squelette plus accessible aux gens qui n’aiment pas se compliquer la vie : Le rendre capable de parcourir le site statique lui-même et d’y relever directement les adresses des pages à faire migrer (et non pas devoir passer par une série de find . -name "*.htm*">~/la_liste_des_pages.txt et d’expression régulières en perl pour obtenir seulement la liste des pages web).

-  rendre propre le HTML avant de le mettre dans Spip. Car les pages web statiques à migrer dans Spip ont été écrites avec divers éditeurs genre Frontpage et Dreamweaver et le code est très sale. Il n’est pas rare d’y voir :

<font face="Symbol"><p>·</font><font face="Arial"> </font><font face="Arial" size="2">Gniagniagnia<br>
      <font face="Symbol" size="2">·</font><font face="Arial" size="2">

avec des balises non fermées bein sûr, etc. J’ai essayé avec tidy (voir code php dans le squelette), sans succès.

-  Insérer les images et docs dans la base de donnée... Là c’est plutôt complexe. Je pense que je pourrais parvenir à tout insérer sans discernement et remplacer le HTML par le raccourci qui convient, mais le gros problème vient du fait que de nombreuses images (de déco principalement, genre puces et logos) sont réutilisées dans plusieurs pages web. Le pire étant que ces images, bien qu’identiques sont en plusieurs exemplaires sur le site statique, à des URL différentes.

-  transformation de certains raccourcis typos comme :

    • Les ancres et les hr à transformer en raccourcis typos
    • Les ol/li et ul/li à transformer par des puces-typo de SPIP : il faut faire un truc récursif et ça me fait très mal à la tête d’essayer de trouver comment on fait.

-  Enfin ultime désir qui ne sera jamais satisfait : Que le code HTML des pages statiques soit nettoyé de tous ces horribles enchevêtrements de tableaux qui servent à la mise-en-page et vont casser celle de SPIP basée sur de merveilleux CSS. Mais est-ce humainement possible de concevoir ça ?

Pour conclure

Voilà ! Ce script (qui est devenu squelette parce que je n’arrivais pas autrement à utiliser « spip_query ») j’y réfléchis depuis environ un an (mais pas souvent hélas) et je me suis mis à écrire (et surtout débugger chaque instruction, tant je suis nul) depuis quelques semaines. Il va me rendre un fier service car je n’ai pas loin de 2000 pages statiques à faire passer dans SPIP.

Il ne fait pas tout le boulot (classement dans SPIP dans les bonnes rubriques et avec les bon mots-clés, récupération de l’auteur, de la date, et d’autres babioles), mais aide quand même pas mal.

J’espère qu’à vous aussi il sera utile !

Notes

[1c’est à dire le numéro, celui qui s’affiche à gauche dans l’espace privé de SPIP

[2Pour de plus amples informations, allez lire Doc de SPIP : Où placer les fichiers de squelettes ?.

-  Je compte sur vous pour m’aider à « déguiker » ce squelette, pour qu’il fonctionne vite, bien et proprement chez tout le monde (et puis peut-être que vous pourriez vous pencher sur ma TODO list ! :o))
-  Merci aux écureuils de Wikipédia (suivre les liens des noms d’espèce pour les retrouver tous) d’avoir tenu la pause pour le logo de cet article...

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom