File size: 1,744 Bytes
5890ee8
974648b
 
 
 
 
 
 
 
 
 
 
 
5890ee8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import re
import fitz  # PyMuPDF

def extract_pdf_text(file_bytes: bytes) -> str:
    """يستخرج النص من ملف PDF مرفوع"""
    try:
        doc = fitz.open(stream=file_bytes, filetype="pdf")
        text = ""
        for page in doc:
            text += page.get_text() + "\n"
        return text.strip()
    except Exception as e:
        return f"خطأ في قراءة ملف PDF: {e}"

def normalize_arabic(text: str) -> str:
    """
    يقوم بتنظيف النص العربي لتوحيد حركات البحث وتحسين النتائج.
    مثال: توحيد (أ، إ، آ) إلى (ا)، و (ة) إلى (ه).
    """
    if not isinstance(text, str):
        return ""
    
    # توحيد الألف
    text = re.sub(r'[أإآ]', 'ا', text)
    # توحيد التاء المربوطة والهاء
    text = re.sub(r'ة', 'ه', text)
    # توحيد الياء
    text = re.sub(r'ى', 'ي', text)
    # إزالة التشكيل (الحركات)
    text = re.sub(r'[\u064B-\u065F]', '', text)
    
    return text.strip()

def detect_lang(text: str) -> str:
    """
    يتعرف على لغة السؤال (عربي أو فرنسي) بناءً على الحروف.
    """
    if not isinstance(text, str):
        return "ar"
        
    # إذا كان يحتوي على حروف عربية
    if re.search(r'[\u0600-\u06FF]', text):
        return "ar"
    return "fr"

def format_latency(ms: int) -> str:
    """
    تنسيق الوقت المستغرق لعرضه في الواجهة بـ (ms أو s).
    """
    try:
        ms = float(ms)
        if ms < 1000:
            return f"{int(ms)}ms"
        return f"{ms / 1000:.2f}s"
    except (ValueError, TypeError):
        return "0ms"