Я набросал альтернативку, она совсем мелкая. Гляньте, может что пригодится.
python >= 3.8
import json, re
from itertools import chain
from functools import partial
def factory(path):
def translate_word(m):
word = w = (Word := m.group(0)).lower()
if ending := len(word) > 2 and ending_mapping(word[-2:]):
w = w[:-2]
it, buf = chain(w, ('',)), []
a, b = '', next(it)
for c in it:
buf.append(prev_mapping(a + b) or next_mapping(b + c) or mapping(b, b))
a, b = b, c
if ending:
buf.append(ending)
w = ''.join(buf)
if word == Word:
return w
return w.capitalize() if len(Word) == 1 or Word[-1].islower() else w.upper()
with open(path, encoding='utf-8') as fi:
data = json.load(fi)
mapping = data['mapping'].get
prev_mapping = (data['prev_mapping'] or {}).get
next_mapping = (data['next_mapping'] or {}).get
ending_mapping = (data['ending_mapping'] or {}).get
return partial(re.compile(r'\w+').sub, translate_word)
f = factory('mosmetro.json')
print(f('Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы, да выпей алтайского чаю'))