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