用anki完成题库后,在翻看卡片复习时,可能想修改卡片的某个字段的内容。在不使用插件的情况下,只能点击复习界面下的编辑按钮进入编辑界面来完成编辑工作,编辑完成后又要恢复复习。anki插件Edit Field During Review(安装代码:1020366288)可以简化这一编辑过程。安装这个插件后,只要在卡片的模板中插入字段时在字段前面添加“edit”过滤器,例如笔记中包含字段extra,模板中需要插入extra字段的地方用“{{edit:extra}}”代替“{{extra}}”,即可将该字段变成复习时可编辑字段。也就是说,在复习界面想修改extra字段的内容,无需再点击“编辑”按钮,直接用鼠标点击extra字段内容区域,即可进行修改。
该插件的原理是利用gui_hooks为webview_did_receive_js_message消息添加处理函数触发插件运行,为字段过滤器field_filter钩子添加处理函数,在过滤器处理函数中为复习时可编辑字段添加处理blur事件的js函数,通过js函数执行pycmd("ankisave#" + $(this).data("field") + "#" + $(this).data("nid") + "#" + $(this).html())保存用户所做的修改。
安装Edit Field During Review插件后,虽然编辑已经方便很多,但还有可改进之处。例如《兼容各操作系统平台的Anki选择题库模板》一文中的题库,复习时如果想对解析内容中的某些文字修改字体或颜色,那么还是要按编辑按钮进入编辑界面才能进行。如果可以在复习界面编辑时使用html,那么我们直接将要修改字体的内容包在font标签或者带有class属性的span标签中(后者无疑更好)即可,无疑更加方便。然而原始插件不支持直接用html编辑。分析插件源代码后,发现只要将插件的saveField方法稍作修改即可实现支持html的功能,在note[fld] = txt这行代码之后再增加两行:
note[fld] = note[fld].replace('<','<')
note[fld] = note[fld].replace('>','>')
修改后的saveField函数如下:
def saveField(note, fld, val):
if fld == "Tags":
tagsTxt = unicodedata.normalize("NFC", htmlToTextLine(val))
txt = mw.col.tags.canonify(mw.col.tags.split(tagsTxt))
field = note.tags
else:
# https://github.com/dae/anki/blob/47eab46f05c8cc169393c785f4c3f49cf1d7cca8/aqt/editor.py#L257-L263
txt = urllib.parse.unquote(val)
txt = unicodedata.normalize("NFC", txt)
txt = mungeHTML(txt)
txt = txt.replace("\x00", "")
txt = mw.col.media.escapeImages(txt, unescape=True)
field = note[fld]
if field == txt:
return
config = mw.addonManager.getConfig(__name__)
if config['undo']:
mw.checkpoint("Edit Field")
if fld == "Tags":
note.tags = txt
else:
note[fld] = txt
#以下两行代码为自行添加的代码
note[fld] = note[fld].replace('<','<')
note[fld] = note[fld].replace('>','>')
note.flush()
当然,在给note[fld]赋值前修改txt理论上应该效率更高(因为反复读写对象属性值的效率理论上不如直接修改变量值的效率高),也就是说上述修改的else块中的代码改成下面这样:
txt = txt.replace('<','<')
txt = txt.replace('>','>')
note[fld] = txt
关于anki插件开发的文档非常少,官方文档也非常薄弱,很难找到note、card、field等对象的完整说明,分析anki源代码未免太费精力,通过阅读现成插件的源代码来学习anki插件开发是一个不错的途径。
后记:对这篇文章感兴趣又觉得不太直观看不明白的同学,这里有视频演示:anki插件edit field during review的安装、使用和改造(anki插件edit field during review的安装、使用和改造_哔哩哔哩_bilibili)
补充:结合这个插件以及笔记卡片的样式,可以找到一种更高效的在review(复习)界面修改卡片中某些文字样式的方法。我们可以在笔记卡片的样式中将b,i,u,a,q等一个字母的html元素的样式定义为将要经常采用的样式,这样,在review界面利用这个插件修改文字样式时,输入量最少。而且,Anki的卡片编辑界面上有b,i,u三个按钮,预先将这三个元素定义为将要经常采用的样式,在编辑界面修改文字样式可以通过选择文字后点击这些按钮来完成,操作同样更加高效。