#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ apply_core_rotations_39.py ========================== Выполняет согласованную ротацию 39 служебных / грамматических слов в диапазоне 850–1000 на мировые символические архетипы из академической базы: - oracle_passports_staging.json - oracle_passports.json - oracle_illustrations_catalog.json - oracle_external_symbols.json - lib/data/words_data.dart """ import os import sys import json import re from pathlib import Path from typing import Dict, Any, List ROOT = Path("/home/alexives/Desktop/StudioProjects/999") STAGING_PATH = ROOT / "assets/data/oracle_passports_staging.json" PASSPORTS_PATH = ROOT / "assets/data/oracle_passports.json" EXTERNAL_PATH = ROOT / "assets/data/oracle_external_symbols.json" CATALOG_PATH = ROOT / "assets/data/oracle_illustrations_catalog.json" WORDS_DATA_PATH = ROOT / "lib/data/words_data.dart" ROTATIONS = { 879: { "word": "лестница", "emoji": "🪜", "category": "Образ / Архетип", "pos": "существительное", "description": "Связь миров, восхождение духа, преодоление ступеней посвящения, ось соединения земного и небесного." }, 882: { "word": "трон", "emoji": "👑", "category": "Образ / Архетип", "pos": "существительное", "description": "Царственное величие, центр духовной и светской власти, неподвижная ось порядка и сакральный авторитет." }, 883: { "word": "колонна", "emoji": "🏛️", "category": "Образ / Архетип", "pos": "существительное", "description": "Мировая опора, вертикальная стойкость, незыблемость космического закона и равновесие свода бытия." }, 885: { "word": "слон", "emoji": "🐘", "category": "Образ / Архетип", "pos": "существительное", "description": "Царственная мощь, несокрушимое терпение, космическая устойчивость, мудрость и благословение изобилия." }, 889: { "word": "пальма", "emoji": "🌴", "category": "Образ / Архетип", "pos": "существительное", "description": "Триумф над смертью, праведность, солнечная победа, оазис жизни и духовное возрождение." }, 890: { "word": "гранат", "emoji": "🍎", "category": "Образ / Архетип", "pos": "существительное", "description": "Единство во множестве, сокровенное семя жизни, мистическое возрождение, тайна бессмертия и щедрость природы." }, 891: { "word": "трезубец", "emoji": "🔱", "category": "Образ / Архетип", "pos": "существительное", "description": "Власть над тремя стихиями и временами, сокрушающая воля громовержца и владыки пучин, символ Шивы и Посейдона." }, 892: { "word": "раковина", "emoji": "🐚", "category": "Образ / Архетип", "pos": "существительное", "description": "Глубинный зов океана, лоно сокрытой жемчужины, священный голос дхармы и спираль вечной эволюции." }, 894: { "word": "свастика", "emoji": "卐", "category": "Образ / Архетип", "pos": "существительное", "description": "Древнейший знак круговращения солнца, вихрь созидающей жизни, благоденствие и вечное движение космоса." }, 902: { "word": "булава", "emoji": "🏏", "category": "Образ / Архетип", "pos": "существительное", "description": "Символ верховного предводительства, разящая сила правосудия, неоспоримый авторитет и доблесть защитника." }, 905: { "word": "время", "emoji": "⏳", "category": "Образ / Архетип", "pos": "существительное", "description": "Великая река вечности, неумолимый закон становления и увядания, созревание кармы и космический цикл Хроноса." }, 906: { "word": "жемчуг", "emoji": "🦪", "category": "Образ / Архетип", "pos": "существительное", "description": "Лунная чистота, тайное знание, рожденное в бездне страдания, драгоценная душа и непорочная истина." }, 908: { "word": "павлин", "emoji": "🦚", "category": "Образ / Архетип", "pos": "существительное", "description": "Звездный хвост вселенной, бессмертие, очищение от ядов страстей, царственная красота и воскресение." }, 910: { "word": "пеликан", "emoji": "🦢", "category": "Образ / Архетип", "pos": "существительное", "description": "Жертвенная любовь, алхимическое воскрешение потомства собственной кровью, искупление и милосердие." }, 911: { "word": "рай", "emoji": "🌺", "category": "Образ / Архетип", "pos": "существительное", "description": "Изначальное состояние гармонии, вечный сад блаженства, древо жизни и возвращение души в обитель света." }, 914: { "word": "троица", "emoji": "🔺", "category": "Образ / Архетип", "pos": "существительное", "description": "Триединство бытия, нераздельное согласие созидателя, хранителя и преобразителя, космический синтез начал." }, 915: { "word": "левиафан", "emoji": "🐉", "category": "Образ / Архетип", "pos": "существительное", "description": "Глубинное чудовище первозданного хаоса, свернутая мощь океана, неподвластная человеку стихия первоматерии." }, 916: { "word": "василиск", "emoji": "🦎", "category": "Образ / Архетип", "pos": "существительное", "description": "Царь змей, смертоносный взгляд скрытой опасности, искушение гордыней и растворитель материи." }, 920: { "word": "коралл", "emoji": "🪸", "category": "Образ / Архетип", "pos": "существительное", "description": "Древо подводного царства, оберег от дурного глаза, соединение царств минералов и растений, застывшая кровь моря." }, 921: { "word": "зонт", "emoji": "☂️", "category": "Образ / Архетип", "pos": "существительное", "description": "Царственный купол защиты, укрытие от палящего зноя сансары, знак духовного достоинства и благословение неба." }, 923: { "word": "сеть", "emoji": "🕸️", "category": "Образ / Архетип", "pos": "существительное", "description": "Связанность вселенной, улавливание душ и явлений, паутина иллюзий Майи и неразрывное единство причин и следствий." }, 927: { "word": "нарцисс", "emoji": "🌼", "category": "Образ / Архетип", "pos": "существительное", "description": "Весеннее пробуждение, созерцание собственной сокровенной сути, опасность самообольщения и вечная юность." }, 930: { "word": "ромб", "emoji": "🔶", "category": "Образ / Архетип", "pos": "существительное", "description": "Архаический знак засеянного поля, плодородия, союз четырех сторон света и женское порождающее лоно земли." }, 936: { "word": "флаг", "emoji": "🚩", "category": "Образ / Архетип", "pos": "существительное", "description": "Знамя устремления, ориентир для войска, манифестация присутствия духа и символ победного стяга." }, 938: { "word": "крылья", "emoji": "🪽", "category": "Образ / Архетип", "pos": "существительное", "description": "Полет над земным тяготением, вдохновение, духовная легкость, защита божественных сил и свобода мысли." }, 940: { "word": "бамбук", "emoji": "🎋", "category": "Образ / Архетип", "pos": "существительное", "description": "Гибкость без слома, пустота внутри как готовность вместить дао, стойкость перед бурей и долголетие." }, 941: { "word": "осел", "emoji": "🫏", "category": "Образ / Архетип", "pos": "существительное", "description": "Смирение, несущее бремя священной тайны, терпеливое служение, упорство и скрытая мудрость кротости." }, 942: { "word": "минотавр", "emoji": "🐂", "category": "Образ / Архетип", "pos": "существительное", "description": "Хранитель темного лабиринта подсознания, звериная мощь инстинктов, зовущая героя к преодолению страха." }, 948: { "word": "облака", "emoji": "☁️", "category": "Образ / Архетип", "pos": "существительное", "description": "Покров божественной тайны, дарители живительного дождя, текучесть небесных форм и колесница духов." }, 949: { "word": "сера", "emoji": "🌋", "category": "Образ / Архетип", "pos": "существительное", "description": "Алхимическое мужское активное начало (Сульфур), горючий дух, огненная сущность преображения металлов." }, 952: { "word": "фазан", "emoji": "🪶", "category": "Образ / Архетип", "pos": "существительное", "description": "Солнечная птица пяти добродетелей, вестник зари, символ процветания, верности и гармонии стихий." }, 953: { "word": "корзина", "emoji": "🧺", "category": "Образ / Архетип", "pos": "существительное", "description": "Вместилище даров земли, изобилие плодов, оберег сокрытого младенца и тайна дионисийских мистерий." }, 955: { "word": "сверчок", "emoji": "🦗", "category": "Образ / Архетип", "pos": "существительное", "description": "Хранитель домашнего очага, тихий голос уюта, предвестник добрых вестей и цикличности времен года." }, 957: { "word": "вишня", "emoji": "🍒", "category": "Образ / Архетип", "pos": "существительное", "description": "Краткая пленительная красота бытия, весеннее возрождение, чистота помыслов и самурайская верность идеалу." }, 958: { "word": "слива", "emoji": "🫐", "category": "Образ / Архетип", "pos": "существительное", "description": "Цветение посреди зимнего снега, несокрушимая стойкость духа, надежда на весну и чистота отшельника." }, 962: { "word": "алхимия", "emoji": "⚗️", "category": "Образ / Архетип", "pos": "существительное", "description": "Великое Делание (Magnum Opus), трансмутация грубого свинца эго в чистое золото духа, единство микро- и макрокосма." }, 964: { "word": "чистилище", "emoji": "🔥", "category": "Образ / Архетип", "pos": "существительное", "description": "Огонь искупления и очищения, промежуточная обитель преображения души на пути от тьмы к свету вечности." }, 984: { "word": "горностай", "emoji": "🐾", "category": "Образ / Архетип", "pos": "существительное", "description": "Безупречная чистота и благородство, девиз «лучше смерть, чем бесчестье», царская мантия непорочности." }, 985: { "word": "сорока", "emoji": "🐦‍⬛", "category": "Образ / Архетип", "pos": "существительное", "description": "Птица радостных вестей в восточной традиции, мост через Млечный Путь для влюбленных, зоркость и проницательность." } } AUTHOR_FIELD_MAP = { "Ч. Уильямс": "culture_china_light", "Роберт Бир": "culture_india_light", "Генрих Циммер": "culture_india_light", "М. Баттистини": "culture_antiquity_light", "Тимофей из Газы": "culture_antiquity_light", "О.М. Чунакова": "culture_persia_light", "Сборник Петра I (Амстердам/Москва, 1705)": "culture_slavic_light", "Н.Н. Велецкая": "culture_slavic_light", "В.Г. Рохмистров": "mantic_alchemy", "П.Д. Успенский": "mantic_tarot", "Х.Э. Керлот": "culture_hermetic_light", "В.В. Карелин": "culture_hermetic_light", "Н.Д. Кортунова": "culture_hermetic_light", "Рене Генон": "culture_hermetic_light", "Дж. Купер": "semantic_core", "Мирча Элиаде": "meta_synthesis", "Джек Тресиддер": "meta_synthesis", "К.Г. Юнг": "meta_synthesis", } CASCADE_FIELDS = [ "meta_synthesis", "semantic_core", "state_creative", "state_neutral", "state_destructive", "will_vector", "shadow_warning", "culture_hermetic_shadow", "culture_antiquity_shadow", "culture_slavic_shadow", "culture_china_shadow", "culture_india_shadow" ] def count_filled_fields(entry: Dict[str, Any]) -> int: fields = entry.get("fields", {}) return sum(1 for v in fields.values() if isinstance(v, str) and v.strip()) def main(): print("=== STARTING 39 CORE ROTATIONS MIGRATION ===") # 1. Load datasets with open(EXTERNAL_PATH, "r", encoding="utf-8") as f: ext_db = json.load(f) with open(CATALOG_PATH, "r", encoding="utf-8") as f: catalog = json.load(f) with open(PASSPORTS_PATH, "r", encoding="utf-8") as f: passports = json.load(f) with open(STAGING_PATH, "r", encoding="utf-8") as f: staging = json.load(f) # 2. Process illustrations catalog updates catalog_updated_count = 0 for c in catalog: c_norm = c.get("normalized", "").lower() c_sym = (c.get("symbol") or c.get("term") or "").lower() words = re.findall(r"[а-яё]+", c_norm + " " + c_sym) for slot_id, info in ROTATIONS.items(): target_word = info["word"] if target_word in words or c_norm == target_word: c["is_core_1000"] = True c["core_id"] = str(slot_id) catalog_updated_count += 1 break print(f"Catalog illustrations tagged as core: {catalog_updated_count}") # 3. Update Passports (both staging and production) for db_name, db in [("staging", staging), ("production", passports)]: print(f"\nProcessing {db_name} passports...") for slot_id, info in ROTATIONS.items(): str_id = str(slot_id) if str_id not in db: continue entry = db[str_id] target_word = info["word"] emoji = info["emoji"] pos = info["pos"] category = info["category"] description = info["description"] # Update core metadata entry["word"] = target_word entry["pos"] = pos entry["category"] = category entry["emoji"] = emoji fields = entry.setdefault("fields", {}) # Reset grammatical placeholder boilerplates fields["index_and_name"] = f"{slot_id} | {target_word.upper()} | {emoji}" fields["grammatical_class"] = pos fields["functional_category"] = category fields["network_status"] = "Свободный знак поля" # Clear outdated boilerplate if it existed for k in list(fields.keys()): val = fields[k] if isinstance(val, str) and ("Указывает, на какой аспект" in val or "Импульс модальности" in val or "Узел отношений" in val or "Фокус осознания" in val): fields[k] = "" # Populate with authentic excerpts from external_symbols ext_entry = ext_db.get(target_word) if ext_entry: sources = ext_entry.get("sources", []) for s in sources: author = s.get("author", "").strip() work = s.get("work", "").strip() excerpt = s.get("excerpt", "").strip() if not excerpt: continue citation = f"[{author} · {work}]: «{excerpt}»" # Determine preferred field target_field = AUTHOR_FIELD_MAP.get(author, "meta_synthesis") if fields.get(target_field): # Try cascade for alt in CASCADE_FIELDS: if not fields.get(alt): target_field = alt break # If all chosen are full, append citation to meta_synthesis if fields.get(target_field): fields[target_field] = fields[target_field] + "\n\n" + citation else: fields[target_field] = citation # If semantic_core or meta_synthesis is still empty, populate description if not fields.get("semantic_core"): fields["semantic_core"] = description if not fields.get("state_creative"): fields["state_creative"] = f"Гармоничное раскрытие принципа «{target_word}»: созидательная ясность и устойчивость." if not fields.get("state_destructive"): fields["state_destructive"] = f"Теневое искажение принципа «{target_word}»: косность, иллюзия или крайность проявления." # Attach matching illustrations directly to passport matching_ills = [] for c in catalog: c_norm = c.get("normalized", "").lower() c_sym = (c.get("symbol") or c.get("term") or "").lower() words = re.findall(r"[а-яё]+", c_norm + " " + c_sym) if target_word in words or c_norm == target_word: matching_ills.append(c) entry["illustrations"] = matching_ills filled = count_filled_fields(entry) entry["filled_count"] = filled entry["is_complete"] = (filled >= 78) # 4. Update External Symbols DB (mark promoted items) for slot_id, info in ROTATIONS.items(): target_word = info["word"] if target_word in ext_db: ext_db[target_word]["promoted_to_core_id"] = slot_id # 5. Save JSON databases with open(CATALOG_PATH, "w", encoding="utf-8") as f: json.dump(catalog, f, ensure_ascii=False, indent=2) with open(PASSPORTS_PATH, "w", encoding="utf-8") as f: json.dump(passports, f, ensure_ascii=False, indent=2) with open(STAGING_PATH, "w", encoding="utf-8") as f: json.dump(staging, f, ensure_ascii=False, indent=2) with open(EXTERNAL_PATH, "w", encoding="utf-8") as f: json.dump(ext_db, f, ensure_ascii=False, indent=2) print("All JSON files saved successfully.") # 6. Update lib/data/words_data.dart with open(WORDS_DATA_PATH, "r", encoding="utf-8") as f: dart_text = f.read() for slot_id, info in ROTATIONS.items(): target_word = info["word"] pos = info["pos"] cat = info["category"] desc = info["description"] # Regex to match the WordItem block by ID item_regex = re.compile( rf'(WordItem\(\s*id:\s*{slot_id},\s*word:\s*)"[^"]+",\s*partOfSpeech:\s*"[^"]+",\s*frequency:\s*[\d\.]+,\s*category:\s*"[^"]+",\s*description:\s*"[^"]+",\s*\)', re.MULTILINE ) replacement = ( f'WordItem(\n' f' id: {slot_id},\n' f' word: "{target_word}",\n' f' partOfSpeech: "{pos}",\n' f' frequency: 95.0,\n' f' category: "{cat}",\n' f' description: "{desc}",\n' f' )' ) dart_text, count = item_regex.subn(replacement, dart_text, count=1) if count == 0: print(f"WARNING: Could not replace WordItem id {slot_id} in words_data.dart!") with open(WORDS_DATA_PATH, "w", encoding="utf-8") as f: f.write(dart_text) print("lib/data/words_data.dart updated successfully.") print("=== MIGRATION COMPLETE ===") if __name__ == "__main__": main()