1个稳定版本
1.0.0 | 2020年1月30日 |
---|
#320 在 模板引擎
78KB
2K SLoC
mhtemplate
mhtemplate是一个易于使用的动态文本模板库。
用法
[dependencies]
mhtemplate = "1"
extern crate mhtemplate;
use mhtemplate::{Context, TemplateFactory};
let text = include_str!("text.template");
let tmpl = TemplateFactory::new(&text).parse().unwrap();
let text = tmpl.evaluate(&mut Context::new()).unwrap();
变更日志
lib.rs
:
文本模板库。
模板是一种可能包含特殊分隔符的文本
- 语句:
{% ... %}
- 表达式:
{{ ... }}
- 注释:
{# ... #}
可以在任何分隔符前添加连字符,{%-
或 -%}
,分别用于移除前导或尾部空白。
表达式
模板表达式可以由常量、变量和运算符组成。没有运算符优先级的概念,计算顺序是从右到左。然而,这可能在未来的版本中发生变化。
表达式出现在表达式分隔符内: {{ ... }}
或某些语句中,并且可以根据上下文作为字符串、数字或布尔值进行评估。
支持的表达式
表达式 | 注释 |
---|---|
<var> |
变量,例如:$foo |
<const> |
常量,例如:6 或 "Hello World" |
<expr>++ |
增量。 <expr> 被评估为数字 |
<expr>-- |
递减。 <expr> 被评估为数字 |
<expr> + <expr> |
加法。 <expr> 被评估为数字。 |
<expr> - <expr> |
减法。 <expr> 被评估为数字。 |
<expr> * <expr> |
乘法。 <expr> 被评估为数字。 |
<expr> / <expr> |
除法。 <expr> 被评估为数字。 |
<expr> < <expr> |
小于。 <expr> 被评估为数字。 |
<expr> > <expr> |
大于。 <expr> 被评估为数字。 |
<expr> <= <expr> |
小于等于。 <expr> 被评估为数字。 |
<expr> >= <expr> |
大于等于。 <expr> 被评估为数字。 |
<expr> == <expr> |
等于。 <expr> 都可以评估为数字或字符串。 |
<expr> != <expr> |
不等于。 <expr> 都可以评估为数字或字符串。 |
<expr> . <expr> |
连接。 <expr> 被评估为字符串。 |
作为布尔值评估的表达式将评估为
- 数字: "0" 为假,其他任何东西都为真。
- "true"/"false" 字符串(不区分大小写)为真/假。
- 返回真/假的比较表达式。
- 其他任何东西都是假。
语句
语句发生在语句分隔符内: {% ... %}
。支持的语句包括循环、条件、 set
和 with
。
循环
重复循环
{% repeat <expr> %}
Hello
{% end %}
for 循环
{% for <ident> in <expr> %}
Hello {{ $<ident> }}
{% end %}
枚举 for 循环
{% for <ident_i>, <ident> in <expr> %}
Hello {{ $<ident> }} (element nr. {{ $<ident_i> + 1 }})
{% end %}
循环中的表达式被评估为数字或字符串。作为数字,循环将在 [0,n) 上迭代。作为字符串,循环将在字符串中的单词上迭代,以空格为分隔符。
条件
if/elif/else 条件
{% if <expr> -%}
Hey if
{% elif <expr> -%}
Hey elif
{% else -%}
Hey else
{% end %}
条件语句中的任何表达式都被评估为布尔值。
上下文
上下文在评估模板时传递,可能包含在评估期间可用的变量值。
上下文可以由 HashMap
或环境变量创建。
简单上下文
let mut ctx = Context::new();
ctx["NUMBER"] = String::from("42");
环境上下文
let vars = std::env::vars();
let ctx = Context::from(vars);
示例
模板文本
{% set num 4
set str Hello World %}
{%- repeat $num -%}
Brrapp {% end %}
{%- for VAL in $num -%}
{{ $VAL }}
{% end %}
{% for i, s in $str -%}
{{ $i }} - {{ $s }}
{%end%}
{%- if $num > 6 %}
NOT PRINTED
{%- elif $num == 4 %}
PRINTED
{%- else %}
NOT PRINTED
{%- end %}
{%- with
set num (($num*2) - 1)--
set str UGH %}
Ut enim ad minim {{ $str }}, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit {{ $num }} cillum dolore eu fugiat nulla pariatur.
{% end -%}
Excepteur sint occaecat cupidatat non {{ $str }}, sunt in culpa qui officia deserunt mollit anim id est {{ $num }}.
Rust 错误使用
let text = String::from("{% repeat 3 %} Hello {% end %}");
let tmpl = TemplateFactory::new(&text).parse().unwrap();
let text = tmpl.evaluate(&mut Context::new()).unwrap();
评估后的模板返回
Brrapp Brrapp Brrapp Brrapp 0
1
2
3
0 - Hello
1 - World
PRINTED
Ut enim ad minim UGH, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit 6 cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non Hello World, sunt in culpa qui officia deserunt mollit anim id est 4.
依赖关系
~2.2–3MB
~54K SLoC