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