MediaWiki Extractor

Categorías: Wiki

1. Descripción

Este script se conecta a un snapshot de la base de datos de mediawiki y los organiza de acuerdo al formato de almacenamiento de Moin. La versión Wiki se crea con el ánimo de tener un historial de los cambios en el script, en la medida en que el trabajo avanza. Para más detalles sobre este script vea Migrando_de_mediawiki_a_moin.

Copie el código contenido en la caja azul para guardarlo. Fue generado en Leo y tiene algunas etiquetas en los comentarios que sirven para estructurarlo dentro del mismo.

2. Lo pendiente

Este script se invoca desde la línea de comandos. Sería chévere integrar su ejecución dentro del programa de Python Parsermedia.py para que la invocación de este se encargue de todo más comodamente.

3. El script

//@+leo-ver=4-encoding=iso-8859-1,.
//@+node:@file /home/offray/Documentos/Comunidad/mediawiki2moin-v0.3.2.php
//@@language php
#!/usr/bin/php4
<?php

$host = "localhost";  //address of the mysql server
$usr = "offray";          //username
$passwd = "";   //password
$db = "wikisoftlibre";          //database

$link = mysql_pconnect($host,$usr,$passwd) or die(mysql_error());
mysql_select_db($db) or die("Could not select database");

# Creamos una pequeña jerarquía que nos permita organizar la información
mkdir("mediawiki_contenido");
mkdir("mediawiki_contenido/discusion");
mkdir("mediawiki_contenido/paginas");

extraccion($argv[1]);
chdir("..");

###End of Main


function extraccion($namespace) {
    # Acá seleccionamos los archivos de la base de datos de acuerdo a la convención de namespaces de la Wikipedia:
    # 0 para artículos, 1 para discusión de artículos, 2 para usuarios y 3 para discusión de usuarios

    $a = 0;
    $sql = "SELECT cur_title,cur_text FROM cur WHERE cur_namespace=".$namespace." AND cur_user_text not like \"MediaWiki default\" ORDER BY cur_title;";
    $query = mysql_query($sql) or die(mysql_error());
    while ($row = mysql_fetch_object($query)) {
        if (!in_array($row->cur_title, $not_pages)) {
            $title[$a] = $row->cur_title;
            $text[$a] = $row->cur_text;
            $a++;
        }
    }

    switch($namespace) {
       case 0:
         $dir = "mediawiki_contenido/paginas/articulos";
         break;
       case 1:
         $dir = "mediawiki_contenido/discusion/articulos";
         break;
       case 2:
         $dir = "mediawiki_contenido/paginas/usuarios";
         break;
       case 3:
         $dir = "mediawiki_contenido/discusion/usuarios";
         break;
    }

    if(file_exists($dir)){
       rmdirr($dir);
       mkdir($dir);
    }
    else{
       mkdir($dir);
    }


    chdir("$dir") or die;


    $a = 0;


    while ($a < count($title)) {
       echo "$title[$a]\n";

        # reemplazamos ':' por '/' y '/ ' por '/' en el título de modo que se generan automáticamente jerarquías y
        # también cambiamos ' ' por '_' para adaptarlo al formato moin
        $title[$a] = str_replace(":", "/", $title[$a]);
        $title[$a] = str_replace(" ", "_", $title[$a]);
        $title[$a] = str_replace("/ ", "/", $title[$a]);
        $quoted = array();
        $in_parenthesis = false;
        for ($i = 0; $i < strlen($title[$a]); $i++) {

            $curchar = substr ($title[$a], $i, 1);
            if (ereg('[^a-zA-Z0-9_]', $curchar)) {
                if (!$in_parenthesis) {
                    $quoted[] = '(';
                    $in_parenthesis = true;
                }
                $quoted[] = str_pad(dechex(ord($curchar)), 2, '0', STR_PAD_LEFT);
            } else {
                if ($in_parenthesis) {
                    $quoted[] = ')';
                    $in_parenthesis = false;
                }
                $quoted[] = $curchar;
            }
        }

        if ($in_parenthesis)
            $quoted[] = ')';
        $title[$a] = implode('', $quoted);
        unset($quoted);

        mkdir($title[$a]);
        chdir($title[$a]);
        $file = fopen("current", "w");
        fputs($file, "00000001");

        fclose($file);

        mkdir("revisions");

        chdir("revisions");

        $file = fopen("00000001", "w");

       #break up one string into lines
        $file_text = explode("\n", $text[$a]);


        $b = 0;

        while ($b < count($file_text)) {

            fputs($file, rtrim($file_text[$b]) . "\n");
            $b++;
        }

        unset($file_text);
        fclose($file);
        chdir("..");
        chdir("..");
        $a++;
    }
}
function rmdirr($dir) {
   if($objs = glob($dir."/*")){
       foreach($objs as $obj) {
           is_dir($obj)? rmdirr($obj) : unlink($obj);
       }
   }
   rmdir($dir);
}

?>
//@nonl
//@-node:@file /home/offray/Documentos/Comunidad/mediawiki2moin-v0.3.2.php
//@-leo

MediaWikiExtractor (last edited 2008-04-20 14:38:44 by localhost)