对兼容各操作系统的Anki选择题模板的更新——提供更方便的笔记修改功能

公告:因为不少人居然不能从本文复原出完整运行环境,屡次要求发电子邮件传资源,我已经将本文所有资源(包括模板apkg文件、修改过的插件、用到的js库以及使用说明)打包上传到CSDN,资源名大概是兼容各操作系统选择题模板,找2025年上传的,以前年度上传的功能不够完善,但是CSDN说要找客服才能删,所以我就懒得删掉以前的了,请各位需要资源的自行下载。

经过一段时间的使用和更新,此模板基本可以定稿了。将此文完全重写。

20240808完善最后一个小功能:选择文字清除格式后,很大概率会将所选择的文字修改为另外的格式,因此,点击清除格式按钮后最好能保持原来的选区。由于range.createContextualFragment()函数对于不包含HTML元素标签的文本不会做出任何修改,因此,选择最里层的某个标签里的部分文字后点击“清除格式”必须手工在选区前后分别插入所在元素的结束标签和开始标签,但是这样就破坏了原有的文档结构,导致range破坏,选区丢失。为了解决这个问题,在手工插入所在元素的结束标签和开始标签时再多插入一对自定义的标签(代码中取名tmpele),这样,在完成编辑字段的HTML替代后可以轻松找到自定义的结点,再使用range.selectNode即重新选择了原有选区。至于插入的自定义标签,它会在clearFormat函数中被清除,并不会污染笔记。

现在还有一个问题需要解决:复习界面点击编辑按钮进入编辑界面编辑笔记后,回到复习界面,成绩统计的总做题数量、单选题或多选题数量、得分等信息会发生变化。当然,这并不影响模板的使用,不过成绩统计会出现误差。这应该要通过修改插件给笔记提供更多可以区别是复习界面还是编辑界面的信息来解决,暂时还没有找到途径。

解决复习界面点击编辑按钮进入编辑界面编辑笔记后,回到复习界面时成绩统计信息出错的问题:这个稍微要增加点复杂度了主要是插件改动比较大。

1)在插件的__init__.py文件同一目录下创建reload.py,内容如下:

class Reload:
	isEditor = 'no'
	
reload = Reload()

上面这个类主要是提供一个保存是否进入过编辑界面编辑笔记的对象。直接在__init__.py文件中定义变量来保存这个信息在重新载入笔记时变量值被重新初始化了,所以只能用对象来保存。

2)在__init__.py文件中导入这个对象,为了清楚表示添加代码的位置,以编辑器截图表示(行号仅供参考,主要根据上下文确定添加位置,因为我在插件文件中添加了一些用不到的测试代码,行号与原始插件文件的行号不完全相同了。方框中的是添加的代码):

3)继续修改__init__.py文件,将是否进入编辑界面编辑笔记的信息传递给webview:

4)继续修改__init__.py文件,处理是否进入编辑界面编辑笔记的信息的修改。在on_js_message(handled, url, context)函数中添加:

5)继续修改__init__.py文件,给webview修改reload.isEditor提供接口:

插件端的修改完成了。在笔记模板上的修改比较简单,仅需将原来的背面内容模板中的

calcScore();

替换为:

var isEditor = $(contenteditable).data('iseditor');
//仅在不是从编辑界面回到复习界面时计算成绩,如果是从编辑界面回到复习界面,重置插件中的标志值
if(isEditor === 'no'){
	calcScore();
} else {		
	pycmd('ankisave!isEditor#');
}

当然,背面模板内容也可以直接复制下面的背面模板内容代码。

如果觉得以上1)~5)对插件的修改太复杂,可以用下面插件文件修改较少的方案(这个方案应该更好,为了保留一种思路,就不删除上面的方案了)。这个方案插件文件只需象上述第5)项修改那样添加一个setIsEditor钩子处理函数(也许改名为setCalc更贴切),并勾住webview_will_set_content,无需做第1)和第3)、4)步,第2)步只需引入Editor类,第5)步参考如下代码修改:

def setCalc(web_content, context):
    """进入编辑界面修改了笔记,调用Javascript将成绩计算标志设置为false"""
    if isinstance(context, Editor):
        mw.reviewer.web.eval("""
        	Persistence.setItem(`${deck}.calc`,false);
        """)
        return

