Zalgo Word Corruptor

Replaces random words on a webpage with deranged Zalgo text

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Zalgo Word Corruptor
// @namespace    http://scream.from/the.void
// @version      1.0
// @description  Replaces random words on a webpage with deranged Zalgo text
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
  'use strict';

  // Number of words to corrupt per page load (or set to a percentage)
  const NUM_WORDS_TO_ZALGO = 30;

  // Generate Zalgo text
  function zalgo(text) {
    const zalgo_up = [
      '\u030d', '\u030e', '\u0304', '\u0305',
      '\u033f', '\u0311', '\u0306', '\u0310',
      '\u0352', '\u0357', '\u0351', '\u0307',
      '\u0308', '\u030a', '\u0342', '\u0343',
      '\u0344', '\u034a', '\u034b', '\u034c',
      '\u0303', '\u0302', '\u030c', '\u0350',
      '\u0300', '\u0301', '\u030b', '\u030f',
      '\u0312', '\u0313', '\u0314', '\u033d',
      '\u0309', '\u0363', '\u0364', '\u0365',
      '\u0366', '\u0367', '\u0368', '\u0369',
      '\u036a', '\u036b', '\u036c', '\u036d',
      '\u036e', '\u036f', '\u033e', '\u035b',
      '\u0346', '\u031a'
    ];

    return text.split('').map(char => {
      let result = char;
      const count = Math.floor(Math.random() * 6) + 1;
      for (let i = 0; i < count; i++) {
        result += zalgo_up[Math.floor(Math.random() * zalgo_up.length)];
      }
      return result;
    }).join('');
  }

  // Text walker
  const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
  let textNodes = [];
  let node;
  while ((node = walker.nextNode())) {
    if (node.nodeValue.trim().length > 0) {
      textNodes.push(node);
    }
  }

  // Shuffle utility
  function shuffle(array) {
    for (let i = array.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [array[i], array[j]] = [array[j], array[i]];
    }
  }

  shuffle(textNodes);

  let replaced = 0;
  for (const textNode of textNodes) {
    const words = textNode.nodeValue.split(/\b/);
    let changed = false;
    for (let i = 0; i < words.length; i++) {
      if (/^\w+$/.test(words[i]) && Math.random() < 0.2) { // ~20% chance per word
        words[i] = zalgo(words[i]);
        replaced++;
        changed = true;
        if (replaced >= NUM_WORDS_TO_ZALGO) break;
      }
    }
    if (changed) {
      const newNode = document.createTextNode(words.join(''));
      textNode.parentNode.replaceChild(newNode, textNode);
    }
    if (replaced >= NUM_WORDS_TO_ZALGO) break;
  }
})();