@astrojs/ markdoc
Esta integración de Astro permite el uso de Markdoc para crear componentes, páginas y entradas de colecciones de contenido.
¿Por qué Markdoc?
Sección titulada ¿Por qué Markdoc?Markdoc te permite mejorar tu Markdown con componentes de Astro. Si tienes contenido existente escrito en Markdoc, esta integración te permite traer esos archivos a tu proyecto de Astro usando colecciones de contenido.
Instalación
Sección titulada InstalaciónAstro incluye un comando astro add
para automatizar la configuración de las integraciones oficiales. Si lo prefieres, puedes instalar las integraciones manualmente en su lugar.
Ejecuta uno de los siguientes comandos en una nueva ventana de terminal.
Si tienes algún problema, no dudes en reportarlo en GitHub e intenta los pasos de instalación manual a continuación.
Instalación manual
Sección titulada Instalación manualPrimero, instala el paquete @astrojs/markdoc
:
Luego, aplica la integración a tu archivo astro.config.*
utilizando la propiedad integrations
:
Integración del editor
Sección titulada Integración del editorVS Code admite Markdown de forma predeterminada. Sin embargo, para el soporte del editor Markdoc, es posible que desees agregar la siguiente configuración en tu configuración de VSCode. Esto garantiza que la creación de archivos Markdoc proporcione una experiencia de edición similar a Markdown.
Los archivos Markdoc solo se pueden usar dentro de las colecciones de contenido. Agrega entradas a cualquier colección de contenido usando la extensión .mdoc
:
Directoriosrc/
Directoriocontent/
Directoriodocs/
- why-markdoc.mdoc
- quick-start.mdoc
Luego, consulta tu colección usando las APIs de colecciones de contenido:
Configuración de Markdoc
Sección titulada Configuración de Markdoc@astrojs/markdoc
ofrece opciones de configuración para usar todas las características de Markdoc y conectar componentes de interfaz de usuario a tu contenido.
Usa componentes Astro como etiquetas Markdoc
Sección titulada Usa componentes Astro como etiquetas MarkdocPuedes configurar etiquetas Markdoc que se asignan a componentes .astro
. Puedes agregar una nueva etiqueta creando un archivo markdoc.config.mjs|ts
en la raíz de tu proyecto y configurando el atributo tag
.
Este ejemplo renderiza un componente Aside
, y permite que se pase una prop type
como un string:
Este componente ahora se puede usar en tus archivos Markdoc con la etiqueta {% aside %}
. Los elementos hijos serán enviados al espacio por defecto de tu componente:
Usa componentes de Astro desde paquetes npm y archivos TypeScript
Sección titulada Usa componentes de Astro desde paquetes npm y archivos TypeScriptEs posible que necesites usar componentes de Astro expuestos como exportaciones nombradas desde archivos de TypeScript o JavaScript. Esto es común cuando se usan paquetes npm y sistemas de diseño.
Puedes pasar el nombre de importación como segundo argumento a la función component()
:
Esto genera la siguiente declaración de importación internamente:
Utiliza los componentes de Astro desde paquetes npm y archivos TypeScript
Sección titulada Utiliza los componentes de Astro desde paquetes npm y archivos TypeScriptEs posible que necesites utilizar los componentes de Astro expuestos como exportaciones nombradas desde archivos TypeScript o JavaScript. Esto es común cuando se utilizan paquetes npm y sistemas de diseño.
Puedes pasar el nombre de importación como segundo argumento a la función component()
:
Esto genera la siguiente declaración de importación internamente:
Encabezados personalizados
Sección titulada Encabezados personalizados@astrojs/markdoc
automaticamente agrega enlaces a tus encabezados, y genera una lista de headings
a través de la API de colecciones de contenido. Para personalizar aún más cómo se renderizan los encabezados, puedes aplicar un componente de Astro como un nodo Markdoc.
Este ejemplo renderiza un componente Heading.astro
usando la propiedad render
:
Todos los encabezados Markdown renderizarán el componente Heading.astro
y pasarán los siguientes attributes
como props del componente:
level: number
El nivel de encabezado 1 - 6id: string
Unid
generado a partir del contenido de texto del encabezado. Esto corresponde alslug
generado por la funciónrender()
de contenido.
Por ejemplo, el encabezado ### Level 3 heading!
pasará level: 3
e id: 'level-3-heading'
como props del componente.
Resaltado de sintaxis
Sección titulada Resaltado de sintaxis@astrojs/markdoc
proporciona extensiones de Shiki y Prism para resaltar tus bloques de código.
Aplica la extensión shiki()
a tu configuración Markdoc usando la propiedad extends
. Opcionalmente puedes pasar un objeto de configuración de shiki:
Aplica la extensión prism()
a tu configuración Markdoc usando la propiedad extends
.
Configura el elemento HTML raíz
Sección titulada Configura el elemento HTML raízMarkdoc envuelve los documentos con una etiqueta <article>
de forma predeterminada. Esto se puede cambiar desde el nodo document
de Markdoc. Esto acepta un nombre de elemento HTML o null
si prefieres eliminar el elemento de envoltura:
Nodos personalizados de Markdoc / elementos
Sección titulada Nodos personalizados de Markdoc / elementosEs posible que desees renderizar elementos Markdown estándar, como párrafos y texto en negrita, como componentes Astro. Para esto, puedes configurar un nodo Markdoc. Si un nodo determinado recibe atributos, estarán disponibles como props del componente.
Este ejemplo renderiza bloques de citas con un componente Quote.astro
personalizado:
Componentes de imagen personalizados en Markdoc
Sección titulada Componentes de imagen personalizados en MarkdocEl componente <Image />
de Astro no puede usarse directamente en Markdoc. Sin embargo, puedes configurar un componente de Astro para anular el nodo de imagen predeterminado cada vez que se use la sintaxis de imagen nativa ![]()
, o como una etiqueta personalizada de Markdoc para permitirte especificar atributos de imagen adicionales.
Anular el nodo de imagen predeterminado de Markdoc
Sección titulada Anular el nodo de imagen predeterminado de MarkdocPara anular el nodo de imagen predeterminado, puedes configurar un componente .astro
para ser renderizado en lugar de un <img>
estándar.
-
Construye un componente personalizado
MarkdocImage.astro
para pasar las propiedadessrc
yalt
requeridas de tu imagen al componente<Image />
: -
El componente
<Image />
requiere unwidth
yheight
para las imágenes remotas que no pueden ser proporcionadas usando la sintaxis![]()
. Para evitar errores al usar imágenes remotas, actualiza tu componente para renderizar una etiqueta HTML<img>
estándar cuando se encuentre una URL remotasrc
: -
Configura Markdoc para anular el nodo de imagen predeterminado y renderizar
MarkdocImage.astro
: -
La sintaxis de imagen nativa en cualquier archivo
.mdoc
ahora usará el componente<Image />
para optimizar tus imágenes locales. Las imágenes remotas aún pueden ser usadas, pero no serán renderizadas por el componente<Image />
de Astro.
Crear una etiqueta de imagen personalizada de Markdoc
Sección titulada Crear una etiqueta de imagen personalizada de MarkdocUna etiqueta image
de Markdoc te permite establecer atributos adicionales en tu imagen que no son posibles con la sintaxis ![]()
. Por ejemplo, las etiquetas de imagen personalizadas te permiten usar el componente <Image />
de Astro para imágenes remotas que requieren un width
y height
.
Los siguientes pasos crearán una etiqueta de imagen personalizada de Markdoc para mostrar un elemento <figure>
con una leyenda, usando el componente <Image />
de Astro para optimizar la imagen.
-
Crea un componente
MarkdocFigure.astro
para recibir las props necesarias y renderizar una imagen con una leyenda: -
Configura tu etiqueta de imagen personalizada para renderizar tu componente de Astro:
-
Usa la etiqueta
image
en archivos Markdoc para mostrar una figura con leyenda, proporcionando todos los atributos necesarios para tu componente:
Usa componentes de UI del lado del cliente
Sección titulada Usa componentes de UI del lado del clienteLas etiquetas y nodos están restringidos a archivos .astro
. Para incrustar componentes de interfaz de usuario del lado del cliente en Markdoc, usa un componente .astro
de envoltura que renderice un componente de framework con tu directiva client:
deseada.
Este ejemplo envuelve un componente React Aside.tsx
con un componente ClientAside.astro
:
El componente Astro ahora puede ser pasado a la propiedad render
para cualquier tag o node en tu configuración:
Markdoc config
Sección titulada Markdoc configEl archivo markdoc.config.mjs|ts
acepta todas las opciones de configuración de Markdoc, incluyendo etiquetas y funciones.
Puedes pasar estas opciones desde la exportación predeterminada en tu archivo markdoc.config.mjs|ts
:
Ahora, puedes llamar a esta función desde cualquier entrada de contenido de Markdoc:
Servidor de lenguaje Markdoc
Sección titulada Servidor de lenguaje MarkdocSi estás usando VS Code, hay una extensión de lenguaje Markdoc que incluye resaltado de sintaxis y autocompletado para etiquetas configuradas. Consulta el servidor de lenguaje en GitHub para más información.
Para configurar la extensión, crea un archivo markdoc.config.json
en la raíz del proyecto con el siguiente contenido:
La propiedad schema
contiene toda la información para configurar el servidor de lenguaje para las colecciones de contenido de Astro. Acepta las siguientes propiedades:
path
: La ruta al archivo de configuración.type
: El tipo de módulo que usa tu archivo de configuración (esm
permite la sintaxisimport
).property
: La propiedad exportada que contiene el objeto de configuración.watch
: Indica al servidor que observe los cambios en la configuración.
La propiedad path
de nivel superior le indica al servidor dónde se encuentra el contenido. Dado que Markdoc es específico para las colecciones de contenido, puedes usar src/content
.
Pasa variables de Markdoc
Sección titulada Pasa variables de MarkdocEs posible que necesites pasar variables a tu contenido. Esto es útil cuando pasas parámetros SSR como pruebas A/B.
Las variables pueden pasarse como props a través del componente Content
:
Ahora, abTestGroup
esta disponible como una variable en docs/why-markdoc.mdoc
:
Para hacer una variable global para todos los archivos Markdoc, puedes usar el atributo variables
de tu markdoc.config.mjs|ts
:
Accede al frontmatter desde tu contenido Markdoc
Sección titulada Accede al frontmatter desde tu contenido MarkdocPara acceder al frontmatter, puedes pasar la propiedad de entrada data
como una variable donde renderizas tu contenido:
Esto ahora puede ser accedido como $frontmatter
en tu Markdoc.
Opciones de configuración de integración
Sección titulada Opciones de configuración de integraciónLa integración de Astro con Markdoc se encarga de configurar opciones y capacidades de Markdoc que no están disponibles a través del archivo markdoc.config.js
.
allowHTML
Sección titulada allowHTMLPermite escribir marcas HTML junto con etiquetas y nodos de Markdoc.
Por defecto, Markdoc no reconocerá las marcas HTML como contenido semántico.
Para lograr una experiencia más similar a Markdown, donde los elementos HTML pueden incluirse junto con tu contenido, establece allowHTML:true
como opción de integración de markdoc
. Esto habilitará el análisis de HTML en las marcas de Markdoc.
Cuando allowHTML
está habilitado, el marcado HTML dentro de los documentos de Markdoc se representará como elementos HTML reales (incluyendo <script>
), lo que hace posible vectores de ataque como XSS. Asegúrate de que cualquier marcado HTML provenga de fuentes confiables.
ignoreIndentation
Sección titulada ignoreIndentationPor defecto, cualquier contenido que esté indentado por cuatro espacios se tratará como un bloque de código. Desafortunadamente, este comportamiento hace que sea difícil usar niveles arbitrarios de indentación para mejorar la legibilidad de los documentos con estructura compleja.
Cuando uses etiquetas anidadas en Markdoc, puede ser útil indentar el contenido dentro de las etiquetas para que el nivel de profundidad sea claro. Para admitir la indentación arbitraria, tenemos que deshabilitar los bloques de código basados en la indentación y modificar varias otras reglas de análisis de markdown-it que tienen en cuenta los bloques de código basados en la indentación. Estos cambios se pueden aplicar habilitando la opción ignoreIndentation.
Ejemplos
Sección titulada Ejemplos- La plantilla de inicio Astro Markdoc muestra como usar archivos Markdoc en tu proyecto Astro.