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 :::video con 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.