OWarux

sábado, abril 08, 2006

PROYECTO=$InCopy_Parser_[4];

Continuando con este proyecto, una vez hecho el código para poder entrar al archivo INCD y extraer el texto, hemos de diseñar un programa en PHP que recorra un directorio donde se almacenan los documentos INCD y extraiga de cada uno el texto correspondiente, es decir, que lo "parsee".
En este capitulo del proyecto, haremos la programación para recorrer el directorio donde se encuentra el mismo script, en futuros capitulos haremos que lo haga para diversos directorios, sin necesidad de que el archivo php se encuentre dentro, entonces la finalidad de este programa, por lo pronto, es que lea todos los archivos del directorio y extraiga el texto de cada uno, lo guarde en dos variables (como vimos en el capitulo anterior) que son $text y $screen, y que nos muestre en pantalla el contenido de $screen, la variable $text será la que se guarda en la base de datos MySQL, pero sera en otro capitulo, por lo pronto sólo usaremos $screen.
Bien, antes que nada necesitamos que nuestro archivo PHP comienze con una definición de documento HTML, que será la siguiente:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml
">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Parseando Documentos de Incopy</title>
</head>
 
Esto se hace para definir que usaremos como base la codificación iso-8859-1, de lo contrario podemos tener problemas con los resultados de nuestro texto extraido.
Ya dentro de los tags <body> </body> de nuestro archivo, es donde pondremos nuestra codificacion PHP, dentro de sus respectivos tags <php? ?> por supuesto.
Entrando de lleno al código, primero utilizamos el código del capitulo anterior, pero esta vez lo definiremos como una función, para poder utilizarlo mejor, la codificación será la siguiente:
 
function parseame($el_file) {
 $text=$screen="";
 $XMLDoc = DOMDocument::load($el_file);
 $root = $XMLDoc->documentElement;
 $children = $root->childNodes;
 for ($child = $root->firstChild;
 $child;
 $child = $child->nextSibling){
 if  ($child->nodeName=="aic:story") {
     $text=str_replace("
","\n\r",$child->nodeValue);
  $screen=str_replace("
","<br>",$child->nodeValue);
  $text=utf8_decode($text);
  $screen=utf8_decode($screen);
  }
   }
   echo $screen;
}
 
Pro si no lo notan, le he agragado la inicialización de las variables $text y $screen, de lo contrario, PHP puede mostrarles un error y no darles ninguna salida. Nuestra función de llama parseame, y tiene como argumento la variable $el_file. Los resultados de esto estan en el capitulo anterior de la serie.
Ahora vamos a lo nuevo, como exploramos nuestro directorio. para esto primero debemos saber que en cada directorio puede haber subdirectorios y que dicho directorio puede tener un directorio padre (el cual en consola puede verse como .. dos puntos). Por esto creamos una funcion que determine si un item en el directorio es o no un directorio (ya sea subdirectorio o directorio padre), dicha función es la siguiente:
 
function es_directorio($un_dir,$un_item) {
 if ($un_dir=='/') {
  $fich_a_preguntar="/$un_item";
  }
 else {
  $fich_a_preguntar="$un_dir/$un_item";
  }
 return (is_dir("$fich_a_preguntar"));
 }
 
En esta función pasamos como argumentos las variables $un_dir y $un_item, que son el directorio actual donde nos encontramos y el item es un elemento de dicho directorio. Primero checamos si estamos en la raiz del arbol de directorios, si es asi, $fich_a_preguntar esta en la raiz, si no, el $item se encuentra en un directorio que no es el raiz, una vez establecido donde esta el $item, preguntamos si es un directorio y regresamos el resultado.
 
Ahora el código que utiliza las dos funciones anteriores es el siguiente:
 
$nuevo_dir=getcwd();
echo "<h2>Carpeta: <i>$nuevo_dir</i></h2>";
 
if (!$df_dir=opendir($nuevo_dir))
 die("<h3>*** ERROR: No se ha podido entrar en ($nuevo_dir)</h3>");
 
while (($item=readdir($df_dir)) !== false) {
 if ($item==".") continue;
 if (!es_directorio($nuevo_dir, $item)) {
  echo "$item<br>";
  parseame($item);
  echo "<hr>";
  }
 }
closedir($df_dir);
 
Con este código lo que hacemos es lo siguiente, en $nuevo_dir guardamos la ruta de nuestro actual directorio (cwd - current working directory), en este ejemplo, a manera informativa en pantalla mostramos la ruta actual de trabajo, esta línea se debe omitir cuando el sistema ya este en producción.
Despues probamos que el directorio donde estamos trabajando pueda ser evaluado por nuestro script (lógicamente en este ejemplo no habrá problema, pero se debe dejar la validación para cuando específiquemos una ruta de trabajo diferente a donde se encuentra el archivo PHP), ejecutamos la función opendir() y el resultado, que es un descriptor del directorio, lo guardamos en $df_dir, si no se puede nos marcará error.
Después con un bucle while recorremos todo el directorio, en cada ciclo leemos un objeto del descriptor y lo guardamos en $item, si el valor del $item es ".", continuamos, este punto es el directorio mismo, por eso no lo evaluamos; si $item tiene otro valor, determinamos si es un directorio o un archivo, con la función es_directorio(), si el $item es un archivo, mandamos a pantalla su nombre y ejecutamos la funcion parseame() y obtenemos el texto del archivo INCD y despues ponemos una linea para diferenciar del siguiente archivo si es que lo hay (nótese que este script evaluará TODOS los archivos, no importa si son INCD o no).
Después de leer todo el directorio, cerramos el descriptor con la función closerdir().
Bueno, eso es todo por este capítulo, en el próximo veremos la creacion de nuestra tabla en MySQL y la(s) tabla(s) que manejaremos con sus respectivos campos, además de ver como guardariamos nuestro texto generado en dicha base de datos.
 
[owar@owarux ~]$echo "Goodnight!!!"