function showOptions() {
// {{{3 获得选项列表, 结果存到mc.list和a中(两者存的一样), 已置. 这一部分的重点是item有什么
// document.getElementById("answer").parentNode.innerHTML += "<div style='color:#ff233f;font-size:9px;font-weight:bolder;margin:15px;text-align:right;'></div>"; // 觉得没用, 试了试也没用
mc.answer = document.getElementById("answer").innerHTML; // 答案字符串
var b = document.getElementById("optionList"), // b 是指向 optionList
list = [], // 我感觉这个变量声明在a要用的地方也可以
a = (mc.list.length ? mc.list : ((list = document.getElementById("options").innerHTML.split("|").map(function (v) { // example: A.证明社会主义革命可能在一国或数国首先取得胜利|B.适应无产阶级实际斗争的要求
var item = {
content: v.slice(2), // example: 证明社会主义革命可能在一国或数国首先取得胜利
id: v.slice(0, 1) // example: A
};
if (mc.answer.indexOf(item.id) != -1) item.is_right = 1; // item.is_right, 是否是正确答案, mc.answer 查找看 id 是否能查找到
return item
})), list.sort(function () { // , 之前是 a 定义结束, a 和 list 和 mc.list 是一回事
return Math.random() > 0.5 ? 1 : -1
}))), // a 和 list存的是置乱的列表. a 和 list 是同一个
c;
mc.list = a;
// {{{3 optionList的innerHTML的设置
for (c in a) b.innerHTML += "<li onclick='toggle(this)'><input type='$t' name='options' id='$id' onclick='toggle(this.parentNode)' /><label>$label</label></li>".replace("$id", a[c].id).replace("$label", a[c].content).replace("$t", 1 === mc.answer.length ? "radio" : "checkbox"); // 插入 li 节点, li 内部是 input 和 label. 单选 type 是 radio, 多选是 checkbox. label 是显示内容, id 替换为本来的 id ((ref:cnasa))
// {{{3 替换jiexi字符串, 设置answer2
var right = '', // 正确选项字符串, 用于显示在答案栏, 存的是不是正确的ABCD, 而是置乱后, 其实就是正确选项在置乱后的列表的index转为字母
wrong = '', // 错误选项字符串, 这个似乎没用上
zimu = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], // 其实会用上的, 也就是答案数目, 应该不超过 D
jiexi = document.getElementById("jiexi").innerHTML;
for (var i in mc.list) { // 这里 i 是 indexx
if (mc.list[i].is_right) {
right += zimu[i]; // right 和 answer 并不一样, 比如原答案是 A, B, 置乱后, 放在了 C, D 的位置上, 那么 right 存的是 zimu[2] 和 zimu[3], 是 CD
} else {
wrong += zimu[i]; // 和 right 相同的意义, 不过存的是错误的, 用上面例子来说, 存的就是 AB
}
mc.list[i].new_index = zimu[i]; // 置乱后的 answer
mc.list[i].sign = Math.random(); // 随机数作 token, 几乎不会重复
var re = new RegExp(mc.list[i].id, 'g');
jiexi = jiexi.replace(re, mc.list[i].sign); // 保完全替换, 如果不用 regex, 只会被日环第一处
}
for (var i in mc.list) {
var re = new RegExp(mc.list[i].sign, 'g');
jiexi = jiexi.replace(re, mc.list[i].new_index);
}
document.getElementById("answer2").innerHTML = "【答案】:" + right;
document.getElementById("jiexi").innerHTML = "" + jiexi
}
// }}}
这里例子中, 16行的)括号应该匹配到第6行一开始的(括号, 但 emacs 匹配到第一行的 { 括号了. 不知道你们有没有这个问题. 如图所示:
有几个问题:
- ) 匹配 {, 但明明 ) 就应该只匹配( 的, vim 没有这个问题
- ) 会匹配到注释中的 (, vim 也有类似的问题 这个代码块是 org mode 中的一个代码块. 用的是 spacemacs.
更新: 在安装了 javascript layer(spacemacs)后问题就解决了, 所以猜测, 下次 babel 遇到类似的问题, 在 spacemacs 中装上对应语言的 layer 就好了.