|
import logging |
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
import json |
|
import os |
|
import re |
|
from deep_translator import GoogleTranslator |
|
from gematria import calculate_gematria |
|
import math |
|
|
|
|
|
|
|
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_gematria_values = {v: k for k, v in gematria_values.items()} |
|
|
|
|
|
def string_to_gematria(s): |
|
return [gematria_values.get(char, 0) for char in s] |
|
|
|
|
|
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) |
|
|
|
|
|
def average_gematria(str1, str2): |
|
|
|
gematria1 = string_to_gematria(str1) |
|
gematria2 = string_to_gematria(str2) |
|
|
|
|
|
max_len = max(len(gematria1), len(gematria2)) |
|
gematria1.extend([0] * (max_len - len(gematria1))) |
|
gematria2.extend([0] * (max_len - len(gematria2))) |
|
|
|
|
|
average_gematria_values = [math.ceil((g1 + g2) / 2) for g1, g2 in zip(gematria1, gematria2)] |
|
|
|
|
|
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 = [] |
|
|
|
|
|
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}.", |
|
'title': nt_books.get(book, "Unknown Book"), |
|
'result_text': result_text, |
|
'result_sum': result_sum, |
|
'translated_text': translated_text |
|
} |
|
results.append(result) |
|
|
|
|
|
except FileNotFoundError: |
|
results.append({"error": f"File {file_name} not found."}) |
|
|
|
return results |
|
|
|
test_results = [ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
] |
|
|
|
all_tests_passed = True |
|
for result, expected in test_results: |
|
if expected is None: |
|
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: |
|
|
|
if result: |
|
|
|
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.") |
|
|