#handlebars #file-path #http-request #json-path #helper #toml #string

handlebars_misc_helpers

为handlebars (rust)提供的一系列辅助函数,用于管理字符串、JSON、YAML、TOML、路径、文件、HTTP请求。

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 模板引擎

Download history 609/week @ 2024-05-02 734/week @ 2024-05-09 364/week @ 2024-05-16 698/week @ 2024-05-23 880/week @ 2024-05-30 550/week @ 2024-06-06 799/week @ 2024-06-13 342/week @ 2024-06-20 286/week @ 2024-06-27 379/week @ 2024-07-04 404/week @ 2024-07-11 302/week @ 2024-07-18 443/week @ 2024-07-25 189/week @ 2024-08-01 200/week @ 2024-08-08 214/week @ 2024-08-15

1,102 每月下载量
15 crates 中使用

CC0 许可证

88KB
2K SLoC

handlebars_misc_helpers

crates license crate version Documentation

Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. Actions Status test coverage

为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

参见Handlebars模板语言

为了不“导入”无用的依赖项,请使用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"
  • x86
  • x86_64
  • arm
  • aarch64
  • mips
  • mips64
  • powerpc
  • powerpc64
  • s390x
  • sparc64
"DLL_EXTENSION"
  • so
  • dylib
  • dll
"DLL_PREFIX"
  • lib
  • "" (一个空字符串)
"DLL_SUFFIX"
  • .so
  • .dylib
  • .dll
"EXE_EXTENSION"
  • exe
  • "" (一个空字符串)
"EXE_SUFFIX"
  • .exe
  • .nexe
  • .pexe
  • "" (一个空字符串)
"FAMILY"
  • unix
  • windows
"OS"
  • linux
  • macos
  • ios
  • freebsd
  • dragonfly
  • netbsd
  • openbsd
  • solaris
  • android
  • windows
"USERNAME" 尝试按以下顺序找到当前用户名
  1. 环境变量 "USERNAME"
  2. 环境变量 "username"
  3. 环境变量 "USER"
  4. 环境变量 "user"

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

{{#from_json format="toml"}}
{"foo": {"hello":"1.2.3", "bar":{"baz":true} } }
{{/from_json}}
[foo]
hello = "1.2.3"

foo.bar baz = true

{{#to_json format="toml"}}
[foo]
bar = { baz = true }
hello = "1.2.3"
{{/to_json}}
{
  "foo": {
    "bar": {
      "baz": true
    },
    "hello": "1.2.3"
  }
}
{{#from_json format="yaml"}}
{"foo":{"bar":{"baz":true}}}
{{/from_json}}
foo:
  bar:
    baz: true
{{#to_json format="yaml"}}
foo:
    bar:
        baz: true
{{/to_json}}
{
  "foo": {
    "bar": {
      "baz": true
    }
  }
}

注意:YAML & TOML内容用作json数据的输入和输出格式。因此,功能仅限于json支持的范围内(例如,没有TOML中的日期时间类型)。

通过jsonnet进行版本控制

对于更高级的json版本,您可以使用jsonnet。

A数据模板语言,适用于应用程序和工具开发者

  • 有关更多示例、语法信息等,请参阅jsonnet文档。
  • 此块可以与YAML & TOML的转换辅助工具/块结合使用,为这些格式提供编辑功能
  • 输出应为有效的json,除非将string_output = false设置为块的参数。
{{#jsonnet}}
local v = {"foo":{"bar":{"baz":false}}};
v {
  "foo" +: {
      "bar" +: {
          "baz2": true
      }
  }
}
{{/jsonnet}}
{
  "foo": {
      "bar": {
          "baz": false,
          "baz2": true
      }
  }
}

赋值、设置

辅助工具可以将(设置)变量分配给稍后用于模板。

⚠️ 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