import json import re DIFFS_FINAL = { 'космос': '🌌 🪐', 'планета': '🪐 🌐', 'созвездие': '🌌 🌠', 'зенит': '☀️ 🔝', 'эфир': '🌌 🪽', 'горизонт': '🌅 📏', 'небосвод': '🌌 🏛️', 'метеор': '☄️ ⚡', 'аврора': '🌌 🌈', 'надир': '🕳️ 🧭', 'солнцеворот': '☀️ 🔄', 'равноденствие': '⚖️ 🌓', 'цель': '🎯 🏹', 'попасть': '🎯 ⚡', 'чтоб': '🏹 ▫️', 'чтобы': '🏹 🧭', 'тьма': '🌑 🖤', 'мрак': '🌑 🌫️', 'темный': '🌑 🕯️', 'война': '⚔️ 🛡️', 'воин': '⚔️ 🪖', 'против': '🛡️ ⚔️', 'чистота': '💎 🕊️', 'будто': '🪞 💭', 'словно': '🪞 ✨', 'девушка': '👧 🌸', 'дочь': '👧 🎀', 'сестра': '👧 🤍', 'создание': '🏛️ 🌱', 'творец': '🏛️ ✨', 'создать': '🛠️ ✨', 'знать': '📜 💡', 'ибо': '💡 🏛️', 'поскольку': '📜 📌', 'успеть': '⏳ ⚡', 'тогда': '⏳ 🧭', 'уж': '⚡ ⌛', 'разный': '🔀 🎭', 'другой': '🔀 👥', 'иной': '🔀 🌌', 'вдруг': '⚡ 💥', 'ж': '💥 ▫️', 'же': '💥 ❗', 'при': '🤝 📍', 'с': '🤝 ➕', 'со': '🤝 🌐', 'сей': '👉 📍', 'этот': '👆 📍', 'то': '👉 ▫️', 'это': '👆 ▫️', 'огонь': '🔥 💥', 'пламя': '🔥 🕯️', 'гнев': '🔥 ⚡', 'воздух': '💨 🍃', 'ветер': '💨 🌪️', 'низ': '⬇️ 🕳️', 'низкий': '⬇️ 📏', 'высота': '🏔️ 🦅', 'высокий': '🏔️ 🔝', 'глубина': '🌊 ⚓', 'глубокий': '🌊 🕳️', 'порядок': '📐 🏛️', 'угол': '📐 📍', 'смерть': '💀 ⏳', 'умереть': '💀 🥀', 'конец': '🏁 ⏳', 'наконец': '🏁 ⚡', 'готовый': '🏁 🛡️', 'сила': '💪 🦁', 'сильно': '💪 ⚡', 'любовь': '❤️ 🕊️', 'любить': '❤️ ✨', 'дух': '🕊️ ✨', 'пусть': '🕊️ 💫', 'позволить': '🕊️ 🔓', 'сон': '💤 🌙', 'спать': '🛏️ 💤', 'забвение': '🌫️ 🍂', 'забыть': '🌫️ 🕳️', 'полнота': '🌕 🏺', 'полный': '🌕 💧', 'выход': '🚪 🌄', 'выйти': '🚪 🌅', 'войти': '🚪 ➡️', 'лёд': '❄️ 🧊', 'холод': '❄️ 💨', 'сияние': '✨ 🌟', 'чудо': '✨ 💫', 'зима': '❄️ 🌨️', 'снег': '❄️ ⚪', 'волна': '🌊 🌊', 'часто': '🌊 ⏱️', 'эпоха': '🏛️ ⏳', 'век': '🏛️ ⌛', 'история': '📜 ⏳', 'прошлый': '🏛️ 📜', 'вчера': '📜 🏛️', 'закон': '📜 ⚖️', 'сомнение': '❓ ⚖️', 'ли': '❓ ▫️', 'шёпот': '🤫 🍃', 'тихо': '🤫 🔇', 'крик': '📢 ⚡', 'кричать': '🗣️ 📢', 'бдение': '🕯️ 👁️', 'быть': '🕯️ 🌐', 'бог': '⚡ 👑', 'стать': '👑 ⬆️', 'будущее': '🌅 🔮', 'завтра': '🌅 📅', 'вера': '🕯️ ✝️', 'верить': '✝️ 🙏', 'просить': '🙏 🕯️', 'воля': '⚡ ✊', 'мочь': '⚡ 🦾', 'встреча': '🤝 👥', 'вместе': '👥 🔗', 'глаз': '👁️ ✨', 'видеть': '👁️ 💡', 'смотреть': '👁️ 🔭', 'зрение': '👁️ 🌅', 'желание': '🌟 💫', 'желать': '💫 💭', 'зал': '🏛️ 🕯️', 'святилище': '🏛️ ⛩️', 'игра': '🎭 🎲', 'играть': '🎲 🃏', 'интерес': '🔍 ✨', 'интересный': '🔍 💡', 'обнаружить': '🔍 🗝️', 'лес': '🌲 🌳', 'чаща': '🌲 🌿', 'момент': '⏱️ ⚡', 'сейчас': '⏱️ 📍', 'сразу': '⚡ ⏱️', 'мысль': '💭 ✨', 'думать': '🧠 💭', 'ум': '🧠 💡', 'вспомнить': '🧠 ⚡', 'надежда': '🕊️ ⚓', 'надеяться': '🕊️ 🌅', 'образ': '🪞 👤', 'себя': '🪞 🗝️', 'основа': '🏛️ 🧱', 'основание': '🧱 📐', 'отсутствие': '🫙 💨', 'пустой': '🫙 ⚪', 'песня': '🎤 🎶', 'петь': '🎶 🕊️', 'помощь': '🤝 🛡️', 'помочь': '🤝 🤲', 'речь': '🗣️ 💬', 'сказать': '💬 ➡️', 'рассказ': '📖 🗣️', 'рассказать': '🗣️ 📜', 'решение': '⚖️ 🗡️', 'решить': '🗡️ ⚡', 'кинжал': '🗡️ 🩸', 'связь': '🪢 🔗', 'связать': '🪢 🧶', 'смысл': '💡 🗝️', 'потому': '💡 ➡️', 'совет': '🗣️ 💡', 'сцена': '🎭 🏛️', 'театр': '🎭 🎟️', 'ухо': '👂 🔔', 'слушать': '👂 🌊', 'слышать': '👂 🎶', 'чувство': '💓 🌊', 'чувствовать': '💓 ✨', 'рок': '⚡ ⏳', 'скоро': '⏱️ ⏳', 'идол': '🗿 🕯️', 'алтарь': '🗿 🔥', 'капище': '🗿 🪵', 'стрела': '🏹 ⚡', 'лук': '🏹 🌲', 'охотник': '🏹 🐾', 'жребий': '🎲 ✨', 'возможно': '🎲 ❓', 'родник': '💧 🌿', 'влажный': '💧 🍃', 'роса': '💧 🌸', 'хижина': '🛖 🌲', 'скит': '🛖 🕯️', 'орел': '🦅 🏔️', 'сокол': '🦅 ⚡', 'странник': '🎒 🚶', 'нести': '🎒 🤲', 'умеренность': '⚖️ 🌿', 'зато': '⚖️ ➕', 'открыть': '🔓 🚪', 'открытый': '🚪 🪟', 'появиться': '✨ 🌅', 'новый': '🌅 🌿', 'прийти': '🚪 🚶', 'уйти': '🚶 🚪', 'близкий': '🫂 📍', 'рядом': '📍 👥', 'далекий': '🔭 🌌', 'далеко': '🔭 🧭', 'долгий': '⏳ 📜', 'долго': '⏳ 🛤️', 'легкий': '🪶 💨', 'легко': '🪶 ✨', 'личный': '🗝️ 🪪', 'мой': '🗝️ 👤', 'свой': '🗝️ 🤍', 'настоящий': '💎 ⚖️', 'правда': '💎 🏛️', 'ранний': '🌅 🐓', 'рано': '🌅 ⏱️', 'более': '📈 ➕', 'больше': '📈 🔝', 'затем': '➡️ ⏳', 'потом': '➡️ ⌛', 'продолжать': '⏳ ➡️', 'надо': '⚠️ 🔨', 'нужно': '⚠️ 🧭', 'в': '📥 📍', 'во': '📥 🚪', 'к': '➡️ 📍', 'ко': '➡️ 🚪', 'о': '💭 🗣️', 'об': '💭 📜', 'как-то': '🌫️ ❓', 'какой-то': '🌫️ 🔍', 'ваш': '🛡️ 👥', 'наш': '👥 🛡️', 'а': '⚖️ ⚡', 'все-таки': '⚖️ 🔄', 'но': '⚡ 🛡️', 'однако': '🛡️ ⚡', 'хотя': '🌧️ ☀️', 'хоть': '🌧️ ▫️', 'лишь': '🎯 ▫️', 'только': '🎯 📍', 'именно': '📍 🎯', 'теперь': '⏳ 📍', } # 1. Update lexicon.json lex = json.load(open('oracle_enricher/data/lexicon.json', 'r', encoding='utf-8')) for item in lex: w = item['word'] if w in DIFFS_FINAL: item['emoji'] = DIFFS_FINAL[w] assert len(set(x['emoji'] for x in lex)) == 1000, 'Not all 1000 emojis are unique!' with open('oracle_enricher/data/lexicon.json', 'w', encoding='utf-8') as f: json.dump(lex, f, ensure_ascii=False, indent=2) word_to_emoji = {x['word']: x['emoji'] for x in lex} # 2. Update families.json fam = json.load(open('oracle_enricher/data/families.json', 'r', encoding='utf-8')) for w, entry in fam.items(): if w in word_to_emoji and isinstance(entry, dict): entry['emoji'] = word_to_emoji[w] with open('oracle_enricher/data/families.json', 'w', encoding='utf-8') as f: json.dump(fam, f, ensure_ascii=False, indent=2) # 3. Update out/oracle_kb.json and assets/data/oracle_kb.json for kb_path in ('oracle_enricher/out/oracle_kb.json', 'assets/data/oracle_kb.json'): try: kb = json.load(open(kb_path, 'r', encoding='utf-8')) for k, v in kb.items(): if isinstance(v, dict): w = v.get('word') if w in word_to_emoji: v['emoji'] = word_to_emoji[w] with open(kb_path, 'w', encoding='utf-8') as f: json.dump(kb, f, ensure_ascii=False, indent=2) except Exception as e: print(f'Error updating {kb_path}: {e}') # 4. Update words_data.dart lines = open('lib/data/words_data.dart', 'r', encoding='utf-8').readlines() updated_lines = [] curr_w = None for l in lines: m_w = re.search(r'word:\s*"([^"]+)"', l) if m_w: curr_w = m_w.group(1) m_em = re.search(r'emoji:\s*"([^"]*)"', l) if m_em and curr_w and curr_w in word_to_emoji: l = re.sub(r'emoji:\s*"[^"]*"', f'emoji: "{word_to_emoji[curr_w]}"', l) updated_lines.append(l) open('lib/data/words_data.dart', 'w', encoding='utf-8').writelines(updated_lines) # 5. Update words_alphabetical.txt and .md alpha_items = sorted(lex, key=lambda x: x['word']) with open('words_alphabetical.txt', 'w', encoding='utf-8') as f: for it in alpha_items: f.write(('#%03d %s %s' % (it['id'], it['word'], it['emoji'])) + chr(10)) with open('words_alphabetical.md', 'w', encoding='utf-8') as f: f.write('# Алфавитный указатель Оракула 999' + chr(10) + chr(10)) f.write('| № | Слово | Иконка | Категория | Ч. речи |' + chr(10)) f.write('|---|---|---|---|---|' + chr(10)) for it in alpha_items: f.write(('| #%03d | **%s** | %s | %s | %s |' % (it['id'], it['word'], it['emoji'], it['category'], it['pos'])) + chr(10)) # 6. Update lexicon_viewer.html html = open('lexicon_viewer.html', 'r', encoding='utf-8').read() raw_lex = json.dumps(lex, ensure_ascii=False) if 'const rawLexicon = ' in html: html = re.sub(r'const rawLexicon = \[.*?\];', f'const rawLexicon = {raw_lex};', html, flags=re.DOTALL) open('lexicon_viewer.html', 'w', encoding='utf-8').write(html) print('1000 UNIQUE EMOJIS AND DOSSIERS APPLIED CLEANLY EVERYWHERE!')