FAForumSFWversion

Allow you to hide NSFW topics or mark them with a red prefix, you can specify tags to filter in order to take new words in account

// ==UserScript==
// @name         FAForumSFWversion
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Allow you to hide NSFW topics or mark them with a red prefix, you can specify tags to filter in order to take new words in account
// @author       MissNook
// @match        http://forums.furaffinity.net/*
// @match  https://forums.furaffinity.net/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var tagsToCheck = localStorage.tagsToCheck ? localStorage.tagsToCheck.split(",") : ["nsfw", "nswf", "not sfw", "fetish", "diaper", "inflation", "vore", "bondage"];
    var content = document.getElementById("top");

    function addNSFWPrefix(){
        var threads = content.getElementsByClassName("structItem--thread");

        var prefixNSFW = document.createElement("a");
        prefixNSFW.className = "prefixLink prefixForNSFW  label label--red";
        prefixNSFW.innerHTML = "<span class='prefix prefixRed'>NSFW</span>"
        prefixNSFW.style.marginRight = ".35em";

        var len = threads.length,
            i = 0;
        for(; i<len;i++){
            var threadTitles = threads[i].getElementsByClassName("structItem-title");
            var threadTitleContents = threadTitles[0].getElementsByTagName("a");
            var idTitle = threadTitleContents.length > 1 ? 1 : 0;
            var currThreadTitle = threadTitleContents[idTitle];

            if(matchInArray(currThreadTitle.innerText, tagsToCheck)){
                threads[i].className += " NSFWtagged";
                currThreadTitle.parentNode.insertBefore(prefixNSFW.cloneNode(true), currThreadTitle);
            }
        }
    }
    addNSFWPrefix();

    function addTagInput(){
        var nav = content.getElementsByClassName("block-outer")[0];
        var divTag = document.createElement("div");
        divTag.className = "primaryControls";
        divTag.style = "text-align:right;";
        var validateButtonClass = "button--primary button";
        var hideButtonClass = "button button--icon button--icon--preview";
        var inputClass = "input";
        divTag.innerHTML = "<span class='p-description'><b>Tags to filter for NSFW : </b></span><input type='search' id='tagsNSFWInput' class='"+ inputClass +"' title='Enter your tags to filter as NSFW'><button class='" + validateButtonClass + "' id='btnValidateInputNSFW'>Validate tags change</button><button class='"+hideButtonClass+"' id='btnHideNSFW'>Hide NSFW</button>";
        var input = divTag.getElementsByClassName(inputClass)[0];
        input.value = tagsToCheck.join(";");
        input.style = "width:20em;";
        input.style.display = "inline";
        input.addEventListener("keyup", function(event) {
            event.preventDefault();
            //press enter
            if (event.keyCode === 13) {
                manageNewTags();
            }
        });

        var btnValidInput = divTag.childNodes[2];
        btnValidInput.onclick = manageNewTags;
        btnValidInput.style.cursor = "pointer";
        btnValidInput.style.marginLeft = "10px";

        var hideBtn = divTag.lastChild;
        hideBtn.style.cursor = "pointer";
        hideBtn.style.marginLeft = "10px";
        hideBtn.onclick = showHideNSFW;

        nav.appendChild(divTag);
    }
    addTagInput();

    function showHideNSFW(){
        var nsfwTaggedContents = content.getElementsByClassName("NSFWtagged");
        var toggleBtn = document.getElementById("btnHideNSFW");
        var hide = toggleBtn.innerText == "Hide NSFW";
        toggleBtn.innerText = hide ? "Show NSFW" : "Hide NSFW";

        var len = nsfwTaggedContents.length,
            i = 0;
        for(; i<len;i++){
            nsfwTaggedContents[i].style.display = hide ? "none": "table";
        }
    }


    function fillTagsWithUserTag(){
        var inputNSFW = document.getElementById("tagsNSFWInput");
        var tempTabTags = inputNSFW.value.split(";");
         var len = tempTabTags.length,
            i = 0;
        for(; i<len;i++){
            if(tempTabTags[i] == ""){
                tempTabTags.splice(i,1);
            }
        }
        tagsToCheck = tempTabTags;
        localStorage.tagsToCheck = tagsToCheck;
    }

    function reinitThreads(){
        var threads = content.getElementsByClassName("NSFWtagged");
        var len = threads.length,
            i = 0;
        for(; i<len;i++){
            var thread = threads[0];
            var nsfwPrefix = thread.getElementsByClassName("prefixForNSFW")[0];
            nsfwPrefix.parentNode.removeChild(nsfwPrefix);
            thread.className = thread.className.replace(" NSFWtagged","");
        }
    }

    function manageNewTags(){
        fillTagsWithUserTag();
        reinitThreads();
        addNSFWPrefix();
    }

    function matchInArray(string, expressions) {
        var len = expressions.length,
            i = 0;
        for (; i < len; i++) {
            if (string.match(new RegExp(expressions[i],'gi'))) {
                return true;
            }
        }
        return false;
    };
})();