Dataviewjs的奇技淫巧

调试完毕,现在结果可以显示![[文件名]]类形和网络链接类型的图片,![](相对路径}类行/绝对路径类型的,有需求可以自己完善

const term = "测试"
const files = dv.pages()
const b = files.map(async function(p){
var x = await app.vault.readRaw(p.file.path);
x = x.split("\n## ").filter(p=>p.slice(0,term.length)==term)[0];
// 使用replace方法,把![[]]或者![[ ]]替换成用<img>标签包裹的字符串
x = x.replace(/!\[\[(.*?)\]\]/g, function(match, p1) { return "<img src=\""+app.vault.adapter.basePath+"/"+p1+"\">"});
dv.header(3,p.file.link);
dv.paragraph(x.slice(term.length));
})

结果

本来都打算跑去用图床了,但是平板日常没网 :sweat_smile:

2 个赞

确实,这是个好办法,dataview对嵌入总有些bug

对的,谢谢大佬 :+1: :+1: :+1: :+1: :+1: :+1: :+1:

佬,请问如何对日期格式标准化(YYYY-MM-DD) 例如

  • 对当前时间转换用moment().subtract(1,‘day’).format(‘YYYY-MM-DD’)

那对文档创建时期dv.current().file.cday如何转换呢,加.format(‘YYYY-MM-DD’)不太行

我比较喜欢用 moment(dv.current().file.cday.ts).format('YYYY-MM-DD')

以下代码能够汇总全库的标签并统计数量。

-```dataviewjs
dv.paragraph(
  dv.pages("").file.etags.distinct()
  .sort(t => dv.pages(t).length , 'desc')
  .map(
  	t => {
		return `[${t}](${t})`+"("+dv.pages(t).length+")"
	}
  ).array().join(" ")
)
-```

但是,如果把file.etags替代为aliases,会提示错误。怎么修改才能汇总全库的alias并统计数量呢?

为什么要汇总全库的alias呢,难道有大量的笔记是同样的别名吗

谢谢提醒。我在很多笔记里都设置了相同的别名,把别名当作主题词了,得改。

那么,如果很多笔记里都设置了行内字段 “主题词”,笔记A是“主题词:: 1,2,3”,笔记B是“主题词:: 2,3,4,5”…,那么怎么统计全库有多少主题词以及各自频次呢?

这样就可以了

```dataviewjs
let c = dv.pages("").主题词.groupBy(p=>p)
dv.paragraph(`主题词有${c.length}个`)
dv.paragraph(c.map(p=>`- ${p.key}(${p.rows.length})`).join('\n'))
```

谢谢,完美实现!太牛啦!这样就可以建立自己的动态“主题词表”,有希望以主题词为线索建立知识管理系统了。

我加上了链接,可以直接打开以该主题词命名的笔记。

let c = dv.pages("").主题词.groupBy(p=>p)
dv.paragraph(`主题词有${c.length}个`)
dv.paragraph(c.map(p=>`- [${p.key}](${p.key})(${p.rows.length})`).join('\n'))

实现效果如下:

又有了新的问题:

  1. dataview将"[主题词]"和"主题词"视作不同的对象,该怎么处理呢?
  2. 能不能实现这个功能,在点击每个主题词的"(数量)"时,激活针对该主题词的搜索?
1 个赞

大佬,求助,麻烦看一下我发的那个求助,能不能麻烦帮帮忙

收到,谢谢大佬 :+1: :+1:

大佬, 我想用您最初发贴时的案例(就是那个使用chart插件创建每日新建文档数量的折线图的案例), 做一个折线图: 来统计每天完成题目的数量(题目数量会在日记中给出)
例如:


想问一下提取数字和赋值如何来实现

如果是元数据直接用dataview拿出来就可以了,如果只是普通的文本就只能拿正则表达式硬拆了

好嘞,谢谢大佬,那我就用正则来写吧,但是上午没整出来 :sob: :sob: :sob:,我再试试

佬,请问这个用来取数字的正则咋写呀:

- **题目量**:30个
- **题目量**:50个

取其中的30和50,这个不行嘛

function getBlockContent(str, title){
    return str.match(`(- \*\*${title}\*\*:\d\d个)`);
}
let content = await app.vault.readRaw(dv.current().file.path); 
dv.list(getBlockContent(content , "题目量"))

正则是一点不会 :sob: :sob: :sob: :sob: :sob:

我记得/ /的正则表达式好像不能传入变量

function getBlockContent(str, title){
    return str.match(new RegExp(`- \\*\\*${title}\\*\\*:(\\d\\d)个`,'g')).map(val => val.match(/\d\d/)[0])
}
let content = await app.vault.readRaw(dv.current().file.path); 
dv.list(getBlockContent(content , "题目量"))
1 个赞

成了,谢谢大佬,我那个是从一个代写正则的网站上找的代码 :joy: :joy:
大佬:ox::+1: :+1: :+1: :+1:

学习了where后面怎么多个条件查询,谢谢

多个条件之间使用 and 或者 or 进行逻辑组合