创建一个支持切换阅读模式和答题模式的Anki问答题模板

为了备考某个需要默写的科目,做了个问答题笔记模板,如下:
笔记正面
在上图的回答栏填写答案后,点击显示答案按钮转到背面:
笔记背面
只实现上面的功能是很简单的,直接基于Anki自带的问答题模板添加自己需要的字段即可。问题是在学习的初期阶段,答案基本上很难写对,所以想在正面直接阅读正确答案,在比较熟悉后再开始回答。这就需要让这个问答题模板支持“阅读”和“答题”两种模式,而且最好在笔记页面提供随时切换的功能。
一顿操作猛如虎,对模板做了一番修改后,终于支持了阅读模式和答题模式的切换。其中的持久化模块依然用的Simon Lammeranki-persistence脚本,该脚本可以兼容WindowsLinuxmacOS、安卓、iOS等常见平台,实现在Anki牌组卡片之间持久化保存信息,该项目发布于github,可以在github搜索该项目以保持版本的更新。修改后的笔记功能如以下图片所示:
改造后的笔记正面:答题模式
改造后的笔记正面:阅读模式
改造后的笔记背面

改造后的笔记正面、背面模板和样式文件附后。其中样式文件包含了很多自带模板中的信息,我并未清理,只是添加了一些自己需要的内容。有一点需要说明的是,下面的代码:

<div class="h1  yleft";align=left>{{FrontSide:type:答案}}</div>

会在笔记背面显示出用户在正面输入的答案以及笔记中保存的正确答案,通过css选择器code#typeans::before 可以将用户在正面输入的答案前面加上“你输入的答案”作为提示,但是花了一段时间查阅文档,没有找到如何选择笔记保存的正确答案的css选择器,希望高手指导。

正面模板:

<script>
// 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 Persistence_windowKey("py")),!Persistence.isAvailable()){var titleStartIndex=window.location.toString().indexOf("title"),titleContentIndex=window.location.toString().indexOf("main",titleStartIndex);titleStartIndex>0&&titleContentIndex>0&&titleContentIndex-titleStartIndex<10&&(window.Persistence=new Persistence_windowKey("qt"))}}</script>
<script>
	var myinfo = Persistence.getItem();
   if (myinfo == null) {
      myinfo = { model:'answer',};
		Persistence.setItem(myinfo);
   	}else{
		let back = document.getElementById('back');
		let btnToggle = document.getElementById('btnToggle');
		let answer = document.getElementById('answer');
		if (myinfo.model == 'answer'){
			btnToggle.value = '答题模式';
			back.style = 'display:none';
			answer.style = 'display:bolck';
		}else{
			btnToggle.value = '阅读模式';
			back.style = 'display:bolck';
			answer.style = 'display:none';
		}
	}
	function toggleModel(){
		let obj = event.currentTarget;
		let back = document.getElementById('back');
		let answer = document.getElementById('answer');
		if (myinfo.model == 'answer'){
			myinfo.model = 'read';
			obj.value = '阅读模式';
			back.style='display:bolck';
			answer.style = 'display:none';
		}
		else{
			myinfo.model = 'answer';
			obj.value = '答题模式';
			back.style='display:none';
			answer.style = 'display:block';
		}
		Persistence.setItem(myinfo);
	}
</script>
<div><a>说明:</a><q>当前模式如下方按钮所示。点击下方按钮可在阅读模式和答题模式之间切换。</q></div>
<div align="center">
<input id='btnToggle' type='button' onclick='toggleModel()' value='答题模式'></input></div>

<hr class="separator" />
<div class="h1 xcolor xleft">
	<span></span>	问题
		<span id="time">
	</span>
</div>
<div class="h2 xleft" align=left>{{edit:问题}}</div>
<hr class="separator" />

<div class="slide">
	<div class="h1 ycolor yleft">
	<span>👉</span>	口诀
	</div>
	<div class="h3  yleft";align=left>{{edit:口诀}}</div>
</div>
<hr class="separator" />

<div id='answer' class="h1 ycolor xleft" style='display:block'>
	<span class="yimg">✍️</span>	回答<br><br>
	{{type:答案}}	
	<hr class="separator" />
</div>

