Word and Image Blocker

Block words, phrases and images associated with those phrases. For the UI to add and delete words and phrases to block, please also install the following, https://greasyfork.org/en/scripts/481834-word-and-image-blocker-settings-ui

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

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

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

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

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Word and Image Blocker
// @namespace    https://github.com/def-initive/
// @version      1.1
// @description  Block words, phrases and images associated with those phrases. For the UI to add and delete words and phrases to block, please also install the following, https://greasyfork.org/en/scripts/481834-word-and-image-blocker-settings-ui
// @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);

})();