#template #write #path #file #t4 #t4rust

t4rust-derive

t4rust 是一个编译时模板引擎,允许你在模板中编写纯 Rust 代码

4 个版本 (2 个重大更新)

0.3.0 2020 年 10 月 21 日
0.2.0 2020 年 2 月 16 日
0.1.4 2020 年 2 月 15 日
0.1.3 2019 年 3 月 29 日

模板引擎 中排名第 471

Download history 31/week @ 2024-04-07 26/week @ 2024-04-14 28/week @ 2024-04-21 26/week @ 2024-04-28 19/week @ 2024-05-05 22/week @ 2024-05-12 17/week @ 2024-05-19 34/week @ 2024-05-26 22/week @ 2024-06-02 13/week @ 2024-06-09 31/week @ 2024-06-16 25/week @ 2024-06-23 20/week @ 2024-06-30 3/week @ 2024-07-07 40/week @ 2024-07-14 34/week @ 2024-07-21

每月下载量 97
5 Crates 中使用(3 个直接使用)

MIT/Apache

25KB
608 行代码(不包括注释)

t4rust

dependency status

关于

t4rust 是一个简单的模板引擎,灵感来源于 T4 语法。

示例

创建模板的简单示例。

use t4rust_derive::Template;

// Add this attribute to use a template
#[derive(Template)]
// Specify the path to the template file here
#[TemplatePath = "./examples/doc_example1.tt"]
// Add this attribute if you want to get debug parsing information
// This also enables writing temporary files, you might get better error messages.
//#[TemplateDebug]
struct Example {
    // Add fields to the struct you want to use in the template
    name: String,
    food: String,
    num: i32,
}

fn main() {
    // Generate your template by formating it.
    let result = format!("{}", Example { name: "Splamy".into(), food: "Cake".into(), num: 3 });
    println!("{}", result);
}

doc_example1.tt:

Hello From Template!
My Name is: <# write!(_fmt, "{}", self.name)?; #>
I like to eat <#= self.food #>.
<# for num in 0..self.num { #>Num:<#= num + 1 #>
<# } #>

输出

Hello From Template!
My Name is: Splamy
I like to eat Cake.
Num:1
Num:2
Num:3

语法

您可以在代码块中简单地编写 Rust 代码。

代码在 <##> 块中编写。如果您想在模板文本中编写一个 <# 而不开始一个代码块,只需写两次:<#<#。同样的规则也适用于代码块中的 #>。您不需要在代码块中重复编写 <#,也不需要在模板文本块中重复编写 #>

您可以使用 <#= expr #> 来打印单个表达式。

你可能注意到了模板中的神奇变量 _fmt。这个变量让你可以访问格式化器,例如,它允许你在模板中编写函数。<# write!(_fmt, "{}", self.name)?; #> 等于 <#= self.name #>

警告:请确保永远不要创建名为 _fmt 的变量!你将遇到奇怪的编译器错误。

特性

自动转义

在您的 .tt 文件中使用 escape 指令

<#@ escape function="escape_html" #>`

并在您的代码中创建具有此签名的函数

fn escape_html(s: &str) -> String {
    todo!(); /* Your escaping code here */
}

所有表达式块(例如 <#= self.name #>)在插入之前都会调用转义函数。

您可以在模板的任何位置多次重新声明此指令来更改或禁用(使用 function="")转义函数。

许可

在以下任一许可下授权

由您选择。

依赖项

~2.5MB
~52K SLoC