24个版本 (15个重大更新)
0.16.3 | 2024年6月2日 |
---|---|
0.15.0 | 2024年1月10日 |
0.14.0 | 2024年1月10日 |
0.13.0 | 2023年2月12日 |
0.3.0 | 2019年7月28日 |
#18 in 模板引擎
1,102 每月下载量
在 15 crates 中使用
88KB
2K SLoC
handlebars_misc_helpers
为handlebars (rust)提供的一系列辅助函数,用于管理字符串、JSON、YAML、TOML、路径、文件、HTTP请求。
辅助函数扩展了模板,以生成或转换内容。包含的辅助函数不多,但如果你需要更多辅助函数,可以通过问题或PR进行请求。
使用辅助函数
// arguments are space separated
{{ helper_name arguments}}
要链式调用辅助函数,请使用括号
{{ to_upper_case (to_singular "Hello foo-bars") }}
// -> BAR
{{ first_non_empty (unquote (json_str_query "package.edition" (read_to_str "Cargo.toml") format="toml")) (env_var "MY_VERSION") "foo" }}
// -> 2018
为了不“导入”无用的依赖项,请使用crate的特性
default = ["string", "http_attohttpc", "json", "jsonnet", "regex"]
http_attohttpc = ["dep:attohttpc"]
http_reqwest = ["dep:reqwest"]
json = [
"dep:jmespath",
"dep:serde",
"dep:serde_json",
"dep:serde_yaml",
"dep:toml",
]
jsonnet = ["dep:jsonnet-rs"]
jsontype = ["dep:serde_json"]
regex = ["dep:regex"]
string = ["dep:cruet", "dep:enquote", "jsontype"]
字符串转换
辅助函数签名 | 使用示例 | 示例输出 |
---|---|---|
replace s:字符串from:字符串to:字符串 |
replace"Hello old" "old" "new" |
"Hello new" |
to_lower_case s:字符串 |
to_lower_case"Hello foo-bars" |
"hello foo-bars" |
to_upper_case s:字符串 |
to_upper_case"Hello foo-bars" |
"HELLO FOO-BARS" |
to_camel_case s:字符串 |
to_camel_case"Hello foo-bars" |
"helloFooBars" |
to_pascal_case s:字符串 |
to_pascal_case"Hello foo-bars" |
"HelloFooBars" |
to_snake_case s:字符串 |
to_snake_case"Hello foo-bars" |
"hello_foo_bars" |
to_screaming_snake_case s:字符串 |
to_screaming_snake_case"Hello foo-bars" |
"HELLO_FOO_BARS" |
to_kebab_case s:字符串 |
to_kebab_case"Hello foo-bars" |
"hello-foo-bars" |
to_train_case s:字符串 |
to_train_case"Hello foo-bars" |
"Hello-Foo-Bars" |
to_sentence_case s:字符串 |
to_sentence_case"Hello foo-bars" |
"Hello foo"bars |
to_title_case s:字符串 |
to_title_case"Hello foo-bars" |
"Hello Foo Bars" |
to_class_case s:字符串 |
to_class_case"Hello foo-bars" |
"HelloFooBar" |
to_table_case s:字符串 |
to_table_case"Hello foo-bars" |
"hello_foo_bars" |
to_plural s:字符串 |
to_plural"Hello foo-bars" |
"bars" |
to_singular s:字符串 |
to_singular"Hello foo-bars" |
"bar" |
to_foreign_key s:字符串 |
外键"Hello foo-bars" |
"hello_foo_bars_id" |
去模块化 s:字符串 |
去模块化"Test::Foo::Bar" |
"Bar" |
序数化 s:字符串+ |
序数化"9" |
"第9个" |
反序数化 s:字符串+ |
反序数化"第9个" |
"9" |
修剪 s:字符串 |
修剪"foo" |
"foo" |
修剪开头 s:字符串 |
修剪开头"foo" |
"foo" |
修剪结尾 s:字符串 |
修剪结尾"foo" |
"foo" |
取消引号 s:字符串 |
取消引号"\"foo\"" |
"foo" |
引号符号:字符串s:字符串 |
引号"" "foo" |
"\"foo\"" |
第一个非空 s:字符串+ |
第一个非空""空"foo" "bar" |
"foo" |
正则表达式
用法 | 输出 |
---|---|
{{正则表达式匹配模式="(?<first>\\w)(\\w)(?\\w)\\w(?<last>\\w)"on="今天" }} |
true |
{{#如果 (正则表达式匹配模式="(?<first>\\w)(\\w)(?\\w)\\w(?<last>\\w)"on="今天" ) }}ok{{/如果}} |
ok |
{{正则表达式捕获="(?<first>\\w)(\\w)(?\\w)\\w(?<last>\\w)"on="今天" }} |
[对象] |
{{ json_to_str(正则表达式捕获="(?<first>\\w)(\\w)(?\\w)\\w(?<last>\\w)"on="今天" ) }} |
{"_0":"今天","_1":"t","_2":"o","_3":"y","第一个":"t","最后一个":"y"} |
{{设置捕获=(正则表达式捕获="(?<first>\\w)(\\w)(?\\w)\\w(?<last>\\w)"on="今天" ) }}{{捕获.最后一个}} |
y |
UUID
用法 | 输出 |
---|---|
{{uuid_new_v4}} |
6db4d8a7-8117-4b72-9dbc-988e6ee2a6e3 |
{{len(uuid_new_v4) }} |
36 |
{{uuid_new_v7}} |
94d7bb75-9b16-40dd-878d-5fbb37b8ae2c |
{{len(uuid_new_v7) }} |
36 |
HTTP内容
辅助函数能够从 HTTP 请求中渲染响应体。
辅助函数签名 | 使用示例 |
---|---|
http_get url:字符串 |
http_get"http://hello/..." |
gitignore_io 模板:字符串 |
gitignore_io"rust,visualstudiocode" |
路径提取
辅助函数能够提取(或转换)路径(定义为字符串)。
对于相同的输入: "/hello/bar/foo.txt"
helper_name | 示例输出 |
---|---|
文件名 | "foo.txt" |
父目录 | "/hello/bar" |
扩展名 | "txt" |
文件
读取文件内容的辅助函数。
用法 | 输出 |
---|---|
{{read_to_str"/foo/bar" }} |
文件的 /foo/bar 内容 |
{{read_to_str"file/does/not/exist" }} |
空字符串 |
环境变量
辅助函数能够获取环境变量。
helper_name | 用法 |
---|---|
env_var | env_var"HOME" |
特殊环境变量是预定义的(其中一些来自 std::env::consts
- Rust)
变量 | 可能的值 |
---|---|
"ARCH" |
|
"DLL_EXTENSION" |
|
"DLL_PREFIX" |
|
"DLL_SUFFIX" |
|
"EXE_EXTENSION" |
|
"EXE_SUFFIX" |
|
"FAMILY" |
|
"OS" |
|
"USERNAME" |
尝试按以下顺序找到当前用户名
|
JSON & YAML & TOML
辅助函数
json_query query:String data:Json
: 辅助函数能够使用 JMESPath 语法从 json 中提取信息。json_str_query query:String data:String
:一个辅助工具,可以使用JMESPath语法从query
中提取信息,数据遵循请求的format
格式。json_to_str data:Json
:将json数据转换为请求的format
格式的字符串。str_to_json data:String
:将字符串转换为请求的format
格式的json。
可选的请求的format
,是数据的字符串格式
"json"
(默认值,如果省略)"json_pretty"
缩进格式的json..."yaml"
"toml"
"toml_pretty"
用法 | 输出 |
---|---|
{{json_query"foo" {} }} |
`` |
{{json_to_str(json_query"foo" {"foo":{"bar":{"baz":true}}} ) }} |
{"bar":{"baz":true}} |
{{json_to_str(json_query"foo" (str_to_json"{\"foo\":{\"bar\":{\"baz\":true}}}" ) ) }} |
{"bar":{"baz":true}} |
{{json_str_query"foo" "{\"foo\":{\"bar\":{\"baz\":true}}}" }} |
{"bar":{"baz":true}} |
{{json_str_query"foo.bar.baz" "{\"foo\":{\"bar\":{\"baz\":true}}}" }} |
true |
{{json_str_query"foo" "foo\nbar\nbaz: true\n"format="yaml"}} |
bar:\n baz: true\n |
{{json_to_str(str_to_json"{\"foo\":{\"bar\":{\"baz\":true}}}"format="json")format="yaml"}} |
foo:\n bar:\n baz: true\n |
块
|
|
|
|
|
|
|
|
注意:YAML & TOML内容用作json数据的输入和输出格式。因此,功能仅限于json支持的范围内(例如,没有TOML中的日期时间类型)。
通过jsonnet进行版本控制
对于更高级的json版本,您可以使用jsonnet。
A数据模板语言,适用于应用程序和工具开发者
- 有关更多示例、语法信息等,请参阅jsonnet文档。
- 此块可以与YAML & TOML的转换辅助工具/块结合使用,为这些格式提供编辑功能
- 输出应为有效的json,除非将
string_output = false
设置为块的参数。
|
|
赋值、设置
辅助工具可以将(设置)变量分配给稍后用于模板。
⚠️ assign
已弃用,由set
替换(更紧凑,并允许在一个调用中进行多分配)
用法 | 输出 |
---|---|
{{assign"foo" "hello world" }}{{foo}} |
hello world |
{{set foo="{}" }} |
`` |
{{set foo="{}" }}{{foo}} |
{} |
{{set foo="hello world" }}{{foo}} |
hello world |
{{set foo={} }}{{foo}} |
[对象] |
{{set foo={"bar": 33} }}{{foo}} |
[对象] |
{{set foo={"bar": 33} }}{{foo.bar}} |
33 |
{{set foo="world"bar="hello" }}>{{bar}} {{foo}}< |
>helloworld< |
{{set foo="world" }}{{set bar="hello" }}>{{bar}} {{foo}}< |
>helloworld< |
替换部分
辅助工具可以替换由边界分隔的部分。
例如,使用此模板
{{~#replace_section begin="<!-- #region head-->" end="<!-- #endregion head -->" content }}
This is the new content of the block
{{~/replace_section}}
并且content
具有
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- #region head-->
Something by default
<!-- #endregion head -->
</body>
</html>
由<!-- #region head-->
和<!-- #endregion head -->
之间的内容被内部模板的结果替换
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- #region head-->This is the new content of the block<!-- #endregion head -->
</body>
</html>
注意:您可以通过添加remove_boundaries=true
来删除边界。
依赖项
~5–18MB
~250K SLoC