𝙡𝙞𝙩𝙨𝙘𝙤𝙧𝙥𝙞'𝙨 博客

  • 首页
  • 隐私政策
  • 小工具
𝐓𝐡𝐞 𝐋𝐚𝐤𝐞 𝐇𝐨𝐮𝐬𝐞
  1. 首页
  2. 收集
  3. 正文

QuickAdd实例-提取文档首图到Yaml的banner属性

2026-03-01 54点热度 0人点赞 0条评论

想要在 Obsidian 中通过 QuickAdd 宏自动提取文档里的第一张图片并填充到 YAML 的 banner 属性,这是一个非常实用的自动化需求。

实现这个功能最稳妥的方式是编写一个简单的 User Script (JavaScript)。


单个脚本

第一步:创建脚本文件

  1. 在你的 Obsidian 库中,创建一个文件夹存放脚本(例如 Scripts)。

  2. 创建一个名为 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

  1. 进入 QuickAdd 设置 -> Manage Macros。

  2. 给宏起个名字(例如 UpdateBanner),点击 Add Macro。

  3. 点击 Edit 进入宏配置界面:

    • 在 User Scripts 下拉菜单中选择你刚才保存的 extractBanner.js。

    • 点击 Add 将其加入到右侧的执行序列。

  4. 返回 QuickAdd 主界面,在 Choices 中添加一个 Macro:

    • 名字叫 提取第一张图为横幅。

    • 点击齿轮图标,关联到你刚才创建的 UpdateBanner 宏。


第三步:使用方法

  1. 打开一篇已经插入了图片但 YAML 里还没有 banner 路径的文章。

  2. 唤起 QuickAdd(通过快捷键或命令面板)。

  3. 运行 提取第一张图为横幅。

效果: 脚本会自动扫描全文,找到第一个图片语法,并将其路径写入到 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 中设置

  1. 添加宏: 按照之前的方法,在 QuickAdd 的 Manage Macros 中添加这个新脚本。

  2. 添加 Choice: 在 QuickAdd 主菜单添加一个 Macro 类型的选项,命名为“批量提取 Banner”。

  3. 绑定: 确保该选项关联到了你刚才创建的批量处理宏。


3. 操作注意事项(重要!)

  • 路径格式: 输入文件夹路径时,不要以斜杠 / 开头。例如,如果你的文件夹在根目录,直接写 Diary;如果在子目录,写 Work/Projects。

  • 备份: 在进行批量操作前,强烈建议备份你的文件夹。脚本会直接修改文件的 YAML 区,万一正则表达式匹配错误(比如匹配到了你不想要的图片),撤销起来会很麻烦。

  • 跳过已有 Banner: 如果你只想给“还没有横幅”的文章加横幅,可以将脚本中第 27 行修改为:

    JavaScript

    if (!frontmatter['banner']) {
        frontmatter['banner'] = imagePath;
    }
    

经测试,可以正常使用。除了banner属性,cover属性同样的道理,将代码稍微改一下。

给所有笔记(除特殊外)都加了banner或cover属性,配合base数据库,可以很好的展示自己的笔记。

Tag: #Obsidian #quickadd #banner #cover

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 教程
最后更新:2026-03-01

litscorpi

久在樊笼里,复得返自然

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 单个脚本
    • 第一步:创建脚本文件
    • 第二步:配置 QuickAdd
    • 第三步:使用方法
  • 批量处理
    • 1. 更新脚本代码
    • 2. 在 QuickAdd 中设置
    • 3. 操作注意事项(重要!)
分类
  • 个人 / 101篇
  • 分享 / 239篇
  • 收集 / 21篇
标签聚合
教程 理财 旅游 影视 美文 阅历 资源分享 互联网 AI 数码电子 音乐 阅读 我的剪辑 娱乐 随笔 学习 生活 工作 clippings 代码 网站 软件应用
书签
  • icloud
  • office 365
  • OneNav
  • Todoist
  • YouTube
  • 微博
  • 抖音创作者中心
  • 知乎
  • 阿里云盘

COPYRIGHT © 2023 litscorpi's博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang