// ==UserScript==
// @name Wanikani Anki Mode (irrelephant mod with buttons)
// @namespace irrelephant
// @version 1.6.3
// @description Anki mode for Wanikani; modified to show Anki buttons below character & answer field so that your hand doesn't hide that information. Uses two states for the button: either one large "Show Answer" button or two "Know"/"Don't Know" buttons so that you don't have to move your finger anywhere in case you got an answer correct. You can also use "K" as the shortcut for "Know" (oKAY, I *K*now this) and "L" as the shortcut for "Don't know" (as in "this time, I *L*ose").
// @author irrelephant
// @match https://www.wanikani.com/review/session*
// @match http://www.wanikani.com/review/session*
// @grant none
// @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
// ==/UserScript==
//BASED ON:
//Wanikani Anki Mode by Mempo and modifications by necul, see https://community.wanikani.com/t/userscripts-on-android-browser/19113
//Original author: Oleg Grishin <og402@nyu.edu>
console.log('/// Start of Wanikani Anki Mode');
// Save the original evaluator
var originalChecker = answerChecker.evaluate;
var checkerYes = function (itemType, correctValue) {
return {accurate : !0, passed: !0};
}
var checkerNo = function (itemType, correctValue) {
return {accurate : !0, passed: 0};
}
var activated = false;
var answerShown = false;
//AUTOSTART
var autostart = false;
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
$("#user-response").blur();
});
var WKANKIMODE_toggle = function () {
if (activated) {
if(autostart){
//DISABLE ANKI MODE
$("#WKANKIMODE_anki").text("Anki Mode Off");
$("#answer-form form button").prop("disabled", false);
$("#user-response").off("focus");
$("#user-response").focus();
answerChecker.evaluate = originalChecker;
observer.disconnect();
localStorage.setItem("WKANKI_autostart", false);
activated = false;
autostart = false;
console.log("back to #1");
}else{
//ENABLE AUTOSTART
activated = true;
autostart = true;
localStorage.setItem("WKANKI_autostart", true);
$("#WKANKIMODE_anki").text("Anki Mode Auto Start");
// start observer to force blur
observer.observe(document.getElementById("answer-form"), {
childList: true,
subtree: true,
attributes: true,
characterData: false
});
}
} else {
//ENABLE ANKI MODE
$("#WKANKIMODE_anki").text("Anki Mode On");
$("#answer-form form button").prop("disabled", true);
$("#user-response").on("focus", function () {
$("#user-response").blur();
});
activated = true;
autostart = false;
// start observer to force blur
observer.observe(document.getElementById("answer-form"), {
childList: true,
subtree: true,
attributes: true,
characterData: false
});
}
}
var WKANKIMODE_hideAnswerButtons = function(){
$(".WKANKIMODE_button.correct").hide();
$(".WKANKIMODE_button.incorrect").hide();
$(".WKANKIMODE_button.show").show();
}
var WKANKIMODE_showAnswerButtons = function(){
$(".WKANKIMODE_button.correct").show();
$(".WKANKIMODE_button.incorrect").show();
$(".WKANKIMODE_button.show").hide();
}
var WKANKIMODE_showAnswer = function () {
if (!$("#answer-form form fieldset").hasClass("correct") &&
!$("#answer-form form fieldset").hasClass("incorrect") &&
!answerShown ) {
var currentItem = $.jStorage.get("currentItem");
var questionType = $.jStorage.get("questionType");
if (questionType === "meaning") {
var answer = currentItem.en.join(", ");
if (currentItem.syn.length) {
answer += " (" + currentItem.syn.join(", ") + ")";
}
$("#user-response").val(answer);
} else { //READING QUESTION
var i = 0;
var answer = "";
if (currentItem.voc) {
answer += currentItem.kana[0];
} else if (currentItem.emph == 'kunyomi') {
answer += currentItem.kun[0];
} else if (currentItem.emph == 'nanori') {
answer += currentItem.nanori[0];
} else {
answer += currentItem.on[0];
}
$("#user-response").val(answer);
}
answerShown = true;
WKANKIMODE_showAnswerButtons();
}
};
var WKANKIMODE_answerYes = function () {
if (answerShown) {
answerChecker.evaluate = checkerYes;
$("#answer-form form button").click();
answerShown = false;
answerChecker.evaluate = originalChecker;
return;
}
// if answer is shown, press '1' one more time to go to next
if ($("#answer-form form fieldset").hasClass("correct") ||
$("#answer-form form fieldset").hasClass("incorrect") ) {
$("#answer-form form button").click();
WKANKIMODE_hideAnswerButtons();
}
};
var WKANKIMODE_answerNo = function () {
if (answerShown) {
answerChecker.evaluate = checkerNo;
$("#answer-form form button").click();
answerShown = false;
answerChecker.evaluate = originalChecker;
return;
}
if ($("#answer-form form fieldset").hasClass("correct") ||
$("#answer-form form fieldset").hasClass("incorrect") ) {
$("#answer-form form button").click();
WKANKIMODE_hideAnswerButtons();
}
};
/*jshint multistr: true */
var css = "\
#WKANKIMODE_anki { \
background-color: #000099; \
margin: 0 5px; \
} \
#WKANKIMODE_yes { \
background-color: #009900; \
margin: 0 0 0 5px; \
} \
#WKANKIMODE_no { \
background-color: #990000; \
} \
.WKANKIMODE_button { \
width: 50%; \
display: inline-block; \
text-align:center; \
font-size: 0.8125em; \
color: #FFFFFF; \
cursor: pointer; \
padding: 10px 0; \
margin-bottom: 5px; \
} \
.WKANKIMODE_buttons { \
display: inline-block; \
width:100%; \
} \
.WKANKIMODE_buttons .incorrect { \
background-color: #990000; \
} \
.WKANKIMODE_buttons .correct { \
background-color: #009900; \
} \
.WKANKIMODE_buttons .show { \
background-color: #000099; \
width:100%;\
} \
#WKANKIMODE_anki.hidden { \
display: none; \
} ";
function addStyle(aCss) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (head) {
style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.textContent = aCss;
head.appendChild(style);
return style;
}
return null;
}
var addButtons = function () {
//CHECK AUTOSTART
autostart = localStorage.getItem('WKANKI_autostart')==="true"?true:false;
$("<div />", {
id : "WKANKIMODE_anki",
title : "Anki Mode",
})
.text("Anki Mode Off")
.addClass("WKANKIMODE_button")
.on("click", WKANKIMODE_toggle)
.prependTo("footer");
$("<div />", {
id : "WKANKIMODE_buttons"
})
.addClass("WKANKIMODE_buttons")
.appendTo("#answer-form");
$("<div />", {
id : "WKANKIMODE_anki_incorrect",
title : "Shortcut: L",
})
.text("Don't know")
.addClass("WKANKIMODE_button incorrect")
.on("click", WKANKIMODE_answerNo)
.prependTo("#WKANKIMODE_buttons");
$("<div />", {
id : "WKANKIMODE_anki_show",
title : "Shortcut: Space",
})
.text("Show Answer")
.addClass("WKANKIMODE_button show")
.on("click", WKANKIMODE_showAnswer)
.prependTo("#WKANKIMODE_buttons");
$("<div />", {
id : "WKANKIMODE_anki_correct",
title : "Shortcut: K",
})
.text("Know")
.addClass("WKANKIMODE_button correct")
.on("click", WKANKIMODE_answerYes)
.prependTo("#WKANKIMODE_buttons");
// TO-DO
// add physical buttons to press yes/no/show answer
// var yesButton = "<div id='WKANKIMODE_yes' class='WKANKIMODE_button' title='Correct' onclick='WKANKIMODE_correct();'>Correct</div>";
// var noButton = "<div id='WKANKIMODE_no' class='WKANKIMODE_button' title='Incorrect' onclick='WKANKIMODE_incorrect();'>Incorrect</div>";
// $("footer").prepend($(noButton).hide());
// $("footer").prepend($(yesButton).hide());
};
var autostartFeature = function() {
console.log("///////////// AUTOSTART: " + autostart);
if(autostart){
$("#WKANKIMODE_anki").text("Anki Mode Auto Start");
$("#answer-form form button").prop("disabled", true);
$("#user-response").on("focus", function () {
$("#user-response").blur();
});
activated = true;
// start observer to force blur
observer.observe(document.getElementById("answer-form"), {
childList: true,
subtree: true,
attributes: true,
characterData: false
});
}
}
var bindHotkeys = function () {
$(document).on("keydown.reviewScreen", function (event)
{
if ($("#reviews").is(":visible") && !$("*:focus").is("textarea, input"))
{
switch (event.keyCode) {
//key: Space
case 32:
event.stopPropagation();
event.preventDefault();
if (activated)
WKANKIMODE_showAnswer();
return;
break;
//key: "K" (like "oKAY, I got this")
case 75:
event.stopPropagation();
event.preventDefault();
if (activated)
WKANKIMODE_answerYes();
return;
break;
//key: "L" like "loser" (sorry, you are not a loser! It's all for the sake of the mnemonics)
case 76:
event.stopPropagation();
event.preventDefault();
if (activated)
WKANKIMODE_answerNo();
return;
break;
}
}
});
};
addStyle(css);
addButtons();
autostartFeature();
bindHotkeys();
WKANKIMODE_hideAnswerButtons();