数据库的方式管理笔记-dataviewjs分享

dataview 对markdown笔记进行解析,使得提取笔记信息变得非常方便,可以方便的结构化展示内容,对一些不会代码的人不友好,我就分享自己的应用场景和写下的代码,供大家参考

我受到一部分他人的启发,用数据库的方式显示内容

1 个赞

首先是最简单的统计功能 ,比如说 我看牙医花了多少钱,这是在当前页面里 列表统计

左边是预览效果,右边是源码模式

重点是在 在每个列表里面增加 [price:: ] 里面的名称可以变化,但是要 英文开头,不要有空格,最多用下划线连接(就是js的变量名称要求, 其实可以有空格,dataviewjs会转化)

源码内容

    ```dataviewjs
    let sum=0
    dv.current().file.lists.map( t => sum+= t.price ?? 0)
    dv.el("b", "总实际花费(扣除医保): "+sum +" 元")
    ```

第二种方式,在不同的 md 文件里面 对 tasks/list 进行汇总

这里是 利用了 tags 对文件汇总,提取 #健身 这个大标签, 把 task 中有 的 #健身/健身环 子标签提取出来,再获取 dur:: 25 min 的属性值,进行汇总


    ```dataviewjs
    const pages = "#健身"
    
    
    const re = /#(.+?)(?=\s)/g //去标签
    let fitTime=dv.duration("0 s")
    let fitCount =0
    const list = []
    
    dv.pages(pages) .sort(k => k.file.cday, 'desc').map(k => 
        k.file.tasks.filter(t => t.text.includes(pages))
          .map( t =>{ 
            list.push( [k.file.link, t.tags  ,  t.text.replace(re,"").replace(/\[.*\]/,"").trim(), t.duration ?? t.dur ?? ""  ])
          fitTime =  fitTime.plus(t.duration ?? t.dur ?? dv.duration("0 s"))
          fitCount +=1
          } 
    ))
    
    dv.table(["日期", "项目","内容", "持续时间"], list) 
    
    dv.el("b", "总运动时间: "+fitTime.shiftTo('hours').hours.toFixed(2) +"h ,运动次数 "+ fitCount)
    ```

第三种结构化显示,显示 该md文件被哪些文件引用

首先也是通过 tag 聚合,十分通用,把括号里 #GTD/03项目 改成你需要的标签即可

    ```dataviewjs
    for (let group of dv.pages("#GTD/03项目").groupBy(p => p.file.folder)) { 
        dv.header(3, group.key); 
        dv.table(["Name", "Inlink", "修改时间"], 
            group.rows 
                .sort(k => k.file.mtime, 'desc') 
                .map(k => [k.file.link, k.file.inlinks, k.file.mtime])) 
    }
    ```

这些本来可以不用这么复杂,我为了更加醒目,做了一些修改
比如 k.file.folder 改成 k.file.folder.split("-")[2] 因为我的文件路径是 03-task/02-work 就化简为 work

k.file.inlinks 改成

dv.array( k.file.inlinks.map((k)=>{
            const q = dv.page(k.path)
            return   "#"+q.file.folder.split("/")[0].split("-")[1] + " [["+ q.file.name +"]]"
            })).filter( (k)=> !k.includes("#Task"))

因为 我还想知道 被引用的md文件属于我的哪个顶层文件夹,是 输入 还是 输出 还是 成果,如果是 任务 就不显示,用 #更加显眼,不是真的标签

完整代码

    ```dataviewjs
    const pages = "#GTD/01重要"
    
    dv.table(["Name", "folder","Inlink", "修改时间"], 
        dv.pages(pages) 
            .sort(k => k.file.mtime, 'desc') 
            .map(k => [k.file.link, k.file.folder.split("-")[2] ,   dv.array( k.file.inlinks.map((k)=>{
            const q = dv.page(k.path)
            return   "#"+q.file.folder.split("/")[0].split("-")[1] + " [["+ q.file.name +"]]"
            })).filter( (k)=> !k.includes("#Task"))
             , k.file.mtime])
    ) 
    ```

这个不错,套用改下,用来统计阅读时长