filtersBypassInPO

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

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

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