dataview 的table可能在后面接显示查询带文章内的小标题

比如说文章里有

一级标题

二级标题

三级标题

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库给搞崩了。 :sweat_smile:,现在不敢乱搞了

// 暴力解析法:直接从文件内容提取标题
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 搜索得到