数据库模板列简单使用指南

本贴最后更新于 337 天前,其中的信息可能已经物是人非

1.模板语法

引用其他列参数

直接使用 .列名称 就可以引用数据库其他列作为参数

.action{.列名称}

注释语法

.action{/* 这是一条注释 */}

变量声明与赋值

.action{$var := xxx}   是声明变量
.action{$var = yyy}   是给变量重新赋值
.action{$var}             是输出

流程控制-判断

支持 if 条件判断,当前支持最简单的 bool 类型和 string 类型,定义如下所示。

.action{if .condition1}
    .action{/* 操作一 */}
.action{else if .condition2}
    .action{/* 操作二 */}
.action{end}

流程控制-循环

支持 range 循环来遍历 map、slice 中的内容,语法格式如下所示。

.action{range $index, $value := .slice}
    .action{$value}
.aciton{end}

在这个 range 循环内,遍历数据通过$index 和$value。还有一种遍历方式,语法格式如下所示。

.action{range .slice}
    .action{.}
.aciton{end}

这种方式无法访问到$index 和$key 的值,需要通过{{.}}来访问对应的$value。那么在这样情况下,在循环体内,外部变量需要使用{{$.}}来访问。

{{break}}
 最里面的 {{range pipeline}} 循环提前结束,停止当前迭代并绕过所有剩余迭代。
 
{{continue}}
 最里面的 {{range pipeline}} 循环的跳过当前迭代

逻辑运算

函数语法 函数作用
.action{if not .condition} .action{end} not 非
.action{if and .condition1 .condition2} .action{end} and 与
.action{if or .condition1 .condition2} .action{end} or 或
.action{if eq .var1 .var2} .action{end} eq 等于
.action{if ne .var1 .var2} .action{end} ne 不等于
.action{if lt .var1 .var2} .action{end} lt 小于
.action{if le .var1 .var2} .action{end} le 小于等于
.action{if gt .var1 .var2} .action{end} gt 大于
.action{if ge .var1 .var2} .action{end} ge 大于等于

定义局部变量

用法 1:

{{with pipeline}} T1 {{end}}

管道的值将赋给该标签内部的“.”。(注:这里的“内部”一词是指被{{with pipeline}}…{{end}}包围起来的部分,即 T1 所在位置)

用法 2:

{{with pipeline}} T1 {{else}} T0 {{end}}

如果管道的值为空,“.”不受影响并且执行 T0,否则,将管道的值赋给“.”并且执行 T1。

说明:{{end}}标签是 if、with、range 的结束标签。

内置函数

sprig 函数

sprig 函数介绍

预定义函数

and
    函数返回它的第一个empty参数或者最后一个参数;
    就是说"and x y"等价于"if x then y else x";所有参数都会执行;
or
    返回第一个非empty参数或者最后一个参数;
    亦即"or x y"等价于"if x then x else y";所有参数都会执行;
not
    返回它的单个参数的布尔值的否定
len
    返回它的参数的整数类型长度
index
    执行结果为第一个参数以剩下的参数为索引/键指向的值;
    如"index x 1 2 3"返回x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print
    即fmt.Sprint
printf
    即fmt.Sprintf
println
    即fmt.Sprintln

比较函数

布尔函数会将任何类型的零值视为假,其余视为真。

下面是定义为函数的二元比较运算的集合:

    eq      如果arg1 == arg2则返回真
    ne      如果arg1 != arg2则返回真
    lt      如果arg1 < arg2则返回真
    le      如果arg1 <= arg2则返回真
    gt      如果arg1 > arg2则返回真
    ge      如果arg1 >= arg2则返回真

为了简化多参数相等检测,eq(只有 eq)可以接受 2 个或更多个参数,它会将第一个参数和其余参数依次比较,返回下式的结果:

    {{eq arg1 arg2 arg3}}

比较函数只适用于基本类型(或重定义的基本类型,如”type Celsius float32”)。但是,整数和浮点数不能互相比较。

管道

管道是链接起来的参数、函数或者方法序列,和 Unix 管道一样:

