Reddit NSFW Filter

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

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