feat: complete academic symbol lexicon heal, 2-column Cooper extraction, and updated assets
This commit is contained in:
Executable
+523
@@ -0,0 +1,523 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user