import json import re LEXICON_JSON = 'oracle_enricher/data/lexicon.json' FAMILIES_JSON = 'oracle_enricher/data/families.json' KB_ASSET_JSON = 'assets/data/oracle_kb.json' KB_OUT_JSON = 'oracle_enricher/out/oracle_kb.json' WORDS_DATA_DART = 'lib/data/words_data.dart' WORDS_TXT = 'words_alphabetical.txt' WORDS_MD = 'words_alphabetical.md' VIEWER_HTML = 'lexicon_viewer.html' EXPLICIT_EMOJIS = { # 1. 12 Zodiac signs & Constellations 'овен': '♈ 🐏', 'телец': '♉ 🐂', 'близнецы': '♊ 👥', 'рак': '♋ 🦀', 'лев': '♌ 🦁', 'дева': '♍ 🌾', 'весы': '♎ ⚖️', 'скорпион': '♏ 🦂', 'стрелец': '♐ 🏹', 'козерог': '♑ 🐐', 'водолей': '♒ 🏺', 'рыбы': '♓ 🐟', # 2. 7 Planets & Cosmos 'солнце': '☀️ 👑', 'луна': '🌙 🌊', 'меркурий': '☿️ 📜', 'венера': '♀️ 🌹', 'марс': '♂️ ⚔️', 'юпитер': '♃ ⚡', 'сатурн': '♄ ⏳', 'космос': '🌌 🪐', # 3. 7 Alchemical Metals 'золото': '🪙 ☀️', 'серебро': '🥈 🌙', 'медь': '🥉 ♀️', 'железо': '⚙️ ⚔️', 'олово': '🪞 ⚡', 'свинец': '🧱 ⏳', 'ртуть': '💧 ⚗️', # 4. 7 Virtues 'мудрость': '🦉 📜', 'мужество': '🦁 🛡️', 'умеренность': '⚖️ 🌿', 'справедливость': '⚔️ ⚖️', 'вера': '🕯️ ✝️', 'надежда': '🕊️ ⚓', 'любовь': '❤️ 🕊️', # 5. 7 Deadly Sins 'гордыня': '👑 🪞', 'зависть': '🐍 👁️', 'гнев': '🔥 ⚡', 'уныние': '🌧️ 🥀', 'алчность': '💰 🪙', 'чревоугодие': '🍞 🍷', 'похоть': '💋 🔥', # 6. 14 Musical Terms & Acoustics 'до': '🎵 🔔', 'ре': '🎶 🌊', 'ми': '🎼 🌿', 'фа': '🎺 ☀️', 'соль': '🧂 ☀️', 'ля': '🎻 🕊️', 'си': '🪕 ✨', 'диез': '♯ 🔺', 'бемоль': '♭ 🔻', 'звук': '🔊 🌊', 'тишина': '🤫 🌌', 'эхо': '📢 🏔️', 'ритм': '🥁 💓', 'мелодия': '🎼 🎶', # 7. 14 Colors 'красный': '🔴 🔥', 'оранжевый': '🟠 🌅', 'жёлтый': '🟡 ☀️', 'зелёный': '🟢 🌿', 'зеленый': '🟢 🌿', 'голубой': '💠 🩵', 'синий': '🔵 🌊', 'фиолетовый': '🟣 🔮', 'белый': '⚪ 🕊️', 'чёрный': '⚫ 🌑', 'черный': '⚫ 🌑', 'серый': '🔘 🌫️', 'розовый': '🌸 💖', 'пурпурный': '👑 🪻', 'коричневый': '🟤 🪵', 'прозрачный': '💎 🪟', # 8. 14 Senses, Tastes & Smells 'сладкий': '🍯 🍓', 'горький': '☕ 🌿', 'кислый': '🍋 ⚡', 'солёный': '🧂 🌊', 'острый': '🌶️ 🗡️', 'вяжущий': '🍂 🪵', 'пресный': '💧 ⚪', 'аромат': '🌸 🪔', 'вонь': '🦨 ☣️', 'свежесть': '🍃 ❄️', 'пряный': '🌿 🌰', 'терпкий': '🍇 🍷', 'гниль': '🍄 🍂', 'гарь': '🌋 💨', # 9. 14 Bodily Senses & Tactility 'зрение': '👁️ 🌅', 'слух': '👂 🔔', 'осязание': '✋ 🪶', 'вкус': '👅 🍯', 'обоняние': '👃 🌸', 'равновесие': '⚖️ 🧘', 'чутьё': '🐺 🧭', 'мягкий': '🪶 ☁️', 'твёрдый': '🪨 💎', 'пушистый': '🐱 ☁️', 'гладкий': '🧊 🪞', 'шершавый': '🪵 🧗', 'горячий': '♨️ 🔥', 'холодный': '❄️ 🧊', # 10. Daily Cycle 'полночь': '🕛 🌑', 'заря': '🌄 ✨', 'рассвет': '🌅 ☀️', 'утро': '☕ 🌅', 'день': '☀️ 🏙️', 'полдень': '🕛 ☀️', 'вечер': '🌇 🍷', 'закат': '🌆 🌅', 'сумерки': '🌃 🌫️', 'ночь': '🌙 🌌', # 11. Fundamental Elements 'огонь': '🔥 ⚡', 'вода': '💧 🌊', 'воздух': '💨 🍃', 'земля': '🌍 ⛰️', 'свет': '✨ ☀️', 'тьма': '🌑 🖤', 'лёд': '❄️ 🧊', 'пламя': '🔥 🕯️', 'искра': '⚡ ✨', 'пепел': '🌫️ ⚱️', 'дым': '💨 🌫️', 'пар': '♨️ 🌫️', 'тень': '👤 🌑', 'луч': '☀️ ⚡', 'сияние': '✨ 🌟', 'мрак': '🌑 🖤', 'зима': '❄️ 🌨️', 'весна': '🌱 🌸', 'осень': '🍂 🍁', 'лето': '☀️ 🌻', 'молния': '⚡ 🌩️', 'гром': '🌩️ 🔊', 'дождь': '🌧️ 💧', 'туман': '🌫️ 🌁', 'роса': '💧 🍃', 'иней': '❄️ 🌾', 'буря': '🌪️ ⚡', 'ветер': '💨 🍃', 'волна': '🌊 🌊', 'прилив': '🌊 🌕', 'отлив': '🌊 🌑', 'лава': '🌋 🔥', 'радуга': '🌈 ✨', 'снег': '❄️ 🌨️', 'жар': '🔥 🌡️', 'холод': '❄️ 🧊', 'небо': '🌌 ☁️', 'бездна': '🕳️ 🌌', 'верх': '⬆️ 🏔️', 'низ': '⬇️ 🕳️', 'высота': '🏔️ 🦅', 'глубина': '🌊 ⚓', 'север': '❄️ 🧭', 'юг': '☀️ 🧭', 'восток': '🌅 🧭', 'запад': '🌇 🧭', # 12. Actions / Verbs (all 109 verbs) 'бежать': '🏃 💨', 'бояться': '😨 🌑', 'бросить': '🤾 💨', 'быть': '🕯️ 👁️', 'верить': '🕯️ ✝️', 'вернуться': '🔄 🏠', 'вести': '🧭 🚶', 'взять': '🤲 ✊', 'видеть': '👁️ ✨', 'возникнуть': '✨ 🌱', 'войти': '🚪 ➡️', 'вспомнить': '🧠 💡', 'встать': '🧍 ⬆️', 'выглядеть': '🪞 👁️', 'вызвать': '📯 ⚡', 'выйти': '🚪 🌅', 'дать': '🤲 🎁', 'действовать': '⚡ 🔨', 'делать': '🛠️ 🧱', 'держать': '✊ 🔒', 'думать': '🧠 💭', 'ехать': '🏇 🛤️', 'ждать': '⏳ 👁️', 'желать': '🌟 💫', 'жить': '🌿 💓', 'забыть': '🌫️ 🍂', 'заметить': '👁️ ⚡', 'звать': '📢 📯', 'знать': '📜 💡', 'значить': '🗝️ 📖', 'играть': '🎭 🎲', 'идти': '🚶 🛤️', 'иметь': '💼 🔑', 'искать': '🧭 🔍', 'казаться': '🌫️ 🪞', 'касаться': '✋ ✨', 'кричать': '📢 ⚡', 'лежать': '🛏️ 🧘', 'любить': '❤️ 🕊️', 'молчать': '🤫 🤐', 'мочь': '⚡ ✊', 'надеяться': '🕊️ ⚓', 'назвать': '🗣️ 🏷️', 'найти': '🗝️ 💎', 'находиться': '📍 🧭', 'начать': '🏁 🌱', 'нести': '🎒 🚶', 'нравиться': '✨ 💖', 'обнаружить': '🔍 💡', 'объяснить': '📜 🗣️', 'оставить': '🥀 🚪', 'остаться': '⚓ 🏛️', 'ответить': '🗣️ ✉️', 'открыть': '🔓 🚪', 'передать': '🤝 📜', 'петь': '🎤 🎶', 'писать': '✍️ 📜', 'пить': '🍷 💧', 'поднять': '⬆️ 🤲', 'позволить': '🕊️ 🔓', 'показать': '👆 👁️', 'получить': '🎁 🤲', 'помнить': '🧠 🏛️', 'помочь': '🤝 🛡️', 'понимать': '💡 🧠', 'попасть': '🎯 🏹', 'потерять': '🍂 🕳️', 'появиться': '✨ 🌅', 'предложить': '🤲 📜', 'прийти': '🚪 🚶', 'принести': '🎁 🚶', 'принять': '🤲 🤍', 'продолжать': '⏳ ➡️', 'просить': '🙏 🕯️', 'пытаться': '🧗 ⚡', 'рассказать': '🗣️ 📜', 'расти': '🌱 🌳', 'решить': '⚖️ 🗡️', 'связать': '🪢 🔗', 'сидеть': '🪑 🧘', 'сказать': '🗣️ 💬', 'служить': '🛡️ 🕯️', 'случиться': '⚡ 🎲', 'слушать': '👂 🔔', 'слышать': '👂 🌊', 'смотреть': '👁️ 🔭', 'снять': '🎭 ⬇️', 'собираться': '🎒 🧭', 'согласиться': '🤝 🕊️', 'создать': '🏛️ ✨', 'спать': '💤 🌙', 'спросить': '❓ 🗣️', 'ставить': '🧱 📍', 'стараться': '🧗 🔨', 'стать': '⚡ 👑', 'стоить': '🪙 ⚖️', 'стоять': '🧍 ⚓', 'существовать': '🌌 🕯️', 'убить': '⚔️ 💀', 'уйти': '🚪 🚶', 'умереть': '💀 ⏳', 'уметь': '🛠️ 💡', 'успеть': '⏳ ⚡', 'учиться': '📖 🧙', 'хватать': '✊ 🦅', 'ходить': '🚶 🐾', 'хотеть': '🔥 💭', 'читать': '📖 👓', 'чувствовать': '💓 🌊', # 13. Adjectives (all remaining) 'близкий': '🫂 📍', 'большой': '🐘 🏔️', 'великий': '👑 🏛️', 'влажный': '💧 🌿', 'внешний': '🌐 🪟', 'внутренний': '🧘 🗝️', 'высокий': '🏔️ 🦅', 'глубокий': '🌊 ⚓', 'готовый': '🏁 ⚡', 'далекий': '🔭 🌌', 'длинный': '📏 🛤️', 'добрый': '☀️ 🤍', 'долгий': '⏳ 📜', 'дорогой': '💎 🪙', 'единый': '⭕ 🔗', 'живой': '🌱 💓', 'знакомый': '🤝 💡', 'знаменитый': '🌟 👑', 'интересный': '🔍 ✨', 'короткий': '✂️ ⏱️', 'легкий': '🪶 💨', 'личный': '🗝️ 👤', 'любимый': '💖 🌹', 'малый': '🔬 🔹', 'молодой': '🌱 👶', 'настоящий': '💎 ⚖️', 'низкий': '⬇️ 🕳️', 'новый': '✨ 🌅', 'открытый': '🔓 🚪', 'плохой': '🥀 🌑', 'поздний': '🦉 🌙', 'полный': '🌕 🏺', 'последний': '🔚 ⏳', 'похожий': '🪞 👥', 'правый': '⚖️ ➡️', 'прекрасный': '🌺 ✨', 'простой': '🪵 ⚪', 'прошлый': '🏛️ 📜', 'прямой': '📏 🏹', 'пустой': '🫙 💨', 'равный': '⚖️ 🟰', 'разный': '🔀 🎭', 'ранний': '🌅 🐓', 'свободный': '🦅 🕊️', 'серьезный': '🗿 ⚖️', 'сильный': '🦁 💪', 'сложный': '🧩 🌀', 'старый': '👴 ⏳', 'странный': '🌀 👁️', 'страшный': '👹 ⚡', 'сухой': '🏜️ 🍂', 'темный': '🌑 🖤', 'тяжелый': '🪨 ⚖️', 'хороший': '🌟 👍', 'целый': '🌕 🛡️', 'чистый': '💧 🕊️', 'чужой': '👤 🚪', 'широкий': '🌊 ↔️', # 14. Grammar Particles, Pronouns, Numerals 'а': '⚖️ ⚡', 'без': '🚫 🫙', 'более': '📈 ➕', 'больше': '📈 ➕', 'будто': '🪞 ✨', 'бы': '💭 🔮', 'быстро': '⚡ 💨', 'в': '📥 📍', 'ваш': '🛡️ 👥', 'вдруг': '⚡ 💥', 'ведь': '💡 🗣️', 'весь': '🌐 ⭕', 'вместе': '🤝 👥', 'вместо': '🔀 🪑', 'во': '📥 📍', 'возможно': '🎲 ✨', 'вокруг': '🔄 🌐', 'вообще': '🌐 🌊', 'вот': '👉 ⚡', 'впервые': '🌱 1️⃣', 'вперед': '➡️ 🏹', 'все': '🌐 👥', 'все-таки': '⚖️ ⚡', 'всегда': '♾️ ⏳', 'всего': '🌐 ▫️', 'вчера': '🏛️ 📜', 'вы': '👥 👑', 'где': '📍 ❓', 'где-то': '📍 🌫️', 'да': '🟢 ✔️', 'давно': '⏳ 🏛️', 'даже': '⚡ ❗', 'далеко': '🔭 🌌', 'два': '2️⃣ 👥', 'двадцать': '2️⃣0️⃣ ⏳', 'десять': '🔟 🏛️', 'для': '🎯 🎁', 'долго': '⏳ 📜', 'домой': '🏠 🚶', 'другой': '🔀 🎭', 'его': '👤 🗝️', 'едва': '🤏 ⏱️', 'ее': '👩 🗝️', 'если': '🔀 ❓', 'еще': '⏳ ➕', 'ж': '⚡ 💥', 'же': '⚡ 💥', 'за': '🚪 🛡️', 'завтра': '🌅 🔮', 'затем': '➡️ ⏳', 'зато': '⚖️ 🌿', 'здесь': '📍 ⚓', 'и': '➕ 🔗', 'ибо': '📜 💡', 'из': '📤 🏞️', 'из-за': '⛈️ ⚡', 'или': '⚖️ 🔀', 'именно': '🎯 📍', 'иначе': '🔀 ⚡', 'иногда': '🎲 ⏳', 'иной': '🔀 🎭', 'их': '👥 🗝️', 'к': '➡️ 📍', 'как': '🪞 ❓', 'как-то': '🌫️ ❓', 'какой': '❓ 🔍', 'какой-то': '🌫️ ❓', 'ко': '➡️ 📍', 'когда': '⏳ ❓', 'который': '👉 🗝️', 'кроме': '🚫 ✂️', 'кто': '❓ 👤', 'кто-то': '👤 🌫️', 'куда': '🧭 ❓', 'легко': '🪶 💨', 'ли': '❓ ⚖️', 'либо': '🔀 🎲', 'лишь': '🎯 ▫️', 'мало': '💧 ▫️', 'между': '↔️ ⚖️', 'многий': '🌊 👥', 'много': '🌊 ➕', 'можно': '🟢 🕊️', 'мой': '🗝️ 👤', 'мы': '👥 🤝', 'на': '🔝 📍', 'над': '☁️ ⬆️', 'надо': '⚠️ 🔨', 'назад': '⬅️ ⏳', 'наконец': '🏁 ⏳', 'наш': '🛡️ 👥', 'не': '🚫 🛡️', 'недавно': '⏱️ 🌿', 'некий': '🌫️ ✨', 'нельзя': '🔴 🚫', 'немного': '🤏 💧', 'нет': '🔴 ✖️', 'ни': '🚫 ⚪', 'никак': '🚫 ⚡', 'никогда': '🚫 ⏳', 'никто': '🚫 👤', 'ничто': '🚫 🕳️', 'но': '🛡️ ⚡', 'ну': '🗣️ ⚡', 'нужно': '⚠️ 🔨', 'о': '💭 🗣️', 'об': '💭 🗣️', 'оба': '👥 🟰', 'один': '1️⃣ ☝️', 'однажды': '🌟 📖', 'однако': '🛡️ ⚡', 'около': '🔄 📍', 'он': '👨 👤', 'она': '👩 👤', 'они': '👥 🌐', 'оно': '⚪ 🔮', 'от': '⬅️ 📍', 'откуда': '🏛️ ❓', 'очень': '🔥 ❗', 'перед': '🚪 👁️', 'плохо': '👎 🥀', 'по': '🛤️ ➡️', 'под': '⬇️ 🛡️', 'пока': '⏳ ⏳', 'поскольку': '📜 💡', 'после': '🔚 ➡️', 'потом': '➡️ ⏳', 'потому': '💡 🗝️', 'почему': '❓ 💡', 'почему-то': '❓ 🌫️', 'почти': '🤏 🎯', 'поэтому': '➡️ 💡', 'правда': '💎 ⚖️', 'прежде': '⬅️ 📜', 'при': '🤝 📍', 'причем': '➕ 📜', 'про': '📖 💭', 'против': '⚔️ 🛡️', 'прямо': '📏 ➡️', 'пусть': '🕊️ ✨', 'пять': '5️⃣ ⭐', 'рано': '🌅 🐓', 'рядом': '🫂 📍', 'с': '🤝 📍', 'сам': '👤 ⚡', 'самый': '🔝 ⭐', 'свой': '🗝️ 🤍', 'себя': '🪞 👤', 'сегодня': '☀️ 📅', 'сей': '👉 📍', 'сейчас': '⏱️ ⚡', 'сильно': '💪 ⚡', 'сколько': '❓ 🔢', 'скоро': '⚡ ⏳', 'слишком': '🌊 ⚠️', 'словно': '🪞 ✨', 'сначала': '🏁 1️⃣', 'снова': '🔄 🔁', 'со': '🤝 📍', 'совсем': '💯 ⭕', 'сразу': '⚡ ⏱️', 'среди': '👥 🌾', 'сто': '💯 🏛️', 'столь': '📈 ⚡', 'сюда': '↙️ 📍', 'так': '👉 ✔️', 'такой': '🪞 ▫️', 'там': '📍 🔭', 'твой': '🗝️ 🫵', 'теперь': '⏳ 📍', 'тихо': '🤫 🍃', 'то': '👉 📍', 'тогда': '⏳ ⚡', 'только': '🎯 ▫️', 'тот': '👈 🔭', 'точно': '🎯 📐', 'три': '3️⃣ 🔺', 'трудно': '🪨 🧗', 'туда': '↗️ 🧭', 'ты': '🫵 👤', 'у': '📍 🏡', 'уж': '⏳ ⚡', 'уже': '⌛ ⚡', 'хорошо': '👍 ✨', 'хоть': '🌧️ ☀️', 'хотя': '🌧️ ☀️', 'часто': '🌊 🌊', 'чем': '⚖️ ❓', 'через': '🌉 ➡️', 'четыре': '4️⃣ 🟩', 'что': '❓ 🔮', 'что-то': '🔮 🌫️', 'чтоб': '🎯 🏹', 'чтобы': '🎯 🏹', 'шесть': '6️⃣ 🔯', 'это': '👆 📍', 'этот': '👉 📍', 'я': '👁️ 👤', 'ясно': '☀️ 💡', # 15. Nouns (specific archetypal pairs) 'бдение': '🕯️ 👁️', 'благодать': '✨ 🕊️', 'благословение': '🤲 ✨', 'болезнь': '🥀 🩹', 'борьба': '🤼 ⚔️', 'брат': '👦 🤝', 'будущее': '🌅 🔮', 'буря': '🌪️ ⚡', 'вдова': '🖤 🥀', 'ведьма': '🧙‍♀️ 🌙', 'век': '🏛️ ⏳', 'верёвка': '🪢 🧵', 'вестник': '📯 🕊️', 'вещь': '📦 🏺', 'взгляд': '👁️ 🎯', 'вид': '🏞️ 👁️', 'вина': '⛓️ 😔', 'вино': '🍷 🍇', 'власть': '👑 ⚡', 'внимание': '🎯 👁️', 'война': '⚔️ 🛡️', 'волос': '💇 🌾', 'воля': '⚡ ✊', 'встреча': '🤝 👥', 'вуаль': '🕸️ 👰', 'вход': '🚪 🔑', 'высота': '🏔️ 🦅', 'выход': '🚪 🌅', 'глаз': '👁️ ✨', 'год': '📅 ⏳', 'голова': '👤 🧠', 'голос': '🗣️ 🎶', 'гримуар': '📖 🔮', 'грудь': '🫁 🛡️', 'дверь': '🚪 🗝️', 'движение': '🏃 ➡️', 'двойник': '👥 🪞', 'двор': '🏡 🌿', 'дворец': '🏰 👑', 'дельфин': '🐬 🌊', 'деревня': '🏘️ 🌾', 'долина': '🏞️ 🌾', 'дорога': '🛤️ 🧭', 'дочь': '👧 🌸', 'древо': '🌳 🪵', 'дубрава': '🌳 🌿', 'дух': '🕊️ ✨', 'душа': '🕯️ 💖', 'дым': '💨 🌫️', 'дыхание': '🫁 💨', 'единорог': '🦄 ✨', 'желание': '🌟 💫', 'жена': '👰 💍', 'жрица': '🔮 🌙', 'журавль': '🪿 🌾', 'завеса': '🎭 🌫️', 'закон': '📜 ⚖️', 'зал': '🏛️ 🕯️', 'защита': '🛡️ 🏰', 'заяц': '🐇 🐾', 'знамение': '☄️ 📜', 'знание': '💡 📖', 'зов': '📯 📢', 'ива': '🌿 💧', 'игра': '🎭 🎲', 'идея': '💡 ⚡', 'идол': '🗿 🕯️', 'изгнанник': '🚶 🌑', 'изобилие': '🌾 🍇', 'имя': '🏷️ 📜', 'интерес': '🔍 ✨', 'искупление': '🕊️ 🕯️', 'искусство': '🎨 🏛️', 'искушение': '🍎 🐍', 'история': '📜 ⏳', 'источник': '⛲ 💧', 'итог': '🏁 ⚖️', 'кабан': '🐗 🌲', 'кадило': '🪔 💨', 'кадуцей': '⚕️ 🐍', 'капище': '🗿 🔥', 'карма': '☸️ 🔄', 'карта': '🗺️ 🧭', 'картина': '🖼️ 🎨', 'катакомбы': '🏛️ 💀', 'кедр': '🌲 🏔️', 'кинжал': '🗡️ ⚡', 'кипарис': '🌲 🏛️', 'кит': '🐋 🌊', 'кладбище': '🪦 🥀', 'коза': '🐐 🌾', 'компас': '🧭 ⭐', 'копьё': '🗡️ 🛡️', 'король': '👑 🏰', 'кость': '🦴 💀', 'костёр': '🔥 🪵', 'котёл': '🫕 ⚗️', 'край': '⛰️ 🌅', 'крик': '📢 ⚡', 'кристалл': '💎 🔮', 'кровь': '🩸 💓', 'круг': '⭕ 🔄', 'купель': '🏺 💧', 'лавр': '🌿 👑', 'ласточка': '🐦 🌅', 'лебедь': '🦢 💧', 'линия': '📏 〰️', 'лира': '🎻 🎶', 'лицо': '👤 🎭', 'мальчик': '👦 🌱', 'мандала': '☸️ 🌸', 'маяк': '🗼 💡', 'мера': '⚖️ 📏', 'место': '📍 🏛️', 'месть': '🗡️ 🔥', 'месяц': '🌙 ⭐', 'мир': '🕊️ 🌿', 'момент': '⏱️ ⚡', 'мудрец': '🧙 📜', 'муж': '👨 💍', 'мужик': '🧔 🪵', 'музыка': '🎼 🎶', 'муравей': '🐜 🌿', 'мысль': '🧠 💭', 'название': '🏷️ 📖', 'направление': '🧭 ➡️', 'народ': '👥 🏛️', 'нектар': '🍯 🌺', 'ненависть': '🔥 🗡️', 'нищета': '🏚️ 🥀', 'нищий': '🤲 🍂', 'нога': '🦵 👣', 'нос': '👃 🌬️', 'обет': '📜 🕯️', 'обитель': '🏡 🕊️', 'образ': '🪞 👤', 'обрыв': '🧗 🕳️', 'опыт': '🧠 ⏳', 'оружие': '⚔️ 🏹', 'основа': '🏛️ 🧱', 'основание': '🏛️ 🧱', 'ось': '🌐 📍', 'ответ': '✉️ 🗣️', 'откровение': '📜 ⚡', 'отношение': '🤝 🪢', 'отсутствие': '🫙 💨', 'отчаяние': '🌧️ 😔', 'отшельник': '🧙 🏔️', 'охотник': '🏹 🌲', 'палач': '🪓 🖤', 'палец': '☝️ 🖐️', 'пантера': '🐆 🌑', 'пара': '👥 🤍', 'перевал': '🏔️ 🛤️', 'перекресток': '➕ 🧭', 'песня': '🎤 🎶', 'петух': '🐓 🌅', 'печаль': '😢 🌧️', 'пилигрим': '🚶 🧭', 'пир': '🍷 🍖', 'письмо': '✉️ 📜', 'плач': '😭 💧', 'плечо': '🦾 🛡️', 'плющ': '🌿 🏛️', 'подземелье': '🕳️ 🗝️', 'пол': '🪵 🏛️', 'поле': '🌾 🌻', 'половина': '🌓 ✂️', 'помощь': '🤝 🛡️', 'пора': '⏳ 🌾', 'посвящение': '🕯️ 👑', 'пост': '🍞 🧘', 'поэт': '🪶 📜', 'правило': '📜 📏', 'право': '⚖️ 📜', 'принцип': '🏛️ ⚖️', 'природа': '🌿 🌲', 'пристань': '⚓ ⛵', 'причина': '🗝️ 💡', 'проклятие': '☠️ ⚡', 'пропасть': '🕳️ 🧗', 'пророчество': '📜 👁️', 'пространство': '🌌 📐', 'прощение': '🕊️ 🤲', 'радость': '☀️ 😄', 'раз': '1️⃣ ⚡', 'развитие': '🌱 📈', 'рассказ': '📖 🗣️', 'ребята': '🧒 👧', 'реликвия': '🏺 ✨', 'речь': '🗣️ 💬', 'решение': '⚖️ 🗡️', 'рисунок': '🎨 📜', 'рог': '📯 🦏', 'род': '🌳 🩸', 'родитель': '👨‍👩‍👧 🕊️', 'родник': '💧 🌿', 'рок': '⚡ ⏳', 'роман': '📖 ❤️', 'рост': '🌱 ⬆️', 'рот': '👄 🗣️', 'роща': '🌳 🍃', 'рука': '✋ 🤲', 'ручей': '🏞️ 💧', 'рысь': '🐾 🌲', 'связь': '🪢 🔗', 'святилище': '🏛️ 🕯️', 'семья': '👨‍👩‍👧 🏡', 'семя': '🌱 🌰', 'сердце': '❤️ 💓', 'сестра': '👧 🌸', 'сирота': '🥀 🧒', 'скала': '⛰️ 🪨', 'скверна': '☣️ 🖤', 'скит': '🛖 🌲', 'скорбь': '🥀 🖤', 'скрижаль': '📜 🪨', 'слабость': '🥀 ⏳', 'слово': '💬 🪶', 'случай': '🎲 ⚡', 'смех': '😄 ✨', 'смирение': '🙇 🕊️', 'смысл': '💡 🗝️', 'событие': '⚡ 📅', 'совет': '🗣️ 📜', 'создание': '🏛️ ✨', 'сознание': '🧠 ✨', 'солдат': '🪖 ⚔️', 'сомнение': '❓ ⚖️', 'состояние': '🌊 🧘', 'сосуд': '🏺 🫙', 'спаситель': '🕊️ 👑', 'спина': '👤 🛡️', 'спираль': '🌀 🐚', 'спутник': '🛰️ 🌙', 'среда': '🌿 🌐', 'стихи': '📜 🪶', 'сторона': '🧭 ↔️', 'страсть': '🔥 ❤️', 'стыд': '😳 🥀', 'суд': '⚖️ 🏛️', 'сцена': '🎭 🏛️', 'счастье': '🍀 ☀️', 'сын': '👦 🏹', 'талисман': '🧿 🪙', 'танец': '💃 🎶', 'творец': '🏛️ ✨', 'тело': '👤 🩸', 'театр': '🎭 🏛️', 'течение': '🌊 ➡️', 'тигр': '🐅 🐾', 'тотем': '🐾 🪵', 'точка': '📍 ⚫', 'тревога': '⚡ 😟', 'тропа': '🛤️ 🌲', 'труд': '🔨 🌾', 'тысяча': '1️⃣0️⃣0️⃣0️⃣ 🏛️', 'угасание': '🕯️ 💨', 'угол': '📐 🏛️', 'удар': '💥 ⚡', 'улица': '🏙️ 🛤️', 'ум': '🧠 💡', 'успех': '🏆 🌟', 'ухо': '👂 🔔', 'ущелье': '🏞️ 🧗', 'филин': '🦉 🌲', 'фонарь': '🏮 💡', 'форма': '🔷 📐', 'характер': '🗿 ⚡', 'хижина': '🛖 🌲', 'хлеб': '🍞 🌾', 'ход': '♟️ ➡️', 'хозяин': '👑 🔑', 'хранитель': '🗝️ 🛡️', 'художник': '🎨 🖌️', 'цвет': '🎨 🌈', 'цель': '🎯 🏹', 'центр': '🎯 ⭕', 'церковь': '⛪ 🕊️', 'цикл': '🔄 ⏳', 'часть': '🧩 ▫️', 'чаща': '🌲 🌳', 'человек': '👤 🕯️', 'чертог': '🏛️ 👑', 'чувство': '💓 🌊', 'чудо': '✨ 🌟', 'шаг': '👣 🚶', 'шаман': '🪶 🥁', 'шатёр': '⛺ 🌌', 'шрам': '⚡ 🩹', 'шёпот': '🤫 🍃', 'эпоха': '🏛️ ⏳', 'явь': '👁️ ☀️', 'яд': '🧪 ☠️', 'язык': '👅 🗣️', 'яйцо': '🥚 🐣', 'якорь': '⚓ 🌊', } def resolve_emoji(word, current_emoji, pos, category): w = word.lower().strip() if w in EXPLICIT_EMOJIS: return EXPLICIT_EMOJIS[w] if current_emoji and current_emoji not in ('🔮 ✨', '⚡ ➡️', '🧭 🏹', '✨ 🎨', '🏛️ 🧭', '🪢 🔗', '🔮 📜', '✨ 🏺', '👤 ✨', '🐾 ✨'): return current_emoji return '✨ 🔮' def main(): print('=== ASSIGNING RICH EMOJIS TO ALL 1000 WORDS ===') with open(LEXICON_JSON, 'r', encoding='utf-8') as f: lexicon = json.load(f) assert len(lexicon) == 1000, f'Expected 1000 items, got {len(lexicon)}' word_to_emoji = {} missing_count = 0 for item in lexicon: w = item['word'] em = resolve_emoji(w, item.get('emoji', ''), item.get('pos', ''), item.get('category', '')) item['emoji'] = em word_to_emoji[w] = em if em == '✨ 🔮': missing_count += 1 print(f'Warning: unmapped word: {w}') print(f'Assigned emojis. Unmapped count: {missing_count}') # Save lexicon.json with open(LEXICON_JSON, 'w', encoding='utf-8') as f: json.dump(lexicon, f, ensure_ascii=False, indent=2) print(f'Updated {LEXICON_JSON}') # Update families.json try: with open(FAMILIES_JSON, 'r', encoding='utf-8') as f: families = json.load(f) for w, entry in families.items(): if w in word_to_emoji and isinstance(entry, dict): entry['emoji'] = word_to_emoji[w] with open(FAMILIES_JSON, 'w', encoding='utf-8') as f: json.dump(families, f, ensure_ascii=False, indent=2) print(f'Updated {FAMILIES_JSON}') except Exception as e: print(f'Error updating families.json: {e}') # Update KB asset & out for kb_path in (KB_ASSET_JSON, KB_OUT_JSON): try: with open(kb_path, 'r', encoding='utf-8') as f: kb = json.load(f) for k, entry in kb.items(): w_name = entry.get('word', '') if w_name in word_to_emoji: entry['emoji'] = word_to_emoji[w_name] with open(kb_path, 'w', encoding='utf-8') as f: json.dump(kb, f, ensure_ascii=False, indent=2) print(f'Updated {kb_path}') except Exception as e: print(f'Error updating {kb_path}: {e}') # Update lib/data/words_data.dart with open(WORDS_DATA_DART, 'r', encoding='utf-8') as f: dart_lines = f.readlines() updated_dart_lines = [] current_w = None for line in dart_lines: m_word = re.search(r'word:\s*"([^"]+)"', line) if m_word: current_w = m_word.group(1) m_emoji = re.search(r'emoji:\s*"([^"]*)"', line) if m_emoji and current_w and current_w in word_to_emoji: line = re.sub(r'emoji:\s*"[^"]*"', f'emoji: "{word_to_emoji[current_w]}"', line) updated_dart_lines.append(line) with open(WORDS_DATA_DART, 'w', encoding='utf-8') as f: f.writelines(updated_dart_lines) print(f'Updated {WORDS_DATA_DART}') # Update words_alphabetical.txt and .md alpha_items = sorted(lexicon, key=lambda x: x['word']) with open(WORDS_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)) print(f"Updated {WORDS_TXT}") with open(WORDS_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)) print(f"Updated {WORDS_MD}") print(f'Updated {WORDS_MD}') # Update lexicon_viewer.html with open(VIEWER_HTML, 'r', encoding='utf-8') as f: html_content = f.read() escaped_lexicon = json.dumps(lexicon, ensure_ascii=False) if 'const rawLexicon = ' in html_content: html_content = re.sub(r'const rawLexicon = \[.*?\];', f'const rawLexicon = {escaped_lexicon};', html_content, flags=re.DOTALL) with open(VIEWER_HTML, 'w', encoding='utf-8') as f: f.write(html_content) print(f'Updated embedded rawLexicon in {VIEWER_HTML}') print('=== ALL 1000 WORDS RICHLY EMOJI-MAPPED SUCCESSFULLY ===') if __name__ == '__main__': main()