#template #language #html #html-templating

templito

一个模板语言库,允许模板之间传递多个参数

7个版本

0.4.3 2022年4月22日
0.4.2 2022年4月22日
0.2.0 2022年2月8日
0.1.1 2021年12月3日
0.1.0 2020年9月8日

#198 in 模板引擎

Download history 6/week @ 2024-03-08 13/week @ 2024-03-15 3/week @ 2024-03-22 24/week @ 2024-03-29 7/week @ 2024-04-05 1/week @ 2024-04-19

60次每月下载
用于 2 crate

MIT 许可证

130KB
3.5K SLoC

Templito

Siter背后的后端模板语言——一个静态网站生成器。

templito的独特之处

Templito模板在很大程度上类似于handlebars和Go模板,但它们有几个显著特点。

  • 语言
    • 模板的多个参数
    • 可以在块的输出上运行函数
    • 空白字符可以转义
  • Rust
    • 模板函数可以是闭包,因此它们可以附加数据到函数。
    • 模板和函数管理器与模板分离,可以通用地切换。

示例

模板的基本结构

{{let title = "Page"}}\
<h1>{{first $title "Default Title"}}</h1>
{{if .cat}}\
    {{for k v in .cat}}\
        <p>{{$k}} = {{$v}}</p>
    {{/for}}\
{{/if}}\

使用块

{{@md}}
Markdown
============================

Everthing between an '@<func>' and '\func' tags will run the function on the result of the contents.

for example the because this code is within an '@md' block, the contents will be treated as markdown.

(Assuming the md function is included by the FuncManager)

Ranges like this will create a bullet point list of items:

{{for k v in .items}}
* {{$v}} 
{{- /for}}

{{/md}}

实际上任何字符串到字符串的函数都可以用作"@block"。

但它们的功能更强大。

{{@let lines}}
apple
cat
sandwhich
{{/let}}\
{{for k v in split $lines}}
    <p>{{$v}}</p>
{{/for}}

将输出

    <p>apple</p>
    <p>cat</p>
    <p>sandwhich</p>

根据安全情况,您可以选择是否允许"exec"函数。("exec"默认不包含)

{{for k v in split (exec "cat" "path/to/file") "\n"}}
    <p>{{$k}} = {{$v}}</p>
{{/for}}

控制流

  • "let"

    创建变量(在其余文档中使用){{let x=3;y=9;list=["fish","dog"]}}

  • "export"

    导出变量可以作为导出映射返回给调用程序

  • "if"、"elif"和"else"

    控制流,仅在条件满足时解析内容,否则查看elif和else {{if gt $x 3}}{{$x}}{{elif gt $y 3}}{{$y}}{{else}}Something else{{/if}} //输出: 9

  • "return"

    返回一个值而不是主字符串

  • "for"

    遍历列表或值。这需要命名索引和值(例如k和v){{for k v in $list}}list at {{$k}} equals {{$v}};{{/for}}

    //输出: list at 0 equals fish;list at 1 equals dog;

  • "switch"和"case"

    根据与模式匹配的值选择一个选项 {{- switch $list -}} {{- case [_,]}}List with second element {{$b}} {{- case {fish:} }}Map with fish element {{$f}} {{- /switch -}} //输出: List with second element dog

  • "as"

    创建一个单独的switch case

    {{as $list: [_,]}}{{$b}}{{/as}} //输出: dog

  • "define"和"global"

    创建函数作为要运行的变量或添加到函数管理器的全局函数 {{define cat age}}I'm a cat aged {{$age}}{/define}} {{run $cat 55}} //输出: I'm a cat aged 55

  • "@let"和"@export"

    从块的内容中创建一个本地或导出的变量;{{- @let a -}}我喜欢{{for k v in $list}}{{if eq $k 0}}和{{/if}}{{$v}}{{/for}} {{- /let -}} {{$a}} //输出:我喜欢鱼和狗

更新日志

V 0.4.0

关键字 "as" 现在存在,可能会破坏同名的一些先前函数。现在可以使用 {{as val:pattern}}with pattern captures here}}

V 0.2.0

重大变更:函数现在需要一个描述,以便使系统的用户文档更容易。

Funcmanagers 现在也提供/要求一个方法来提供这些描述,以便任何使用该系统的软件都可以打印它们。

依赖项

~21MB
~204K SLoC