<div id='back' style='display:none'>
	<div class="h1 ycolor yleft">
		<span>👍</span>	正确答案
	</div>
	<div class='normal'>{{edit:答案}}<div>

	<hr class="separator" />
	<div class="h1 ycolor xleft md-content">
		<span></span>备注
	</div>
	<div class='normal'>{{edit:备注}}<div>
</div>

背面模板:

<div class="h1 xcolor xleft">
	<span></span>	问题
		<span id="time">
	</span>
</div>
<div class="h2 xleft" align=left>{{FrontSide:问题}}</div>
<hr class="separator" />

<div class="slide">
	<div class="h1 ycolor yleft">
	<span>👉</span>	口诀
	</div>
	<div class="h3  yleft";align=left>{{FrontSide:口诀}}</div>
</div>
<hr class="separator" />
<div class="slide">
	<div class="h1 ycolor yleft">
	<span>👉</span>	答案对比
	</div>
	<div class="h1  yleft";align=left>{{FrontSide:type:答案}}</div>
</div>


<hr class="separator" />
<div class="h1 ycolor xleft md-content">
	<span></span>备注
</div>
<div class='normal'>{{edit:备注}}<div>

样式文件:

@import url("_editor_button_styles.css");

/* ----------调用字体---------- */

@font-face { font-family: yh; src: url('_FZYHJW.ttf'); }
@font-face { font-family: times; src: url('_times.ttf'); }


/* ----------各种样式---------- */

