Ga naar inhoud

Leaf Overzicht

Leaf is een krachtige templating taal met een op Swift geïnspireerde syntax. U kunt het gebruiken om dynamische HTML-pagina's te genereren voor een front-end website of om rijke e-mails te genereren om te verzenden vanuit een API.

Deze gids zal u een overzicht geven van de syntax van Leaf en de beschikbare tags.

Template syntax

Hier is een voorbeeld van een basisgebruik van een Leaf tag.

There are #count(users) users.

Leaf tags bestaan uit vier elementen::

  • Token #: Dit geeft de leaf parser het signaal om te beginnen zoeken naar een tag.
  • Naam count: die de tag identificeert.
  • Parameter Lijst (users): Kan nul of meer argumenten aanvaarden.
  • Body: Een optionele body kan aan sommige tags worden toegevoegd met behulp van een dubbelpunt en een afsluitende tag

Er kunnen veel verschillende toepassingen zijn voor deze vier elementen, afhankelijk van de implementatie van de tag. Laten we eens kijken naar een paar voorbeelden van hoe de ingebouwde tags van Leaf gebruikt kunnen worden:

#(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): <li>#(friend.name)</li> #endfor

Leaf ondersteunt ook veel uitdrukkingen die je kent van Swift.

  • +
  • %
  • >
  • ==
  • ||
  • etc.
#if(1 + 1 == 2):
    Hello!
#endif

#if(index % 2 == 0):
    This is even index.
#else:
    This is odd index.
#endif

Context

In het voorbeeld uit Getting Started, hebben we een [String: String] woordenboek gebruikt om gegevens door te geven aan Leaf. Je kunt echter alles doorgeven dat voldoet aan Encodable. Het is zelfs beter om Encodable structs te gebruiken, omdat [String: Any] niet ondersteund wordt. Dit betekent dat je geen array kunt doorgeven, en het in plaats daarvan moet verpakken in een struct:

struct WelcomeContext: Encodable {
    var title: String
    var numbers: [Int]
}
return req.view.render("home", WelcomeContext(title: "Hello!", numbers: [42, 9001]))

Dat zal title en numbers aan ons Leaf sjabloon laten zien, die dan in tags gebruikt kunnen worden. Bijvoorbeeld:

<h1>#(title)</h1>
#for(number in numbers):
    <p>#(number)</p>
#endfor

Gebruik

Hier zijn enkele veel voorkomende gebruiksvoorbeelden van Leaf.

Condities

Leaf kan een reeks voorwaarden evalueren met de #if tag. Bijvoorbeeld, als je een variabele opgeeft, zal het controleren of die variabele bestaat in zijn context:

#if(title):
    The title is #(title)
#else:
    No title was provided.
#endif

Je kunt ook vergelijkingen schrijven, bijvoorbeeld:

#if(title == "Welcome"):
    This is a friendly web page.
#else:
    No strangers allowed!
#endif

Als je een andere tag wilt gebruiken als onderdeel van je voorwaarde, moet je de # voor de binnenste tag weglaten. Bijvoorbeeld:

#if(count(users) > 0):
    You have users!
