在Obsidian中使用query代码块可以利用搜索语法展示笔记。我有一些笔记可以使用query代码精确匹配。但是当我想要用dataview处理这些笔记时,我发现这些使用了query特性的查询语法无法转换为dataview中的匹配规则。
例如下面这段代码将会匹配非标签形式的标签。我可以使用它找出dataview代码块中使用的标签:
#xxx -tag:xxx
我想要知道obsidian中是否存在可用被dataview调用的查询API。
在Obsidian中使用query代码块可以利用搜索语法展示笔记。我有一些笔记可以使用query代码精确匹配。但是当我想要用dataview处理这些笔记时,我发现这些使用了query特性的查询语法无法转换为dataview中的匹配规则。
例如下面这段代码将会匹配非标签形式的标签。我可以使用它找出dataview代码块中使用的标签:
#xxx -tag:xxx
我想要知道obsidian中是否存在可用被dataview调用的查询API。
确实,query擅长查询内容,dataview擅长查询文件属性,不擅长查询内容,如果要实现query的这个功能,dataview得遍历文件内容,并自行区分标签和标签形式的非标签内容,反而变得麻烦。
不过,也可以二者配合使用,这是个简单示例
```dataviewjs
// 这里查询内容改成 👇 你自己的
const query = "#xxx -tag:xxx";
const leaf = app.workspace.getLeaf('tab');
// 这种方式成功的话可以使用这种方式,不会先弹出tab,但有时会不成功
//const leaf = app.workspace.createLeafInParent(app.workspace.floatingSplit);
await leaf.setViewState({
type: 'search',
active: true,
state: {
query: query
}
});
//显示查询内容
dv.container.appendChild(leaf.view.dom.childrenEl);
await sleep(200)
//打印查询数据
const data = leaf.view.dom.resultDomLookup;
console.log(data);
// 关闭叶子
leaf.detach();
```
这里通过leaf.view.dom.resultDomLookup获取查询数据,然后也可以自定义输出内容。
效果:
灵感来自:https://forum.obsidian.md/t/api-endpoint-for-searching-file-content/11482/6
有个缺点:每次都要先打开tab标签再关闭 app.workspace.getLeaf('tab')
,如果尝试使用app.workspace.createLeafInParent(app.workspace.floatingSplit)
成功的,可以使用这种方式,不会先打开tab,但有时成功,如果有大佬有更好的方法,请帮忙改进,谢谢!
多谢解答。我最近也在积极寻找这方面的其他解决方案,如果有进展可以互相交流。
感觉这个效果还不如float search
发现这个leaf少了定义,应该加个let,还有sleep也最好稍微放大点
这种是从dom获取数据,不知道ob有没有api能直接获取到query的数据
确实是,感谢指正和建议,目前还未找到能直接获取到query数据的办法