Spaces:
Sleeping
Sleeping
| 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" | |