跳至主要內容

模板语法

技术中心大约 4 分钟

模板语法

语法格式

在文档中任意位置采用 +++ 包裹,即可将其视为模板语法。其中可支持变量或命令。

支持的命令

INS (=, 或者什么都不写)

插入一个代码片段的结果

+++INS project.name+++ (+++INS project.details.year+++)
or...
+++INS `${project.name} (${$details.year})`+++

INS 命令支持多行,并且会将其结果进行整体替换:

+++INS
const a = Math.random();
const b = Math.round((a - 0.5) * 20);
`A number between -10 and 10: ${b}.`
+++

您也可以使用缩写:

+++= project.name+++ (+++= project.details.year+++)
+++= `${project.name} (${$details.year})`+++

在该命令语法中,也支持访问提供的预置函数返回的结果。如果返回的是Promise,则会等待Promise完成后再插入。

使用三元表达式实现_if-else_结构:

+++= $details.year != null ? `(${$details.year})` : ''+++

EXEC (!)

执行提供的javascript代码片段,和INS=一样,只是不插入任何东西到文档中。你可以使用EXEC来定义函数或常量:

+++EXEC
myFun = () => Math.random();
MY_CONSTANT = 3;
+++

+++! ANOTHER_CONSTANT = 5; +++

然后在模板中使用它们:

+++= MY_CONSTANT +++
+++= ANOTHER_CONSTANT +++
+++= myFun() +++


### `IMAGE`

插入一个图像,它可根据javascript代码执行结果插入图像

::: info 提示
您可以通过在模板中居中`IMAGE`命令来使图像居中。
:::

+++IMAGE { width: 6, height: 6, data: 'image base64', extension: '.gif' }+++


也支持函数返回

+++IMAGE echarts(options)+++

该命令可配合预置函数使用,可动态生成图片。


### `LINK`

包含一个超链接:`label`是显示的文字,`url`是超链接的地址

+++LINK ({ url: project.url, label: project.nameopen in new window })+++


如果没有指定 `label`, URL将作为显示的文字。


### `HTML`

Takes the HTML resulting from evaluating a JavaScript snippet and converts it to Word contents.

**Important:** This uses [altchunk](https://blogs.msdn.microsoft.com/ericwhite/2008/10/26/how-to-use-altchunk-for-document-assembly/), which is only supported in Microsoft Word, and not in e.g. LibreOffice or Google Docs.

+++HTML `

${$film.title}

${$film.releaseDate.slice(0, 4)}

This paragraph should be red and strong

`+++ ```

FOR and END-FOR

循环一个集合的元素

+++FOR person IN project.people+++
+++INS $person.name+++ (since +++INS $person.since+++)
+++END-FOR person+++

注意

在循环内部,定义的当前元素变量,在引用时必须以 $ 开头。

变量$idx可以获取当前循环的索引,从0开始。

+++FOR company IN companies+++
Company (+++$idx+++): +++INS $company.name+++
Executives:
+++FOR executive IN $company.executives+++
-	+++$idx+++ +++$executive+++
+++END-FOR executive+++
+++END-FOR company+++

循环域的数据集也支持动态过滤:

+++FOR person IN project.people.filter(person => person.since > 2013)+++
...

FOR 也支持在表格行中使用:

----------------------------------------------------------
| Name                         | Since                   |
----------------------------------------------------------
| +++FOR person IN             |                         |
| project.people+++            |                         |
----------------------------------------------------------
| +++INS $person.name+++       | +++INS $person.since+++ |
----------------------------------------------------------
| +++END-FOR person+++         |                         |
----------------------------------------------------------

最后,FOR支持嵌套使用,比如这种复杂的数据集场景:

+++FOR company IN companies+++
+++INS $company.name+++
+++FOR person IN $company.people+++
* +++INS $person.firstName+++
+++FOR project IN $person.projects+++
    - +++INS $project.name+++
+++END-FOR project+++
+++END-FOR person+++

+++END-FOR company+++

IF and END-IF

有条件地包含内容(取决于对 JavaScript 表达式的结果):

+++IF person.name === 'Guillermo'+++
+++= person.fullName +++
+++END-IF+++

FOR 一样, 它也可以用于表格行。你可以嵌套IF语句,以及混合IFFOR命令。事实上,技术来说,IF命令是通过FOR命令实现的,只是其迭代次数根据判定结果来决定是1次还是0次。

ALIAS

为一个完整的命令定义一个别名(特别有用,尤其是复杂的表格):

注意

定义别名后,访问其值需要使用 *作为前缀。例如,*name 访问 name 别名的值。

+++ALIAS name INS $person.name+++
+++ALIAS since INS $person.since+++

----------------------------------------------------------
| Name                         | Since                   |
----------------------------------------------------------
| +++FOR person IN             |                         |
| project.people+++            |                         |
----------------------------------------------------------
| +++*name+++                  | +++*since+++            |
----------------------------------------------------------
| +++END-FOR person+++         |                         |
----------------------------------------------------------

预置变量

doc

文档或模板记录信息。

  • 文档
    • id 主键
    • name 名称
    • create_time 时间戳
  • 模板
    • id 主键
    • name 名称
    • code 模板代码
    • create_time 时间戳
+++ doc.name +++
+++INS doc.name +++
+++=doc.name +++

env

环境变量信息,对应创建模板时录入的变量信息

+++ env.key1 +++
+++INS env.key1 +++
+++=env.key1 +++

预置函数

ds

调用数据集接口。此接口为异步,返回Promise对象。

  • 参数列表

    • name 数据集路径,如 /test则为test
    • params 接口参数,可选
  • 返回值

    • data 数据集数据
    • total 数据集总数
// 直接查询调用
+++ ds('test', { page: 1, size: 10 }).then(r => r.name) +++

// for循环用法
+++ FOR item IN ds('test', { page: 1, size: 10 }).then(r => r) +++

echarts

生成echart图表图片文件,需配合IMAGE使用

  • 参数列表

    • option echart图表配置
    • width 图片宽度,单位cm
    • height 图片高度,单位cm
  • 返回值

    • 图片对象
// 同步调用
+++IMAGE echarts({width: 2, height: 2, option})

// 异步调用
+++IMAGE ds('/get_echarts').then(r => echarts(r))+++

dayformat

格式化时间工具函数

  • 参数列表

  • 返回值

    • 格式化后的时间字符串
+++ dayformat(1577836800000, 'YYYY-MM-DD') +++

spacew

固定字宽函数,用于控制文字对齐。例如:

王 麻 子
李    四
  • 参数列表

    • text 原内容
    • width 固定字数
  • 返回值

    • 格式化后的内容
+++ spacew('王麻子', 5) +++
+++ spacew('李四', 5) +++

说明

字数按中文字符计算,一个中文字符占两个宽度,一个英文一个宽度。如果存在因为字符会在后补充一个空格占位