#else:
    There are no users yet :(
#endif

Je kunt ook #elseif statements gebruiken:

#if(title == "Welcome"):
    Hello new user!
#elseif(title == "Welcome back!"):
    Hello old user
#else:
    Unexpected page!
#endif

Loops

Als je een array van items opgeeft, kan Leaf er een loop overheen maken en je elk item afzonderlijk laten manipuleren met de #for tag.

We zouden bijvoorbeeld onze Swift code kunnen bijwerken om een lijst van planeten te geven:

struct SolarSystem: Codable {
    let planets = ["Venus", "Earth", "Mars"]
}

return req.view.render("solarSystem", SolarSystem())

We kunnen er dan over loopen in Leaf zoals dit:

Planets:
<ul>
#for(planet in planets):
    <li>#(planet)</li>
#endfor
</ul>

Dit zou een view opleveren dat er zo uitziet:

Planets:
- Venus
- Earth
- Mars

Templates Uitbreiden

Leaf's #extend tag maakt het mogelijk om de inhoud van een template naar een ander te kopiëren. Wanneer je deze tag gebruikt, moet je altijd de .leaf extensie van het sjabloonbestand weglaten.

Uitbreiden is handig voor het kopiëren van een standaard stuk inhoud, bijvoorbeeld een pagina voettekst, advertentie code of tabel die gedeeld wordt over meerdere pagina's:

#extend("footer")

Deze tag is ook nuttig voor het bouwen van een sjabloon bovenop een ander. Je zou bijvoorbeeld een layout.leaf bestand kunnen hebben dat alle code bevat die nodig is om je website op te maken - HTML structuur, CSS en JavaScript - met enkele gaten op zijn plaats die weergeven waar de pagina-inhoud varieert.

Met deze aanpak maakt u een child template dat zijn unieke inhoud invult, en vervolgens breidt u het parent template uit dat de inhoud op de juiste manier plaatst. Om dit te doen, kun je de #export en #import tags gebruiken om inhoud op te slaan en later weer op te halen uit de context.

Bijvoorbeeld, je zou een child.leaf template als volgt kunnen maken:

#extend("master"):
    #export("body"):
        <p>Welcome to Vapor!</p>
    #endexport
#endextend

We roepen #export aan om wat HTML op te slaan en beschikbaar te maken voor het template dat we nu aan het uitbreiden zijn. We renderen dan master.leaf en gebruiken de geëxporteerde data wanneer nodig, samen met andere context variabelen die zijn doorgegeven door Swift. Bijvoorbeeld, master.leaf zou er zo uit kunnen zien:

<html>
    <head>
        <title>#(title)</title>
    </head>
    <body>#import("body")</body>
</html>

Hier gebruiken we #import om de inhoud van de #extend tag op te halen. Wanneer ["title": "Hi there!"] van Swift wordt doorgegeven, zal child.leaf als volgt renderen:

<html>
    <head>
        <title>Hi there!</title>
    </head>
    <body><p>Welcome to Vapor!</p></body>
</html>

Andere tags

#count

De #count tag geeft het aantal items in een array. Bijvoorbeeld:

Your search matched #count(matches) pages.

#lowercased

De #lowercased tag maakt alle letters in een string lowercased.

#lowercased(name)

#uppercased

De #uppercased tag maakt alle letters in een string hoofdletters.

#uppercased(name)

#capitalized

De #capitalized tag maakt de eerste letter in elk woord van een string hoofdletter en de andere kleine letters. Zie String.capitalized voor meer informatie.

#capitalized(name)

#contains

De #contains tag accepteert een array en een waarde als zijn twee parameters, en geeft true terug als de array in parameter één de waarde in parameter twee bevat.

#if(contains(planets, "Earth")):
    Earth is here!
#else:
    Earth is not in this array.
#endif

#date

Het #date label formatteert datums in een leesbare string. Standaard gebruikt het de ISO8601 opmaak.

render(..., ["now": Date()])
The time is #date(now)

Je kunt een aangepaste datum formatter string doorgeven als tweede argument. Zie Swift's DateFormatter voor meer informatie.

The date is #date(now, "yyyy-MM-dd")

#unsafeHTML

De #unsafeHTML tag werkt als een variabele tag - b.v. #(variabele). Het ontsnapt echter niet aan de HTML die variabele kan bevatten:

The time is #unsafeHTML(styledTitle)

Opmerking

Je moet voorzichtig zijn met het gebruik van deze tag om er zeker van te zijn dat de variabele die je meegeeft je gebruikers niet blootstelt aan een XSS-aanval.

#dumpContext

De #dumpContext tag geeft de hele context weer in een door mensen leesbare string. Gebruik deze tag om te debuggen wat er wordt wordt geleverd als context voor de huidige rendering.

Hello, world!
#dumpContext