File size: 1,673 Bytes
b411c37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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}