filtersBypassInPO

В рамках борьбы с цензурой на доске po

// ==UserScript==
// @description:ru  В рамках борьбы с цензурой на доске /po/ 
// @description:en  fight against Internet censorship 
// @exclude      https://2ch.hk/po/catalog.html
// @exclude      https://2ch.hk/news/catalog.html
// @include      https://2ch.hk/po/*
// @include      https://2ch.hk/news/*
// @icon         https://2ch.hk/favicon.ico
// @name         filtersBypassInPO
// @name:ru      Обход автоскрытия неугодных слов 
// @namespace    po
// @run-at       document-end
// @version      1903200
// @description В рамках борьбы с цензурой на доске po
// ==/UserScript==

String.prototype.insert = function (index, string) {
    if (index > 0)
      return this.substring(0, index) + string + this.substring(index, this.length);
    else
      return string + this;
  };

var offensiveRegexes = 
[
    //для 14.03
    /(^|\s)[aaoo]?л[еeё]ш([еe]нь)?к[аaуyиеe]/imu,                                                         
    /(^|\s)[сc]?к[аaеeоo]к[хx]?[еeёоo]?л/imu,                                                             
    /к(ибер|опро)сот/imu,                                                                                 
    /[кk][рp]я[кk]л/imu,                                                                                  
    /л[еe][хx][аa]и[мm]/imu,                                                                              
    /л[еeиuя][б6][еeиuуyя][рp]([дg]|[аa][кkнhсcхxш]|[оo][иu][дg])/imu,                                    
    /[мm][аa]й[дg][аa][уy]н/imu,                                                                          
    /(^|\s)[мm][аa][нh](я|ю[нh]\S+|[ьb]([кk]\S+)?)([.,!?\s]|$)/imu,                                       
    /(^|\s)[мm][аa]ш[кk]/imu,                                                                             
    /[нh][аa][вb][аa]л(яш|[ьb][нh]([еёeоo][б6дgсcнh]|ятt))/imu,                                           
    /[оo0][кk][аa][тt]ыш/imu,                                                                             
    /(ольк|лахт)\S+\sиз\sфбк/imu,                                                                         
    /([нh][аa][сc][рp][аa]|[xх][уy]я|(^|\s)[оo][вbнh][аa])л[ьb][нh]/imu,                                  
    /[пn][еeиu][нh][дg][оo][сc]/imu,                                                                      
    /под кроватью/imu,                                                                                    
    /(^|\s)[пn][оo][рp][оo][сc]\S/imu,                                                                    
    /[пn][оo][рp][оo][хx][оo](?![вм])/imu,                                                                
    /(^|\s)[пn]я[тt][аa][кk]/imu,                                                                         
    /(^|\s)[рp][аaоo]г[уy]л/imu,                                                                          
    /редактор\S{0,3}\s+соц\.?\s?сет/imu,                                                                  
    /[сc][вb][иuыi][дg][оo][мm]\S+/imu,                                                                   
    /[сc][вb][иuыi][нh](?!ин|ь|оф|с[кт])/imu,                                                             
    /[сc][иuыi][сc][ьb][кk]\S{4,}/imu,                                                                    
    /(^|\s|под)[сc][иu][сc]я(ль)?[нh]+(?!д)/imu,                                                          
    /[сc][рp]ы[нh][оoь]?[кkч]/imu,                                                                        
    /сшашк/imu,                                                                                           
    /(^|\s)[тt][аa][рp][аa][сc]\S*\s(?!шев)/imu,                                                          
    /[уy][кk][рp][оo][пn]/imu,                                                                            
    /(([уy][сc]|[кk][оo][пn])[рp]у?[аaоo]|\S[аaиоoуy][рp][уyоo]|[уy][рp][кk][аa])(и[нh]|нд)/imu,          
    /[хx][аиоaoui][хx][иuоoi]?л/imu,                                                                      
    /[хx][рp]([ю](?!че)|я[кk])/imu,                                                                       
    /ч[уy][б6][аa][тt]/imu,                                                                               
    /(^|\s)шв[яи]т/imu,                                                                                   
    /Шульман/imu,                                                                                         
    /Месяцеслов/imu,                                                                                      
    /[кk].{0,20}[рp].{0,20}ы.{0,20}[мm].{0,20}[иu].*[нh].*[оo].*[вb].*[оo].*[рp].*[оo].*[сc].*[иu].*я/imu,
  
  //для 19.03
  /(?:^|\s)[aaoo0]?л[еeё]ш(?:[еe][нh][ьb])?[кk][аaуyиеe]/im,
  /(?:^|\s)[сc]?[кk][аaеeоo0][кk][хx]?[еeёоo0]?л/im,
  /[кk](?:[ийiu][б6][еe][pр]|[оo0][пn][рp][оo0])[сc][оo0][тt]/im,
  /[кпkn][оo0][кпkn][оo0][з3][ийiu]ц/im,
  /(?:^|\s)[кk][оo0][пn][рp][оo0](?!т|сл)/im,
  /[кk][рp][оo0][хx][оo0][тt][уy][сc][иiu][кk]/im,
  /[кk][рp]я[кk]л/im,
  /л[еe][хx][аa][ийu][мm]/im,
  /л[еeиuя][б6][еeийuуyя][рp](?:[дg]|[аa][кkнhсcхxш]|[оo0][ийu][дg])/im,
  /[мm][аa][ийiu][дg][аa][уy][нh]/im,
  /(?:^|\s)[мm][аa][нh](?:я(?:[\s.,!?]|$)|ю[нh]|[ьb][кk]?)/im,
  /(?:^|\s)[мm][аa]ш[кk]/im,
  /(?:^|\s)[мm][ийui][вb][ийui][нh]\S/im,
  /[нh][аaоo0][вb][аaоo0]л(?:яш|[ьb][нh](?:[еёeоo](?![вгм]))|я[тt])/im,
  /[оo0][кk][аa][тt][ыьb]ш/im,
  /(?:[оo]л[ьb][кk]|л[аa][хx][тt]|[б6][оo0][тt])\S+\s(?:\S{0,3}\s)?ф[б6][кk]/im,
  /([нh][аa][сc][рp][аa]|(?:[xх][уy]|[пn]ы[нh])я|(?:^|\s)[оo0][вbнh][аa])л[ьb][нh]/im,
  /[пn][еeийu][нh][дg][оo0][сc]/im,
  /[пn][оo0][дg]\s[кk][рp][оo0][вb][аa][тt][ьb]ю/im,
  /[пn][оo0][нh][аa][дg][уy][сc]/im,
  /(?:^|\s)[пn][оo0][рp][оo0][сc]\S/im,
  /[пn][оo0][рp][оo0][хx][оo0](?![вм])/im,
  /(?:^|\s)[пn]я[тt][аa](?:ч[оo0])?[кk]/im,
  /(?:^|\s)[рp][аaоo]г[уy]л/im,
  /[рp][еe][дg][аa]\S{4,7}\s(?:\S+\s)?[сc][оo0]ц\S*?\s?[сc][еe][тt]/im,
  /[сc][вb][ийuыi][дg][оo0][мm]/im,
  /[сc][вb][ийuыi][нh](?!ин|ь|оф|с[кт]|е?[йц]|(?:ая|о(?:го|е|й|му)|ую|ым)([\s.,!?]|$))/im,
  /[сc][иuыi][сc][ьb][кk]\S{4,}/im,
  /(?:^|\s|[пn][оo0][дg])[сc][ийu][сc]([яийiu](л[ьb])?[нh]+(?!д))/im,
  /[сc][рp]ы[нh][оo0ь]?[кkч]/im,
  /сшашк/im,
  /(?:^|\s)[тt][аa][рp][аa][сc]\S*?(?!\sшев)/im,
  /[уy][кk][рp][оo0][пn]/im,
  /[уy]([сc][рp]|[рp][кk])([аaоo0уy][иiu]|[уy][аa])[нh]/im,
  /[хx][аийоao0ui][хx][ийuоo0i]?л/im,
  /[хx][рp]([ю](?!че)|я[кk])/im,
  /ч[уy][б6][аa][тt]/im,
  /ш[вb][аa][йийiu][нh]/im,
  /(?:^|\s)[шщ][вb][яи][тt]/im,
  /ш[пn][рp][оo][тt]/im,
  /Шульман/im,
  /Месяцеслов/im,
  /[кk].{0,5}[рp].{0,5}ы.{0,5}[мm].{0,5}[ийu].*[нh].*[оo].*[вb].*[оo].*[рp].*[оo].*[сc].*[ийu].*я/im,
  /(?=[кkрpымmнhоoвbсcийuiя\s]{17,23})(?:[кk]?[рp]?ы?[мm]?\s?[нh]?[оo]?[вb]?[оo]?[рp]?[оo]?[сc]*[ийui]?я?){17,23}/im
  
  ];

