diff --git a/uwuify.js b/uwuify.js new file mode 100644 index 0000000..851aa5f --- /dev/null +++ b/uwuify.js @@ -0,0 +1,85 @@ +const uwuify = { + // The prefix used in console messages + CONSOLE_PREFIX: '[uwuify.js] ', + // The range of time to wait between uwuification + INTERVAL_MIN: 10000, + INTERVAL_MAX: 60000, + // Which characters to uwuify + TARGET_REGEX: /[LRlr]+/g, + // All the #text objects to modify + TARGET_ELEMENTS: [], + + // Gets all #text elements on the page + getTexts: function(object) { + let res = []; + + for (let i = 0; i < object.childNodes.length; i++) { + if (object.childNodes[i].nodeName == '#text') { + res.push(object.childNodes[i]); + } else { + res = res.concat(uwuify.getTexts(object.childNodes[i])); + } + } + + return res; + }, + + // Generates a random integer between min and max + getRandomInt: function (min, max) { + const minCeiled = Math.ceil(min); + const maxFloored = Math.floor(max); + return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive + }, + + // Returns true if a string is able to be uwued + isUwuable: function(string) { + let res = Boolean(uwuify.TARGET_REGEX.exec(string)); + uwuify.TARGET_REGEX.lastIndex = 0 + return res; + }, + + // Uwuify a random target + uwuify: function() { + let targetIdx = uwuify.getRandomInt(0, uwuify.TARGET_ELEMENTS.length); + + let shifts = 0; + let element = uwuify.TARGET_ELEMENTS[targetIdx] + let text = element.textContent; + while (!uwuify.isUwuable(text) && shifts < uwuify.TARGET_ELEMENTS.length) { + shifts++; + element = uwuify.TARGET_ELEMENTS[(targetIdx+shifts)%uwuify.TARGET_ELEMENTS.length]; + text = element.textContent; + } + + if (!uwuify.isUwuable(text)) { + console.info(`${uwuify.CONSOLE_PREFIX} No more text to uwuify.`); + // Return from the function, preventing the next setTimeout(). + return + } + + let matches = text.matchAll(uwuify.TARGET_REGEX).toArray(); + let matchIdx = uwuify.getRandomInt(0, matches.length); + let match = matches[matchIdx]; + + for (let chrOff = 0; chrOff < match[0].length; chrOff++) { + let chrIdx = match.index + chrOff; + let isUpper = text[chrIdx] == text[chrIdx].toUpperCase(); + element.textContent = text.slice(0, chrIdx) + (isUpper ? 'W' : 'w') + text.slice(chrIdx+1);1 + } + + setTimeout(uwuify.uwuify, uwuify.getRandomInt(uwuify.INTERVAL_MIN, uwuify.INTERVAL_MAX)); + } +}; + + + +window.addEventListener('load', () => { + console.debug(`${uwuify.CONSOLE_PREFIX} Document loaded.`); + let elements = uwuify.getTexts(document.body); + for (let i = 0; i < elements.length; i++) { + if (uwuify.isUwuable(elements[i].textContent)) { + uwuify.TARGET_ELEMENTS.push(elements[i]); + } + } + setTimeout(uwuify.uwuify, uwuify.getRandomInt(uwuify.INTERVAL_MIN, uwuify.INTERVAL_MAX)); +});