Files
999/scripts/apply_core_rotations_39.py
T

524 lines
24 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()