# 最简知识
# 题目呈现
| 题目 |
| --- |
%%
# 题目查询
```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("没有找到符合条件的内容。");
}
```
%%