From a9e595c01f9936b8ce32e6538a1edeb2c3dd606b Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Sat, 4 Oct 2025 14:31:51 -0700 Subject: [PATCH] Refactor: Convert module to ESM --- index.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..8eb0581 --- /dev/null +++ b/index.js @@ -0,0 +1,40 @@ +/** + * ZWUS (Zero Width Unicode Standard) + */ +const zwus = { + 3: {unifier: "\u{00AD}", 0: "\u{180E}", 1: "\u{200B}", 2: "\u{200D}"}, + 6: {unifier: "\u{200C}", 0: "\u{200D}", 1: "\u{200F}", 2: "\u{00AD}", 3: "\u{2060}", 4: "\u{200B}", 5: "\u{200E}"}, + 8: {unifier: "\u{200C}", 0: "\u{200D}", 1: "\u{200F}", 2: "\u{00AD}", 3: "\u{2060}", 4: "\u{200B}", 5: "\u{200E}", 6: "\u{180E}", 7: "\u{FEFF}"}, + /** + * Encodes a string into a sequence of zero-width characters. + * @param {string} text - The input text to encode. + * @param {number} base - The numerical base for encoding. Options: 3, 6, 8. Larger the base, the smaller the output, but the more likely the zero width will be detectable by sight. + * @returns {string} The encoded string. + */ + encodeString: (text, base = 3) => Array.from(text, u => u.codePointAt(0).toString(base).split('').map(x => zwus[base][x]).join('')).join(zwus[base].unifier), + /** + * Encodes an array of numbers into a sequence of zero-width characters. + * @param {Array} arr - The array of numbers to encode. + * @param {number} base - The numerical base for encoding. Options: 3, 6, 8. Larger the base, the smaller the output, but the more likely the zero width will be detectable by sight. + * @returns {string} The encoded array. + */ + encodeNumberArray: (arr, base = 3) => arr.map(n => n.toString(base).split('').map(x => zwus[base][x]).join('')).join(zwus[base].unifier), + /** + * Decodes a string of zero-width characters back into the original string. + * NOTE: Decoding accuracy is contingent upon the original encoding base and alphabet. + * @param {string} text - The encoded text to decode. + * @param {number} base - The numerical base for decoding. Must match the base used for encoding. + * @returns {string} The decoded string. + */ + decodeToString: (text, base = 3) => text.split(zwus[base].unifier).map(x => String.fromCodePoint(parseInt(Array.from(x).map(z => Object.keys(zwus[base]).find(k => zwus[base][k] === z)).join(''), base))).join(''), + /** + * Decodes a string of zero-width characters back into the original array of numbers. + * NOTE: Decoding accuracy is contingent upon the original encoding base and alphabet. + * @param {string} text - The encoded text to decode. + * @param {number} base - The numerical base for decoding. Must match the base used for encoding. + * @returns {Array} The decoded array of numbers. + */ + decodeToNumberArray: (text, base = 3) => text.split(zwus[base].unifier).map(x => parseInt(Array.from(x).map(z => Object.keys(zwus[base]).find(k => zwus[base][k] === z)).join(''), base)), +}; + +export default zwus;