MediaWiki:Scramble.js: Difference between revisions
Appearance
Created page with "// https://stackoverflow.com/a/27872144/383904 const randomString = (n, r='') => { while (n--) r += String.fromCharCode((r=Math.random()*62|0, r+=r>9?(r<36?55:61):48)); return r; }; const unscramble = (el) => { const chars = [...el.dataset.scramble]; const tot = chars.length; let iteration = 0; let ch = 0; let solved = ""; el._itv = setInterval(() => { if (iteration > 10) { iteration = 0; solved += chars[ch]; ch += 1; }..." |
No edit summary |
||
| Line 1: | Line 1: | ||
const alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"; | |||
const | const shadowContainerName = 'shadow-container'; | ||
const scrambleCounterName = 'scramble-counter'; | |||
const scrambleAttrib = 'data-scramble'; | |||
function createShadowCopy(container) { | |||
let shadowContainer = container.cloneNode(true); | |||
shadowContainer.style.display = 'none'; | |||
shadowContainer.setAttribute(shadowContainerName, 'true'); | |||
shadowContainer.removeAttribute(scrambleAttrib); | |||
container.appendChild(shadowContainer); | |||
container.setAttribute(scrambleCounterName, 0); | |||
scrambleTree(container); | |||
let | } | ||
function scrambleTree(container) { | |||
scrambleNodes(container.childNodes); | |||
} | |||
function scrambleNodes(nodes) { | |||
nodes.forEach((node) => { | |||
if (node.nodeType == Node.TEXT_NODE) { | |||
let newTextArray = []; | |||
let oldValue = [...node.nodeValue]; | |||
oldValue.forEach((char) => { | |||
if (/\S/.test(char)) { | |||
newTextArray.push(alpha[Math.floor(Math.random() * alpha.length)]); | |||
} | |||
else { | |||
newTextArray.push(char); | |||
} | |||
}); | |||
node.nodeValue = newTextArray.join(""); | |||
} | } | ||
else if(node.getAttribute(shadowContainerName) === "true") { | |||
// If we find the shadow copy, we totally just stop. | |||
return; | |||
} | } | ||
else if(node.nodeType == Node.ELEMENT_NODE) { | |||
} | scrambleNodes(node.childNodes); | ||
}; | } | ||
}) | |||
} | |||
function unscramble(container) { | |||
children = Array.from(container.childNodes) | |||
let shadowCopy = children.find((node) => node.getAttribute && node.getAttribute(shadowContainerName)); | |||
console.log(shadowCopy); | |||
if (shadowCopy) { | |||
while (container.firstChild) { | |||
container.removeChild(container.firstChild); | |||
} | |||
container.appendChild(shadowCopy); | |||
shadowCopy.style.display = ''; | |||
} | |||
} | |||
function setLooper(t) { | |||
t.setAttribute(scrambleCounterName, "5"); | |||
t._itv = setInterval((s) => { | |||
let iter = parseInt(s.getAttribute(scrambleCounterName)); | |||
}; | if(iter > 5) { | ||
unscramble(s); | |||
clearInterval(s._itv); | |||
} else { | |||
console.log("Iter: " + iter); | |||
scrambleNodes(s.childNodes); | |||
iter = iter + 1; | |||
s.setAttribute(scrambleCounterName, iter.toString()); | |||
} | |||
}, 1000, t); | |||
} | |||
$('[' + scrambleAttrib + ']').each(function () { createShadowCopy(this); }); | |||
$('[' + scrambleAttrib + '="true"]').each(function () { setLooper(this); }); | |||
Revision as of 19:54, 24 August 2025
const alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!";
const shadowContainerName = 'shadow-container';
const scrambleCounterName = 'scramble-counter';
const scrambleAttrib = 'data-scramble';
function createShadowCopy(container) {
let shadowContainer = container.cloneNode(true);
shadowContainer.style.display = 'none';
shadowContainer.setAttribute(shadowContainerName, 'true');
shadowContainer.removeAttribute(scrambleAttrib);
container.appendChild(shadowContainer);
container.setAttribute(scrambleCounterName, 0);
scrambleTree(container);
}
function scrambleTree(container) {
scrambleNodes(container.childNodes);
}
function scrambleNodes(nodes) {
nodes.forEach((node) => {
if (node.nodeType == Node.TEXT_NODE) {
let newTextArray = [];
let oldValue = [...node.nodeValue];
oldValue.forEach((char) => {
if (/\S/.test(char)) {
newTextArray.push(alpha[Math.floor(Math.random() * alpha.length)]);
}
else {
newTextArray.push(char);
}
});
node.nodeValue = newTextArray.join("");
}
else if(node.getAttribute(shadowContainerName) === "true") {
// If we find the shadow copy, we totally just stop.
return;
}
else if(node.nodeType == Node.ELEMENT_NODE) {
scrambleNodes(node.childNodes);
}
})
}
function unscramble(container) {
children = Array.from(container.childNodes)
let shadowCopy = children.find((node) => node.getAttribute && node.getAttribute(shadowContainerName));
console.log(shadowCopy);
if (shadowCopy) {
while (container.firstChild) {
container.removeChild(container.firstChild);
}
container.appendChild(shadowCopy);
shadowCopy.style.display = '';
}
}
function setLooper(t) {
t.setAttribute(scrambleCounterName, "5");
t._itv = setInterval((s) => {
let iter = parseInt(s.getAttribute(scrambleCounterName));
if(iter > 5) {
unscramble(s);
clearInterval(s._itv);
} else {
console.log("Iter: " + iter);
scrambleNodes(s.childNodes);
iter = iter + 1;
s.setAttribute(scrambleCounterName, iter.toString());
}
}, 1000, t);
}
$('[' + scrambleAttrib + ']').each(function () { createShadowCopy(this); });
$('[' + scrambleAttrib + '="true"]').each(function () { setLooper(this); });