元学习

Anki 与 Obsidian 联动

参考:

Obsidian_to_anki

从一个 Obsidian 笔记中寻找特定的格式,并读取到 Anki 中。

源码修改

目前,为了适配自己的更新需要,对 Obsidian to Anki 插件进行了修改。

在原始 Obsidian to Anki 的实现中,同步会对其他未提及的字段清零。为了让插件更新指定的字段,而不修改其他的字段,我们需要修改它的 Javascript 代码。

在插件目录 .obsidian/plugins/obsidian-to-anki-plugin 中,打开文件 main.js。可以注意到,几种 AbstractNote 的继承类的 .getFields 方法实现为:

    getFields() {
        let fields = {};
        for (let field of this.field_names) {
            fields[field] = "";
        }
        for (let line of this.split_text.slice(1)) {
            [line, this.current_field] = this.fieldFromLine(line);
            fields[this.current_field] += line + "\n";
        }
        for (let key in fields) {
            fields[key] = this.formatter.format(fields[key].trim(), this.note_type.includes("Cloze") && this.curly_cloze, this.highlights_to_cloze).trim();
        }
        return fields;
    }

函数内的第一个 for 循环将所有字段置为空字符串了,正因为此,更新会将未提及的字段清空。我们只需对插件做少量修改,就可以使得它不再更新空字符串:

    getFields() {
        let fields = {};
        // for (let field of this.field_names) {
        //     fields[field] = "";
        // }
        for (let line of this.split_text.slice(1)) {
            [line, this.current_field] = this.fieldFromLine(line);
            if (!fields.hasOwnProperty(this.current_field)) {
                fields[this.current_field] = "";
            }
            fields[this.current_field] += line + "\n";
        }
        for (let key in fields) {
            fields[key] = this.formatter.format(fields[key].trim(), this.note_type.includes("Cloze") && this.curly_cloze, this.highlights_to_cloze).trim();
        }
        return fields;
    }
BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表