Dataview 代码块分享,实现footer或任意文件agenda目录实现

所需插件:Templater , Dataview

为页面创建页面 footer 引用

效果图,主要可以很方便链接跳转到其他md文档。

  • 创建footer模板,并编写Dataview
  • 在需要的页面引用

创建footer模板

在任意文件创建一个页面,并写入需要的footer内容,例:

<!-- 在非模板文件夹创建footer.md,内容如下-->
## footer
| [[note agenda]]                                 | [[agenda2]] | [[agenda3]] |
| ----------------------------------------------- | ----------- | ----------- |
| `$=dv.list(dv.pages('"文件夹路径"').file.link)` |             |             |

还可以加入 dv.list() 的限制条件:

.where(c => {if(c.type == "project" && c.status != "close"){return c}})

让列表为当前目录及子目录下的所有md文件:

'"文件夹路径"' 替换为:app.workspace.getActiveFile().parent.path
<!-- 当在任何页面引用时,都会替换为当前文件目录及子目录下的所有md文件-->

在需要的页面引用

  • 可以在模板文件夹新建一个页md文件,方便直接快捷引用,例:
<!-- 模板文件夹中新建的插入footer的文件内容,在任意页面直接插入或包含在模板中即可-->
## ![[footer-Template#footer]]



获取当前目录的任意文件列表

效果图,好处是文件夹任意文件变动后,都可以实时更新。

  • 任意页面新建 dataviewjs 代码块,代码如下
let a, b, d = new Array(), e = new Array(), g = app.workspace.getActiveFile().parent;
a = app.vault.getFiles();
b = g.path;
for(let i in a){
	if(a[i].path.indexOf(b) == 0  && a[i].extension != "md"){
        // a[i].path.indexOf(b) == 0 通过indexOf()判断为当前目录及子目录
       // a[i].extension != "md"  排除md文档类型
		d.push(a[i])
	}	
}

for (let group of dv.array(d).groupBy(p => p.parent.path)){ e.push(group); }
dv.table(["Path","File","mtime","ctime","size"],
		 e
		 .map(f => [f.key.replace(g.path, function(h){if(h == f.key){return ".";}else{return ".";}}), 
					f.rows.map(p => "[[" + p.name + "]]"), 
					f.rows.map(p => new Date(p.stat.mtime).toLocaleDateString()), 
					f.rows.map(p => new Date(p.stat.ctime).toLocaleDateString()), 
					f.rows.stat.size])
		)

也可以在任意页面引用代码块,实现动态获取当前文件夹下的所有非md文件;
注:还没能解决在同单元行中的文件排序问题,欢迎大神帮忙

7 个赞

在第三部分让列表为当前目录及子目录下的所有md文件

'"文件夹路径"' 替换为:app.workspace.getActiveFile().parent.path

这个API需要提前安装哪个插件吗
现在调用的话没有结果显示

替换成这个 `"${app.workspace.getActiveFile().parent.path}"` 试试

尝试安装 Templater 这个插件

这个我尝试了一下,好像不行

我试了是可以的:
代码所在文件:


代码所在文件预览:

其它文件引用代码所在文件:

安装尝试后还是不能显示
可以问一下这部分代码的出处吗
在Dataview的官方文档中没有看到这部分函数 :sweat_smile:

试了你写的代码,有效果显示。 :grinning:
从效果来说,是显示了代码所在的笔记的路径和笔记的链接。
但在上文中提到这部分代码是可以显示这个笔记所在的文件夹的笔记及这个文件夹下子文件夹中包含的笔记。 :sweat_smile:

app.workspace.getActiveFile()

这个代码是获取被激活(你选中)的的文档对象,你可以进一步获取其path、name等数据。
这个app变量是obsidian官方的api

可以在dataviewjs里写个console.log(app),然后按 ctrl+shift+i来看看app里面都有啥