Scriban 模板语言
2021年12月12日大约 5 分钟约 1564 字
Scriban 模板语言
目录
- 【翻译】Scriban 是一种快速、强大、安全和轻量级的文本模板语言和.NET 引擎,具有解析 liquid 模板的兼容模式
- 【翻译】 Scriban language( 待完成)
- 【翻译】Scriban runtime( 待完成)
- 原文 Github:https://github.com/lunet-io/scriban#readme
Scriban 是一种快速、强大、安全和轻量级的文本模板语言和.NET 引擎,具有解析liquid
模板的兼容模式
// Parse a scriban template
var template = Template.Parse("Hello {{name}}!");
var result = template.Render(new { Name = "World" }); // => "Hello World!"
使用 Liquid 语言解析 Liquid 模板:
// Parse a liquid template
var template = Template.ParseLiquid("Hello {{name}}!");
var result = template.Render(new { Name = "World" }); // => "Hello World!"
语言非常通用,易于阅读和使用,类似于liquid 模板:
var template = Template.Parse(@"
<ul id='products'>
{{ for product in products }}
<li>
<h2>{{ product.name }}</h2>
Price: {{ product.price }}
{{ product.description | string.truncate 15 }}
</li>
{{ end }}
</ul>
");
var result = template.Render(new { Products = this.ProductList });
注意
默认情况下, .NET 对象的属性和方法会自动以小写和
_
命名,这意味着像MyMethodIsNice
这样的属性将被公开为my_method_is_nice
.这是默认约定,最初是为了匹配liquid
模板的行为。 如果要改变此行为,则需要使用MemberRenamer
委托
特性
- 非常高效,快速 解析器和轻量级的运行时. 对 CPU 和垃圾收集器友好. 查看
- benchmarks获取更多细节.
- 由 Lexer / Parser 提供一个完整的抽象语法树,fast, versatile and robust(快速,通用且强大), 比基于 regex 的解析器更高效
- 错误报告:能提供精确的源代码位置 ,包括(path, column and line)
- 将 AST 写入脚本文本的形式, 使用
Template.ToText
, 可以操作内存中的脚本并将其重新保存到磁盘, 对于 roundtrip(往返)的脚本更新方案是有用的
- 兼容
liquid
模板 可使用Template.ParseLiquid
方法- 虽然
liquid
语言不如scriban
强大, 但该模式从liquid
则更容易地迁移至scriban
- 在 AST to text 模式下,将对模板
Template.ParseLiquid
进行解析,替换成Template.ToText
,即可将liquid
脚本 转换成scriban
脚本 - 由于 liquid 语言没有严格定义 并且它有着不同版本的 liquid 语法,在使用 scriban 的 liquid 模板时会有一些限制, 查看此文档了解详情 liquid support in scriban
- 虽然
- 可扩展的运行时 提供许多扩展点
- 支持
async
/await
的脚本支持 (e.gTemplate.RenderAsync
) - 精确控制空白文本输出
- 完整的语言特性 包括
if
/else
/for
/while
, expressions (x = 1 + 2
), conditions... etc. - 函数调用和管道 (
myvar | string.capitalize
)- 自定义函数 通过
func
语句直接将函数自定义到语言中 通过alias @ directive
可使用function pointers/delegates - 从 runtime API 绑定 .NET 自定义函数,并提供许多与.NET 对象接口的选项 。
- 自定义函数 通过
- Complex objects (复杂对象) (javascript/json like objects
x = {mymember: 1}
) and arrays (e.gx = [1,2,3,4]
) - 通常由
wrap
语句使用可以将 a block of statements (语句块) 传递给函数, - 一些内置函数:
- Multi-line statements 多行语句 不必在每行都使用
{{...}}
- Safe parser and safe runtime, 使您可以控制公开哪些对象和功能
Syntax Coloring(语法着色)
您可以安装 Scriban Extension for Visual Studio Code 获取 scriban 脚本 (without HTML) 和 scriban html 文件的语法颜色提示
文档
- 有关语言语法的说明,请参阅语言文档。
- 内置函数见文档内置函数列表。
- 有关编译和运行模板的.NET 运行时 API 的说明,请参阅运行时文档。
- 有关支持 liquid 模板的更多详细信息,请参阅[Liquid support]文档。
- 请参阅我的博客文章"实现.NET 的文本模板引擎",了解一些幕后细节。
二进制包
兼容以下 .NET framework 版本:
- .NET Framework 3.5
- .NET Framework 4.0
- .NET Framework 4.5+ (supports asynchronous code and timeouts for regular expressions)
- .NET Standard1.1+ (some features are not available)
- .NET Standard1.3+ (which means .NET Core, Xamarin, UWP, Unity etc.)
还有提供签名的 NuGet 包 Scriban.Signed
Benchmarks(基准测试)
Scriban 速度极快! 更多细节, 你可以查看此文档 benchmarks(基准测试) 文档.
License
该软件是在BSD-Clause 2 license协议下发布的
相关项目
- dotliquid: Liquid 模板语言的.NET 端口。
- Fluid .NET liquid 模板引擎
- Nustache: .NET 无逻辑模板(Logic-less templates for .NET)
- Handlebars.Net: .NET port of handlebars.js
在线示例
- https://scribanonline.azurewebsites.net/): ASP.NET Core Sample.
Credits
Adapted logo Puzzle
by Andrew Doane from the Noun Project
作者
Alexandre Mutel aka xoofx.