body { background-color: #fff; color: black; }
.card {
     font: 20px/30px 'Aa可爱の日系中文2万字';
	background-color:#fff;
	#background-image: url(_bg.png);
	#background-size:100%;
}

.h1 { font: 22px/22px 'Aa可爱の日系中文2万字'; padding: 0.3em 0em 0.3em 0.5em; }
.h2 { font: 20px/30px '干就完事了简'; padding: 0.3em 0em 0.3em 0.5em; }

.xleft { border-left: 3px solid #ec6c4f; }
.yleft { border-left: 3px solid #338eca; }
.zleft { border-left: 3px solid #4c991b; }

.xcolor { color: #ec6c4f; }
.ycolor { color: #338eca; }
.zcolor { color: #4c991b; }

.ximg { background: url(_x-day.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }
.yimg { background: url(_y-day.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }
.zimg { background: url(_z-day.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }

.hint { color: #333; }


/* ---------- 其他调整 ---------- */

a { color: #666; }
img { max-width: 100%; vertical-align: middle; }
	.chrome img { max-width: 100%; vertical-align: middle; }
ul,ol { margin-top: 0em; }
li { margin-left: -0.5em; }
i { font-family: palatino; padding: 0 3px 0 0; }
u { text-decoration: none; background-color: #ffff75; border-bottom: 2px solid #ec6c4f; }
hr { height: 1px; width: 100%; display: block; border: 0px solid #fff; vertical-align: middle; margin:5px 0px 10px 0px; background-color: #ccc;}
#time { font-family: yh; float: right; } 


/* ----------夜间模式(Android)---------- */

body.night_mode { background-color: #232323; color:#727272; }
.night_mode .card { background-color: #232323;  color:#727272; }

.night_mode .xleft { border-left: 3px solid #a0a0a0; }
.night_mode .yleft { border-left: 3px solid #a0a0a0; }
.night_mode .zleft { border-left: 3px solid #a0a0a0; }

.night_mode .xcolor { #font-weight: bold; color:#a0a0a0; }
.night_mode .ycolor { #font-weight: bold; color:#a0a0a0; }
.night_mode .zcolor { #font-weight: bold; color:#a0a0a0; }

.night_mode .ximg{ background: url(_x-night.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }
.night_mode .yimg{ background: url(_y-night.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }
.night_mode .zimg{ background: url(_z-night.svg); background-size: 100%; background-repeat: no-repeat; background-position: center; }

.night_mode .hint { color: #727272; }
.night_mode u { color: #a0a0a0; background-color: #505050; border-bottom: 2px solid #5f5f5f; }
.night_mode img { filter: alpha(opacity=30); opacity:0.3;  filter:invert;}
.night_mode audio { filter: alpha(opacity=30); opacity:0.3; }
.night_mode hr { background-color: #484848; }


/* ----------动画效果---------- */

.slide { position: relative; -webkit-animation: slide 1s 0s; -webkit-animation-fill-mode: forwards; }

@-webkit-keyframes slide {
	0%	{ opacity: 0  ; top: 100px; }
	50%	{ opacity: 0.8; top: -10px; }
	100%	{ opacity: 1.0; top: -3px; }
}
.color1,q{
	font-weight:bold;
	color:red;
}
.color2,a,a:link,a:visited,a:hover,a:active{
	font-weight:bold;
	color:blue;
	text-decoration:none;
}
.color3,i{
	font-weight:bold;
	color:rgb(230,12,237);
}
.separator{
	border:none;
	border-top-width:0.3em;
	border-top-style:solid;
	border-top-color:#aaa;
	margin:1.2em 0 1.2em 0;
}
.normal{
	text-indent:2em;
	font: 22px/22px 'Aa奶糖油画体','干就完事了简';
	line-height:1.5em;
}
.h3{
	font-family:"Aa奇思胖丫儿";
	color:green;
	background:yellow;
}
b{
	font-size:1.2em;
	-webkit-text-stroke:0.01em #0f0;
}

q::before,q::after{
	content:"";
}
#btnToggle {
    background-color: #4CAF50; /* Green */
    border: none;
    color: yellow;
    padding: 0.3em;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 1.2em;
	 border-radius:0.5em;
	 box-shadow: 0.1em 0.15em teal;
}
/*输入答案正确时的样式*/
.typeGood{
 	background-color:transparent; /*transparent:透明*/
}
/*输入答案错误时的样式*/
.typeBad{
	background-color:#ff0;
}
/*输入答案缺少的内容的样式*/
.typeMissed{
 background-color:pink;
}

code#typeans {font-family: "Aa虎头虎脑"; }
code#typeans::before {
	content:"你输入的答案:";
	color:#33c;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/673127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式工程师人生提质的十大成长型思维分享

大家好,作为一名嵌入式开发者,很多时候,需要考虑个人未来的发展,人生旅途复杂多变,时常面临各种各样的挑战。如何在这个复杂多变的社会中稳步向前,不断成长,成为每个人都应该思考的问题。实际上,思维方式的差异决定我们应对挑战的能力与成长的速度。 第一:寻找自我坐…

Linux CPU占用高问题

1、top命令和历史系统监控找出持续占用CPU的top5进程。 # top -c 依次按键盘键b->x&#xff0c;按照CPU由高到底排序。shiftP和shiftM切换使用CPU和内存的排序 # top -Hp pid 查看进程中所有线程的占用情况 # top -Hp 1124 -n 1 -b | awk {print $NF} | sort | uniq -c |…

Python | 自动探索性数据分析(EDA)库SweetViz

SweetViz是一个开放源代码Python库&#xff0c;主要用于生成精美的高密度可视化文件&#xff0c;启动探索性数据分析&#xff08;EDA&#xff09;&#xff0c;输出为完全独立的HTML应用程序。 探索性数据分析&#xff08;EDA&#xff09;是分析和总结数据集主要特征的过程&…

pytorch学习笔记5

transform 本质上作用是将图片通过transform这个这个工具箱获取想要的结果 tensor就是一个包含神经网络需要的一些理论基础的参数 from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from PIL import Image #tensor数据类型 #通过tra…

Linux系统上的磁盘扩展总结

目录 一、前言 二、相关基础知识 &#xff08;1&#xff09;术语理解 &#xff08;2&#xff09;相关命令学习 1、磁盘管理相关命令 2、LVM管理相关命令 三、磁盘操作场景汇总 &#xff08;1&#xff09;添加新硬盘后挂载到已有目录进行扩容 &#xff08;2&#xff09…

Python 二叉数的实例化及遍历

首先创建一个这样的二叉树&#xff0c;作为我们今天的实例。实例代码在下方。 #创建1个树类型 class TreeNode:def __init__(self,val,leftNone,rightNone):self.valvalself.leftleftself.rightright #实例化类 node1TreeNode(5) node2TreeNode(6) node3TreeNode(7) node4Tre…

【数据结构与算法】七大排序算法(下)

【数据结构与算法】七大排序算法(下) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 2.3 交换排序 2.3.1 冒泡排序 2.3.2 快速排序 2.3.3 快速排序(非递归) 2.4 归并…

【一刷《剑指Offer》】面试题 30:最小的 k 个数

牛客对应题目链接&#xff1a;最小的K个数_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a; topK 问题。 一、《剑指Offer》内容 二、分析题目 1、排序&#xff08;O(Nlo…

数据结构之二叉搜索树(TreeSetTreeMap)

目录 一.搜索树 1.1概念 1.2适用场景 2.二叉搜索树的基本操作 2.1二叉搜索树的定义 2.2查找 2.1.1基本思路 2.3插入 2.3.1基本思路 2.4删除 2.4.1基本思路 2.5遍历 2.6性能分析 二.TreeSet Map和Set 1.概念 2.模型 1.定义 2.基本操作 三.TreeMap 1.定义 2.基…

C语言笔记第9篇:字符函数和字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数&#xff0c;接下来我们就学习一下这些函数。 一、字符函数 1、字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;…

MyBatis一、MyBatis简介

MyBatis一、MyBatis简介 MyBatis 简介MyBatis 定义MyBatis 历史MyBatis 特性1. 灵活性和易用性2. 性能优化3. 易于集成4. 支持多种数据库5. 插件机制6. 其他特性 MyBatis 下载和其他持久化层技术对比 MyBatis 简介 MyBatis 定义 MyBatis 是一个优秀的持久层框架&#xff0c;它…

240602-通过命令行实现HuggingFace文件上传

A. 登录显示 A.1 MacOS A.2 Windows B. 操作步骤 B.1 操作细节 要通过命令行将文件上传到 Hugging Face&#xff0c;可以使用 huggingface-cli 工具。以下是详细步骤&#xff1a; 安装 huggingface_hub 包&#xff1a; 首先&#xff0c;确保已经安装了 huggingface_hub 包。可…

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…

Wpf 使用 Prism 开发MyToDo应用程序

MyToDo 是使用 WPF &#xff0c;并且塔配Prism 框架进行开发的项目。项目中进行了前后端分离设计&#xff0c;客户端所有的数据均通过API接口获取。适合新手入门学习WPF以及Prism 框架使用。 首页统计以及点击导航到相关模块功能待办事项增删改查功能备忘录增删改查功能登录注册…

跨模型知识融合:大语言模型的知识融合

大语言模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&a…

7-18 对象关系映射(orm_name)---PTA实验C++

一、题目描述 一开始看到对象关系映射&#xff0c;其实我是拒绝的。这三个词凑一块&#xff0c;能是给C初学者的题吗&#xff1f; 再仔细读需求&#xff0c;才发现在课设项目已经用过这功能。Object Relational Mapping&#xff08;ORM&#xff09;就是面向对象&#xff08;O…

大降分!重邮计算机专硕复试线大降50分!重庆邮电计算机考研考情分析!

重庆邮电大学&#xff08;Chongqing University of Posts and Telecommunications&#xff09;简称重邮&#xff0c;坐落于中国重庆市主城区南山风景区内&#xff0c;是中华人民共和国工业和信息化部与重庆市人民政府共建的教学研究型大学&#xff0c;入选国家“中西部高校基础…

【30天精通Prometheus:一站式监控实战指南】第13天:graphite_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

企业im即时通讯WorkPlus私有化部署适配国产信创环境

在信息化时代&#xff0c;高效的沟通和协作对于企业的运营至关重要。企业IM即时通讯平台提供了一种便捷、实时的沟通工具&#xff0c;旨在改善企业的内部和外部沟通效率。然而&#xff0c;随着企业对数据安全性和隐私保护的要求不断提高&#xff0c;许多企业开始选择私有化部署…

【Qt知识】disconnect

在Qt框架中&#xff0c;disconnect函数用于断开信号与槽之间的连接。当不再需要某个信号触发特定槽函数时&#xff0c;或者为了防止内存泄漏和重复执行问题&#xff0c;你可以使用disconnect来取消这种关联。disconnect函数的基本用法可以根据不同的需求采用多种形式&#xff0…