你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
(我已經安裝了使用者樣式管理器,讓我安裝!)
// ==UserScript==
// @name WaniKani SRS grid
// @namespace http://tampermonkey.net/
// @version 3.3
// @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';
// Hook into App Store
try { $('.app-store-menu-item').remove(); $('<li class="app-store-menu-item"><a href="https://community.wanikani.com/t/there-are-so-many-user-scripts-now-that-discovering-them-is-hard/20709">App Store</a></li>').insertBefore($('.navbar .dropdown-menu .nav-header:contains("Account")')); window.appStoreRegistry = window.appStoreRegistry || {}; window.appStoreRegistry[GM_info.script.uuid] = GM_info; localStorage.appStoreRegistry = JSON.stringify(appStoreRegistry); } catch (e) {}
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 #apprentice.minus:hover table tr.orWorse, .srs-progress #burned.plus:hover table tr.orBetter{' +
'font-style: normal !important; '+
'}' +
'.srs-progress li:hover table tr:not(.orBetter):not(.orWorse) {' +
' display: none;'+
'}' +
'.srs-progress #apprentice.plus:hover span:after, .srs-progress #guru.plus:hover span:after, .srs-progress #master.plus:hover span:after, .srs-progress #enlightened.plus:hover span:after {' +
' content: "+";' +
' font-style: italic;' +
'}' +
'.srs-progress #guru.minus:hover span:after, .srs-progress #master.minus:hover span:after, .srs-progress #enlightened.minus:hover span:after, .srs-progress #burned.minus:hover span:after {' +
' content: "-";' +
' font-style: italic;' +
'}' +
'.srs-progress #apprentice.plus:hover span, .srs-progress #guru.plus:hover span, .srs-progress #master.plus:hover span, .srs-progress #enlightened.plus:hover span,' +
'.srs-progress #guru.minus:hover span, .srs-progress #master.minus:hover span, .srs-progress #enlightened.minus:hover span, .srs-progress #burned.minus: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);
}