Transcoder MediaWiki en SPIP

© Christian PAULUS. Document créé le 24 août 2009 , mis à jour le 30 août 2009.

L'Homme est une prison où l'Âme reste libre. Victor Hugo

Accueil du site > Outils > Transcoder MediaWiki en SPIP

OpenOffice.org / MacOsX 10.5.7 (Leopard)

Objectif simple : rédiger un article avec OpenOffice.org et importer le résultat dans SPIP.
Quelques contraintes : ne pas utiliser de plugin, ni de macro mais simplement une ligne de commande pour transcoder le résultat.

OOo ne sait pas exporter au format SPIP. Par contre, il sait le faire aux formats HTML et MediaWiki. C’est ce dernier format qui est choisi ici.

Pour pouvoir utiliser OOo_MediaWiki2SPIP, vous devez avoir PHP installé sur votre ordinateur.

Vous trouverez plus loin ici :

Avertissements

N’installez pas OOo_MediaWiki2SPIP en production sans l’avoir testé et validé correctement.

OOo_MediaWiki2SPIP est diffusé gratuitement sous licences MIT GPL, sans aucune garantie de bon fonctionnement. Vous êtes seul responsable de l’installation et de la mise en œuvre de OOo_MediaWiki2SPIP sur votre ordinateur.

Fonctionnement

Le fonctionnement de OOo_MediaWiki2SPIP est très basique.

OOo_MediaWiki2SPIP a été réalisé pour un texte simple issu d’OOo (exportation MediaWiki). Sont pris en compte :

  • les enrichissements gras et italiques
  • les titres
  • les tableaux (limité) avec cellules fusionnées horizontalement
  • les listes
  • les notes de bas de page

Ecrire pour SPIP

  1. Rédigez votre article à l’aide d’OpenOffice.org Writer
  2. Exportez-le au format MediaWiki
  3. Lancez votre terminal et lancez la commande :

OOo_MediaWiki2SPIP.php mon_fichier.txt

Le résultat apparaît dans un nouveau fichier mon_fichier.spip.txt

Si ce nouveau fichier existe déjà, un autre fichier sera créé, du style mon_fichier.spip.2.txt

Suis-je obligé d’avoir un MacOSx pour faire tourner OOo_MediaWiki2SPIP ?

Non. Par contre, PHP doit être installé sur votre ordinateur.

OOo_MediaWiki2SPIP, le code

#!/usr/bin/php
<?php

/**
* OOo_MediaWiki2SPIP.php
* (c) Christian Paulus - cpaulus@quesaco.org
* Distribué sous licences MIT et GPL
*
* script à utiliser en ligne de commande (CLI)
*
* Ce script est très 'basique'. Il a été réalisé pour
* un texte simple issu d'OOo (exportation MediaWiki).
* Sont pris en compte:
* - les enrichissements gras et italiques
* - les titres
* - les tableaux (limité) avec cellules fusionnées horizontalement
* - les listes
* - les notes de bas de page
*
* Principe d'utilisation :
* 1/ rédigez votre article dans OOo Writer
* 2/ Exportez votre ou vos fichiers
* 3/ Dans le terminal, appelez ce script avec vos fichiers en arguments.
*
* Vos fichiers d'origine ne sont pas modifiés.
* Le transcodage est ajouté dans un fichier qui porte le même nom
* que votre fichier, avec le suffix précédé de spip
* (ex: montexte.txt traduction dans montexte.spip.txt)
* (si fichier dest. existe déjà, incrémente le suffix spip)
*
* $LastChangedRevision: 187 $
* $LastChangedBy: cpaulus $
* $LastChangedDate: 2009-08-24 15:51:23 +0200 (Lun 24 aoû 2009) $
*
* @see: http://www.mediawiki.org/wiki/Help:Formatting
*
* @todo: vérifier listes imbriquées, etc.
* @todo: les tableaux: cellules fusionnées :
*   ne sait pas traiter rowspan (existe ?)
*/

