想要在 Obsidian 中通过 QuickAdd 宏自动提取文档里的第一张图片并填充到 YAML 的 banner 属性,这是一个非常实用的自动化需求。
实现这个功能最稳妥的方式是编写一个简单的 User Script (JavaScript)。
单个脚本
第一步:创建脚本文件
-
在你的 Obsidian 库中,创建一个文件夹存放脚本(例如
Scripts)。 -
创建一个名为
extractBanner.js的文件,并将以下代码粘贴进去:
JavaScript
module.exports = async (params) => {
const { app } = params;
const activeFile = app.workspace.getActiveFile();
if (!activeFile) return;
// 读取当前文件内容
const content = await app.vault.read(activeFile);
// 正则表达式:匹配 ![[图片.jpg]] 或 
const imageRegex = /!\[\[(.*?)\]\]|!\[.*?\]\((.*?)\)/;
const match = content.match(imageRegex);
if (match) {
// 获取图片路径(优先匹配内部链接,其次是 Markdown 链接)
const imagePath = match[1] || match[2];
// 使用 Obsidian API 更新 Frontmatter
await app.fileManager.processFrontMatter(activeFile, (frontmatter) => {
frontmatter['banner'] = imagePath;
});
console.log("Banner updated successfully!");
} else {
new Notice("未在正文中找到图片");
}
};
第二步:配置 QuickAdd
-
进入 QuickAdd 设置 -> Manage Macros。
-
给宏起个名字(例如
UpdateBanner),点击 Add Macro。 -
点击 Edit 进入宏配置界面:
-
在 User Scripts 下拉菜单中选择你刚才保存的
extractBanner.js。 -
点击 Add 将其加入到右侧的执行序列。
-
-
返回 QuickAdd 主界面,在 Choices 中添加一个 Macro:
-
名字叫
提取第一张图为横幅。 -
点击齿轮图标,关联到你刚才创建的
UpdateBanner宏。
-
第三步:使用方法
-
打开一篇已经插入了图片但 YAML 里还没有
banner路径的文章。 -
唤起 QuickAdd(通过快捷键或命令面板)。
-
运行
提取第一张图为横幅。
效果: 脚本会自动扫描全文,找到第一个图片语法,并将其路径写入到 YAML 的 banner: 字段中。
批量处理
要在整个文件夹中批量提取图片并填充到 YAML 的 banner 属性,直接使用 QuickAdd 的手动宏效率较低。最快的方法是稍微修改一下脚本,让它遍历特定文件夹下的所有文件。
你可以按照以下步骤操作:
1. 更新脚本代码
创建一个新的脚本(例如 batchExtractBanner.js),这段代码将不再只针对当前文件,而是针对你指定的文件夹:
JavaScript
module.exports = async (params) => {
const { app } = params;
const { quickAddApi } = params;
// 1. 让用户输入或选择目标文件夹路径(例如:Notes/Diary)
const folderPath = await quickAddApi.inputPrompt("请输入目标文件夹路径 (例如: 01_Notes/Daily):");
if (!folderPath) return;
const folder = app.vault.getAbstractFileByPath(folderPath);
if (!folder || !folder.children) {
new Notice("文件夹不存在,请检查路径是否正确(区分大小写)");
return;
}
// 2. 筛选出该文件夹下的所有 Markdown 文件
const files = folder.children.filter(f => f.extension === 'md');
let updatedCount = 0;
// 3. 循环处理每一个文件
for (const file of files) {
const content = await app.vault.read(file);
const imageRegex = /!\[\[(.*?)\]\]|!\[.*?\]\((.*?)\)/;
const match = content.match(imageRegex);
if (match) {
const imagePath = match[1] || match[2];
await app.fileManager.processFrontMatter(file, (frontmatter) => {
// 如果你不想覆盖已有的 banner,可以加个判断:if (!frontmatter['banner'])
frontmatter['banner'] = imagePath;
});
updatedCount++;
}
}
new Notice(`批量处理完成!共更新 ${updatedCount} 个文件的 Banner。`);
};
2. 在 QuickAdd 中设置
-
添加宏: 按照之前的方法,在 QuickAdd 的 Manage Macros 中添加这个新脚本。
-
添加 Choice: 在 QuickAdd 主菜单添加一个 Macro 类型的选项,命名为“批量提取 Banner”。
-
绑定: 确保该选项关联到了你刚才创建的批量处理宏。
3. 操作注意事项(重要!)
-
路径格式: 输入文件夹路径时,不要以斜杠
/开头。例如,如果你的文件夹在根目录,直接写Diary;如果在子目录,写Work/Projects。 -
备份: 在进行批量操作前,强烈建议备份你的文件夹。脚本会直接修改文件的 YAML 区,万一正则表达式匹配错误(比如匹配到了你不想要的图片),撤销起来会很麻烦。
-
跳过已有 Banner: 如果你只想给“还没有横幅”的文章加横幅,可以将脚本中第 27 行修改为:
JavaScript
if (!frontmatter['banner']) { frontmatter['banner'] = imagePath; }
经测试,可以正常使用。除了banner属性,cover属性同样的道理,将代码稍微改一下。
给所有笔记(除特殊外)都加了banner或cover属性,配合base数据库,可以很好的展示自己的笔记。
Tag: #Obsidian #quickadd #banner #cover
文章评论