WaniKani SRS grid

try to take over the world!

当前为 2017-06-07 提交的版本,查看 最新版本

// ==UserScript==
// @name         WaniKani SRS grid
// @namespace    http://tampermonkey.net/
// @version      3.1
// @description  try to take over the world!
// @author       You
// @match        https://www.wanikani.com/
// @match        https://www.wanikani.com/dashboard
// @require      https://greasyfork.org/scripts/22751-wanikani-settings/code/WaniKani%20Settings.js?version=166555
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    makeSettings("SRS Grid",{1: {Name: "apiKeyForSRS", Display: "Api Key", Type: "textbox"},
                             2: {Name: "srsGridDisplay", Display: "Display", Type: "select", Options: {a: {Value: "left/right", Text: "Left/Right"}, b: {Value: "center/center", Text: "Center/Center"}}, Default: "center/center"}});

    var apiKey = getSetting('apiKeyForSRS');
    var srsGridDisplay = getSetting('srsGridDisplay');
    var apprentice, guru, master, enlighten, burned;
    if(apiKey !== null && apiKey !== "") {
        DoSRSGrid(apiKey);
    } else {
        SRSGridNotSetup();
    }
    addStyle('.title {' +
        '  width: 25px;' +
        '}' +
        '.progressDetailTable {' +
        '  width: 100%;' +
        '}' +
        '.progressDetailTable td {' +
        '  color: white;' +
        '}' +
        '.popover.srs {' +
        ' display: none !important;' +
        '}' +
        '.progressDetailTableTDFirst {' +
        ' text-align: ' + srsGridDisplay.split("/")[0] +';' +
        ' padding-right: 10px;' +
        '}' +
        '.progressDetailTableTDSecond {' +
        ' text-align: ' + srsGridDisplay.split("/")[1] +';' +
        '}' +
        '.progressDetailTableTDFirst, .progressDetailTableTDSecond {' +
        ' color: white;' +
        ' text-shadow: 2px 2px 3px #000000;' +
        '}' +
        '#txtApiKey {' +
        ' width: 275px;' +
        '}' +
        '.srs-progress li table {' +
        ' display: inline;' +
        '}' +
        '#divSRSGridLink.error {' +
        '  background-color: red;' +
        '}' +
        '.dashboard section.srs-progress.noClean td {' +
        '  font-size: 15px;' +
        '}' +
        '.dashboard section.srs-progress.noClean ul li {' +
        '  display: table-cell !important;' +
        '  padding: 10px 0px !important;' +
        '  width: 500px;'+
        '}' +
        '.dashboard section.srs-progress.noClean ul li span {' +
        '  margin-bottom: 10px !important;' +
        '}' +
        '.dashboard section.srs-progress ul li:first-child {' +
        '  border-radius: 5px 0px 0px 5px !important;' +
        '}' +
        '.dashboard section.srs-progress ul li:last-child {' +
        '  border-radius: 0px 5px 5px 0px !important;' +
        '}' +
        '.srs-progress li table tr.orBetter, .srs-progress li table tr.orWorse {' +
        '  display: none;'+
        '}' +
        '.srs-progress li:hover table tr.orBetter, .srs-progress li:hover table tr.orWorse {' +
        ' display: table-row;'+
        ' font-style: italic;' +
        '}' +
        '.srs-progress li:hover table tr:not(.orBetter):not(.orWorse) {' +
        '  display: none;'+
        '}' +
        '.srs-progress li.plus:hover span:after {' +
        ' content: "+";' +
        ' font-style: italic;' +
        '}' +
        '.srs-progress li.minus:hover span:after {' +
        ' content: "-";' +
        ' font-style: italic;' +
        '}' +
        '.srs-progress li:hover span {' +
        ' font-style: italic;' +
        '}' +
        '.srs-progress li table tr.neverShow {' +
        ' display:none !important;' +
        '}');
    killClean();
})();

