#!/usr/bin/env python3 """Fill original scripts: Hebrew, classical hanzi, Arabic geomantic names.""" from __future__ import annotations import json from pathlib import Path ROOT = Path(__file__).resolve().parents[1] CANON = ROOT / "oracle_enricher" / "data" / "traditions_canon.json" ASSET = ROOT / "assets" / "data" / "traditions_canon.json" HTML = ROOT / "lexicon_viewer.html" SEPHIROTH_HEBREW = { "kether": "כתר", "chokmah": "חכמה", "binah": "בינה", "chesed": "חסד", "geburah": "גבורה", "tiphereth": "תפארת", "netzach": "נצח", "hod": "הוד", "yesod": "יסוד", "malkuth": "מלכות", } TRIGRAM_HANZI = { "qian": "乾", "kun": "坤", "zhen": "震", "kan": "坎", "gen": "艮", "xun": "巽", "li": "離", "dui": "兌", } # King Wen order, traditional characters (Zhou Yi) GEOMANCY_ARABIC = { "via": ("الطريق", "ат-Тарик", "Via", "Путь"), "populus": ("الجماعة", "аль-Джама'а", "Populus", "Народ"), "conjunctio": ("الاجتماع", "аль-Иджтима'", "Conjunctio", "Соединение"), "carcer": ("الحبس", "аль-Хабс", "Carcer", "Тюрьма"), "fortuna_major": ("النصرة الداخلة", "ан-Насра ад-Дахиля", "Fortuna Major", "Большая Удача"), "fortuna_minor": ("النصرة الخارجة", "ан-Насра аль-Хариджа", "Fortuna Minor", "Малая Удача"), "acquisitio": ("القبض الداخل", "аль-Кабд ад-Дахиль", "Acquisitio", "Приобретение"), "amissio": ("القبض الخارج", "аль-Кабд аль-Харидж", "Amissio", "Потеря"), "laetitia": ("الفرح", "аль-Фарах", "Laetitia", "Радость"), "tristitia": ("الحزن", "аль-Хузн", "Tristitia", "Печаль"), "puella": ("نقي الخد", "наки аль-хадд", "Puella", "Девушка"), "puer": ("الانكيس", "аль-Анкийс", "Puer", "Юноша"), "albus": ("البياض", "аль-Байяд", "Albus", "Белый"), "rubeus": ("الحمرة", "аль-Хумра", "Rubeus", "Красный"), "caput_draconis": ("رأس الجوزهر", "ра'с аль-джузхар", "Caput Draconis", "Голова Дракона"), "cauda_draconis": ("ذنب الجوزهر", "занаб аль-джузхар", "Cauda Draconis", "Хвост Дракона"), } HEX_HANZI = { 1: "乾", 2: "坤", 3: "屯", 4: "蒙", 5: "需", 6: "訟", 7: "師", 8: "比", 9: "小畜", 10: "履", 11: "泰", 12: "否", 13: "同人", 14: "大有", 15: "謙", 16: "豫", 17: "隨", 18: "蠱", 19: "臨", 20: "觀", 21: "噬嗑", 22: "賁", 23: "剝", 24: "復", 25: "無妄", 26: "大畜", 27: "頤", 28: "大過", 29: "坎", 30: "離", 31: "咸", 32: "恆", 33: "遯", 34: "大壯", 35: "晉", 36: "明夷", 37: "家人", 38: "睽", 39: "蹇", 40: "解", 41: "損", 42: "益", 43: "夬", 44: "姤", 45: "萃", 46: "升", 47: "困", 48: "井", 49: "革", 50: "鼎", 51: "震", 52: "艮", 53: "漸", 54: "歸妹", 55: "豐", 56: "旅", 57: "巽", 58: "兌", 59: "渙", 60: "節", 61: "中孚", 62: "小過", 63: "既濟", 64: "未濟", } def main() -> None: canon = json.loads(CANON.read_text(encoding="utf-8")) for st in canon["kabbalah"]["stations"]: he = SEPHIROTH_HEBREW.get(st["id"]) if he: st["hebrew"] = he for st in canon["iching"]["stations"]: sid = st["id"] if sid in TRIGRAM_HANZI: st["hanzi"] = TRIGRAM_HANZI[sid] continue if sid.startswith("hex_"): n = int(sid.split("_")[1]) hz = HEX_HANZI.get(n) if hz: st["hanzi"] = hz for i, st in enumerate(canon["geomancy"]["stations"], start=1): rec = GEOMANCY_ARABIC.get(st["id"]) if not rec: continue script, latn, latin, ru = rec st["arabic"] = script st["name"] = f"{i} {latin} ({latn} / {ru})" text = json.dumps(canon, ensure_ascii=False, indent=2) + "\n" CANON.write_text(text, encoding="utf-8") ASSET.write_text(text, encoding="utf-8") html = HTML.read_text(encoding="utf-8") start = html.find(" const TRADITIONS_CANON = ") end = html.find(" const WORDS_DATA = ") if start > 0 and end > start: html = ( html[:start] + " const TRADITIONS_CANON = " + json.dumps(canon, ensure_ascii=False, indent=2) + ";\n\n" + html[end:] ) HTML.write_text(html, encoding="utf-8") kb = [(s["id"], s.get("hebrew"), s["name"]) for s in canon["kabbalah"]["stations"]] print("sephiroth", kb) ich = canon["iching"]["stations"] print("trigrams", [(s["id"], s.get("hanzi"), s["name"]) for s in ich if not s["id"].startswith("hex_")]) print("hex sample", [(s["id"], s.get("hanzi"), s["name"]) for s in ich if s["id"].startswith("hex_")][:5]) print("hex 64", ich[-1]["id"], ich[-1].get("hanzi"), ich[-1]["name"]) missing = [s["id"] for s in ich if not s.get("hanzi")] print("missing hanzi", missing) geo = [(s["id"], s.get("arabic"), s["name"]) for s in canon["geomancy"]["stations"]] print("geomancy", geo) if __name__ == "__main__": main()