import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const catalogPath = path.join(__dirname, '../lib/emoji-catalog.ts'); const src = fs.readFileSync(catalogPath, 'utf8'); const ids = [...src.matchAll(/id: '(e-[^']+)'/g)].map((match) => match[1]); function face(id, mouth, extra = '') { return `${mouth}${extra}`; } function heart(id, color) { return ``; } function circle(id, color, label) { return `${label}`; } const mouthSmile = ''; const mouthLaugh = ''; const mouthSad = ''; const mouthOpen = ''; const mouthLine = ''; const parts = ['']; for (const id of ids) { if (id.includes('grinning') || id.includes('smile') || id.includes('blush') || id.includes('slight')) { parts.push(face(id, mouthSmile)); } else if (id.includes('laugh') || id.includes('rofl') || id.includes('party')) { parts.push(face(id, mouthLaugh)); } else if (id.includes('cry') || id.includes('sob') || id.includes('tired')) { parts.push(face(id, mouthSad)); } else if (id.includes('shock') || id.includes('fear') || id.includes('rage') || id.includes('angry') || id.includes('sick') || id.includes('mask')) { parts.push(face(id, mouthOpen)); } else if (id.includes('heart')) { const colors = { red: '#EF4444', orange: '#F97316', yellow: '#EAB308', green: '#22C55E', blue: '#3B82F6', purple: '#A855F7', black: '#111827', white: '#F9FAFB', broken: '#9CA3AF', sparkling: '#EC4899', two: '#F43F5E', revolving: '#FB7185' }; const key = Object.keys(colors).find((item) => id.includes(item)) || 'red'; parts.push(heart(id, colors[key])); } else if (id.includes('thumbs-up')) { parts.push(``); } else if (id.includes('thumbs-down')) { parts.push(``); } else if (id.includes('fire')) { parts.push(``); } else if (id.includes('star')) { parts.push(``); } else if (id.includes('check')) { parts.push(``); } else if (id.includes('cross')) { parts.push(``); } else if (id.includes('lock')) { parts.push(``); } else if (id.includes('dog')) { parts.push(``); } else if (id.includes('cat')) { parts.push(``); } else if (id.includes('pizza')) { parts.push(``); } else if (id.includes('coffee')) { parts.push(``); } else if (id.includes('car')) { parts.push(``); } else if (id.includes('airplane')) { parts.push(``); } else if (id.includes('rocket')) { parts.push(``); } else if (id.includes('bulb')) { parts.push(``); } else if (id.includes('phone')) { parts.push(``); } else if (id.includes('100')) { parts.push(`100`); } else if (id.includes('wink')) { parts.push(face(id, mouthSmile, '')); } else if (id.includes('thinking')) { parts.push(face(id, mouthLine, '')); } else if (id.includes('sleeping')) { parts.push(face(id, mouthLine, 'Zzz')); } else if (id.includes('cool')) { parts.push(face(id, mouthSmile, '')); } else if (id.includes('kiss')) { parts.push(face(id, '', '')); } else if (id.includes('tongue')) { parts.push(face(id, '', '')); } else if (id.includes('wave')) { parts.push(``); } else if (id.includes('clap')) { parts.push(``); } else { const label = id.replace('e-', '').slice(0, 3).toUpperCase(); const hue = Math.abs(id.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0)) % 360; parts.push(circle(id, `hsl(${hue} 70% 55%)`, label)); } } parts.push(''); const out = path.join(__dirname, '../public/emojis/lendry-emojis.svg'); fs.mkdirSync(path.dirname(out), { recursive: true }); fs.writeFileSync(out, parts.join('')); console.log(`Generated ${ids.length} emoji symbols`);