Greasy Fork is available in English.

Word Blocker

Block specific words on webpages

// ==UserScript==
// @name         Word Blocker
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Block specific words on webpages
// @match        *://*/*
// @grant        none
// @author       Edu Altamirano
// @website      https://www.cocoalopez.com/blog
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // List of words to block
        var blockedWords = ['boluarte', 'milei', 'salinas', 'xochitl', 'netanyahu', 'israel', 'boluarte', 'ecuador', 'noboa', 'piqué', 'sunak' ];

    // List of websites to filter
    var websitesToFilter = ['example.com', 'another-example.com'];

    // List of websites to exclude from filtering
    var excludedWebsites = ['excluded-example.com', 'another-excluded-example.com'];

    // User choice: 'all', 'list', or 'none'
    var userChoice = 'all'; // Change this to your preference

    // Function to check if an element contains a blocked word
    function containsBlockedWord(element) {
        var text = element.textContent.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
        for (var i = 0; i < blockedWords.length; i++) {
            var blockedWord = blockedWords[i].normalize("NFD").replace(/[\u0300-\u036f]/g, "");
            if (text.includes(blockedWord)) {
                return true;
            }
        }
        return false;
    }


    // Function to hide elements containing blocked words
    function hideBlockedElements() {
        var elements = document.querySelectorAll('p, h1, h2, h3, h4, h5, h6, a, span');
        elements.forEach(function(element) {
            if (containsBlockedWord(element)) {
                // Cross out and color red the blocked words
                element.innerHTML = element.innerHTML.replace(new RegExp(blockedWords.join("|"), "gi"), function(matched){
                    return '<span style="color: red; text-decoration: line-through;">' + matched + '</span>';
                });

                // Wait a second, then add a blur effect before hiding the element
                setTimeout(function() {
                    element.style.transition = 'all 0.5s';
                    element.style.filter = 'blur(10px)';
                    setTimeout(function() {
                        element.style.display = 'none';
                    }, 500);
                }, 1000);

                // Also hide the closest parent div
                var parent = element.parentElement;
                while (parent) {
                    if (parent.tagName.toLowerCase() === 'div') {
                        (function(parent) {
                            setTimeout(function() {
                                parent.style.transition = 'all 0.5s';
                                parent.style.filter = 'blur(10px)';
                                setTimeout(function() {
                                    parent.style.display = 'none';
                                }, 500);
                            }, 1000);
                        })(parent);
                        break;
                    }
                    parent = parent.parentElement;
                }

                // Also hide any preceding img elements within the same parent element
                var sibling = element.previousElementSibling;
                while (sibling) {
                    if (sibling.tagName.toLowerCase() === 'img') {
                        (function(sibling) {
                            setTimeout(function() {
                                sibling.style.transition = 'all 0.5s';
                                sibling.style.filter = 'blur(10px)';
                                setTimeout(function() {
                                    sibling.style.display = 'none';
                                }, 500);
                            }, 1000);
                        })(sibling);
                    }
                    sibling = sibling.previousElementSibling;
                }
            }
        });

        // Hide img elements with alt text or sibling a element text containing blocked words
        var images = document.querySelectorAll('img');
        images.forEach(function(img) {
            var altText = img.alt.toLowerCase();
            for (var i = 0; i < blockedWords.length; i++) {
                if (altText.includes(blockedWords[i])) {
                    setTimeout(function() {
                        img.style.transition = 'all 0.5s';
                        img.style.filter = 'blur(10px)';
                        setTimeout(function() {
                            img.style.display = 'none';
                        }, 500);
                    }, 1000);
                    break;
                }
            }

            var sibling = img.nextElementSibling;
            while (sibling) {
                if (sibling.tagName.toLowerCase() === 'a' && containsBlockedWord(sibling)) {
                    (function(sibling) {
                        setTimeout(function() {
                            img.style.transition = 'all 0.5s';
                            img.style.filter = 'blur(10px)';
                            setTimeout(function() {
                                img.style.display = 'none';
                            }, 500);
                        }, 1000);
                    })(sibling);
                    break;
                }
                sibling = sibling.nextElementSibling;
            }
        });
    }

    // Check if the current website should be filtered
    function shouldFilterWebsite() {
        var currentWebsite = window.location.hostname;
        if (excludedWebsites.includes(currentWebsite)) {
            return false;
        } else if (userChoice === 'all' || (userChoice === 'list' && websitesToFilter.includes(currentWebsite))) {
            return true;
        } else {
            return false;
        }
    }

    // Run the script after the DOM is fully loaded
    window.addEventListener('load', function() {
        if (shouldFilterWebsite()) {
            hideBlockedElements();
        }
    }, false);
})();