Word and Image Blocker

Block words, phrases and images associated with those phrases.

目前为 2023-12-09 提交的版本。查看 最新版本

// ==UserScript==
// @name         Word and Image Blocker
// @namespace    https://github.com/def-initive/
// @version      1
// @description  Block words, phrases and images associated with those phrases.
// @author       def-initive
// @match        *://*/*
// @exclude      *://github.com/*
// @exclude      *://greasyfork.org/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // Function to hide images in element, its parents, and siblings
    function hideImagesInElementAndSiblings(element) {
        // Hide images in the element itself
        var imagesInElement = element.querySelectorAll('img');
        imagesInElement.forEach(function (image) {
            image.style.display = "none";
        });

        // Hide images in siblings
        var siblings = Array.from(element.parentElement.children);
        siblings.forEach(function (sibling) {
            if (sibling !== element) {
                var imagesInSibling = sibling.querySelectorAll('img');
                imagesInSibling.forEach(function (image) {
                    image.style.display = "none";
                });
            }
        });
    }

    // Function to hide direct parent containers and their siblings' images
    // containing occurrences of a phrase on a webpage
    function hideParentAndSiblings(phrase) {
        var textNodes = document.createTreeWalker(
            document.body,
            NodeFilter.SHOW_TEXT,
            null,
            false
        );

        var elementsToRemove = [];

        while (textNodes.nextNode()) {
            var textNode = textNodes.currentNode;
            var match = textNode.nodeValue.match(new RegExp(phrase, 'gi'));

            if (match) {
                var parentContainer = textNode.parentElement;
                elementsToRemove.push(parentContainer);
            }
        }

        elementsToRemove.forEach(function (element) {
            // Check if the element is part of the UI created by "Blocked Phrases Settings"
            if (!element.closest('.blocked-phrases-settings-container')) {
                // Hide parent containers
                element.style.color = "black";
                element.style.backgroundColor = "black";

                // Hide images in siblings
                hideImagesInElementAndSiblings(element);
            }
        });
    }

    // Load target phrases from local storage
    var storedPhrases = localStorage.getItem('blockedPhrases');
    var targetPhrases = storedPhrases ? JSON.parse(storedPhrases) : [];

    // Hide direct parent containers and images in their siblings
    targetPhrases.forEach(function (phrase) {
        hideParentAndSiblings(phrase);
    });

    // Observe changes in the DOM to handle dynamically loaded content
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            if (mutation.addedNodes && mutation.addedNodes.length > 0) {
                targetPhrases.forEach(function (phrase) {
                    hideParentAndSiblings(phrase);
                });
            }
        });
    });

    // Configuration of the observer
    var observerConfig = {
        childList: true,
        subtree: true
    };

    // Start observing the DOM
    observer.observe(document.body, observerConfig);

})();