Jinja (3.x) server-side template engine port for Dart 2. Variables, expressions, control structures and template inheritance.
FilterArgumentError
error class removed*args
and**kwargs
arguments support removed- Auto-escaping and related statements, filters and tests have been removed due to the impossibility of extending
String
. Use theescape
filter manually or escape values before passing them to the template.
For more information, see CHANGELOG.md
.
It is mostly similar to Jinja templates documentation, differences provided below.
work in progress.
- The
default
filter compares values withnull
. - The
defined
andundefined
tests compare values withnull
. - The
map
filter also compares values withnull
. Useattribute
anditem
filters forobject.attribute
andobject[item]
expressions. - If
Environment({getAttribute})
is not passed, thegetItem
method will be used. This allows you to use{{ map.key }}
as an expression equivalent to{{ map['key'] }}
. - Slices and negative indexes are not supported.
- Macro arguments without default values are required.
- Not supported:
- Template module.
- work in progress
[]
,+
,-
,*
,/
,~/
,%
operatorsobject.length
getterobject.call
getterFunction.apply(function, ...)
import 'package:jinja/jinja.dart';
// ...
var environment = Environment(blockStart: '...', blockEnd: '...');
var template = environment.fromString('...source...');
print(template.render({'key': value}));
// or write directly to StringSink (IOSink, HttpResponse, ...)
template.renderTo(stringSink, {'key': value});
See also examples with conduit and reflectable.
- Informative error messages
- Template name 🔥
- Source span 🔥
Template
class:generate
methodstream
method
- Relative template paths
- Async Support
- Template Inheritance
- Super Blocks
{{ super.super() }}
- Super Blocks
- List of Control Structures
- Extends
- Execute non-
block
statements and expressions{% extends 'base.html' %} {% set title = 'Index' %} {% macro header() %} <h1>{{ title }}</h1> {% endmacro %} ``` {% block body %} {{ header() }} {% endblock %}
- Execute non-
- Extends
- Expressions
- Dart Methods and Properties
!.
/?.
- Dart Methods and Properties
- Loaders
- PackageLoader (VM)
- ...
- List of Global Functions
lipsum
cycler
joiner
- Extensions
- i18n
- Loop Controls
- Debug Statement
- Template compiler (builder)
- ...
Note: item - not supported
- Variables
- Filters
forceescape
safe
unsafe
- Tests
escaped
- Comments
- Whitespace Control
- Escaping (only
escape
filter) - Line Statements
- Comments
- Blocks
- Template Inheritance
- Base Template
- Child Template
- Super Blocks
- Nesting extends
- Named Block End-Tags
- Block Nesting and Scope
- Required Blocks
- Template Objects
HTML Escaping- List of Control Structures
- For
- If
- Macro
- Call
- Filters
- Assignments
- Block Assignments
- Extends
- Blocks
- Include
- Import
- Import Context Behavior
- Expressions with filters and tests
- Literals
"Hello World"
42
/123_456
42.23
/42.1e2
/123_456.789
['list', 'of', 'objects']
('tuple', 'of', 'values')
{'dict': 'of', 'key': 'and', 'value': 'pairs'}
true
/false
null
- Math
+
-
/
//
%
*
**
- Comparisons
==
!=
>
>=
<
<=
- Logic
and
or
not
(expr)
- Other Operators
in
is
|
~
()
.
/[]
- If Expression
{{ list.last if list }}
{{ user.name if user else 'Guest' }}
- Dart Methods and Properties (if reflection is on)
{{ string.toUpperCase() }}
{{ list.add(item) }}
- Literals
- List of Global Functions
dict
print
range
list
namespace
- Loaders
FileSystemLoader
MapLoader
(DictLoader
)
- Extensions
- Expression Statement
- With Statement
Autoescape Overrides
Contributions are welcome! Please open an issue or pull request on GitHub. Look at the ToDo list and comments in the code for ideas on what to work on. There are no strict rules, but please try to follow the existing code style.
As non-native English speaker and learner, I will be grateful for any corrections in the documentation and code comments.
Post issues and feature requests on the GitHub issue tracker.