#template #simple #text

mhtemplate

易于使用的动态文本模板库

1个稳定版本

1.0.0 2020年1月30日

#320模板引擎

BSD-3-Clause

78KB
2K SLoC

mhtemplate

Latest version Documentation GitHub license

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" 字符串(不区分大小写)为真/假。
  • 返回真/假的比较表达式。
  • 其他任何东西都是假。

语句

语句发生在语句分隔符内: {% ... %}。支持的语句包括循环、条件、 setwith

循环

重复循环

{% 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