#template #language #safe #user-name #variables #σ

sigma

Σigma σ是一种简单、安全且快速的模板语言

3个不稳定版本

0.1.1 2019年1月14日
0.1.0 2019年1月14日
0.0.0 2019年1月8日

模板引擎中排名第275

每月下载量36
用于cargo-node

MIT许可证

26KB
467

Σigma σ是一种简单、安全且快速的模板语言

Latest version Documentation License

嗨 {{ name }},我是sigma 👋 !

简单

sigma是一种非常简单的模板语言,它只尝试解决一个问题。它也是可扩展的,但理念也很简单(纯函数)。

安全

sigma也是类型化的,这意味着它具有内置验证器来验证您的输入。对于那些想玩耍的人,它也可以是无类型的。此外,它在解析模板时具有良好的错误检查。运行时可能发生的唯一错误是输入数据未能解析为模板中的数据类型。

以下是错误示例

--> 1:49
  |
1 | my username is {{ username: str |> UPPERCASE |> NO_FUN }} WOW!
  |                                                 ^----^
  |
  = undefined function: NO_FUN

如果你在模板中忘记绑定某些变量怎么办?

 --> 1:19
  |
1 | my username is {{ username: str |> UPPERCASE |> NO_FUN }} WOW!
  |                   ^------^
  |
  = undefined variable: username consider adding a bind for it

你需要额外帮助吗?我们在这里支持你;)

--> 1:35
  |
1 | my username is {{ username: u32 | UPPERCAS }} WOW!
  |                                   ^------^
  |
  = undefined function: UPPERCAS did you mean: UPPERCASE ?
快速

sigma使用pest,底层使用优雅的解析器来编写语法。这意味着它将非常快速地解析您的模板,并且它还使用regex crate来替换模板中的数据。

以下是在旧电脑上(运行英特尔四核q9650处理器和硬盘驱动器(HDD))的基准测试

small_data_1kb_parse: 55.300 us
small_data_10kb_parse: 516.29 us
small_data_50kb_parse: 2.5659 ms
small_data_500kb_parse: 25.467 ms
small_data_1mb_parse: 48.668 ms
---
small_data_1kb_compile: 123.39 us
small_data_10kb_compile: 120.90 us
small_data_50kb_compile: 255.70 us
small_data_500kb_compile: 1.4492 ms
small_data_1mb_compile: 1.1464 ms

示例

以下是如何工作的简单示例

  • 简单
use sigma::Sigma;
let result = Sigma::new("Hello {{ username }}") // using {{ ... }} for the template.
 .bind("username", "someone") // bind the vars with values
 .parse() // you must parse your template first
 .map_err(|e| eprintln!("{}", e))? // for pretty printing the error..
 .compile()?;
assert_eq!("Hello someone", result);
  • 带有可选变量
use sigma::Sigma;
  
let result = Sigma::new("Hello {{ username? }}") // using `?` to tell the parser it maybe `null`.
 .parse()
 .map_err(|e| eprintln!("{}", e))? // for pretty printing the error..
 .compile()?;
assert_eq!("Hello ", result);
  • 关于类型呢?
use sigma::Sigma;
  
let result = Sigma::new("Hello {{ username: str }}") // u8, u32 ? a bool ?.
 .bind("username", "someone")
 .parse()
 .map_err(|e| eprintln!("{}", e))? // for pretty printing the error..
 .compile()?;
assert_eq!("Hello someone", result);
  • 关于函数呢?
use sigma::Sigma;
  
let result = Sigma::new("Hello {{ username: str | UPPERCASE }}") // functions uses the `|` operator or if you love `|>` you can use it too.
 .bind("username", "someone")
 .parse()
 .map_err(|e| eprintln!("{}", e))? // for pretty printing the error..
 .compile()?;
assert_eq!("Hello SOMEONE", result);
  • 喜欢宏吗?
use sigma::sigma;
let username = "someone";
let result = sigma!("Hello {{ username }}", username); // the macro return the result so you can check for compile erros.
assert_eq!("Hello someone", result.unwrap());

贡献

欢迎为这个项目做出贡献,只需打开一个PR。

作者

  • Shady Khalifa - 初始工作

还可以参考参与此项目的贡献者名单。

许可证

本项目采用MIT许可证 - 请参阅LICENSE.md文件以获取详细信息。

依赖项

~4.5–6MB
~112K SLoC