您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows quiz on ankiweb.
当前为
// ==UserScript== // @name AnkiWeb Quiz // @namespace https://greasyfork.org/users/102866 // @description Shows quiz on ankiweb. // @match https://ankiuser.net/* // @match https://ankiweb.net/* // @author TiLied // @version 2.0.00 // @grant GM_openInTab // @grant GM_listValues // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // @grant GM.openInTab // @grant GM.listValues // @grant GM.getValue // @grant GM.setValue // @grant GM.deleteValue // ==/UserScript== class AnkiWebQuiz { _Options = new Object(); _Decks = new Object(); _DeckId; constructor() { console.log("AnkiWeb Quiz v" + GM.info.script.version + " initialization"); this._LoadOptionsAndDecks(); this._SetCSS(); //_FirstTime(); } _SetCSS() { globalThis.window.document.head.append("<!--Start of AnkiWeb Quiz v" + GM.info.script.version + " CSS-->"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_quizGrid" + "{" + "display: grid;" + "grid-template-columns: repeat(4,auto);" + "grid-template-rows: auto;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_quizButton" + "{" + "color: #fff;" + "background-color: #0275d8;" + "border-color: #0275d8;" + "padding: .75rem 1.5rem;" + "font-size: 1rem;" + "border-radius: .3rem;" + "border: 1px solid transparent;" + "max-width:250px;" + "margin:5px;" + "cursor: pointer;" + "max-height: 300px;" + "overflow: auto;" + "}</ style >"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_quizButton:hover" + "{" + "background-color: #025aa5;" + "}</ style >"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_true" + "{" + "background-color: #75d802;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_true:hover" + "{" + "background-color: #5aa502;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>.awq_trueBorder" + "{" + "border-color: #75d802;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_false" + "{" + "background-color: #d80275;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>div.awq_false:hover" + "{" + "background-color: #a5025a;" + "}</style>"); globalThis.window.document.head.insertAdjacentHTML("beforeend", "<style type='text/css'>.awq_falseBorder" + "{" + "border-color: #d80275;" + "}</style>"); globalThis.window.document.head.append("<!--End of AnkiWeb Quiz v" + GM.info.script.version + " CSS-->"); } async _LoadOptionsAndDecks() { this._Options = await GM.getValue("awqOptions"); this._Decks = await GM.getValue("awqDecks"); if (this._Options == null) this._Options = new Object(); if (this._Decks == null) this._Decks = new Object(); //Console log prefs with value console.log("*prefs:"); console.log("*-----*"); let vals = await GM.listValues(); for (let i = 0; i < vals.length; i++) { console.log("*" + vals[i] + ":" + await GM.getValue(vals[i])); } console.log("*-----*"); } async Main() { if (globalThis.window.document.location.pathname.startsWith("/decks")) { let strs = globalThis.window.document.querySelectorAll("button.btn-link"); for (let i = 0; i < strs.length; i++) { let _id = strs[i].id; //Console.WriteLine(_id); if (_id.startsWith("did")) { if (this._Decks[_id.substring(3)] == null) this._Decks[_id.substring(3)] = new Object(); strs[i].addEventListener("click", () => { GM.setValue("awqDeckId", _id.substring(3)); }, true); } } GM.setValue("awqDecks", this._Decks); } if (globalThis.window.document.location.pathname.startsWith("/study")) { this._DeckId = await GM.getValue("awqDeckId"); if (this._DeckId == null) { console.log("Deck id is null"); return; } let _study = globalThis.window.eval("study"); console.log(_study); if (_study["currentCard"] == null) { globalThis.window.setTimeout(() => { this.Main(); }, 1000); return; } let _id = _study["currentCard"]["cardId"]; this._Decks[this._DeckId][_id] = _study["currentCard"]; for (let i = 0; i < _study["cards"].length; i++) { _id = _study["cards"][i]["cardId"]; this._Decks[this._DeckId][_id] = _study["cards"][i]; } this.Qiuz(_study); GM.setValue("awqDecks", this._Decks); } } Qiuz(study) { let cardsId = new Array(); cardsId.push(study["currentCard"]["cardId"]); let keys = Object.keys(this._Decks[this._DeckId]); let len = 11; if (len >= keys.length) { len = keys.length - 1; } for (let i = 0; i < len; i++) { let _randomInt = this.GetRandomInt(keys.length); let _id = keys[_randomInt]; let _continue = false; for (let j = 0; j < cardsId.length; j++) { if (_id == cardsId[j]) { i--; _continue = true; break; } } if (_continue) continue; else cardsId.push(_id); } //Console.WriteLine(cardsId); cardsId = this.Shuffle(cardsId); let before = globalThis.window.document.querySelector("#qa_box"); let divGrid = globalThis.window.document.createElement("div"); divGrid.classList.add("awq_quizGrid"); before.parentNode.insertBefore(divGrid, before); let answer = globalThis.window.document.querySelector("#ansbuta"); if (!answer.classList.contains("awqEvent")) { answer.classList.add("awqEvent"); answer.addEventListener("click", () => { let eases = globalThis.window.document.querySelectorAll("#easebuts button"); //Console.WriteLine(eases); for (let i = 0; i < eases.length; i++) { if (eases[i].classList.contains("awqEvent")) continue; eases[i].classList.add("awqEvent"); eases[i].addEventListener("click", () => { this.AddEventsForEases(); }, false); } }, false); } for (let i = 0; i < cardsId.length; i++) { let div = globalThis.window.document.createElement("div"); div.classList.add("awq_quizButton"); div.id = cardsId[i]; div.addEventListener("click", (e) => { let _id = e.currentTarget.id; console.log(_id); let _button = globalThis.window.document.querySelector("#ansbuta"); _button.click(); let _eases = globalThis.window.document.querySelectorAll("#easebuts button"); //Console.WriteLine(_eases); for (let i = 0; i < _eases.length; i++) { if (_eases[i].classList.contains("awqEvent")) continue; _eases[i].classList.add("awqEvent"); _eases[i].addEventListener("click", () => { this.AddEventsForEases(); }, false); } if (_id == study["currentCard"]["cardId"]) { div.classList.add("awq_true"); div.classList.add("awq_trueBorder"); _eases[1].classList.add("awq_trueBorder"); } else { div.classList.add("awq_false"); div.classList.add("awq_falseBorder"); _eases[0].classList.add("awq_falseBorder"); } }, false); let html = this._Decks[this._DeckId][cardsId[i]]["answer"].replace(this._Decks[this._DeckId][cardsId[i]]["question"], "").replace("\n\n<hr id=answer>\n\n", "").replace("<img", "<img width=\"100%\""); div.insertAdjacentHTML("beforeend", html); divGrid.append(div); } } AddEventsForEases() { let _grid = globalThis.window.document.querySelector(".awq_quizGrid"); _grid.remove(); this.Main(); } GetRandomInt(max) { return Math.floor(Math.random() * max); } Shuffle(array) { for (let i = array.length - 1; i > 0; i--) { let _i = i + 1; let j = Math.floor(Math.random() * _i); let temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } } let awq; window.onload = function () { awq = new AnkiWebQuiz(); setTimeout(() => { awq.Main(); console.log(awq); }, 1000); };