Reddit NSFW Filter

A userscript to show only NSFW entries on the Reddit search page

// ==UserScript==
// @name            Reddit NSFW Filter
// @namespace       Reddit-NSFW-Filter
// @version         1.0
// @description     A userscript to show only NSFW entries on the Reddit search page
// @author          Mortality577
// @license         MIT
// @match           *://*.reddit.com/search/*
// @grant           none
// ==/UserScript==

(() => {
    'use strict';

    // Array of selectors to identify NSFW content
    const nsfwSelectors = [
        '.text-category-nsfw',          // Text tag for NSFW
        'svg[icon-name="nsfw-fill"]',   // SVG icon for NSFW
        '[data-faceplate-tracking-context*="\"nsfw\":true"]' // JSON data indicating NSFW
    ];

    // Function to check if an element or its children contains an NSFW tag
    const containsNSFWTag = (element) => 
        nsfwSelectors.some(selector => {
            try {
                return element.querySelector(selector);
            } catch (e) {
                console.error(`Error querying selector ${selector}:`, e);
                return false; // If an error occurs, assume the selector isn't valid
            }
        });

    // Function to filter NSFW entries
    const filterNSFW = () => {
        document
            .querySelectorAll('faceplate-tracker[data-testid="search-community"]')
            .forEach(entry => {
                entry.style.display = containsNSFWTag(entry) ? '' : 'none'; // Show only NSFW
            });
    };

    // Utility function for debouncing the filter function
    const debounce = (func, wait) => {
        let timeout;
        return (...args) => {
            clearTimeout(timeout);
            timeout = setTimeout(() => func.apply(this, args), wait);
        };
    };

    // Initial filtering on page load
    filterNSFW();

    // Mutation observer to run the filter function when new content is added
    const observer = new MutationObserver(debounce(filterNSFW, 300)); // Debounce to avoid excessive calls
    observer.observe(document.body, { childList: true, subtree: true }); // Watch for changes in the entire document
})();