Jump to content

MediaWiki:Scramble.js: Difference between revisions

From RetroMUX
No edit summary
No edit summary
Line 67: Line 67:


     if(iter > 5) {
     if(iter > 5) {
       if(s.getAttribute(scrambleName) === "true") {
       if(s.getAttribute(scrambleAttrib) === "true") {
         unscramble(s);
         unscramble(s);
       }
       }

Revision as of 20:07, 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);
  
  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, "0");

  t._itv = setInterval((s) => {
    let iter = parseInt(s.getAttribute(scrambleCounterName));

    if(iter > 5) {
      if(s.getAttribute(scrambleAttrib) === "true") {
        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); 
  setLooper(this);
});