Ceci est un aperçu des caractéristiques des templates disponibles dans Nunjucks.
Nunjucks est essentiellement un port de jinja2, donc vous pouvez lire leurs docs s'il manque quelque chose ici. Découvrez les différences ici.
Bien que vous soyez libre d'utiliser n'importe quelle extension de fichier pour vos
fichiers de template Nunjucks, la communauté de Nunjucks a adopté .njk
.
Si vous développez des outils ou des aides de syntaxe pour éditeur pour Nunjucks,
veuillez inclure la reconnaissance de l'extension .njk
.
Des plugins sont disponibles pour les différents éditeurs pour prendre en charge la coloration syntaxique de jinja
de Nunjucks.
Une variable remplace une valeur dans le contexte du template. Si vous souhaitez simplement afficher une variable, vous devez faire :
{{ username }}
Ceci recherche username
depuis le contexte et l'affiche. Les noms des
variables peuvent posséder des points qui sont des propriétés, tout comme
javascript. Vous pouvez également utiliser la syntaxe des crochets.
{{ foo.bar }}
{{ foo["bar"] }}
Ces deux syntaxes font exactement la même chose, tout comme javascript.
Si une valeur est undefined
ou null
, rien ne sera affiché. Le même comportement
se produit lors du référencement des objets undefined
ou null
. Tous les
cas suivants n'afficheront rien si foo
est indéfini : {{ foo }}
, {{
foo.bar }}
, {{ foo.bar.baz }}
.
Les filtres sont essentiellement des fonctions qui peuvent être appliquées aux variables.
Ils sont appelés avec le caractère "pipe" (|
) et peuvent prendre des arguments.
{{ foo | title }}
{{ foo | join(",") }}
{{ foo | replace("foo", "bar") | capitalize }}
Le troisième exemple montre comment vous pouvez enchaîner des filtres. Cela affichera "Bar", en remplaçant d'abord "foo" par "bar" puis en mettant la première lettre en capital.
Nunjucks est livré avec plusieurs filtres intégrés et vous pouvez aussi ajouter vos propres filtres.
L'héritage de template est moyen qui facilite la réutilisation des templates. Lors de l'écriture d'un template, vous pouvez définir des "blocs" que des templates enfants remplaceront. La chaîne d'héritage peut être aussi longue que vous le souhaitez.
Si nous avons un template parent.html
qui ressemble à ceci :
{% block header %}
C'est le contenu par défaut
{% endblock %}
<section class="left">
{% block left %}{% endblock %}
</section>
<section class="right">
{% block right %}
C'est un autre contenu
{% endblock %}
</section>
Et nous rendons ce template :
{% extends "parent.html" %}
{% block left %}
C'est la partie gauche !
{% endblock %}
{% block right %}
C'est la partie droite !
{% endblock %}
Nous aurons en sortie :
C'est le contenu par défaut
<section class="left">
C'est la partie gauche !
</section>
<section class="right">
C'est la partie droite !
</section>
Vous pouvez stocker le template à hériter dans une variable et l'utiliser en omettant les guillemets. Cette variable peut contenir un string qui pointe vers un fichier template ou peut contenir un objet Template compilé qui a été ajouté au contexte. De cette façon, vous pouvez modifier dynamiquement le template à hériter lors du rendu en le plaçant dans le contexte.
{% extends parentTemplate %}
Vous exploitez l'héritage avec les tags extends
et
block
. Une explication plus détaillée de l'héritage
peut être trouvé dans les docs de
jinja2.
Vous pouvez rendre les contenus du bloc parent à l'intérieur d'un bloc enfant
en appelant super
. Si dans le modèle de l'enfant ci-dessus, vous avez :
{% block right %}
{{ super() }}
Partie droite !
{% endblock %}
La sortie du bloc sera :
C'est un autre contenu
Partie droite !
Les tags sont des blocs spéciaux qui effectuent des opérations sur des sections du template. Nunjucks est livré avec plusieurs tags intégrés, mais vous pouvez ajouter vos propres tags.
if
teste une condition et vous permet d'afficher de manière sélective le contenu. Il se comporte
exactement comme le if
de javascript.
{% if variable %}
C'est vrai
{% endif %}
Si variable
est défini et évalué à true
, "C'est vrai"
s'affichera, sinon rien n'apparaitra.
Vous pouvez spécifier des conditions alternatives avec elif
(ou elseif
, qui est simplement un alias de elif
)
et else
:
{% if faim %}
J'ai faim
{% elif fatigue %}
Je suis fatigué
{% else %}
Je suis bien !
{% endif %}
Les mots-clefs "and" et "or" correspondent respectivement aux expressions
logiques &&
et ||
.
{% if faim and fatigue %}
J'ai faim et je suis fatigué. Les deux sont vrais.
{% elif faim or fatigue %}
J'ai faim ou je suis fatigué. L'un ou l'autre est vrai.
{% endif %}
Vous pouvez également utiliser if
comme une expression en ligne.
for
permet d'itérer sur les tableaux et les dictionnaires.
Si vous utilisez un chargeur de template personnalisé qui est asynchrone, regardez
asyncEach
)
var items = [{ title: "foo", id: 1 }, { title: "bar", id: 2}];
<h1>Articles</h1>
<ul>
{% for item in items %}
<li>{{ item.title }}</li>
{% else %}
<li>Cela devrait s'afficher si la collection 'item' est vide</li>
{% endfor %}
</ul>
L'exemple ci-dessus liste tous les articles en utilisant l'attribut title
qui est affiché pour chaque élément
dans le tableau items
. Si le tableau items
est vide, le contenu
de la clause facultatif else
sera rendu.
Vous pouvez aussi itérez sur des objets/tables de hachage :
var food = {
'ketchup': '5 doses',
'moutarde': '1 doses',
'cornichon': '0 dose'
};
{% for ingredient, amount in food %}
Utilisez {{ amount }} de {{ ingredient }}
{% endfor %}
Le filtre dictsort
est disponible
pour trier les objets lors de leur itération.
De plus, Nunjucks découpera les tableaux dans des variables :
var points = [[0, 1, 2], [5, 6, 7], [12, 13, 14]];
{% for x, y, z in points %}
Point: {{ x }}, {{ y }}, {{ z }}
{% endfor %}
A l'intérieur des boucles, vous avez accès à quelques variables particulières :
loop.index
: l'itération actuel de la boucle (l'index commence à 1)loop.index0
: l'itération actuel de la boucle (l'index commence à 0)loop.revindex
: le nombre d'itérations jusqu'à la fin (l'index commence à 1)loop.revindex0
: le nombre d'itérations jusqu'à la fin (l'index commence à 0)loop.first
: le booléen qui indique si c'est la première itérationloop.last
: le booléen qui indique si c'est la dernière itérationloop.length
: le nombre total d'élémentsCeci ne s'applique qu'aux templates asynchrones. Découvrez-les ici
asyncEach
est une version asynchrone de for
. Nécessaire seulement si
vous utilisez un chargeur de template qui est
asynchrone, autrement, vous n'en aurez jamais besoin. Les filtres
et les extensions Async en ont aussi besoin, mais les boucles internes sont
automatiquement converties en asyncEach
si des filtres et
des extensions Async sont utilisés dans la boucle.
asyncEach
a exactement le même comportement que for
, mais il permet de gérer
la boucle de façon asynchrone. La raison pour laquelle ces balises sont distinctes :
c'est la performance. La plupart des gens utilisent des templates de façon synchrone et c'est beaucoup
plus rapide avec for
que de le compiler avec une boucle normale for
en JavaScript.
Au moment de la compilation, Nunjucks ne sait pas comment les templates sont chargés,
donc il n'est pas en mesure de déterminer si un bloc include
est asynchrone ou non.
C'est pourquoi il ne peut pas convertir automatiquement les boucles pour vous et donc vous
devez utiliser asyncEach
pour itérer si vous chargez des templates de façon asynchrone
à l'intérieur de la boucle.
// Si vous utilisez un chargeur personnalisé qui est asynchrone, vous avez besoin de asyncEach
var env = new nunjucks.Environment(AsyncLoaderFromDatabase, opts);
<h1>Articles</h1>
<ul>
{% asyncEach item in items %}
{% include "item-template.html" %}
{% endeach %}
</ul>
Ceci ne s'applique qu'aux templates asynchrones. Découvrez-les ici
asyncAll
est similaire à asyncEach
, sauf qu'il rend tous les éléments
en parallèle, tout en préservant l'ordre des éléments. Ceci est seulement utile
si vous utilisez des filtres, des extensions ou des chargeurs asynchrones.
Sinon, vous ne devez jamais utiliser cela.
Disons que vous avez créé un filtre nommé lookup
qui récupère un peu de texte
à partir d'une base de données. Vous pouvez donc rendre plusieurs éléments
en parallèle avec asyncAll
:
<h1>Articles</h1>
<ul>
{% asyncAll item in items %}
<li>{{ item.id | lookup }}</li>
{% endall %}
</ul>
Si lookup
est un filtre asynchrone, il est probablement en train de faire
quelque chose de lent, par exemple aller chercher quelque chose à partir du
disque. asyncAll
vous permet de réduire le temps qu'il faudrait pour exécuter
la boucle séquentiellement en faisant tout le travail de façon asynchrone en parallèle.
Le rendu du template reprend une fois que tous les éléments sont traités.
macro
vous permet de définir des morceaux de contenu réutilisables. C'est semblable à
une fonction dans un langage de programmation. Voici un exemple :
{% macro field(name, value='', type='text') %}
<div class="field">
<input type="{{ type }}" name="{{ name }}"
value="{{ value | escape }}" />
</div>
{% endmacro %}
Maintenant field
est disponible, il peut être appelé comme une fonction normale :
{{ field('user') }}
{{ field('pass', type='password') }}
Les arguments par défaut et avec mots clefs sont disponibles. Regardez arguments avec mots clefs pour une explication plus détaillée.
Vous pouvez importer (import) des macros à partir d'autres templates, cela vous permet de les réutiliser librement à travers votre projet.
Remarque importante : Si vous utilisez l'API asynchrone, soyez conscient que vous ne pouvez rien faire d'asynchrone à l'intérieur des macros. Car les macros sont appelées comme des fonctions normales. Dans le futur, nous pourrions avoir un moyen d'appeler une fonction de manière asynchrone. Si vous faites cela maintenant, le comportement est inconnu.
set
vous permet de créer/modifier une variable.
{{ username }}
{% set username = "joe" %}
{{ username }}
Si username
avait initialement la valeur "james", cela affichera "james joe".
Vous pouvez inclure des nouvelles variables et en définir aussi plusieurs à la fois :
{% set x, y, z = 5 %}
Si set
est utilisé au plus haut niveau, il modifie la valeur du contexte du template
global. Si il est utilisé à l'intérieur de la portée des blocs, comme for
, include
et d'autres, cela modifie
seulement dans cette portée.
Il est également possible de capter le contenu d'un bloc dans une variable en utilisant
l'affectation de bloc. La syntaxe est similaire au standard set
, sauf que le
=
est omis, et tout ce qui se trouve jusqu'au {% endset %}
est capturé.
Cela peut être utile dans certains cas, comme une alternative aux macros :
{% set standardModal %}
{% include 'standardModalData.html' %}
{% endset %}
<div class="js-modal" data-modal="{{standardModal | e}}">
extends
est utilisé pour définir l'héritage de template. Le template
spécifié est utilisé comme template de base. Regardez l'héritage
de template.
{% extends "base.html" %}
Vous pouvez stocker le template à hériter dans une variable et l'utiliser en omettant les guillemets. Cette variable peut contenir un string qui pointe vers un fichier template ou peut contenir un objet Template compilé qui a été ajouté au contexte. De cette façon, vous pouvez modifier dynamiquement le template à hériter lors du rendu en le plaçant dans le contexte.
{% extends parentTemplate %}
En fait, extends
accepte n'importe quelle expression arbitraire, donc vous
pouvez y passer n'importe quoi, aussi longtemps que cette expression correspond
à un string ou un objet Template compilé :
{% extends name + ".html" %}`.
block
définit une section dans le template et l'identifie par un
nom. C'est utilisé par l'héritage de template. Les templates de base peuvent définir
des blocs, ainsi des templates enfants peuvent les remplacer avec du nouveau contenu. Regardez
l'héritage de template.
{% block css %}
<link rel="stylesheet" href="app.css" />
{% endblock %}
Vous pouvez même définir des blocs dans une boucle :
{% for item in items %}
{% block item %}{{ item }}{% endblock %}
{% endfor %}
Les templates enfants peuvent remplacer le bloc item
et changer la façon dont il est affiché :
{% extends "item.html" %}
{% block item %}
Le nom de l'élément est : {{ item.name }}
{% endblock %}
Une fonction spéciale super
est disponible à l'intérieur des blocs qui
rendra le contenu du bloc parent. Regardez super.
include
récupère depuis d'autres templates disponibles. C'est utile lorsque vous avez besoin de partager des
petits morceaux sur plusieurs templates qui héritent déjà d'autres templates.
{% include "item.html" %}
Vous pouvez même inclure des templates à l'intérieur des boucles :
{% for item in items %}
{% include "item.html" %}
{% endfor %}
Ceci est particulièrement utile pour découper des templates en petits morceaux afin que l'environnement du côté du navigateur puisse rendre les petits morceaux quand il est nécessaire de changer de page.
include
accepte n'importe quelle expression arbitraire, donc vous pouvez y passer n'importe quoi,
aussi longtemps que cette expression correspond à un string ou un objet Template
compilé : {% include name + ".html" %}
.
Dans certains cas, il peut être utile de ne pas générer une erreur quand un template n'existe pas. Utilisez
l'option ignore missing
pour supprimer ces erreurs.
{% include "missing.html" ignore missing %}
Un template inclus peut lui même étendre (extend
) un autre template (donc vous pourriez avoir
un ensemble de template qui hérite tous d'une structure commune). Un template
inclus ne participe pas à la structure du bloc du template l'incluant;
il dispoose d'un arbre d'héritage et d'un espace nommé totalement distinct. En d'autres termes,
un include
n' est pas un pré-processeur qui tire le code du template inclus
dans le template, en l'incluant avant de le rendre; au lieu de cela, il déclenche un rendu distinct
du template inclus, et les résultats de ce rendu sont inclus.
import
charge un template différent et vous permet d'accéder à ses valeurs
exportées. Les macros et les affectations de haut niveau (faites avec set
) sont exportées
depuis les templates, ceci vous permet donc d'y accéder dans un template différent.
Les templates importés sont traités sans le contexte actuel par défaut, ils n'ont pas accès à toutes les variables du template actuel.
Commençons par un template appelé forms.html
qui contient ce qui suit :
{% macro field(name, value='', type='text') %}
<div class="field">
<input type="{{ type }}" name="{{ name }}"
value="{{ value | escape }}" />
</div>
{% endmacro %}
{% macro label(text) %}
<div>
<label>{{ text }}</label>
</div>
{% endmacro %}
Nous pouvons importer ce template et lier toutes ses valeurs exportées à une variable afin que nous puissions l'utiliser :
{% import "forms.html" as forms %}
{{ forms.label('Username') }}
{{ forms.field('user') }}
{{ forms.label('Password') }}
{{ forms.field('pass', type='password') }}
Vous pouvez aussi importer des valeurs depuis un template dans l'espace de nommage
actuel avec from import
:
{% from "forms.html" import field, label as description %}
{{ description('Username') }}
{{ field('user') }}
{{ description('Password') }}
{{ field('pass', type='password') }}
Si vous ajoutez with context
à la balise import
, le template importé
sera traité avec le contexte actuel.
{% from "forms.html" import field with context %}
import
accepte n'importe quelle expression arbitraire, donc vous pouvez y passer
n'importe quoi, aussi longtemps que cette expression correspond à un string ou un objet
Template compilé : {% import name + ".html" as obj %}
.
Si vous voulez afficher des balises spéciales de Nunjucks comme {{
, vous pouvez utiliser
un bloc {{
, vous pouvez utiliser
un bloc {% raw %}
et tout ce qui sera à l'intérieur de celui-ci sera affiché au format texte brut.
{% verbatim %}
a le même comportement que {% raw %}
. Il a été ajouté pour
être compatible avec la balise verbatim
de Twig.
Un bloc filter
vous permet d'appeler un filtre avec le contenu de ce
bloc. Au lieu de passer une valeur avec la syntaxe |
, le contenu
du bloc sera passé.
{% filter title %}
que la force soit avec toi
{% endfilter %}
{% filter replace("force", "forth") %}
que la force soit avec toi
{% endfilter %}
REMARQUE : Vous ne pouvez pas faire quelque chose d'asynchrone à l'intérieur de ces blocs.
Un bloc call
vous permet d'appeler une macro avec tout le texte à l'intérieur de
la balise. Ceci est utile si vous voulez passer beaucoup de contenu dans une macro. Le
contenu est disponible à l'intérieur de la macro telle que caller()
.
{% macro add(x, y) %}
{{ caller() }} : {{ x + y }}
{% endmacro%}
{% call add(1, 2) -%}
Le résultat est
{%- endcall %}
L'exemple ci-dessus affichera "Le résultat est : 3".
jinja2 utilise le support des arguments avec mots clefs de Python pour permettre de les utiliser dans les fonctions, les filtres et les macros. Nunjucks supporte bien les arguments avec mots clefs en introduisant une nouvelle convention d'appel.
Les arguments avec mots clefs ressemblent à ceci :
{{ foo(1, 2, bar=3, baz=4) }}
bar
et baz
sont les arguments avec mots clefs. Nunjucks les convertit dans un hash et le
passe comme dernier argument. C'est équivalent à cet appel en javascript :
foo(1, 2, { bar: 3, baz: 4})
Puisqu'il s'agit d'une convention d'appel standard, ça marche pour toutes les fonctions et les filtres, s'ils sont écrits pour les gérer. Lisez-en plus dans la section de l'API.
Les macros vous permettent d'utiliser également des arguments avec mots clefs dans la définition, cela vous permet de définir des valeurs par défaut. Nunjucks fait correspondre automatiquement les arguments avec mots clefs à ceux définis dans la macro.
{% macro foo(x, y, z=5, w=6) %}
{{ x }}, {{ y }}, {{ z }}, {{ w}}
{% endmacro %}
{{ foo(1, 2) }} -> 1, 2, 5, 6
{{ foo(1, 2, w=10) }} -> 1, 2, 5, 10
Vous pouvez mélanger des arguments de position et des arguments avec mots clefs dans des macros. Par exemple, vous pouvez spécifier un argument de position comme un argument mot clef :
{{ foo(20, y=21) }} -> 20, 21, 5, 6
Vous pouvez donc simplement passer un argument de position à la place d'un argument mot clef :
{{ foo(5, 6, 7, 8) }} -> 5, 6, 7, 8
De cette façon, vous pouvez «sauter» les arguments de position :
{{ foo(8, z=7) }} -> 8, , 7, 6
Vous pouvez écrire des commentaires en utilisant {#
et #}
. Les commentaires sont complètement retirés
lors du rendu.
{# Boucle pour tous les users #}
{% for user in users %}...{% endfor %}
Normalement, le moteur de template affiche tout, à l'exception des blocks verbeux de tag et de variable, avec tous les espaces qui se trouvent dans le fichier. Parfois, vous ne voulez pas les espaces supplémentaires, mais vous voulez continuer à formater le template proprement, ce qui nécessite des espaces.
Vous pouvez dire au moteur d'enlever les espaces de début et de fin en ajoutant le signe
moins (-
) sur le tag de début ou de fin d'un bloc ou d'une variable.
{% for i in [1,2,3,4,5] -%}
{{ i }}
{%- endfor %}
L'affichage exact de l'exemple du dessus sera "12345". Le {%-
enlève les espaces à
droite avant le tag et le -%}
enlève les espaces à droite après le tag.
C'est la même chose pour les variables: {{-
enlève les espaces avant la variable,
et -}}
enlève les espaces après la variable.
Vous pouvez utiliser plusieurs types d'expressions littérales que vous avez l'habitude d'utiliser en javascript.
"Comment ça va ?"
, 'Comment ça va ?'
40
, 30.123
[1, 2, "tableau"]
{ un: 1, deux: 2 }
true
, false
Nunjucks vous permet de faire des opérations sur des valeurs (bien que cela doit être utilisée avec parcimonie, car la plupart de votre logique doit être dans le code). Les opérateurs suivants sont disponibles :
+
-
/
//
%
*
**
Vous pouvez les utiliser ainsi :
{{ 2 + 3 }} (affichage 5)
{{ 10/5 }} (affichage 2)
{{ numItems*2 }}
==
===
!=
!==
>
>=
<
<=
Exemples :
{% if numUsers < 5 %}...{% endif %}
{% if i == 0 %}...{% endif %}
and
or
not
Exemples :
{% if users and showUsers %}...{% endif %}
{% if i == 0 and not hideFirst %}...{% endif %}
{% if (x < 5 or y < 5) and foo %}...{% endif %}
Similaire aux opérateurs ternaires de javascript, vous pouvez utiliser if
comme si c'était une
expression en ligne :
{{ "true" if foo else "false" }}
L'affichage du dessus sera "true" si foo est vrai sinon "false". Ceci est particulièrement utile pour les valeurs par défaut comme celle-ci :
{{ baz(foo if foo else "default") }}
Contrairement à l'opérateur ternaire de javascript, le else
est facultatif :
{{ "true" if foo }}
Si vous avez passé une méthode javascript à votre template, vous pouvez l'appeler normalement.
{{ foo(1, 2, 3) }}
Une expression régulière peut être créée comme en JavaScript, mais elle a besoin d'être précédée par r
:
{% set regExp = r/^foo.*/g %}
{% if regExp.test('foo') %}
Foo dans la maison !
{% endif %}
Les flags supportés sont les suivants. Voir Regex sur MDN pour plus d'informations.
g
: La correspondance est cherchée partouti
: La casse est ignoréem
: Multi-ligney
: AdhésionSi autoescaping est activé dans l'environnement, tout l'affichage sera automatiquement
échappé pour un affichage safe. Pour marquer manuellement un affichage à safe, utilisez le
filtre safe
. Nunjucks n'échappera pas cet affichage.
{{ foo }} // <span%gt;
{{ foo | safe }} // <span>
Si autoescaping n'est pas activé, tout l'affichage sera rendu tel quel. Vous pouvez
manuellement échapper les variables avec le filtre escape
.
{{ foo }} // <span>
{{ foo | escape }} // <span>
Il y a quelques fonctions globales intégrées qui couvrent certains cas courants.
Si vous avez besoin d'itérer sur un ensemble de numéros fixes, range
génère cet ensemble
pour vous. Les numéros commencent à start
(0 par défaut) et s'incrémente de step
(par défaut 1)
jusqu'à ce qu'il atteigne stop
, qui n'est pas inclus.
{% for i in range(0, 5) -%}
{{ i }},
{%- endfor %}
L'affichage ci-dessus est 0,1,2,3,4
.
Une façon simple de faire un cycle avec plusieurs valeurs est d'utiliser cycler
, qui prend
un certain nombre d'arguments et fait des cycles à travers eux.
{% set cls = cycler("odd", "even") %}
{% for row in rows %}
<div class="{{ cls.next() }}">{{ row.name }}</div>
{% endfor %}
Dans l'exemple ci-dessus, les lignes impaires ont la classe "odd" et les lignes paires ont la
classe "even". Vous pouvez accéder à l'élément en cours avec la propriété current
(dans
l'exemple du dessus : cls.current
).
En combinant plusieurs éléments, il est fréquent de vouloir les délimiter par
quelque chose comme une virgule, mais vous ne voulez pas afficher le séparateur pour le
premier élément. La classe joiner
affichera le separator
(par défaut ",") chaque fois qu'elle
sera appelée sauf pour la première fois.
{% set comma = joiner() %}
{% for tag in tags -%}
{{ comma() }} {{ tag }}
{%- endfor %}
Si tags
avait ["food", "beer", "dessert"]
, l'exemple ci-dessus afficherait food, beer, dessert
.
Nunjucks a porté la plupart des filtres de jinja, et il a ses propres filtres :
Retourne la valeur absolue de l'argument :
Entrée
{{ -3|abs }}
Sortie
3
Retourne une liste de listes avec le numéro des éléments :
Entrée
{% set items = [1,2,3,4,5,6] %}
{% for item in items | batch(2) %}
-{% for items in item %}
{{ items }}
{% endfor %}
{% endfor %}
Sortie
12-34-56
Met la première lettre en majuscule et le reste en minuscule :
Entrée
{{ "Ceci Est Un Test" | capitalize }}
Sortie
Ceci est un test
Centre la valeur dans un champ d'une largeur donnée :
Entrée
{{ "fooo" | center }}
Sortie
fooo
(raccourci avec d
)
Si value
est strictement undefined
, cela retourne default
, sinon value
. Si
boolean
est true, toute valeur JavaScript fausse retournera default
(false, "",
etc)
La version 2.0 a changé le comportement par défaut de ce filtre.
Auparavant, il agissait comme si boolean
était à true par défaut et donc toute
valeur fausse retournait default
. Dans la 2.0, le comportement par défaut retourne
default
seulement pour une valeur undefined
. Vous pouvez obtenir l'ancien
comportement en passant true
à boolean
, ou en utilisant simplement value or default
.
Tri un dictionnaire et rend des paires (clé, valeur) :
{% set items = {
'e': 1,
'd': 2,
'c': 3,
'a': 4,
'f': 5,
'b': 6
} %}
{% for item in items | dictsort %}
{{ item[0] }}
{% endfor %}
Sortie
a b c d e f
Appelle JSON.stringify
sur un objet et déverse le résultat dans le
template. C'est utile pour le débogage : {{ foo | dump }}
.
Entrée
{% set items = ["a", 1, { b : true}] %}
{{ items | dump }}
Sortie
["a",1,{"b":true}]
Dump fournit un paramètre pour les espaces afin d'ajouter des espaces ou des tabulations aux valeurs retournées. Cela rend le résultat plus lisible.
Entrée
{% set items = ["a", 1, { b : true}] %}
{{ items | dump(2) }}
Sortie
[
"a",
1,
{
"b": true
}
]
Entrée
{% set items = ["a", 1, { b : true}] %}
{{ items | dump('\t') }}
Sortie
[
"a",
1,
{
"b": true
}
]
Convertit les caractères &, <, >, ‘, et †dans des chaines avec des séquences HTML sécurisées. Utilisez cette option si vous avez besoin d'afficher du texte qui pourraient contenir des caractères en HTML. Les résultats rendent la valeur comme une chaîne de balisage.
Entrée
{{ "<html>" | escape }}
Sortie
<html>
Donne le premier élément dans un tableau :
Entrée
{% set items = [1,2,3] %}
{{ items | first }}
Sortie
1
Convertit une valeur en un nombre à virgule flottant. Si la conversion échoue, 0.0 est retourné. Cette valeur par défaut peut être modifiée en utilisant le premier paramètre.
Entrée
{{ "3.5" | float }}
Sortie
3.5
Groupe une séquence d'objets par un attribut commun :
Entrée
{% set items = [
{ name: 'james', type: 'green' },
{ name: 'john', type: 'blue' },
{ name: 'jim', type: 'blue' },
{ name: 'jessie', type: 'green' }
]
%}
{% for type, items in items | groupby("type") %}
<b>{{ type }}</b> :
{% for item in items %}
{{ item.name }}
{% endfor %}<br>
{% endfor %}
Sortie
green : james jessie
blue : john jim
Indente une chaîne en utilisant des espaces. Le comportement par défaut est de ne pas indenter la première ligne. Par défaut l'indentation est de 4 espaces.
Entrée
{{ "one\ntwo\nthree" | indent }}
Sortie
one
two
three
Change l'indentation par défaut à 6 espaces :
Entrée
{{ "one\ntwo\nthree" | indent(6) }}
Sortie
one
two
three
Change l'indentation par défaut à 6 espaces et indente la première ligne :
Entrée
{{ "one\ntwo\nthree" | indent(6, true) }}
Sortie
one
two
three
Convertit la valeur en un entier. Si la conversion échoue, cela retourne 0.
Entrée
{{ "3.5" | int }}
Sortie
3
Retourne une chaine qui est la concaténation des chaines dans la séquence :
Entrée
{% set items = [1, 2, 3] %}
{{ items | join }}
Sortie
123
Le séparateur entre les éléments est par défaut une chaine vide qui peut être définie avec un paramètre facultatif :
Entrée
{% set items = ['foo', 'bar', 'bear'] %}
{{ items | join(",") }}
Sortie
foo,bar,bear
Ce comportement est applicable aux tableaux :
Entrée
{% set items = [
{ name: 'foo' },
{ name: 'bar' },
{ name: 'bear' }]
%}
{{ items | join(",", "name") }}
Sortie
foo,bar,bear
Donne le dernier élément dans un tableau :
Entrée
{% set items = [1,2,3] %}
{{ items | last }}
Sortie
3
Retourne la longueur d'un tableau, d'une chaine ou le nombre de clés dans un objet :
Entrée
{{ [1,2,3] | length }}
{{ "test" | length }}
{{ {key: value} | length }}
Sortie
3
4
1
Convertit la valeur en une liste. Si c'est une chaine, la liste retournée sera une liste de caractères.
Entrée
{% for i in "foobar" | list %}{{ i }},{% endfor %}
Sortie
f,o,o,b,a,r,
Convertit une chaine en minuscule :
Entrée
{{ "fOObAr" | lower }}
Sortie
foobar
Remplace les nouvelles lignes par des éléments HTML <br />
:
Entrée
{{ "foo\nbar" | striptags(true) | escape | nl2br }}
Sortie
foo<br />\nbar
Sélectionne une valeur aléatoire depuis un tableau. (Cela changera à chaque fois que la page est actualisée).
Entrée
{{ [1,2,3,4,5,6,7,8,9] | random }}
Sortie
Une valeur aléatoire entre 1-9 (dont les bornes sont incluses).
Filtre une suite d'objets, en appliquant un test sur l'attribut spécifié pour chaque objet et en rejetant les objets où le test réussit.
Ceci est à l'opposé du filtre selectattr
.
Si aucun test n'est spécifié, la valeur de l'attribut sera évaluée comme une valeur booléenne.
Entrée
{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}
{{ foods | rejectattr("tasty") | length }}
Sortie
1
Remplace un élément par un autre. Le premier argument est l'élément à remplacer, le deuxième est la valeur de remplacement.
Entrée
{% set numbers = 123456 %}
{{ numbers | replace("4", ".") }}
Sortie
123.56
Pour insérer un élément avant et après une valeur, il faut ajouter des guillemets et cela mettra l'élément autour de la valeur :
Entrée
{% set lettres = aaabbbccc%}
{{ "lettres" | replace("", ".") }}
Sortie
.l.e.t.t.r.e.s.
Il possible de préciser le nombre de remplacement à effectuer (élément à remplacer, élément de remplacement, nombre de remplacement) :
Entrée
{% set letters = "aaabbbccc" %}
{{ letters | replace("a", "x", 2) }}
Remarquez que dans ce cas, les guillemets sont nécessaires pour la liste.
Sortie
xxabbbccc
Il est possible de rechercher des modèles dans une liste pour les remplacer :
Entrée
{% set letters = "aaabbbccc" %}
{{ letters | replace("ab", "x", 2) }}
Sortie
aaxbbccc
Inverse une chaine :
Entrée
{{ "abcdef" | reverse }}
Sortie
fedcba
Inverse un tableau :
Entrée
{% for i in [1, 2, 3, 4] | reverse %}
{{ i }}
{% endfor %}
Sortie
4 3 2 1
Arrondit un nombre :
Entrée
{{ 4.5 | round }}
Sortie
5
Arrondit au nombre entier le plus proche (qui arrondit vers le bas) :
Entrée
{{ 4 | round(0, "floor") }}
Sortie
4
Spécifiez le nombre de décimales pour arrondir :
Entrée
{{ 4.12346 | round(4) }}
Sortie
4.1235
Marquez la valeur comme sûre, ce qui signifie que dans un environnement avec des échappements automatique, cela permet à cette variable de ne pas être échappée.
Entrée
{{ "foo http://www.example.com/ bar" | urlize | safe }}
Sortie
foo <a href="http://www.example.com/">http://www.example.com/</a> bar
Filtre une suite d'objets, en appliquant un test sur l'attribut spécifié pour chaque objet et en sélectionnant les objets où le test réussit.
Ceci est à l'opposé du filtre rejectattr
.
Si aucun test n'est spécifié, la valeur de l'attribut sera évaluée comme une valeur booléenne.
Entrée
{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}
{{ foods | selectattr("tasty") | length }}
Sortie
2
Découpe un itérateur et retourne une liste de listes contenant ces éléments :
Entrée
{% set arr = [1,2,3,4,5,6,7,8,9] %}
<div class="columwrapper">
{%- for items in arr | slice(3) %}
<ul class="column-{{ loop.index }}">
{%- for item in items %}
<li>{{ item }}</li>
{%- endfor %}
</ul>
{%- endfor %}
</div>
Sortie
<div class="columwrapper">
<ul class="column-1">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<ul class="column-2">
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
<ul class="column-3">
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
</div>
Tri arr
avec la fonction arr.sort
de JavaScript. Si reverse
est à true, le résultat
sera inversé. Le tri est insensible à la casse par défaut, mais en paramétrant caseSens
à true, cela le rend sensible à la casse. Si attr
est passé, cela permettra de comparer attr
à
chaque élément.
Convertit un objet en une chaine :
Entrée
{% set item = 1234 %}
{% for i in item | string | list %}
{{ i }},
{% endfor %}
Sortie
1,2,3,4,
C'est similaire à
striptags de jinja. Si
preserve_linebreaks
est à false (par défaut), cela enlève les balises SGML/XML et remplace
les espaces adjacents par un seul espace. Si preserve_linebreaks
est à true,
cela normalise les espaces, en essayant de préserver les sauts de lignes originaux. Utiliser le second
comportement si vous voulez utiliser ceci {{ text | striptags(true) | escape | nl2br }}
.
Sinon utilisez le comportement par défaut.
Rend la somme des éléments dans le tableau :
Entrée
{% set items = [1,2,3] %}
{{ items | sum }}
Sortie
6
Met la première lettre de chaque mot en majuscule :
Entrée
{{ "foo bar baz" | title }}
Sortie
Foo Bar Baz
Enlève les espaces avant et après :
Entrée
{{ " foo " | trim }}
Sortie
foo
Retourne une copie tronquée de la chaîne. La longueur est spécifiée avec le premier paramètre qui est par défaut à 255. Si le second paramètre est à true, le filtre coupera le texte à la longueur demandée. Sinon, il enlèvera le dernier mot. Si le texte a été en fait tronqué, cela ajoutera un des points de suspension ("..."). Un signe de suspension différent de "(...)" peut être spécifié en utilisant le troisième paramètre.
Tronque 3 caractères :
Entrée
{{ "foo bar" | truncate(3) }}
Sortie
foo(...)
Tronque 6 caractères et remplace "..." avec "?" :
Entrée
{{ "foo bar baz" | truncate(6, true, "?") }}
Sortie
foo ba ?
Convertit la chaine en majuscules :
Entrée
{{ "foo" | upper }}
Sortie
FOO
Échappe les chaînes pour l'utiliser dans les URL, en utilisant l'encodage UTF-8. Il accepte à la fois les dictionnaires et les chaînes régulières ainsi que les iterables par paires.
Entrée
{{ "&" | urlencode }}
Sortie
%26
Convertit les URL en texte brut dans des liens cliquables :
Entrée
{{ "foo http://www.example.com/ bar" | urlize | safe }}
Sortie
foo <a href="http://www.example.com/">http://www.example.com/</a> bar
Tronque le texte de l'URL selon le nombre donné :
Entrée
{{ "http://mozilla.github.io/" | urlize(10, true) | safe }}
Sortie
<a href="http://mozilla.github.io/">http://moz</a>
Compte et rend le nombre de mot à l'intérieur d'une chaine :
Entrée
{% set foo = "Hello World"%}
{{ foo | wordcount }}
Sortie
2
Sinon, il est facile de lire le code JavaScript qui implémente ces filtres.