vapor-docs/build/3.0/leaf/overview/index.html

2606 lines
66 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://docs.vapor.codes/3.0/leaf/overview/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.6">
<title>Overview - Vapor Docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<link rel="stylesheet" type="text/css" href="../../styles/carbon.css">
<script src="../../assets/javascripts/modernizr.1aa3b519.js"></script>
<script src="../../scripts/carbon.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../../assets/fonts/material-icons.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="purple">
<svg class="md-svg">
<defs>
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
viewBox="0 0 416 448" id="__github">
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
99.5z" />
</svg>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="#leaf-overview" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://docs.vapor.codes/3.0/" title="Vapor Docs" class="md-header-nav__button md-logo">
<img src="../../images/droplet-white.svg" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
Vapor Docs
</span>
<span class="md-header-nav__topic">
Overview
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://docs.vapor.codes/3.0/" title="Vapor Docs" class="md-nav__button md-logo">
<img src="../../images/droplet-white.svg" width="48" height="48">
</a>
Vapor Docs
</label>
<div class="md-nav__source">
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Install
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Install
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../install/macos/" title="macOS" class="md-nav__link">
macOS
</a>
</li>
<li class="md-nav__item">
<a href="../../install/ubuntu/" title="Ubuntu" class="md-nav__link">
Ubuntu
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Getting Started
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-3">
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/hello-world/" title="Hello, world" class="md-nav__link">
Hello, world
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/toolbox/" title="Toolbox" class="md-nav__link">
Toolbox
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/spm/" title="SPM" class="md-nav__link">
SPM
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/xcode/" title="Xcode" class="md-nav__link">
Xcode
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/structure/" title="Folder Structure" class="md-nav__link">
Folder Structure
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/application/" title="Application" class="md-nav__link">
Application
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/controllers/" title="Controllers" class="md-nav__link">
Controllers
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/routing/" title="Routing" class="md-nav__link">
Routing
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/content/" title="Content" class="md-nav__link">
Content
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/async/" title="Async" class="md-nav__link">
Async
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/services/" title="Services" class="md-nav__link">
Services
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/cloud/" title="Deployment" class="md-nav__link">
Deployment
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Async
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
Async
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../async/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../async/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
Auth
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
Auth
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/api/" title="Stateless (API)" class="md-nav__link">
Stateless (API)
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/web/" title="Sessions (Web)" class="md-nav__link">
Sessions (Web)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Console
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-6">
Console
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../console/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../console/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
<label class="md-nav__link" for="nav-7">
Command
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-7">
Command
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../command/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../command/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
<label class="md-nav__link" for="nav-8">
Crypto
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-8">
Crypto
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../crypto/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../crypto/digests/" title="Digests" class="md-nav__link">
Digests
</a>
</li>
<li class="md-nav__item">
<a href="../../crypto/ciphers/" title="Ciphers" class="md-nav__link">
Ciphers
</a>
</li>
<li class="md-nav__item">
<a href="../../crypto/asymmetric/" title="Asymmetric" class="md-nav__link">
Asymmetric
</a>
</li>
<li class="md-nav__item">
<a href="../../crypto/random/" title="Random" class="md-nav__link">
Random
</a>
</li>
<li class="md-nav__item">
<a href="../../crypto/otp/" title="TOTP & HOTP" class="md-nav__link">
TOTP & HOTP
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
<label class="md-nav__link" for="nav-9">
Database Kit
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-9">
Database Kit
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../database-kit/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../database-kit/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
<label class="md-nav__link" for="nav-10">
Fluent
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-10">
Fluent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../fluent/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/models/" title="Models" class="md-nav__link">
Models
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/querying/" title="Querying" class="md-nav__link">
Querying
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/migrations/" title="Migrations" class="md-nav__link">
Migrations
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/relations/" title="Relations" class="md-nav__link">
Relations
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/transaction/" title="Transaction" class="md-nav__link">
Transaction
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
<label class="md-nav__link" for="nav-11">
HTTP
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-11">
HTTP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../http/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../http/client/" title="Client" class="md-nav__link">
Client
</a>
</li>
<li class="md-nav__item">
<a href="../../http/server/" title="Server" class="md-nav__link">
Server
</a>
</li>
<li class="md-nav__item">
<a href="../../http/message/" title="Message" class="md-nav__link">
Message
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
<label class="md-nav__link" for="nav-12">
JWT
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-12">
JWT
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../jwt/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../jwt/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-13" type="checkbox" id="nav-13" checked>
<label class="md-nav__link" for="nav-13">
Leaf
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-13">
Leaf
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Overview
</label>
<a href="./" title="Overview" class="md-nav__link md-nav__link--active">
Overview
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#template-syntax" title="Template syntax" class="md-nav__link">
Template syntax
</a>
</li>
<li class="md-nav__item">
<a href="#context" title="Context" class="md-nav__link">
Context
</a>
</li>
<li class="md-nav__item">
<a href="#usage" title="Usage" class="md-nav__link">
Usage
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#conditions" title="Conditions" class="md-nav__link">
Conditions
</a>
</li>
<li class="md-nav__item">
<a href="#loops" title="Loops" class="md-nav__link">
Loops
</a>
</li>
<li class="md-nav__item">
<a href="#embedding-templates" title="Embedding templates" class="md-nav__link">
Embedding templates
</a>
</li>
<li class="md-nav__item">
<a href="#comments" title="Comments" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="#other-tags" title="Other tags" class="md-nav__link">
Other tags
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#date" title="#date" class="md-nav__link">
#date
</a>
</li>
<li class="md-nav__item">
<a href="#capitalize" title="#capitalize" class="md-nav__link">
#capitalize
</a>
</li>
<li class="md-nav__item">
<a href="#contains" title="#contains" class="md-nav__link">
#contains
</a>
</li>
<li class="md-nav__item">
<a href="#count" title="#count" class="md-nav__link">
#count
</a>
</li>
<li class="md-nav__item">
<a href="#lowercase" title="#lowercase" class="md-nav__link">
#lowercase
</a>
</li>
<li class="md-nav__item">
<a href="#uppercase" title="#uppercase" class="md-nav__link">
#uppercase
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#__comments" title="Comments" class="md-nav__link md-nav__link--active">
Comments
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../custom-tags/" title="Custom tags" class="md-nav__link">
Custom tags
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-14" type="checkbox" id="nav-14">
<label class="md-nav__link" for="nav-14">
Logging
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-14">
Logging
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../logging/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../logging/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-15" type="checkbox" id="nav-15">
<label class="md-nav__link" for="nav-15">
Multipart
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-15">
Multipart
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../multipart/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../multipart/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-16" type="checkbox" id="nav-16">
<label class="md-nav__link" for="nav-16">
MySQL
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-16">
MySQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mysql/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-17" type="checkbox" id="nav-17">
<label class="md-nav__link" for="nav-17">
PostgreSQL
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-17">
PostgreSQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../postgresql/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-18" type="checkbox" id="nav-18">
<label class="md-nav__link" for="nav-18">
Redis
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-18">
Redis
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../redis/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../redis/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-19" type="checkbox" id="nav-19">
<label class="md-nav__link" for="nav-19">
Routing
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-19">
Routing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../routing/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-20" type="checkbox" id="nav-20">
<label class="md-nav__link" for="nav-20">
Service
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-20">
Service
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../service/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../service/services/" title="Services" class="md-nav__link">
Services
</a>
</li>
<li class="md-nav__item">
<a href="../../service/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-21" type="checkbox" id="nav-21">
<label class="md-nav__link" for="nav-21">
SQL
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-21">
SQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sql/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../sql/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-22" type="checkbox" id="nav-22">
<label class="md-nav__link" for="nav-22">
SQLite
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-22">
SQLite
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sqlite/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-23" type="checkbox" id="nav-23">
<label class="md-nav__link" for="nav-23">
Template Kit
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-23">
Template Kit
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../template-kit/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-24" type="checkbox" id="nav-24">
<label class="md-nav__link" for="nav-24">
Testing
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-24">
Testing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../testing/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-25" type="checkbox" id="nav-25">
<label class="md-nav__link" for="nav-25">
URL-Encoded Form
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-25">
URL-Encoded Form
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../url-encoded-form/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../url-encoded-form/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-26" type="checkbox" id="nav-26">
<label class="md-nav__link" for="nav-26">
Validation
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-26">
Validation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../validation/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../validation/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-27" type="checkbox" id="nav-27">
<label class="md-nav__link" for="nav-27">
Vapor
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-27">
Vapor
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../vapor/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/client/" title="Client" class="md-nav__link">
Client
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/content/" title="Content" class="md-nav__link">
Content
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/sessions/" title="Sessions" class="md-nav__link">
Sessions
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/websocket/" title="WebSocket" class="md-nav__link">
WebSocket
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/middleware/" title="Middleware" class="md-nav__link">
Middleware
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-28" type="checkbox" id="nav-28">
<label class="md-nav__link" for="nav-28">
WebSocket
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-28">
WebSocket
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../websocket/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../websocket/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-29" type="checkbox" id="nav-29">
<label class="md-nav__link" for="nav-29">
Extras
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-29">
Extras
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extras/style-guide/" title="Style Guide" class="md-nav__link">
Style Guide
</a>
</li>
<li class="md-nav__item">
<a href="../../extras/yeoman/" title="Yeoman" class="md-nav__link">
Yeoman
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-30" type="checkbox" id="nav-30">
<label class="md-nav__link" for="nav-30">
Version (3.0)
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-30">
Version (3.0)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../version/1_5/" title="1.5" class="md-nav__link">
1.5
</a>
</li>
<li class="md-nav__item">
<a href="../../version/2_0/" title="2.0" class="md-nav__link">
2.0
</a>
</li>
<li class="md-nav__item">
<a href="../../version/3_0/" title="3.0" class="md-nav__link">
3.0
</a>
</li>
<li class="md-nav__item">
<a href="../../version/upgrading/" title="Upgrading" class="md-nav__link">
Upgrading
</a>
</li>
<li class="md-nav__item">
<a href="../../version/support/" title="Support" class="md-nav__link">
Support
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#template-syntax" title="Template syntax" class="md-nav__link">
Template syntax
</a>
</li>
<li class="md-nav__item">
<a href="#context" title="Context" class="md-nav__link">
Context
</a>
</li>
<li class="md-nav__item">
<a href="#usage" title="Usage" class="md-nav__link">
Usage
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#conditions" title="Conditions" class="md-nav__link">
Conditions
</a>
</li>
<li class="md-nav__item">
<a href="#loops" title="Loops" class="md-nav__link">
Loops
</a>
</li>
<li class="md-nav__item">
<a href="#embedding-templates" title="Embedding templates" class="md-nav__link">
Embedding templates
</a>
</li>
<li class="md-nav__item">
<a href="#comments" title="Comments" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="#other-tags" title="Other tags" class="md-nav__link">
Other tags
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#date" title="#date" class="md-nav__link">
#date
</a>
</li>
<li class="md-nav__item">
<a href="#capitalize" title="#capitalize" class="md-nav__link">
#capitalize
</a>
</li>
<li class="md-nav__item">
<a href="#contains" title="#contains" class="md-nav__link">
#contains
</a>
</li>
<li class="md-nav__item">
<a href="#count" title="#count" class="md-nav__link">
#count
</a>
</li>
<li class="md-nav__item">
<a href="#lowercase" title="#lowercase" class="md-nav__link">
#lowercase
</a>
</li>
<li class="md-nav__item">
<a href="#uppercase" title="#uppercase" class="md-nav__link">
#uppercase
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#__comments" title="Comments" class="md-nav__link md-nav__link--active">
Comments
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/vapor/documentation/edit/master/3.0/docs/leaf/overview.md" title="Edit this page" class="md-icon md-content__icon">&#xE3C9;</a>
<h1 id="leaf-overview">Leaf Overview<a class="headerlink" href="#leaf-overview" title="Permanent link">&para;</a></h1>
<p>Leaf is a powerful templating language with Swift-inspired syntax. You can use it to generate dynamic HTML pages for a front-end website or generate rich emails to send from an API.</p>
<p>This guide will give you an overview of Leaf's syntax and the available tags.</p>
<h2 id="template-syntax">Template syntax<a class="headerlink" href="#template-syntax" title="Permanent link">&para;</a></h2>
<p>Here is an example of a basic Leaf tag usage.</p>
<div class="codehilite"><pre><span></span><span class="c">There are </span><span class="k">#count</span><span class="p">(</span>users)<span class="c"> users. </span>
</pre></div>
<p>Leaf tags are made up of four elements:</p>
<ul>
<li>Token <code>#</code>: This signals the leaf parser to begin looking for a tag.</li>
<li>Name <code>count</code>: that identifies the tag.</li>
<li>Parameter List <code>(users)</code>: May accept zero or more arguments.</li>
<li>Body: An optional body can be supplied to some tags. This is similar to Swift's trailing-closure syntax.</li>
</ul>
<p>There can be many different usages of these four elements depending on the tag's implementation. Let's look at a few examples of how Leaf's built-in tags might be used:</p>
<div class="codehilite"><pre><span></span><span class="k">#</span><span class="p">(</span>variable)<span class="c"></span>
<span class="k">#embed</span><span class="p">(</span><span class="s">&quot;template&quot;</span>)<span class="c"></span>
<span class="k">#set</span><span class="p">(</span><span class="s">&quot;title&quot;</span>)<span class="c"> </span><span class="bp">{</span><span class="c"> Welcome to Vapor </span><span class="bp">}</span><span class="c"></span>
<span class="k">#count</span><span class="p">(</span>friends)<span class="c"></span>
<span class="k">#for</span><span class="p">(</span>friend <span class="k">in</span> friends)<span class="c"> </span><span class="bp">{</span><span class="c"> &lt;li&gt;</span><span class="k">#</span><span class="p">(</span>friend<span class="err">.</span>name)<span class="c">&lt;/li&gt; </span><span class="bp">}</span><span class="c"></span>
</pre></div>
<p>Leaf also supports many expressions you are familiar with in Swift. </p>
<ul>
<li><code>+</code></li>
<li><code>&gt;</code></li>
<li><code>==</code></li>
<li><code>||</code></li>
<li>etc.</li>
</ul>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span><span class="m m-Int">1</span> <span class="o">+</span> <span class="m m-Int">1</span> <span class="o">==</span> <span class="m m-Int">2</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> Hello!</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<h2 id="context">Context<a class="headerlink" href="#context" title="Permanent link">&para;</a></h2>
<p>In the example from <a href="../getting-started/">Getting Started</a>, we used a <code>[String: String]</code> dictionary to pass data to Leaf. However, you can pass anything that conforms to <code>Encodable</code>. It's actually preferred to use <code>Encodable</code> structs since <code>[String: Any]</code> is not supported.</p>
<div class="codehilite"><pre><span></span><span class="kd">struct</span> <span class="nc">WelcomeContext</span><span class="p">:</span> <span class="n">Encodable</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nv">title</span><span class="p">:</span> <span class="nb">String</span>
<span class="kd">var</span> <span class="nv">number</span><span class="p">:</span> <span class="nb">Int</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">try</span> <span class="n">req</span><span class="p">.</span><span class="n">view</span><span class="p">().</span><span class="n">make</span><span class="p">(</span><span class="s">&quot;home&quot;</span><span class="p">,</span> <span class="n">WelcomeContext</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&quot;Hello!&quot;</span><span class="p">,</span> <span class="n">number</span><span class="p">:</span> <span class="mi">42</span><span class="p">))</span>
</pre></div>
<p>That will expose <code>title</code> and <code>message</code> to our Leaf template, which can then be used inside tags. For example:</p>
<div class="codehilite"><pre><span></span><span class="c">&lt;h1&gt;</span><span class="k">#</span><span class="p">(</span>title)<span class="c">&lt;/h1&gt;</span>
<span class="c">&lt;p&gt;</span><span class="k">#</span><span class="p">(</span>number)<span class="c">&lt;/p&gt;</span>
</pre></div>
<h2 id="usage">Usage<a class="headerlink" href="#usage" title="Permanent link">&para;</a></h2>
<p>Here are some common Leaf usage examples.</p>
<h3 id="conditions">Conditions<a class="headerlink" href="#conditions" title="Permanent link">&para;</a></h3>
<p>Leaf is able to evaluate a range of conditions using its <code>#if</code> tag. For example, if you provide a variable it will check that variable exists in its context:</p>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span>title)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> The title is </span><span class="k">#</span><span class="p">(</span>title)<span class="c"></span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> No title was provided.</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<p>You can also write comparisons, for example:</p>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span>title <span class="o">==</span> <span class="s">&quot;Welcome&quot;</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> This is a friendly web page.</span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> No strangers allowed!</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<p>If you want to use another tag as part of your condition, you should omit the <code>#</code> for the inner tag. For example:</p>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span><span class="bp">lowercase</span>(title) <span class="o">==</span> <span class="s">&quot;welcome&quot;</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> This is a friendly web page.</span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> No strangers allowed!</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<p>Just like in Swift, you can also use <code>else if</code> statement.s</p>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span>title <span class="o">==</span> <span class="s">&quot;Welcome&quot;</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> This is a friendly web page.</span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="k">if (</span><span class="m m-Int">1</span> <span class="o">==</span> <span class="m m-Int">2</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> What?</span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> No strangers allowed!</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<h3 id="loops">Loops<a class="headerlink" href="#loops" title="Permanent link">&para;</a></h3>
<p>If you provide an array of items, Leaf can loop over them and let you manipulate each item individually using its <code>#for</code> tag. </p>
<p>For example, we could update our Swift code to provide a list of planets:</p>
<div class="codehilite"><pre><span></span><span class="kd">struct</span> <span class="nc">SolarSystem</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span>
<span class="kd">let</span> <span class="nv">planets</span> <span class="p">=</span> <span class="p">[</span><span class="s">&quot;Venus&quot;</span><span class="p">,</span> <span class="s">&quot;Earth&quot;</span><span class="p">,</span> <span class="s">&quot;Mars&quot;</span><span class="p">]</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">try</span> <span class="n">req</span><span class="p">.</span><span class="n">view</span><span class="p">().</span><span class="n">render</span><span class="p">(...,</span> <span class="n">SolarSystem</span><span class="p">())</span>
</pre></div>
<p>We could then loop over them in Leaf like this:</p>
<div class="codehilite"><pre><span></span><span class="c">Planets:</span>
<span class="c">&lt;ul&gt;</span>
<span class="k">#for</span><span class="p">(</span>planet <span class="k">in</span> planets)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> &lt;li&gt;</span><span class="k">#</span><span class="p">(</span>planet)<span class="c">&lt;/li&gt;</span>
<span class="bp">}</span><span class="c"></span>
<span class="c">&lt;/ul&gt;</span>
</pre></div>
<p>This would render a view that looks like:</p>
<div class="codehilite"><pre><span></span>Planets:
- Venus
- Earth
- Mars
</pre></div>
<p>Leaf provides some extra variables inside a <code>#for</code> loop to give you more information about the loop's progress:</p>
<ul>
<li>The <code>isFirst</code> variable is true when the current iteration is the first one.</li>
<li>The <code>isLast</code> variable is true when it's the last iteration.</li>
<li>The <code>index</code> variable will be set to the number of the current iteration, counting from 0.</li>
</ul>
<p>Here's how we could use a loop variable to print just the first name in our array:</p>
<div class="codehilite"><pre><span></span><span class="k">#for</span><span class="p">(</span>planet <span class="k">in</span> planets)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> </span><span class="k">#if</span><span class="p">(</span>isFirst)<span class="c"> </span><span class="bp">{</span><span class="c"> </span><span class="k">#</span><span class="p">(</span>planet)<span class="c"> is first! </span><span class="bp">}</span><span class="c"></span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<h3 id="embedding-templates">Embedding templates<a class="headerlink" href="#embedding-templates" title="Permanent link">&para;</a></h3>
<p>Leafs <code>#embed</code> tag allows you to copy the contents of one template into another. When use this, you should always omit the template file's .leaf extension.</p>
<p>Embedding is useful for copying in a standard piece of content, for example a page footer or advert code:</p>
<div class="codehilite"><pre><span></span><span class="k">#embed</span><span class="p">(</span><span class="s">&quot;footer&quot;</span>)<span class="c"></span>
</pre></div>
<p>This tag is also useful for building one template on top of another. For example, you might have a master.leaf file that includes all the code required to lay out your website  HTML structure, CSS and JavaScript  with some gaps in place that represent where page content varies.</p>
<p>Using this approach, you would construct a child template that fills in its unique content, then embeds the parent template that places the content appropriately. To do this, you can use the <code>#set</code> and <code>#get</code> tags to store and later retrieve content from the context.</p>
<p>For example, you might create a child.leaf template like this:</p>
<div class="codehilite"><pre><span></span><span class="k">#set</span><span class="p">(</span><span class="s">&quot;body&quot;</span>)<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> &lt;p&gt;Welcome to Vapor!&lt;/p&gt;</span>
<span class="bp">}</span><span class="c"></span>
<span class="k">#embed</span><span class="p">(</span><span class="s">&quot;master&quot;</span>)<span class="c"></span>
</pre></div>
<p>This stores some HTML in the context as <code>body</code> using <code>#set</code>. We then embed master.leaf which will render <code>body</code> along with any other context variables passed in from Swift. For example, master.leaf might look like this:</p>
<div class="codehilite"><pre><span></span><span class="c">&lt;html&gt;</span>
<span class="c"> &lt;head&gt;</span>
<span class="c"> &lt;title&gt;</span><span class="k">#</span><span class="p">(</span>title)<span class="c">&lt;/title&gt;</span>
<span class="c"> &lt;/head&gt;</span>
<span class="c"> &lt;body&gt;</span><span class="k">#get</span><span class="p">(</span>body)<span class="c">&lt;/body&gt;</span>
<span class="c">&lt;/html&gt;</span>
</pre></div>
<p>Here we are using <code>#get</code> to fetch the content previously stored in the context. When passed <code>["title": "Hi there!"]</code> from Swift, child.leaf will render as follows:</p>
<div class="codehilite"><pre><span></span><span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Hi there!<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Welcome to Vapor!<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div>
<h3 id="comments">Comments<a class="headerlink" href="#comments" title="Permanent link">&para;</a></h3>
<p>You can write single or multiline comments with Leaf. They will be discarded when rendering the view.</p>
<div class="codehilite"><pre><span></span><span class="s">#// Say hello to the user</span><span class="c"></span>
<span class="c">Hello, </span><span class="k">#</span><span class="p">(</span>name)<span class="c">!</span>
</pre></div>
<p>Multi-line comments are opened with <code>#/*</code> and closed with <code>*/</code>.</p>
<div class="codehilite"><pre><span></span><span class="s">#/*</span>
<span class="s"> Say hello to the user</span>
<span class="s">*/</span><span class="c"></span>
<span class="c">Hello, </span><span class="k">#</span><span class="p">(</span>name)<span class="c">!</span>
</pre></div>
<h3 id="other-tags">Other tags<a class="headerlink" href="#other-tags" title="Permanent link">&para;</a></h3>
<h4 id="date"><code>#date</code><a class="headerlink" href="#date" title="Permanent link">&para;</a></h4>
<p>The <code>#date</code> tag formats dates into a readable string.</p>
<div class="codehilite"><pre><span></span><span class="n">render</span><span class="p">(...,</span> <span class="p">[</span><span class="s">&quot;now&quot;</span><span class="p">:</span> <span class="n">Date</span><span class="p">()])</span>
</pre></div>
<div class="codehilite"><pre><span></span><span class="c">The time is </span><span class="k">#date</span><span class="p">(</span>now)<span class="c"></span>
</pre></div>
<p>You can pass a custom date formatter string as the second argument. See Swift's <a href="https://developer.apple.com/documentation/foundation/dateformatter"><code>DateFormatter</code></a> for more information.</p>
<div class="codehilite"><pre><span></span><span class="c">The date is </span><span class="k">#date</span><span class="p">(</span>now, <span class="s">&quot;yyyy-MM-dd&quot;</span>)<span class="c"></span>
</pre></div>
<h4 id="capitalize"><code>#capitalize</code><a class="headerlink" href="#capitalize" title="Permanent link">&para;</a></h4>
<p>The <code>#capitalize</code> tag uppercases the first letter of any string.</p>
<div class="codehilite"><pre><span></span><span class="k">#capitalize</span><span class="p">(</span>name)<span class="c"></span>
</pre></div>
<h4 id="contains"><code>#contains</code><a class="headerlink" href="#contains" title="Permanent link">&para;</a></h4>
<p>The <code>#contains</code> tag accepts an array and a value as its two parameters, and returns true if the array in parameter one contains the value in parameter two.</p>
<div class="codehilite"><pre><span></span><span class="k">#if</span><span class="p">(</span><span class="bp">contains</span>(planets, <span class="s">&quot;Earth&quot;</span>))<span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> Earth is here!</span>
<span class="bp">}</span><span class="c"> </span><span class="k">else</span><span class="c"> </span><span class="bp">{</span><span class="c"></span>
<span class="c"> Earth is not in this array.</span>
<span class="bp">}</span><span class="c"></span>
</pre></div>
<h4 id="count"><code>#count</code><a class="headerlink" href="#count" title="Permanent link">&para;</a></h4>
<p>The <code>#count</code> tag returns the number of items in an array. For example:</p>
<div class="codehilite"><pre><span></span><span class="c">Your search matched </span><span class="k">#count</span><span class="p">(</span>matches)<span class="c"> pages.</span>
</pre></div>
<h4 id="lowercase"><code>#lowercase</code><a class="headerlink" href="#lowercase" title="Permanent link">&para;</a></h4>
<p>The <code>#lowercase</code> tag lowercases all letters in a string. </p>
<div class="codehilite"><pre><span></span><span class="k">#lowercase</span><span class="p">(</span>name)<span class="c"></span>
</pre></div>
<h4 id="uppercase"><code>#uppercase</code><a class="headerlink" href="#uppercase" title="Permanent link">&para;</a></h4>
<p>The <code>#uppercase</code> tag uppercases all letters in a string.</p>
<div class="codehilite"><pre><span></span><span class="k">#uppercase</span><span class="p">(</span>name)<span class="c"></span>
</pre></div>
<h2 id="__comments">Comments</h2>
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = "https://docs.vapor.codes/3.0/leaf/overview/";
this.page.identifier =
"leaf/overview/";
};
(function() {
var d = document, s = d.createElement("script");
s.src = "//vapor-docs.disqus.com/embed.js";
s.setAttribute("data-timestamp", +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../getting-started/" title="Getting Started" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Getting Started
</span>
</div>
</a>
<a href="../custom-tags/" title="Custom tags" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Custom tags
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 Qutheory, LLC
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
<div class="md-footer-social">
<link rel="stylesheet" href="../../assets/fonts/font-awesome.css">
<a href="https://twitter.com/@codevapor" class="md-footer-social__link fa fa-twitter"></a>
<a href="http://vapor.team/" class="md-footer-social__link fa fa-slack"></a>
<a href="https://github.com/vapor" class="md-footer-social__link fa fa-github"></a>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/application.5e60981f.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:"../.."}})</script>
<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,c=a.createElement(t),i=a.getElementsByTagName(t)[0],c.async=1,c.src="https://www.google-analytics.com/analytics.js",i.parentNode.insertBefore(c,i)}(window,document,"script",0,"ga"),ga("create","UA-76177358-4","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");if(Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var a=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",a,e.href)})}),document.forms.search){var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}</script>
</body>
</html>