# Presentación Leaf es un potente lenguaje de plantillas con una sintaxis inspirada en Swift. Puedes usarlo para generar páginas HTML dinámicas destinadas a un portal web o generar correos electrónicos enriquecidos para enviar desde una API. Esta guía te proporcionará una visión general de la sintaxis de Leaf y las etiquetas disponibles. ## Sintaxis de la plantilla Aquí tienes un ejemplo de cómo se usa una etiqueta básica de Leaf. ```leaf There are #count(users) users. ``` Las etiquetas de Leaf constan de cuatro elementos: - Token `#`: Esto indica al analizador de Leaf que comience a buscar una etiqueta. - Nombre `count`: identifica a la etiqueta. - Parámetro `(users)`: Puede aceptar cero o más argumentos. - Cuerpo: Algunas etiquetas pueden tener un cuerpo opcional, que se suministra usando dos puntos y una etiqueta de cierre. Dependiendo de la implementación de la etiqueta, puede haber muchos usos diferentes de estos cuatro elementos. Veamos algunos ejemplos de cómo se podrían usar las etiquetas incorporadas de Leaf: ```leaf #(variable) #extend("template"): I'm added to a base template! #endextend #export("title"): Welcome to Vapor #endexport #import("body") #count(friends) #for(friend in friends):
#(number)
#endfor ``` ## Uso Aquí hay algunos ejemplos comunes del uso de Leaf. ### Condiciones Leaf puede evaluar una serie de condiciones usando su etiqueta `#if`. Por ejemplo, si proporcionas una variable, comprobará si esa variable existe en su contexto: ```leaf #if(title): The title is #(title) #else: No title was provided. #endif ``` También puedes escribir comparaciones, por ejemplo: ```leaf #if(title == "Welcome"): This is a friendly web page. #else: No strangers allowed! #endif ``` Si deseas usar otra etiqueta como parte de tu condición, debes omitir el `#` para la etiqueta interna. Por ejemplo: ```leaf #if(count(users) > 0): You have users! #else: There are no users yet :( #endif ``` También puedes usar declaraciones `#elseif`: ```leaf #if(title == "Welcome"): Hello new user! #elseif(title == "Welcome back!"): Hello old user #else: Unexpected page! #endif ``` ### Bucles Si proporcionas un array de elementos, Leaf puede recorrerlos y te permite manipular cada elemento individualmente usando su etiqueta `#for`. Por ejemplo, podríamos actualizar nuestro código Swift para proporcionar una lista de planetas: ```swift struct SolarSystem: Codable { let planets = ["Venus", "Earth", "Mars"] } return req.view.render("solarSystem", SolarSystem()) ``` Luego podríamos recorrerlos en Leaf de la siguiente manera: ```leaf Planets:Welcome to Vapor!
#endexport #endextend ``` Llamamos `#export` para almacenar algo de HTML y hacerlo disponible para la plantilla que estamos extendiendo actualmente. Luego renderizamos `master.leaf` y usamos los datos exportados cuando sea necesario, junto con cualquier otra variable de contexto pasada desde Swift. Por ejemplo, `master.leaf` podría verse así: ```leafWelcome to Vapor!
``` ### Otras etiquetas #### `#count` La etiqueta `#count` devuelve el número de elementos en un array. Por ejemplo: ```leaf Your search matched #count(matches) pages. ``` #### `#lowercased` La etiqueta `#lowercased` convierte todas las letras de una cadena a minúsculas. ```leaf #lowercased(name) ``` #### `#uppercased` La etiqueta `#uppercased` convierte todas las letras de una cadena a mayúsculas. ```leaf #uppercased(name) ``` #### `#capitalized` La etiqueta `#capitalized` convierte a mayúsculas la primera letra de cada palabra de una cadena y el resto a minúsculas. Puedes ver [`String.capitalized`](https://developer.apple.com/documentation/foundation/nsstring/1416784-capitalized) para más información. ```leaf #capitalized(name) ``` #### `#contains` La etiqueta `#contains` acepta un array y un valor como sus dos parámetros y devuelve verdadero si el array en el primer parámetro contiene el valor en el segundo parámetro. ```leaf #if(contains(planets, "Earth")): Earth is here! #else: Earth is not in this array. #endif ``` #### `#date` La etiqueta `#date` formatea las fechas a una cadena legible. Por defecto utiliza el formato ISO8601. ```swift render(..., ["now": Date()]) ``` ```leaf The time is #date(now) ``` Puede pasar una cadena de formateado de fecha personalizada como segundo argumento. Ve a [`DateFormatter`](https://developer.apple.com/documentation/foundation/dateformatter) de Swift para más información. ```leaf The date is #date(now, "yyyy-MM-dd") ``` También puedes pasar un ID de zona horaria para el formateador de fechas como tercer argumento. Consulta la documentación de Swift sobre [`DateFormatter.timeZone`](https://developer.apple.com/documentation/foundation/dateformatter/1411406-timezone) y [`TimeZone`](https://developer.apple.com/documentation/foundation/timezone) para más información. ```leaf The date is #date(now, "yyyy-MM-dd", "America/New_York") ``` #### `#unsafeHTML` La etiqueta `#unsafeHTML` actúa como una etiqueta variable - p. ej. `#(variable)`. Sin embargo, no escapa ningún HTML que `variable` pueda contener: ```leaf The time is #unsafeHTML(styledTitle) ``` !!! note "Nota" Debes tener cuidado al usar esta etiqueta para asegurarte de que la variable proporcionada no exponga a sus usuarios a un ataque XSS. #### `#dumpContext` La etiqueta `#dumpContext` renderiza todo el contexto a una cadena legible por humanos. Usa esta etiqueta para depurar lo que se está proporcionando como contexto para el renderizado actual. ```leaf Hello, world! #dumpContext ```