// ==UserScript== // @name Wanikani Burn Reviews // @namespace wkburnreview // @description Adds a space on the main page that reviews random burned items // @exclude *.wanikani.com // @include *.wanikani.com/dashboard* // @version 0.9.9.6 // @author Samuel H // @grant none /* This script is licensed under the Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) license * Details: http://creativecommons.org/licenses/by-nc/4.0/ */ //IMPORTANT: IF THIS IS THE FIRST TIME YOU'VE USED THE SCRIPT AND IT HAS NEVER BEEN UPDATED THEN YOU NEED TO PUT YOUR API KEY IN BETWEEN THE DOUBLE QUOTES ON THE LINE BELOW. apiKey = ""; //CHANGE THIS TO true IF YOU WANT TO LOAD PREVIOUS DATA AND SKIP LOADING: IF YOU DO THIS YOU MUST RUN THE SCRIPT WITH useCache = false FOR IT TO UPDATE YOUR BURNED ITEMS useCache = false; //true; //CHANGE THIS TO false IF YOU DON'T WANT A LOAD BUTTON startButton = true; $("head").append(''); function getBRSection() { var strSection = '
\
\

' + ((!BRLangJP) ? "BURN REVIEWS" : "焦げた復習") + '

\
\ \
\
'; return strSection; } function getFadeCSS() { var strFadeIn = ''; return strFadeIn; } function getButtonCSS() { var strButtons = ''; return strButtons; } function rand(low, high) { return Math.floor(Math.random()*(high+1)) + low; } function filterBRRadicalData(data) { var dataArr = {}; for (var d = 1; d < data.length; d++) { if (data[d].indexOf('"burned":true') > -1) { dataArr[Object.keys(dataArr).length] = {"character": data[d].substring(0, 1), "meaning": data[d].substring(data[d].indexOf('"meaning":"') + 11, data[d].indexOf('","image"')).split(", "), "image": data[d].substring(data[d].indexOf('"image":"') + 10, data[d].indexOf('","level"')).split(", ")}; } } return dataArr; } function filterBRKanjiData(data) { var dataArr = {}; for (var d = 1; d < data.length; d++) { if (data[d].indexOf('"burned":true') > -1) { dataArr[Object.keys(dataArr).length] = {"character": data[d].substring(0, 1), "meaning": data[d].substring(data[d].indexOf('"meaning":"') + 11, data[d].indexOf('","onyomi"')).split(", "), "onyomi": data[d].substring(data[d].indexOf('"onyomi":"') + 10, data[d].indexOf('","kunyomi"')).split(", "), "kunyomi": data[d].substring(data[d].indexOf('"kunyomi":"') + 11, data[d].indexOf('","important')).split(", "), "important_reading": data[d].substring(data[d].indexOf('"important_reading":"') + 21, data[d].indexOf('","level"'))}; } } return dataArr; } function filterBRVocabData(data) { var dataArr = {}; for (var l = 0; l < Object.keys(data).length; l++) { for (var d = 1; d < Object.keys(data[l]).length; d++) { if (data[l][d].indexOf('"burned":true') > -1) { dataArr[Object.keys(dataArr).length] = {"character": data[l][d].substring(0, data[l][d].indexOf('"')), "kana": data[l][d].substring(data[l][d].indexOf('"kana":"') + 8, data[l][d].indexOf('","meaning"')).split(", "), "meaning": (data[l][d].substring(data[l][d].indexOf('"meaning":"') + 11, data[l][d].indexOf('","level"'))).split(", ")}; } } } return dataArr; } function getBurnReview(firstReview) { curBRAnswered = false; $("#user-response").attr("disabled", false).val("").focus(); if (!firstReview) { $(".answer-exception-form").css("display", "none"); if ((curBRItemType == 0 && curBRProgress > 0) || curBRProgress == 2) { newBRItem(); updateBRItem(true); } if (curBRItemType > 0 && (curBRProgress < 1 || $("#answer-form fieldset").hasClass("correct"))) { if (curBRType == 0) { curBRType = 1; wanakana.bind(document.getElementById('user-response')); $("#user-response").attr({lang:"ja",placeholder:"答え"}); $("#question-type").removeClass("meaning").addClass("reading"); } else { curBRType = 0; wanakana.unbind(document.getElementById('user-response')); $("#user-response").removeAttr("lang").attr("placeholder","Your Response"); $("#question-type").removeClass("reading").addClass("meaning"); } } else if (curBRItemType == 0) { wanakana.unbind(document.getElementById('user-response')); $("#user-response").removeAttr("lang").attr("placeholder","Your Response"); $("#question-type").removeClass("reading").addClass("meaning"); } if (!BRLangJP) document.getElementById("question-type-text").innerHTML = (curBRType == 0) ? "Meaning" : ((curBRItemType == 1) ? ((BRKanjiData[curBRItem]["important_reading"] == "onyomi") ? "Onyomi Reading" : "Kunyomi Reading") : "Reading"); else document.getElementById("question-type-text").innerHTML = (curBRType == 0) ? "意味" : ((curBRItemType == 1) ? ((BRKanjiData[curBRItem]["important_reading"] == "onyomi") ? "音読み" : "訓読み") : "読み"); document.getElementById('user-response').value = ""; $("#answer-form fieldset").removeClass("correct").removeClass("incorrect"); } else { document.getElementById("new-item").onclick = skipItem; $("body").prepend('
'); newBRItem(); var characterText = (curBRItemType == 0) ? BRRadicalData[curBRItem]["character"] : ((curBRItemType == 1) ? BRKanjiData[curBRItem]["character"] : BRVocabData[curBRItem]["character"]); var reviewTypeText; if (!BRLangJP) reviewTypeText = ((curBRType < 1) ? "Meaning" : (curBRItemType == 0) ? BRRadicalData[curBRItem]["character"] : ((curBRItemType == 1) ? BRKanjiData[curBRItem]["important_reading"].substring(0, 1).toUpperCase() + BRKanjiData[curBRItem]["important_reading"].substring(1) + " Reading" : "Reading")); else reviewTypeText = (curBRType < 1) ? "意味" : (curBRItemType == 0) ? BRRadicalData[curBRItem]["character"] : ((curBRItemType == 1) ? ((BRKanjiData[curBRItem]["important_reading"] == "onyomi") ? "音" : "訓") : "") + "読み"; strReview = '\
\
\
部首
\
漢字
\
単語
\
\
\
日本語
\
Resize' : '; font-size: 10px">拡大する') + '
\
\
' + characterText + '
\

