File size: 6,581 Bytes
f054e62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import unicodedata
import logging

logger = logging.getLogger(__name__)

USE_SIMPLE_GEMATRIA = True

HEBREW_GEMATRIA_VALUES = {

     'א': 1, 'ב': 2, 'ג': 3, 'ד': 4, 'ה': 5, 'ו': 6, 'ז': 7, 'ח': 8, 'ט': 9, 'י': 10,
    'כ': 20, 'ך': 500, 'ל': 30, 'מ': 40, 'ם': 600, 'נ': 50, 'ן': 700, 'ס': 60, 'ע': 70, 'פ': 80, 'ף': 800,
    'צ': 90, 'ץ': 900, 'ק': 100, 'ר': 200, 'ש': 300, 'ת': 400,

    }

GEMATRIA_VALUES = {
    # Latin letters
    'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 600,
    'k': 10, 'l': 20, 'm': 30, 'n': 40, 'o': 50, 'p': 60, 'q': 70, 'r': 80, 's': 90,
    't': 100, 'u': 200, 'v': 700, 'w': 900, 'x': 300, 'y': 400, 'z': 500,

    'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 600,
    'K': 10, 'L': 20, 'M': 30, 'N': 40, 'O': 50, 'P': 60, 'Q': 70, 'R': 80, 'S': 90,
    'T': 100, 'U': 200, 'V': 700, 'W': 900, 'X': 300, 'Y': 400, 'Z': 500,

    # Base letters and some already mentioned variants
    'ا': 1, 'أ': 1, 'إ': 1, 'آ': 1, 'ب': 2, 'ج': 3, 'د': 4, 'ه': 5, 'و': 6, 'ز': 7, 'ح': 8, 'ط': 9,
    'ي': 10, 'ى': 10, 'ك': 20, 'ک': 20, 'ل': 30, 'م': 40, 'ن': 50, 'س': 60, 'ع': 70, 'ف': 80,
    'ص': 90, 'ق': 100, 'ر': 200, 'ش': 300, 'ت': 400, 'ث': 500, 'خ': 600, 'ذ': 700, 'ض': 800, 'ظ': 900, 'غ': 1000,
    'ٱ': 1, # Alif Wasla
    'ـ': 0, # Tatweel

    # Additional variants and special characters
    'ة': 400, # Taa Marbuta
    'ؤ': 6,  # Waw with Hamza above
    'ئ': 10, # Ya with Hamza above
    'ء': 1,  # Hamza
    'ى': 10, # Alif Maqsurah
    'ٹ': 400, # Taa' marbuta goal
    'پ': 2,  # Pe (Persian/Urdu)
    'چ': 3,  # Che (Persian/Urdu)
    'ژ': 7,  # Zhe (Persian/Urdu)
    'گ': 20, # Gaf (Persian/Urdu)
    'ڭ': 20, # Ngaf (Kazakh, Uyghur, Uzbek, and in some Arabic dialects)
    'ں': 50, # Noon Ghunna (Persian/Urdu)
    'ۀ': 5,  # Heh with Yeh above (Persian/Urdu)
    'ے': 10, # Barree Yeh (Persian/Urdu)
    '؋': 0,  # Afghani Sign

    # Hebrew letters (base and final forms)
    'א': 1, 'ב': 2, 'ג': 3, 'ד': 4, 'ה': 5, 'ו': 6, 'ז': 7, 'ח': 8, 'ט': 9, 'י': 10,
    'כ': 20, 'ך': 500, 'ל': 30, 'מ': 40, 'ם': 600, 'נ': 50, 'ן': 700, 'ס': 60, 'ע': 70, 'פ': 80, 'ף': 800,
    'צ': 90, 'ץ': 900, 'ק': 100, 'ר': 200, 'ש': 300, 'ת': 400,

    # Greek letters
    'α': 1, 'β': 2, 'γ': 3, 'δ': 4, 'ε': 5, 'ϝ': 6, 'ζ': 7, 'η': 8, 'θ': 9, 'ι': 10,
    'κ': 20, 'λ': 30, 'μ': 40, 'ν': 50, 'ξ': 60, 'ο': 70, 'π': 80, 'ϟ': 90, 'ρ': 100,
    'σ': 200, 'τ': 300, 'υ': 400, 'φ': 500, 'χ': 600, 'ψ': 700, 'ω': 800, 'ϡ': 900,

    # Greek uppercase letters
    'Α': 1, 'Β': 2, 'Γ': 3, 'Δ': 4, 'Ε': 5, 'Ϝ': 6, 'Ζ': 7, 'Η': 8, 'Θ': 9, 'Ι': 10,
    'Κ': 20, 'Λ': 30, 'Μ': 40, 'Ν': 50, 'Ξ': 60, 'Ο': 70, 'Π': 80, 'Ϟ': 90, 'Ρ': 100,
    'Σ': 200, 'Τ': 300, 'Υ': 400, 'Φ': 500, 'Χ': 600, 'Ψ': 700, 'Ω': 800, 'Ϡ': 900,
    'σ': 200,  # Sigma
    'ς': 200,  # Final Sigma
    'ϲ': 200,  # Lunate Sigma (Greek)
    'Ϲ': 200,  # Uppercase Lunate Sigma (Greek)

    # Katapayadi System
    'क': 1, 'ख': 2, 'ग': 3, 'घ': 4, 'ङ': 5,
    'च': 6, 'छ': 7, 'ज': 8, 'झ': 9, 'ञ': 0,
    'ट': 1, 'ठ': 2, 'ड': 3, 'ढ': 4, 'ण': 5,
    'त': 6, 'थ': 7, 'द': 8, 'ध': 9, 'न': 0,
    'प': 1, 'फ': 2, 'ब': 3, 'भ': 4, 'म': 5,
    'य': 1, 'र': 2, 'ल': 3, 'व': 4, 'श': 5, 'ष': 6, 'स': 7, 'ह': 8,

    # Half forms (same values)
    'क्': 1, 'ख्': 2, 'ग्': 3, 'घ्': 4, 'ङ्': 5,
    'च्': 6, 'छ्': 7, 'ज्': 8, 'झ्': 9, 'ञ्': 0,
    'ट्': 1, 'ठ्': 2, 'ड्': 3, 'ढ्': 4, 'ण्': 5,
    'त्': 6, 'थ्': 7, 'द्': 8, 'ध्': 9, 'न्': 0,
    'प्': 1, 'फ्': 2, 'ब्': 3, 'भ्': 4, 'म्': 5,
    'य्': 1, 'र्': 2, 'ल्': 3, 'व्': 4, 'श्': 5, 'ष्': 6, 'स्': 7, 'ह्': 8,
    }