.action{p1 | p2 | p3}

管道允许我们将上一个输出作为参数传递到下一个指令(放在最后),不同元素之间通过 | 分隔。

示例,下面代码相当于 c/(a+b)

.action{.a | addf .b | divf .c}

2.示例

一些简单案例

.action{div (len .星级) 3}

.action{typeOf .最后联系日期}

.action{.最后联系日期 | toDate "2006-01-02" | typeOf}

.action{$lastday := .最后联系日期 | toDate "2006-01-02"}

获取 最后联系日期今天 的天数(整数)

.action{div (now.Sub .最后联系日期).Hours 24}

获取 最后联系日期今天 的天数(小数)

.action{divf (now.Sub .最后联系日期).Hours 24}

获取自定义属性 attr1 的值

参见官方案例

.action{ index ."custom-attr1" }

使用 if 判断

.action{$days := 0}
.action{if empty .最后联系日期}
    .action{$baseDate :=  toDate "2006-01-02" "2023-01-01"}
    .action{$days = divf (now.Sub $baseDate).Hours 24}
.action{else}
    .action{$days = divf (now.Sub .最后联系日期).Hours 24}
.action{end}
.action{$days}

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22337 引用 • 89380 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1792 回帖
  • 经验
    25 引用 • 157 回帖
1 操作
lovelife88 在 2023-12-20 11:56:08 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 👍

  • ethanyang

    请教一下:

    .action{.列名称},是在数据库中生效的对吧,如果我想在文档中,找到某个数据库,读取某个值,应该如何做?

    反过来,如果我想读取某个块的内容,作为数据库的值应该如何做?

    如果这两个可以实现,可玩的花样就太多了。

    @lovelife88 @88250

    1 回复
  • 88250

    目前的模板片段功能实现不了;插件调用内核 API 的话可以实现。

    1 回复
  • ethanyang

    好吧,建议支持。。。。。

    你看 pyjupter 为啥方便,就是因为可以交互的执行 python 代码,展示结果。

    如果可以可以把数据库和文档内容可以相互读取,这个方向貌似应该是没有问题。

    1 回复
  • 88250

    期待下相关插件吧。

  • Kurigohan 1 评论

    您好,想请教一下:

    哪里能看到数据库中所有支持的语法与函数文档?

    目前支持选择同个数据库中其他行的数据吗,比如做个账本,用上一行的余额和这一行的金额计算得到这一行的余额并准备给下一行调用。这个功能在同类笔记软件中均无法实现(至少我没找到合适的模板)

    非常感谢解答!

    1 回复
    目前还没找到可以选择其他行的函数
    lovelife88
  • Kurigohan

    @lovelife88 @88250

    恳请各位大佬空余时回答下,非常感谢

  • treason2840 1 评论

    .action{$var := xxx} 是声明变量,请问能否赋值字符串或者数字呢?

    我想要一个变量 .action{$var := "some string"},试了试一直报错 undefined variable

    应该可以。我试了没问题。.action{$level := "abc"} .action{$level}
    lovelife88
  • 你好,想问一下,range 方法是怎么使用的, 比如:”foo,bar,baz“,以逗号分割的数量。

    range 方法一直没法成功运行。

    
    .action{$a := split "," "foo$bar$baz"}
    .action{$ok := 0}
    .action{range $index, $value := $a}
        .action{$ok := $ok+1}
    .aciton{end}
    
    1 回复
  • 可以参加以下代码。

    记得一点,模板语法里面没有加减号,需要用函数代替。另外“:=”是声明,计算要用“=”。.action 别拼写错了。

    .action{$a := split "," "foo,bar,baz"}
    .action{$ok := 0}
    .action{range $index, $value := $a}
        .action{$ok = add $ok 1}
        .action{$index}
    .action{end}
    .action{$ok}
    
  • 为什么不搞个公式列呢?这叫普通的用户如何入门?

    1 回复
  • 缺开发啊,现在的模板都只能是用现成的库。

    思源笔记某些地方还是有点极客的

请输入回帖内容 ...