if(($argv = $_SERVER['argv']) && is_array($argv)) {
       
        $to_sdout = $verbose = $simuler = false;
        $nb_fichiers_ok = 0;
       
        $curdir = getcwd().'/';
       
        define('MW2S_USAGE',
                'usage: '.$script.' [-c -h -s -v] [-s logfile] <file> [files ...]');
        define('MW2S_MAXF', 64); // nb max de traductions pour un fichier
        define('MW2S_EXT_SPIP', '.spip');
        define('MW2S_EXT_TXT', '.txt');
        define('MW2S_MAX_SIZE', 32000); // taille max du résultat enregistré
       
        $script = basename(array_shift($argv));
       
        if(count($argv)) {
               
                function mw2s_sdtout($str, $n = "\n") {
                        if($fp = fopen('php://stdout', 'w')) {
                                fputs($fp, $str.$n);
                                fclose($fp);
                        }
                }
               
                function mw2s_sderr($str, $n = "\n") {
                        if($fp = fopen('php://stderr', 'w')) {
                                fputs($fp, $str.$n);
                                fclose($fp);
                        }
                }
               
                function mw2s_log($str, $n = "\n") {
                        global $logfile;
                        static $filename;
                        if(!$filename) {
                                $filename =
                                        (!$logfile)
                                        ? "/tmp/ooo_mediawiki2spip.log"
                                        : $logfile
                                        ;
                        }
                       
                        if($logfile && ($logfile != $filename)) {
                                $filename = $logfile;
                        };
                       
                        if($fp = fopen($filename, 'a')) {
                                fputs($fp, date(DATE_RFC822) . " " . $str . $n);
                                fclose($fp);
                        }
                }
               
                function mw2s_help($a) {
                        $msg = array(
                                "Basic MediaWiki to SPIP text converter"
                                , MW2S_USAGE
                                , ""
                                , "\t-c --stdout\twrite on standard output"
                                , "\t-h --help\tgive this help"
                                , "\t-l <logfile> --log <logfile>\tlog to file logfile"
                                , "\t-s --simulate\tsimulation mode"
                                , "\t-v --verbose\tverbose mode"
                                );
                        mw2s_sdtout(implode("\n", $msg));
                        return(true);
                }

                function mw2s_get_new_filename ($filename)
                {
                        $pattern = "(.*)".MW2S_EXT_SPIP."(\.[0-9]+)?".MW2S_EXT_TXT."$";
                        $longsuffix = MW2S_EXT_SPIP.MW2S_EXT_TXT;
                       
                        // si filename pas de style spip, le créer
                        if(!preg_match("@" . $pattern . "@", $filename)) {
                                $filename =
                                                (
                                                        (($pos = strrpos($filename, MW2S_EXT_TXT)) !== false)
                                                        && (substr($filename, $pos) == MW2S_EXT_TXT)
                                                )
                                                ? substr($filename, 0, $pos) . $longsuffix
                                                : $filename .= $longsuffix
                                                ;
                        }
                       
                        // si déjà présent, incrémenter
                        if(
                                file_exists($filename)
                                && preg_match("@" . $pattern . "@", $filename, $matches)
                        ) {
                                // a déjà le longsuffix. Incrémenter
                                // pour trouver un nom de fichier dispo.
                                $left = $matches[1];
                                $ii = (($ii = intval($matches[2])) > 1) ? $ii++ : 2;
                                for(; $ii<MW2S_MAXF; $ii++) {
                                        if(!file_exists($filename = $left.MW2S_EXT_SPIP.'.'.$ii.MW2S_EXT_TXT)) break;
                                }
                        }
                        return($filename);
                }
               
                $files = array();
                $ii=0;

                while($arg = array_shift($argv)) {
                       
                        switch($arg) {
                               
                                case '--help':
                                case '-h':
                                        mw2s_help($argv);       
                                        break;
                               
                                case '--log':
                                case '-l':
                                        $logfile = array_shift($argv);
                                        break;

                                case '--stdout':
                                case '-c':
                                        $to_sdout = true;
                                        break;
                               
                                case '--simulate':
                                case '-s':
                                        $simuler = true;
                                        break;
                                       
                                case '--verbose':
                                case '-verbose':
                                case '-v':
                                        $verbose = true;
                                        break;
                               
                                default:
                                        $files[] = $arg;
                        }
                }
                sort($files);
                $files = array_unique($files);

                if(count($files)) {

                        $replacement = array(
                                '@\'\'\'(.*)\'\'\'@' => '{{\\1}}' // gras
                                , '@\'\'(.*)\'\'@' => '{\\1}' // ital
                                , '@===[[:space:]]*(.*)===@m' => '{\\1}' // h3
                                , '@==[[:space:]]*(.*)==@m' => '{{\\1}}' // h2
                                , '@^=[[:space:]]*(.*)=$@m' => '{{{\\1}}}' // h1
                                , '@^\*[[:space:]]*(.*)$@m' => '-* \\1' // ul/li
                                , '@^#[[:space:]]*(.*)$@m' => '-# \\1' // ol/li
                                , '@<ref([^>]*)>([^<]*)</ref>@' => '[[\\2]]'
                                , '@^----$@m' => ''
                                , '@^<references/>$@m' => ''
                        );
                       
                        // traitement spécial pour les tableaux
                        $replacement_tableaux = array(
                                '@</?center>@m' => '' // supprimer les "<center>"
                                , '@(class="(.*)")@m' => '' // pas de luttes de classes
                                , '@\! ([^<|!\n]*)@m' => '|{{ \\1 }}'
                                , '@([\n]{2})@x' => "|\n" // dernier pipe en fin de ligne
                                , '@\|-@' => "" // supprimer le reste
                                , '@^{\|@' => ""
                                , '@\|}$@m' => ""
                                , '@([ ]*\n)@' => "\n" // fin de ligne sans espace
                                , '@([^\|])\n@' => "\\1" // supprimer les lignes vides
                        );
                        $tableau_keys = array_keys($replacement_tableaux);
                        $tableau_vals = array_values($replacement_tableaux);
                       
                        function mw2s_replace_colspan ($matches) {
                                $result = $matches[1];
                                $nb = intval($matches[2]);
                                if($nb > 1) {
                                        $result = str_repeat('|', $nb - 1) . $matches[3] . "|<";
                                }
                                return($result);
                        }
                       
                        function mw2s_replace_tableaux ($matches) {
                                global $tableau_keys, $tableau_vals;
                                $result = preg_replace($tableau_keys, $tableau_vals, $matches[1]);
                                // traiter les cellules fusionnées (colspan uniquement)
                                $result = preg_replace_callback(
                                        '@(\| colspan="([[:digit:]])" \|([^\|]*))@'
                                        , 'mw2s_replace_colspan', $result);
                                return($result);
                        }
                       
                        foreach($files as $file) {
                                if(
                                        (
                                                file_exists($f = $file)
                                                || file_exists($f = $curdir . $file)
                                                )
                                        && is_file($f)
                                ) {
                                       
                                        if($to_sdout) {
                                                $out = 'STDOUT';
                                        }
                                       
                                        if($verbose) {
                                                        mw2s_sdtout(' translate file '.$file.' > '.$out);
                                        }
                                       
                                        // remplacements basiques
                                        $result = preg_replace(
                                                array_keys($replacement)
                                                , array_values($replacement)
                                                , file_get_contents($f)
                                                );
                                       
                                        // traiter le tableau dispersé sur plusieurs lignes
                                        $result = preg_replace_callback(
                                                '@({\|.*\|})@s'
                                                , 'mw2s_replace_tableaux'
                                                , $result
                                                );
                                       
                                        if(!$simuler) {
                                                $ok_msg = "";
                                                if($to_sdout) {
                                                        mw2s_sdtout($result);
                                                }
                                                else {
                                                       
                                                        if($out = mw2s_get_new_filename($file)) {
                                                       
                                                                if($fp = fopen($out, 'w')) {
                                                                        fwrite($fp, $result, MW2S_MAX_SIZE);
                                                                        fclose($fp);
                                                                        $ok_msg .= $out."\n";
                                                                        $nb_fichiers_ok++;
                                                                }
                                                                if($logfile) {
                                                                        mw2s_log("Fichier ".$out);
                                                                }
                                                        }
                                                }
                                        }
                                }
                                else {
                                        mw2s_sderr(' ! erreur sur fichier '.$file);
                                }
                        }
                }
        }
        else {
                die(MW2S_USAGE);
        }
}
else {
        die("Ce script n'est utilisable qu'en mode ligne de commande");
}
$s = (($nb_fichiers_ok > 1) ? 's' : '');
$msg = ($nb_fichiers_ok ? "$nb_fichiers_ok fichier$s transcodé$s pour SPIP" : false);

exit($msg);
       
?>

Et voici la version téléchargeable du script :

Zip - 3 ko
OOo_MediaWiki2SPIP.php

OOo_MediaWiki2SPIP avec Automator/MacOSx

Le script ci-dessus a été placé dans un ensemble a-la-automator. Automator n’existe - pour l’instant - que sur MacOSx.

La création de l’ensemble sous Automator n’est pas illustré ici. Voir ce billet pour un exemple de création sous Automator, et celui-ci qui donne la marche à suivre pour ajouter PHP en tant qu’interpréteur de script pour Automator.

Zip - 434.7 ko
OOo_MediaWiki2SPIP.app
  1. Téléchargez et décompressez OOo_MediaWiki2SPIP ci-dessus
  2. Placez-le sur le bureau (par exemple) ;
  3. Effectuez un glisser/déplacer de quelques fichiers txt issus de l’exportation OpenOffice.org au format Mediawiki. Les fichiers transcodés apparaissent peu à peu à côté des fichiers originaux.

Bon transcodage !

Plussoyez !

Les forums sont fermés.