Spaces:
Running on Zero
Running on Zero
| from __future__ import annotations | |
| import re | |
| from ocr_studio.config import LANGUAGE_AUTO, LANGUAGE_BOTH, LANGUAGE_EN, LANGUAGE_FA | |
| ARABIC_SCRIPT_RE = re.compile(r"[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF]") | |
| LATIN_RE = re.compile(r"[A-Za-z]") | |
| _ARABIC_YE = "\u064a" | |
| _PERSIAN_YE = "\u06cc" | |
| _ARABIC_KEHEH = "\u0643" | |
| _PERSIAN_KEHEH = "\u06a9" | |
| def contains_arabic_script(text: str) -> bool: | |
| return bool(ARABIC_SCRIPT_RE.search(text or "")) | |
| def detect_language(text: str) -> str: | |
| arabic = len(ARABIC_SCRIPT_RE.findall(text or "")) | |
| latin = len(LATIN_RE.findall(text or "")) | |
| if arabic and latin: | |
| return LANGUAGE_BOTH | |
| if arabic: | |
| return LANGUAGE_FA | |
| if latin: | |
| return LANGUAGE_EN | |
| return LANGUAGE_BOTH | |
| def resolve_language(selected: str, text: str) -> str: | |
| if selected == LANGUAGE_AUTO: | |
| return detect_language(text) | |
| if selected in {LANGUAGE_BOTH, LANGUAGE_FA, LANGUAGE_EN}: | |
| return selected | |
| return LANGUAGE_BOTH | |
| def normalize_persian(text: str) -> str: | |
| return ( | |
| (text or "") | |
| .replace(_ARABIC_YE, _PERSIAN_YE) | |
| .replace(_ARABIC_KEHEH, _PERSIAN_KEHEH) | |
| ) | |
| def normalize_text(text: str, language: str) -> str: | |
| cleaned = (text or "").replace("\r\n", "\n").replace("\r", "\n") | |
| cleaned = re.sub(r"[ \t]+\n", "\n", cleaned) | |
| cleaned = re.sub(r"\n{3,}", "\n\n", cleaned).strip() | |
| if language in {LANGUAGE_FA, LANGUAGE_BOTH, LANGUAGE_AUTO}: | |
| cleaned = normalize_persian(cleaned) | |
| return cleaned | |
| def is_rtl_language(language: str) -> bool: | |
| return language in {LANGUAGE_FA, LANGUAGE_BOTH} | |