如何用dataview检索块信息,就像代办那样。

如何用dataview检索块信息,就像代办那样,比如把带有关键字“苹果”的无序列表、有序列表展示出来。

需要用dataviewjs,dataview不行

好像确实是这样,那如何写代码呢

这种简单的直接问gpt就好了,以下是问ds r1的结果,查询当前文件的出现“苹果”这个关键字的段落:

// 使用 DataviewJS 和 Obsidian API 检索包含"苹果"的段落
const {app} = this;
const keyword = "苹果"; // 可替换为任何关键词

// 获取当前文件
const currentFile = app.workspace.getActiveFile();
if (!currentFile) {
    dv.paragraph("❌ 没有活动文件");
    return;
}

// 读取文件内容
const content = await app.vault.read(currentFile);
if (!content) {
    dv.paragraph("❌ 无法读取文件内容");
    return;
}

// 将内容分割为行
const lines = content.split('\n');

// 解析文件内容,跳过代码块
let inCodeBlock = false;
let currentParagraph = "";
const paragraphs = [];

for (let i = 0; i < lines.length; i++) {
    const line = lines[i].trim();
    
    // 检测代码块开始/结束
    if (line.startsWith('```')) {
        inCodeBlock = !inCodeBlock;
        continue; // 跳过代码块标记行
    }
    
    // 如果在代码块中,跳过该行
    if (inCodeBlock) continue;
    
    // 跳过代码块中的内容后,处理普通文本
    if (line === '') {
        // 遇到空行,结束当前段落
        if (currentParagraph.trim() !== '') {
            paragraphs.push(currentParagraph.trim());
            currentParagraph = "";
        }
    } else {
        // 非空行,添加到当前段落
        currentParagraph += (currentParagraph ? " " : "") + line;
    }
}

// 添加最后一个段落(如果存在)
if (currentParagraph.trim() !== '') {
    paragraphs.push(currentParagraph.trim());
}

// 筛选包含关键词的段落
const matchingParagraphs = paragraphs.filter(para => 
    para.includes(keyword) && !para.startsWith('```') // 确保不是代码块
);

// 显示结果
if (matchingParagraphs.length > 0) {
    dv.header(3, `包含"${keyword}"的段落 (共${matchingParagraphs.length}处)`);
    matchingParagraphs.forEach((para, index) => {
        dv.span(`**段落 ${index + 1}:**`);
        dv.span(`> ${para}`);
        dv.span("---");
    });
} else {
    dv.paragraph(`没有找到包含"${keyword}"的段落`);
}

问ai的关键是要把错误信息给他反馈,因为一次的结果不一定满足需求

这是我这里的渲染结果,你如果要做什么修改可以把这个代码给ai说,然后改进就行

感谢感谢,没想到代码这么复杂啊。。。看来这块功能确实不太好应用

你不需要管代码的麻烦程度,反正也是ai写的;你管输入和输出符不符合预期,然后根据不符合的地方去提出修改就行了