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

3 discussions

  • 7

    Très utile cette contrib ! Justement j’ai aussi des pages HTML migrer sur spip.

    Mais telle quelle, cette contrib ne me va pas :-). Est-il possible d’y contribuer et de définir des objectifs ensemble ?

    • Cette contrib’ est GPL donc tu peux y contribuer et la modifier sans souci.

      Pour ma part, avant de la mettre « en production » j’ai fait quelques petites modifs que je répercuterai d’ici la fin de la semaine (surtout sur la conversion en raccourcis typos).

      Pour ce qui est de définir des objectifs, je ne suis pas sûr d’avoir le temps de beaucoup y travailler désormais que la migration de mon site est faite. Mais je suis ouvert à toute discussion-modification-contribution !

    • Je vois ça comme ça :

      -  Définition de règles de transformation de code html en spip (comme ... en ...), communes à toutes les pages. Je suggère d’écrire ces règles dans un fichier .txt, afin de pouvoir les améliorer et/ou les adapter à son site.
      -  Parcours de tous les fichiers d’une structure répertoires/pages, où les répertoires deviendront des sous-rubriques et les pages des articles.
      -  Pour chaque page, parcours du code html pour nettoyage des balises et attributs périmés (notamment ), et en même temps exécution des règles de transformation. Le code est alors sous la forme d’une arborescence de balises.
      -  Réécriture du code nettoyé et transformé.
      -  Création du nouvel article.

      Pour l’instant j’ai réalisé le nettoyage du code html (3e et 4e actions) de pages écrites avec FrontPage. Il m’en faudrait d’autres pour tester.

      Mais j’ai des problèmes :
      -  pour parcourir une arborescence de répertoires/pages, il faut la télécharger sur le site (d’un autre côté, ça évite le vol de site)
      -  je n’ai pas résolu les problèmes des images...

    • virinxx

      Bonjour,

      Je trouve cet article interressant car je suis un nouveau venu dans le monde spip.
      Le seul probleme est que je n’arrive pas à utiliser ce script.
      En effet dès que j’essai, il ne me trouve rien (j’ai un message d’erreur).
      Pour info, mon fichier et dnas un répertoire squelettes/.
      J’utilise la dernière version de SPIP.

      Quelqu’un peut m’aider SVP.
      Merci !

    • Bonsoir,

      cet article m’intéresse aussi beaucoup, j’ai un site statique de 500 articles à migrer sous SPIP ....

      j’ai essayé le script, j’obtiens :

      traitement de aa.html

      Warning : file_get_contents(aa.html) [function.file-get-contents] : failed to open stream : No such file or directory in /home/xxx/www/xxx/ecrire/public.php(173) : eval()’d code on line 94
      titre :aa.html

      L’article n°0 (titre : aa.html ) est dans la base de Spip !

      j’ai raté quelque chose ?

      La fonction file_get_contents est censée se trouvée où ?
      Pour info je suis au dernier niveau de Spip, et hébergé chez OVH.

      Merci par avance.

    • Amaury

      j’ai moi aussi un souci. Tout à l’air de bien fonctionner puisque j’ai une page me listant l’intégralité des articles et me disant qu’ils ont été ajoutés à la base de spip mais lorsque je fais un petit tour sur la partie privée, aucun d’entre eux n’apparaît.
      J’ai fait attention à ce que l’identifiant de l’auteur soit bien le bon (pas dur, il n’y en a qu’un) et à ce qu’une rubrique réceptrice existe (pas dur là aussi)

      J’avoue que je sèche complètement.

      Aurais-je raté quelque chose ?

    • J’ai exactement le même problème, je paramètre tout comme il faut (j’ai vérifiée plusieurs fois) et j’ai le message disant que tout est bien inséré dans la base spip, et quand je m’y rend il n’y a absolument rien... étrange... quelqu’un de calé en devellopement pourrais t’il dire pourquoi ? car cet outil est , dans l’absolu, exactement ce que je recherche, même si il n’est pas complet. Ca m’évitera de faire 200 ou 300 copier / coller ...

    • En fait, il semblerait que tous les articles se retrouve avec le numéro d’identifiant 0 et que celui-ci ne s’incrémente pas. Peut-être faudrait-il creuser de ce côté là mais mes compétences techniques sont un peu limites.

    Répondre à ce message

  • Bonjour,
    J’essaie d’utiliser la contribution « Faire migrer un site statique vers spip » http://www.spip-contrib.net/Faire-migrer-un-site-statique-vers#forum391856

    j’obtiens ce message

    titre :ADBDP : journées 2002 : Didier Guilbaud
    <http://www.adbdp.asso.fr/associatio...>

    /L’article n°0 (titre : ADBDP : journées 2002 : Didier Guilbaud ) est dans la base de Spip !/ <http://www.adbdp.asso.fr/associatio...>


    fini !
    *Fatal error* : Cannot break/continue 1 level in *c :\program files\easyphp1-8\www\spipadbdp\ecrire\public.php(173) : eval()’d code* on line *49* <http://www.adbdp.asso.fr/associatio...>

    Est-ce un abonné à déjà utiliser cette contribution avec succès et pourrait éclaire ma lanterne.
    Cordialement. BS

    Répondre à ce message

  • Félicitation, pour quelqu’un qui affirme ne pas savoir coder, c’est plutôt bien.
    Pour ma part si j’avais 2000 pages à transcrire.
    wget -m permet de faire un mirroir en local sur sa machine
    find la_racine_du_site_local -iname « *.htm[l]* » |xargs un_sous_programe

    dans le sous programme
    nettoyage du html et transformation en xml avec tidy (c’est fait pour cela) avec l’option -asxhtml
    utilisation d’une feuille, ou plusieurs xslt pour faire la transformation et écrire automatiquement le programme php d’importation
    (la transformation peut être faite avec xsltrpoc ou avec les possibilité de manipulation XML de php5)
    L’avantage de la feuille xslt et la manipulation « facile » quand on maitrise le xslt.

    Répondre à ce message

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