Anki允许卡片使用JavaScript。例如,卡片可以包含以下内容:
<script>
//JavaScript code here
</script>
当显示卡片时,JavaScript代码将被执行。在
为了使这些脚本能够与Anki后端交互(例如,为了更改注释字段的值、添加标记、影响调度等),允许更大的灵活性,我想为Anki(版本2)编写一个插件,它将实现一些后端函数,并使卡的JavaScript脚本能够调用它们。在
例如,假设我的插件中有一个(Python)函数,它与Anki的对象交互:
^{pr2}$我希望能够允许cards的JavaScript调用该函数,例如在一个card中有这样的内容:
<script>
myFunc(); // This should invoke the plug-in's myFunc().
</script>
我知道如何添加钩子,以便各种Anki事件调用插件的函数,但我希望允许卡中的JavaScript这样做。这到底能做到吗?如果可以,那怎么办?谢谢!在
在阅读了@Louis链接的post之后,我与一些同事讨论了这个问题,并尝试了各种各样的方法,我终于想出了一个解决方案:
这个想法可以概括为以下两个要点(和两个次关键点):
插件可以创建一个或多个对象,这些对象将“公开”给cards的JavaScript脚本,这样card脚本就可以访问这些对象——它们的字段和方法——就好像它们是脚本作用域的一部分一样。在
以及
PyQt提供了将此类对象“注入”到webview的功能。在
下面的代码演示了如何实现这一点。它为卡片脚本提供了一种检查当前状态(“问题”或“答案”)以及访问(读取,更重要的是写入)注释字段的方法。在
就这样!安装了这样一个插件后,从卡中的JavaScript脚本可以使用插件对象状态检查它是作为问题的一部分运行还是作为答案的一部分运行(也可以通过用设置变量的脚本将问题部分包装在答案模板中来实现,但这样更简洁),pluginObject.field(name)从注释中获取字段的值(也可以通过使用Anki的预处理器将字段直接注入JavaScript代码来实现)和pluginObject.field(name,value)设置注释中某个字段的值(据我所知,目前还无法完成)。当然,许多其他功能可以被编程到我们的CardScriptObject中,以允许卡片脚本执行更多操作(读取/更改配置、实现另一个问答机制、与调度器交互等等)。在
如果有人能提出改进的建议,我很想听听。具体来说,我感兴趣的是:
相关问题 更多 >
编程相关推荐