lunes, 9 de febrero de 2009

Lo que haremos con HAL

Antes de entrar en un nuevo ciclo de la serie, puede ser gratificante ver hasta dónde podemos llegar con HAL en el procesamiento de texto. Desde luego éste no va ser el único asunto del que deberían tratar los sucesivos ciclos de estas conversaciones. Por supuesto, habría que charlar con HAL para realizar las tareas habituales que todo usuario realiza a diario, desde leer sus correos hasta copiar sus CDs. Pero, puesto que nos habíamos quedado en la manipulación de texto, y puesto que desde ahí podemos avanzar hacia caminos más conocidos, no viene mal echar un vistazo a la orden más larga que hemos visto hasta hoy y a su resultado. Que no cunda el pánico, lo nuevo en ella se explicará cuando sea oportuno. El lector debe confiar en que, superada la fase primera de su aprendizaje, tendrá la competencia suficiente para diseñar órdenes semejantes.

Ahí va la orden para HAL [Después del texto de la orden, se muestra una imagen que contiene la orden completa sin los comentario iniciales ---las líneas precedidas por #. La orden se entiende mejor en la imagen, puesto que su estructura sintáctica aparece coloreada]:


#!/bin/sh
## ------------------------------------------------------------------
## extraer-resumenes: Extrae las listas etiquetadas con
## _class="resumen"_ del fichero xml 'Conversaciones con HAL'
## precedidas por el título del artículo y las procesa para obtener
## el fichero 'resumenes_hal.tex', donde el orden de sus secciones es
## el orden inverso de los artículos en el fichero original.
## ------------------------------------------------------------------
## 09/02/2009 @ átopos - http://los-pajaros-de-hogano.blogspot.com
## ------------------------------------------------------------------
#
## FUNCIONAMIENTO:
# 1. grep extrae los títulos de los artículos y las listas de
# resúmenes
# 2. sed convierte la salida a formato LaTeX y elimina fragmentos
# innecesarios. [Los títulos de los artículos se etiquetan como
# 'section' en lugar de '\section' para facilitar el procesamiento
# ulterior con awk: awk funciona mal con separadores que
# incluyen '\']
# 3. El primer awk revierte el orden de las secciones.
# 4. El segundo awk etiqueta correctamente los títulos con '\section'
# y actúa sobre cada sección dependiendo de si ésta contiene o no
# resúmenes.
# 5. El tercer awk envuelve el resultado anterior con el preámbulo
# del fichero LaTeX y su entorno global 'document'.
## ------------------------------------------------------------------
grep -E -o -e "<title type='text'>[^>]*</title>" \
-e '&lt;ul class="resumen"&gt;[^<]*' \
Conversaciones\ con\ HAL \
| sed -e 's/&lt;br \/&gt;/\n/g' \
-e '/Los pájaros de hogaño/d' \
-e 's/<title[^>]*>/section{/g' \
-e 's/<\/title>/}/g' \
-e 's/&lt;ul[^&]*&gt;/\\begin{itemize}/g' \
-e 's/&lt;\/ul&gt;/\\end{itemize}/g' \
-e 's/&lt;li[^&]*&gt;/\\item /g' \
-e 's/&lt;\/li&gt;//g' \
-e 's/&lt;code[^&]*&gt;/\\verb=/g' \
-e 's/&lt;\/code&gt;/=/g' \
-e 's/&lt;em&gt;/\\emph{/g' \
-e 's/&lt;\/em&gt;/}/g' \
-e 's/&lt;a href="\([^"]*\)"&gt;\([^\&]*\)/\2 (ver \1)/g' \
-e 's/&lt;\/a&gt;//g' \
-e 's/&gt;/>/g' \
-e 's/ \d39/ \d96/g' \
| awk 'BEGIN { RS=""; FS="section"; ORS=""; }
{
for (i = NF; i > 0; --i)
print "section" $i;
}' \
| awk 'BEGIN { RS="section"; FS="\n"; }
{ if (NF > 2)
print "\\section" $0;
else if (FNR != 1)
print "\\section" $0 "\n( Sin resumen. )\n";

}' \
| awk 'BEGIN { print "\\documentclass{article}";
print "\\usepackage[spanish]{babel}";
print "\\usepackage[T1]{fontenc}";
print "\\usepackage[utf8]{inputenc}";
print "\\usepackage{verbatim}";
print "\\usepackage{mathptmx}";
print "\\usepackage[scaled=.90]{helvet}";
print "\\usepackage{courier}";
print "\\title{Resúmenes de HAL}";
print "\\begin{document}";
print "\\maketitle" }
END { print "\\end{document}" }
{ print }' \
> resumenes_hal.tex




A la derecha de la imagen siguiente puede verse un fragmento de lo que se logra tras procesar el fichero resultante resumenes_hal.tex con pdflatex ---del que quizá hablemos en otra sesión--- y abrir el pdf con un lector como okular:



[El porqué de todo esto ... el próximo día.]

No hay comentarios:

Publicar un comentario