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.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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
    });


})();