HEBREW_SOFIT_MAP = {
    'ך': 'כ',
    'ם': 'מ',
    'ן': 'נ',
    'ף': 'פ',
    'ץ': 'צ'
}


def strip_diacritics(text):
    # Diese Funktion bleibt unverändert
    stripped_text = ''
    for char in unicodedata.normalize('NFD', text):
        if unicodedata.category(char) not in ['Mn', 'Cf']:
            stripped_text += char
    return stripped_text

def linearize_umlauts(text):
    """
    Ersetzt Umlaute durch ihre linearisierte Form (ae, oe, ue) für die Gematria-Berechnung.
    Behandelt Groß- und Kleinschreibung.
    """
    replacements = {
        'ä': 'ae', 'ö': 'oe', 'ü': 'ue',
        'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue',
        'ß': 'ss'
    }
    for umlaut, replacement in replacements.items():
        text = text.replace(umlaut, replacement)
    return text

def letter_to_value(letter):
    """
    Converts a single letter to its Gematria value, ignores spaces
    and non-letter characters.
    """
    # Die Funktion greift jetzt auf die globale Konstante zu
    return GEMATRIA_VALUES.get(letter, 0)

# --- NEUE FUNKTION ZUR NORMALISIERUNG ---
def normalize_hebrew_for_simple_gematria(text):
    """Ersetzt hebräische Endbuchstaben (Sofit) durch ihre Standardform."""
    for sofit, normal in HEBREW_SOFIT_MAP.items():
        text = text.replace(sofit, normal)
    return text

# --- ANGEPASSTE HAUPTFUNKTION ---
def calculate_gematria(text):
    """
    Berechnet den Gematria-Wert eines Textes.
    Verwendet den globalen Switch USE_SIMPLE_GEMATRIA, um die Methode zu bestimmen.
    """
    if not text:
        return 0

    text_to_process = text

    # Wende die Normalisierung an, wenn der Switch aktiv ist
    if USE_SIMPLE_GEMATRIA:
        logging.debug("Verwende SIMPLE Gematria: Normalisiere Endbuchstaben.")
        text_to_process = normalize_hebrew_for_simple_gematria(text_to_process)

    total = 0
    for char in text_to_process:
        value = letter_to_value(char)
        total += value
    return total

# Erstelle eine sortierte Liste nur für lateinische Buchstaben für den Fallback
LATIN_GEMATRIA_VALUES = {k: v for k, v in GEMATRIA_VALUES.items() if 'a' <= k <= 'z'}
SORTED_LATIN_GEMATRIA = sorted(LATIN_GEMATRIA_VALUES.items(), key=lambda item: item[1], reverse=True)

def decompose_to_latin(number):
    """
    NEU: Zerlegt eine Zahl algorithmisch in lateinische Buchstaben.
    Dies dient als Fallback für generische Texte.
    """
    if number <= 0: return ""
    text, remainder = "", number
    for char, value in SORTED_LATIN_GEMATRIA:
        while remainder >= value:
            text += char
            remainder -= value