使用DV创建动态更新的笔记目录大纲(TOC)

这一行:

const file = app.workspace.getActiveFile();

把它换成你想要获取的笔记:

// 指定笔记文件的路径
const filePath = "path/to/your/note.md";

// 获取对应文件
const file = app.vault.getAbstractFileByPath(filePath );

更进一步的定制可以问 AI。

大佬,我想问一下,如果我在每一篇的笔记开头都添加这个目录显示,那在拥有上千个笔记的库在启动和运行时会不会很卡,因为我不了解dataview的运行方式,所以不是很清楚

你好,不会的,Obsidian 是动态加载,只有当前打开/聚焦的笔记内容会进行渲染。

另外如果想给每个笔记都加上目录,用这个代码块就有点麻烦了,可以考虑试试这个插件:
GitHub - RavenHogWarts/obsidian-ravenhogwarts-toolkit

3 个赞

背景

【借楼发挥】在以上各位的基础上,我通过问AI得出新的自动生成目录代码,即无序目录代码二【经实用:如果没有一级标题,从二级标题开始,那就把第一行的1改成2,就显示正常了。】

诉求

但同时,请求教高手,是否可以把带层级序号的自动目录,改成可以缩进层级的版本【不懂,已问过多个AI,但仍然无法解决,先行谢过了】

问题

以下两段可以在obsidian笔记软件里使用的dataview代码,无序目录代码二可以正常显示层级目录,请按此要求,修改序号目录代码一,使其也可以正常显示为层级目录,并保留序号相关设置:

序号目录代码一

const startHeadinglevel = 1; // 设置起始标题层级(1=从H1开始)
const file = app.workspace.getActiveFile();
const { headings } = app.metadataCache.getFileCache(file);

// 初始化层级计数器
let counters = [];

const raws = headings.map(p => {
    const adjustedLevel = p.level - startHeadinglevel + 1;
    if (adjustedLevel < 1) return ""; // 过滤低于起始层级的标题
    
    // 扩展计数器数组到当前层级
    while (counters.length < adjustedLevel) counters.push(0);
    
    // 递增当前层级计数器,并重置子层级
    counters[adjustedLevel-1]++;
    for (let i = adjustedLevel; i < counters.length; i++) counters[i] = 0;
    
    // 生成数字序号
    const number = counters.slice(0, adjustedLevel).join(".") + ".";
    
    // 计算缩进
    const indent = " ".repeat((p.level - startHeadinglevel) * 4);
    return `${indent}${number} [[#${p.heading}]]`;
});

// 输出带行距的段落
dv.container.style.lineHeight = "1.2em";
dv.paragraph(raws.join("\n"));

无序目录代码二

const startHeadinglevel = 1; // 现在可以设置为1
const file = app.workspace.getActiveFile();
const { headings } = app.metadataCache.getFileCache(file);

// 全列表的形式
const raws = headings.map(p => {
    let repeatCount = Math.max((p.level - startHeadinglevel) * 4, 0);
    let spacesPrefix = ' '.repeat(repeatCount); // 修改这里,直接使用 repeatCount
    let listSign = '- ';
    let linkText = `[[#${p.heading}]]`;
    let headingList = `${spacesPrefix}${listSign}${linkText}`; // 简化逻辑
    return headingList;
});

let result = raws.join('\n');
// 添加行距
dv.container.style.lineHeight = "1.5em";
dv.paragraph(result);
1 个赞