viernes, 23 de septiembre de 2016

groff

groff es una colección de programas que contiene la implementación GNU de troff. También incluye un script que se usa para emular nroff y al resto de la familia roff.

Si bien roff y sus descendientes se usan para crear documentos formateados, lo hacen de una forma algo extraña para los usuarios modernos. La mayoría de los documentos de hoy en día se producen usando procesadores de texto que pueden realizar tanto la composición como el formateado de un documento en un único paso. Antes de la llegada de los procesadores de texto gráficos, los documentos a menudo se producían en un proceso en dos pasos que incluía el uso de un editor de texto para realizar la composición, y un procesador, como troff, para realizar el formateo. Las instrucciones para el programa de formateo estaban incluidas en el texto compuesto a través del uso de un lenguaje de marcas. La analogía moderna para este tipo de procesos es la página web, que se crea usando un editor de texto de algún tipo y luego se renderiza usando un navegador web con HTML como lenguaje de marcas para describir el aspecto final de la página.

No vamos a ver groff en su totalidad, ya que muchos elementos de su lenguaje de marcas tienen que ver con detalles de tipografía muy arcanos. En su lugar nos concentraremos en uno de sus macro paquetes que se sigue usando ampliamente. Los macro paquetes concentran muchos de sus comandos de bajo nivel en una colección más pequeña de comandos de alto nivel que hace el uso de groff mucho más sencillo.

Por un momento, consideremos la humilde man page. Se encuentra en el directorio /usr/share/man como un archivo de texto comprimido con gzip. Si fuéramos a examinar su contenido descomprimido, veríamos lo siguiente (se muestra la man page de ls en su sección 1):

