Skip to content

0x02f-obsidian-dataview列出所有的tag

dataviewJs

这里使用的是dataviewJs的api:

列出所有的Tag:

dv.list(new Set(dv.pages().file.tags))
dv.list(new Set(dv.pages().file.tags))

列出Tag数量:

var i = [dv.pages().file.etags.distinct().length]
dv.paragraph(`已发布文档中,标签共有 **${i[0]}**个。`)
var i = [dv.pages().file.etags.distinct().length]
dv.paragraph(`已发布文档中,标签共有 **${i[0]}**个。`)

从指定目录中查询Tag

dv.list(new Set(dv.pages(`"目录1" or "目录2" or "目录3"`).file.tags))
dv.list(new Set(dv.pages(`"目录1" or "目录2" or "目录3"`).file.tags))

第三方插件中调用dataviewjs

如果是在第三方插件中调用dataviewjs, 经过测试发现,非dom操作没问题。Render相关的API不支持。

// 非dom操作没问题
var i = dv.pages().file.etags.distinct();
i.values;

//  dom操作 paragraph 未undefined
var i = dv.pages().file.etags.distinct();
dv.paragraph(i)
// 非dom操作没问题
var i = dv.pages().file.etags.distinct();
i.values;

//  dom操作 paragraph 未undefined
var i = dv.pages().file.etags.distinct();
dv.paragraph(i)

要解决需要手动初始化renderApi或调用executeJs:

js
const div = window.createDiv()						
dv = (this.app as any).plugins.plugins.dataview.localApi(srcRelativePath, this.component, div);
const result = eval(query);
const div = window.createDiv()						
dv = (this.app as any).plugins.plugins.dataview.localApi(srcRelativePath, this.component, div);
const result = eval(query);

这样仍然有问题,dataviewjs中默认渲染dom(调用的renderValue)是异步的,这里的result获取不全,要完美实现似乎只有两种路子了:

  • 改dataviewjs源码
  • 自己定义缺失的.paragraph 等等方法

暂且搁置。

参考
Is there a way to retrieve a list of tags of e.g. files in a folder? - Help - Obsidian Forum
Dataviewjs的奇技淫巧 - 经验分享 - Obsidian 中文论坛