gui_hooks.webview_will_set_content.append(setCalc)

在Anki卡片中,正面内容模板里增加初始化一个计数器,背面内容模板对calcScore函数调用逻辑重新做以下修改,修改后的代码均在下面更新了。插件文件的修改也在下面增添了一个截图。

1、模板字段:

2、安装Anki插件Edit Field During Review(安装ID:1020366288,以下简称插件),此插件支持在复习界面(Review)修改笔记(此模板中一条笔记就是一道选择题)。为了扩展该插件以充分发挥此模板的功能,需参照以下截图中行号所表示的位置及标记内容修改插件源代码(需要说明的是,如果没有在复习界面修改笔记的需求,也可以不安装和修改这个插件,不影响整个选择题模板的使用):

上面的修改使插件可以向笔记页面中使用了edit过滤器的字段传递牌组名。

上面的修改使插件支持在笔记页面中使用了edit过滤器的字段中插入HTML代码修改笔记,例如可以在其中用<table>标签插入表格,而无需进入编辑界面。在未做此项修改前,该插件仅支持在使用了edit过滤器的字段中添加和删除文本。

上面的修改配合笔记卡片正面内容模板为用户改变是否启用随机重排选项后立即更新笔记提供支持。

上面的修改使从编辑界面修改笔记后返回复习界面时不会计算成绩导致成绩统计出现错误。

3、下载Anki的跨平台持久化存储模块,并保存到%APPDATA%/anki2/anki登录用户名/collection.media文件夹中,下载地址:GitHub - SimonLammer的Anki持久化模块,文件名修改为“_ankiPersistence.js”,注意以下划线开头。

4、下载jquery的高亮标记模块,下载地址:jquery高亮标记模块,可选择下载jquery.mark.es6.min.js,然后保存到%APPDATA%/anki2/anki登录用户名/collection.media文件夹中,文件名修改为“_jquery.mark.es6.js”,注意以下划线开头。

5、模板的运作模式:

1)选项可以选择用拉丁字母编号还是罗马数字编号。此模板会随机重排笔记中的选项,如果笔记中本来使用了拉丁字母编号,并且解析字段中的内容提到了选项A如何如何,那么继续在笔记页面使用拉丁字母为选项编号就会造成混乱,因此提供这个选项。模板可根据笔记中答案的长度自行判断笔记为单选题还是多选题,单选题只能选择一个选项,因鼠标误击选择选项后再次点击即可取消该选项的选择。

小更新:为了满足不随机重排选项顺序的需求,将是否随机重排选项交由用户选择:

2)利用跨平台持久化技术,统计出一次练习的累计成绩信息,而不是只计算当前题目的成绩,并以不同的样式直观显示正确答案及回答情况。

3)提供复习界面修改笔记字段的功能。除使用键盘增加删除可编辑字段的文本及使用HTML代码插入带格式的内容及图片、表格和多媒体内容外,还提供了几个快速样式修改按钮,可以更方便地修改笔记的字段。

4)对动态调整的选项和正确答案,可以通过点击按钮将其显示后再进行修改。

5)如果解析内容较长,可以在解析区快速搜索到感兴趣的内容并使其高亮,但如不希望笔记重新载入时显示高亮标记(即高亮样式不被笔记保存),搜索完后应清空搜索框或者选择高亮内容点击清除格式。

6)如一次练习时做了不同牌组的练习题,各牌组的成绩独立统计,互不影响。

以下是此模板的完整代码,其中有较详尽的注释。

正面内容模板:

<!--正面内容模板-->
<!--导入持久化模块,注意文件名与保存到%APPDATA%/anki2/anki登录用户名/collection.media文件夹中的文件名一致-->
<script src='_ankiPersistence.js'></script>

<div class='tooltip'>
<span class='tooltiptext' style='width:150%;'>选择此选项,选择题选项的编号为罗马数字,否则为拉丁字母。</span>
	<input type='checkbox' id='roman' onchange='changeRoman(this)' class='tooltip'>	
		使用罗马数字为选项编号	
	</input>
</div>
<div class='tooltip'>
<span class=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yivifu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值