思源目前的模板集市主要是文件夹并不利于大家分享模板和了解模板的详细使用。在这里我分享一下,前段时间(额,前几个月)摸索的一点关于模板的见解,希望能帮助到不太了解模板的童鞋们。由于最近都没有折腾模板,所以难免有点错误,欢迎大家指正。也欢迎大家提出自己的见解和分享有意思的模板。
首先,思源的模板目前暂不支持在内部直接编辑,需要在 工作空间/data/template 文件夹内新建 markdown 文件来编辑,目前编辑模板确实不方便,要实现一些复杂的样式比较麻烦,希望早日能直接在思源创建和管理模板 o( ̄▽ ̄ )ブ。集市中可以下载大佬分享的模板并使用。
模板的使用:在编辑器内输入斜杠/,第一个按钮就是 template,进入即可选择模板。
接下来将介绍个人对模板的使用理解,并分享个人目前常用的模板
模板变量
这部分基本 copy 自「官方帮助指南」,稍微看一下就好啦。
复杂的模板函数文档可见:sprig,最常用的大概是关于时间和日期的函数,详细介绍见后面
- 其中最常见的时间函数:
.action{now | date "2006-01-02 15:04:05"}
这个可以插入当前的时间(2006-01-02 15:04:05
是 go 语言的日期时间格式化形式,不用太搭理它)
思源自己的预设变量(copy 自「官方的帮助指南」)
title
:该变量用于插入当前文档名。比如模板内容为# .action{.title}
,则调用后会以一级标题语法插入到当前文档内容中id
:该变量用于插入当前文档 ID
设置自定义变量
- 使用自定义变量的方法是
.action{$变量名}
,而对于内置变量就过.action{.title}
,.action{.id}
使用
sql 查询方法
queryBlocks
:该函数用于查询数据库,返回值为 blocks 列表,参数为 SQL 语句:.action{sql "SELECT * FROM blocks LIMIT 7"}
querySpans
:该函数用于查询数据库,返回值为 spans 列表,参数为 SQL 语句:.action{sql "SELECT * FROM spans LIMIT 7"}
queryBlocks
和 querySpans
支持类似 SQL 预编译语句的变参列表,方便传入参数:
<!------------------模板变量-------------------------->
Title:.action{.title}
<!-- 这个返回的是一个block列表 ,"$today :=" 是设置变量语法-->
.action{$today := now | date "20060102150405"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE content LIKE '?' AND updated > '?' LIMIT ?" "%foo%" $today "3"}
需要注意的是 queryBlocks 和 querySpans 中如果还要使用变量,比如有一个变量为今天的日期,可以使用?号占位,然后在函数外输入变量名
模板使用颜色
使用 kramdown 语法,如果想要给部分文字加字体样式,就需要使用两个星号包裹(即加粗样式),后面带上 css style 样式({:后需要注意有一个空格,否则不能正确渲染)
**红色卡片**{: style="color: var(--b3-card-error-color);background-color: var(--b3-card-error-background);"}
**橙色卡片**{: style="color: var(--b3-card-warning-color);background-color: var(--b3-card-warning-background);"}
**蓝色卡片**{: style="color: var(--b3-card-info-color);background-color: var(--b3-card-info-background);"}
**绿色卡片**{: style="color: var(--b3-card-success-color);background-color: var(--b3-card-success-background);"}
模板分栏
分栏语法是思源特有的超级块语法,使用三个大括号包裹 {{{col
,col 代表按列,即横排;row 代表行,即竖排。类似于代码块语法,而需要分几栏其实只要按 enter 换行就好。
{{{col
栏1
栏2
栏3
栏4
}}}
但思源目前的分栏机制,如果你希望在分栏之后,还能在每栏通过 enter 添加新行的话,就需要对每栏再进行超级块包裹。(否则,enter 会创建新的分栏)
具体案例这里直接复制的是 meteor 模板的分栏。
分两栏({: style=...就是运用前面提到的 kmarkdown 进行 css 内嵌样式配置)
{{{col
{{{row
### ✨ fisrt
{: style="color: var(--b3-card-error-color);background-color: var(--b3-card-error-background);"}
- text
}}}
{{{row
### 🎉 second
{: style="color: var(--b3-card-info-color);background-color: var(--b3-card-info-background);"}
- text
}}}
}}}
分四栏
{{{col
{{{row
### ✨ fisrt
{: style="color: var(--b3-card-error-color);background-color: var(--b3-card-error-background);"}
- text
}}}
{{{row
### 🎉 second
{: style="color: var(--b3-card-info-color);background-color: var(--b3-card-info-background);"}
- text
}}}
{{{row
### ✏ three
{: style="color: var(--b3-card-success-color);background-color: var(--b3-card-success-background);"}
- text
}}}
{{{row
### 🎯 four
{: style="color: var(--b3-card-warning-color);background-color: var(--b3-card-warning-background);"}
- text
}}}
}}}
模板日期相关
在模板中,日期相关的用法比较常用,希望能输出今日日期、明天日期、这一周的日期范围,以方便进行日程管理,或查询特定日期的笔记。
具体的案例如下:
<!-- 返回今天日期和星期 英文 -->
.action{ now | date "2006-01-02 Mon "}
<!-- 返回今天日期和星期 中文 -->
.action{$ini_date := toDate "2006-01-02" "2021-05-02"}
.action{$now_date := now}
.action{$subdays := mod (div ($now_date.Sub $ini_date).Hours 24) 7}
.action{$today := last (slice (list "星期一" "星期二" "星期三" "星期四" "星期五" "星期六" " 星期日") 0 $subdays)}
.action{now | date "2006-01-02"} .action{$today}
<!-- 返回今天过去几天,修改date_modify 后的小时数-->
.action{(now | date_modify "-72h")| date "20060102"}
<!-- 返回这一周的日期范围-->
.action{$ini_date := toDate "2006-01-02" "2021-05-02"}
.action{$now_date := now}
.action{$day := mod (div ($now_date.Sub $ini_date).Hours 24) 7}
.action{$leftday :=mul (sub $day 1) 24}
.action{$rightday :=mul (sub 7 $day) 24}
.action{$leftHour :=nospace (cat "-" $leftday "h") }
.action{$rightHour :=nospace (cat "+" $rightday "h")}
.action{(now | date_modify $leftHour) | date "2006-01-02"} ~ .action{(now | date_modify $rightHour) | date "2006-01-02"}
<!-- 返回现在时间和距离今天结束还剩多少时间 -->
.action{$tomorrow := (now | date_modify "24h") | date "2006-01-02 "}
.action{$tomorrow := nospace $tomorrow}
.action{$nextDay := toDate "2006-01-02" $tomorrow}
现在时间: .action{now | date "15:04:05"}
距离今天结束还有.action{$nextDay.Sub now}
模板查询嵌入案例
<!------------------模板嵌入-------------------------->
<!-- 模板块嵌入例子1:本文档加粗文字汇总(D大说这里会加一个sql函数,直接查询加粗-->
本文档加粗文字汇总(适用版本, 1.2.31及之前)
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.title}.sy' AND markdown LIKE '%**%**%'}}
注意,1.2.5后,文件存储形式为id.sy,所以需要把.title改为.id
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%**%**%'}}
<!-- END -->
<!-- 模板块嵌入例子3:本文档高亮文字汇总(D大说这里会加一个sql函数,直接查询加粗-->
本文档高亮文字汇总(适用版本, 1.2.31及之前)
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.title}.sy' AND markdown LIKE '%==%==%'}}
注意,1.2.5后,文件存储形式为id.sy,所以需要把.title改为.id
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%==%==%'}}
<!-- END -->
<!-- 注意这里由于思源存在列表项父块套子块的情况,所以可能会出现列表中的结果出现多次的情况,具体解决方法见集市中的list-find,那我为什么不直接在这里写呢,因为我压根就没下载过这个模板,出于对大佬的信任,我认为他解决了这个问题哈哈哈哈 -->
<!-- 模板块嵌入例子3:查询今天更新的所有笔记,root_id != '.action{.id}'排除了查询页面的内容 -->
## .action{ now | date "2006-01-02 Mon "} 更新笔记文档汇总
{{SELECT * FROM blocks WHERE updated >= ".action{now | date "20060102"}" AND updated <= ".action{(now | date_modify "+24h")| date "20060102"}" AND type = 'd' AND root_id != '.action{.id}' order by updated }}
<!-- END -->
<!-- 模板块嵌入例子3:查询近3天更新的所有笔记,date_modify "-72h" 是调用函数=当前时间-72h -->
## .action{(now | date_modify "-72h")| date "20060102"} - .action{now | date "2006-01-02"} 更新笔记汇总
{{SELECT * FROM blocks WHERE updated >= ".action{(now | date_modify "-72h") | date "20060102"}" AND updated <= ".action{(now | date_modify "+24h") | date "20060102"}" AND type !='d' AND root_id != '.action{.id}' order by updated }}
<!--END-->
模板 sql 查询循环语法
很多小伙伴对于模板查询,只知道通过 sql 查询可以作为嵌入块,其实通过循环语法是可以直接把查询的文字以纯文本形式或者块引方式展示出来的。语法如下,通过 range
对查询的块进行查询,再选择块的基本属性进行展示。需要注意的是这里块的属性是大写,而 sql 查询时块的属性表都是小写,如类型为 $b.Type
而不是 $b.type
。
<!-- 模板sql查询循环语法 -->
.action{range $b := $blocks} // 相当于for 循环
.action{$b}
.action{$b.ID} | .action{$b.Path}
Type: .action{$b.Type}
Markdown: .action{$b.Markdown}
Content: .action{$b.Content}
.action{end}
<!-- 循环结束 -->
如果我要在笔记中查询今天或者特定日期内的所有笔记,而使用块嵌入的话,鉴于思源不支持折叠块查询的子结果,会让页面特别长。这时候使用块引展示笔记文档就很合适。
以块引形式展示今天更新的笔记
## .action{ now | date "2006-01-02 Mon "} 今天更新的笔记文档
.action{$today := now | date "20060102"}
.action{$next := (now | date_modify "+24h")| date "20060102"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE id in (SELECT root_id FROM blocks WHERE (updated >= '?' AND updated <= '?' AND root_id != '?')) order by updated DESC " $today $next .id}
.action{range $v := $blocks}
- ((.action{$v.RootID} ".action{$v.HPath}"))
.action{end}
ps:目前 lanzhou 大佬的 note views 挂件块支持以日历形式展示每天更新笔记
update_today_document.md
: 按更新时间倒序,以块引方式展示今天更新的文档
## .action{ now | date "2006-01-02 Mon "} 今天更新的笔记文档
.action{$today := now | date "20060102"}
.action{$next := (now | date_modify "+24h")| date "20060102"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE id in (SELECT root_id FROM blocks WHERE (updated >= '?' AND updated <= '?' AND root_id != '?')) order by updated DESC " $today $next .id}
.action{range $v := $blocks}
- ((.action{$v.RootID} ".action{$v.HPath}"))
.action{end}
update_today_document_link.md
: 按更新时间倒序,以块超链接方式展示今天更新的文档
## .action{ now | date "2006-01-02 Mon "} 今天更新的笔记文档
.action{$today := now | date "20060102"}
.action{$next := (now | date_modify "+24h")| date "20060102"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE id in (SELECT root_id FROM blocks WHERE (updated >= '?' AND updated <= '?' AND root_id != '?')) order by updated DESC " $today $next .id}
.action{range $v := $blocks}
- [.action{$v.HPath}](siyuan://block/.action{$v.ID})
.action{end}
统计任意时间更新的文档
可以自定义时间范围,
自定义方法:只需要在开头修改 today 和 next 里的时间
update_someday_document.md
: 块引版本
<!-- 设定时间 -->
.action{$from:= toDate "2006-01-02 15:04:05" "2021-07-05 00:00:00"}
.action{$to := toDate "2006-01-02 15:04:05" "2021-09-05 00:00:00"}
## .action{$from | date "2006-01-02 Mon"} \~ .action{$to | date "2006-01-02 Mon"} 期间更新的笔记文档
.action{$from:= $from | date "20060102150405"}
.action{$to:= $to | date "20060102150405"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE id in (SELECT root_id FROM blocks WHERE (updated >= '?' AND updated <= '?' AND root_id != '?')) order by updated DESC Limit 10000" $from $to .id}
.action{range $v := $blocks}
- ((.action{$v.RootID} ".action{$v.HPath}"))
.action{end}
update_someday_document_link.md
块超链接版本
<!-- 设定时间 -->
.action{$from:= toDate "2006-01-02 15:04:05" "2021-07-05 00:00:00"}
.action{$to := toDate "2006-01-02 15:04:05" "2021-09-05 00:00:00"}
## .action{$from | date "2006-01-02 Mon"} \~ .action{$to | date "2006-01-02 Mon"} 期间更新的笔记文档
.action{$from:= $from | date "20060102150405"}
.action{$to:= $to | date "20060102150405"}
.action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE id in (SELECT root_id FROM blocks WHERE (updated >= '?' AND updated <= '?' AND root_id != '?')) order by updated DESC Limit 10000" $from $to .id}
.action{range $v := $blocks}
- [.action{$v.HPath}](siyuan://block/.action{$v.ID})
.action{end}
阿巛的个人日记模板
周打卡模板
通过周打卡模板进行每日打卡,对习惯进行追踪
.action{$ini_date := toDate "2006-01-02" "2021-05-02"}
.action{$now_date := now}
.action{$day := mod (div ($now_date.Sub $ini_date).Hours 24) 7}
.action{$leftday :=mul (sub $day 1) 24}
.action{$rightday :=mul (sub 7 $day) 24}
.action{$leftHour :=nospace (cat "-" $leftday "h") }
.action{$rightHour :=nospace (cat "+" $rightday "h")}
## .action{(now | date_modify $leftHour) | date "2006-01-02"} ~ .action{(now | date_modify $rightHour) | date "2006-01-02"} 📅周打卡
| **事项** ❌✔⚫ | **一** | **二** | **三** | **四** | **五** | **六** | **七** |
| :---------------: | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
本次分享就这样结束了,算是抛砖引玉一下。之后也会鉴于我的使用和思源的更新,再修改这篇文档的。See you!
更多信息见语雀专栏:📋 模板使用基本介绍 · 语雀 (yuque.com)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于