var delimiters = ["[sup],[/sup]", "[sup].[/sup]"];

var opts = document.getElementsByClassName("desktop postform__raw options")[0];

var scriptMark = document.createElement("input"); 
scriptMark.setAttribute("type", "checkbox");
scriptMark.setAttribute("id", "need_spoof");
opts.appendChild(scriptMark); 

var descr = document.createElement("label"); 
descr.innerHTML = " Зашифровать обидные слова"; 
descr.htmlFor = "need_spoof";
opts.appendChild(descr); 

scriptMark.checked = false;

document.getElementById("submit").onclick = function() 
{
    spoof("shampoo");
};

Array.from(document.getElementsByClassName("postbtn-reply-href post__reflink")).forEach(
    function(element, index, array) 
    {
        element.onclick = function ()
        {
            document.getElementById("qr-submit").onclick = function() 
            {
                spoof("qr-shampoo");
            };
        }
    }
);


function spoof(bodyId) 
{
    if (!document.getElementById("need_spoof").checked)
    {
        return;
    }

    var msgBody = document.getElementById(bodyId);
    var newText = "";

    Array.from(msgBody.value.trim().split(/\n/)).forEach(
        function(line, index, array) 
        {
            Array.from(line.split(/\s/)).forEach(
                function(word, index, array)
                {
                    newText += ensureSafe(word) + ' ';
                });

            newText += '\n';
        }
    );

    /* старая версия

    for (var i = 0; i < text.length; i++) 
    {
        let s = text.charAt(i);
        if (/^[\u0400-\u04FF ]+$/.test(s))
        {
            s += delimiters[i % 2].repeat(i % 3);
        }
        newText += s;
    }*/

    msgBody.value = newText;
}

function ensureSafe(word) 
{
    for (var pattern of offensiveRegexes) 
    {
        if (pattern.test(word))
        {
            return makeSafe(word, pattern);
        }
       
    }
    
    return word;
}

function makeSafe(word, pattern) 
{
    while (pattern.test(word))
    {
        let pos = rand(1, word.length - 1);
        if (!(/^[\u0400-\u04FF ]+$/.test(word[pos])))
        {
            continue;
        }
        let delimIndex = rand(0, delimiters.length - 1);
        word = word.insert(pos, delimiters[delimIndex]);
        
    }

    return word;
}

function rand(min, max) 
{
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}