您需要先安装一个扩展,例如 篡改猴、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);
- };