【Bases】通过 Templater 插件自动为笔记创建及插入 base

好像没注意到有能自动创建脚本的插件,有空闲基于 Templater 适当借助 AI 写了个,现在分享出来。模版的自定义程度挺高,搞懂后理论上可以依据任意类型的笔记,通过不同带 base 模版创建不同的 base 数据库。
PixPin_2025-10-28_17-02-33

前排提示:推荐熟悉 Templater 插件,有一定代码基础的尝试,有点小复杂。

模版功能简单介绍:依据当前打开笔记的类型(需要 yaml 区有 type 属性),分别选择不同模版来为当前笔记创建同名 base 文件,并放到指定的路径下,之后在当前的笔记里插入该 base 的链接。

如何使用

把后面提到的 base 模版及 Template 脚本拷贝一份到你的笔记库,适当配置一下就能使用了。

base 模版

提供一个 模版.base 模版示例:

filters:
  and:
    - type.contains(link("Resources"))
views:
  - type: table
    name: Resources
    filters:
      and:
        - categories.containsAny("?")
    order:
      - file.name
      - created
      - categories
      - tags
    sort:
      - property: created
        direction: DESC
    columnSize:
      file.name: 307
      note.created: 161

模版.base 里的 "?" 在调用脚本后会替换成当前笔记的链接。

Template 脚本

直接把以下 Template 脚本保存到你的模版文件夹路径(Template folder location)下,并记得把代码里的路径或名称修改成你自己的:
templateName:你的 base 模版的名称。
targetPath:base 笔记的默的存放位置。

<%*
// 创建 Base 文件的脚本
async function createBaseFileFromTemplate() {
    // 获取当前活动笔记
    const activeFile = app.workspace.getActiveFile();
    if (!activeFile) {
        new Notice("❌ 请先打开一个笔记");
        return;
    }
    
    // 读取当前笔记内容
    const content = await app.vault.read(activeFile);
    const frontmatter = app.metadataCache.getFileCache(activeFile)?.frontmatter;
    
    if (!frontmatter?.type) {
        new Notice("❌ 当前笔记没有定义 type 属性");
        return;
    }
    
    const noteTitle = activeFile.basename;
    let templateName, targetPath, baseType;
    
    // 根据 type 属性确定模板和路径
    if (frontmatter.type.includes("[[Knowledge]]")) {
        templateName = "Knowledge 模版.base";
        targetPath = "80-Functions/Bases/Categories Bases/knowledge/";
        baseType = "knowledge";
    } else if (frontmatter.type.includes("[[Resources]]")) {
        templateName = "Resources 模版.base";
        targetPath = "80-Functions/Bases/Categories Bases/resources/";
        baseType = "resources";
    } else {
        new Notice("❌ 不支持的笔记类型: " + frontmatter.type);
        return;
    }
    
    try {
        // 读取模板文件
        const templateFile = app.vault.getFiles().find(file => 
            file.name === templateName
        );
        
        if (!templateFile) {
            new Notice(`❌ 找不到模板文件: ${templateName}`);
            return;
        }
        
        const templateContent = await app.vault.read(templateFile);
        
        // 替换模板中的 "?" 为笔记链接
        const baseContent = templateContent.replace(/\?/g, `[[${noteTitle}]]`);
        
        // 创建 base 文件名和路径
        const baseFileName = `${noteTitle}.base`;
        const fullPath = targetPath + baseFileName;
        
        // 修复:检查目标路径是否存在(移除尾随斜杠)
        const targetDir = targetPath.replace(/\/$/, ''); // 移除尾随斜杠
        const targetFolder = app.vault.getAbstractFileByPath(targetDir);
        if (!targetFolder) {
            await app.vault.createFolder(targetDir);
        }
        
        // 创建 base 文件
        await app.vault.create(fullPath, baseContent);
        
        // 在当前笔记中插入 base 文件链接
        const baseLink = `![[${baseFileName}]]`;
        const newContent = content + `${baseLink}`;
        await app.vault.modify(activeFile, newContent);
        
        new Notice(`✅ 成功创建 ${baseType} base 文件: ${baseFileName}`);
        
    } catch (error) {
        new Notice(`❌ 创建 base 文件失败: ${error.message}`);
        console.error(error);
    }
}
    
// 执行脚本
createBaseFileFromTemplate();
%>

配置好之后,通过左方工具栏的 Templater button,或者 Ctrl + P 输入 Templater:Open insert template modal 命令来调用该脚本,就能在为当前文件生成 base,并插入到当前笔记了。
注意:如果你的笔记的 yaml 没有 type 属性,那么无法生成 base,在我的 sample 里 type[[Knowledge]][[Resources]] ,是个链接。你可以去掉这部分代码或者改成你自己喜欢的属性。