Solía publicar artículos relacionados con este tema aquí, pero en
algún momento juzgué mejor dedicar este sitio web exclusivamente a su
objetivo original, que es publicar mi obra literaria. Haré
una excepción con este pequeño programa que escribí en C, ya que está
indirectamente relacionado.
Si usted utiliza sistemas tipo Unix seguramente está acostumbrado a
editar texto plano utilizando su editor de texto
preferido. Mientras que los editores populares modernos como
Vim o GNU Emacs
incluyen funciones de formato de párrafo, con los más tradicionales y
básicos, como BSD nvi, cabe usar herramientas externas como
fmt(1) (a las que también se las puede invocar desde el mismo
editor con combinaciones de teclado). De todos modos, como
explico en el comentario principal en el código mismo, ninguna de las
herramientas existentes para formatear párrafos de texto plano me
satisfacía por completo, por eso decidí escribir la mía propia.
Y si conoce Unix también sabe qué es troff, un muy versátil
lenguaje de etiquetas para formatear texto, que entre otras cosas ha
sido utilizado por muchos para editar conocidos libros
publicados. Para editar mis novelas
utilicé groff, la versión
GNU. La herramienta que estoy publicando aquí, además de
mejorar algunas características presentes en otras versiones de fmt,
también trae una innovación para facilitar el trabajo con archivos
troff.
Descargar
(fmtroff.c)
Probado en OpenBSD y Linux. Espero que lo encuentre
útil.
Cronología de cambios
- 7 de noviembre, 2023 (bug). Corregido un error creado con
las últimas modificaciones.
- 8 de octubre, 2023 Una vez más reescribí todo el código ahora
usando funciones de las bibliotecas de C y de caracteres anchos.
- 1 de octubre, 2023 Reescribí todo el código usando punteros
en lugar de matrices de longitud variable.
- 8 de septiembre, 2023 A excepción de ‘nueva línea’ y
‘tabulador’, fmtroff limpia los llamados caracteres de
control. Hoy leyendo una interesante discusión en las listas
de correo de groff me enteré de que con roff se puede utilizar el
caracter leader o SOH (ASCII 0x01) en tablas o índices, de
ahí que modifiqué el código para que, en modo ‘troff’ (opción -t),
fmtroff preserve este caracter.
- 24 de agosto, 2023 (bug): Hoy descubrí que es necesario
reservar memoria antes de entrar al loop que lee el fichero (o
cadena de entrada). Sin esto llamar fmtroff desde un editor
de texto (nvi o vim) en un fichero vacío produce un
segfault.
- 28 de junio, 2023: Mejoré el reconocimiento de iniciales para
que ignore paréntesis o comillas y le agregué soporte de mayúsculas no
ASCII.
- 25 de abril, 2023 (bug): Pasaron años sin usar iso-latin, por
esto no fue hasta ayer que, mientras tecleaba algún texto en la consola
de OpenBSD, me di cuenta de que fmtroff se colgaba al encontrar
caracteres iso-latin. Tomó sólo modificar un condicional para
corregir el error, lo que significa que ahora la limitación de UTF-8
sólo se aplica a caracteres multibyte.
- 6 de abril, 2023 (bug): En modo troff o siempre que la opción
‘-n’ no se utilice, tratar las líneas que comienzan con ‘'’
(comilla simple) igual que las que comienzan con punto, ya que aquellas
también son utilizadas en macros de troff.
- 5 de abril, 2023: No agregar doble espacio luego de puntos
suspensivos cuando éstos se hallan al principio de la línea.
- 28 de marzo, 2023: Nueva opción ‘-l’, permite que
las oraciones comiencen con minúscula (útil con páginas de manual donde
comenzar la oración con un nombre de comando es recurrente).
- 25 de marzo, 2023 (bug): Ignorar palabra cuando su número de
caracteres supera el límite de columnas (ej URLs).
VOLVER A LA PORTADA