Github recommendation blocker

Remove github's recommendation/trending cards in the dashboard thread. It's triggered by HTML change, usually takes 5ms in PC Chrome browser.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         Github recommendation blocker
// @namespace    http://tampermonkey.net/
// @version      1
// @description  Remove github's recommendation/trending cards in the dashboard thread. It's triggered by HTML change, usually takes 5ms in PC Chrome browser.
// @author       dont-be-evil
// @match        https://github.com/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=github.com
// @grant        none
// @license      GPLv3
// ==/UserScript==

(function() {
    'use strict';
    document.querySelectorAll('h2').forEach(h2 => {
        console.log(h2.textContent.trim());
        if (h2.textContent.trim() === "Explore repositories") {
            h2.parentElement.remove();
        }
    });

    const keywords = ["Recommended for you", "Based on", "Popular among", "Popular projects among", ...
                      "Trending repositories"];

    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) { // Ensure it's an element
                    node.querySelectorAll('h5').forEach(h5 => {
                        if (keywords.some(keyword => h5.textContent.includes(keyword))) {
                            let parent = h5;
                            for (let i = 0; i < 5; i++) {
                                if (parent.parentElement) {
                                    parent = parent.parentElement;
                                } else {
                                    return; // Exit if there are fewer than 5 ancestors
                                }
                            }
                            parent.remove();
                        }
                    });
                }
            });
        });
    });

    // Observe the whole document, including subtree modifications
    observer.observe(document, {
        childList: true,
        subtree: true
    });

    // Function to observe shadow DOM elements
    function observeShadowRoots(node) {
        if (node.shadowRoot) {
            observer.observe(node.shadowRoot, { childList: true, subtree: true });
        }
    }

    // Observe shadow DOM elements dynamically added
    const shadowObserver = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) { // Ensure it's an element
                    observeShadowRoots(node);
                }
            });
        });
    });

    // Start observing for new shadow DOM elements
    shadowObserver.observe(document, {
        childList: true,
        subtree: true
    });


})();