File size: 6,186 Bytes
9be760a
 
 
 
 
 
 
cd52d3a
9be760a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd52d3a
 
 
 
 
 
 
9be760a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd52d3a
 
 
9be760a
cd52d3a
 
9be760a
 
 
 
 
 
 
 
 
 
 
 
 
 
5bb3a98
9be760a
 
 
 
 
 
 
 
5bb3a98
9be760a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import json
import re
import sqlite3
import logging
from util import process_json_files
from gematria import calculate_gematria
from deep_translator import GoogleTranslator

logging.basicConfig(level=logging.INFO, format='%(message)s')

def flatten_text(text):
    """Hilfsfunktion, um verschachtelte Listen zu flachen Listen zu machen."""
    if isinstance(text, list):
        return " ".join(flatten_text(item) if isinstance(item, list) else item for item in text)
    return text

def initialize_database():
    conn = sqlite3.connect('gematria.db')
    c = conn.cursor()
    c.execute('''
        CREATE TABLE IF NOT EXISTS results (
            gematria_sum INTEGER,
            words TEXT,
            book INTEGER,
            title TEXT,
            chapter INTEGER,
            verse INTEGER
        )
    ''')
    conn.commit()
    conn.close()

def insert_phrase_to_db(c, gematria_sum, phrase_candidate, book_id, title, chapter_id, verse_id):
    logging.info(f"Inserting: {gematria_sum}, {phrase_candidate}, {book_id}, {title}, {chapter_id + 1}, {verse_id + 1}")
    c.execute('''
        INSERT INTO results (gematria_sum, words, book, title, chapter, verse)
        VALUES (?, ?, ?, ?, ?, ?)
    ''', (gematria_sum, phrase_candidate, book_id, title, chapter_id + 1, verse_id + 1))

def populate_database(tanach_texts, max_phrase_length=1):
    conn = sqlite3.connect('gematria.db')
    c = conn.cursor()
    for book_id, text in enumerate(tanach_texts):
        if not isinstance(text.get('text'), list):
            continue
        title = text.get('title', 'Unknown')
        chapters = text['text']
        for chapter_id, chapter in enumerate(chapters):
            if not isinstance(chapter, list):
                continue
            chapter_text = ' '.join([flatten_text(verse) for verse in chapter])
            chapter_text = re.sub(r"[^\u05D0-\u05EA ]+", "", chapter_text)
            chapter_text = re.sub(r" +", " ", chapter_text)
            words = chapter_text.split()
            max_length = min(max_phrase_length, len(words))
            for length in range(1, max_length + 1):
                for start in range(len(words) - length + 1):
                    phrase_candidate = " ".join(words[start:start + length])
                    gematria_sum = calculate_gematria(phrase_candidate.replace(" ", ""))
                    insert_phrase_to_db(c, gematria_sum, phrase_candidate, book_id, title, chapter_id, start + 1)
    conn.commit()
    conn.close()

def search_gematria_in_db(gematria_sum):
    conn = sqlite3.connect('gematria.db')
    c = conn.cursor()
    c.execute('''
        SELECT words, book, title, chapter, verse FROM results WHERE gematria_sum = ?
    ''', (gematria_sum,))
    results = c.fetchall()
    conn.close()
    return results

def translate_phrases(phrases):
    translator = GoogleTranslator(source='auto', target='en')
    translated_phrases = []
    for phrase in phrases:
        translated_phrases.append(translator.translate(phrase))
    return translated_phrases

def db(tanach_texts, max_phrase_length=1):
    initialize_database()
    populate_database(tanach_texts, max_phrase_length)
    logging.info("Datenbank erfolgreich erstellt und gefüllt.")

def gematria_search_interface(phrase):
    debug_output = []

    def debug_callback(message):
        debug_output.append(message)
        logging.info(message)

    if not phrase.strip():
        return "Bitte geben Sie eine Phrase ein.", "\n".join(debug_output)

    phrase_gematria = calculate_gematria(phrase.replace(" ", ""))
    debug_callback(f"Debug: Gematria der Suchphrase '{phrase}' ist {phrase_gematria}")

    matching_phrases = search_gematria_in_db(phrase_gematria)

    if not matching_phrases:
        return "Keine passenden Phrasen gefunden.", "\n".join(debug_output)

    phrases = [match[0] for match in matching_phrases]
    translations = translate_phrases(phrases)

    result = "Passende Phrasen:\n"
    for match, translation in zip(matching_phrases, translations):
        result += f"Buch: {match[2]} ({match[3]})\nKapitel: {match[4]}, Vers: {match[5]}\nPhrase: {match[0]}\nÜbersetzung: {translation}\n\n"
    
    return result, "\n".join(debug_output)

def run_test():
    debug_output = []
    test_phrase = "אבגדהוזחטיכלמנסעפצקרשת"
    expected_gematria = 1495

    def debug_callback(message):
        debug_output.append(message)
        logging.info(message)

    # Lade die Test-JSON-Inhalte für 00.json
    test_texts_00 = process_json_files(0, 0)
    db(test_texts_00, max_phrase_length=22)  # Populate the database with 1-word phrases
    matching_phrases_00 = search_gematria_in_db(expected_gematria)
    assert matching_phrases_00, "Keine passenden Phrasen gefunden in 00.json."
    assert matching_phrases_00[0][0].replace(" ", "") == test_phrase, f"Gefundene Phrase stimmt nicht überein: {matching_phrases_00[0][0]}"
    print("Test erfolgreich: Die Phrase wurde korrekt gefunden und die Gematria stimmt überein in 00.json.")

    # Lade die Test-JSON-Inhalte für 01.json
    test_texts_01 = process_json_files(1, 1)
    db(test_texts_01, max_phrase_length=2)  # Populate the database with 1-word phrases
    search_phrase_01 = "אתקלך שמעתי"
    expected_gematria_01 = calculate_gematria(search_phrase_01.replace(" ", ""))

    matching_phrases_01 = search_gematria_in_db(expected_gematria_01)
    assert matching_phrases_01, "Keine passenden Phrasen gefunden in 01.json."
    assert matching_phrases_01[0][0].replace(" ", "") == search_phrase_01.replace(" ", ""), f"Gefundene Phrase stimmt nicht überein: {matching_phrases_01[0][0]}"
    print("Test erfolgreich: Die Phrase wurde korrekt gefunden und die Gematria stimmt überein in 01.json.")
    print("\n".join(debug_output))

iface = gr.Interface(
    fn=gematria_search_interface,
    inputs="text",
    outputs=["text", "text"],
    title="Gematria-Suche im Tanach",
    description="Suche nach Phrasen im Tanach, die denselben Gematria-Wert haben wie die eingegebene Phrase.",
    live=True  # Aktiviert das Live-Update
)

if __name__ == "__main__":
    run_test()  # Test ausführen
    iface.launch()