File size: 5,734 Bytes
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
import gradio as gr
import json
import re
import sqlite3
import logging
from util import process_json_files
from gematria import calculate_gematria

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 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)

    result = "Passende Phrasen:\n"
    for match in matching_phrases:
        result += f"Buch: {match[1]} ({match[2]})\nKapitel: {match[3]}, Vers: {match[4]}\nPhrase: {match[0]}\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()