BookinglyTech News
Software

OrgWebAlchemy: parsear Org mode con PEG en Guile y exportar a HTML sin Emacs

Una biblioteca de Guile Scheme convierte documentos de Org mode en HTML usando gramáticas PEG, sin abrir Emacs. Su autor acaba de publicar la versión 1.0 en Codeberg.

2 min de lecturaLobsters0 vistas

Un desarrollador que firma como jjba23 ha publicado OrgWebAlchemy, una biblioteca de Guile Scheme que parsea documentos de Org mode y los renderiza a HTML sin pasar por Emacs. La versión 1.0 ya está disponible y el código vive en Codeberg. La idea es poder escribir en Org mode y obtener HTML presentable desde cualquier proyecto Scheme.

El punto de partida eran expresiones regulares. El autor se topó rápido con el problema clásico: Org mode parece sencillo hasta que lo intentas parsear de verdad. Los encabezados son fáciles, un párrafo también, una lista también, hasta que aparecen listas anidadas ordenadas, desordenadas y de descripción, niveles de indentación distintos, marcado inline, enlaces con descripción, bloques de código, de ejemplo y de cita, tablas, y construcciones de escape que tienen que dejar de consumir entrada exactamente en el sitio correcto. En ese punto, apilar otra regex deja de describir un lenguaje y pasa a describir el historial de bugs del parser.

PEG en lugar de montañas de regex

La biblioteca usa gramáticas de expresiones de parsing a través del módulo (ice-9 peg) de Guile. Las reglas se escriben como sexps, lo que hace que la gramática se lea casi como documentación del formato. El recorrido es Org, PEG, AST, SXML y HTML, con cada etapa separada de la siguiente. Esa separación es deliberada: generar SXML y renderizar HTML se trata como una preocupación de presentación, así que se podrían añadir otros destinos, como Markdown, sin tocar el parser.

Así se ve el uso básico:

(use-modules (orgwebalchemy html))
(org->html "This is ~test~ code.")

Lo que cubre la 1.0: encabezados, párrafos, listas de los tres tipos con cualquier nivel de anidamiento, cursiva, negrita, código inline, enlaces con y sin descripción (con parseo anidado dentro), separadores horizontales, tablas y bloques src, example, quote y export html. Los bloques de exportación HTML se emiten como salida literal y se saltan el parser de inline.

La representación en HTML es configurable mediante parámetros de Guile. La mayoría son listas de clases, pero las clases por nivel de encabezado se resuelven con una lambda que recibe el nivel y devuelve la lista correspondiente. El renderer no queda atado al aspecto de ningún sitio concreto.

Queda trabajo pendiente. El autor reconoce que está lejos de cubrir todo Org mode, que es una pieza de software enorme, y que arrastra un bug al mezclar tipos de lista distintos dentro del mismo anidamiento. También admite sin rodeos que tiró de IA para entender PEG y depurar, aunque el código y las pruebas son suyos.

Para quien exporte documentación escrita en Org y no quiera meter Emacs en el pipeline de build, la pieza merece un vistazo: es una etapa de render desacoplada y con las gramáticas expresadas como datos, algo que en Lisp sale casi gratis.