Configurar y ampliar el analizador sintáctico
Slidev analiza tu archivo de presentación (por ejemplo, lides.md
) en tres pasos:
- Se realiza un paso de "preparación": el archivo se divide en diapositivas utilizando el separador
---
, y considerando los posibles bloques frontmatter.
- Se realiza un paso de "preparación": el archivo se divide en diapositivas utilizando el separador
- Cada diapositiva se analiza con una biblioteca externa.
- Slidev resuelve la propiedad especial frontmatter
src: ....
, que permite incluir otros archivos md.
Analizador de Markdown
La configuración del analizador de Markdown utilizado en el paso 2 puede hacerse configurando los plugins internos de Vite.
Preparser Extensions
Available since v0.37.0
WARNING
Importante: al modificar la configuración del preparador, es necesario detener e iniciar slidev de nuevo (reiniciarlo podría no ser suficiente).
El preparador (paso 1 anterior) es altamente extensible y permite implementar sintaxis personalizadas para tus archivos md. Extender el preparador se considera una característica avanzada y es susceptible de romper integraciones de editores debido a cambios implícitos en la sintaxis.
Para personalizarlo, crea un archivo ./setup/preparser.ts
con el siguiente contenido:
import { definePreparserSetup } from '@slidev/types'
export default definePreparserSetup(({filepath, headmatter}) => {
return [
{
transformRawLines(lines) {
for (const i in lines) {
if (lines[i] === '@@@')
lines[i] = 'HOLA'
}
},
}
]
})
Este ejemplo sustituye sistemáticamente cualquier línea @@@
por una línea con HOLA
. Ilustra la estructura de un fichero de configuración del preparador y algunos de los principales conceptos que implica el preparador:
definePreparserSetup
debe ser llamado con una función como parámetro.- La función recibe la ruta del fichero (del fichero raíz de presentación) y el headmatter (del fichero md). Puedes utilizar esta información (por ejemplo, habilitar extensiones basadas en el archivo de presentación).
- La función debe devolver una lista de extensiones del preparador.
- Una extensión puede contener
- una función
transformRawLines(lines)
que se ejecuta justo después de analizar la cabecera del fichero md y recibe una lista de todas las líneas (del fichero md). La función puede mutar la lista arbitrariamente. - una función
transformSlide(content, frontmatter)
que se ejecuta para cada diapositiva, justo después de dividir el archivo, y recibe el contenido de la diapositiva como una cadena y el frontmatter de la diapositiva como un objeto. La función puede mutar el frontmatter y debe devolver la cadena de contenido (posiblemente modificada, posiblementeundefined
si no se han hecho modificaciones). - un
nombre
- una función
Ejemplo de extensiones del preparador
Caso de uso 1: presentación de nivel superior con sintaxis compacta
Imagina una situación en la que (parte de) la presentación muestra principalmente imágenes de portada e incluye otros archivos md. Es posible que quieras una notación compacta en la que, por ejemplo, (parte de) slides.md
sea como esto:
@cover: /nice.jpg
# Bienvenida
@src: page1.md
@src: page2.md
@cover: /break.jpg
@src: pages3-4.md
@cover: https://source.unsplash.com/collection/94734566/1920x1080
# ¿Alguna pregunta?
Hasta la próxima
Para permitir estas sintaxis @src:
y @cover:
, crea un archivo ./setup/preparser.ts
con el siguiente contenido:
import { definePreparserSetup } from '@slidev/types'
export default definePreparserSetup(() => {
return [
{
transformRawLines(lines) {
let i = 0
while (i < lines.length) {
const l = lines[i]
if (l.match(/^@cover:/i)) {
lines.splice(i, 1,
'---',
'layout: cover',
`background: ${l.replace(/^@cover: */i, '')}`,
'---',
'')
continue
}
if (l.match(/^@src:/i)) {
lines.splice(i, 1,
'---',
`src: ${l.replace(/^@src: */i, '')}`,
'---',
'')
continue
}
i++
}
}
},
]
})
Y eso es todo.
Caso de uso 2: usar frontmatter personalizado para agrupar diapositivas
Imagina un caso en el que a menudo quieres escalar algunas de tus diapositivas pero sigues queriendo usar una variedad de diseños existentes, por lo que crear un nuevo diseño no sería adecuado.
Por ejemplo, podrías escribir tu slides.md
como esto:
---
layout: quote
_scale: 0.75
---
# Bienvenida
> ¡Genial!
---
_scale: 4
---
# Pausa
---
# Ok
---
layout: center
_scale: 2.5
---
# ¿Alguna pregunta?
Nos vemos
Aquí hemos utilizado un guión bajo en _scale
para evitar posibles conflictos con las propiedades frontmatter existentes (de hecho, el caso de scale
, sin guión bajo podría causar problemas).
Para manejar esta sintaxis _scale: ...
en el frontmatter, crea un archivo ./setup/preparser.ts
con el siguiente contenido:
import { definePreparserSetup } from '@slidev/types'
export default definePreparserSetup(() => {
return [
{
transformSlide(content, frontmatter) {
if ('_scale' in frontmatter) {
return [
`<Transform :scale=${frontmatter['_scale']}>`,
'',
content,
'',
'</Transform>'
].join('\n')
}
},
},
]
})
Y eso es todo.