OWarux

lunes, abril 03, 2006

PROYECTO=$InCopy_Parser_[3];

Continuando con este proyecto, primero debemos de analizar como esta constituido un documento INCD de InCopy. Abajo se muestra el arbol de documento XML que lo compone:
 
Comienza documento INCD
 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

 <aic:document name="mi_iso" ver="2.0" page="0 0 0 0 40832000 0 4088c000 0">

 <aic:swatchlist>
<aic:color name="C=100 M=0 Y=0 K=0" cspace="cmyk" type="process" vals="3ff00000 0,0 0,0 0,0 0"/>
<aic:color name="C=0 M=100 Y=0 K=0" cspace="cmyk" type="process" vals="0 0,3ff00000 0,0 0,0 0"/>
<aic:color name="C=0 M=0 Y=100 K=0" cspace="cmyk" type="process" vals="0 0,0 0,3ff00000 0,0 0"/>
<aic:color name="C=15 M=100 Y=100 K=0" cspace="cmyk" type="process" vals="3fc33333 33333333,3ff00000 0,3ff00000 0,0 0"/>
<aic:color name="C=75 M=5 Y=100 K=0" cspace="cmyk" type="process" vals="3fe80000 0,3fa99999 9999999a,3ff00000 0,0 0"/>
<aic:color name="C=100 M=90 Y=10 K=0" cspace="cmyk" type="process" vals="3ff00000 0,3feccccc cccccccd,3fb99999 9999999a,0 0"/>
</aic:swatchlist>

 <aic:taglist>
<aic:tag name="Root" clr="0"/>
</aic:taglist>


 <aic:story xml:space="preserve" track="0" dFont="Times New Roman" optalign="0" optsize="40280000 0">
<aic:pstyle name="[No paragraph style]"/>
<aic:cstyle name="[No character style]"/>
<aic:clang lang="Spanish: Castilian"/>
Este es contenido de un documento de Incopy en UTF-8

</aic:story>

 <aic:userlist>
<aic:user name="Unknown User Name" note="7" tc="2"/>
</aic:userlist>

 
          <?aicxpack
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
 xmlns:iX='http://ns.adobe.com/iX/1.0/'>

 <rdf:Description about=''
  xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
  <pdf:CreationDate>2006-04-03T03:45:28Z</pdf:CreationDate>
  <pdf:ModDate>2006-04-03T03:47:37Z</pdf:ModDate>
  <pdf:Title>mi_iso</pdf:Title>
 </rdf:Description>

 <rdf:Description about=''
  xmlns:xap='http://ns.adobe.com/xap/1.0/'>
  <xap:CreateDate>2006-04-03T03:45:28Z</xap:CreateDate>
  <xap:ModifyDate>2006-04-03T03:47:37Z</xap:ModifyDate>
  <xap:Format>application/x-indesign</xap:Format>
  <xap:Title>
   <rdf:Alt>
    <rdf:li xml:lang='x-default'>mi_iso</rdf:li>
   </rdf:Alt>
  </xap:Title>
 </rdf:Description>

 <rdf:Description about=''
  xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>
  <xapMM:DocumentID>adobe:docid:incd:3e38bca5-c2f6-11da-8af1-cb2a45f45358</xapMM:DocumentID>
  <xapMM:VersionID>1</xapMM:VersionID>
  <xapMM:RenditionClass>default</xapMM:RenditionClass>
 </rdf:Description>

 <rdf:Description about=''
  xmlns:dc='http://purl.org/dc/elements/1.1/'>
  <dc:format>application/x-indesign</dc:format>
  <dc:title>mi_iso</dc:title>
 </rdf:Description>

</rdf:RDF>
?>

 <aic:prefs>
<aic:charopts supsize="5.8300000e+001" suppos="3.3300000e+001" subsize="5.8300000e+001" subpos="3.3300000e+001" smcap="7.0000000e+001"/>
<aic:typeopts optsize="1"/>
</aic:prefs>
</aic:document>

 
Termina documento INCD
 
Este es un documento de prueba, ya que solo contiene el texto "Este es contenido de un documento de Incopy en UTF-8", y haciendo obvio esto, todo el documento esta codificado en UTF-8. De todo este arbol de documento XML solo nos interesa el bloque en rojo, que contiene el tag aic:story  .Este tag es el que nos indica en todo el arbol cual es el contenido del documento, aparte de los estilos de formato de texto.
 
En el post anterior de este proyecto vimos la implementación para parsear completamente este tipo de documentos, pero con dicho modelo de programación tenemos un problema, el cual es que tenemos que especificar cuando usar la función utf8_decode(), que se necesita solamente para los documentos codificados en iso-8859-1 y no es necesaria para los UTF-8. Por lo tanto desarrolle un nuevo codigo de parseo.
 
