Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name ПУК-СРЕНЬК
- // @namespace puksrenk
- // @version 2.0
- // @description Encode and decode 2ch.hk fart code
- // @author Anonymous
- // @match https://2ch.hk/*/res/*.html
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA21BMVEVHcEzr6OX/+Pb9tJP/9/f+3dP79/P/////9fH////97ej18e/m4uD///////Dd2df949r69vT07+39vqX81Mf89vL94tj88ez/+PX/9PT9zr378Oz8+PT89PH59vL9yrb48/Dy7uvy7ur69vTxw7T+1cr+kkmnemrthkz+j0r6jknFwsD+kEy+elz+pXnJgGH+mmXbgFD9kVX+lmHVflL+lFazqqfY1dKglJCbg3u4fmjGta/RzsvXpZXMycazr6yhmJXm3tqtqKaygnKmn53jvbKciYPKfFaahoCxQDFuAAAAJnRSTlMA7CXxHq5FAjsFd7/zCRD7loXM6dJQiX4yFr5lW1mT0q7v08jXrHUXgQ4AAAEmSURBVDjLlZPXcoMwEEVpphlsB/eWHjDNYMAlbolJ/f8vCkI8iGSlmdzXe0d7tIXj/iVJLSWYFF+bJEmaxvHpToMDemwjLXY8HBiLpe85xxnoK411GfjKmwoY6C9xgU9DAP1Wt/Rdxx/ChB1cIHu/BwkVFRcIoo9eo1BnoM+lWgtu7EqB67pBocXhlgwMU7suzznrhC+Iv3w7fKl9dnp62+/DKMpWHvazV35MVlAtw2hvj2f/kOBmfLflv6OSpJHcqwD8K8o8RQiAkBxDAIQGAQJ4BgCqfnaZABw3Qv0ON03aynF68cnVjpeoSztBANs+famXCOCavvXTtR3mlkYPPCEAge5rYgEwZ9yVnDIBiq2Mcstk+MrjxhBYD7QulxnztM0HaAQ/wGgseU57utgAAAAASUVORK5CYII=
- // @grant none
- // @run-at document-end
- // ==/UserScript==
- const syms = [
- "ПУК",
- "СРЕНЬК",
- "ХРЮК",
- "УИИИ",
- "ЛАХТА",
- "ЛИБЕРАХА",
- "ХОХЛЫ",
- "СВИНОСОБАКА",
- "ШВАЙНОКАРАСЬ",
- "ЛОЛ",
- "КЕК",
- "АБУ",
- "ДВАЧ",
- "ПАРАША",
- "ПОРИДЖ",
- "ХРЮЧЕВО",
- "СВИН",
- "ПЕРДИКС",
- "ПЫНЯ",
- "ЧАЮ",
- "ШУЕ",
- "ЛЕВАК",
- "ПРАВАК",
- "КОМИГЛИСТ",
- "ШВЯТЫЕ",
- "ВАТА",
- "ВОЛОДИН",
- "ДОЛБИЛЬНЯ",
- "ПЕРЕФОРС",
- "КУНЧИК",
- "АВАТАРКА",
- "АНАЛЬЧИК",
- ];
- const keysLen = Math.log2(syms.length);
- const symsEncode = () => {
- let result = {};
- syms.forEach((item, index) => {
- result[
- ("0".repeat(keysLen) + index.toString(2)).slice(-keysLen)
- ] = item;
- });
- return result;
- };
- const symsDecode = () => {
- let result = {};
- Object.entries(symsEncode()).forEach(([key, value]) => {
- result[value] = key;
- });
- return result;
- };
- const rle = (string) => {
- let arr = string.split("-"),
- encoding = [],
- previous = arr[0],
- count = 1;
- for (let i = 1; i < arr.length; i++) {
- if (arr[i] !== previous) {
- encoding.push(count, previous);
- count = 1;
- previous = arr[i];
- } else {
- count++;
- }
- }
- encoding.push(count, previous);
- return encoding.join("-").replace(/1-/g, "").replace(/(\d)-/g, "$1");
- };
- const decode = (string) => {
- const data = symsDecode();
- let ba = string
- .split("-")
- .map((item) => {
- const count = /(\d*)(\w+)-?/.exec(item);
- if (count) {
- const key = item.replace(count[0], "");
- return data[key].repeat(parseInt(count[0]));
- }
- return data[item];
- })
- .join("");
- const padLen = ba.length % 8;
- ba = ba.substring(0, ba.length - padLen);
- return new TextDecoder().decode(
- new Uint8Array(ba.match(/.{1,8}/g).map((c) => parseInt(c, 2)))
- );
- };
- const encode = (string) => {
- let ba = new TextEncoder()
- .encode(string)
- .reduce((s, b) => s + b.toString(2).padStart(8, "0"), "");
- const padLen = keysLen - (ba.length % keysLen);
- ba = ba + "0".repeat(padLen);
- const data = symsEncode();
- return rle(
- ba
- .match(new RegExp(`.{1,${keysLen}}`, "g"))
- .map((item) => {
- return data[item];
- })
- .join("-")
- );
- };
- (() => {
- const parse = (node) => {
- const post = node.querySelector(".post__message");
- const words = post.textContent.replace(/\t+/g, "").split(/[\n, ]+/);
- const re = new RegExp(
- `(\\d+)?(${syms.join("|")})\-(\\S+)\-(\\d+)?(${syms.join("|")})`
- );
- words.forEach((word) => {
- post.innerHTML = post.innerHTML.replace(re, (m) => {
- try {
- return `<div style="color:green;font-size:1.21em">${decode(
- m
- )
- .replace(/<.*?>/g, "[Я у мамы идиот]")
- .replace(/\n/g, "<br>")}</div>`;
- } catch (err) {
- return m;
- }
- });
- });
- };
- const posts = document.querySelectorAll(".thread__post");
- parse(document.querySelector(".thread__oppost"));
- posts.forEach((post) => parse(post));
- const observer = new MutationObserver((o) => {
- o.forEach((i) => {
- if (i.addedNodes) {
- i.addedNodes.forEach((node) => parse(node));
- }
- });
- })
- const config = { childList: true };
- observer.observe(document.querySelector(".thread"), config)
- observer.observe(document.querySelector("#posts-form"), config);
- let div = document.createElement("div");
- div.className = "options__box";
- let encrypted = false;
- let btn = document.createElement("button");
- btn.className = "desktop button";
- btn.style = "color:green;font-weight:bold";
- btn.textContent = `Зашифровать`;
- btn.addEventListener("click", (e) => {
- e.preventDefault();
- const comment = document.querySelector('[name="comment"]');
- if (!encrypted) {
- btn.textContent = `Расшифровать`;
- encrypted = true;
- comment.value = encode(comment.value);
- document.querySelector(".postform__len").textContent =
- 15000 - comment.value.length;
- } else {
- btn.textContent = `Зашифровать`;
- encrypted = false;
- comment.value = decode(comment.value);
- btn.textContent =
- "Зашифровать" +
- (comment.value.length > 0
- ? " (" + (15000 - encode(comment.value).length) + ")"
- : "");
- document.querySelector(".postform__len").textContent =
- 15000 - comment.value.length;
- }
- });
- div.append(btn);
- const options = document.querySelector(".options");
- options.append(div);
- document
- .querySelector(".postform__len")
- .addEventListener("DOMSubtreeModified", () => {
- if (!encrypted) {
- const comment = document.querySelector('[name="comment"]');
- btn.textContent =
- "Зашифровать" +
- (comment.value.length > 0
- ? " (" + (15000 - encode(comment.value).length) + ")"
- : "");
- } else {
- btn.textContent = `Расшифровать`;
- }
- });
- })();
Add Comment
Please, Sign In to add comment