.action{/*Insert a ref linking to today's daily note*/}
.action{$yyyymmdd:= now |date "20060102"}
.action{$d := first (queryBlocks "SELECT * FROM blocks WHERE ial LIKE '%custom-dailynote-?%' limit 1;" $yyyymmdd)}
((.action{$d.ID} '.action{$d.Content}'))
While figuring this out, I learnt a few things about SiYuan, the Go template syntax and the Sprig add-ons that SiYuan supports that I would like to share:
-
In the second line, the function
now
returns a time stamp that is passed via|
to thedate
formatting function, which uses20060102
as an exemplary formatting string telling it that the desired format isyyyymmdd
. The output of this pipeline is assigned to the variable$yyyymmdd
, which we can use... -
in the third line, where we run a SQL query against the blocks table. Blocks and spans, via
queryBlocks
andquerySpans
respectively, seem to be the only tables you can query from templates. The query is parameterized with today's date, and leverages the fact that daily notes are blocks that have an attributecustom-dailynote-<yyyymmdd>
in their internal attributes list (in short,ial
). We expect to find only one but emphasize that by limiting the output to just one result (LIMIT 1
). Nevertheless,queryBlocks
returns a list, so we apply the Sprig functionfirst
to its output to extract the first (and only) element in the output. -
In the fourth line, we access the
ID
andContent
of the block (the case of attributes matters, see e.g. here). We have several options here, for example, we could create an external link combining the Markdown syntax for links and the SiYuan protocol,[.action{$d.Content}](siyuan://blocks/.action{$d.ID})
. This would work, but I think that a block reference or ref is better suited for an internal link.- with refs, we lose the ability to provide a title that will typically appear on hover
- but we can specify whether the text that will be displayed is static (use double quotation marks, e.g.
".action{$d.Content}"
) or dynamic (single quotes, as in the listing) - dynamic anchors follow changes in the naming of the target, but they are refreshed only when the index is rebuilt. This can be done manually via the document tree
...
menu. [I ignore if something else can trigger this (startup?), please add a comment if you know!] For example, we could have written'today'
and the text would stay there until the index is rebuilt, potentially after some days, at which point it would become2024-05-30
.
That's it! You can place the code in a file named e.g.
ref-today.md
at<workspace>/data/templates/
or a subdirectory of that path, and it will appear when you type/template
as one of the available options. This can be streamlined, see @frostime's insert time plugin to get something like/date
to insert a datestamp (albeit without link to the corresponding daily note).
EDIT: typos, clarity
Welcome to here!
Here we can learn from each other how to use SiYuan, give feedback and suggestions, and build SiYuan together.
Signup About