function killClean(){
    if($('.dashboard section.srs-progress ul li').css('display') == 'inline-flex') {
        if($.browser.mozilla === true){
            $('.srs-progress').addClass('noClean');
        } else {
            //Erase conflicting portions of Clean Dashboard CSS: Thanks to rfindley
            var found_css = false;
            var styles = $('style').each(function(i,v){
                if (found_css) return;
                css = $(v).html();
                if (css.match(/-- SRS PROGRESS --/) === null) return;
                found_css = true;
                var css_arr = css.split('\n');
                var len = css_arr.length;
                css = '';
                var deleting = false;
                for (var idx=0; idx<len; idx++) {
                    var line = css_arr[idx];
                    if (!deleting) {
                        if (line.match(/-- SRS PROGRESS --/) !== null) {
                            deleting = true;
                        } else {
                            css += line + '\n';
                        }
                    } else {
                        if (line.match(/-- REVIEW STATUS --/) !== null) {
                            css += line + '\n';
                            deleting = false;
                        }
                    }
                }
                $(v).html(css);
            });
        }
    }
}

function DoSRSGrid(apiKey){
    $.getJSON('https://www.wanikani.com/api/user/' + apiKey + '/srs-distribution', function (data) {
        setTimeout(function () {
            apprentice = data.requested_information.apprentice;
            guru = data.requested_information.guru;
            master = data.requested_information.master;
            enlighten = data.requested_information.enlighten;
            burned = data.requested_information.burned;
            if (data.error) {
                alert('API Error: ' + data.error.message);
            } else {
                var apprenticeTable = "<table>" +
                    "<tr><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + apprentice.radicals + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + apprentice.kanji + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + apprentice.vocabulary + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + apprentice.total + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.radicals) + parseInt(guru.radicals) + parseInt(master.radicals) + parseInt(enlighten.radicals) + parseInt(burned.radicals))  + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.kanji) + parseInt(guru.kanji) + parseInt(master.kanji) + parseInt(enlighten.kanji) + parseInt(burned.kanji)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.vocabulary) + parseInt(guru.vocabulary) + parseInt(master.vocabulary) + parseInt(enlighten.vocabulary) + parseInt(burned.vocabulary)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.total) + parseInt(guru.total) + parseInt(master.total) + parseInt(enlighten.total) + parseInt(burned.total)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + apprentice.radicals + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + apprentice.kanji + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + apprentice.vocabulary + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + apprentice.total + "</td></tr>" +                    
                    "</table>";
                var guruTable = "<table>" +
                    "<tr><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + guru.radicals + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + guru.kanji + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + guru.vocabulary + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + guru.total + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(guru.radicals) + parseInt(master.radicals) + parseInt(enlighten.radicals) + parseInt(burned.radicals)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(guru.kanji) + parseInt(master.kanji) + parseInt(enlighten.kanji) + parseInt(burned.kanji)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(guru.vocabulary) + parseInt(master.vocabulary) + parseInt(enlighten.vocabulary) + parseInt(burned.vocabulary)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(guru.total) + parseInt(master.total) + parseInt(enlighten.total) + parseInt(burned.total)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.radicals) + parseInt(guru.radicals)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.kanji) + parseInt(guru.kanji)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.vocabulary) + parseInt(guru.vocabulary)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.total) + parseInt(guru.total)) + "</td></tr>" +
                    "</table>";
                var masterTable = "<table>" +
                    "<tr><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + master.radicals + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + master.kanji + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + master.vocabulary + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + master.total + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(master.radicals) + parseInt(enlighten.radicals) + parseInt(burned.radicals)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(master.kanji) + parseInt(enlighten.kanji) + parseInt(burned.kanji)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(master.vocabulary) + parseInt(enlighten.vocabulary) + parseInt(burned.vocabulary)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(master.total) + parseInt(enlighten.total) + parseInt(burned.total)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.radicals) + parseInt(guru.radicals) + parseInt(master.radicals)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.kanji) + parseInt(guru.kanji) + parseInt(master.kanji)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.vocabulary) + parseInt(guru.vocabulary) + parseInt(master.vocabulary)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.total) + parseInt(guru.total) + parseInt(master.total)) + "</td></tr>" +
                    "</table>";
                var enlightenedTable = "<table>" +
                    "<tr><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + enlighten.radicals + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + enlighten.kanji + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + enlighten.vocabulary + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + enlighten.total + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(enlighten.radicals) + parseInt(burned.radicals)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(enlighten.kanji) + parseInt(burned.kanji)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(enlighten.vocabulary) + parseInt(burned.vocabulary)) + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(enlighten.total) + parseInt(burned.total)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.radicals) + parseInt(guru.radicals) + parseInt(master.radicals) + parseInt(enlighten.radicals)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.kanji) + parseInt(guru.kanji) + parseInt(master.kanji) + parseInt(enlighten.kanji)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.vocabulary) + parseInt(guru.vocabulary) + parseInt(master.vocabulary) + parseInt(enlighten.vocabulary)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.total) + parseInt(guru.total) + parseInt(master.total) + parseInt(enlighten.total)) + "</td></tr>" +
                    "</table>";
                var burnedTable = "<table>" +
                    "<tr><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + burned.radicals + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + burned.kanji + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + burned.vocabulary + "</td></tr>" +
                    "<tr><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + burned.total + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + burned.radicals + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + burned.kanji + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + burned.vocabulary + "</td></tr>" +
                    "<tr class='orBetter'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + burned.total + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Radicals</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.radicals) + parseInt(guru.radicals) + parseInt(master.radicals) + parseInt(enlighten.radicals) + parseInt(burned.radicals)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Kanji</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.kanji) + parseInt(guru.kanji) + parseInt(master.kanji) + parseInt(enlighten.kanji) + parseInt(burned.kanji)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Vocabulary</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.vocabulary) + parseInt(guru.vocabulary) + parseInt(master.vocabulary) + parseInt(enlighten.vocabulary) + parseInt(burned.vocabulary)) + "</td></tr>" +
                    "<tr class='orWorse'><td class='progressDetailTableTDFirst'>Total</td><td class='progressDetailTableTDSecond'>" + (parseInt(apprentice.total) + parseInt(guru.total) + parseInt(master.total) + parseInt(enlighten.total) + parseInt(burned.total)) + "</td></tr>" +
                    "</table>";
                $('.srs-progress #apprentice').html("<span>Apprentice</span>").append(apprenticeTable);
                $('.srs-progress #guru').html("<span>Guru</span>").append(guruTable);
                $('.srs-progress #master').html("<span>Master</span>").append(masterTable);
                $('.srs-progress #enlightened').html("<span>Enlightened</span>").append(enlightenedTable);
                $('.srs-progress #burned').html("<span>Burned</span>").append(burnedTable);
                $('.dashboard section.srs-progress ul li').css('padding','10px 22.5px 10px');
                $('.orWorse').addClass('neverShow');
                $('.srs-progress li').addClass('plus');
            }
        }, 0);
    });
    $('.srs-progress li').click(function(){changeHover();});
}

function properCase(word){
    return word.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}

function changeHover(){
    if($('.srs-progress li table tr.neverShow').hasClass('orBetter')){
        $('.srs-progress li table tr.neverShow').removeClass('neverShow');
        $('.srs-progress li table tr.orWorse').addClass('neverShow');
        $('.srs-progress li').removeClass('minus').addClass('plus');
    } else {
        $('.srs-progress li table tr.neverShow').removeClass('neverShow');
        $('.srs-progress li table tr.orBetter').addClass('neverShow');
        $('.srs-progress li').removeClass('plus').addClass('minus');
    }
}

function SRSGridNotSetup(){
    setTimeout(function () {
        if($('.dropdown.account.open').length === 0){
            $('.dropdown.account').addClass('open');
        }
        $('#divSRSGridLink').addClass('error');
        $("#divSRSGridLink").attr('title','SRS Grid needs for API key ->');
        $("#divSRSGridLink").tooltip({
            position: { my: "right-15 right", at: "left center" }
        });
        $("#divSRSGridLink").tooltip("open");
    }, 2000);
}