' + reviewTypeText + '

\
\ \ \
\
\ '; return strReview; } } function newBRItem() { if (BRRadicalsEnabled) { if (BRKanjiEnabled) { if (BRVocabularyEnabled) { curBRItem = rand(1, Object.keys(BRRadicalData).length + Object.keys(BRKanjiData).length + Object.keys(BRVocabData).length - 1); curBRItemType = (curBRItem < Object.keys(BRRadicalData).length) ? 0 : ((curBRItem < Object.keys(BRRadicalData).length + Object.keys(BRKanjiData).length) ? 1 : 2); } else { curBRItem = rand(1, Object.keys(BRRadicalData).length + Object.keys(BRKanjiData).length - 1); curBRItemType = (curBRItem < Object.keys(BRRadicalData).length) ? 0 : 1; } } else { if (BRVocabularyEnabled) { curBRItem = rand(1, Object.keys(BRRadicalData).length + Object.keys(BRVocabData).length - 1); curBRItemType = (curBRItem < Object.keys(BRRadicalData).length) ? 0 : 2; } else { curBRItem = rand(1, Object.keys(BRRadicalData).length - 1); curBRItemType = 0; } } } else if (BRKanjiEnabled) { if (BRVocabularyEnabled) { curBRItem = rand(1, Object.keys(BRKanjiData).length + Object.keys(BRVocabData).length - 1); curBRItemType = (curBRItem < Object.keys(BRKanjiData).length) ? 1 : 2; } else { curBRItem = rand(1, Object.keys(BRKanjiData).length - 1); curBRItemType = 1; } } else { curBRItem = rand(1, Object.keys(BRVocabData).length - 1); curBRItemType = 2; } if (curBRItemType == 0) curBRType = 0; else { curBRType = rand(0, 1); if (curBRItemType == 1) { if (BRRadicalsEnabled) curBRItem -= Object.keys(BRRadicalData).length; } else if (curBRItemType == 2) { if (BRRadicalsEnabled) { if (BRKanjiEnabled) curBRItem -= (Object.keys(BRRadicalData).length + Object.keys(BRKanjiData).length); else curBRItem -= (Object.keys(BRRadicalData).length); } else if (BRKanjiEnabled) curBRItem -= Object.keys(BRKanjiData).length; } } curBRProgress = 0; } function updateBRItem(updateText) { if (updateText) $(".bri").html(((curBRItemType == 0) ? BRRadicalData[curBRItem]["character"] : (curBRItemType == 1) ? BRKanjiData[curBRItem]["character"] : BRVocabData[curBRItem]["character"])); if ($(".bri").html().length > 3) { switch($(".bri").html().length) { case 4: $(".bri").css("font-size", "38px"); break; case 5: $(".bri").css("font-size", "28px"); break; case 6: $(".bri").css("font-size", "24px"); break; default: $(".bri").css("font-size", "inherit"); } } else $(".bri").css("font-size", "48px"); var bg = (curBRItemType == 0) ? "#00a0f1" : ((curBRItemType == 1) ? "#f100a0" : "#a000f1"); var bgi = "linear-gradient(to bottom, "; bgi += (curBRItemType == 0) ? "#0af, #0093dd" : ((curBRItemType == 1) ? "#f0a, #dd0093" : "#a0f, #9300dd"); $(".brk").css({"background-color": bg, "background-image": bgi, "background-repeat": "repeat-x", "height": "39px", "padding-top": "28px", "padding-bottom": "3px", "margin-top": "0px", "margin-left": "0px", "text-align": "center"}); } function skipItem() { curBRProgress = 2; getBurnReview(false); return false; } function getBRRadicalData() { if (!BRLangJP) $("#BRloading").html('

