〇、在Anki中创建一个空的选择题模板:
如上图, 通过工具菜单中的“管理笔记类型”命令打开笔记类型对话框,点击“添加”按钮添加一个“基础”类型类型的笔记,默认的名称类似于“基础-####”这样,点击重命名,将笔记类型的名称改为“选择题”或其他看着顺眼的名称,当然不改名也行。在“笔记类型”对话框左侧选择刚添加的笔记类型的名称,然后点击右边的“字段”按钮,即可添加所需的字段,添加完后可以将原来的字段删除;点击右边的“卡片”按钮,即可修改卡片模板的正面、背面和样式的模板。
一、字段设计
1、Question:选择题题干;
2、Options:选择题选项;
3、Answer:正确答案;
4、Extra:题目解析等附加信息。
二、目标
选择题计分规则为:单选正确得1分,错误得0分;多选如选择错误选项得0分,完全正确得2分,没有错误选项但是正确选项选择不完整(部分正确),所选的每个选项得0.5分。卡片正面显示题干和选项,选择选项后,点击显示答案进入背面,背面显示正确答案,累计得分,单多选题正确率等情况及解析信息。其中,正面显示的选项顺序随机排列,背面显示的选项顺序与正面要一致。正面和背面显示内容见以下图示。
正面:
背面
背面做错时:
三、实现分析
有个Monokai风格的选择题模板在windows系统里基本实现了上述功能,但不能跨平台,另外我原来下载的那个版本js代码也写得稀乱的(特别是选项组合部分,居然用字符串拼接而不用DOM操作),不过只要解决跨平台问题以及重新改写下js代码就可以达到目的了。实现以上功能的关键在于将做练习时在正面所选择的选项以及正面显示的选项顺序传递到背面,此外还需要在整个一次练习中共享已做练习数量、已做练习正误情况及得分等信息。要在记忆卡正面和背面以及不同练习题之间共享信息,就需要将这些信息用js脚本持久化。而不同平台(windows、mac、android、ios、linux等)对js对象持久化的支持并不统一,anki本身在不同平台上的实现在对卡片的解析方式也不统一,Anki的android客户端没有持久化的窗口属性,而桌面客户端不允许使用sessionStorage属性,对于linux和mac 2.1客户端,还需要额外的考虑:window属性,在审查模式下是持久的,在预览模式下是存在的--但不是持久的。github上有一个项目anki-persistence,提供了兼容各种平台实现anki中js对象持久化的功能,作者为Simon Lammer。该脚本内容如下:
// v0.5.3 - https://github.com/SimonLammer/anki-persistence/blob/7107e73086189c190c4d326ef11ebbcded9a08c6/script.js
if (void 0 === window.Persistence) {
var _persistenceKey = "github.com/SimonLammer/anki-persistence/",
_defaultKey = "_default";
if (window.Persistence_sessionStorage = function() {
var e = !1;
try {
"object" == typeof window.sessionStorage && (e = !0, this.clear = function() {
for (var e = 0; e < sessionStorage.length; e++) {
var t = sessionStorage.key(e);
0 == t.indexOf(_persistenceKey) && (sessionStorage.removeItem(t), e--)
}
}, this.setItem = function(e, t) {
void 0 == t && (t = e, e = _defaultKey), sessionStorage.setItem(_persistenceKey + e, JSON.stringify(t))
}, this.getItem = function(e) {
return void 0 == e && (e = _defaultKey), JSON.parse(sessionStorage.getItem(_persistenceKey + e))
}, this.removeItem = function(e) {
void 0 == e && (e = _defaultKey), sessionStorage.removeItem(_persistenceKey + e)
})
} catch (e) {}
this.isAvailable = function() {
return e
}
}, window.Persistence_windowKey = function(e) {
var t = window[e],
i = !1;
"object" == typeof t && (i = !0, this.clear = function() {
t[_persistenceKey] = {}
}, this.setItem = function(e, i) {
void 0 == i && (i = e, e = _defaultKey), t[_persistenceKey][e] = i
}, this.getItem = function(e) {
return void 0 == e && (e = _defaultKey), void 0 == t[_persistenceKey][e] ? null : t[_persistenceKey][e]
}, this.removeItem = function(e) {
void 0 == e && (e = _defaultKey), delete t[_persistenceKey][e]
}, void 0 == t[_persistenceKey] && this.clear()), this.isAvailable = function() {
return i
}
}, window.Persistence = new Persistence_sessionStorage, Persistence.isAvailable() || (window.Persistence = new Per