Markdown a un AST tipado
que cualquier front-end puede renderizar.
markast convierte Markdown en un árbol estructurado y tipado. Todo ocurre dentro de la librería — parseo, validación, recorrido, render. Envías el JSON a cualquier cliente y haces switch sobre type.
Qué obtienes
AST tipado
Cada nodo tiene un type discriminador y campos conocidos. Lo recorres, consultas y mutas sin escribir una sola regex.
Widgets enchufables
Escribe :::widget en Markdown y llegan al AST como nodos estructurados con props tipados y slots con nombre.
Nunca crashea
El contenido inválido produce un diagnóstico, no una excepción. parse siempre devuelve un AST válido.
Tres formatos de salida
Roundtrip a Markdown, HTML para server-side, o JSON. Tres métodos de un solo paso.
Pipeline de transformaciones
Slugs en headings, generar TOC, autolinks, normalizar texto. Encadenables; o escribe los tuyos.
Agnóstico al front-end
Móvil nativo, React/Vue/Svelte, terminal, HTML plano. Cualquier cosa que pueda hacer switch sobre un string.
Tour de 30 segundos
pip install markast
from markast import parse
doc = parse("""
# Bienvenido
Un párrafo con **negrita** y un [enlace](https://example.com).
:::tip title="Consejo"
Markdown sigue funcionando dentro de los widgets.
:::
""")
doc.to_json() # str — envíalo a cualquier cliente
doc.to_markdown() # str — roundtrip
doc.to_html() # str — render server-side
¿Por qué un árbol y no HTML?
El HTML es de un solo sentido. Una vez que el contenido está renderizado, la estructura se pierde: los clientes no pueden estilar headings diferente según plataforma, no pueden reemplazar un :::video con un reproductor nativo, no pueden extraer un TOC sin volver a parsear. Un AST tipado preserva el significado:
- Las apps móviles aplican sus propias reglas de tipografía a los headings.
- La web renderiza
:::videocon un player propio; la terminal lo muestra como un enlace. - El buscador indexa los mismos nodos estructurados que pinta la UI.
- El mismo contenido alimenta el sitio de docs, el preview del CMS, y un CLI — sin reescribir.