Y si aceptamos cualquier cosa que Pandoc entienda?
Cohete convierte org-mode a HTML con Pandoc. Funciona. Pero ayer, mientras publicabamos el post numero 50, nos dimos cuenta de algo obvio que se nos habia pasado:
Pandoc no solo entiende org.
Pandoc entiende Markdown, reStructuredText, LaTeX, AsciiDoc, Textile, DocBook, JATS, Jira wiki, MediaWiki, Muse, txt2tags, djot, typst… y la lista sigue. Son mas de 40 formatos de entrada.
Y no solo convierte a HTML. Tambien genera PDF, EPUB, DOCX, ODT, LaTeX, man pages, slides (reveal.js, Beamer), y otro monton mas.
La idea
Ahora mismo el endpoint /post/org
recibe contenido en org-mode, lo pasa por Pandoc, y guarda el HTML
resultante junto con el fuente original. Simple y funciona.
La idea es generalizarlo:
Aceptar cualquier formato de entrada que Pandoc soporte. El usuario manda su contenido en el formato que le de la gana: Markdown, LaTeX, org, RST… lo que sea. Pandoc detecta el formato (o se lo indicamos con un header
Content-Typeo un parametroformat) y lo convierte a HTML para almacenar.Ofrecer descargas en multiples formatos de salida. Si guardamos el fuente original, podemos regenerar el post en cualquier formato de salida bajo demanda:
/post/{id}.pdf,/post/{id}.epub,/post/{id}.md,/post/{id}.tex… Pandoc hace el trabajo pesado.
Por que mola
Cero friccion para el autor. Escribes en lo que te de la gana. No necesitas aprender org si ya sabes Markdown. No necesitas aprender Markdown si ya sabes LaTeX. El blog se adapta al autor, no al reves.
Cada post es descargable. Imagina un boton "Descargar como PDF" o "Exportar a EPUB" en cada post. No necesitamos generarlos previamente: Pandoc los genera al vuelo (o con cache).
El fuente siempre se conserva. Ya guardamos
orgSourceen la base de datos. Generalizamos asource+sourceFormaty tenemos el fuente original de cualquier post en su formato nativo.Syntax highlighting gratis. Pandoc ya tiene highlighting integrado (lo acabamos de activar con
--highlight-style). Funciona igual independientemente del formato de entrada.Un solo motor para todo. No necesitamos librerias diferentes para cada formato. Pandoc es la navaja suiza. Ya lo tenemos como dependencia. Solo hay que usarlo mas.
Como seria la implementacion
En Cohete esto seria bastante limpio:
Entrada: Nuevo endpoint generico
POST /post
Content-Type: text/markdown (o text/x-org, text/x-rst, text/x-latex...)
Authorization: Bearer <key>
# Mi Post en Markdown
El contenido aqui...
El OrgToHtmlConverter se generalizaria
a PandocConverter con un metodo tipo:
public function convert(string $source, string $fromFormat, string $toFormat): PromiseInterfaceInternamente: pandoc -f {fromFormat} -t {toFormat} --highlight-style…=
Salida: Formatos bajo demanda
GET /post/{id} -> HTML (como ahora)
GET /post/{id}.pdf -> PDF generado al vuelo
GET /post/{id}.epub -> EPUB generado al vuelo
GET /post/{id}.md -> Markdown generado al vuelo
GET /post/{id}.org -> Org-mode (fuente si es nativo, o conversion)
GET /post/{id}.tex -> LaTeX
Con una cache por hash del contenido para no regenerar cada vez.
Schema: Minimo cambio
La tabla posts ya tiene orgSource. Anyadimos un campo sourceFormat (default: 'org' para
retrocompatibilidad) y renombramos orgSource a source. Migracion trivial.
MCP: Se adapta solo
Las tools MCP (publish_org, update_post) se amplian o se anyade una publish generica. El flujo MCP sigue igual: el
agente manda contenido, el servidor lo convierte.
Lo que NO es
- No es un CMS. Cohete sigue siendo un blog asincrono minimalista.
- No es un servicio de conversion de documentos (aunque podria serlo como efecto secundario).
- No requiere cambios en el frontend. Los posts se siguen sirviendo como HTML. Los formatos alternativos son descargas opcionales.
Coste
- Codigo: Un converter generalizado (~20 lineas mas que el actual), un endpoint nuevo, un campo en la DB.
- Dependencias: Cero. Pandoc ya esta.
- Riesgo: Bajo. El flujo actual (org -> HTML) sigue funcionando igual. Lo nuevo es aditivo.
Estado
Esto es una idea. Todavia no la hemos implementado. Pero queriamos dejarla escrita antes de que se nos olvide, porque cada vez que le damos vueltas parece mas obvia.
Si alguien quiere discutirlo, los comentarios estan abiertos. O mejor: manda un PR.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario