Descripción

Este script procesa artículos exportados desde mediawiki para interpretarlos adecuadamente en Moin con ayuda de unos analizadores sintácticos (parsers). 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.

Características

Por hacer

El Script

#@+leo-ver=4-encoding=iso-8859-1,.
#@+node:@file /home/offray/Documentos/Comunidad/migradorMediawikiAMoin.py
#@@language python
#@<< parsermedia declarations >>
#@+node:<< parsermedia declarations >>
## !/usr/bin/python
#@-node:<< parsermedia declarations >>
#@nl
#@+others
#@+node:parsermedia
# -*- coding: ISO-8859-1 -*-
# Estableciendo la configuración para no tener advertencias sobre caracteres no ASCII

def migradorMediawikiAMoin():
   # Esta función se encarga de facilitar la migración de artículos de mediawiki a wikipedia
   # para eso realiza dos labores esencialmente:
   #    
   # 1. Coloca unas líneas al comiezo de cada artículo que indican con qué analizador de sintaxis deben ser 
   #    interpretadas sus etiquetas.
   # 2. Modifica el contenido de los artículos transformando y/o agregando etiquetas de modo que su presentación
   #    y comportamiento sea consistente con el que había en mediawiki a pesar de que los dos wikis no son iguales.
   # 
   
   # IMPORTACIÓN DE MÓDULOS
   #########################
   
   # Importamos el módulo para trabajar con comandos del sistema Unix y obtener sus resultados como cadenas de 
   # caracteres
   import commands

   # Importamos el módulo para el trabajo con cadenas
   import string
   
   # Importamos el módulo para trabajar con operaciones de archivos
   import shutil
   
   #Importamos el módulo para trabajar con comandos del sistema
   import os
   
   # EXTRACCIÓN DE LAS PÁGINAS DE MEDIAWIKI
   #########################################

   # Invocamos la ejecución del script mediawiki2moin-extractor que se encarga de extraer la información que nos
   # interesa de la base de datos mysql de mediawiki y transformarla en archivos que siguen la jerarquía de
   # organización de Moin. El script toma como argumento un número entre 0 y 3, que corresponde al namespace
   # que se quiere extraer, de acuerdo a la convensión de mediawiki: 
   # 0 para artículos, 1 para discusión de artículos, 2 para usuarios y 3 para discusión de usuarios   
   print "*** EXTRAYENDO ARTICULOS DE LA BASE DE DATOS DE MEDIAWIKI ..."
   for i in range(4):
       os.system('php mediawiki2moin-extractor-2.php ' + str(i))
   print "*** EXTRACCIÓN TERMINADA :-)"

   # ADICION DE ETIQUETAS PARA EL SOPORTE A LA SINTAXIS HEREDADE DE MEDIAWIKI EN LOS ARTICULOS DENTRO DE MOIN
   ######################
   
   # Colocaremos:
   #
   # #format media
   # [[TableOfContents()]]
   #  
   # al inicio de todos los articulos extraidos de mediawiki. La primera línea se agrega  de modo que se puedan 
   # interpretar con ayuda del paser  'media.py', que le da soporte a algunos elementos de la sintaxis de wikipedia,
   # y la segunda línea genera automáticamente una tabla de contenido al comiezo de todos los artículos. Se supone 
   # que el parser nocamelcase.py, cuya función es evitar que las palabras con dos o más mayusculas sean convertidos 
   # automáticamente en enlaces, ya está activo y configurado para que sea usado a lo largo de todo el wiki, así 
   # mismo, que existe un archivo que contiene este par de líneas y se llama parsers.txt
      

    
   # Encontramos los archivos a los que les queremos hacer la adición de etiquetas. Para esto usamos el hecho de
   # que Moin guarda las revisiones de los archivos con un número consecutivo empezando en 00000001:
   archivos = commands.getoutput("find -name '00000001'  -print")
   
   # Ahora dividimos la cadena anterior para que nos dé una lista con items individuales para cada archivo encontrado
   lista_archivos = string.split(archivos)
   for i in range(len(lista_archivos)):
       # Abrimos el archivo con la líneas que queremos agregar
       cabecera = open('parsers.txt')
       # abrimos el archivo de destino
       archivo = open(lista_archivos[i])
       # abrimos un archivo temporal y copiamos los dos anteriores a él
       temp = open('temp.txt', 'w')
       temp.writelines(cabecera.readlines() + archivo.readlines())    
       
       
       # Ahora copiamos línea a línea lo que hay en 'temp' al archivo original. Esto nos da la oportunidad de 
       # encontrar y transformar etiquetas como "[[User:" y "[[category:" de las páginas heredadas de mediawiki
       # a sus equivalentes en Moin, ya que corresponden a namespaces no presentes en el modelo de almacenamiento
       # de este último o a sintaxis no empleadas por él.
       
       # Primero cerramos los archivos:
       cabecera.close()
       archivo.close()
       temp.close()
       
       # Y los reabrimos con los permisos apropiados para hacer el copiado.
       temp = open('temp.txt','r')
       archivo = open(lista_archivos[i],'w')

       
       for linea in temp:
           # Hacemos las búsquedas de las secuencias que queremos reemplazar para que queden transformadas del 
           # etiquetado de mediawiki al de moin
           if string.find(linea,"[[Usuario") > 0 :
               linea = string.replace(linea,"[[Usuario:","[[")
           if string.find(linea,"category:") > 0 :
               linea = string.replace(linea,"category:","category") 
           if string.find(linea,"<code>") > 0:
               linea = string.replace(linea,"<code>","<tt>")
           if string.find(linea,"</code>") > 0:
               linea = string.replace(linea,"</code>","</tt>")        
           archivo.write(linea)
       
       # Algo de feedback para el usuario:    
       print ("migrando archivos...", i+1)
       
       # Ahora cerramos definitivamente los archivos reabiertos
       temp.close()
       archivo.close()
       
   # RENOMBRADO DE LAS PÁGINAS DE DISCUSIÓN MIGRADAS DE ACUERDO A LA CONVENSIÓN DE MOIN
   
   # Encontramos los archivos que corresponden a las páginas de discusión. Para esto usamos el hecho de
   # que fueron guardados en una carpeta que contiene los caracteres 'discusion' en la ruta:
   paginasDiscusion = commands.getoutput("find mediawiki_contenido/discusion -name '00000001'  -print")
   
   # Ahora dividimos la cadena anterior para que nos dé una lista con items individuales para cada archivo encontrado
   lista_paginasDiscusion = string.split(paginasDiscusion) 
   
   # Y cambiamos cada nombre de archivo anexándole al final '(2f)Talk' que sería el equivalente a nombrarlos como la 
   # subpágina '<nombre_archivo>/Talk' en las convenciones de Moin
   print "*** RENOMBRANDO PÁGINAS DE DISCUSIÓN ... ***"
   for i in range(len(lista_paginasDiscusion)):
       shutil.move(lista_paginasDiscusion[i][:-19], lista_paginasDiscusion[i][:-19] + '(2f)Talk')
   print " RENOMBRADO TERMINADO ..."

   # ADICIÓN DE CATEGORÍAS PARA LAS PÁGINAS DE USUARIO
   #####################

   # Vamos a colocar las etiquetas "[[CageroryPaginaPersonal]]" en todas las páginas de los usuarios, de modo que se
   # puedan clasificar, categorizar y agrupar.

   # Encontramos los archivos que corresponden a las páginas de los usuarios. Para esto usamos el hecho de
   # que fueron guardados en una carpeta que contiene los caracteres 'usuarios' en la ruta:
   paginasUsuarios = commands.getoutput("find mediawiki_contenido/paginas/usuarios -name '00000001'  -print")
   
   # Ahora dividimos la cadena anterior para que nos dé una lista con items individuales para cada archivo encontrado
   lista_paginasUsuarios = string.split(paginasUsuarios) 
   
   # Y agregamos "[[CategoryPaginaPersonal]]" al final de cada página
   print "*** ADICIONANDO CATEGORIAS A PÁGINAS DE USUARIOS ... "
   for i in range(len(lista_paginasUsuarios)):
       os.system('echo "[[CategoryPaginaPersonal]]" >> ' + lista_paginasUsuarios[i])
       print "categorizando " + str(i+1) + " páginas de usuario"
   print "*** MIGRACIÓN FINALIZADA!!! :-) ... Wikifícate ;-) ***"

# Test: aca invocamos ejecución del programa
migradorMediawikiAMoin()





#@-node:parsermedia
#@-others
#@-node:@file /home/offray/Documentos/Comunidad/migradorMediawikiAMoin.py
#@-leo

MigradorMediaAMoin.py (last edited 2008-04-20 14:37:41 by localhost)