""" Post-processing module that adds Romanian diacritics to text. Maps common words without diacritics to their correct forms. """ import re # Common Romanian words: without diacritics -> with diacritics # Only includes words where the diacriticed form is unambiguous WORD_MAP = { # A "adevarata": "adevărată", "adevarate": "adevărate", "adevarat": "adevărat", "adevaratii": "adevărații", "adancime": "adâncime", "ajuta": "ajuta", "analfabet": "analfabet", "aceasta": "aceasta", "afara": "afară", "altadata": "altădată", "amandoi": "amândoi", "amanare": "amânare", "amintiri": "amintiri", "anumita": "anumită", "anumite": "anumite", "apa": "apă", "apoi": "apoi", "asa": "așa", "asadar": "așadar", "asemanare": "asemănare", "asemenea": "asemenea", "asupra": "asupra", "astazi": "astăzi", "asteapta": "așteaptă", "asteptare": "așteptare", "ati": "ați", "atata": "atâta", "atatia": "atâția", "atunci": "atunci", # B "baiatul": "băiatul", "baiat": "băiat", "baieti": "băieți", "baietii": "băieții", "batran": "bătrân", "batrana": "bătrână", "batranete": "bătrânețe", "batrani": "bătrâni", "buna": "bună", # C "cand": "când", "candva": "cândva", "cat": "cât", "cata": "câtă", "cate": "câte", "cati": "câți", "cativa": "câțiva", "cateva": "câteva", "catre": "către", "caldura": "căldură", "calduros": "călduros", "calatorie": "călătorie", "calatori": "călători", "cautare": "căutare", "cautam": "căutăm", "casa": "casă", "casuta": "căsuță", "compasiune": "compasiune", "constientiza": "conștientiza", "constiinta": "conștiință", "constient": "conștient", "copacii": "copacii", "curateniei": "curățeniei", "curatenie": "curățenie", # D "deasupra": "deasupra", "deseuri": "deșeuri", "deseurile": "deșeurile", "dimineata": "dimineață", "disparitia": "dispariția", "disparitie": "dispariție", "dupa": "după", # E "emotie": "emoție", "emotii": "emoții", # F "facand": "făcând", "facuta": "făcută", "fara": "fără", "fiinta": "ființă", "fiinte": "ființe", "folosesti": "folosești", "folosim": "folosim", "functie": "funcție", "functioneaza": "funcționează", # G "gasesti": "găsești", "gasim": "găsim", "gasit": "găsit", "gandeste": "gândește", "gandire": "gândire", "ganduri": "gânduri", "gradina": "grădină", "gradinile": "grădinile", # I "iarasi": "iarăși", "iata": "iată", "inainte": "înainte", "inaintea": "înaintea", "incalzire": "încălzire", "incalzirea": "încălzirea", "incepe": "începe", "incepem": "începem", "inceput": "început", "incerca": "încerca", "inchide": "închide", "inchis": "închis", "inconjuratoare": "înconjurătoare", "indata": "îndată", "indeajuns": "îndeajuns", "indrazneala": "îndrăzneală", "informatii": "informații", "informatie": "informație", "inima": "inimă", "inseamna": "înseamnă", "insemnatate": "însemnătate", "intelege": "înțelege", "intelegem": "înțelegem", "inteles": "înțeles", "intotdeauna": "întotdeauna", "intoarcere": "întoarcere", "intr-un": "într-un", "intr-o": "într-o", "intrebare": "întrebare", "intrebari": "întrebări", "invatam": "învățăm", "invata": "învață", "invatare": "învățare", # J "jumatate": "jumătate", # L "lantul": "lanțul", "legatura": "legătură", "lumina": "lumină", # M "mancare": "mâncare", "mancarea": "mâncarea", "masina": "mașină", "masini": "mașini", "masinile": "mașinile", "mediul": "mediul", "mostenire": "moștenire", "mostenirea": "moștenirea", "muntii": "munții", "munti": "munți", # N "natiune": "națiune", "natura": "natură", "naturii": "naturii", # O "oamenii": "oamenii", "oras": "oraș", "orasele": "orașele", "orase": "orașe", # P "padure": "pădure", "paduri": "păduri", "padurile": "pădurile", "padurea": "pădurea", "pamant": "pământ", "pamantul": "pământul", "pana": "până", "pasari": "păsări", "pasarile": "păsările", "pasare": "pasăre", "planteaza": "plantează", "plantam": "plantăm", "poluare": "poluare", "poluarea": "poluarea", "populatie": "populație", "populatia": "populația", "povesteste": "povestește", "protejeaza": "protejează", "protejam": "protejăm", "protectie": "protecție", "protectia": "protecția", "putina": "puțină", "putin": "puțin", # R "ramanem": "rămânem", "ramane": "rămâne", "ramas": "rămas", "raspuns": "răspuns", "raspunsul": "răspunsul", "raspunsuri": "răspunsuri", "raspunde": "răspunde", "rauri": "râuri", "raurile": "râurile", "rau": "râu", "reciclare": "reciclare", "reciclam": "reciclăm", "reciclarea": "reciclarea", "reducerea": "reducerea", "reutilizare": "reutilizare", "reutilizam": "reutilizăm", # S "sansa": "șansă", "sanse": "șanse", "scoala": "școală", "scolile": "școlile", "scoalele": "școlile", "seara": "seară", "siguranta": "siguranță", "situatie": "situație", "solutie": "soluție", "solutii": "soluții", "stim": "știm", "stie": "știe", "stiinta": "știință", "stiintific": "științific", "stiati": "știați", "sustenabilitate": "sustenabilitate", # T "tara": "țară", "tarile": "țările", "tari": "țări", "temperaturi": "temperaturi", "trebuie": "trebuie", # U "unda": "undă", "uneori": "uneori", "usoara": "ușoară", "usor": "ușor", # V "vant": "vânt", "vantul": "vântul", "viata": "viață", "vietuitoare": "viețuitoare", "vietuitoarele": "viețuitoarele", } def add_diacritics(text: str) -> str: """Add Romanian diacritics to text using word-level replacement.""" def replace_word(match): word = match.group(0) lower = word.lower() if lower in WORD_MAP: replacement = WORD_MAP[lower] # Preserve original capitalization if word[0].isupper(): replacement = replacement[0].upper() + replacement[1:] if word.isupper(): replacement = replacement.upper() return replacement return word # Match whole words only return re.sub(r'\b[a-zA-ZăâîșțĂÂÎȘȚ]+\b', replace_word, text)