比如说文章里有
一级标题
二级标题
三级标题
dataview能把这些也带出来,试着用ai写了一段。
TABLE WITHOUT ID
file.link AS "文档",
join(
filter(file.headings, (h) => h.level = 3 OR h.level = 4).heading,
" | "
) AS "三/四级标题",
file.etags AS "标签"
FROM #S计划
WHERE contains(category, "S计划 作业")
SORT file.ctime DESC
但是实际效果是这样,并不显示三四级标题。
后面让ai写了一个这种的。
显示倒是能显示,但是把我quiet outline冲突,直接把我obsidian库给搞崩了。

,现在不敢乱搞了
// 暴力解析法:直接从文件内容提取标题
const content = await dv.io.load(dv.current().file.path);
const headings = [...content.matchAll(/^#{3,4} (.*)$/gm)]
.map(m => `${m[0].trim()}`);
dv.paragraph(`## 提取到的标题\n${headings.join("\n") || "无标题"}`);
你应该用dataviewjs ,dataview 本身功能还是太少了
是的,后面我试了一下找ai写了一下脚本,现在有个新的小问题, dataview和dataviewjs输出的都是渲染的内容,不是实际的文本,我在笔记页面直接Ctrl+F搜索不了,这个是不是没有办法解决,只能靠插件或者怎么搞,obsidian有类似的python插件直接定时输出内容到对应笔记的功能吗?这个我网上找了一下没找到,像Jupyter这种都是只有运行结果,不能修改原笔记文件内容。
```dataviewjs
// 获取所有符合条件的文件
const pages = dv.pages('#S计划')
.where(p =>
p.category?.includes("S计划 作业") &&
p.file.tags?.includes("#pwn")
)
.sort(p => p.file.ctime, 'desc');
// 构建表格数据
const tableData = pages.map(p => {
const headings = (app.metadataCache.getFileCache(p.file)?.headings || [])
.filter(h => h.level === 4)
.map(h => h.heading);
// 为文件生成唯一搜索ID(避免搜索冲突)
const searchID = `pwn-search-${p.file.name.replace(/\.md$/, "")}`;
return [
p.file.link,
p.file.tags.join(", "),
// 优化显示格式(加粗+链接)
headings.map(h => `**[[${p.file.path}#${h}|${h}]]**`).join(" | ")
];
});
// 渲染可视化表格
dv.table(
["文件", "标签", "四级标题"],
tableData
);
dataview只是得到的渲染的结果,确实不能被ctrl+f 搜索得到