$XMLDoc = DOMDocument::load('mi_nota.incd');
$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 "Variable \$text Contiene ... ".$text."<br><hr>";
    echo "Variable \$screen Contiene ... ".$screen."<br><hr>";
 }
echo "<br />";
 
Lo explicare brevemente. Creo un nuevo objeto DomDocument llamado $XMLDoc y cargo el contenido del archivo 'mi_nota.incd' en él. Después en la variable $root almaceno el nodo raíz del árbol que representa al documento .
En la variable $children guardo la lista de nodos hijos del nodo actual (en este caso root). Para después con un bucle for recorrer dicha lista iniciando con $child = primer nodo del arbol, ejecutandose mientras exista un nodo, y cambiando al siguiente nodo mientras exista uno.
En dicho blucle y para cada nodo evaluaremos su nombre, en este caso buscamos los nodos aic:story, que es donde esta el texto que nos interesa, si encontramos un nodo de este tipo, reemplazamos en su contenido (nodeValue) los caracteres 
 (en caso de que existan, depende de la codificacion, si es UTF-8 aparecerán estos caracteres sustituyendo a los saltos de línea) por los caracteres "\n\r" que equivalen a un salto de linea en el archivo, no asi en la pantalla del browser y lo guardamos en la variable $text. Para este ejemplo creamos de la misma manera una variable $screen que sera para verlo en la pantalla del browser, no para guardarse en archivo, la diferencia esta en sustituir los caracteres â€© por "<br>" que representa un salto de linea en el browser, no en el archivo.
Una vez reemplazados estos caracteres decodificamos la variable con la funcion utf8_decode(). Esto sirve para ambas codificaciones ISO y UTF.
En el codigo de ejemplo las mostramos en pantalla y se verian asi (use otro archivo con más contenido para apreciar mejor esto):
 
Variable $text Contiene ... CORR... Jaque Mate LOS BANQUEROS Sergio Sarmiento "Un banquero es un señor que te presta su paraguas cuando hace sol pero que quiere se lo devuelvas en el momento en que empieza a llover". Mark Twain Acapulco, GRO.- En otros tiempos, el gran tema de preocupación en las convenciones bancarias eran las pérdidas. Hoy parecería que el problema son las utilidades. Apenas unas 600 personas participan en la 69ª Convención Bancaria que se está llevando a cabo en Acapulco...
 
Variable $screen Contiene ...
CORR...
Jaque Mate
LOS BANQUEROS
Sergio Sarmiento
"Un banquero es un señor que te presta su paraguas cuando hace sol pero que quiere se lo devuelvas en el momento en que empieza a llover".
Mark Twain
Acapulco, GRO.- En otros tiempos, el gran tema de preocupación en las convenciones bancarias eran las pérdidas. Hoy parecería que el problema son las utilidades.
Apenas unas 600 personas participan en la 69ª Convención Bancaria que se está llevando a cabo en Acapulco...
 
Las diferencias saltan a la vista, pero internamente las cosas son muy diferentes, y ahora lo veran, este es el codigo fuente generado:
 
Variable $text Contiene ...   CORR...  Jaque Mate  LOS BANQUEROS  Sergio Sarmiento  "Un banquero es un señor que te presta su paraguas cuando hace sol pero que quiere se lo devuelvas en el momento en que empieza a llover".   Mark Twain  Acapulco, GRO.- En otros tiempos, el gran tema de preocupación en las convenciones bancarias eran las pérdidas. Hoy parecería que el problema son las utilidades.   Apenas unas 600 personas participan en la 69ª Convención Bancaria que se está llevando a cabo en Acapulco.
 
Variable $screen Contiene ... <br>CORR...<br>Jaque Mate<br>LOS BANQUEROS<br>Sergio Sarmiento<br>"Un banquero es un señor que te presta su paraguas cuando hace sol pero que quiere se lo devuelvas en el momento en que empieza a llover". <br>Mark Twain<br>Acapulco, GRO.- En otros tiempos, el gran tema de preocupación en las convenciones bancarias eran las pérdidas. Hoy parecería que el problema son las utilidades. <br>Apenas unas 600 personas participan en la 69ª Convención Bancaria que se está llevando a cabo en Acapulco.

 

Completamente diferentes ambos valores, el primero nos sirve para guardarlo ya sea en una base de datos (que es lo que queremos en este proyecto) o para mostrarlo en pantalla, para una mejor visualización.

El siguiente paso del proyecto es hacer que el scrip recorra un directorio determinado y ejecute el parseo para cada archivo INCD en ese directorio. Pero ese será en el próximo post. Hoy ha sido un día productivo.

 
[owar@owarux ~]$goto sleep > zzzzz.txt