Greasy Fork

Duolingo Wide

Make Duolingo wider and more minimalist.

目前为 2017-08-10 提交的版本。查看 最新版本

// ==UserScript==
// @name         Duolingo Wide
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Make Duolingo wider and more minimalist.
// @author       Nekosuki
// @match        https://www.duolingo.com/*
// @grant        GM_addStyle
// @run-at       document-start
// ==/UserScript==

GM_addStyle("div.a5SW0,div._2_lzu{display:none}div._3MT-S{width:100%}div.kHldG{width:20%}");
GM_addStyle("div._2AVC7 > :last-child{display:none} div._2AVC7 > :first-child{width:100%}");

(function() {
    "use strict";
    let addStrengthenButton = function() {
        let c = document.querySelector("div.mAsUf");
        if(c === null || c.firstElementChild.dataset.test != "lingot-store-button") return;
        let a = document.querySelector("a[data-test='global-practice']");
        a.className = "_3LN9C _3QG2_ _1vaUe _3IS_q _1XnsG _1vaUe _3IS_q";
        a.innerHTML = "Practice";
        let p = a.cloneNode(true);
        p.onclick = function() { a.click(); return false; };
        c.replaceChild(p, c.firstChild);
    };
    let addAchievementsInProfile = function() {
        let d = document.querySelector("div.a5SW0");
        if(d === null || d.firstChild.textContent != "Achievements") return;
        let c = document.querySelector("div._3MT-S").firstChild;
        d.className = "_2hEQd _1E3L7";
        d.lastChild.lastChild.classList.remove("_3e_XC");
        c.insertBefore(d, c.lastChild);
    };
    let addKeyBindings = function() {
        document.addEventListener("keyup", function(event) {
            if(['input', 'select', 'textarea'].indexOf(document.activeElement.tagName.toLowerCase()) !== -1) return;
            let tag = null;
            switch(event.keyCode) {
                case 72: /* H */ tag = "home-nav"; break;
                case 87: /* W */ tag = "vocab-nav"; break;
                case 68: /* D */ tag = "discussion-nav"; break;
                case 76: /* L */ tag = "labs-nav"; break;
                case 80: /* P */ tag = "global-practice"; break;
                case 89: /* Y */ tag = "user-profile"; break;
                case 83: /* S */ tag = "sound-settings"; break;
                case 81: /* Q */ tag = "player-quit"; break;
            }
            let elem = document.querySelector("a[data-test='" + tag + "']");
            if(elem !== null) elem.click();
            else if(window.location.pathname === "/practice") {
                let [practiceButton, timedPracticeButton] = document.querySelector("div._1cw2r").childNodes;
                if(event.keyCode == 80) practiceButton.click();
                else if(event.keyCode == 84) timedPracticeButton.click();
            }
        });
    };
    let init = function() {
        addStrengthenButton();
        addAchievementsInProfile();
        addKeyBindings();
    };
    new MutationObserver(init).observe(document, {childList: true, subtree: true});
    init();
})();