Retrieving radical data...

'); else $("#BRloading").html('

部首データを検索中…

'); var req = new XMLHttpRequest(); req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/radicals', true); req.onreadystatechange = function() { if (req.readyState === 4) { if (req.status >= 200 && req.status < 400) { BRRadicalData = filterBRRadicalData(req.responseText.split('"character":"')); localStorage.setItem("burnedRadicals", JSON.stringify(BRRadicalData)); getBRKanjiData(); } else { alert("error"); } } }; req.send(); } function getBRKanjiData() { if (!BRLangJP) $("#BRloading").html('

Retrieving kanji data...

'); else $("#BRloading").html('

漢字データを検索中…

'); var req = new XMLHttpRequest(); req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/kanji', true); req.onreadystatechange = function() { if (req.readyState === 4) { if (req.status >= 200 && req.status < 400) { BRKanjiData = filterBRKanjiData(req.responseText.split('"character":"')); localStorage.setItem("burnedKanji", JSON.stringify(BRKanjiData)); getBRVocabData(1); } else { alert("error"); } } }; req.send(); } function getBRVocabData(lv) { if (!BRLangJP) $("#BRloading").html('

Retrieving vocabulary data...

'); else $("#BRloading").html('

単語データを検索中…

'); var req = new XMLHttpRequest(); req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/vocabulary/' + lv, true); req.onreadystatechange = function() { if (req.readyState === 4) { if (req.status >= 200 && req.status < 400) { BRVocabData[lv - 1] = req.responseText.split('"character":"'); if (lv == parseInt($(".dropdown-toggle span").html())) { BRVocabData = filterBRVocabData(BRVocabData); localStorage.setItem("burnedVocab", JSON.stringify(BRVocabData)); initBurnReviews(); } else { getBRVocabData(lv + 1); } } else { alert("error"); } } }; req.send(); } function getBRWKData() { if (localStorage.getItem("burnedRadicals") == null) getBRRadicalData(); else if (localStorage.getItem("burnedKanji") == null) getBRKanjiData(); else if (localStorage.getItem("burnedVocab") == null) getBRVocabData(1); else { BRRadicalData = JSON.parse(localStorage.getItem("burnedRadicals")); BRKanjiData = JSON.parse(localStorage.getItem("burnedKanji")); BRVocabData = JSON.parse(localStorage.getItem("burnedVocab")); initBurnReviews(); } } function clearBurnedItemData() { localStorage.removeItem("burnedRadicals"); localStorage.removeItem("burnedKanji"); localStorage.removeItem("burnedVocab"); } function confirmRes() { $(".answer-exception-form").css({"display": "block", "opacity": "0", "-webkit-transform": "translateY(20px)"}).removeClass("animated fadeInUp"); $(".answer-exception-form span").html(""); $(".answer-exception-form").addClass("animated fadeInUp") if (!BRLangJP) $(".answer-exception-form span").html('Are you sure you want to Resurrect the ' + ((curBRItemType == 1) ? 'kanji item "' + BRKanjiData[curBRItem]["character"] : 'vocabulary item "' + BRVocabData[curBRItem]["character"]) + '"?'); else $(".answer-exception-form span").html(((curBRItemType == 0) ? '部首「' : ((curBRItemType == 1) ? '漢字「' + BRKanjiData[curBRItem]["character"] : '単語「' + BRVocabData[curBRItem]["character"])) + '」を' + '復活する
本当によろしいですか?'); document.getElementById("answer-exception").onclick = "return false"; return false; } function initBurnReviews() { $("#BRloading").remove(); $("head").append(''); $(getFadeCSS()).appendTo($("head")); $(getButtonCSS()).appendTo($("head")); $("ul").css("padding-left", "0px"); $(getBurnReview(true)).insertAfter($(".burn-reviews.kotoba-table-list.dashboard-sub-section h3")); document.getElementById("answer-button").onclick = submitBRAnswer; updateBRItem(false); if (curBRType == 0) { wanakana.unbind(document.getElementById('user-response')); $("#user-response").removeAttr("lang").attr("placeholder","Your Response"); $("#question-type").addClass("meaning"); } else { wanakana.bind(document.getElementById('user-response')); $("#user-response").attr({lang:"ja",placeholder:"答え"}); $("#question-type").addClass("reading"); } $(".brbi div, .brbt div").css({"background-repeat": "repeat-x", "color": "#fff", "padding": "3px 5px 0px 5px", "width": "20px", "vertical-align": "middle", "font-size": "14px"}).mouseover(function() { $(this).css("text-shadow", "0 0 0.2em #fff"); }).mouseout(function() { $(this).css("text-shadow", ""); }); $('.brbi div').css({"height": "32px"}).click(function() { var cancel = false; if ($(this).hasClass("on")) { if ((BRRadicalsEnabled && BRKanjiEnabled) || (BRRadicalsEnabled && BRVocabularyEnabled) || (BRKanjiEnabled && BRVocabularyEnabled)) { if ($(this).attr("class") == "brbir on") { localStorage.setItem("BRRadicalsEnabled", false); BRRadicalsEnabled = false; if (curBRItemType == 0) skipItem(); } else if ($(this).attr("class") == "brbik on") { localStorage.setItem("BRKanjiEnabled", false); BRKanjiEnabled = false; if (curBRItemType == 1) skipItem(); } else if ($(this).attr("class") == "brbiv on") { localStorage.setItem("BRVocabularyEnabled", false); BRVocabularyEnabled = false; if (curBRItemType == 2) skipItem(); } } else cancel = true; } else { if ($(this).attr("class") == "brbir") { localStorage.removeItem("BRRadicalsEnabled"); BRRadicalsEnabled = true; } else if ($(this).attr("class") == "brbik") { localStorage.removeItem("BRKanjiEnabled"); BRKanjiEnabled = true; } else if ($(this).attr("class") == "brbiv") { localStorage.removeItem("BRVocabularyEnabled"); BRVocabularyEnabled = true; } } if (!cancel) $(this).toggleClass("on"); }); $('.brbt div').css({"height": "50px"}).click(function() { $(this).toggleClass("on"); if ($(this).children(".brbt div span").html() == "日本語") { if (!BRLangJP) localStorage.setItem("BRLangJP", true); else localStorage.removeItem("BRLangJP"); switchBRLang(); } else { if ($(this).hasClass("on")) { if ($("#dim-overlay").css("display") == "none") { if (BRLangJP) $(".brbtr span").html("縮小する"); $("#dim-overlay").css("display", "block").addClass("fadeIn"); $(".burn-reviews.kotoba-table-list.dashboard-sub-section").css({"-webkit-transition": "1s ease-in-out", "-moz-transition": "1s ease-in-out", "-o-transition": "1s ease-in-out", "transition": "1s ease-in-out"} ).css("transform", "scaleX(2)scaleY(2)").one('transitionend webkitTransitionEnd',function() { $("#dim-overlay").removeClass("fadeIn"); if (queueBRAnim) { queueBRAnim = false; allowQueueBRAnim = false; $(".brbtr").trigger("click"); } else allowQueueBRAnim = true; }); } else if (!queueBRAnim && allowQueueBRAnim) queueBRAnim = true; } else { if (!$("#dim-overlay").hasClass("fadeIn")) { if (BRLangJP) $(".brbtr span").html("拡大する"); $("#dim-overlay").addClass("fadeOut"); $(".burn-reviews.kotoba-table-list.dashboard-sub-section").one('transitionend webkitTransitionEnd', function() { $("#dim-overlay").removeClass("fadeOut").css("display", "none"); if (queueBRAnim) { queueBRAnim = false; allowQueueBRAnim = false; $(".brbtr").trigger("click"); } else allowQueueBRAnim = true; }); $(".burn-reviews.kotoba-table-list.dashboard-sub-section").css("transform", "scaleX(1)scaleY(1)"); } else if (!queueBRAnim && allowQueueBRAnim) queueBRAnim = true; } } }); $(".brbtr").css({"height": "49px"}); $(".brbi div span, .brbt div span").css({"-ms-writing-mode": "tb-rl", "-webkit-writing-mode": "vertical-rl", "-moz-writing-mode": "vertical-rl", "-ms-writing-mode": "vertical-rl", "writing-mode": "vertical-rl", "-webkit-touch-callout": "none", "-webkit-user-select": "none", "-khtml-user-select": "none", "-moz-user-select": "none", "-ms-user-select": "none", "user-select": "none", "cursor":"default"}); $(".bri").css({"color": "#ffffff", "font-size": "48px", "text-shadow": "0 1px 0 rgba(0,0,0,0.2)"}); $("#dim-overlay").click(function () { $(".brbtr").removeClass("on"); if (BRLangJP) $(".brbtr span").html("拡大する"); if (!$(this).hasClass("fadeIn")) { $(this).addClass("fadeOut"); $(".burn-reviews.kotoba-table-list.dashboard-sub-section").one('transitionend webkitTransitionEnd', function() { $("#dim-overlay").removeClass("fadeOut").css("display", "none"); if (queueBRAnim) { queueBRAnim = false; allowQueueBRAnim = false; $(".brk").trigger("click"); } else allowQueueBRAnim = true; }); $(".burn-reviews.kotoba-table-list.dashboard-sub-section").css("transform", "scaleX(1)scaleY(1)"); } else if (!queueBRAnim && allowQueueBRAnim) queueBRAnim = true; }); $(".answer-exception-form span").css({"background-color": "rgba(162, 162, 162, 0.75)", "box-shadow": "3px 3px 0 rgba(225, 225, 225, 0.75)"}); } function switchBRLang() { BRLangJP = !BRLangJP; if (BRLangJP) { document.getElementById("question-type-text").innerHTML = (curBRType == 0) ? "意味" : document.getElementById("question-type-text").innerHTML.replace("Reading", "読み").replace("Onyomi ", "音").replace("Kunyomi ", "訓"); $(".burn-reviews.kotoba-table-list.dashboard-sub-section h3").html("焦げた復習"); $("#new-item").html("新しい項目"); if (!$(".brbtr").hasClass("on")) $(".brbtr span").css("font-size", "10px").html("拡大する"); else $(".brbtr span").css("font-size", "10px").html("縮小する"); if ($("#answer-exception").css("display") !== "none") { if (!$("#answer-exception").hasClass("fadeOut") && !curBRAnswered) $(".answer-exception-form span").html("おっと、異なる読みを入力してしまった。"); else { if ($(".answer-exception-form span").html().toString().substring(0, 1) == "A") $(".answer-exception-form span").html(((curBRItemType == 0) ? '部首「' : ((curBRItemType == 1) ? '漢字「' + BRKanjiData[curBRItem]["character"] : '単語「' + BRVocabData[curBRItem]["character"])) + '」を' + '復活する
本当によろしいですか?'); else { var txtPrev = $(".answer-exception-form span").html().toString(); $(".answer-exception-form span").html('解答は
「' + txtPrev.substring(txtPrev.indexOf('"') + 1, txtPrev.indexOf('"', txtPrev.indexOf('"') + 1)) + '」であった。
この項目を復活したいか?'); document.getElementById("answer-exception").getElementsByTagName("span")[0].getElementsByTagName("a")[0].onclick = confirmRes; } } } } else { document.getElementById("question-type-text").innerHTML = (curBRType == 0) ? "Meaning" : document.getElementById("question-type-text").innerHTML.replace("読み", "Reading").replace("音", "Onyomi ").replace("訓", "Kunyomi "); $(".burn-reviews.kotoba-table-list.dashboard-sub-section h3").html("BURN REVIEWS"); $("#new-item").html("NEW ITEM"); $(".brbtr span").css("font-size", "inherit").html("Resize"); if ($("#answer-exception").css("display") !== "none") { if (!$("#answer-exception").hasClass("fadeOut") && !curBRAnswered) $(".answer-exception-form span").html("Oops! You entered the wrong reading."); else { if ($(".answer-exception-form span").html().toString().indexOf("る本") > 1) $(".answer-exception-form span").html('Are you sure you want to Resurrect the ' + ((curBRItemType == 1) ? 'kanji item "' + BRKanjiData[curBRItem]["character"] : 'vocabulary item "' + BRVocabData[curBRItem]["character"]) + '"?'); else { var txtPrev = $(".answer-exception-form span").html().toString(); $(".answer-exception-form span").html('The answer was:
"' + txtPrev.substring(txtPrev.indexOf('「') + 1, txtPrev.indexOf('」')) + '"
Resurrect this item?'); document.getElementById("answer-exception").getElementsByTagName("span")[0].getElementsByTagName("a")[0].onclick = confirmRes; } } } } } function checkBurnReviewAnswer() { var response = $("#user-response").val().toLowerCase().trim(); var match = false; var answers; $("#user-response").attr("disabled", true); if (curBRType == 0) answers = (curBRItemType == 0) ? BRRadicalData[curBRItem]["meaning"] : ((curBRItemType == 1) ? BRKanjiData[curBRItem]["meaning"] : BRVocabData[curBRItem]["meaning"]); else answers = (curBRItemType == 1) ? BRKanjiData[curBRItem][BRKanjiData[curBRItem]["important_reading"]] : BRVocabData[curBRItem]["kana"]; if (answers instanceof Array) { for (var a = 0; a < Object.keys(answers).length; a++) { if (response == answers[a]) match = true; } } else if (response == answers) match = true; if (((curBRType == 0 && isAsciiPresent(response)) || (!isAsciiPresent(response) && curBRType == 1)) && response !== "") { //alert(((BRKanjiData[curBRItem]["important_reading"] == "onyomi") ? BRKanjiData[curBRItem]["kunyomi"] : BRKanjiData[curBRItem]["onyomi"])); if (!match && curBRItemType == 1 && curBRType == 1 && ((BRKanjiData[curBRItem]["important_reading"] == "onyomi" && compareKunyomiReading(response, BRKanjiData[curBRItem]["kunyomi"]) == true) || (BRKanjiData[curBRItem]["important_reading"] == "kunyomi" && response == BRKanjiData[curBRItem]["onyomi"]))) { if (!BRLangJP) $(".answer-exception-form span").html("Oops! You entered the wrong reading."); else $(".answer-exception-form span").html("おっと、異なる読みを入力してしまった。"); $(".answer-exception-form").css({"display": "block"}).addClass("animated fadeInUp").delay(5000).queue(function(){ $(this).addClass("fadeOut").dequeue().delay(800).queue(function(){ $(this).removeClass("fadeOut").css("display", "none").dequeue(); }); }); $("#user-response").attr("disabled", false); } else { //alert(evaluate(((curBRType == 0) ? "meaning" : "reading"),$("#user-response").val()).join(",")); if (match) { $("#answer-form fieldset").removeClass("incorrect"); $("#answer-form fieldset").addClass("correct"); curBRProgress++; } else { $("#answer-form fieldset").removeClass("correct"); $("#answer-form fieldset").addClass("incorrect"); if (!BRLangJP) $(".answer-exception-form span").html('The answer was:
"' + ((answers instanceof Array) ? answers.join(", ") : answers) + '"
Resurrect this item?'); else $(".answer-exception-form span").html('解答は
「' + ((answers instanceof Array) ? answers.join(", ") : answers) + '」であった。
この項目を復活したいか?'); $(".answer-exception-form").css({"display": "block"}).addClass("animated fadeInUp"); document.getElementById("answer-exception").getElementsByTagName("span")[0].getElementsByTagName("a")[0].onclick = confirmRes; } curBRAnswered = true; } } else { //$("#answer-form").effect( "shake", {}, 100 ); $("#user-response").attr("disabled", false); } } function compareKunyomiReading(input, reading) { var match = false; //alert(input + " " + reading + " " + reading.toString().substring(0, reading.indexOf("."))); if (input == reading || input == reading.toString().substring(0, reading.indexOf(".")) || input == reading.toString().replace("*", input.substring(reading.indexOf(".") + 1)).replace(".", "")) match = true; return match; } function submitBRAnswer() { if (!curBRAnswered) checkBurnReviewAnswer(); else getBurnReview(false); } function evaluate(e,t){ var n,r,i,s,o,u,a,f,l,c,h; i=[]; u=[]; s=((curBRItemType == 1) ? BRKanjiData[curBRItem]["character"] : BRVocabData[curBRItem]["character"]); n=!1; l=!1; f=!1; o=!1; t=$.trim(t); e==="reading"&&(t=t.replace("n","ん")); $("#user-response").val(t); if(e==="reading"){ s.kan?(s.emph==="onyomi"?(i=s.on,u=s.kun):(i=s.kun,u=s.on), o=checkIfOtherKanjiReading(t,u,i)):s.voc&&(i=s.kana); i.length>1&&(f=!0); for(a in i) r=i[a]; t===r&&(l=!0,n=!0); } else { i=$.merge(s.en,s.syn); i.length>1&&(f=!0); t=stringFormat(t); for(a in i) r=i[a]; r=stringFormat(r); h=levenshteinDistance(r,t); c=distanceTolerance(r); h<=c&&(l=!0); h===0&&(n=!0); } return {passed:l,accurate:n,multipleAnswers:f,exception:o}; } function checkIfOtherKanjiReading(e,t,n){ var r,i,s; s=!1; for(i in t)r=t[i]; e===r.replace(/\..*/,"")&&(s=!0) for(i in n) r=n[i]; e===r&&(s=!1); return s; } function isAsciiPresent(e){ return (curBRType == 0) ? !/[^a-z \-0-9]/i.test(e) : /[^ぁ-ー0-9 ]/.test(e); //e=e[e.length-1]==="n"?e.slice(0,-1):e; } function stringFormat(e){ return e=e.toLowerCase().replace("-"," ").replace(".","").replace("'",""); e.substr(-1)==="s"&&(e=e.slice(0,-1)),e; } function distanceTolerance(e){ switch(e.length){ case 1:case 2:case 3:return 0; case 4:case 5:return 1; case 6:case 7:return 2; default:return 2+Math.floor(e.length/7)*1; } } document.addEventListener('keydown', function(event) { if(event.keyCode == 13) { //Enter if (curBRAnswered) getBurnReview(false); } }); cancelExecution = false; if (localStorage.getItem("apiKey") !== null && localStorage.getItem("apiKey").length == 32) apiKey = localStorage.getItem("apiKey"); else if (apiKey.length == 32) localStorage.setItem("apiKey", apiKey); else { cancelExecution = true; alert("Please enter your API key near the top of the WanaKani Burn Reviews userscript."); } if (!cancelExecution) { curBRItem = -1; curBRType = -1; curBRItemType = -1; curBRProgress = 0; curBRAnswered = false; queueBRAnim = false; allowQueueBRAnim = true; BRLangJP = (localStorage.getItem("BRLangJP") == null) ? false : true; BRRadicalsEnabled = (localStorage.getItem("BRRadicalsEnabled") !== null) ? false : true; BRKanjiEnabled = (localStorage.getItem("BRKanjiEnabled") !== null) ? false : true; BRVocabularyEnabled = (localStorage.getItem("BRVocabularyEnabled") !== null) ? false : true; BRRadicalData = ""; BRKanjiData = ""; BRVocabData = {}; String.prototype.trim = function() { return(this.replace(/^ +/,'').replace(/ +$/,'')); } $(".low-percentage.kotoba-table-list.dashboard-sub-section").parent().wrap('
'); $(getBRSection()).insertAfter($(".low-percentage.kotoba-table-list.dashboard-sub-section").parent()); if (!BRLangJP) $("#BRloading").html('Start'); else $("#BRloading").html('開始'); $("#BRloading a").click( function() { if (!useCache) clearBurnedItemData(); getBRWKData(); String.prototype.trim = function() { return(this.replace(/^ +/,'').replace(/ +$/,'')); } }); if (!startButton) $("#BRloading a").click(); } // @downloadURL none // ==/UserScript==