gooconverter

1.1.0 • Public • Published

模板替换

安装

npm install gooconverter

替换

主要有以下五类模板替换:

表达式替换

计算表达式,并在所在位置替换成结果。

可以在表达式中使用JS语法的变量、字面量、运算符、方法。注意,字面量和运算符有限制,见附录。

{{表达式}}

其中,{{称为首替换符,}}称为尾替换符。

在表达式中还可以使用转换器的内置函数:

  • range(start, end, step) 产生一个递增或递减的生成器对象,从 start 开始,小于end,步长为 step。
  • stepper(start, step) 产生一个递增或递减的步进器,s.next() 步进到下一个值并返回, s.value 为当前值。

非整数时,请注意输出为浮点数,建议输出时用 toFixed(n) 进行格式化。

赋值:

建立一个新变量,并赋值表达式的值。赋值不会产生替换,可以在后继替换中使用新建变量。 {{varname = 表达式}}

条件替换

根据条件决定是否显示对应结果,elseif else 是可选的,elseif 可以有多个。

  1. {{if 条件1}} 输出1 {{endif}}
  2. {{if 条件1}} 输出1 {{else}}其它输出 {{endif}}
  3. {{if 条件1}} 输出1 {{elseif 条件2}} 输出2 {{else}} 其它输出 {{endif}}

循环替换

  • {{for value in object}} 内容:{{value}} {{endfor}} 循环输出,遍历object的所有自身属性值(不是属性键值)。
  • {{for key, value in Object}} 键值:{{key}}, 属性值:{{value}} {{endfor}} 同时遍历键和值,当object为Array时,键值为数字。

注释

在任何模板语法中,都可以用 // 注释文本 用于注释,不产生输出,// 与该模板尾替换符之间的任何文字都视为注释。

扩展替换符

除了常规的首替换符{{和尾替换符}}外,还有一些可以影响到替换符外部文字的扩展替换符。

使用扩展替换符,主要是为了在视觉上方便查看替换结构。可以参看 example/example.js 示例。

左侧空白移除替换符

为了方便书写模板,可以使用 {{_ 消除替换符左侧的空白, 不会输出到正文中。也可以认为 {{_ 左侧的所有空白会视为替换符的一部分。

比如 {{_code}} 等价于 {{code}}

右侧空白移除替换符

为了方便书写模板,可以使用 _}} 消除替换符右侧的所有空白,不会输出到正文中。也可以认为 _}} 右侧的所有空白会视为替换符的一部分。

比如 {{code_}} 等价于 {{code}}

右侧换行移除替换符

使用 }}_ 会移除本行的换行。换行与替换符之间不能有其它字符,否则只有 }} 起作用,_ 会输出至正文中。

如果下一行也是空行,也会移除,一真循环到非换行符。

例子:

1{{ }}_    这一行会与普通模板尾替换符效果一样,因为没有遇到可以移除的换行符
2{{ }}_
    这一行前的空白会尾随在上一行末输出正文中,即不保留上一替换符行的换行符
3{{ }}_


    这一行会尾随在3后输出正文中,上3行空白行的换行符会被移除

最终的输出为:

1_    这一行会与普通模板尾替换符效果一样,因为没有遇到可以移除的换行符
2    这一行前的空白会尾随在上一行末输出正文中,即不保留上一替换符行的换行符
3    这一行会尾随在3后输出正文中,上3行空白行的换行符会被移除

扩展替换符歧义与转义

  • 当尾替换符后必须跟一个 _ 时,可以使用 _}}_ ,这样右侧的 _ 会被正常输出至正文中。
  • 当替换符内部有 _ 做前后缀的变量时,不要与替换符相连,以防识别为扩展替换符。比如 {{ _var1 + var2_ }}
  • {{_}} 是非法的,程序无法判断扩展首替换符还是扩展尾替换符,转换会中止。可以通过模板内加空格进行正确标记。

例子

import {convert} from "gooconverter";
let tags = {
    "name": "GD8",
    "ID": 8078,
    "peoples": [{
        "name": '张三',
        "age": 15,
    }, {
        "name": '李四',
        "age": 22,
    }, {
        "name": '王五',
        "age": 19,
    }, {
        "name": '赵六',
        "age": 29,
    }]
};
let template = `group: {{name}}{{ID = ID-8000 }}{{// 说明:取ID后2位形成编号}}
ID: {{ID}}
people:{{for people in peoples}}_
{{  if people.age > 18}}
- {{people.name}}_
{{  endif}}_
{{endfor}}
`
console.log(convert(tags, template));

则输出:

group: GD8
ID: 78
people:
- 李四
- 王五
- 赵六

如果要应用多条转换规则,用convertRules函数,见 ./example/example.entry.js

附录

字面量

目前支持布尔值、数值、字符串、数组和对象。

受支持的运算符

一元运算符: + - ~ !

二元运算符: in + - * / % == === != !== < > <= >=

三元运算符: ?:

赋值运算符: = += -= *= **= /= %= ??=

成员运算符: obj.prop obj[prop]

序列运算符: ,

逻辑运算符: || && ??

扩展运算符: ...

调用运算符: ()

Readme

Keywords

Package Sidebar

Install

npm i gooconverter

Weekly Downloads

14

Version

1.1.0

License

MIT

Unpacked Size

510 kB

Total Files

6

Last publish

Collaborators

  • goosy