6 个版本
0.2.1 | 2021 年 6 月 16 日 |
---|---|
0.2.0 | 2021 年 6 月 14 日 |
0.1.3 | 2021 年 6 月 10 日 |
0.1.2 | 2021 年 5 月 6 日 |
0.1.0 | 2021 年 4 月 23 日 |
#226 in 模板引擎
78KB
990 行
rubble-templates
Rust 中的模板引擎。允许使用变量替换或代码评估将文本模板编译成输出文本。
它能做什么?
它允许使用包含一些占位符的模板,这些占位符将被替换。考虑以下示例
Hello there, {{ name }}!
根据为 name
提供的值,输出可能会有所不同。例如,如果使用 name
的值为 Joe
,则将生成以下输出
Hello there, Joe!
此库评估此类模板并将它们编译成如上所示的输出文本。
用法
要简单地编译模板,可以使用 compile_template_from_file(file: PathBuf, variables: HashMap<String, String>, functions: HashMap<String, Box<dyn Function>>)
。
let file = PathBuf::from("template-file.txt");
let functions: HashMap<String, Box<dyn Function>> = std_functions();
let mut variables: HashMap<String, String> = HashMap::new();
variables.insert("name".to_string(), "Joe".to_string());
let result = compile_template_from_file(file, variables, functions);
assert_eq!(result.ok(), Some("Hello there, Joe!".to_string()));
语法
默认情况下,rubble-templates 在解析模板时,会寻找所有以 {{
开始并以 }}
结束的块,这些块被标记为评估点,其中的代码可以被 Evaluator
评估。
给定以下示例
Hello there, {{ name }}!
此模板包含三个部分
Hello there,
- 纯文本{{ name }}
- 代码!
- 纯文本
第二部分将通过 Compiler
传递给指定的 Evaluator
,以获得字符串输出。代码片段将被替换为输出。
废墟模板库还可以评估更复杂的代码。您可以传递自己的函数来丰富模板。
该库在评估过程中使用类似Lisp的语法。所有函数调用看起来如下所示
function_name arg0 arg1 arg2
要调用plus
函数计算2 + 2的结果,您需要编写以下代码
The result is: {{ plus 2 2 }}
参数也可以通过括号进行分组。在某些情况下这很有用。例如,给定plus
和multiply
函数,您需要使用以下代码来计算(1 + 2) * 3
The result is: {{ multiply (plus 1 2) 3 }}
上述函数是示例函数,并非实际提供的函数。不过,它们可能会在未来的版本中添加。
注意:代码块是通过查找{{
来匹配的,并以第一个出现的}}
结束。要在字符串中使用}}
或"
,请参阅标准函数(例如,std_function
)。
标准函数
一组标准内置函数仍在扩展中。要查看当前的标准函数列表,请参阅rubble-templates文档。
std_fun
模块包含基本的数学和字符串函数。每个函数在文档中都有使用示例。
自定义
编译包含三个阶段
解析
- 由模板迭代器执行,例如EvaluableMixedContentIterator<'a, T>
,可以提取模板部分,评估
- 由Evaluator
执行,评估迭代器找到的所有代码,编译
- 由Compiler
执行,使用迭代器解析内容,然后将内容传递给Evaluator,最后将所有内容合并成输出文本。
您可以实现自己的迭代器、评估器或编译器。要修改编译过程,只需使用自己的特性行实现而不是默认实现即可。
为了展示其工作原理,下面是compile_template_from_string
的实际操作
// parameters
let raw_input = "Hello there, {{ name }}!".to_string();
let variables: HashMap<String, String> = HashMap::new();
let functions: HashMap<String, Box<dyn Function>> = HashMap::new();
// prepare compilation evironment
let template = Template::from(raw_input);
let engine = SimpleEvaluationEngine::from(functions);
let compiler = TemplateCompiler::new(engine);
// compile template
compiler.compile(&template, Context::with_variables(variables))
自定义函数
可以通过使用自定义的Function
特性行实现来扩展评估器。为了使这个过程更容易,rubble-templates-core
中提供了以下结构,可以用于静态函数和lambda表达式
SimpleFunction
- 用于没有副作用地实现简单函数。FunctionWithContext
- 用于Fn(&[String], &mut Context) -> Result<String, SyntaxError>
. 当您需要使用预评估的参数但仍然需要变量时使用此函数。副作用可能导致由 SyntaxError 指示的错误。FunctionWithAst
- 用于Fn(&dyn Evaluator, &[SyntaxNode], &mut Context) -> Result<String, SyntaxError>
. 提供对参数的SyntaxNode
和Evaluator
的完全访问权限。允许评估额外的表达式,操作抽象语法树(AST)或引入领域特定语言(DSL)。
请注意,Context
是一个结构体,它包含可以在函数调用之间共享的变量和状态。您可以使用它来存储一些属性。
有关函数的更多信息,请参阅 rubble-templates-core 文档。
反馈
如果您发现任何错误或想提出建议,请 创建一个问题。
在创建问题时,请附加以下内容
- 事件的简要描述/需要改进的内容,
- 实际输出(如果可能),
- 预期输出,
- 最小可重现示例(代码片段、测试、存储库等,任何证明问题存在的东西)。
依赖关系
~155–435KB