SiYuan 模板基础教程

本贴最后更新于 1212 天前,其中的信息可能已经水流花落

SiYuanNote 模板

编写于 1.2.1 版本

最后修改日期 : 2021 年 7 月 28 日

SiYuan 群中,一直有群友提起模板相关的问题,而帮助文档中的描述又过于粗糙.因此总结了一些在写模板过程中的一些基础知识. 本人水平有限,如有错误和描述粗糙之处,还请多多包涵.

此外,如果你是文科生,没有学过 C 语言,没有任何编程基础,那么真的不建议在模板上花费太多时间. 能够使用一些基础的样式就足够了.可以留下自己的一些构想,编写模板其实缺少的是构思和想法. 有编程基础的群友说不定会抽空把它实现出来.

思源模板主要涉及三个部分

  • Markdwon 语法
  • SQL 查询
  • go 模板语法

Markdown 语法

基础语法

kramdown 内联属性

  • style
    • color 颜色
    • background-color 背景颜色
    • width 宽度
    • flex
    • text-align
  • flod 是否折叠 1 为折叠
  • 属性
    • alias 别名
    • name 命名
    • memo 备注
  • 超级快布局(在后面的示例中展示)

没有直接测试过,但是 html 里能放在 style 中的应该都能放在思源模板中.

TODO :而自定义的属性如何直接在模板中设置

示例

字体颜色和背景颜色
{: style="color: var(--b3-font-color1); background-color: var(--b3-font-background1);"}

居中
{: style="text-align: center;"}

- 折叠
	- 1
	- 2
	- 3
{: fold="1"}

设置属性
{: alias = TestAlias" name="TestName" memo="TestMemo"}

超级块布局
{{{col

{{{ 
第一列
}}}

{{{
第二列
}}}

}}}
思源内置的颜色

image.png

image.png

SQL 查询

基础内容

.action{$blocks :=queryBlocks 
	"SELECT * FROM blocks WHERE 
		content LIKE '?' AND 
		updated > '?' LIMIT ?" 
	"%foo%" $today "3"}

学习到何种程度? 帮助文档中的这一句话能看懂就 OK.

  • $blocks 即将最后的查询出的结果(可理解为一张表)存入 该变量中 , 具体内容详见帮助文档中的 数据库表.
  • 思源目前只能将 blocks 表作为最后的返回结果,且 选中的列必须是全部的列, 即 *
  • queryBlocks 获取的结果一般用于在之后遍历,读取或输出特定的值
  • 访问 $blocks 的属性
    • $blocks.ID 两个字母都需要大写
    • $blocks.Path 其余属性只需要首字母大写即可

感谢思源让我巩固了 SQL 知识trollface

常用的技巧

  • LIKE 和 =

    • = 表示搜索结果必须于给出的一模一样
    • LIKE 配合 通配符 使用,即模糊搜索
  • ? 表示占位符 , 上例中,按照顺序依次代表后面的 "%foo%" $today "3"

  • LIMIT 限制查询结果的数目,如果没有设置会默认遵守 思源设置的搜索数目限制

    • 对于一些特殊的模板,比如生成 文件列表的双链, 数量比较多,但是不需要通过 SQL 将其展示出来,可以直接将 LIMITE 设置为一个很大的数字或者设置为-1 (Clouder 和我说的,俺没试过)
  • 数据处理函数

golang 模板语法

默认的 golang 语法是 {{ 要执行的操作 }} 而思源中则是 .action{要执行的操作} 所以网络上查找到的资料按照这个逻辑替换即可.

基础语法

  • 设置变量

    • := 该符号的意思是,初始化一个变量 ,并且赋值
    • = 该符号的则是对一个已经初始化了的变量进行赋值
  • 注释

    • .action{/*这是注释*/}
  • 逻辑控制

    • 循环和判断
  • 函数调用(这个不用管)

  • 模板的嵌套 TODO

  • 判断语句中的逻辑控制函数

    • not 非
    • and 与
    • or 或
    • eq 等于
    • ne 不等于
    • lt 小于 (less than)
    • le 小于等于
    • gt 大于
    • ge 大于等于

Sprig 函数 TODO

思源中封装了该项目的函数,可以直接使用,打开该网站需要科学上网. 后续可能看情况补充一些常用的函数.

  • 和 String 相关的函数

    • regexFind
      • regexFind "[a-zA-Z][1-9]" "abcd1234"
        • 通过正则匹配获取想要的字符串, 先写匹配模式,后写字符串
    • TODO
  • 和 StringList 相关的函数

    • list
      • list 1 2 3
        • 返回一个 字符串数组 [1 2 3]
    • join
      • list "hello" "world" | join "_"
      • 合并字符串数组中的字符串,返回字符串 hello_world
    • TODO
  • 和 List 相关的函数

    • has
      • has 4 $myList
      • 如果 $mylist 中包含有 4,则返回 true
    • append
      • $new = append $myList 6
      • 将 6 放入 $myList 中.

示例

逻辑控制的示例代码会添加到 Organized/getFiles 模板中

.action{/*初始化变量*/}
.action{$var:=1}
.action{/*变量赋值*/}
.action{$var=1}
.action{/*输出变量值*/}
.action{$var}

.action{/*下面是一个使用range和 if 的小例子*/}

.action{/*获取所有文件夹路径*/}
.action{$filePathList:= list $dirPath}
.action{range $index, $v:=$block}

	.action{$filePath = (regexFind  $regexDirPath  $v.Path )}

	.action{if not (has  $filePath $filePathList)}
		.action{$filePathList = append  $filePathList $filePath}
	.action{end}
	.action{$numOfSearch = $index}
.action{end}

  • $dirPath 是一个定义好的字符串,表示文件所在的路径
  • $filePathList 是一个用于存放表示路径的字符串的数组
  • 遍历获取的 SQL 查询结果
    • 获取的 Path 属性去除掉文件名,只保留所在的文件夹的路径
    • 如果该路径不存在于 $filePathList 中,则将其放入该 list
      • 此处使用的是 =
    • $numOfSearch 用于记录 $idnex 的值, index 每次循环会自动加一
  • 思源笔记

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

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

    22346 引用 • 89415 回帖 • 1 关注
1 操作
crowds21 在 2021-07-28 23:18:34 更新了该帖

相关帖子

欢迎来到这里!

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

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

    golang 模板语法参考资料 spring 篇的举例有个小问题:
    round 123.555555 will return 123.556
    应该是 round 123.555555 3 will return 123.556

    后边少了个 3

    image.png

  • 其他回帖
  • z805188416 1 评论

    虽然时间隔得略久但还是回帖感谢一下楼主——!几个教程真的救小白的命,这下可以直接照着学习真的方便多了~

    能帮到大家就好啦 🎉
    crowds21
  • 模板设置属性是有问题,稍后排查,谢谢。

  • 大佬你好,请问下思源可以利用模板同时创建多个文档吗?比如我想同时创建一个周计划和周总结,周计划和周总结都有自己的模板。

    1 回复
  • 查看全部回帖