File size: 4,386 Bytes
3045238
 
99b3ef5
3045238
 
a676448
3045238
e4ee4df
3045238
75d4ca3
3045238
8992d21
420ea26
75d4ca3
420ea26
 
 
3045238
 
 
75d4ca3
 
 
 
 
 
 
 
 
 
 
 
 
7a778e3
75d4ca3
 
 
7a778e3
 
75d4ca3
 
 
 
 
 
 
 
 
 
 
 
8992d21
75d4ca3
 
8992d21
75d4ca3
 
8992d21
420ea26
 
 
e4ee4df
420ea26
7a778e3
 
 
8992d21
420ea26
8992d21
e4ee4df
420ea26
 
e4ee4df
420ea26
 
 
 
3045238
420ea26
3045238
 
 
420ea26
75d4ca3
e4ee4df
 
 
 
 
420ea26
e4ee4df
 
 
8992d21
3045238
e4ee4df
8992d21
 
e4ee4df
8992d21
 
3045238
8992d21
7a778e3
75d4ca3
7a778e3
1b969ef
 
420ea26
3045238
8992d21
420ea26
 
 
1b969ef
 
3045238
 
 
a676448
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
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

import gradio as gr
from gradio_calendar import Calendar
from gematria import calculate_gematria, strip_diacritics
from datetime import datetime, timedelta
import json
import inflect

# --- Hilfsfunktionen ---
def calculate_gematria_sum(text):
    """Berechnet die Gematria-Summe eines gegebenen Textes."""
    if text:
        text_gematria = calculate_gematria(strip_diacritics(text))
        return text_gematria
    else:
        return None

# Custom function to convert number to ordinal words
def number_to_ordinal_word(number):
    ordinal_dict = {
        1: "first", 2: "second", 3: "third", 4: "fourth", 5: "fifth",
        6: "sixth", 7: "seventh", 8: "eighth", 9: "ninth", 10: "tenth",
        11: "eleventh", 12: "twelfth", 13: "thirteenth", 14: "fourteenth",
        15: "fifteenth", 16: "sixteenth", 17: "seventeenth", 18: "eighteenth",
        19: "nineteenth", 20: "twentieth", 21: "twentyfirst", 22: "twentysecond",
        23: "twentythird", 24: "twentyfourth", 25: "twentyfifth",
        26: "twentysixth", 27: "twentyseventh", 28: "twentyeighth",
        29: "twentyninth", 30: "thirtieth", 31: "thirtyfirst"
    }
    return ordinal_dict.get(number, "")

def date_to_words(date_string):
    """Konvertiert ein Datum im Format YYYY-MM-DD in die englische Schreibweise."""
    inf_engine = inflect.engine()
    date_obj = datetime.strptime(date_string, "%Y-%m-%d")

    year = date_obj.year
    if 1900 <= year <= 1999:
        year_words = f"{inf_engine.number_to_words(year // 100, andword='') } hundred"
        if year % 100 != 0:
            year_words += f" {inf_engine.number_to_words(year % 100, andword='')}"
    else:
        year_words = inf_engine.number_to_words(year, andword='')
    year_formatted = year_words.replace(',', '')

    month = date_obj.strftime("%B")
    day = date_obj.day
    day_ordinal = number_to_ordinal_word(day)

    output_text = f"{day_ordinal} {month} {year_formatted}"
    return output_text

def perform_gematria_calculation_for_date_range(start_date, end_date):
    """Führt die Gematria-Berechnung für einen Datumsbereich durch."""
    logger.info(f"Startdatum: {start_date}, Enddatum: {end_date}")
    results = {}
    delta = timedelta(days=1)
    current_date = start_date

    while current_date <= end_date:
        # Datum in String umwandeln
        date_string = current_date.strftime("%Y-%m-%d")
        date_words = date_to_words(date_string)
        logger.info(f"Datum: {current_date}, Tagesname: {date_words}")
        gematria_sum = calculate_gematria_sum(date_words)
        logger.info(f"Gematria-Summe: {gematria_sum}")

        if gematria_sum not in results:
            results[gematria_sum] = []

        results[gematria_sum].append({
            "date": current_date.strftime('%Y-%m-%d'),
            "date_words": date_words
        })

        current_date += delta

    return results

def generate_json_output(results, start_date, end_date):
    """Generiert die JSON-Ausgabe mit dem Datumsbereich und den Ergebnissen."""
    result = {
        "DateRange": {
            "StartDate": start_date.strftime("%Y-%m-%d"),
            "EndDate": end_date.strftime("%Y-%m-%d")
        },
        "Results": results
    }
    return json.dumps(result, indent=4, ensure_ascii=False)

# --- Hauptanwendung mit Gradio ---
with gr.Blocks() as app:
    with gr.Row():
        start_date = Calendar(type="datetime", label="Startdatum")
        end_date = Calendar(type="datetime", label="Enddatum")

    calculate_btn = gr.Button("Gematria für Zeitraum berechnen")
    json_output = gr.Textbox(label="JSON-Ausgabe")

    # --- Event-Handler ---
    def perform_calculation(start_date, end_date):
        """Führt die Berechnung aus und generiert die JSON-Ausgabe."""
        logger.info(f"perform_calculation aufgerufen mit: start_date={start_date}, end_date={end_date}")
        results = perform_gematria_calculation_for_date_range(start_date, end_date)
        json_result = generate_json_output(results, start_date, end_date)
        return json_result

    # --- Event-Trigger ---
    calculate_btn.click(
        perform_calculation,
        inputs=[start_date, end_date],
        outputs=[json_output],
        api_name="calculate_gematria"
    )

if __name__ == "__main__":
    app.launch(share=False)