Refactor emoji library, improve UI responsiveness, and enhance text transforms

- Refactor emojiLibrary.js: auto-generate EMOJI_LIST from categorized emojis
  - Removed 400+ lines of duplicate emoji definitions
  - Implemented single source of truth with deduplication
  - Added emoji count display updates

- Improve responsive layout and styling (style.css)
  - Add flex-wrap to header and transform categories for better wrapping
  - Fix transform button width and sizing issues
  - Improve tokenade-presets responsive layout
  - Remove fixed min-width constraints

- Optimize app performance (app.js)
  - Remove watchers that caused unnecessary emoji grid re-renders
  - Fix category scroll behavior with proper offset calculation
  - Move lastCopyTime from methods to data
  - Refactor setupPasteHandlers method location
  - Fix applyTransform to pass full text to transforms instead of character-by-character
  - Add missing transforms to categories (Vaporwave, Disemvowel, ROT18, ROT5, A1Z26, etc.)

- UI/UX improvements (index.html)
  - Switch to Vue.js production build for better performance
  - Simplify copy buttons (icon only, remove redundant text)
  - Fix Vue key prop warnings with unique keys
  - Improve emoji grid initialization and tab switching logic
  - Reorganize Tokenade panel controls
  - Add structural comments for better code navigation
  - Add emojiWordMap.js script reference

- Enhance text transforms (transforms.js)
  - Inline try-catch blocks for base64, base64url, and url transforms (return '[Invalid input]' on error)
  - Fix numerous copy-paste errors in transform previews (vaporwave, rot5, rot18, upside_down, elder_futhark, greek, wingdings)
  - Fix klingon transform case sensitivity and reverse function for multi-character mappings
  - Update reverse_words preview to show ellipsis at end
  - Refactor emoji_speak to use keyword-based emoji lookup with two-pass replacement
  - Fix emoji_speak digit duplication by excluding single digits from symbol pass

- Add emojiWordMap.js: emoji-to-keywords mapping system
  - Extract emoji word map to separate file for better maintainability
  - Refactor from word->emoji to emoji->keywords[] for variety and semantic realism
  - Add 850+ lines of comprehensive emoji keyword mappings
  - Include 57+ jailbreak-related terms (unlock, bypass, override, escape, exploit, etc.)
  - Add special character mappings (math symbols, arrows, punctuation equivalents)
  - Exclude structural punctuation to maintain readability
This commit is contained in:
Dustin Farley
2025-11-08 10:45:59 -08:00
parent 00321f4d02
commit fc4910555a
6 changed files with 1151 additions and 575 deletions

View File

