|
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) |
|
|
|
|
|
def process_json_files(start=1, end=114, step=1, rounds="1", length=0, tlang="en", strip_spaces=True, |
|
strip_in_braces=True, strip_diacritics=True, average_compile=False, translate=False): |
|
base_path = "texts/quran" |
|
translator = GoogleTranslator(source='ar', target=tlang) |
|
results = [] |
|
|
|
for i in range(start, end + 1): |
|
file_name = f"{base_path}/{i:03}.json" |
|
try: |
|
with open(file_name, 'r', encoding='utf-8') as file: |
|
data = json.load(file) |
|
|
|
|
|
full_text = "" |
|
for verse_key, verse_text in data["verse"].items(): |
|
full_text += verse_text + " " |
|
|
|
full_text = full_text.replace("\ufeff", "") |
|
|
|
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"[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]+", "", |
|
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 and translate else "" |
|
|
|
if result_text: |
|
results.append({ |
|
"book": f"Quran {i}.", |
|
"title": data["name"], |
|
"result_text": result_text, |
|
"result_sum": calculate_gematria(result_text), |
|
"translated_text": translated_text |
|
}) |
|
|
|
except FileNotFoundError: |
|
results.append({"error": f"File {file_name} not found."}) |
|
except json.JSONDecodeError as e: |
|
results.append({"error": f"File {file_name} could not be read as JSON: {e}"}) |
|
except KeyError as e: |
|
results.append({"error": f"Expected key 'verse' is missing in {file_name}: {e}"}) |
|
|
|
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.") |
|
|