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 中文论坛