mirror of
https://github.com/elder-plinius/P4RS3LT0NGV3.git
synced 2026-02-12 16:52:46 +00:00
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:
@@ -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 {
|
||||
|
||||
78
index.html
78
index.html
@@ -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>
|
||||
|
||||
98
js/app.js
98
js/app.js
@@ -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.
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
853
js/emojiWordMap.js
Normal 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']
|
||||
};
|
||||
146
js/transforms.js
146
js/transforms.js
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user