#编译 #评估 #评估 #变量 #函数 #输出

rubble-templates

一种将文本模板编译成输出文本并评估代码的模板引擎

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 模板引擎

MIT 许可证

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 }}

参数也可以通过括号进行分组。在某些情况下这很有用。例如,给定plusmultiply函数,您需要使用以下代码来计算(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>. 提供对参数的 SyntaxNodeEvaluator 的完全访问权限。允许评估额外的表达式,操作抽象语法树(AST)或引入领域特定语言(DSL)。

请注意,Context 是一个结构体,它包含可以在函数调用之间共享的变量和状态。您可以使用它来存储一些属性。

有关函数的更多信息,请参阅 rubble-templates-core 文档

反馈

如果您发现任何错误或想提出建议,请 创建一个问题

在创建问题时,请附加以下内容

  • 事件的简要描述/需要改进的内容,
  • 实际输出(如果可能),
  • 预期输出,
  • 最小可重现示例(代码片段、测试、存储库等,任何证明问题存在的东西)。

依赖关系

~155–435KB