Dataviewjs的奇技淫巧

这段代码有帮到我解决需求,非常感谢分享!

我有这样一个应用场景,就是在Zotero里做论文笔记,然后通过Citation引用到Obsidian中,这个时候只有简单的一段,不想一篇论文一个笔记,所以最终是所有引用都在一个文件中。但我想通过dataview将这些都统计起来,结果发现一个文件的在表中不会分行,请问这种应该怎么办呢?

你好,因为我没有用过citation,不知道这引用的格式是什么样的,所以请说明一下要统计什么数据,哪些东西不会在dataview中分行,最后的问题有些模棱两可

感谢大佬回答,就我citation引用过来,最后在Obsidian里得到的是下图显示这样的,这些都是在一个文件里的

然后我的dataview是这样写的
image

最后得到的结果是这样


首列是文件名,然后可以看到同一个文件里的内容它没有分行

具体问题就是这样。

```dataviewjs
const file = dv.current();
let content = await app.vault.readRaw(file.file.path)
let data = [];
content = content.split('\n\n').splice(1,).map(p=>p.split('\n'));
for(let i in content) {
	data.push([]);
	for(let j=0; j<4; j++)
		data[i].push(content[i][j+1].split(':: ')[1]);
}
dv.table(['Title','Author','Published','pdf'],data)
```

试一试吧,不过这段代码的格式要求很高,以这段代码开头,后面直接接这些引用,而且只能是这五行的格式,这样其实可以不用标签了,因为它是以空行划分的

大佬请问是在文件里直接这么使用吗,

但会报错说split未定义?

奇怪,我这没问题啊

不然你先运行一下这段

const file = dv.current();
let content = await app.vault.readRaw(file.file.path)
console.log(content)

按ctrl+shift+i看看,另外上面那段有点小问题修改了一下

感谢大佬,现在没问题了,应该是dataviewjs代码和下面内容的之间空行的关系,另外想问一下大佬js代码高亮是怎么弄的啊

一个叫 editor syntax highlight 的插件

好的好的感谢大佬

再请问一下,您是如何在帖子里输入代码的,比如这个

因为论坛帖子代码输入设置好像也是``````这个,然后再在里面输入代码的话就会消失,我只能得到js语句这样的效果

在外面套上四个 ` 就可以了,同样的,想表示四个套五个就好了

啊感谢感谢,感谢大佬

厉害啊 先码住。js看起来也太复杂,不过模板可以参考一下 :smiling_face_with_tear:

其实这种程度的js不算很复杂,只要会一点基础就能做到了,又不是真的要去学前端

const files = dv.pages("600-日常").filter(p=>Array(p.tags).indexOf(“日记”)!=-1).sort(p=>p.file.name)

这一句没看懂,

请问下:如何实现打开特定文件夹下所有文件(且该文件包含特定标签的)的固定标题下的内容,

dv.pages("600-日常") 就查找了600-日常这个目录下所有的文件(用dv.pages(`#日记`)可以找到所有标签为日记的文件,但我只想要这个目录中的),后面的filter则筛选出所有的标签为日记的文件,indexOf查找目标元素在数组中的位置,找不到返回-1,其实这里用includes函数会更好,只判断存不存在,返回一个布尔值,sort就是顺手排了个序

查询固定标题则是在后面了,原理也很傻瓜,用开头的三个#号加一个空格(这肯定是一个标题嘛)的字符串分割文本,再查找开头是目标标题的那一个元素就是目标标题的内容了

1 个赞

感谢大佬的回复,我经过一番尝试后,按大佬的语句可以达到我的目的
本人小白,读不懂代码,就分享下我试错的经验吧:
1.标签需要yaml中且以 tags: 标签 的形式存在
2.标签如果在正文中以 #标签 的形式,是读取不到的
3.如果在yaml中有多个标签, tags: 标签, 标签2 也是读取不到

1 个赞

是啊,这样p.tags本来就是查询yaml,而且是字符串类型,想要所有标签用p.file.tags
关于问题3,我也不知道当时我为什么要转换为array,现在看好像有点问题,不应该这么写,有点误人子弟了,现在改了一下 :joy: