# 最简知识 # 题目呈现 | 题目 | | --- | %% # 题目查询 ```dataviewjs let folderKeyword = "资料"; // 目标文件夹路径中的关键词 let enableDiscardFilter = true; // 控制是否启用“是否丢弃”过滤功能 (true 表示过滤) let files = dv.pages() .filter(p => p.file.path.includes(folderKeyword)); // 只获取路径包含目标关键词的文件 let targetTitle1 = "# 题目"; // 替换为您的目标标题 let targetTitle2 = "# 答案"; // 另一个目标标题 let alternativeTitle = "# 知识点"; // 替代标题 let keyword = dv.current().file.name; // 要检查的特定内容 let showNextStep = false; // 控制是否显示“下一步”内容 const imagepath = "/0-辅助/Image/公考题目梳理/"; // 图片路径 // 创建一个数组用于存储文件名、执行内容、备注、下一步内容和可点击链接 let data = []; await Promise.all(files.map(async p => { let rawContent = await app.vault.readRaw(p.file.path); // 提取 YAML 头部 let yamlMatch = rawContent.match(/---\n([\s\S]*?)\n---/); let yamlContent = yamlMatch ? yamlMatch[1] : ''; let yamlData = {}; yamlContent.split('\n').forEach(line => { let [key, ...value] = line.split(':'); if (key && value.length) { yamlData[key.trim()] = value.join(':').trim(); } }); // 提取是否丢弃和备注 let discard = yamlData['是否丢弃'] === 'true'; let remark = yamlData['备注'] || ''; // 如果启用过滤功能且文件标记为丢弃,则跳过该文件 if (enableDiscardFilter && discard) { return; } // 检查全文是否包含目标关键词 let containsKeyword = rawContent.includes(keyword); if (containsKeyword) { let lines = rawContent.split('\n'); // 将全文按行分割 let capture1 = false; let capture2 = false; let captureAlternative = false; let extractedText1 = []; let extractedText2 = []; let extractedAlternativeText = []; for (let line of lines) { // 提取 "题目" 内容 if (line.startsWith(targetTitle1)) { capture1 = true; capture2 = false; captureAlternative = false; continue; // 跳过标题本身 } // 提取 "答案" 内容 if (line.startsWith(targetTitle2)) { capture2 = true; capture1 = false; captureAlternative = false; continue; // 跳过标题本身 } // 提取 "知识点" 内容 if (line.startsWith(alternativeTitle)) { captureAlternative = true; capture1 = false; capture2 = false; continue; // 跳过标题本身 } if (capture1) { if (line.startsWith('#')) break; // 遇到下一个标题时停止捕获 extractedText1.push(line.trim()); // 去除行首尾的空白字符 } if (capture2) { if (line.startsWith('#')) break; // 遇到下一个标题时停止捕获 extractedText2.push(line.trim()); // 去除行首尾的空白字符 } if (captureAlternative) { if (line.startsWith('#')) break; // 遇到下一个标题时停止捕获 extractedAlternativeText.push(line.trim()); // 去除行首尾的空白字符 } } // 如果提取到的 "题目" 或 "答案" 或 "知识点" 内容不为空,才将其加入数据数组 let content1 = extractedText1.join('\n'); let content2 = showNextStep ? extractedText2.join('\n') : ''; let alternativeContent = extractedAlternativeText.join('\n'); // 如果没有 "答案" 内容,使用 "知识点" 内容 if (extractedText2.length === 0) { content2 = alternativeContent; } // 处理图片链接 content1 = content1.replace(/!\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { let imgSrc = p2.startsWith("http") ? p2 : encodeURI(app.vault.adapter.basePath + "/" + p2); return `<img src="${imgSrc}" alt="${p1}" style="max-width: 100%; height: auto;">`; }); content1 = content1.replace(/!\[\[(.*?)\]\]/g, (match, p1) => { let imgSrc = encodeURI(app.vault.adapter.basePath + imagepath + p1); return `<img src="${imgSrc}" style="max-width: 100%; height: auto;">`; }); content2 = content2.replace(/!\[(.*?)\]\((.*?)\)/g, (match, p1, p2) => { let imgSrc = p2.startsWith("http") ? p2 : encodeURI(app.vault.adapter.basePath + "/" + p2); return `<img src="${imgSrc}" alt="${p1}" style="max-width: 100%; height: auto;">`; }); content2 = content2.replace(/!\[\[(.*?)\]\]/g, (match, p1) => { let imgSrc = encodeURI(app.vault.adapter.basePath + imagepath + p1); return `<img src="${imgSrc}" style="max-width: 100%; height: auto;">`; }); // 获取反向链接(引用该文件的其他文件)并提取文件名 let backlinks = dv.pages(`"${p.file.path}"`).file.inlinks.map(link => { let fileName = link.path.split('/').pop().replace('.md', ''); // 提取文件名并去掉扩展名 return `<a href="obsidian://open?vault=${encodeURIComponent(app.vault.getName())}&file=${encodeURIComponent(link.path)}">${fileName}</a>`; }); // 仅在内容不为空时将其加入数据数组 if (content1 || content2) { data.push({ file: p.file.link, execution: content1, remark: remark, nextStep: showNextStep ? content2 : '', // 根据布尔变量决定是否显示 linkedFiles: backlinks.join(", ") // 新增的第五列点击链接 }); } } })); // 使用 dv.table 显示表格 if (data.length > 0) { let headers = ["文件名", "题目", "备注", "点击链接"]; if (showNextStep) headers.push("答案"); dv.table(headers, data.map(d => [ `<span style="max-width: 150px; display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">${d.file}</span>`, d.execution, d.remark, d.linkedFiles, // 显示可点击链接 showNextStep ? d.nextStep : '' ])); } else { dv.paragraph("没有找到符合条件的内容。"); } ``` %%