- Add a
urlencode_strict
filter - Add more array literals feature in templates
- Make
filter
filter value argument optional
- Add
trim_start
,trim_end
,trim_start_matches
andtrim_end_matches
filters - Allow blocks in filter sections
- Add Tera::render_str, like Tera::one_off but can use an existing Tera instance
- Length filter now errors for things other than array, objects and strings. The fact that it was returning 0 before for other types was something that should have been fixed before 1.0 but got forgotten and was considered a bug.
- Fix filter sections not keeping whitespaces
- The filesizeformat filter now takes a usize instead of a i64: no changes to behaviour
- Now requires Rust 1.34
- Removed error-chain errors and added rich Error enum instead
- Filter, Tester and Function are now traits and now take borrowed values instead of owned
- Updated for 2018 edition
- Require macros import to be at the top of the files along with
extends
as it is fairly cheap and the code already only really look there. - Enforce spacing in tags at the parser, before
ifsomething
was considered ok - Pluralize filter now uses
singular
andplural
arguments instead ofsuffix
- Add a test for checking whether a variable is an object
- Escaping now happens before inserting the final result of an expression: no need anymore to add
| safe
everywhere, only at the last position - Remove
safe
argument of the urlencode filter,/
is still escaped by default - The
compile_templates!
macro has been removed
- Tests can now use
value is not defined
order for negation (Keats#308) - Add
nth
filter to get the nth value in an array - You can now use glob patterns in
Tera::new
default
filter now works on Null values- Literal numbers in template overflowing i64/f64 will now be an error instead of panicking
- Allow arrays as test arguments
- Add the
in
operator to check if a left operand is contained in a right one. Also supports negation asnot in
- Add
Context::from_value
to instantiate aContext
from a serde_jsonValue
- Add
Context::from_serialize
to instantiate aContext
from something that implSerialize
- Make tests helper fns
number_args_allowed
,value_defined
andextract_string
public - Add
else
clause to for loops - Filters are now evaluated when checking if/elif conditions
- Allow
{{-
and-}}
for whitespace management - Add
xml_escape
filter - Grave accent is no longer escaped in HTML, it is not really needed anymore
- Add a
builtins
default feature that gate all filters/functions requiring additional dependencies - Add
unique
andmap
filter - Add a
timezone
attribute to thedate
filter - Add a
get_random
function to get a random number in a range - Add a
get_env
function to get the value of an environment variable
- Fix bugs in
filter
andget
filters
- Allow function calls in math expressions
- Allow string concatenation to start with a number
- Allow function calls in string concatenations
- Add a
concat
filter to concat arrays or push an element to an array
- Allow concatenation of strings and numbers
- Clear local context on each forloop iteration
- Fix variable lookup with
.
that was completely wrong - Now requires Rust 1.26 because of some dependencies update
- Fix
set
/set_global
not working correctly in macros - Deprecate
register_global_function
forregister_function
- Remove invalid
unreachable!
call causing panic in some combination or for loop and specific filters - Fix macros loading in parent templates and using them in child ones
- Fix macros loading other macros not working when called in inheritance
- Mark
Context::add
as deprecated and do not display it in the docs anymore (aka TIL thedeprecated
attribute) - Fix
__tera_context
not getting all the available context (set
,forloop
etc) - Better error message when variable indexing fails
- Remove stray println
- Add
as_str
filter - Way fewer allocations and significant speedup (2-5x) for templates with large objects/loops
- Checks that all macro files are accounted for at compile time and errors if it's not the case
filter
filter was not properly registered (╯°□°)╯︵ ┻━┻
truncate
filter now works correctly on multichar graphemes
- Add a
throw
global function to fail rendering from inside a template
- Add a
matching
tester - Register
now
global function so it is available - Update
error-chain
- Add
True
andFalse
as boolean values to match Python - Allow user to define their own escape function, if you want to generate JSON for example
- Add
end
argument to thetruncate
filter to override the default ellipsis - Add a
group_by
filter - Add a
filter
filter - Add the
~
operator to concatenate strings - Add a
now
global function to get local and UTC datetimes - Add feature to enable the
preserve_order
feature of serde_json - Less confusing behaviour with math arithmetics
- Add array literal instantiation from inside Tera for set, set_global, kwargs and for loop container
- Fix panic on truncate filter
- Add
break
andcontinue
to forloops - Fix strings delimited by single quote and backtick not removing the delimiters
- Re-export
serde_json::Number
as well
- Re-export
serde_json::Map
as well - You can now access inside a variable using index notation:
{{ arr[0] }}
,{{ arr[idx] }}
etc thanks to @bootandy - Add
Context::insert
identical toContext::add
to mirror Rust HashMap/BTreeMap syntax
- Add a
slice
filter for arrays - Fix macro files importing other macro files not loading properly
- Fix forloop container being allowed logic expressions
- Much improved parsing error messages
- Fix regression when including templates that import macros
- Fix
pluralize
filter for real this time!
- Fix regression with expressions in comparisons
- Tests parentheses are now mandatory if there are arguments (
divisibleby 2
->divisibleby(2)
) - Tests can be only used on variables now, not on expressions
- Escaping happens immediately now instead of waiting for the filters to be called, unless
safe
is first. If you want the old behaviour you will need to start the a chain of filters with| safe
as the first one
- Tests, global functions calls and macro calls are now expressions and can be combined like so:
if x is divisibleby(2) and x > 10
- Add default arguments for macro arguments
- Add whitespace management similar to Liquid and Jinja2
- Add parentheses to expressions to remove ambiguities
- Block & macro end tag name are no longer mandatory and it doesn't error on mismatched names between the start and end tag anymore
- Filters can now be applied to expressions
- Add modulo operator
%
for math expressions - Allow comment tags before the extend tag
- Make
NaiveDateTime
work with thedate
filter pluralize
filter now returns the plural suffix for 0 thing as it's apparently what English does- Add a
set_global
tag that allows you to set something in the global context: meant to be used in forloops where the normalset
would put the value into the loop context - Add
starting_with
,ending_with
andcontaining
tests - Add
json_encode
,default
andsort
filters - Strings can now also be contained in backticks and single quotes in templates
- Add
Tera::parse
for some niche use-cases
- Handle path to templates starting with "./"
- Fix loop and macro context overlaps
- Fix variables being escaped when given to
set
or as arguments to filters/macros/global fns
- Update chrono
- Fix not being able to use variables starting with
or
,and
andnot
- Fix
<=
and>=
not being recognised properly - Fix if/elif conditions falling through: only the first valid one will be rendered
- Handle NaN results in
{% set %}
instead of panicking - Allow math node on if/elif conditions & fix f64 truthiness
- Fix not being able to call global functions without arguments
- Fix multiple inheritance not rendering blocks as expected for nested blocks
- Allow filters on key/value for loop containers
- Fix bug with
{% set %}
in forloops
- Add
Send
toGlobalFn
return type
- Add global functions, see README
- Add set tag, see README
- Add get filter
- Fix bug with section filter swallowing all content after the end tag
- Allow whitespace in function args
- Fix bug with variable in loop using starting with the container name (#165)
- Allow whitespace in macros/filters params
- Update Serde to 1.0.0
- Fix date filter converting everything to UTC
- Fix panic when using filters on forloop container
- Fix bug in Windows where the glob path was not removed correctly
Tera::extend
now also copy filters and testers
- Macro rendering perf improved and general code cleanup thanks to @Peternator7
- Fix bug in parser with floats
- Make
date
filter work with string input inYYYY-MM-DD
format - Big parsing improvement (~20-40%) for projects with macros and inheritance
- Add
Tera::extend
to extend another instance of Tera - Add
Tera::full_reload
that will re-run the glob and parse all templates found. - Make
Tera::add_raw_template{s}
andTera::add_template_file{s}
part of the public API - Fix location in error message when erroring in a child template
- Remove
value_render
andvalue_one_off
, you can now userender
andone_off
for both values and context
- Speed improvements on both parsing and rendering (~20-40% faster)
- Better error message on variable lookup failure in loops
- Can now iterate on maps/struct using the
{% for key, val in my_object %}
construct
- Update chrono version
- Make variable block like
{{ "hey" }}
render correctly
- Support filter sections
- Fix path prefix trimming on Windows
Tera::add_template
->Tera::add_raw_template
Tera::add_templates
->Tera::add_raw_templates
- Performance improvement thanks to @clarcharr
- Better error message for
value_render
. Thanks to @SilverWingedSeraph for the report - Hide
add_raw_template
andadd_raw_templates
from docs, they were meant for internal use - Exported macros now use the
$crate
variable, which means you don't need to import anything from Tera to have them working - Expose AST (not covered by semver)
- Add a
Context::extend
method to merge a context object into another one
- Performance improvements thanks to @wdv4758h
- Correctly register
date
filter and make it work on a RFC3339 string as well thanks to @philwhineray
- Added
Tera::value_one_off
to parse and render a single template using a Json value as context
not
is now a Tera keyword
- Added
#![deny(missing_docs)]
to the crate - Added
Tera::one_off
to parse and render a single template - Added
not
operator in conditions to mean falsiness (equivalent to!
in Rust) - Remove specific error message when using
||
or&&
- Improved performances for parsing and rendering (~5-20%)
- Added
precision
arg toround
filter - Added
date
filter to format a timestamp to a date(time) string
A few breaking changes in this one
- Tera no longer panics when parsing templates, it returns an error instead
- Tester fn signature changes from
fn(&str, Option<Value>, Vec<Value>) -> Result<bool>
tofn(Option<Value>, Vec<Value>) -> Result<bool>
- Rename
TeraResult
export toResult
- Stabilized
Tera::add_template
andTera::add_templates
- Added
compile_templates!
macro to try to compile all templates and, in case of errors, print them and exit the process - Much improved error messages
- Add a magical variable
__tera_context
that will pretty print the current context - More documentation inside the crate itself
- Actually register the
filesizeformat
,slugify
,addslashes
, good thing no one noticed - Add
divisibleby
anditerable
test - Made
try_get_value!
macro work outside of Tera
- Remove println! left behind
- Fix macros not being found in child templates
- Export
Value
andto_value
(currently from serde-json)
- Add macros
- Add
filesizeformat
filter - Add autoescape
- Add multiple level inheritance
- Add nested blocks
- Add
{{ super() }}
Thanks to @SergioBenitez and @yonran for the help!
- Fix regression when using variables in forloops + add test for it
- Change signature of tests functions (BREAKING CHANGE)
- Add more tests:
undefined
,odd
,even
,number
andstring
- Add
include
directive to include another file - Indexed array/tuple access using the
.x
wherex
is an integer
Thanks to @SergioBenitez and @andrelmartins for the contributions!
- Added filters, see README for current list
- Added tests, only
defined
for now
Thanks to @SergioBenitez, @orhanbalci, @foophoof and @Peternator7 for the contribution!
- Completely new parser
- Expose TeraError