[me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | head
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.35.
.TH LS "1" "April 2008" "GNU coreutils 6.10" "User Commands"
.SH NAME
ls \- list directory contents
.SH SYNOPSIS
.B ls
[\fIOPTION\fR]... [\fIFILE\fR]...
.SH DESCRIPTION
.\" Add any additional description here
.PP

Comparada a la man page en su presentación normal, podemos empezar a ver una correlación entre el lenguaje de marcas y su resultado:

[me@linuxbox ~]$ man ls | head
LS(1)           User Commands             LS(1)


NAME
         ls - list directory contents

SYNOPSIS
         ls [OPTION]... [FILE]...

La razón por la que esto es interesante es que las man pages están renderizadas por groff, usando el macro paquete man-doc. De hecho, podemos simular el comando man con la siguiente tubería:

[me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc -T ascii | head
LS(1)           User Commands             LS(1)


NAME
         ls - list directory contents
SYNOPSIS
         ls [OPTION]... [FILE]...

Aquí usamos el programa groff con las opciones configuradas para especificar el macro paquete mandoc y el controlador de salida para ASCII. groff puede producir salida en varios formatos. Si no se especifica ningún formato, la salida por defecto es PostScript:

[me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc | head
%!PS-Adobe-3.0
%%Creator: groff version 1.18.1
%%CreationDate: Thu Feb 5 13:44:37 2009
%%DocumentNeededResources: font Times-Roman
%%+ font Times-Bold
%%+ font Times-Italic
%%DocumentSuppliedResources: procset grops 1.18 1
%%Pages: 4
%%PageOrder: Ascend
%%Orientation: Portrait

Hemos mencionado brevemente PostScript en el capítulo anterior, y lo haremos de nuevo en el próximo capítulo. PostScript es un lenguaje de descripción de página que se usa para describir el contenido de una página impresa en un dispositivo tipográfico. Si tomamos la salida de nuestro comando y lo almacenamos en un archivo (asumiendo que estamos usando un entorno gráfico con un directorio Desktop):

[me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc > ~/Desktop/foo.ps

Un icono del archivo de salida aparecerá en el escritorio. Haciendo doble clic en el icono, se abrirá un visor de páginas y mostrará el archivo en su forma renderizada:

Figura 4: Viendo la salida PostScript con un visor de páginas en GNOME

Lo que vemos es ¡una bonita man page de ls! De hecho, es posible convertir el archivo PostScript a PDF (Portable Document Format - Formato de Documento Portable) con este comando:

[me@linuxbox ~]$ ps2pdf ~/Desktop/foo.ps ~/Desktop/ls.pdf

El programa ps2pdf es parte del paquete ghostscript, que está instalado en la mayoría de los sistemas Linux que soportan impresión:

Consejo: Los sistemas Linux a menudo incluyen muchos programas de línea de comandos para conversión de formatos de archivos. A menudo se nombran usando la convención format2format. Prueba a usar el comando ls /usr/bin/*[[:alpha:]]2[[:alpha:]]* para identificarlos. Prueba también a buscar programas llamados formattoformat.

Para nuestro último ejercicio con groff, volveremos a visitar a nuestro viejo amigo distros.txt una vez más. Esta vez, usaremos el programa tbl que se usa para formatear tablas para componer nuestra lista de distribuciones Linux. Para hacerlo, vamos a usar nuestro anterior script de sed para añadir etiquetas a una secuencia de texto que luego enviaremos a groff.

Primero, necesitamos modificar nuestro script sed para añadir las exigencias necesarias que requiere tbl. Usando un editor de texto, cambiaremos distros.sed a lo siguiente:

# sed script to produce Linux distributions report
1 i\
.TS\
center box;\
cb s s\
cb cb cb\
l n c.\
Linux Distributions Report\
=\
Name Version Released\
_
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
$ a\
.TE

Fíjate que para que el script funcione correctamente, hay que tener cuidado y comprobar que las palabras "Name Version Released" estén separadas por tabuladores, no por espacios. Guardaremos el archivo resultante como distros-tbl.sed. tbl usa las etiquetas .TS y .TE para comenzar y finalizar la tabla. Las filas que siguen a la etiqueta .TS definen las propiedades globales de la tabla que, en nuestro ejemplo, están centradas horizontalmente en la página y rodeadas por una caja. Las restantes líneas de la definición describen el estilo de cada fila de la tabla. Ahora, si ejecutamos nuestro informe canalizándolo, otra vez, al nuevo script de sed, tendremos lo siguiente:

[me@linuxbox ~]$ sort -k 1,1 -k 2n distros.txt | sed -f distros-tbl.sed | groff -t -T ascii 2>/dev/null
          +------------------------------+
          | Linux Distributions Report   |
          +------------------------------+
          | Name    Version    Released  |
          +------------------------------+
          |Fedora     5       2006-03-20 |
          |Fedora     6       2006-10-24 |
          |Fedora     7       2007-05-31 |
          |Fedora     8       2007-11-08 |
          |Fedora     9       2008-05-13 |
          |Fedora    10       2008-11-25 |
          |SUSE      10.1     2006-05-11 |
          |SUSE      10.2     2006-12-07 |
          |SUSE      10.3     2007-10-04 |
          |SUSE      11.0     2008-06-19 |
          |Ubuntu     6.06    2006-06-01 |
          |Ubuntu     6.10    2006-10-26 |
          |Ubuntu     7.04    2007-04-19 |
          |Ubuntu     7.10    2007-10-18 |
          |Ubuntu     8.04    2008-04-24 |
          |Ubuntu     8.10    2008-10-30 |
          +------------------------------+

Añadiendo la opción -t a groff le ordenamos que pre-procese la secuencia de texto con tbl. De igual forma, la opción -T se usa para salida ASCII en lugar del medio de salida por defecto, PostScript.

El formato de la salida es el mejor que podemos esperar si estamos limitados por las capacidades de una pantalla de terminal o una impresora tipo máquina de escribir. Si especificamos salida PostScript y vemos gráficamente la salida resultante, tenemos un resultado más satisfactorio:

[me@linuxbox ~]$ sort -k 1,1 -k 2n distros.txt | sed -f distros-tbl.sed | groff -t > ~/Desktop/foo.ps


Figura 5: Viendo la tabla finalizada

No hay comentarios:

Publicar un comentario