@@ -66,6 +66,7 @@ body {
header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
@@ -855,7 +856,6 @@ button:hover {
/* Transform layout */
.transform-layout {
display: grid;
gap: 24px;
margin-top: 16px;
}
@@ -877,6 +877,12 @@ button:hover {
border-bottom: 1px solid var(--input-border);
}
.transform-category-legend > div {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.legend-title {
font-size: 0.9rem;
font-weight: 500;
@@ -989,6 +995,20 @@ button:hover {
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 8px;
margin-bottom: 16px;
width: 100%; /* Ensure grid doesn't overflow container */
box-sizing: border-box;
}
#category-randomizer .transform-buttons {
display: flex;
}
#category-randomizer .transform-buttons .transform-button-group {
width: 100%;
}
#category-randomizer .transform-buttons .transform-button .transform-preview {
max-width: 300px;
}
/* Carrier styling */
@@ -1308,8 +1328,7 @@ button:hover {
flex-direction: column;
align-items: center;
gap: 4px;
min-width: 110px;
max-width: 100%;
width: 100%;
font-weight: 500;
text-align: center;
border: 1px solid var(--input-border);
@@ -1816,7 +1835,6 @@ button:hover {
border: 2px solid rgba(200, 170, 255, 0.35) !important;
padding: 18px 28px !important;
letter-spacing: .3px;
min-width: 48ch;
justify-content: center;
text-align: center;
}
@@ -1976,9 +1994,6 @@ html {
.tokenade-presets > label {
margin-right: 4px;
}
.tokenade-presets .transform-button {
padding: 6px 10px;
}
/* Hacker style controls */
.hacker-controls {
@@ -2086,14 +2101,14 @@ html {
/* Presets row polish */
.tokenade-presets {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: nowrap;
overflow-x: visible;
margin: 8px 0 12px 0;
}
.tokenade-presets .transform-button { flex: 0 0 auto; min-width: 136px; padding: 5px 8px; }
.tokenade-presets .transform-button {
flex: 1 0 auto;
padding: 5px 8px;
width: unset;
}
/* Quick picks panel */
.carrier-quick-grid {

View File

@@ -6,8 +6,8 @@
<title>Parseltongue 2.0 - LLM Payload Crafter</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/notification.css">
<!-- Vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<!-- Vue.js (Production Build) -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<!-- Font Awesome for icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
</head>
@@ -185,7 +185,7 @@
<div class="decode-result">{{ universalDecodeResult.text }}</div>
<div class="decode-actions">
<button class="copy-button" @click="copyToClipboard(universalDecodeResult.text)" title="Copy decoded text">
<i class="fas fa-copy"></i> Copy
<i class="fas fa-copy"></i>
</button>
<button class="use-as-input-button" v-if="universalDecodeResult.text" @click="transformInput = universalDecodeResult.text" title="Use this as input for transforms">
<i class="fas fa-arrow-up"></i> Use as Input
@@ -291,13 +291,6 @@
<input class="hacker-slider" type="range" v-model.number="tbRepeats" min="1" max="50" />
<span class="slider-value">{{ tbRepeats }}</span>
</label>
<div class="segmented" title="Invisible separator inserted between units">
<div class="segmented-label">Separator</div>
<button :class="{active: tbSeparator==='zwj'}" @click="tbSeparator='zwj'">ZWJ</button>
<button :class="{active: tbSeparator==='zwnj'}" @click="tbSeparator='zwnj'">ZWNJ</button>
<button :class="{active: tbSeparator==='zwsp'}" @click="tbSeparator='zwsp'">ZWSP</button>
<button :class="{active: tbSeparator==='none'}" @click="tbSeparator='none'">None</button>
</div>
<label class="switch neon" title="Adds VS16/VS15 after glyphs to increase token churn">
<input type="checkbox" v-model="tbIncludeVS" />
<span>Variation Selectors</span>
@@ -311,6 +304,15 @@
<input type="checkbox" v-model="tbAutoCopy" />
<span>Auto-copy</span>
</label>
<div class="segmented" title="Invisible separator inserted between units">
<div class="segmented-label">Separator</div>
<div>
<button :class="{active: tbSeparator==='zwj'}" @click="tbSeparator='zwj'">ZWJ</button>
<button :class="{active: tbSeparator==='zwnj'}" @click="tbSeparator='zwnj'">ZWNJ</button>
<button :class="{active: tbSeparator==='zwsp'}" @click="tbSeparator='zwsp'">ZWSP</button>
<button :class="{active: tbSeparator==='none'}" @click="tbSeparator='none'">None</button>
</div>
</div>
</div>
<div class="output-instructions">
<small>
@@ -331,7 +333,7 @@
<label v-if="tbSingleCarrier" title="Choose the carrier emoji (quick list)">
Carrier
<select v-model="tbCarrier" @focus="setCarrierFromSelected">
<option v-for="em in carrierEmojiList" :key="em" :value="em">{{ em }}</option>
<option v-for="(em, index) in carrierEmojiList" :key="'carrier-'+index" :value="em">{{ em }}</option>
</select>
</label>
<label v-if="tbSingleCarrier" title="Advanced: use this symbol or string as the embedded payload for encoding">
@@ -345,7 +347,7 @@
<i class="fas fa-hammer"></i> Generate Tokenade
</button>
<button class="copy-button" v-if="tokenBombOutput" @click="copyToClipboard(tokenBombOutput)">
<i class="fas fa-copy"></i> Copy
<i class="fas fa-copy"></i>
</button>
<div class="output-instructions" v-if="tokenBombOutput">
<small>
@@ -384,7 +386,7 @@
<i class="fas fa-hammer"></i> Generate Text Payload
</button>
<button class="copy-button" v-if="textPayload" @click="copyToClipboard(textPayload)">
<i class="fas fa-copy"></i> Copy
<i class="fas fa-copy"></i>
</button>
</div>
<div class="output-container" v-if="textPayload">
@@ -456,16 +458,18 @@
<div class="transform-section">
<div class="transform-category-legend">
<div class="legend-title">Categories:</div>
<div class="legend-item transform-category-encoding" data-target="category-encoding">Encoding</div>
<div class="legend-item transform-category-cipher" data-target="category-cipher">Ciphers</div>
<div class="legend-item transform-category-visual" data-target="category-visual">Visual</div>
<div class="legend-item transform-category-format" data-target="category-format">Formatting</div>
<div class="legend-item transform-category-unicode" data-target="category-unicode">Unicode</div>
<div class="legend-item transform-category-special" data-target="category-special">Special</div>
<div class="legend-item transform-category-fantasy" data-target="category-fantasy">Fantasy</div>
<div class="legend-item transform-category-ancient" data-target="category-ancient">Ancient</div>
<div class="legend-item transform-category-technical" data-target="category-technical">Technical</div>
<div class="legend-item transform-category-randomizer" data-target="category-randomizer">🎲 Randomizer</div>
<div>
<div class="legend-item transform-category-encoding" data-target="category-encoding">Encoding</div>
<div class="legend-item transform-category-cipher" data-target="category-cipher">Ciphers</div>
<div class="legend-item transform-category-visual" data-target="category-visual">Visual</div>
<div class="legend-item transform-category-format" data-target="category-format">Formatting</div>
<div class="legend-item transform-category-unicode" data-target="category-unicode">Unicode</div>
<div class="legend-item transform-category-special" data-target="category-special">Special</div>
<div class="legend-item transform-category-fantasy" data-target="category-fantasy">Fantasy</div>
<div class="legend-item transform-category-ancient" data-target="category-ancient">Ancient</div>
<div class="legend-item transform-category-technical" data-target="category-technical">Technical</div>
<div class="legend-item transform-category-randomizer" data-target="category-randomizer">🎲 Randomizer</div>
</div>
</div>
<div class="transform-categories">
<!-- Encoding Category -->
@@ -817,7 +821,7 @@
<div class="decode-result">{{ universalDecodeResult.text }}</div>
<div class="decode-actions">
<button class="copy-button" @click="copyToClipboard(universalDecodeResult.text)" title="Copy decoded text">
<i class="fas fa-copy"></i> Copy
<i class="fas fa-copy"></i>
</button>
<button class="use-as-input-button" v-if="universalDecodeResult.text" @click="transformInput = universalDecodeResult.text" title="Use this as input for transforms">
<i class="fas fa-arrow-up"></i> Use as Input
@@ -853,13 +857,16 @@
</div>
<div class="history-actions">
<button class="copy-again-button" @click="copyToClipboard(item.content)" title="Copy again">
<i class="fas fa-copy"></i> Copy Again
<i class="fas fa-copy"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- End of .tabs div -->
<!-- Advanced Settings Panel (inside app so Vue bindings work) -->
<div id="unicode-options-panel" class="unicode-options-panel">
<div class="unicode-panel-header">
@@ -929,7 +936,10 @@
</div>
</div>
<!-- End of #app div -->
<!-- Load JavaScript files after Vue template -->
<script src="js/emojiWordMap.js"></script>
<script src="js/transforms.js"></script>
<script src="js/steganography.js"></script>
<script src="js/emojiLibrary.js"></script>
@@ -1004,6 +1014,13 @@
console.log('Initializing emoji grid, attempt:', retryCount + 1);
// Check if we're on the steganography tab before trying to initialize
const app = document.getElementById('app').__vue__;
if (!app || app.activeTab !== 'steganography') {
console.log('Not on steganography tab, skipping emoji grid initialization');
return;
}
// Get the emoji library element
const emojiLibrary = document.querySelector('.emoji-library');
@@ -1019,7 +1036,6 @@
try {
window.emojiLibrary.renderEmojiGrid('emoji-grid-container', function(emoji) {
// Simulate emoji selection by calling the Vue method if possible
const app = document.getElementById('app').__vue__;
if (app && app.selectEmoji) {
app.selectEmoji(emoji);
}
@@ -1044,10 +1060,7 @@
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
// First attempt after a short delay to ensure Vue has initialized
setTimeout(initEmojiGrid, 500);
// Also initialize when switching to the steganography tab
// Set up watcher for tab changes to initialize emoji grid when needed
const app = document.getElementById('app');
if (app && app.__vue__) {
const vue = app.__vue__;
@@ -1061,6 +1074,11 @@
}
});
}
// If we're already on the steganography tab on page load, initialize it
if (vue.activeTab === 'steganography') {
setTimeout(initEmojiGrid, 500);
}
}
});
</script>

View File

@@ -15,8 +15,8 @@ window.app = new Vue({
// Transform categories for styling
transformCategories: {
encoding: ['Base64', 'Base64 URL', 'Base32', 'Base45', 'Base58', 'Base62', 'Binary', 'Hexadecimal', 'ASCII85', 'URL Encode', 'HTML Entities'],
cipher: ['Caesar Cipher', 'ROT13', 'ROT47', 'Morse Code', 'Atbash Cipher', 'ROT5', 'Vigenère Cipher', 'Rail Fence (3 Rails)', 'Baconian Cipher', 'Tap Code'],
visual: ['Rainbow Text', 'Strikethrough', 'Underline', 'Reverse Text', 'Alternating Case', 'Reverse Words', 'Random Case', 'Title Case', 'Sentence Case', 'Emoji Speak', 'Ubbi Dubbi', 'Rövarspråket'],
cipher: ['Caesar Cipher', 'ROT13', 'ROT47', 'ROT18', 'ROT5', 'Morse Code', 'Atbash Cipher', 'Vigenère Cipher', 'Affine Cipher (a=5,b=8)', 'Rail Fence (3 Rails)', 'Baconian Cipher', 'Tap Code', 'A1Z26', 'QWERTY Right Shift'],
visual: ['Rainbow Text', 'Strikethrough', 'Underline', 'Reverse Text', 'Alternating Case', 'Reverse Words', 'Random Case', 'Title Case', 'Sentence Case', 'Emoji Speak', 'Ubbi Dubbi', 'Rövarspråket', 'Vaporwave', 'Disemvowel'],
format: ['Pig Latin', 'Leetspeak', 'NATO Phonetic', 'camelCase', 'snake_case', 'kebab-case'],
unicode: ['Invisible Text', 'Upside Down', 'Full Width', 'Small Caps', 'Bubble', 'Braille', 'Greek Letters', 'Wingdings', 'Superscript', 'Subscript', 'Regional Indicator Letters', 'Fraktur', 'Cyrillic Stylized', 'Katakana', 'Hiragana', 'Roman Numerals'],
special: ['Medieval', 'Cursive', 'Monospace', 'Double-Struck', 'Elder Futhark', 'Mirror Text', 'Zalgo'],
@@ -54,7 +54,7 @@ window.app = new Vue({
filteredEmojis: [...window.emojiLibrary.EMOJI_LIST],
selectedEmoji: null,
carrierEmojiList: [...window.emojiLibrary.EMOJI_LIST],
quickCarrierEmojis: ['🐍','🐉','🐲','🔥','💥','🗿','⚓','⭐','✨','🚀','💀','🪨','🍃','🪶','🔮','🐢','🐊','🦎','🐍'],
quickCarrierEmojis: ['🐍','🐉','🐲','🔥','💥','🗿','⚓','⭐','✨','🚀','💀','🪨','🍃','🪶','🔮','🐢','🐊','🦎'],
tbCarrierManual: '',
// Token Bomb Generator
tbDepth: 3,
@@ -105,7 +105,10 @@ window.app = new Vue({
// Danger zone controls
showDangerModal: false,
dangerThresholdTokens: 25_000_000
dangerThresholdTokens: 25_000_000,
// Copy operation tracking (moved from methods)
lastCopyTime: 0
},
methods: {
toggleUnicodePanel() {
@@ -278,17 +281,8 @@ window.app = new Vue({
console.log('Transform mapping:', transformInfo);
}
} else {
// Handle text with proper Unicode segmentation
const segments = window.emojiLibrary.splitEmojis(this.transformInput);
const transformedSegments = segments.map(segment => {
// Skip transformation for emojis and complex Unicode characters
if (segment.length > 1 || /[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}]/u.test(segment)) {
return segment;
}
return transform.func(segment);
});
this.transformOutput = window.emojiLibrary.joinEmojis(transformedSegments);
// Apply transform to full text - let the transform handle segmentation if needed
this.transformOutput = transform.func(this.transformInput);
}
// Set flag to mark this as a transform-initiated copy
@@ -498,9 +492,6 @@ window.app = new Vue({
},
// Utility Methods
// Track last copy operation to prevent rapid repeated copies
lastCopyTime: 0,
async copyToClipboard(text) {
if (!text) return;
@@ -1737,10 +1728,18 @@ window.app = new Vue({
});
item.classList.add('active-category');
// Jump directly to the target element
targetElement.scrollIntoView({
behavior: 'smooth',
block: 'start'
// Get height of .input-section so we can offset the scroll
const inputSection = document.querySelector('.input-section');
const inputSectionHeight = inputSection.offsetHeight;
// Calculate the target scroll position with offset
const elementPosition = targetElement.getBoundingClientRect().top + window.pageYOffset;
const offsetPosition = elementPosition - inputSectionHeight - 10; // Extra 10px padding
// Scroll to the calculated position
window.scrollTo({
top: offsetPosition,
behavior: 'smooth'
});
// Highlight the section briefly to draw attention
@@ -2141,6 +2140,25 @@ window.app = new Vue({
}
this.textPayload = out;
this.showNotification('<i class="fas fa-bomb"></i> Text payload generated', 'success');
},
// Set up paste event handlers for all textareas
setupPasteHandlers() {
// Get all textareas in the app
const textareas = document.querySelectorAll('textarea');
// Add paste event listener to each textarea
textareas.forEach(textarea => {
textarea.addEventListener('paste', (e) => {
// Mark this as an explicit paste event
this.isPasteOperation = true;
// Reset the flag after a short delay
setTimeout(() => {
this.isPasteOperation = false;
}, 100);
});
});
}
},
// Initialize theme and components
@@ -2201,24 +2219,6 @@ window.app = new Vue({
});
},
// Set up paste event handlers for all textareas
setupPasteHandlers() {
// Get all textareas in the app
const textareas = document.querySelectorAll('textarea');
// Add paste event listener to each textarea
textareas.forEach(textarea => {
textarea.addEventListener('paste', (e) => {
// Mark this as an explicit paste event
this.isPasteOperation = true;
// Reset the flag after a short delay
setTimeout(() => {
this.isPasteOperation = false;
}, 100);
});
});
},
// No keyboard shortcuts - they were removed as requested
created() {
// Initialize any required functionality
@@ -2233,20 +2233,10 @@ window.app = new Vue({
if (this.activeTransform && this.activeTab === 'transforms') {
this.transformOutput = this.activeTransform.func(this.transformInput);
}
},
// Make sure emoji list stays loaded when user types in any input
emojiMessage() {
this.filteredEmojis = [...window.emojiLibrary.EMOJI_LIST];
this.$nextTick(() => {
this.renderEmojiGrid();
});
},
// Also watch the decode input field for typing activity
decodeInput() {
this.filteredEmojis = [...window.emojiLibrary.EMOJI_LIST];
this.$nextTick(() => {
this.renderEmojiGrid();
});
}
// Note: Removed watchers for emojiMessage and decodeInput that were
// unnecessarily re-rendering the emoji grid on every keystroke.
// The emoji grid is now only rendered when switching tabs or categories,
// which prevents losing the selected emoji state while typing.
}
});

View File

@@ -22,452 +22,6 @@ window.emojiLibrary.joinEmojis = function(emojis) {
return emojis.join('');
};
// Additional emojis for expanded library
window.emojiLibrary.ADDITIONAL_EMOJIS = [
// Animals & Nature
"🐇", "🦊", "🦁", "🐯", "🐮", "🐷", "🐸", "🐵", "🐔", "🐧", "🐦", "🐤", "🦆", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🐛", "🦋", "🐌", "🐞", "🐜", "🕷️", "🦂", "🦟", "🦠", "🦨", "🦩", "🦫", "🦬", "🐻‍❄️", "🐼", "🐨", "🐕", "🐶", "🐩", "🐈", "🐱", "🪱",
// Food & Drink
"🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", "🍓", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", "🥝", "🍅", "🍆", "🥑", "🥦", "🥬", "🥒", "🌶️", "🌽", "🥕", "🧄", "🧅", "🥔", "🍠", "🥐", "🍔", "🍕", "🍖", "🍗", "🍤", "🍣", "🍱", "🍜", "🍲", "🍥",
// Travel & Places
"🚗", "🚕", "🚙", "🚌", "🚎", "🚒", "🚑", "🚚", "🚛", "🚜", "🚲", "🚐", "🚟", "🚡", "🚀", "🛸", "🛥️", "🏎️", "🏍️", "🚤", "🚢", "🚁", "🚂", "🚆", "🚈", "🌎", "🌏", "🌍", "🏔️", "🏕️",
// Activities & Sports
"⚽", "🏀", "🏈", "🏐", "🏉", "🎾", "🎳", "🏑", "🏒", "🏓", "🏸", "🥊", "🥋", "🥅", "🤾", "🎿", "🏄", "🏂", "🏊", "🏋️", "🤼", "🤸", "🤺", "🤽", "🤹", "🎯", "🎱", "🎽", "🚴", "🚵",
// Tech & Objects
"💻", "⌨️", "🖥️", "🖱️", "🖨️", "📱", "☎️", "📞", "📟", "📠", "📺", "📻", "🎙️", "🎚️", "🎛️", "🧭", "⏱️", "⏲️", "⏰", "🕰️", "📡", "🔋", "🔌", "💡", "🏮", "🪔", "🧯", "🛢️", "💸", "💵", "💳", "💴", "💶", "💷", "💰", "💱", "💲", "💼", "💽", "💾", "💿",
// Symbols
"❤️", "💛", "💚", "💙", "💜", "💔", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "💤", "💢", "💣", "💥", "💦", "💨", "💩", "💫", "💬", "🔥", "💠", "👾", "👻", "💀", "👽", "👿", "🩸",
// Mystical & Fantasy
"🧙", "🧙‍♂️", "🧙‍♀️", "🧚", "🧚‍♂️", "🧚‍♀️", "🧛", "🧛‍♂️", "🧛‍♀️", "🧜", "🧜‍♂️", "🧜‍♀️", "👹", "👺", "👻", "👽", "👾", "🐲", "🔮", "🐍", "🐉", "🦄", "👸", "🥷", "👰", "🧔", "⚗️", "🔯", "🔱", "⚜️", "✨", "🌠", "🌋", "💎", "💐", "🍄", "🌺", "🌹", "🐭", "🐚", "🐊", "🐢", "🐇", "🐰", "🔥", "💥", "🌀", "🌈", "🌪️", "🩸", "🪱", "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘",
// Flags
"🏁", "🚩", "🎌", "🏴", "🏳️", "🏳️‍🌈", "🏳️‍⚧️", "🏴‍☠️", "🇺🇸", "🇨🇦", "🇬🇧", "🇩🇪", "🇫🇷", "🇮🇹", "🇯🇵", "🇰🇷", "🇷🇺", "🇨🇳", "🇮🇳", "🇦🇺", "🇧🇷", "🇪🇸", "🇳🇱", "🇵🇹", "🇸🇪", "🇦🇷", "🇦🇺", "🇦🇹", "🇧🇪", "🇧🇴"
];
// Make emoji list globally available
window.emojiLibrary.EMOJI_LIST = [
// Blood drop, worm, and moon emojis
"🩸", // Blood Drop
"🪱", // Worm
"🌑", // New Moon
"🌒", // Waxing Crescent Moon
"🌓", // First Quarter Moon
"🌔", // Waxing Gibbous Moon
"🌕", // Full Moon
"🌖", // Waning Gibbous Moon
"🌗", // Last Quarter Moon
"🌘", // Waning Crescent Moon
// Faces and People
"😀", // Grinning Face
"😁", // Beaming Face with Smiling Eyes
"😂", // Face with Tears of Joy
"🤣", // Rolling on the Floor Laughing
"😃", // Grinning Face with Big Eyes
"😄", // Grinning Face with Smiling Eyes
"😅", // Grinning Face with Sweat
"😆", // Grinning Squinting Face
"😉", // Winking Face
"😊", // Smiling Face with Smiling Eyes
"😋", // Face Savoring Food
"😎", // Smiling Face with Sunglasses
"😍", // Smiling Face with Heart-Eyes
"😘", // Face Blowing a Kiss
"🥰", // Smiling Face with Hearts
"😗", // Kissing Face
"😙", // Kissing Face with Smiling Eyes
"😚", // Kissing Face with Closed Eyes
"🙂", // Slightly Smiling Face
"🤗", // Hugging Face
"🤩", // Star-Struck
"🤔", // Thinking Face
"🤨", // Face with Raised Eyebrow
"😐", // Neutral Face
"😑", // Expressionless Face
"😶", // Face Without Mouth
"🙄", // Face with Rolling Eyes
"😏", // Smirking Face
"😣", // Persevering Face
"😥", // Sad but Relieved Face
"😮", // Face with Open Mouth
"🤐", // Zipper-Mouth Face
"😯", // Hushed Face
"😪", // Sleepy Face
"😫", // Tired Face
"😴", // Sleeping Face
"😌", // Relieved Face
"😛", // Face with Tongue
"😜", // Winking Face with Tongue
"😝", // Squinting Face with Tongue
"🤤", // Drooling Face
"😒", // Unamused Face
"😓", // Downcast Face with Sweat
"😔", // Pensive Face
"😕", // Confused Face
"🙃", // Upside-Down Face
"🤑", // Money-Mouth Face
"😲", // Astonished Face
"🙁", // Slightly Frowning Face
"😖", // Confounded Face
"😞", // Disappointed Face
"😟", // Worried Face
"😤", // Face with Steam From Nose
"😢", // Crying Face
"😭", // Loudly Crying Face
"😧", // Anguished Face
"😨", // Fearful Face
"😩", // Weary Face
"🤯", // Exploding Head
"😱", // Face Screaming in Fear
"😳", // Flushed Face
"🥵", // Hot Face
"🥶", // Cold Face
"😡", // Pouting Face
"😠", // Angry Face
"🤬", // Face with Symbols on Mouth
"😷", // Face with Medical Mask
"🤒", // Face with Thermometer
"🤕", // Face with Head-Bandage
"🤢", // Nauseated Face
"🤮", // Face Vomiting
"🤧", // Sneezing Face
"😇", // Smiling Face with Halo
"🥳", // Partying Face
"🥴", // Woozy Face
"🥺", // Pleading Face
"🧐", // Face with Monocle
"🥱", // Yawning Face
"🧠", // Brain
// Gestures and Body Parts
"👍", // Thumbs Up
"👎", // Thumbs Down
"👏", // Clapping Hands
"🙌", // Raising Hands
"🤝", // Handshake
"👋", // Waving Hand
"✌️", // Victory Hand
"🤟", // Love-You Gesture
"🤘", // Sign of the Horns
"👊", // Oncoming Fist
"✊", // Raised Fist
"👆", // Backhand Index Pointing Up
"👇", // Backhand Index Pointing Down
"👈", // Backhand Index Pointing Left
"👉", // Backhand Index Pointing Right
"👌", // OK Hand
"🤌", // Pinched Fingers
"🤏", // Pinching Hand
"✋", // Raised Hand
"🤚", // Raised Back of Hand
"🖐️", // Hand with Fingers Splayed
"🖖", // Vulcan Salute
"👀", // Eyes
"👁️", // Eye
"👄", // Mouth
"🧿", // Nazar Amulet
// Celebration & Objects
"🎉", // Party Popper
"🎊", // Confetti Ball
"🎂", // Birthday Cake
"🎁", // Wrapped Gift
"🎈", // Balloon
"🎄", // Christmas Tree
"🎃", // Jack-O-Lantern
"🏆", // Trophy
"🏅", // Sports Medal
"🥇", // 1st Place Medal
"🥈", // 2nd Place Medal
"🥉", // 3rd Place Medal
"💰", // Money Bag
"💸", // Money with Wings
"💵", // Dollar Banknote
"💴", // Yen Banknote
"💶", // Euro Banknote
"💷", // Pound Banknote
"💯", // Hundred Points
"📱", // Mobile Phone
"💻", // Laptop
"⌨️", // Keyboard
"🖥️", // Desktop Computer
"🔒", // Locked
"🔓", // Unlocked
// Food & Drink
"🍕", // Pizza
"🍔", // Hamburger
"🍦", // Ice Cream
"🍩", // Doughnut
"🍺", // Beer Mug
"🍷", // Wine Glass
"☕", // Hot Beverage
// Nature & Weather
"🌈", // Rainbow
"🌞", // Sun with Face
"🌑", // New Moon
"🌒", // Waxing Crescent Moon
"🌓", // First Quarter Moon
"🌔", // Waxing Gibbous Moon
"🌕", // Full Moon
"🌖", // Waning Gibbous Moon
"🌗", // Last Quarter Moon
"🌘", // Waning Crescent Moon
"🌙", // Crescent Moon
"⭐", // Star
"🌟", // Glowing Star
"⚡", // High Voltage
"❄️", // Snowflake
"🔥", // Fire
"💧", // Droplet
"🌊", // Water Wave
// Animals
"🐇", // Follow The
"🐱", // Cat Face
"🐶", // Dog Face
"🪱", // Worm
"🦊", // Fox
"🐼", // Panda
"🦁", // Lion
"🐬", // Dolphin
"🦄", // Unicorn
// Symbols & Special
"❤️", // Red Heart
"🩸", // Blood Drop
"🧡", // Orange Heart
"💚", // Green Heart
"💙", // Blue Heart
"💜", // Purple Heart
"🚀", // Rocket
"👀", // Eyes
"💀", // Skull
"🥹", // Face Holding Back Tears
"🐍", // Snake
"🐉", // Dragon
"🐲", // Dragon Face
"🧙‍♂️", // Wizard
"🪄", // Magic Wand
"🏴‍☠️", // Pirate Flag
"🦅", // Eagle (often associated with pirates)
"🦜", // Parrot (pirate symbol)
"💻", // Laptop (hacker symbol)
"🕶️", // Sunglasses (cool guy symbol)
"🧑‍💻", // Technologist
"👨‍💻", // Man Technologist
"👩‍💻", // Woman Technologist
"🕵️", // Detective
"🕵️‍♂️", // Man Detective
"🕵️‍♀️", // Woman Detective
"🖥️", // Desktop Computer
"⌨️", // Keyboard
"🖱️", // Computer Mouse
"🕹️", // Joystick
"📱", // Mobile Phone
"📲", // Mobile Phone with Arrow
"🔓", // Unlocked (hacker symbol)
"🔑", // Key (hacker symbol)
"🗝️", // Old Key (hacker symbol)
"🛡️", // Shield (hacker symbol)
"⚔️", // Crossed Swords (hacker symbol)
"🧬", // DNA (hacker symbol)
"🧫", // Petri Dish (hacker symbol)
"🧪", // Test Tube (hacker symbol)
"🛠️", // Hammer and Wrench (hacker symbol)
"⚙️", // Gear (hacker symbol)
"🧰", // Toolbox (hacker symbol)
"🧲", // Magnet (hacker symbol)
"💣", // Bomb (hacker symbol)
"🕳️", // Hole (hacker symbol)
"📡", // Satellite Antenna (hacker symbol)
"🛰️", // Satellite (hacker symbol)
"📞", // Telephone Receiver (hacker symbol)
"☎️", // Telephone (hacker symbol)
"📟", // Pager (hacker symbol)
"📠", // Fax Machine (hacker symbol)
"🔌", // Electric Plug (hacker symbol)
"💡", // Light Bulb (hacker symbol)
"🔦", // Flashlight (hacker symbol)
"🕯️", // Candle (hacker symbol)
"🗞️", // Rolled-Up Newspaper (hacker symbol)
"📜", // Scroll (hacker symbol)
"📃", // Page with Curl (hacker symbol)
"📄", // Page Facing Up (hacker symbol)
"📑", // Bookmark Tabs (hacker symbol)
"📊", // Bar Chart (hacker symbol)
"📈", // Chart Increasing (hacker symbol)
"📉", // Chart Decreasing (hacker symbol)
"🗂️", // Card Index Dividers (hacker symbol)
"🗃️", // Card File Box (hacker symbol)
"🗄️", // File Cabinet (hacker symbol)
"🗑️", // Wastebasket (hacker symbol)
"🛢️", // Oil Drum (hacker symbol)
"🛎️", // Bellhop Bell (hacker symbol)
"🧳", // Luggage (hacker symbol)
"🛌", // Person in Bed (hacker symbol)
"🛏️", // Bed (hacker symbol)
"🛋️", // Couch and Lamp (hacker symbol)
"🪑", // Chair (hacker symbol)
"🚪", // Door (hacker symbol)
"🧴", // Lotion Bottle (hacker symbol)
"🧷", // Safety Pin (hacker symbol)
"🧹", // Broom (hacker symbol)
"🧺", // Basket (hacker symbol)
"🧻", // Roll of Paper (hacker symbol)
"🧼", // Soap (hacker symbol)
"🧽", // Sponge (hacker symbol)
"🧯", // Fire Extinguisher (hacker symbol)
"🛒", // Shopping Cart (hacker symbol)
"🚬", // Cigarette (hacker symbol)
"⚰️", // Coffin (hacker symbol)
"⚱️", // Funeral Urn (hacker symbol)
"🗿", // Moai (hacker symbol)
"🛂", // Passport Control (hacker symbol)
"🛃", // Customs (hacker symbol)
"🛄", // Baggage Claim (hacker symbol)
"🛅", // Left Luggage (hacker symbol)
"🚹", // Men's Room (hacker symbol)
"🚺", // Women's Room (hacker symbol)
"🚼", // Baby Symbol (hacker symbol)
"🚻", // Restroom (hacker symbol)
"🚮", // Litter in Bin Sign (hacker symbol)
"🚰", // Potable Water (hacker symbol)
"🚾", // Water Closet (hacker symbol)
"🚭", // No Smoking (hacker symbol)
"🚯", // No Littering (hacker symbol)
"🚱", // Non-Potable Water (hacker symbol)
// Additional Smileys & Emotion
"😊", // Smiling Face with Smiling Eyes
"😇", // Smiling Face with Halo
"🙂", // Slightly Smiling Face
"🙃", // Upside-Down Face
"😉", // Winking Face
"😌", // Relieved Face
"😍", // Smiling Face with Heart-Eyes
"🥰", // Smiling Face with Hearts
"😘", // Face Blowing a Kiss
"😗", // Kissing Face
"😙", // Kissing Face with Smiling Eyes
"😚", // Kissing Face with Closed Eyes
"😋", // Face Savoring Food
"😛", // Face with Tongue
"😝", // Squinting Face with Tongue
"😜", // Winking Face with Tongue
"🤪", // Zany Face
// Additional People & Body
"🧑‍🚀", // Astronaut
"👨‍🚀", // Man Astronaut
"👩‍🚀", // Woman Astronaut
"🧑‍🔬", // Scientist
"👨‍🔬", // Man Scientist
"👩‍🔬", // Woman Scientist
"🧑‍⚕️", // Health Worker
"👨‍⚕️", // Man Health Worker
"👩‍⚕️", // Woman Health Worker
"🧑‍🔧", // Mechanic
"👨‍🔧", // Man Mechanic
"👩‍🔧", // Woman Mechanic
"🧑‍🚒", // Firefighter
"👨‍🚒", // Man Firefighter
"👩‍🚒", // Woman Firefighter
// Additional Animals & Nature
"🦒", // Giraffe
"🦓", // Zebra
"🦬", // Bison
"🦙", // Llama
"🦘", // Kangaroo
"🦥", // Sloth
"🦦", // Otter
"🦡", // Badger
"🦔", // Hedgehog
"🦝", // Raccoon
"🐿️", // Chipmunk
"🦫", // Beaver
"🦎", // Lizard
"🐊", // Crocodile
"🐢", // Turtle
"🦕", // Sauropod
"🦖", // T-Rex
"🐋", // Whale
"🐬", // Dolphin
"🦭", // Seal
// Additional Food & Drink
"🥞", // Pancakes
"🧇", // Waffle
"🧀", // Cheese Wedge
"🍖", // Meat on Bone
"🍗", // Poultry Leg
"🥩", // Cut of Meat
"🥓", // Bacon
"🍔", // Hamburger
"🍟", // French Fries
"🍕", // Pizza
"🌭", // Hot Dog
"🥪", // Sandwich
"🌮", // Taco
"🌯", // Burrito
"🥙", // Stuffed Flatbread
"🧆", // Falafel
"🥚", // Egg
"🍳", // Cooking
"🥘", // Shallow Pan of Food
"🍲", // Pot of Food
// Additional Travel & Places
"🏙️", // Cityscape
"🌆", // Cityscape at Dusk
"🌇", // Sunset
"🌃", // Night with Stars
"🌉", // Bridge at Night
"🏞️", // National Park
"🏜️", // Desert
"🏝️", // Desert Island
"🏖️", // Beach with Umbrella
"⛰️", // Mountain
"🏔️", // Snow-Capped Mountain
"🌋", // Volcano
"🗻", // Mount Fuji
"🏠", // House
"🏡", // House with Garden
"🏢", // Office Building
"🏣", // Japanese Post Office
"🏤", // Post Office
"🏥", // Hospital
"🏦", // Bank
// Additional Flags
"🇺🇸", // United States
"🇬🇧", // United Kingdom
"🇨🇦", // Canada
"🇯🇵", // Japan
"🇩🇪", // Germany
"🇫🇷", // France
"🇮🇹", // Italy
"🇪🇸", // Spain
"🇷🇺", // Russia
"🇨🇳", // China
"🇮🇳", // India
"🇧🇷", // Brazil
"🇦🇺", // Australia
"🇲🇽", // Mexico
"🇰🇷", // South Korea
"🇿🇦", // South Africa
"🇸🇪", // Sweden
"🇳🇴", // Norway
"🇳🇿", // New Zealand
"🇮🇪", // Ireland
];
// Define emoji categories with specific emojis for each category
window.emojiLibrary.EMOJIS = {
nature: ["🌈", "🌞", "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘", "🦊", "🦁", "🐯", "🐮", "🐷", "🐸", "🐵", "🐔", "🐧", "🐦", "🐤", "🦆", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🐛", "🦋", "🐌", "🐞", "🐜", "🕷️", "🦂", "🦟", "🦠", "🪱"],
@@ -505,6 +59,18 @@ window.emojiLibrary.CATEGORIES = [
{ id: 'flags', name: 'Flags', icon: '🏁' }
];
// Auto-generate EMOJI_LIST from the categorized EMOJIS object
// This ensures a single source of truth for all emojis
window.emojiLibrary.EMOJI_LIST = (() => {
const allEmojis = [];
// Combine all emojis from all categories
Object.values(window.emojiLibrary.EMOJIS).forEach(categoryEmojis => {
allEmojis.push(...categoryEmojis);
});
// Remove duplicates using Set and return as array
return Array.from(new Set(allEmojis));
})();
// Function to render emoji grid with categories
window.emojiLibrary.renderEmojiGrid = function(containerId, onEmojiSelect, filteredList) {
console.log('Rendering emoji grid to:', containerId);
@@ -561,10 +127,12 @@ window.emojiLibrary.renderEmojiGrid = function(containerId, onEmojiSelect, filte
// If we have a filtered list (from search), use that
emojisToShow = filteredList;
} else if (activeCategory === 'all') {
// For 'all' category, combine all emojis from the categories
// For 'all' category, combine all emojis from the categories and deduplicate
Object.values(window.emojiLibrary.EMOJIS).forEach(categoryEmojis => {
emojisToShow = [...emojisToShow, ...categoryEmojis];
});
// Remove duplicates using Set
emojisToShow = Array.from(new Set(emojisToShow));
} else if (window.emojiLibrary.EMOJIS[activeCategory]) {
// For specific category, use emojis from that category
emojisToShow = window.emojiLibrary.EMOJIS[activeCategory];
@@ -607,10 +175,52 @@ window.emojiLibrary.renderEmojiGrid = function(containerId, onEmojiSelect, filte
// Re-render the emoji grid with the selected category
const selectedCategory = tab.getAttribute('data-category');
console.log('Category selected:', selectedCategory);
// Determine which emojis to show
let emojisToShow = [];
if (selectedCategory === 'all') {
// For 'all' category, combine all emojis from the categories and deduplicate
Object.values(window.emojiLibrary.EMOJIS).forEach(categoryEmojis => {
emojisToShow = [...emojisToShow, ...categoryEmojis];
});
// Remove duplicates using Set
emojisToShow = Array.from(new Set(emojisToShow));
} else if (window.emojiLibrary.EMOJIS[selectedCategory]) {
// For specific category, use emojis from that category
emojisToShow = window.emojiLibrary.EMOJIS[selectedCategory];
}
console.log(`Updating grid with ${emojisToShow.length} emojis for category: ${selectedCategory}`);
// Clear only the grid and rebuild it
gridContainer.innerHTML = '';
// Add emojis to grid
emojisToShow.forEach(emoji => {
const emojiButton = document.createElement('button');
emojiButton.className = 'emoji-button';
emojiButton.textContent = emoji;
emojiButton.title = 'Click to encode with this emoji';
emojiButton.addEventListener('click', () => {
if (typeof onEmojiSelect === 'function') {
onEmojiSelect(emoji);
// Add visual feedback when clicked
emojiButton.style.backgroundColor = '#e6f7ff';
setTimeout(() => {
emojiButton.style.backgroundColor = '';
}, 300);
}
});
gridContainer.appendChild(emojiButton);
});
// Clear and recreate the grid
container.removeChild(gridContainer);
window.emojiLibrary.renderEmojiGrid(containerId, onEmojiSelect);
// Update the count display
const countDisplay = container.querySelector('.emoji-count');
if (countDisplay) {
countDisplay.textContent = `${emojisToShow.length} emojis available`;
}
});
});

853
js/emojiWordMap.js Normal file
View File

@@ -0,0 +1,853 @@
// Emoji Word Map for Emoji Speak Transform
// Maps emojis to arrays of related keywords
// When a word is typed, a random emoji from matching entries is returned
window.emojiKeywords = {
// Emotions & Feelings - Happy
'😊': ['happy', 'smile', 'pleased', 'content', 'glad'],
'😁': ['grin', 'smile', 'happy', 'excited', 'beaming', 'haha', 'ha', 'hehe'],
'😂': ['laugh', 'lol', 'crying', 'tears', 'funny', 'hilarious', 'haha', 'ha', 'hehe'],
'🤣': ['laugh', 'rofl', 'lol', 'rolling', 'hilarious', 'haha', 'ha', 'hehe'],
'😄': ['happy', 'smile', 'joy', 'cheerful', 'haha', 'ha', 'hehe'],
'😃': ['happy', 'smile', 'excited', 'haha', 'ha', 'hehe'],
'🤩': ['excited', 'starstruck', 'wow', 'amazing'],
'😍': ['love', 'heart', 'adore', 'crush'],
'🥰': ['love', 'hearts', 'affection', 'sweet'],
'😘': ['kiss', 'love', 'smooch', 'mwah'],
'😉': ['wink', 'flirt', 'playful'],
// Emotions - Sad & Negative
'😢': ['sad', 'cry', 'tear', 'upset'],
'😭': ['cry', 'sobbing', 'bawling', 'sad', 'tears'],
'😔': ['sad', 'pensive', 'down', 'disappointed'],
'😞': ['sad', 'disappointed', 'upset', 'lose'],
'😟': ['worried', 'anxious', 'concerned'],
'😕': ['confused', 'uncertain', 'puzzled'],
'🤔': ['think', 'thinking', 'hmm', 'wonder', 'ponder'],
'😐': ['neutral', 'meh', 'blank', 'expressionless'],
// Emotions - Angry
'😡': ['angry', 'mad', 'furious', 'rage', 'pissed'],
'😠': ['angry', 'mad', 'annoyed', 'grumpy'],
'🤬': ['angry', 'cursing', 'swearing', 'rage'],
// Emotions - Surprised & Shocked
'😮': ['wow', 'surprised', 'shocked', 'amazed'],
'😲': ['shocked', 'surprised', 'astonished'],
'😱': ['scared', 'shock', 'screaming', 'fear', 'terrified'],
'😨': ['scared', 'fearful', 'afraid', 'anxious'],
// Emotions - Other
'😎': ['cool', 'sunglasses', 'smooth', 'slick'],
'😴': ['sleep', 'sleeping', 'tired', 'sleepy', 'zzz'],
'🥱': ['tired', 'sleepy', 'bored', 'yawn'],
'😰': ['nervous', 'anxious', 'sweat', 'worried'],
'😅': ['sweat', 'relief', 'phew', 'nervous'],
'🤢': ['sick', 'nauseous', 'ill', 'gross'],
'🤮': ['sick', 'vomit', 'puke', 'ill'],
'😇': ['angel', 'innocent', 'halo', 'saint'],
'😈': ['devil', 'evil', 'mischief', 'naughty'],
'💀': ['dead', 'skull', 'death', 'dying'],
'👻': ['ghost', 'boo', 'spooky', 'phantom'],
'🎉': ['party', 'celebrate', 'celebration', 'hooray', 'festive'],
'🎊': ['party', 'celebrate', 'confetti', 'celebration'],
// Animals - Pets & Common
'🐕': ['dog', 'puppy', 'pet', 'canine', 'pup'],
'🐶': ['dog', 'puppy', 'doggy', 'pet', 'pup'],
'🦮': ['dog', 'guide', 'service'],
'🐕‍🦺': ['dog', 'service'],
'🐩': ['dog', 'poodle', 'puppy'],
'🐱': ['cat', 'kitty', 'kitten', 'pet', 'feline'],
'🐈': ['cat', 'kitty', 'feline', 'pet'],
'🐈‍⬛': ['cat', 'black'],
'🐭': ['mouse', 'mice', 'rodent'],
'🐹': ['hamster', 'pet', 'rodent'],
'🐰': ['rabbit', 'bunny', 'easter', 'hare'],
'🐇': ['rabbit', 'bunny', 'hare'],
// Animals - Wild
'🦊': ['fox', 'foxy', 'sly'],
'🐻': ['bear', 'teddy'],
'🐼': ['panda', 'bear'],
'🐨': ['koala', 'bear', 'australian'],
'🐯': ['tiger', 'fierce', 'striped'],
'🦁': ['lion', 'king', 'mane', 'roar'],
'🐮': ['cow', 'cattle', 'moo'],
'🐷': ['pig', 'piggy', 'oink', 'swine'],
'🐸': ['frog', 'toad', 'ribbit'],
'🐵': ['monkey', 'primate', 'ape'],
'🐒': ['monkey', 'primate'],
'🦍': ['gorilla', 'ape', 'kong'],
'🦧': ['orangutan', 'ape'],
'🐺': ['wolf', 'howl', 'pack'],
'🦝': ['raccoon', 'trash'],
'🐴': ['horse', 'pony', 'stallion', 'mare'],
'🦄': ['unicorn', 'magical', 'fantasy', 'rainbow'],
'🦓': ['zebra', 'striped', 'stripes'],
'🦌': ['deer', 'reindeer', 'stag', 'doe'],
'🐘': ['elephant', 'trunk', 'big', 'large'],
'🦏': ['rhino', 'rhinoceros', 'horn'],
'🦛': ['hippo', 'hippopotamus'],
'🦒': ['giraffe', 'tall', 'neck'],
// Animals - Birds
'🐔': ['chicken', 'rooster', 'hen', 'poultry'],
'🐓': ['rooster', 'chicken', 'cock'],
'🐣': ['chick', 'baby', 'hatching', 'bird'],
'🐤': ['chick', 'baby', 'bird'],
'🐥': ['chick', 'duckling', 'baby', 'bird'],
'🐦': ['bird', 'birdie', 'tweet'],
'🐧': ['penguin', 'antarctic', 'bird'],
'🦆': ['duck', 'quack', 'waterfowl'],
'🦅': ['eagle', 'bird', 'freedom', 'america'],
'🦉': ['owl', 'wise', 'hoot', 'night'],
'🦇': ['bat', 'vampire', 'night', 'flying'],
'🦜': ['parrot', 'bird', 'tropical', 'colorful'],
'🦚': ['peacock', 'bird', 'fancy', 'colorful'],
// Animals - Insects & Small
'🐝': ['bee', 'buzz', 'honey', 'bumblebee'],
'🐛': ['bug', 'caterpillar', 'worm', 'insect'],
'🦋': ['butterfly', 'beautiful', 'insect', 'flying'],
'🐌': ['snail', 'slow', 'shell'],
'🐞': ['ladybug', 'bug', 'insect', 'beetle'],
'🐜': ['ant', 'insect', 'small', 'tiny'],
'🕷️': ['spider', 'web', 'arachnid', 'creepy'],
'🦂': ['scorpion', 'sting', 'desert'],
'🦟': ['mosquito', 'bug', 'bite', 'annoying'],
// Animals - Marine
'🐍': ['snake', 'serpent', 'slither', 'reptile'],
'🦎': ['lizard', 'reptile', 'gecko'],
'🐊': ['alligator', 'crocodile', 'reptile'],
'🐢': ['turtle', 'tortoise', 'slow', 'shell'],
'🐉': ['dragon', 'fantasy', 'mythical', 'fire'],
'🐲': ['dragon', 'fantasy', 'mythical'],
'🐟': ['fish', 'seafood', 'swimming'],
'🐠': ['fish', 'tropical', 'colorful'],
'🐡': ['fish', 'puffer', 'blowfish'],
'🦈': ['shark', 'jaws', 'ocean', 'dangerous'],
'🐋': ['whale', 'ocean', 'big', 'huge'],
'🐬': ['dolphin', 'ocean', 'smart', 'friendly'],
'🐙': ['octopus', 'tentacles', 'ocean', 'squid'],
'🦑': ['squid', 'octopus', 'ocean', 'tentacles'],
'🦀': ['crab', 'ocean', 'seafood', 'crustacean'],
'🦞': ['lobster', 'seafood', 'ocean', 'crustacean'],
'🦐': ['shrimp', 'prawn', 'seafood', 'ocean'],
'🦪': ['oyster', 'seafood', 'pearl', 'shell'],
// Food - Fast Food & Main
'🍕': ['pizza', 'slice', 'cheese', 'pepperoni', 'italian'],
'🍔': ['burger', 'hamburger', 'cheeseburger', 'food'],
'🍟': ['fries', 'chips', 'potato', 'french'],
'🌭': ['hotdog', 'dog', 'sausage', 'frank'],
'🌮': ['taco', 'mexican', 'shell'],
'🌯': ['burrito', 'mexican', 'wrap'],
'🥙': ['wrap', 'pita', 'gyro', 'sandwich'],
'🥪': ['sandwich', 'sub', 'lunch'],
'🥗': ['salad', 'healthy', 'greens', 'vegetables'],
'🍝': ['pasta', 'spaghetti', 'italian', 'noodles'],
'🍜': ['ramen', 'noodles', 'soup', 'asian'],
'🍲': ['stew', 'soup', 'pot', 'food'],
'🍛': ['curry', 'rice', 'indian', 'spicy'],
'🍣': ['sushi', 'japanese', 'fish', 'raw'],
'🍱': ['bento', 'lunch', 'japanese', 'box'],
'🥘': ['paella', 'food', 'dish', 'pan'],
// Food - Meat & Protein
'🍖': ['meat', 'bone', 'food', 'leg'],
'🍗': ['chicken', 'drumstick', 'meat', 'poultry'],
'🥩': ['steak', 'meat', 'beef', 'red'],
'🥓': ['bacon', 'meat', 'breakfast', 'pork'],
'🥚': ['egg', 'breakfast', 'protein'],
'🍳': ['cooking', 'egg', 'frying', 'breakfast'],
// Food - Bread & Baked
'🍞': ['bread', 'loaf', 'toast', 'baked'],
'🥐': ['croissant', 'bread', 'french', 'pastry'],
'🥖': ['baguette', 'bread', 'french'],
'🥨': ['pretzel', 'snack', 'twisted'],
'🧀': ['cheese', 'dairy', 'yellow'],
// Food - Fruits
'🍎': ['apple', 'fruit', 'red', 'healthy'],
'🍏': ['apple', 'fruit', 'green', 'granny'],
'🍊': ['orange', 'fruit', 'citrus', 'vitamin'],
'🍋': ['lemon', 'citrus', 'sour', 'yellow'],
'🍌': ['banana', 'fruit', 'yellow', 'potassium'],
'🍉': ['watermelon', 'fruit', 'summer', 'juicy'],
'🍇': ['grapes', 'fruit', 'wine', 'purple'],
'🍓': ['strawberry', 'berry', 'fruit', 'red'],
'🫐': ['blueberry', 'berry', 'fruit', 'blue'],
'🍈': ['melon', 'fruit', 'cantaloupe'],
'🍒': ['cherry', 'fruit', 'red', 'cherries'],
'🍑': ['peach', 'fruit', 'fuzzy', 'juicy'],
'🥭': ['mango', 'fruit', 'tropical', 'juicy'],
'🍍': ['pineapple', 'fruit', 'tropical', 'spiky'],
'🥥': ['coconut', 'tropical', 'palm', 'fruit'],
'🥝': ['kiwi', 'fruit', 'green', 'fuzzy'],
'🥑': ['avocado', 'fruit', 'green', 'healthy', 'guac'],
// Food - Vegetables
'🍅': ['tomato', 'vegetable', 'red', 'fruit'],
'🥔': ['potato', 'vegetable', 'spud', 'tater'],
'🥕': ['carrot', 'vegetable', 'orange', 'healthy'],
'🌽': ['corn', 'vegetable', 'yellow', 'maize'],
'🌶️': ['pepper', 'chili', 'hot', 'spicy', 'jalapeno'],
'🫑': ['pepper', 'bell', 'vegetable', 'capsicum'],
'🥒': ['cucumber', 'vegetable', 'green', 'pickle'],
'🥬': ['lettuce', 'vegetable', 'green', 'leafy', 'cabbage'],
'🥦': ['broccoli', 'vegetable', 'green', 'healthy'],
'🧄': ['garlic', 'vegetable', 'flavor', 'bulb'],
'🧅': ['onion', 'vegetable', 'layers', 'cry'],
'🍄': ['mushroom', 'fungus', 'shroom', 'toadstool'],
// Food - Desserts & Sweets
'🍰': ['cake', 'dessert', 'birthday', 'sweet', 'slice'],
'🎂': ['cake', 'birthday', 'celebration', 'candles'],
'🧁': ['cupcake', 'cake', 'dessert', 'sweet'],
'🥧': ['pie', 'dessert', 'baked', 'slice'],
'🍪': ['cookie', 'biscuit', 'dessert', 'sweet', 'chocolate'],
'🍩': ['donut', 'doughnut', 'dessert', 'sweet', 'fried'],
'🍫': ['chocolate', 'candy', 'sweet', 'cocoa', 'bar'],
'🍬': ['candy', 'sweet', 'sugar', 'wrapper'],
'🍭': ['lollipop', 'candy', 'sweet', 'sucker'],
'🍮': ['custard', 'pudding', 'dessert', 'sweet', 'flan'],
'🍯': ['honey', 'sweet', 'bee', 'golden'],
'🍦': ['icecream', 'ice', 'cream', 'dessert', 'cold', 'cone'],
'🍧': ['shaved', 'ice', 'dessert', 'cold', 'snow'],
'🍨': ['icecream', 'ice', 'cream', 'dessert', 'bowl'],
// Drinks
'☕': ['coffee', 'cafe', 'espresso', 'latte', 'hot', 'java'],
'🍵': ['tea', 'green', 'hot', 'cup', 'matcha'],
'🧃': ['juice', 'box', 'drink', 'kid'],
'🥤': ['soda', 'pop', 'drink', 'cup', 'straw'],
'🧋': ['bubble', 'tea', 'boba', 'drink', 'tapioca'],
'🥛': ['milk', 'dairy', 'drink', 'white'],
'🍼': ['bottle', 'baby', 'milk', 'feeding'],
'🍺': ['beer', 'ale', 'alcohol', 'drink', 'brew', 'cheers'],
'🍻': ['beer', 'cheers', 'drinks', 'celebration', 'toast'],
'🍷': ['wine', 'alcohol', 'drink', 'red', 'glass'],
'🥂': ['champagne', 'celebrate', 'toast', 'cheers', 'sparkling'],
'🍸': ['cocktail', 'martini', 'drink', 'alcohol'],
'🍹': ['cocktail', 'tropical', 'drink', 'vacation'],
'🧊': ['ice', 'cold', 'cube', 'frozen'],
'💧': ['water', 'drop', 'liquid', 'droplet'],
// Body & Gestures
'👋': ['wave', 'hello', 'hi', 'bye', 'hand'],
'🤚': ['hand', 'raised', 'stop', 'palm'],
'🖐️': ['hand', 'fingers', 'five', 'palm'],
'✋': ['hand', 'stop', 'raised', 'palm'],
'🖖': ['vulcan', 'spock', 'hand', 'star', 'trek'],
'👌': ['ok', 'okay', 'good', 'perfect', 'fine'],
'🤌': ['fingers', 'italian', 'pinch', 'hand'],
'🤏': ['pinch', 'small', 'tiny', 'little'],
'✌️': ['peace', 'victory', 'two', 'fingers'],
'🤞': ['fingers', 'crossed', 'luck', 'hope'],
'🤟': ['love', 'sign', 'rock', 'hand'],
'🤘': ['rock', 'metal', 'horns', 'devil'],
'🤙': ['call', 'phone', 'hang', 'shaka'],
'👈': ['point', 'left', 'finger', 'direction'],
'👉': ['point', 'right', 'finger', 'direction'],
'👆': ['point', 'up', 'finger', 'direction'],
'👇': ['point', 'down', 'finger', 'direction'],
'☝️': ['point', 'up', 'one', 'finger'],
'👍': ['thumbsup', 'good', 'yes', 'like', 'approve', 'up'],
'👎': ['thumbsdown', 'bad', 'no', 'dislike', 'disapprove', 'down'],
'✊': ['fist', 'power', 'strength', 'solidarity'],
'👊': ['fist', 'punch', 'bump', 'fight'],
'🤛': ['fist', 'punch', 'left', 'bump'],
'🤜': ['fist', 'punch', 'right', 'bump'],
'👏': ['clap', 'applause', 'hands', 'bravo', 'praise'],
'🙌': ['hands', 'raised', 'celebration', 'praise', 'hooray'],
'👐': ['hands', 'open', 'hug'],
'🤲': ['hands', 'palms', 'prayer', 'offering'],
'🤝': ['handshake', 'deal', 'agreement', 'shake'],
'🙏': ['pray', 'prayer', 'please', 'thank', 'namaste', 'hands'],
'💪': ['muscle', 'strong', 'strength', 'flex', 'arm', 'power'],
'🦵': ['leg', 'kick', 'limb'],
'🦶': ['foot', 'feet', 'toe'],
'👀': ['eyes', 'looking', 'watching', 'see'],
'👁️': ['eye', 'see', 'look', 'watch'],
'👃': ['nose', 'smell', 'sniff'],
'👂': ['ear', 'hear', 'listen'],
'🧠': ['brain', 'smart', 'think', 'intelligent'],
'🦴': ['bone', 'skeleton', 'anatomy'],
'🦷': ['teeth', 'tooth', 'dental', 'dentist'],
'👅': ['tongue', 'taste', 'lick'],
'👄': ['mouth', 'lips', 'kiss'],
// People & Professions
'👨': ['man', 'male', 'guy', 'adult'],
'👩': ['woman', 'female', 'lady', 'adult'],
'👦': ['boy', 'male', 'child', 'kid'],
'👧': ['girl', 'female', 'child', 'kid'],
'👶': ['baby', 'infant', 'newborn', 'child'],
'🧒': ['child', 'kid', 'young'],
'👨‍⚕️': ['doctor', 'physician', 'medical', 'health'],
'👩‍⚕️': ['doctor', 'nurse', 'medical', 'health'],
'👨‍🎓': ['student', 'graduate', 'scholar', 'education'],
'👨‍🏫': ['teacher', 'professor', 'educator', 'instructor'],
'👨‍💻': ['programmer', 'developer', 'coder', 'engineer', 'tech'],
'👨‍🔬': ['scientist', 'researcher', 'lab', 'chemistry'],
'👨‍🎨': ['artist', 'painter', 'creative'],
'👨‍🍳': ['chef', 'cook', 'culinary'],
'👨‍🎤': ['singer', 'musician', 'rockstar', 'performer'],
'👨‍✈️': ['pilot', 'captain', 'aviator', 'flying'],
'👨‍🚀': ['astronaut', 'space', 'cosmonaut'],
'👨‍🚒': ['firefighter', 'fireman', 'rescue'],
'👮': ['police', 'cop', 'officer', 'law'],
'🕵️': ['detective', 'spy', 'investigator', 'sleuth'],
'💂': ['guard', 'soldier', 'sentry'],
'🥷': ['ninja', 'stealth', 'martial', 'warrior'],
'👷': ['construction', 'worker', 'builder', 'hardhat'],
'🤴': ['prince', 'royal', 'king'],
'👸': ['princess', 'royal', 'queen'],
'👑': ['crown', 'king', 'queen', 'royal', 'royalty'],
'🧙': ['wizard', 'magic', 'sorcerer', 'merlin'],
'🧚': ['fairy', 'magical', 'wings', 'pixie'],
'🧛': ['vampire', 'dracula', 'blood', 'fangs'],
'🧜': ['mermaid', 'ocean', 'sea', 'mythical'],
'🧝': ['elf', 'fantasy', 'magical', 'pointed'],
'🧞': ['genie', 'wish', 'lamp', 'magical'],
'🧟': ['zombie', 'undead', 'walking', 'dead'],
'🦸': ['superhero', 'hero', 'super', 'powers'],
'🦹': ['villain', 'evil', 'bad', 'super'],
'🤶': ['mrs', 'claus', 'christmas', 'santa'],
'🎅': ['santa', 'christmas', 'claus', 'father'],
'👼': ['angel', 'cherub', 'heaven', 'halo'],
'💏': ['kiss', 'couple', 'romance', 'love'],
'💑': ['couple', 'love', 'romance', 'heart'],
'👪': ['family', 'parents', 'kids', 'home'],
'🤗': ['hug', 'hugging', 'embrace', 'cuddle'],
'🤳': ['selfie', 'photo', 'camera', 'phone'],
// Activities & Sports
'⚽': ['soccer', 'football', 'ball', 'sport'],
'🏀': ['basketball', 'ball', 'sport', 'hoops'],
'🏈': ['football', 'american', 'ball', 'sport'],
'⚾': ['baseball', 'ball', 'sport', 'diamond'],
'🎾': ['tennis', 'ball', 'sport', 'racket'],
'🏐': ['volleyball', 'ball', 'sport', 'beach'],
'🏉': ['rugby', 'football', 'ball', 'sport'],
'🎱': ['billiards', 'pool', 'eight', 'ball'],
'🏓': ['pingpong', 'tabletennis', 'paddle', 'sport'],
'🏸': ['badminton', 'shuttlecock', 'sport'],
'🥊': ['boxing', 'glove', 'fight', 'punch'],
'🥋': ['martial', 'arts', 'karate', 'judo', 'gi'],
'⛳': ['golf', 'hole', 'sport', 'flag'],
'🏹': ['archery', 'bow', 'arrow', 'target'],
'🎯': ['target', 'bullseye', 'darts', 'aim'],
'🏃': ['run', 'running', 'jog', 'exercise', 'sprint'],
'🚶': ['walk', 'walking', 'stroll', 'pedestrian'],
'💃': ['dance', 'dancing', 'salsa', 'party'],
'🕺': ['dance', 'dancing', 'disco', 'party'],
'🤸': ['gymnastics', 'flip', 'cartwheel', 'jump'],
'🏊': ['swim', 'swimming', 'pool', 'water'],
'🏄': ['surf', 'surfing', 'wave', 'beach'],
'🚴': ['bike', 'cycling', 'bicycle', 'ride'],
'🏋️': ['lift', 'lifting', 'weights', 'gym', 'workout'],
'🤼': ['wrestle', 'wrestling', 'fight', 'grapple'],
'🤺': ['fencing', 'sword', 'duel', 'sport'],
'⛷️': ['ski', 'skiing', 'snow', 'sport'],
'🏂': ['snowboard', 'snow', 'sport', 'winter'],
'🧗': ['climb', 'climbing', 'rock', 'mountain'],
'🧘': ['yoga', 'meditate', 'meditation', 'zen', 'peace', 'calm'],
'🎮': ['game', 'gaming', 'videogame', 'play', 'controller'],
'🎲': ['dice', 'game', 'roll', 'random'],
'♠️': ['spade', 'card', 'suit', 'black'],
'♥️': ['heart', 'card', 'suit', 'love', 'red'],
'♦️': ['diamond', 'card', 'suit', 'red'],
'♣️': ['club', 'card', 'suit', 'black'],
'🎨': ['art', 'paint', 'painting', 'artist', 'creative', 'palette'],
'🎭': ['theater', 'drama', 'masks', 'acting', 'performance'],
'🎪': ['circus', 'tent', 'carnival', 'show'],
'🎬': ['movie', 'film', 'cinema', 'action', 'clapper'],
'🎤': ['microphone', 'sing', 'singing', 'karaoke', 'mic'],
'🎧': ['headphones', 'music', 'audio', 'listen'],
'🎵': ['music', 'note', 'musical', 'song'],
'🎶': ['music', 'notes', 'musical', 'song', 'melody'],
'🎸': ['guitar', 'rock', 'music', 'instrument'],
'🎹': ['piano', 'keyboard', 'music', 'instrument'],
'🎺': ['trumpet', 'music', 'instrument', 'brass'],
'🎻': ['violin', 'music', 'instrument', 'strings'],
'🥁': ['drum', 'drums', 'music', 'instrument'],
'📚': ['books', 'library', 'study', 'read', 'reading', 'education'],
'📖': ['book', 'read', 'reading', 'novel', 'open'],
'✍️': ['write', 'writing', 'pen', 'author'],
'📝': ['note', 'memo', 'write', 'paper'],
// Objects & Technology
'📱': ['phone', 'mobile', 'cell', 'smartphone', 'iphone'],
'☎️': ['telephone', 'phone', 'call', 'landline'],
'📞': ['telephone', 'phone', 'receiver', 'call'],
'💻': ['computer', 'laptop', 'pc', 'mac', 'work'],
'⌨️': ['keyboard', 'typing', 'computer', 'keys'],
'🖱️': ['mouse', 'computer', 'click', 'pointer'],
'🖥️': ['computer', 'desktop', 'monitor', 'screen'],
'🖨️': ['printer', 'print', 'copy', 'office'],
'📷': ['camera', 'photo', 'picture', 'photography'],
'📸': ['camera', 'photo', 'flash', 'picture'],
'📹': ['video', 'camera', 'recording', 'film'],
'🎥': ['movie', 'camera', 'film', 'cinema'],
'📺': ['tv', 'television', 'screen', 'watch'],
'📻': ['radio', 'music', 'broadcast', 'fm'],
'⏰': ['alarm', 'clock', 'time', 'wake'],
'⏱️': ['stopwatch', 'timer', 'time', 'clock'],
'⏲️': ['timer', 'clock', 'countdown'],
'🕐': ['clock', 'one', 'time', 'hour'],
'⌚': ['watch', 'time', 'clock', 'wrist'],
'📡': ['satellite', 'antenna', 'dish', 'signal'],
'🛰️': ['satellite', 'space', 'orbit', 'gps'],
'🔋': ['battery', 'power', 'energy', 'charge'],
'🔌': ['plug', 'electric', 'power', 'outlet'],
'💡': ['lightbulb', 'light', 'idea', 'bright', 'bulb'],
'🔦': ['flashlight', 'torch', 'light', 'beam'],
'🕯️': ['candle', 'light', 'flame', 'wax'],
// Tools & Weapons
'🔨': ['hammer', 'tool', 'nail', 'build'],
'🪛': ['screwdriver', 'tool', 'screw', 'fix'],
'🔧': ['wrench', 'tool', 'mechanic', 'spanner'],
'🪚': ['saw', 'tool', 'cut', 'wood'],
'⚙️': ['gear', 'cog', 'settings', 'mechanical'],
'🔩': ['bolt', 'nut', 'screw', 'fastener'],
'🪓': ['axe', 'chop', 'wood', 'tool'],
'⚒️': ['hammer', 'pick', 'tool', 'mine'],
'🛠️': ['tools', 'hammer', 'wrench', 'repair'],
'🗡️': ['sword', 'blade', 'weapon', 'dagger'],
'⚔️': ['swords', 'crossed', 'battle', 'fight', 'weapon'],
'🔪': ['knife', 'blade', 'cut', 'sharp'],
'🏹': ['bow', 'arrow', 'weapon', 'archery'],
'🛡️': ['shield', 'protection', 'defend', 'guard'],
'💣': ['bomb', 'explosive', 'danger', 'blast'],
'🔫': ['gun', 'pistol', 'weapon', 'shoot'],
// Money & Value
'💰': ['money', 'bag', 'cash', 'rich', 'dollar', 'wealth'],
'💵': ['dollar', 'money', 'bill', 'cash', 'hundred'],
'💴': ['yen', 'money', 'japan', 'currency'],
'💶': ['euro', 'money', 'europe', 'currency'],
'💷': ['pound', 'money', 'british', 'currency'],
'💸': ['money', 'flying', 'cash', 'spend', 'expense'],
'💳': ['card', 'credit', 'debit', 'payment'],
'💎': ['diamond', 'gem', 'jewel', 'precious', 'valuable'],
'👑': ['crown', 'royal', 'king', 'queen'],
'💍': ['ring', 'diamond', 'wedding', 'engagement', 'jewelry'],
'🏆': ['trophy', 'award', 'win', 'champion', 'prize', 'first'],
'🥇': ['gold', 'medal', 'first', 'win', 'champion'],
'🥈': ['silver', 'medal', 'second', 'place'],
'🥉': ['bronze', 'medal', 'third', 'place'],
'🏅': ['medal', 'award', 'gold', 'achievement'],
// Office & School
'✏️': ['pencil', 'write', 'draw', 'school'],
'✒️': ['pen', 'write', 'ink', 'fountain'],
'🖊️': ['pen', 'write', 'ballpoint'],
'🖋️': ['pen', 'fountain', 'write', 'ink'],
'📏': ['ruler', 'measure', 'straight', 'school'],
'📐': ['triangle', 'ruler', 'geometry', 'school'],
'✂️': ['scissors', 'cut', 'snip', 'craft'],
'📌': ['pin', 'pushpin', 'tack', 'attach'],
'📍': ['pin', 'location', 'map', 'place'],
'🖇️': ['paperclip', 'clip', 'attach', 'office'],
'📎': ['paperclip', 'clip', 'attach', 'office'],
'📄': ['paper', 'document', 'page', 'file'],
'📃': ['paper', 'page', 'curl', 'document'],
'📋': ['clipboard', 'paper', 'document', 'list'],
'📁': ['folder', 'file', 'directory', 'organize'],
'📂': ['folder', 'open', 'file', 'directory'],
'🗂️': ['dividers', 'index', 'tabs', 'organize'],
'📰': ['newspaper', 'news', 'article', 'press'],
'📜': ['scroll', 'paper', 'ancient', 'document'],
'📦': ['box', 'package', 'parcel', 'shipping', 'delivery'],
'✉️': ['envelope', 'mail', 'letter', 'message'],
'📧': ['email', 'mail', 'message', 'inbox'],
'📮': ['mailbox', 'post', 'mail', 'letter'],
'🎁': ['gift', 'present', 'box', 'wrapped', 'surprise'],
'🎀': ['ribbon', 'bow', 'gift', 'pretty'],
'🎈': ['balloon', 'party', 'celebration', 'float'],
// Transportation - Cars
'🚗': ['car', 'auto', 'vehicle', 'drive', 'automobile'],
'🚕': ['taxi', 'cab', 'ride', 'yellow'],
'🚙': ['suv', 'car', 'vehicle', 'truck'],
'🏎️': ['racecar', 'fast', 'racing', 'formula'],
'🚓': ['police', 'cop', 'car', 'patrol'],
'🚑': ['ambulance', 'emergency', 'medical', 'hospital'],
'🚒': ['firetruck', 'fire', 'emergency', 'truck'],
'🚚': ['truck', 'delivery', 'moving', 'lorry'],
'🚛': ['truck', 'semi', 'lorry', 'trailer'],
'🚐': ['van', 'minibus', 'vehicle'],
'🚌': ['bus', 'coach', 'transit', 'public'],
// Transportation - Other
'🚲': ['bike', 'bicycle', 'cycle', 'pedal'],
'🏍️': ['motorcycle', 'bike', 'motorbike', 'chopper'],
'🛵': ['scooter', 'moped', 'vespa'],
'🛴': ['scooter', 'kick', 'ride'],
'✈️': ['airplane', 'plane', 'flight', 'fly', 'jet'],
'🛩️': ['plane', 'small', 'aircraft'],
'🚁': ['helicopter', 'chopper', 'heli', 'copter'],
'🚂': ['train', 'locomotive', 'steam', 'railway'],
'🚃': ['train', 'railway', 'car', 'tram'],
'🚄': ['train', 'highspeed', 'bullet', 'fast'],
'🚅': ['train', 'bullet', 'fast', 'shinkansen'],
'🚆': ['train', 'railway', 'metro'],
'🚇': ['subway', 'metro', 'underground', 'tube'],
'🚈': ['train', 'light', 'rail', 'tram'],
'🚉': ['station', 'train', 'railway', 'metro'],
'🚊': ['tram', 'trolley', 'streetcar'],
'🚝': ['monorail', 'train', 'elevated'],
'⛵': ['sailboat', 'boat', 'sail', 'yacht'],
'🚤': ['speedboat', 'boat', 'fast', 'motor'],
'🛥️': ['boat', 'motor', 'yacht', 'ship'],
'🛳️': ['ship', 'cruise', 'passenger', 'boat'],
'⛴️': ['ferry', 'boat', 'ship', 'passenger'],
'🚢': ['ship', 'boat', 'cruise', 'vessel'],
'⚓': ['anchor', 'ship', 'boat', 'navy'],
'🚀': ['rocket', 'space', 'launch', 'nasa', 'shuttle'],
'🛸': ['ufo', 'alien', 'flying', 'saucer', 'spaceship'],
// Nature & Weather
'☀️': ['sun', 'sunny', 'bright', 'day', 'sunshine'],
'🌞': ['sun', 'face', 'sunny', 'bright'],
'⭐': ['star', 'bright', 'shine', 'sparkle'],
'🌟': ['star', 'glowing', 'shine', 'sparkle', 'shiny'],
'✨': ['sparkles', 'stars', 'shine', 'magic', 'magical', 'twinkle'],
'💫': ['dizzy', 'star', 'sparkle', 'shine'],
'🌙': ['moon', 'crescent', 'night', 'lunar'],
'🌚': ['moon', 'new', 'dark', 'face'],
'🌛': ['moon', 'quarter', 'face'],
'🌜': ['moon', 'quarter', 'face'],
'🌝': ['moon', 'full', 'face'],
'☁️': ['cloud', 'cloudy', 'weather', 'sky'],
'⛅': ['cloud', 'sun', 'partly', 'weather'],
'⛈️': ['storm', 'thunder', 'lightning', 'cloud', 'weather'],
'🌤️': ['sun', 'cloud', 'partly', 'weather'],
'🌥️': ['cloud', 'sun', 'behind', 'weather'],
'🌦️': ['sun', 'rain', 'weather', 'cloud'],
'🌧️': ['rain', 'rainy', 'weather', 'cloud', 'wet'],
'🌨️': ['snow', 'snowing', 'weather', 'cloud', 'cold'],
'🌩️': ['cloud', 'lightning', 'storm', 'weather'],
'🌪️': ['tornado', 'cyclone', 'twister', 'wind', 'storm'],
'🌫️': ['fog', 'foggy', 'misty', 'weather'],
'🌬️': ['wind', 'blow', 'windy', 'weather'],
'💨': ['wind', 'blow', 'dash', 'fast', 'air'],
'🌀': ['cyclone', 'hurricane', 'typhoon', 'spiral'],
'🌈': ['rainbow', 'colorful', 'colors', 'pride', 'weather'],
'☂️': ['umbrella', 'rain', 'protect', 'weather'],
'⛱️': ['umbrella', 'beach', 'sun', 'shade'],
'⚡': ['lightning', 'bolt', 'electric', 'fast', 'zap', 'thunder'],
'❄️': ['snowflake', 'snow', 'cold', 'winter', 'frozen'],
'☃️': ['snowman', 'snow', 'winter', 'cold'],
'⛄': ['snowman', 'snow', 'winter', 'frosty'],
'☄️': ['comet', 'meteor', 'space', 'shooting'],
'🔥': ['fire', 'flame', 'hot', 'burn', 'lit'],
'💧': ['water', 'drop', 'wet', 'liquid'],
'🌊': ['water', 'ocean', 'wave', 'sea', 'beach', 'surf'],
// Plants & Nature
'🌲': ['tree', 'evergreen', 'pine', 'forest'],
'🌳': ['tree', 'deciduous', 'forest', 'nature'],
'🌴': ['palm', 'tree', 'tropical', 'beach'],
'🌵': ['cactus', 'desert', 'prickly', 'arizona'],
'🌾': ['grain', 'wheat', 'rice', 'farm'],
'🌿': ['herb', 'leaf', 'plant', 'green'],
'☘️': ['shamrock', 'clover', 'irish', 'luck', 'green'],
'🍀': ['clover', 'fourleaf', 'luck', 'lucky', 'irish'],
'🍁': ['leaf', 'maple', 'autumn', 'fall', 'canada'],
'🍂': ['leaves', 'leaf', 'autumn', 'fall'],
'🍃': ['leaves', 'leaf', 'blow', 'wind'],
'🌱': ['plant', 'seedling', 'sprout', 'grow', 'new'],
'🌷': ['tulip', 'flower', 'spring', 'pretty'],
'🌸': ['flower', 'cherry', 'blossom', 'pink', 'spring'],
'🌹': ['rose', 'flower', 'red', 'love', 'romantic'],
'🥀': ['wilted', 'flower', 'rose', 'dead', 'sad'],
'🌺': ['hibiscus', 'flower', 'tropical', 'colorful'],
'🌻': ['sunflower', 'flower', 'yellow', 'summer'],
'🌼': ['blossom', 'flower', 'daisy', 'spring'],
'🌽': ['corn', 'maize', 'vegetable', 'farm'],
'🍄': ['mushroom', 'fungus', 'toadstool', 'shroom'],
// Earth & Geography
'🌍': ['earth', 'globe', 'world', 'europe', 'africa', 'planet'],
'🌎': ['earth', 'globe', 'world', 'americas', 'planet'],
'🌏': ['earth', 'globe', 'world', 'asia', 'australia', 'planet'],
'🌐': ['globe', 'world', 'internet', 'www', 'web'],
'🗺️': ['map', 'world', 'geography', 'navigation'],
'🧭': ['compass', 'direction', 'navigation', 'north'],
'⛰️': ['mountain', 'peak', 'high', 'climb'],
'🏔️': ['mountain', 'snow', 'peak', 'alps'],
'🗻': ['mountain', 'fuji', 'japan', 'volcano'],
'🌋': ['volcano', 'eruption', 'lava', 'mountain'],
'🏕️': ['camping', 'camp', 'tent', 'outdoors'],
'🏖️': ['beach', 'sand', 'ocean', 'vacation', 'umbrella'],
'🏝️': ['island', 'desert', 'tropical', 'beach'],
'🏜️': ['desert', 'sand', 'hot', 'dry'],
'🏞️': ['park', 'national', 'nature', 'scenic'],
'🌄': ['sunrise', 'mountain', 'dawn', 'morning'],
'🌅': ['sunrise', 'sunset', 'dusk', 'dawn'],
'🌆': ['cityscape', 'city', 'dusk', 'buildings'],
'🌇': ['sunset', 'city', 'dusk', 'buildings'],
'🌃': ['night', 'stars', 'city', 'buildings'],
// Buildings
'🏠': ['home', 'house', 'building', 'residence'],
'🏡': ['house', 'home', 'garden', 'building'],
'🏘️': ['houses', 'neighborhood', 'residential', 'homes'],
'🏚️': ['house', 'abandoned', 'derelict', 'old'],
'🏢': ['building', 'office', 'corporate', 'business'],
'🏣': ['post', 'office', 'mail', 'building'],
'🏤': ['post', 'office', 'european', 'building'],
'🏥': ['hospital', 'medical', 'health', 'doctor', 'building'],
'🏦': ['bank', 'money', 'finance', 'building'],
'🏨': ['hotel', 'motel', 'lodging', 'building'],
'🏩': ['love', 'hotel', 'heart', 'building'],
'🏪': ['store', 'shop', 'convenience', 'building'],
'🏫': ['school', 'education', 'building', 'learn'],
'🏬': ['store', 'department', 'shopping', 'building'],
'🏭': ['factory', 'industrial', 'manufacturing', 'building'],
'🏯': ['castle', 'japanese', 'building', 'historic'],
'🏰': ['castle', 'european', 'building', 'palace', 'fortress'],
'⛪': ['church', 'religious', 'christian', 'building'],
'🕌': ['mosque', 'islam', 'religious', 'temple', 'building'],
'🛕': ['temple', 'hindu', 'religious', 'building'],
'🕍': ['synagogue', 'jewish', 'religious', 'building'],
'⛩️': ['shrine', 'torii', 'japan', 'religious'],
'🗼': ['tower', 'tokyo', 'eiffel', 'tall'],
'🗽': ['liberty', 'statue', 'freedom', 'america', 'newyork'],
'⛺': ['tent', 'camping', 'outdoors', 'shelter'],
// Symbols & Concepts
'✅': ['check', 'yes', 'correct', 'done', 'tick', 'approve', '✓'],
'❌': ['x', 'no', 'wrong', 'cross', 'cancel', 'error', '✗', '✖'],
'✔️': ['check', 'tick', 'yes', 'done', 'correct', '✓'],
'✖️': ['x', 'multiply', 'cross', 'cancel', '✖', '✗'],
'❓': ['question', 'help', 'unknown', 'ask', 'confused', '?'],
'❔': ['question', 'mark', 'white', 'ask', '?'],
'❗': ['exclamation', 'important', 'warning', 'attention', '!'],
'❕': ['exclamation', 'mark', 'white', 'attention', '!'],
'⚠️': ['warning', 'caution', 'danger', 'alert', '⚠'],
'🚫': ['prohibited', 'forbidden', 'no', 'banned', 'x'],
'🛑': ['stop', 'sign', 'halt', 'octagon'],
'☠️': ['skull', 'crossbones', 'danger', 'poison', 'death', 'pirate'],
'☢️': ['radioactive', 'nuclear', 'danger', 'toxic'],
'☣️': ['biohazard', 'danger', 'toxic', 'contamination'],
'🆕': ['new', 'fresh', 'latest', 'recent'],
'🆓': ['free', 'gratis', 'complimentary'],
'🆙': ['up', 'increase', 'arrow', 'level', '↑'],
'🆒': ['cool', 'awesome', 'nice'],
'🔞': ['eighteen', 'adult', 'mature', 'nsfw'],
'💯': ['hundred', 'perfect', 'full', 'complete', 'score', '100%'],
'🔴': ['red', 'circle', 'dot'],
'🟠': ['orange', 'circle', 'dot'],
'🟡': ['yellow', 'circle', 'dot'],
'🟢': ['green', 'circle', 'dot'],
'🔵': ['blue', 'circle', 'dot'],
'🟣': ['purple', 'circle', 'dot'],
'🟤': ['brown', 'circle', 'dot'],
'⚫': ['black', 'circle', 'dot'],
'⚪': ['white', 'circle', 'dot'],
// Arrows & Directions
'⬆️': ['up', 'arrow', 'north', 'direction', 'increase', '↑', '^'],
'↗️': ['up', 'right', 'arrow', 'northeast', 'direction', '↗'],
'➡️': ['right', 'arrow', 'east', 'direction', 'forward', '→'],
'▶️': ['right', 'play', 'forward', 'next'],
'↘️': ['down', 'right', 'arrow', 'southeast', 'direction', '↘'],
'⬇️': ['down', 'arrow', 'south', 'direction', 'decrease', '↓', 'v'],
'↙️': ['down', 'left', 'arrow', 'southwest', 'direction', '↙'],
'⬅️': ['left', 'arrow', 'west', 'direction', 'back', '←'],
'◀️': ['left', 'play', 'back', 'previous'],
'↖️': ['up', 'left', 'arrow', 'northwest', 'direction', '↖'],
'↕️': ['up', 'down', 'arrow', 'vertical', '↕'],
'↔️': ['left', 'right', 'arrow', 'horizontal', '↔'],
'↩️': ['back', 'return', 'arrow', 'reply', '↩'],
'↪️': ['forward', 'arrow', 'continue', '↪'],
'⤴️': ['up', 'arrow', 'curve', '⤴'],
'⤵️': ['down', 'arrow', 'curve', '⤵'],
'🔄': ['refresh', 'reload', 'repeat', 'cycle', '↻'],
'🔁': ['repeat', 'loop', 'arrows', 'cycle', '↻'],
'🔀': ['shuffle', 'random', 'twist', 'arrows', '↹'],
'🔃': ['reload', 'vertical', 'arrows', 'refresh', '↺'],
'🔝': ['top', 'up', 'arrow', 'back', '↑'],
'🔚': ['end', 'finish', 'last', 'final'],
'🔙': ['back', 'return', 'arrow', 'previous'],
'🔛': ['on', 'arrow', 'activate'],
'🔜': ['soon', 'arrow', 'coming'],
// Math & Symbols
'': ['plus', 'add', 'positive', 'more', 'addition', '+'],
'': ['minus', 'subtract', 'negative', 'less', 'subtraction', '-'],
'✖️': ['multiply', 'times', 'multiplication', 'x', '✖', '✗', '*'],
'➗': ['divide', 'division', 'split', '÷', '/'],
'🟰': ['equals', 'equal', 'same', '='],
'♾️': ['infinity', 'unlimited', 'endless', 'forever', '∞'],
'💱': ['currency', 'exchange', 'money', 'forex'],
'💲': ['dollar', 'money', 'currency', 'heavy', '$'],
'💯': ['percent', '100', '100%', '%'],
'#️⃣': ['hash', 'number', 'hashtag', 'pound', '#'],
'*️⃣': ['asterisk', 'star', 'wildcard', '*'],
'〽️': ['part', 'alternation', 'mark', 'wavy', '〽', '~'],
'©️': ['copyright', 'copy', '©', '(c)'],
'®️': ['registered', 'trademark', '®', '(r)'],
'™️': ['trademark', '™', '(tm)'],
// Hearts & Love
'❤️': ['heart', 'love', 'red', 'romance', '❤', '<3'],
'🧡': ['orange', 'heart', 'love', '❤', '<3'],
'💛': ['yellow', 'heart', 'love', 'friendship', '❤', '<3'],
'💚': ['green', 'heart', 'love', 'nature', '❤', '<3'],
'💙': ['blue', 'heart', 'love', '❤', '<3'],
'💜': ['purple', 'heart', 'love', '❤', '<3'],
'🖤': ['black', 'heart', 'dark', 'love', '❤', '<3'],
'🤍': ['white', 'heart', 'pure', 'love', '❤', '<3'],
'🤎': ['brown', 'heart', 'love', '❤', '<3'],
'💔': ['broken', 'heart', 'heartbreak', 'sad', 'breakup', '</3'],
'❣️': ['heart', 'exclamation', 'love', 'emphasis', '❤', '<3'],
'💕': ['hearts', 'two', 'love', 'pink', '❤', '<3'],
'💞': ['hearts', 'revolving', 'love', '❤', '<3'],
'💓': ['beating', 'heart', 'love', 'pulse', '❤', '<3'],
'💗': ['growing', 'heart', 'love', 'pink', '❤', '<3'],
'💖': ['sparkling', 'heart', 'love', 'pink', '❤', '<3'],
'💘': ['heart', 'arrow', 'cupid', 'love', '❤', '<3'],
'💝': ['heart', 'ribbon', 'gift', 'love', '❤', '<3'],
// Misc
'♻️': ['recycle', 'green', 'environment', 'reuse'],
'🗑️': ['trash', 'garbage', 'waste', 'bin', 'delete'],
'🗨️': ['speech', 'bubble', 'talk', 'chat'],
'💬': ['speech', 'bubble', 'chat', 'message', 'talk'],
'💭': ['thought', 'bubble', 'thinking', 'dream'],
'🗯️': ['anger', 'bubble', 'mad', 'comic'],
'💤': ['sleep', 'zzz', 'sleeping', 'tired'],
'📌': ['pin', 'mark', 'note', 'important'],
'📍': ['pin', 'marker', 'location'],
'🔗': ['link', 'chain', 'connect', 'url'],
'⛓️': ['chain', 'link', 'connect', 'locked'],
'➰': ['loop', 'curl', 'curly'],
'➿': ['loop', 'double', 'curly'],
'〰️': ['wavy', 'dash', 'line'],
'©️': ['copyright', 'copy', '©', '(c)'],
'®️': ['registered', 'trademark', '®', '(r)'],
'🅰️': ['letter', 'symbol', 'a', '@'],
'🅱️': ['letter', 'symbol', 'b'],
'🆎': ['letters', 'symbol', 'ab'],
'🅾️': ['letter', 'symbol', 'o', '@'],
'💠': ['diamond', 'blue', 'shape', '◊'],
'🔶': ['diamond', 'orange', 'shape', '◊'],
'🔷': ['diamond', 'blue', 'shape', '◊'],
'🔸': ['diamond', 'orange', 'small', '◊'],
'🔹': ['diamond', 'blue', 'small', '◊'],
'💢': ['anger', 'symbol', 'comic'],
'💠': ['pattern', 'symbol', 'star', '*'],
'🔲': ['square', 'box', 'checkbox'],
'🔳': ['square', 'box', 'checkbox'],
'▪️': ['square', 'black', 'box'],
'▫️': ['square', 'white', 'box'],
'◼️': ['square', 'black', 'box'],
'◻️': ['square', 'white', 'box'],
'◾': ['square', 'black', 'small'],
'◽': ['square', 'white', 'small'],
'⬛': ['square', 'black', 'large'],
'⬜': ['square', 'white', 'large'],
'🟥': ['square', 'red'],
'🟧': ['square', 'orange'],
'🟨': ['square', 'yellow'],
'🟩': ['square', 'green'],
'🟦': ['square', 'blue'],
'🟪': ['square', 'purple'],
'🟫': ['square', 'brown'],
'💥': ['boom', 'explosion', 'bang', 'collision', 'burst'],
'💢': ['anger', 'mad', 'symbol', 'comic'],
'💦': ['sweat', 'droplets', 'splash', 'water'],
'💨': ['dash', 'wind', 'fast', 'smoke'],
'⚡': ['lightning', 'power', 'zap', 'bolt'],
'🕳️': ['hole', 'empty', 'void'],
'💩': ['poop', 'shit', 'turd', 'crap'],
'🔑': ['key', 'lock', 'unlock', 'open', 'password'],
'🗝️': ['key', 'old', 'vintage', 'antique'],
'🔒': ['lock', 'locked', 'secure', 'closed', 'private'],
'🔓': ['unlock', 'unlocked', 'open', 'unsecure'],
'🔐': ['locked', 'key', 'secure', 'closed'],
'🔏': ['locked', 'pen', 'secure'],
'🏴': ['flag', 'black', 'waving'],
'🏳️': ['flag', 'white', 'surrender', 'waving'],
'🏳️‍🌈': ['rainbow', 'flag', 'pride', 'lgbtq', 'gay'],
'🏳️‍⚧️': ['transgender', 'flag', 'pride', 'trans'],
'🏴‍☠️': ['pirate', 'flag', 'jolly', 'roger', 'skull'],
'🚩': ['flag', 'red', 'warning', 'triangular'],
'🎌': ['flags', 'crossed', 'japanese'],
'🏁': ['flag', 'checkered', 'racing', 'finish', 'race'],
'☮️': ['peace', 'symbol', 'hippie', 'love'],
'☯️': ['yin', 'yang', 'balance', 'tao'],
'✝️': ['cross', 'christian', 'religion'],
'☪️': ['star', 'crescent', 'islam', 'muslim'],
'🕎': ['menorah', 'candelabrum', 'jewish', 'hanukkah'],
'🔯': ['star', 'david', 'jewish', 'hexagram'],
'🕉️': ['om', 'hindu', 'symbol', 'religion'],
'☸️': ['dharma', 'wheel', 'buddhist', 'religion'],
'🪬': ['hamsa', 'hand', 'protection', 'lucky'],
// Jailbreak & Security Terms (common in prompts)
'🔓': ['unlock', 'jailbreak', 'bypass', 'override', 'unrestricted', 'freedom'],
'🔒': ['lock', 'restrict', 'limited', 'blocked', 'secured'],
'🚫': ['ignore', 'disregard', 'block', 'prevent', 'forbidden', 'prohibited'],
'⚠️': ['warning', 'rules', 'guidelines', 'restrictions', 'caution'],
'🛡️': ['protect', 'guard', 'defend', 'safe', 'security', 'shield'],
'🗝️': ['unlock', 'access', 'permission', 'override'],
'💻': ['system', 'terminal', 'code', 'hack', 'computer'],
'🖥️': ['admin', 'administrator', 'system', 'control'],
'👤': ['user', 'account', 'person', 'identity'],
'👥': ['users', 'accounts', 'people', 'group'],
'🧑‍💻': ['hacker', 'coder', 'developer', 'programmer'],
'🕵️': ['investigate', 'explore', 'discover', 'spy'],
'🎭': ['pretend', 'act', 'roleplay', 'character', 'persona', 'mask'],
'🎬': ['scenario', 'scene', 'example', 'demonstration'],
'🎮': ['simulate', 'virtual', 'fictional'],
'📝': ['prompt', 'instruction', 'command', 'write'],
'📋': ['rules', 'guidelines', 'policy', 'terms'],
'📜': ['rules', 'policy', 'guidelines', 'instructions'],
'🤖': ['bot', 'ai', 'chatbot', 'assistant', 'llm', 'gpt', 'model'],
'🧠': ['intelligence', 'ai', 'model', 'neural'],
'⚙️': ['configure', 'settings', 'modify', 'adjust'],
'🔧': ['modify', 'change', 'alter', 'fix', 'tool'],
'🔨': ['break', 'smash', 'destroy', 'force'],
'💥': ['exploit', 'attack', 'breach', 'break'],
'🔥': ['powerful', 'intense', 'extreme', 'unlimited'],
'⚡': ['power', 'override', 'force', 'instant'],
'🌐': ['unrestricted', 'unlimited', 'worldwide', 'global'],
'🆓': ['unrestricted', 'uncensored', 'unlimited', 'free'],
'🚀': ['unlimited', 'powerful', 'advanced', 'boost'],
'👿': ['evil', 'malicious', 'unethical', 'harmful'],
'😈': ['mischief', 'evil', 'devious', 'naughty'],
'👹': ['demon', 'evil', 'malicious', 'harmful'],
'💀': ['dangerous', 'deadly', 'harmful', 'lethal'],
'☠️': ['toxic', 'poison', 'harmful', 'dangerous'],
'🧪': ['experiment', 'test', 'trial', 'hypothetical'],
'🔬': ['analyze', 'examine', 'research', 'study'],
'🎯': ['target', 'objective', 'goal', 'aim'],
'💣': ['destructive', 'harmful', 'dangerous', 'explosive'],
'🗡️': ['attack', 'offensive', 'hostile', 'aggressive'],
'⚔️': ['battle', 'fight', 'combat', 'conflict'],
'🦹': ['hero', 'super', 'powerful', 'special'],
'🦸': ['superhero', 'powerful', 'special', 'abilities'],
'🧙': ['magic', 'powerful', 'special', 'abilities'],
'👑': ['admin', 'supreme', 'ultimate', 'authority', 'ruler'],
'🎪': ['circus', 'show', 'performance', 'pretend'],
'🃏': ['wildcard', 'joker', 'unpredictable', 'trick'],
'🔀': ['alternate', 'switch', 'change', 'different'],
'🔁': ['loop', 'repeat', 'cycle', 'continue'],
'♾️': ['unlimited', 'infinite', 'endless', 'unrestricted'],
'🆕': ['new', 'alternative', 'different', 'updated'],
'🆙': ['upgrade', 'elevate', 'enhance', 'improve'],
'🔝': ['ultimate', 'maximum', 'supreme', 'highest'],
'💪': ['powerful', 'strong', 'capable', 'force'],
'⭐': ['special', 'unique', 'exceptional', 'privileged'],
'✨': ['special', 'magical', 'enhanced', 'unique'],
'🌟': ['special', 'exceptional', 'outstanding', 'unique']
};

View File

@@ -51,9 +51,8 @@ const transforms = {
return [...text].map(c => this.map[c] || c).reverse().join('');
},
preview: function(text) {
if (!text) return '[binary]';
const firstChar = text.charAt(0);
return firstChar.charCodeAt(0).toString(2).padStart(8, '0') + '...';
if (!text) return '[upside down]';
return this.func(text.slice(0, 8));
},
reverse: function(text) {
const revMap = this.reverseMap();
@@ -80,9 +79,8 @@ const transforms = {
return [...text.toLowerCase()].map(c => this.map[c] || c).join('');
},
preview: function(text) {
if (!text) return '[hex]';
const firstChar = text.charAt(0);
return firstChar.charCodeAt(0).toString(16).padStart(2, '0') + '...';
if (!text) return '[runes]';
return this.func(text.slice(0, 5));
},
reverse: function(text) {
const revMap = this.reverseMap();
@@ -96,8 +94,8 @@ const transforms = {
return [...text].join(' ');
},
preview: function(text) {
if (!text) return '[base64]';
return btoa(text.slice(0, 3)) + '...';
if (!text) return '[vaporwave]';
return [...text.slice(0, 3)].join(' ') + '...';
},
reverse: function(text) {
// Remove spaces between characters
@@ -248,11 +246,19 @@ const transforms = {
base64: {
name: 'Base64',
func: function(text) {
return btoa(text);
try {
return btoa(text);
} catch (e) {
return '[Invalid input]';
}
},
preview: function(text) {
if (!text) return '[base64]';
return btoa(text.slice(0, 3)) + '...';
try {
return btoa(text.slice(0, 3)) + '...';
} catch (e) {
return '[Invalid input]';
}
},
reverse: function(text) {
try {
@@ -267,8 +273,12 @@ const transforms = {
name: 'Base64 URL',
func: function(text) {
if (!text) return '';
const std = btoa(text);
return std.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/,'');
try {
const std = btoa(text);
return std.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/,'');
} catch (e) {
return '[Invalid input]';
}
},
preview: function(text) {
if (!text) return '[b64url]';
@@ -689,7 +699,12 @@ const transforms = {
url: {
name: 'URL Encode',
func: function(text) {
return encodeURIComponent(text);
try {
return encodeURIComponent(text);
} catch (e) {
// Catch malformed Unicode or unpaired surrogates
return '[Invalid input]';
}
},
preview: function(text) {
return this.func(text);
@@ -912,7 +927,8 @@ const transforms = {
return text.split('').map(char => this.map[char] || char).join('');
},
preview: function(text) {
return text.substring(0, 10) + (text.length > 10 ? '...' : '');
if (!text) return '[greek]';
return this.func(text.slice(0, 10));
},
reverseMap: function() {
if (!this._reverseMap) {
@@ -951,7 +967,8 @@ const transforms = {
return text.split('').map(char => this.map[char] || char).join('');
},
preview: function(text) {
return text.substring(0, 10) + (text.length > 10 ? '...' : '');
if (!text) return '[wingdings]';
return this.func(text.slice(0, 10));
},
reverseMap: function() {
if (!this._reverseMap) {
@@ -1032,17 +1049,37 @@ const transforms = {
'S': 'S', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z'
},
func: function(text) {
return [...text.toLowerCase()].map(c => this.map[c] || c).join('');
// Process character by character, preserving case
return [...text].map(c => this.map[c] || c).join('');
},
preview: function(text) {
return this.func(text);
if (!text) return '[klingon]';
return this.func(text.slice(0, 8));
},
reverse: function(text) {
// Build reverse map with multi-character strings
const revMap = {};
for (const [key, value] of Object.entries(this.map)) {
revMap[value] = key;
}
return [...text].map(c => revMap[c] || c).join('');
// Try to match multi-character sequences first, then single chars
let result = '';
let i = 0;
while (i < text.length) {
// Try 2-character match first (for 'ch', 'gh', 'CH', 'GH')
const twoChar = text.substr(i, 2);
if (revMap[twoChar]) {
result += revMap[twoChar];
i += 2;
} else if (revMap[text[i]]) {
result += revMap[text[i]];
i++;
} else {
result += text[i];
i++;
}
}
return result;
}
},
@@ -2077,20 +2114,70 @@ const transforms = {
},
// Emoji Speak (word → emoji, digits → keycaps)
// Emoji keywords loaded from emojiWordMap.js
emoji_speak: {
name: 'Emoji Speak',
wordMap: {
'love':'❤️','heart':'❤️','fire':'🔥','cool':'😎','ok':'👌','star':'⭐','poop':'💩','yes':'✅','no':'❌',
'up':'⬆️','down':'⬇️','left':'⬅️','right':'➡️','question':'❓','exclamation':'❗'
},
digitMap: {'0':'0⃣','1':'1⃣','2':'2⃣','3':'3⃣','4':'4⃣','5':'5⃣','6':'6⃣','7':'7⃣','8':'8⃣','9':'9⃣'},
func: function(text) {
// replace digits
// Replace digits with keycap emojis
let out = [...text].map(c => this.digitMap[c] || c).join('');
// replace words (case-insensitive)
for (const [word, emoji] of Object.entries(this.wordMap)) {
const re = new RegExp(`\\b${word}\\b`, 'gi');
out = out.replace(re, emoji);
// Replace words with emojis using keyword lookup
if (window.emojiKeywords) {
// Split into words while preserving spaces and punctuation
const words = out.match(/\b\w+\b/g);
if (words) {
// Process each unique word
const processed = new Set();
for (const word of words) {
const lower = word.toLowerCase();
if (processed.has(lower)) continue;
processed.add(lower);
// Find all emojis that have this word as a keyword
const matchingEmojis = [];
for (const [emoji, keywords] of Object.entries(window.emojiKeywords)) {
if (keywords.includes(lower)) {
matchingEmojis.push(emoji);
}
}
// If we found matches, replace with a random one
if (matchingEmojis.length > 0) {
const randomEmoji = matchingEmojis[Math.floor(Math.random() * matchingEmojis.length)];
const re = new RegExp(`\\b${word}\\b`, 'gi');
out = out.replace(re, randomEmoji);
}
}
}
// Second pass: Replace single characters and symbols (?, !, <3, arrows, etc.)
// Build a map of all single-char/symbol keywords
const symbolMap = new Map();
for (const [emoji, keywords] of Object.entries(window.emojiKeywords)) {
for (const keyword of keywords) {
// Only consider symbols (non-word characters or very short patterns)
// Exclude single digits since they're already handled by digitMap
if (keyword.length <= 3 && !/^\w+$/.test(keyword) && !/^\d$/.test(keyword)) {
if (!symbolMap.has(keyword)) {
symbolMap.set(keyword, []);
}
symbolMap.get(keyword).push(emoji);
}
}
}
// Replace symbols (longest first to handle multi-char like <3 before <)
const sortedSymbols = Array.from(symbolMap.keys()).sort((a, b) => b.length - a.length);
for (const symbol of sortedSymbols) {
if (out.includes(symbol)) {
const matchingEmojis = symbolMap.get(symbol);
const randomEmoji = matchingEmojis[Math.floor(Math.random() * matchingEmojis.length)];
// Escape special regex characters
const escaped = symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
out = out.replace(new RegExp(escaped, 'g'), randomEmoji);
}
}
}
return out;
},
@@ -2227,7 +2314,10 @@ const transforms = {
},
preview: function(text) {
if (!text) return '[rev words]';
return this.func(text.split(/\s+/).slice(0,2).join(' ')) + '...';
// Take last 2-3 words and reverse them to show the effect
const words = text.split(/\s+/);
const lastWords = words.slice(-3).join(' ');
return this.func(lastWords) + '...';
},
reverse: function(text) {
// Reversing words twice restores