neuralworm's picture
initial commit
31904e8
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
# --- Helper Functions ---
def calculate_gematria_sum(text):
"""Calculates the gematria sum of a given text."""
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):
"""Converts a date in YYYY-MM-DD format to English words."""
inf_engine = inflect.engine()
date_obj = datetime.strptime(date_string, "%Y-%m-%d")
year = date_obj.year
if 1100 <= 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):
"""Performs gematria calculation for a date range and groups by sum."""
logger.debug(f"Start Date: {start_date}, End Date: {end_date}")
results = {}
delta = timedelta(days=1)
current_date = start_date
while current_date <= end_date:
# Convert date to string
date_string = current_date.strftime("%Y-%m-%d")
date_words = date_to_words(date_string)
logger.debug(f"Date: {current_date}, Day Name: {date_words}")
gematria_sum = calculate_gematria_sum(date_words)
logger.debug(f"Gematria Sum: {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):
"""Generates the JSON output with the date range and results."""
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)
def download_json(json_data, start_date, end_date):
"""Downloads the JSON data to a file."""
filename = f"gematria_results_{start_date.strftime('%Y%m%d')}_{end_date.strftime('%Y%m%d')}.json"
return (filename, json_data) # Rückgabe von Dateiname und JSON-Daten
# --- Main Gradio App ---
with gr.Blocks() as app:
with gr.Row():
start_date = Calendar(type="datetime", label="Start Date")
end_date = Calendar(type="datetime", label="End Date")
calculate_btn = gr.Button("Calculate Gematria for Date Range")
json_output = gr.Textbox(label="JSON Output")
download_btn = gr.Button("Download JSON")
json_file = gr.File(label="Downloaded JSON") # Entferne visible=False
# --- Event Handlers ---
def perform_calculation(start_date, end_date):
"""Performs the calculation and generates the JSON output."""
logger.debug(f"perform_calculation called with: 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 Triggers ---
calculate_btn.click(
perform_calculation,
inputs=[start_date, end_date],
outputs=[json_output],
api_name="calculate_gematria"
)
download_btn.click(
download_json,
inputs=[json_output, start_date, end_date],
outputs=[json_file],
)
if __name__ == "__main__":
app.launch(share=False)