3 个不稳定版本

0.2.0 2023年9月28日
0.1.2 2023年8月10日
0.1.0 2023年7月3日

#519 in 过程宏


用于 2 个包(通过 stilts-macros

MIT 许可证

63KB
1.5K SLoC

Stilts

Documentation Package

Stilts 是一种受 Askama 启发的模板语言。这意味着它具备Rust编译器提供的所有类型安全性。它仍然与 Jinja 有一定的关联,但它采用了更类似Rust的表达式语法。

这个项目还处于非常早期阶段,我只是因为喜欢Askama并觉得模板表达式可以采用更多Rust特定的语法而开始它。如果您有任何建议、功能、问题或其他任何内容,请随时提交问题。我特别需要帮助编写单元测试,并且愿意与其他人合作完成这项工作。

指南

查看书籍以获取深入文档。

工作原理

Stilts 使用结构上的过程派生宏来生成模板渲染代码,这使得模板代码在Rust编译器中进行正确性检查。

快速示例

以下是定义模板的Rust代码示例

use stilts::Template;

#[derive(Template)] // This derive macro will generate the template rendering code
#[stilts(path = "index.html")] // based on the contents of the given template path
struct IndexPage<'a> {
    some_data: &'a str, // The fields on a struct are the variables 
}                       // you want to use in your template

以下是index.html可能的样子

<!DOCTYPE html>
<html>
    <body>
        <h1>My Index Page</h1>
        {% some_data %} <!--This will print some_data to the template here using 
                            the types implementaion of the Display trait-->
    </body>
</html

关于Stilts表达式

在Stilts中,表达式由两种变体组成:singleblock 表达式。单个表达式是任何在定界符 {%%} 内部的代码。而块表达式有一个开头的单个表达式和一个带有某种内容之间的结尾单个表达式。例如

{% for i in 0..10 %}
    This will be repeated 10 times
    {% i %}
    And I can put other expressions inside
{% end %}

如果你之前使用过Askama或Jinja,你可能会注意到,通常要渲染某个值,你必须使用一组不同的定界符,比如这样:{{ some_data }}。但在这里,Stilts只有一个定界符集:{% some_data %}

那么我们如何确定用户是想渲染某个内容还是仅仅编写一些代码呢?答案是,通过确定定界符内的Rust代码是表达式还是语句。在Rust中,表达式总是会产生一个值,而语句则不会。

因此,如果我们作为用户想要编写代码但不将其渲染到模板中,我们只需要添加一个分号。现在{% some_data; %}是一个语句而不是表达式,这意味着Stilts会将其作为代码插入到模板渲染代码中,而不是将其渲染到最终的模板中。这对许多Rust开发者来说很熟悉,因为这是我们在函数内部省略return关键字的方式,只需以表达式结束即可。

这也意味着你可以在定界符内放置任何任意的Rust表达式或语句。例如:{% let myval = some_data.split(' ').filter(|s| s != "abcd"); %}。但你不仅限于单行,也可以将它们分成任意多的行。

{% fn my_useful_func() {
    // do some stuff
} %}

特性

  • 语法与Jinja类似,但也更紧密地与Rust绑定
  • 利用Rust的类型系统来验证你的代码
  • 性能与Askama相当,后者已经非常好了
  • 良好的错误消息和格式化,特别是带有可选的复杂功能
  • 在稳定的Rust上工作

支持的模板构造

  • 继承
  • for循环
  • if/else if/else
  • match表达式
  • includes语句
  • 变量(由于允许任意Rust表达式和语句,因此产生)
  • 导入到作用域的有用扩展特性
  • 可配置的HTML转义

目标

  • 创建一个模板语言,该语言对Jinja用户和Rust开发者来说都很熟悉
  • 拥有良好的错误报告和消息,以及有用的错误位置。

其他事项

在工具目录中有一个正在开发中的tree-sitter解析器实现。如果你知道如何更好地使它工作,那将非常酷。


lib.rs:

Stilts-Lang 是 stilts 的解析器/语言定义。要解析完整的 stilts 模板,请查看 Root 解析器。

依赖关系

约 1–1.5MB
约 25K SLoC