WK Lesson Items Tooltip

Displays number of items in lessons queue (sorting by level and type)

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         WK Lesson Items Tooltip
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Displays number of items in lessons queue (sorting by level and type)
// @author       Richard J. Sové
// @include      https://www.wanikani.com/dashboard
// @include      https://www.wanikani.com/
// @grant        none
// ==/UserScript==


(function()
{
    'use strict';

    // User API Key
    var user_api_key = ''; // <- insert your API key here

    // Create Authorization Header
    var header = new Headers();
    header.append('Authorization','Bearer ' + user_api_key);

    // Get Lessons DOM
    var lessons = document.getElementsByClassName('lessons-and-reviews__lessons-button')[0];
    lessons.addEventListener("mouseover",toggle_tooltip);
    lessons.addEventListener("mouseout",toggle_tooltip);

    // Get Lessons Position
    var parent_rect = lessons.parentNode.getBoundingClientRect();
    var lessons_rect = lessons.getBoundingClientRect();
    var position_x = lessons_rect.x-parent_rect.x; // middle
    var position_y = parent_rect.height; // bottom

    // Tooltip Style
    var style = "<style>"+
	"table#lessons_tooltip_text td:nth-child(even) { text-align : right}"+
    "table#lessons_tooltip_text {margin-left : 25px}"+
    "</style>";
    document.head.insertAdjacentHTML("beforeend",style);

    // Tooltip HTML
    var tooltip_text = "";
    function tooltip_html()
    {
        var tooltip_html = "<div id=\"tooltip\" style=\"top: "+position_y+"px; left: "+position_x+"px; display: block;\">"+
        "<span class=\"arrow\">"+ tooltip_text +
        "</span>"+
        "</div>";
        return tooltip_html;
    }

    // Format
    function table(lvl,rad,kan,voc)
    {
        return "Level "+lvl+"<br><table id=lessons_tooltip_text><tr><td>Radical:</td><td>"+rad+
            "</td></tr><tr><td>Kanji:</td><td>"+kan+"</td><tr><td>Vocab:</td><td>"+voc+"</td></tr><table>";
    }

    // Tooltip Function
    function toggle_tooltip(event)
    {
        if (event.type == "mouseover")
        {
            // Display Tooltip
            lessons.insertAdjacentHTML("beforeend",tooltip_html());
        }
        else if (event.type == "mouseout")
        {
            // Hide Tooltip
            lessons.removeChild(lessons.childNodes[lessons.childNodes.length-1]);
        }
    }

    // HTTP Requests
    var url_summary_info = 'https://api.wanikani.com/v2/summary';
    var url_user_info = 'https://api.wanikani.com/v2/user';
    var url_wk_items = 'https://api.wanikani.com/v2/assignments?srs_stages=0&unlocked=true&levels=';

    // Temp Defs
    var current_level = 26;

    // Request Summary Info to Get Number of Lessons
    var summary_info = new Request(url_summary_info,{headers : header});
    fetch(summary_info)
    .then(response => response.json())
    .then(data =>
    {
        // Get Number of Lessons
        var total_lessons = data.data.lessons.length;

        // Request User Info to Get Current Level
        var user_info = new Request(url_user_info,{headers : header});
        fetch(user_info)
        .then(response => response.json())
        .then(data =>
        {
            // Get Current Level
            var current_level = data.data.level;

            // Fetch API
            fetchAPI(current_level,0,0,0);

            // Fetch Function Definition
            function fetchAPI(level,radical_count,kanji_count,vocab_count)
            {
                var request = new Request(url_wk_items+level,{headers : header});
                fetch(request)
                .then(response => response.json())
                .then(data =>
                {
                    // Count Items in 'level'
                    var radical = 0, kanji = 0, vocab = 0;
                    for (var i = 0; i < data.data.length; i++)
                    {
                        var type = data.data[i].data.subject_type;
                        if (type == "radical")
                        {
                            radical++;
                        }
                        else if (type == "kanji")
                        {
                            kanji++;
                        }
                        else if (type == "vocabulary")
                        {
                            vocab++;
                        }
                    }
                    radical_count+=radical;
                    kanji_count+=kanji;
                    vocab_count+=vocab;

                    // Append to Tooltip
                    if (level==current_level || radical+kanji+vocab!=0)
                    {
                        tooltip_text += table(level,radical,kanji,vocab);
                    }

                    // Determine if All Lesson Items Have Been Counted
                    if ((radical_count+kanji_count+vocab_count) == total_lessons || level<2)
                    {
                        return;
                    }
                    else
                    {
                        level--;
                        fetchAPI(level,radical_count,kanji_count,vocab_count);
                    }
                });
            }
        });
     });
})();