diff --git a/README.md b/README.md index 07eb13c..dca6541 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🐍 P4RS3LT0NGV3 4.0 β€” Universal Text Translator -A powerful web-based text transformation and steganography tool with **223** built-in text transforms spanning encodings, classical and modern ciphers, Unicode styles, formatting, and niche alphabets. Think of it as a universal translator for ALL alphabets and writing systems! +A powerful web-based text transformation and steganography tool with **222** built-in text transforms spanning encodings, classical and modern ciphers, Unicode styles, formatting, and niche alphabets. Think of it as a universal translator for ALL alphabets and writing systems! **Version 4.0** brings a redesigned desktop app shell, seven themes (including WCAG 2.1 AA **Accessible**), mobile utility panels, OpenRouter model curation, and responsive UI polish across all tools. @@ -34,7 +34,6 @@ Categories match the Transform tab and the folders under `src/transformers/` (ea - **A1Z26** - A=1 … Z=26 letter numbering - **AcΓ©rΓ© Cipher** - Solfege / duration encoding for musical steganography - **ADFGX Cipher** - WWI ADFGVX-style polybius + column transposition -- **N7AX Cipher** - ADFGX-style polybius with N7AX coordinates + column transposition - **Affine Cipher** - Affine substitution (ax + b mod 26) - **Atbash Cipher** - Reverse-alphabet substitution (A↔Z) - **Autokey Cipher** - Key stream mixed with plaintext (autokey) @@ -263,7 +262,7 @@ Tabs appear in **UI order** below. **OpenRouter** (optional or required per tool ### πŸ”€ **Transform** -- **223 Transforms**: Encodings, ciphers, Unicode styles, formats, and more (full catalog above). +- **222 Transforms**: Encodings, ciphers, Unicode styles, formats, and more (full catalog above). - **Categories**: Grouped sections you can **reorder**; quick-jump legend; **randomizer** last. - **Favorites & last used**: Pin transforms and recall recent picks. - **Per-transform options**: Gear icon where a transform exposes settings. @@ -472,7 +471,7 @@ npm run preview # npm run build, then serve dist/ - **Tool System**: Modular tool registry with build-time template injection - **Encoding**: UTF-8 with proper Unicode handling - **Steganography**: Variation selectors and Tags Unicode block -- **Transforms**: Individual transformer modules live under `src/transformers/` (223; the bundle is generated by `npm run build:transforms`) +- **Transforms**: Individual transformer modules live under `src/transformers/` (222; the bundle is generated by `npm run build:transforms`) - **Build Process**: - `npm run build` writes the runnable app under `dist/` (ignored by git in most setups) - Transformers are bundled from `src/transformers/` to `dist/js/bundles/transforms-bundle.js` @@ -514,7 +513,7 @@ npm run preview # npm run build, then serve dist/ - πŸ†• **AI Translation**: Translate to 20+ languages (including dead/exotic) via OpenRouter using TranslateGemma prompt format - πŸ†• **PromptCraft Tool**: AI-powered prompt mutation with 9 strategies and 48+ models - πŸ†• **OpenRouter Integration**: Unified API key management for all AI-powered features -- πŸ†• **223 Transformations**: Full catalog of encodings, ciphers, Unicode styles, symbol alphabets, SignWriting, and technical codes (see README transform list) +- πŸ†• **222 Transformations**: Full catalog of encodings, ciphers, Unicode styles, symbol alphabets, SignWriting, and technical codes (see README transform list) - πŸ†• **More Encodings/Ciphers**: Base58, Base62, VigenΓ¨re, Rail Fence, Roman Numerals - πŸ†• **Category Organization**: Better organized transform categories - πŸ†• **Enhanced Styling**: New color schemes for each category diff --git a/index.template.html b/index.template.html index 2592e0c..5f341b9 100644 --- a/index.template.html +++ b/index.template.html @@ -4,11 +4,11 @@ Parseltongue 4.0 β€” Text Encoder, Decoder & Steganography Tool - + - + diff --git a/src/transformers/cipher/n7ax.js b/src/transformers/cipher/n7ax.js deleted file mode 100644 index a877102..0000000 --- a/src/transformers/cipher/n7ax.js +++ /dev/null @@ -1,185 +0,0 @@ -// N7AX cipher β€” Polybius + columnar transposition (ADFGX-style with N7AX coordinates) -import BaseTransformer from '../BaseTransformer.js'; - -export default new BaseTransformer({ - name: 'N7AX Cipher', - priority: 60, - category: 'cipher', - key: 'N7AX', - configurableOptions: [ - { - id: 'key', - label: 'Transposition keyword', - type: 'text', - default: 'N7AX' - } - ], - _transKey: function(options) { - const k = options && options.key !== undefined && options.key !== null - ? String(options.key) - : null; - return (k || this.key || 'N7AX').toUpperCase().replace(/[^A-Z0-9]/g, ''); - }, - square: [ - ['A', 'B', 'C', 'D', 'E'], - ['F', 'G', 'H', 'I', 'K'], - ['L', 'M', 'N', 'O', 'P'], - ['Q', 'R', 'S', 'T', 'U'], - ['V', 'W', 'X', 'Y', 'Z'] - ], - coords: ['N', '7', 'A', 'X', '5'], - _toCoordText: function(text) { - let result = ''; - for (const char of text) { - let found = false; - for (let row = 0; row < 5; row++) { - for (let col = 0; col < 5; col++) { - if (this.square[row][col] === char || (char === 'J' && this.square[row][col] === 'I')) { - result += this.coords[row] + this.coords[col]; - found = true; - break; - } - } - if (found) { - break; - } - } - } - return result; - }, - _transposeEncode: function(text, transKey) { - const keyLength = transKey.length; - const numCols = keyLength; - const numRows = Math.ceil(text.length / numCols); - const grid = []; - let textIdx = 0; - - for (let row = 0; row < numRows; row++) { - grid[row] = []; - for (let col = 0; col < numCols; col++) { - grid[row][col] = textIdx < text.length ? text[textIdx++] : ''; - } - } - - const keyOrder = []; - for (let i = 0; i < transKey.length; i++) { - keyOrder.push({ char: transKey[i], index: i }); - } - keyOrder.sort((a, b) => { - if (a.char < b.char) return -1; - if (a.char > b.char) return 1; - return a.index - b.index; - }); - - let result = ''; - for (const keyItem of keyOrder) { - const col = keyItem.index; - for (let row = 0; row < numRows; row++) { - if (grid[row][col]) { - result += grid[row][col]; - } - } - } - return result; - }, - _transposeDecode: function(text, transKey) { - const keyLength = transKey.length; - const numCols = keyLength; - const numRows = Math.ceil(text.length / numCols); - const keyOrder = []; - - for (let i = 0; i < transKey.length; i++) { - keyOrder.push({ char: transKey[i], index: i }); - } - keyOrder.sort((a, b) => { - if (a.char < b.char) return -1; - if (a.char > b.char) return 1; - return a.index - b.index; - }); - - const grid = []; - for (let row = 0; row < numRows; row++) { - grid[row] = new Array(numCols); - } - - let textIdx = 0; - for (const keyItem of keyOrder) { - const col = keyItem.index; - const colLength = Math.ceil((text.length - col) / numCols); - for (let row = 0; row < colLength && textIdx < text.length; row++) { - grid[row][col] = text[textIdx++]; - } - } - - let result = ''; - for (let row = 0; row < numRows; row++) { - for (let col = 0; col < numCols; col++) { - if (grid[row] && grid[row][col]) { - result += grid[row][col]; - } - } - } - return result; - }, - _fromCoordText: function(text) { - let result = ''; - for (let i = 0; i < text.length; i += 2) { - if (i + 1 >= text.length) { - break; - } - const row = this.coords.indexOf(text[i]); - const col = this.coords.indexOf(text[i + 1]); - if (row >= 0 && row < 5 && col >= 0 && col < 5) { - result += this.square[row][col]; - } - } - return result; - }, - func: function(text, options) { - options = options || {}; - const transKey = this._transKey(options); - if (transKey.length === 0) { - return text; - } - - const cleaned = text.toUpperCase().replace(/[^A-Z]/g, ''); - if (cleaned.length === 0) { - return text; - } - - const coordText = this._toCoordText(cleaned); - return this._transposeEncode(coordText, transKey); - }, - reverse: function(text, options) { - options = options || {}; - const transKey = this._transKey(options); - if (transKey.length === 0) { - return text; - } - - const cleaned = text.toUpperCase().replace(/[^N7AX5]/g, ''); - if (cleaned.length === 0 || cleaned.length % 2 !== 0) { - return text; - } - - const coordText = this._transposeDecode(cleaned, transKey); - return this._fromCoordText(coordText); - }, - preview: function(text, options) { - if (!text) { - return '[n7ax]'; - } - const result = this.func(text.slice(0, 5), options); - return result.substring(0, 12) + (result.length > 12 ? '...' : ''); - }, - detector: function(text) { - const cleaned = text.replace(/[\s]/g, '').toUpperCase(); - if (cleaned.length < 10) { - return false; - } - if (!/^[N7AX5]+$/.test(cleaned)) { - return false; - } - return cleaned.length % 2 === 0; - } -}); diff --git a/tests/test_universal.js b/tests/test_universal.js index 66485ef..e848af1 100644 --- a/tests/test_universal.js +++ b/tests/test_universal.js @@ -468,11 +468,6 @@ const limitations = { acceptPartial: true, normalize: { stripNonLetters: true, stripWhitespace: true } }, - 'n7ax': { - issues: 'Requires key, only encodes A-Z, removes spaces and punctuation', - acceptPartial: true, - normalize: { stripNonLetters: true, stripWhitespace: true } - }, 'adfgvx': { issues: 'Only encodes A-Z and 0-9, removes spaces and punctuation', acceptPartial: true,