Obsidian使用dataview过滤笔记某标题下内容

非JavaScript程序员,对接口不是很熟悉,所以用了正则匹配来实现哈,主要是过滤# ## ###开头,空行结尾的段落,不知道是否有其他更好的实现,先push上来再说。
正则如下。

function getBlockContent(str, title){
    return str.match(`(?<=#{1,6}[ ]*${title}[\\n])[\\s\\S]*?(?=[\\n]{2}|$)`);
}

下面这个版本是过滤两个标题间的段落

function getBlockContent(str, title){
    return str.match(`\(\?<=#\{1,6\}\[ \]\*${title}\[\\n\]\)\[\\s\\S\]\*\?\(\?=\[\\n\]{2\}#\{1,6\}\[ \]\|\$\)`);
}

示例

一个简单的dataview汇总笔记内容生成表格的示例,比如说现在我有一系列这样的markdown语法笔记。

## 效果
1. First item
2. Second item
3. Third item

## 语法
```markdown
1. First item
2. Second item
3. Third item
```

我想要把同类笔记的段落汇总成表格方便查看。
则可以用dataviewjs来实现:

function getBlockContent(str, title){
    return str.match(`(?<=#{1,6}[ ]*${title}[\\n])[\\s\\S]*?(?=[\\n]{2}|$)`);
}

let files = dv.pages('"Markdown/语法"');
let table = [];
for(let i of files) {
    let content = await app.vault.readRaw(i.file.path);
    let syntax = getBlockContent(content, "语法");
    let result = getBlockContent(content, "效果");

    table.push({
    "file": i.file.link,
    "syntax": syntax,
    "result":result
    })
}

dv.table(["Element", "Markdown Syntax", "Result"], table
    .map(b => [b.file, b.syntax, b.result]))

显示效果如下:

搜索很久没有找到现成解决方案,希望可以帮到同样需求的人 。:yum:

4 个赞

这个是文件路径吗

文件夹路径

dv.pages() => all pages in your vault
dv.pages("#books") => all pages with tag 'books'
dv.pages('"folder"') => all pages from folder "folder"
dv.pages("#yes or -#no") => all pages with tag #yes, or which DON'T have tag #no
dv.pages('"folder" or #tag') => all pages with tag #tag, or from folder "folder"
2 个赞

谢谢大佬解答:hugs::heartbeat::heartbeat:

请问大神, 我想匹配最后一个---%%之间的全部内容, 这个正则应该怎么写啊

---
aliases: 
- 'aa
tags:
- 'bb'
---

内容

内容

%%
## 引用

可以试试。

`(?<=[\\n]-{3}[\\n])[\\s\\S]*?(?=[\\n]%{2}[\\n])`
2 个赞

成功了, :heartbeat:非常感谢!

我这里用yaml区的别名作为首列, 我想给它加一个链接. 这样我点一下就能跳转到源文件应该怎么实现呢? 还有就是内容这列有办法把那一点去掉吗?

```dataviewjs
function getBlockContent(str){
    return str.match(`(?<=[\\n]-{3}[\\n])[\\s\\S]*?(?=[\\n]%{2}[\\n])`);
}

let files = dv.pages("#名词解释");
let table = [];
for(let i of files) {
    let content = await app.vault.readRaw(i.file.path);
    let result = getBlockContent(content);

    table.push({
    "file": i.file.link,
    "name": i.file.frontmatter.aliases[0],
    "result":result
    })
}

dv.table(["名词", "解释"], table
    .map(b => [b.name, b.result]))

这个就是可以跳转的链接。

用具体内容跳转链接可以试试这样:

    "name": `[[${i.file.path}|${i.file.frontmatter.aliases[0]}]]`

去掉点可以这样。

    "result":result.toString()
2 个赞

成功啦! 非常感谢:heartbeat::heartbeat:

请问我的文件夹里有些文件没有该标题,能不能排除掉这些文件呀,简单来说就是把table里值为空的那一行去掉

请问下我想显示callout里的内容要怎么修改呢

  if (syntax && syntax[0].trim() !== '') { // 检查语法内容是否不为空
    table.push({ "file": i.file.link, "syntax": syntax, "result": result });
  }

在table push之前添加条件