torahCodes/Torah_Codes
4
1from deep_translator import GoogleTranslator2import torahcodes.resources.func.utils as util3from hebrew_numbers import gematria_to_int4from textblob import TextBlob5from os import listdir6from os.path import isfile, join7import re8import time9import random10import os11import json12 13BLUE, RED, WHITE, YELLOW, MAGENTA, GREEN, END = '\33[1;94m', '\033[1;91m', '\33[1;97m', '\33[1;93m', '\033[1;35m', '\033[1;32m', '\033[0m'14ORANGE = '\033[1;33m' # orange15 16 17data_dir = "resources/texts"18 19class BibleBooks():20 def __init__(self):21 self.folder = data_dir22 self.book = {}23 def load(self):24 25 for f in listdir(self.folder):26 print(f)27 if isfile(join(self.folder, f)) and f.endswith(".json"):28 fn = f.split('.')29 #print('Load', fn[0])30 with open(self.folder+f, encoding="utf-8-sig") as File:31 self.book[fn[0]] = File.read()32 33 def rawdata(self, bookname):34 return self.book[bookname]35 36 def booklist(self):37 return list(self.book.keys())38 39books = BibleBooks()40 41class Torah():42 def __init__(self):43 self.book = ''44 self.gcode = {45 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 600,46 'k': 10, 'l': 20, 'm': 30, 'n': 40, 'o': 50, 'p': 60, 'q': 70, 'r': 80, 's': 90,47 't': 100, 'u': 200, 'v': 700, 'w': 900, 'x': 300, 'y': 400, 'z': 50048 }49 50 def loadbooks(self):51 books.load()52 53 def func_getnumber(self, listL, listW):54 return util.fn_GetNumberValues(listL, listW)55 56 def func_checklang(self, word, lang):57 b = TextBlob(word)58 59 try:60 b.detect_language()61 if (b.detect_language() == lang):62 return True63 except:64 return True65 return False66 67 def numtobook(self, number):68 for x in books.booklist():69 xt = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", x)70 if xt[0] == str(number):71 return x72 73 def func_translate(self, lang_in, lang_out, data):74 translated = GoogleTranslator(source=lang_in, target=lang_out).translate(data.strip()) 75 return translated76 77 def gematria(self, word: str) -> int:78 try:79 if word.isdigit():80 return int(word)81 82 # Aufteilen des Wortes in Buchstaben und Zahlen83 letters = [char for char in word if char.isalpha()]84 numbers = [int(char) for char in word if char.isdigit()]85 86 # Berechnen des Gematria-Werts für die Buchstaben87 letters_value = sum([self.gcode[char] for char in letters if char in self.gcode])88 89 90 # Hinzufügen der Summe der Zahlen zum Gematria-Wert der Buchstaben91 total_value = letters_value + sum(numbers)92 93 return total_value94 except:95 print(word)96 raise ValueError97 98 99 def gematrix(self, phrase: str) -> int:100 phrase = self.strip_accents(phrase.lower())101 phrase = ''.join([i for i in phrase if i.isalpha() or i.isdigit() or i.isspace()])102 103 # Aufteilen der Eingabe in separate Wörter und Zahlen104 elements = phrase.split()105 total_value = 0106 107 for element in elements:108 if element.isalpha():109 # Berechne den Wert für Buchstaben110 total_value += sum([self.gcode[char] for char in element if char in self.gcode])111 elif element.isdigit():112 # Addiere Zahlen direkt zum Gesamtwert113 total_value += int(element)114 115 return total_value116 117 118 119 120 121 122 def strip_accents(self, s):123 try:124 return ''.join(125 c for c in unicodedata.normalize('NFD', s)126 if unicodedata.category(c) != 'Mn'127 )128 except:129 return s130 131 132 def gematria_iw_int(text):133 return gematria_to_int(text)134 135 136 def func_ParseTranslation(self, translated, lang, active):137 abd = 'abcdefghijklmnñopqrstuvwxyz1234567890'138 str_split = translated.split(' ')139 str_final = ''140 for word in str_split:141 try:142 if word[0].lower() in abd:143 if active == 'true':144 if self.func_checklang(word, lang) == True:145 str_final = str_final+ word+' '146 else:147 str_final = str_final+ word+' '148 except:149 pass150 151 if not str_final == '':152 return str_final153 else:154 return 0155 def els(self, namebook, number, tracert='false', visualice=False):156 space = number157 abd = 'abcdefghijklmnñopqrstuvwxyz'158 i=1159 rese=""160 totalvalue = 0161 D = self.GetDataBook(namebook)162 for (z,b,y) in D:163 try:164 charnum = 0165 res=""166 167 for char in D[z,b,y]:168 charnum = charnum+1169 if (i % int(space)) == 0:170 if tracert == 'true':171 totalvalue = totalvalue + int(charnum)172 print('Source:',int(z),'chapter:', int(b),'Verse:', int(y),'CharNum:',int(charnum),'Char:', char)173 174 res=res+char175 176 i=i+1177 rese=rese+" "+res178 except:179 pass180 #print('Total', totalvalue)181 ret = re.sub('\s+', ' ', rese.strip())182 return ret, totalvalue183 184 def GetDataBook(self, bibleNumberBook):185 186 187 JSON = books.rawdata(bibleNumberBook) 188 ListOfJSONStringsParsed, ListOfJSONStringsParsedWithSpaces = util.fn_TextFilePreprocess(JSON)189 ListOfDictsOfJSONStringsParsed, ListOfDictsOfJSONStringsParsedWithSpaces = util.fn_ConvertJSONStringsToDicts(ListOfJSONStringsParsed, ListOfJSONStringsParsedWithSpaces)190 SearchTextChosen = util.fn_GetNumberOfTextChosen(ListOfDictsOfJSONStringsParsed)191 ZippedTupleNoSpaces, ZippedTupleWithSpaces = util.fn_ZippedTupleCreate(ListOfDictsOfJSONStringsParsed, ListOfDictsOfJSONStringsParsedWithSpaces, SearchTextChosen)192 D, DS = util.fn_DictionaryOfVersesCreate(ZippedTupleNoSpaces, ZippedTupleWithSpaces)193 S, L, DL, D5, ListOfWords = util.fn_DataObjectsCreate(D, DS)194 N, NW = util.fn_GetNumberValues(S, ListOfWords) 195 ListOfIndexesCustom = util.fn_ListOfIndexesCustomCreate(D5)196 W = util.fn_TupleOfWordsAndGematriaValuesCreate(ListOfWords, NW)197 198 return D199 200 201def process_json_files(start, end, step, length=0, tlang="en", spaces_include=False, strip_in_braces=True, strip_diacritics=True):202 base_path = "resources/texts"203 translator = GoogleTranslator(source='auto', target=tlang)204 results = []205 206 for i in range(start, end + 1):207 file_name = f"{base_path}/{i:02}.json"208 try:209 with open(file_name, 'r', encoding='utf-8') as file:210 data = json.load(file)211 text_blocks = data["text"]212 213 full_text = ""214 for block in text_blocks:215 full_text += ' '.join(block)216 217 clean_text = full_text218 if strip_in_braces:219 clean_text = re.sub(r"\[.*?\]", "", clean_text, flags=re.DOTALL)220 if strip_diacritics:221 clean_text = re.sub(r"[^\u05D0-\u05EA ]+", "", clean_text)222 if not spaces_include:223 clean_text = clean_text.replace(" ", "")224 225 if length != 0:226 selected_characters = clean_text[step - 1::step][:length]227 else:228 selected_characters = clean_text[step - 1::step] # If length is 0, select all characters from step229 230 translated_text = translator.translate(''.join(selected_characters))231 if selected_characters != "":232 results.append({233 "book": i,234 "title": data["title"],235 "original_text": selected_characters,236 "translated_text": translated_text237 })238 239 except FileNotFoundError:240 results.append({"error": f"File {file_name} not found."})241 except json.JSONDecodeError:242 results.append({"error": f"File {file_name} could not be read as JSON."})243 except KeyError:244 results.append({"error": f"Expected key 'text' is missing in {file_name}."})245 246 return results247 