mirror of
https://github.com/elder-plinius/P4RS3LT0NGV3.git
synced 2026-07-12 07:26:33 +02:00
removed fake transform
This commit is contained in:
@@ -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
|
||||
|
||||
+2
-2
@@ -4,11 +4,11 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Parseltongue 4.0 — Text Encoder, Decoder & Steganography Tool</title>
|
||||
<meta name="description" content="Free online text encoder & decoder with 223+ transforms: ciphers, Base64, Unicode styles, emoji steganography & QR codes. No install required — because sometimes you need to speak in tongues that don't exist.">
|
||||
<meta name="description" content="Free online text encoder & decoder with 222+ transforms: ciphers, Base64, Unicode styles, emoji steganography & QR codes. No install required — because sometimes you need to speak in tongues that don't exist.">
|
||||
<meta name="keywords" content="P4RS3LT0NGV3, Parseltongue, text encoder, text decoder, cipher tool, steganography, Unicode converter, Base64">
|
||||
<meta name="application-name" content="P4RS3LT0NGV3">
|
||||
<meta property="og:title" content="Parseltongue 4.0 — Text Encoder, Decoder & Steganography Tool">
|
||||
<meta property="og:description" content="223+ encodings, ciphers & steganography in your browser. Because sometimes you need to speak in tongues that don't exist.">
|
||||
<meta property="og:description" content="222+ encodings, ciphers & steganography in your browser. Because sometimes you need to speak in tongues that don't exist.">
|
||||
<meta property="og:type" content="website">
|
||||
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
});
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user