您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
В рамках борьбы с цензурой на доске 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; }