模板语法
模板语法
语法格式
在文档中任意位置采用 +++
包裹,即可将其视为模板语法。其中可支持变量或命令。
支持的命令
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.name })+++
如果没有指定 `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
语句,以及混合IF
和FOR
命令。事实上,技术来说,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
图片宽度,单位cmheight
图片高度,单位cm
返回值
- 图片对象
// 同步调用
+++IMAGE echarts({width: 2, height: 2, option})
// 异步调用
+++IMAGE ds('/get_echarts').then(r => echarts(r))+++
dayformat
格式化时间工具函数
参数列表
date
时间戳、时间字符串或js Date对象fmt
格式化字符串,如YYYY-MM-DD
,配置见 dayjs format
返回值
- 格式化后的时间字符串
+++ dayformat(1577836800000, 'YYYY-MM-DD') +++
spacew
固定字宽函数,用于控制文字对齐。例如:
王 麻 子
李 四
参数列表
text
原内容width
固定字数
返回值
- 格式化后的内容
+++ spacew('王麻子', 5) +++
+++ spacew('李四', 5) +++
说明
字数按中文字符计算,一个中文字符占两个宽度,一个英文一个宽度。如果存在因为字符会在后补充一个空格占位