思源 2.11.1 版本后对 daily note 的重要更新

注意:如果你只打算写写日记,对一些查询等的高级功能没有兴趣,可以不用关心这篇文章提到的内容。

如果你不在意的话,那么 2.11.1 版的更新对你旧有的 daily note 写作不会构成任何干扰,完全可以无视。

新的 daily note 属性

从 2.11.1 开始, 思源在创建日记的时候会自动为文档添加 custom-dailynote-yyyymmdd 属性, 以方便将日记文档同普通文档区分。

详情请见 Github Issue #9807

Add the custom-dailynote-yyyyMMdd attribute when creating a dailynote doc · Issue #9807 · siyuan-note/siyuan · GitHub

具体来说,你现在每次点击菜单或者按下 Alt + 5 创建 daily note 后,都会在文档中添加一个标识属性

image.png

例如这里 dailynote-20231205 属性就代表了这篇文档是 2023 年 12 月 05 日的日记。

本方案对于月记、周记等把好几天的日记写在一个文档里有有一定的适配性。比如对于一个写月记的人来说,最后他的月文档里会有从 dailynote-20231001 到 dailynote-20231031 一整个月的时间标识(前提是你天天写日记)。

这个属性有什么用?

增加这个属性,带来而最直接的好处就是,以后你可以用非常简单的方式来查找指定日期的日记了,比如如下的 SQL 代码:

select distinct B.* from blocks as B join attributes as A
on B.id = A.block_id
where A.name like 'custom-dailynote-202312%'
order by A.value desc;

使用 custom-dailynote-202312% 就能匹配到 2023 年 12 月所有的日记,又或者你想要匹配 2023 年 10 月 10 号到 13 号的日记,可以这么查询

select distinct B.* from blocks as B join attributes as A
on B.id = A.block_id
where A.name like 'custom-dailynote-%'
and A.value >= '20231010' and A.value <= '20231013'
order by A.value desc;

更进一步的好处是,此后关于日记相关的插件开发起来会简单不少。

注:用户自定义属性会有一个隐藏的 custom- 前缀,比如在自定义面板里,你看到一个名叫 X 的属性,实际上在底层这个属性的名称是 custom-X

如何兼容过去的日记

目前,这个新的属性只会在 2.11.1 版后的思源中生效——也就意味着你之前的日记是没有这个属性的。

为了兼容过去的日记,本人在今日笔记插件中开发了为过去的日记添加日记属性的功能。源代码在这里 https://github.com/frostime/siyuan-dailynote-today/blob/v1.3.0/src/func/dailynote/past-dn.ts。如果有插件开发者需要,可以参考这里的代码。

在插件本体中,你也可以在「设置-日记」一栏点击「为过去的 Daily Note 补充文档属性」按钮

image.png

当弹窗提示「ALL Done」的时候,就说明已经完成了。

开发者守则

  • 打开日记并自动添加属性的功能,是在后端接口 /api/filetree/createDailyNote 当中内置实现的,也就是说如果你调用了这个接口,那么文档就会自动添加这个属性
  • 如果开发者要通过别的方法,例如 createDocWithMd 接口创建日记 (例如日历插件),请手动为文档添加该属性,参考代码如下
    /*
     * Copyright (c) 2023 by frostime. All Rights Reserved.
     * @Author       : frostime
     * @Url          : https://github.com/frostime/siyuan-dailynote-today/blob/v1.3.0/src/func/dailynote/dn-attr.ts
     */
    
    export function formatDate(date?: Date, sep=''): string {
        date = date === undefined ? new Date() : date;
        let year = date.getFullYear();
        let month = date.getMonth() + 1;
        let day = date.getDate();
        return `${year}${sep}${month < 10 ? '0' + month : month}${sep}${day < 10 ? '0' + day : day}`;
    }
    
    /**
     * 对 DailyNote 的自定义属性进行设置, custom-dailynote-yyyyMMdd: yyyyMMdd
     * https://github.com/siyuan-note/siyuan/issues/9807
     * @param doc_id 日记的 id
     */
    export function setCustomDNAttr(doc_id: string, date?: Date) {
        let td = formatDate(date);
        let attr = `custom-dailynote-${td}`;
        // 构建 attr: td
        let attrs: { [key: string]: string } = {};
        attrs[attr] = td;
        serverApi.setBlockAttrs(doc_id, attrs);
    }
    
  • 思源笔记

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

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

    18826 引用 • 70469 回帖 • 1 关注
2 操作
Frostime 在 2023-12-05 15:39:47 更新了该帖
Frostime 在 2023-12-05 15:31:34 置顶了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 我就问一下,日记流视图什么时候上架?trollface

    1 回复
  • 实际上现在配合文档流 +SQL 已经可以了

    新建一个 SQL 规则,把代码贴进去就行

    select distinct B.* from blocks as B join attributes as A
    on B.id = A.block_id
    where A.name like 'custom-dailynote-%'
    order by A.value desc;
    
    

    如果要指定笔记本,加上 and B.box ='xxx' 过滤条件就行

  • 👍

  • ❤️

  • 佬,如果是想看最近 X 天的写法有没有参考 sql 的?我之前保存的 query 挂件的用在文档流出不来应该不是一个东西。

    select 
    	'[' || b.content || '](siyuan://blocks/' || b.id || ')' AS __1____pre__文档标题,
    	replace(tag,'#','') as __2__标签 ,
    	b.created as  __3____date__创建时间
    	-- b.hpath AS __5__文档路径
    from 
    	blocks b
    where 
    	b.type = 'd'
    	-- 限定时间在一周内
    	and b.created > strftime('%Y%m%d%H%M%S',datetime('now','-7 day')) 
    order by 
    	b.created desc
    
    1 回复
  • 把 select 后面几行去掉,那个是 query 挂件提供的方言,不是正规军

    image.png

    1 回复
  • 就是在新的日期模式下,限定日记也是可以这么操作对吧?还是得再加一个属性的条件。

    1 回复
  • 可以把 where 条件加在这个 SQL 后面

    select B.* from blocks as B join attributes as A
    on B.id = A.block_id
    where A.name like 'custom-dailynote-%'
    and A.value > strftime('%Y%m%d',datetime('now','-7 day'))
    and B.box='20220305173526-4yjl33h'
    order by A.value desc;
    
请输入回帖内容 ...