neuralworm's picture
initial commit
1032a12
import logging
logger = logging.getLogger(__name__)
import json
import os
import re
from deep_translator import GoogleTranslator
from gematria import calculate_gematria
import math
# Hebrew gematria values for relevant characters
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
}
# Reverse dictionary for converting gematria values back to Hebrew characters
reverse_gematria_values = {v: k for k, v in gematria_values.items()}
# Function to convert a Hebrew string to its gematria values
def string_to_gematria(s):
return [gematria_values.get(char, 0) for char in s] # Handle characters not in the dictionary
# Function to convert a single gematria value to Hebrew characters
def gematria_to_string(value):
result = []
for val in sorted(reverse_gematria_values.keys(), reverse=True):
while value >= val:
result.append(reverse_gematria_values[val])
value -= val
return ''.join(result)
# Function to calculate the average gematria values of corresponding characters and convert them to Hebrew characters
def average_gematria(str1, str2):
# Convert strings to gematria values
gematria1 = string_to_gematria(str1)
gematria2 = string_to_gematria(str2)
# Handle cases where strings have different lengths by padding with 0s
max_len = max(len(gematria1), len(gematria2))
gematria1.extend([0] * (max_len - len(gematria1)))
gematria2.extend([0] * (max_len - len(gematria2)))
# Calculate the average of corresponding gematria values and apply math.ceil
average_gematria_values = [math.ceil((g1 + g2) / 2) for g1, g2 in zip(gematria1, gematria2)]
# Convert the average gematria values back to Hebrew characters
return ''.join(gematria_to_string(val) for val in average_gematria_values)
from deep_translator import GoogleTranslator
import os
import re
import csv
def process_json_files(start=1, end=66, step=1, rounds="1", length=0, tlang="en", strip_spaces=True,
strip_in_braces=True, strip_diacritics=True, average_compile=False):
file_name = "texts/bible/OpenGNT_version3_3.csv"
translator = GoogleTranslator(source='auto', target=tlang)
results = []
# Dictionary für die 27 Bücher des Neuen Testaments (Englische Namen)
nt_books = {
40: "Matthew",
41: "Mark",
42: "Luke",
43: "John",
44: "Acts",
45: "Romans",
46: "1. Corinthians",
47: "2. Corinthians",
48: "Galatians",
49: "Ephesians",
50: "Philippians",
51: "Colossians",
52: "1. Thessalonians",
53: "2. Thessalonians",
54: "1. Timothy",
55: "2. Timothy",
56: "Titus",
57: "Philemon",
58: "Hebrews",
59: "James",
60: "1. Peter",
61: "2. Peter",
62: "1. John",
63: "2. John",
64: "3. John",
65: "Jude",
66: "Revelation"
}
try:
with open(file_name, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file, delimiter='\t')
book_texts = {}
current_book = None
for row in reader:
book = int(row['〔Book|Chapter|Verse〕'].split('|')[0][1:])
if book < start or book > end:
continue
if current_book != book:
current_book = book
book_texts[book] = ""
greek_text = row['〔OGNTk|OGNTu|OGNTa|lexeme|rmac|sn〕']
greek_text = greek_text.split('〔')[1]
greek_text = greek_text.split('|')[0]
book_texts[book] += greek_text + " "
for book, full_text in book_texts.items():
logger.debug(f"Processing book {book}")
clean_text = full_text
if strip_in_braces:
clean_text = re.sub(r"\[.*?\]", "", clean_text, flags=re.DOTALL)
if strip_diacritics:
clean_text = re.sub(r"[^\u0370-\u03FF\u1F00-\u1FFF ]+", "", clean_text)
if strip_spaces:
clean_text = clean_text.replace(" ", "")
else:
clean_text = clean_text.replace(" ", " ")
clean_text = clean_text.replace(" ", " ")
clean_text = clean_text.replace(" ", " ")
text_length = len(clean_text)
selected_characters_per_round = {}
for round_num in map(int, rounds.split(',')):
if not (round_num == 1 and step > text_length) and not (round_num == -1 and step > text_length):
if round_num > 0:
current_position = step - 1
else:
current_position = text_length - 1 if step == 1 else text_length - step
completed_rounds = 0
selected_characters = ""
while completed_rounds < abs(round_num):
selected_characters += clean_text[current_position % text_length]
current_position += step if round_num > 0 else -step
if (round_num > 0 and current_position >= text_length * (completed_rounds + 1)) or \
(round_num < 0 and current_position < 0):
completed_rounds += 1
selected_characters_per_round[round_num] = selected_characters
if average_compile and len(selected_characters_per_round) > 1:
result_text = ""
keys = sorted(selected_characters_per_round.keys())
for i in range(len(keys) - 1):
result_text = average_gematria(selected_characters_per_round[keys[i]], selected_characters_per_round[keys[i+1]])
else:
result_text = ''.join(selected_characters_per_round.values())
if length != 0:
result_text = result_text[:length]
translated_text = translator.translate(result_text) if result_text else ""
result_sum = calculate_gematria(result_text)
if result_text:
logger.debug(f"Result for book {book}: {result_text}")
result = {
'book': f"Bible {book}.", # Use the correct 'book' variable
'title': nt_books.get(book, "Unknown Book"), # Get book name from dictionary
'result_text': result_text,
'result_sum': result_sum, # Make sure result_sum is calculated correctly
'translated_text': translated_text
}
results.append(result)
except FileNotFoundError:
results.append({"error": f"File {file_name} not found."})
return results
# Tests
test_results = [
#(process_json_files(1, 1, 21, rounds="3", length=0), ""),
#(process_json_files(1, 1, 22, rounds="1", length=0), ""),
#(process_json_files(1, 1, 22, rounds="3", length=0), ""),
#(process_json_files(1, 1, 23, rounds="3", length=0), ""),
#(process_json_files(1, 1, 11, rounds="1", length=0), ""),
#(process_json_files(1, 1, 2, rounds="1", length=0), ""),
#(process_json_files(1, 1, 23, rounds="1", length=0), None), # Expect None, when no results
#(process_json_files(1, 1, 23, rounds="-1", length=0), None), # Expect None, when no results
#(process_json_files(1, 1, 22, rounds="-1", length=0), ""),
#(process_json_files(1, 1, 22, rounds="-2", length=0), ""),
#(process_json_files(1, 1, 1, rounds="-1", length=0), ""), # Reversed Hebrew alphabet
#(process_json_files(1, 1, 1, rounds="1,-1", length=0), ""), # Combined rounds
#(process_json_files(1, 1, 22, rounds="1,-1", length=0, average_compile=True), ""), # average compile test (400+1) / 2 = math.ceil(200.5)=201=200+1="רא"
]
all_tests_passed = True
for result, expected in test_results:
if expected is None: # Check if no result is expected
if not result:
logger.info(f"Test passed: Expected no results, got no results.")
else:
logger.error(f"Test failed: Expected no results, but got: {result}")
all_tests_passed = False
else:
# Check if result is not empty before accessing elements
if result:
#result_text = result[0]['result_text']
result_text = None
if result_text == expected:
logger.info(f"Test passed: Expected '{expected}', got '{result_text}'")
else:
logger.error(f"Test failed: Expected '{expected}', but got '{result_text}'")
all_tests_passed = False
else:
logger.error(f"Test failed: Expected '{expected}', but got no results")
all_tests_passed = False
if all_tests_passed:
logger.info("All round tests passed.")