Secret Message Encoder

Encodes a secret message inside another.

Version au 13/03/2025. Voir la dernière version.

// ==UserScript==
// @name             Secret Message Encoder
// @name:de          Geheime Nachrichten Kodierer
// @namespace        https://sme-siz.pages.dev
// @version          0.1.5
// @description      Encodes a secret message inside another.
// @description:de   Kodiert eine geheime Nachricht in einer anderen.
// @author           LuisAFK
// @match            *://*/*
// @icon             https://sme-siz.pages.dev/assets/favicon96.png
// @website          https://sme-siz.pages.dev
// @grant            none
// @supportURL       https://github.com/lafkpages/sme/issues
// @run-at           document-idle
// @license          GPLv3
// ==/UserScript==

(()=>{
// src/encoders.ts
var one = "​";
var zero = "‌";
var oneOne = "‎";
var zeroZero = "‏";
var oneZero = "⁡";
var zeroOne = "⁢";
var zeroZeroZero = "⁣";
var oneOneOne = "⁤";
var secretsRegEx = new RegExp(`[${zeroZeroZero}${oneOneOne}${zeroZero}${oneOne}${zeroOne}${oneZero}${zero}${one}]+`);
function binToString(b) {
  const m = b.match(/[01]{8}/g);
  if (!m) {
    return null;
  }
  let s = "";
  for (const c of m) {
    s += String.fromCharCode(parseInt(c, 2));
  }
  return s;
}
function secretBinToString(b) {
  b = b.replace(new RegExp(zeroZeroZero, "g"), "000");
  b = b.replace(new RegExp(oneOneOne, "g"), "111");
  b = b.replace(new RegExp(zeroOne, "g"), "01");
  b = b.replace(new RegExp(oneZero, "g"), "10");
  b = b.replace(new RegExp(zeroZero, "g"), "00");
  b = b.replace(new RegExp(oneOne, "g"), "11");
  b = b.replace(new RegExp(zero, "g"), "0");
  b = b.replace(new RegExp(one, "g"), "1");
  return binToString(b);
}
function decodeSecret(s) {
  const b = s.match(secretsRegEx)?.[0];
  if (!b) {
    return null;
  }
  return secretBinToString(b);
}

// src/scriptlet.ts
var hideTransform = "translateY(calc(-100% - 50px))";
var div = document.createElement("div");
div.id = "sme-inject-toast";
div.style.position = "fixed";
div.style.top = "20px";
div.style.right = "20px";
div.style.padding = "10px";
div.style.zIndex = "99999";
div.style.background = "wheat";
div.style.border = "1px solid black";
div.style.borderRadius = "5px";
div.style.transition = "transform 0.5s ease-in-out 0s";
div.style.transform = hideTransform;
div.style.whiteSpace = "pre-line";
document.body.appendChild(div);
setInterval(() => {
  const selectedText = window.getSelection()?.toString();
  let decodedSecret = null;
  if (selectedText) {
    try {
      decodedSecret = decodeSecret(selectedText);
    } catch {}
  }
  if (decodedSecret) {
    div.style.transform = "translateY(0px)";
    div.textContent = decodedSecret;
  } else {
    div.style.transform = hideTransform;
  }
}, 1000);

})()