UP | HOME

blog-tiddly wiki根据tiddler tag自动生成时间线

[2024-06-28 周五 08:13]

将以下代码直接复制粘贴进tiddler的内容框内:

\define timeline-r-title() <$view field="title"/>
\define timeline-r-link() <$link to={{!!title}}><<timeline-r-title>></$link>
<$vars ctags={{{ [<currentTiddler>tags[]compare:string:ne[时间线]sort[]join[,]] }}} >
<div class="tc-timeline-r">
<$list filter="[all[tiddlers]] :filter[tags[]compare:string:ne[时间线]sort[]join[,]regexp<ctags>] +[has[date]sort[date]limit[100]eachday[date]]">
<div class="tc-menu-list-item">
<$view field="date" format="date" template="YYYY年0MM月0DD日"/>
<$list filter="[all[tiddlers]] :filter[tags[]compare:string:ne[时间线]sort[]join[,]regexp<ctags>] +[sameday:date{!!date}sort[date]]">
<div class="tc-menu-list-subitem">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
</div>
</$list>
</div>
</$vars>

原理解析:

代码主题来自于官方的 timeline 宏,仅做部分修改。这里我为当前tiddler添加了一个时间线的标签以快速查找类似的时间线视图,如果不需要的话可删除 compare:string:ne[时间线] 部分。

首先匹配出当前tiddler的所有不含“时间线”的标签,并将其排序后拼凑成一个字符串变量 ctags

<$vars ctags={{{ [<currentTiddler>tags[]compare:string:ne[时间线]sort[]join[,]] }}} >

然后开始生成列表,逐一检查所有tiddler,然后将其不含“时间线”的标签排序后拼凑成一个字符串,并检测其中是否包含 ctags 的数值。若有,则证明该tiddler包含有我们当前tiddler的tag。开始匹配日期、数量相关。

<$list filter="[all[tiddlers]] :filter[tags[]compare:string:ne[时间线]sort[]join[,]regexp<ctags>] +[has[date]sort[date]limit[100]eachday[date]]">

其余原理与官方 timeline 宏一致,不再赘述。

▲ 编辑于 [2024-08-22 周四 11:09] | © Published by Emacs 30.0.50 (Org mode 9.7.10) on [2024-08-22 周四 11:25] | RSS