©
. Document créé le 24 août 2009 , mis à jour le 30 août 2009.L'homme qui ne tente rien ne se trompe qu'une fois. Lao-Tseu
Accueil du site > Outils > Transcoder MediaWiki en SPIP
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 :
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.
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 :
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.
#!/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 :
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.
Bon transcodage !
Les forums sont fermés.