如何用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写的;你管输入和输出符不符合预期,然后根据不符合的地方去提出修改就行了