Tribulaciones con txt2html …

… y programas de gestión antiguos.

Como ya dije en la entrada anterior mis programas antiguos emplean una suerte de pseudo códigos para declarar textos con tipografías distintas, para señalar términos que deben indexarse o numeraciones de páginas.

Estos códigos son secuencias encerradas entre corchetes y empleo las mayúsculas como apertura y las minúsculas como cierre:

 Venexma Europa, S.L.            [CUR]Clientes de Fernando RUIZ[cur]         
 Resumen mensual de Ventas                      [CUR][cur]                     
                                  [NEG]TOTALES MENSUALES POR CLIENTE[neg]       
    [NEG]MARZO 2016[neg]                        [NEG][neg]                      
      [NEG]EUROS[neg]                   [CUR]0420250 Zaragoza[cur]       

Para definir los términos a indexar y el número de página utilizo:

 [IDX key="C3685"]430500023 OSSO OUTDOOR SL.[idx] (29/05/2015)                
                                                                     
           Meses de  2015  y  2016            Acumulados de  2015  y  2016

y

 -------------------------------------------------------------------------------
  05/04/2016 12:31:03  *** = Año 2015 sin venta    @@@ = Ambos años sin venta  
                       [NEG][PAG]Pag:     2[pag][neg]  

Cuando quiero hacer referencia a un número de página concreto en otra parte del listado, como en la página de cabecera, utilizo lo siguiente:

  Sumario 

  Detalle por cada cliente.........................................[A pag]    2[a]
  Totales por ruta y país (y total mensual)........................[A pag]   47[a]

Mirando las opciones de txt2html he visto que no merece la pena enfangarse más y que es mejor utilizar un filtro Perl sencillo para las tipografías

while (<>) {
    # Cursiva
    s{\[CUR\]\[cur\]}{}g;
    s{\[CUR\](.+)\[cur\]}{$1}g;

    # Negrita
    s{\[NEG\]\[neg\]}{}g;
    s{\[NEG\](.+)\[neg\]}{$1}g;
    print;
}

Y algo más complejo para los números de página y los índices. En ambos casos se trata de definir un anclaje y un enlace interno HTML de manera que se pueda navegar por el documento y no quede como un simple muro de texto.

Índice de elementos

El índice en el listado en papel se crea al final del mismo, ordenando alfabéticamente las claves y a dos columnas, junto con el número de página en el que aparecen.

[CUR]Indice                                                   Pag    4    [cur]

                                                                 [NEG]R[neg]

   Reina Artesanos, S.L.             13  Rodríguez Herranz, Enrique        18
   Reparaciones Blázquez, C.B.       29  Rodríguez Juzgado, Vicente        26
   Restrepo Gonzalez, Carlos         14  Romero Carmona, Antonio           30
   Reyes López, Alvaro Ignacio        7  Romero Molina, Francisco          18
   Rodriguez Herradura, Carlos       31  Romero Nicolalde, Juan            12
   Rodriguez Martin, Juan            20  Rueda García del Campo,           24
   Rodriguez Martinez, Delmiro       34  Ruiz Ortuño, Fernando             20
   Rodríguez Banda, José Luis         6

En el caso de convertirlos a HTML necesitamos saltar directamente al elemento que indicamos por lo que primero lo marcamos con un anclaje cambiando la secuencia

[IDX key="C1545"]Reparaciones Crayon, S.L.[idx]

por la expresión

<span id="C1545">Reparaciones Crayon, S.L./span>

y luego añadimos un índice con enlaces HTML directamente sobre el mismo.

<a href="#C1545">Reparaciones Crayon, S.L.</a>

Añadiremos esta secuencia Perl al script anterior:

s{\[IDX\s+key="(.+)"\](.+)\[idx\]}{<span id="$1">$2</span>}g;
Números de página

Para los números de página basta con sustituir la expresión

[PAG]Pag:   34[pag]

por

<span id="pag34">Pag:    34</span>

El código Perl para sustituir es el siguiente

s{\[PAG\]Pag.+(\d+)\[pag\]}{<span id="$1">Pag $1</span>}g;

Pero si quiero que las páginas estén correctamente señaladas he de cambiar algunas cosas. Un anclaje como el que muestro arriba situaría la navegación al final de la página con la que estoy trabajando y prefiero que sea el comienzo de la misma lo que se muestre en este caso.

Para ello sí que debo realizar modificaciones en el listado:

  1. Mover la numeración de páginas del pie a la cabecera
  2. Para la numeración de páginas simplemente añadir una marca y no el número que le corresponde. El filtro se encargará de crear la numeración final.
  3. Dado que no existen las secciones y sus encabezados como tales (ahora nos limitamos a indicar el número de página en el que comienzan) sería necesario añadir otra marca especial, tipo anclaje, en el comienzo de la página en la que están.
  4. La página de cabecera puede crearse al comienzo del listado. Bastará con no hacer referencia a números de página si no a marcas concretas.

Pero todo ésto es trabajo en segundo plano. Una vez que modifique el filtro podré enviar los listados sin tocar nada más en la aplicación de gestión antigua.