Spaces:
Runtime error
Runtime error
Upload 4 files
Browse files- app.py +111 -168
- requirements.txt +5 -5
app.py
CHANGED
|
@@ -5,202 +5,145 @@ import random
|
|
| 5 |
import arabic_reshaper
|
| 6 |
from bidi.algorithm import get_display
|
| 7 |
|
| 8 |
-
# تهيئة النموذج
|
| 9 |
try:
|
| 10 |
-
model_name = "aubmindlab/aragpt2-medium"
|
| 11 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 12 |
model = AutoModelForCausalLM.from_pretrained(model_name)
|
| 13 |
except Exception as e:
|
| 14 |
print(f"Error loading model: {e}")
|
| 15 |
-
# استخدام نموذج بسيط في حالة الفشل
|
| 16 |
model = None
|
| 17 |
tokenizer = None
|
| 18 |
|
| 19 |
-
def
|
| 20 |
"""
|
| 21 |
-
|
| 22 |
"""
|
| 23 |
-
#
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
-
def
|
| 28 |
"""
|
| 29 |
-
|
| 30 |
"""
|
| 31 |
-
|
| 32 |
-
# قوالب للربط بين الفقرات
|
| 33 |
-
transitions = [
|
| 34 |
-
"وفي هذا السياق،",
|
| 35 |
-
"ومن الجدير بالذكر أن",
|
| 36 |
-
"إضافة إلى ذلك،",
|
| 37 |
-
"وعلاوة على ما سبق،",
|
| 38 |
-
"ومن منظور آخر،",
|
| 39 |
-
"وفي ضوء ذلك،"
|
| 40 |
-
]
|
| 41 |
-
|
| 42 |
-
# إنشاء المقدمة
|
| 43 |
-
introduction = f"""يُعد {topic} من أهم المجالات التي تشغل العالم في العصر الحديث، حيث يشهد تطوراً متسارعاً
|
| 44 |
-
وتأثيراً متزايداً على مختلف جوانب الحياة. وتكمن أهمية {topic} في قدرته على إحداث تحول جذري في طريقة تعاملنا
|
| 45 |
-
مع التحديات المعاصرة وحل المشكلات المعقدة. {random.choice(transitions)} يمثل {topic} نقطة تحول محورية
|
| 46 |
-
في تاريخ التطور التكنولوجي والعلمي."""
|
| 47 |
-
|
| 48 |
-
# إنشاء صلب الموضوع
|
| 49 |
-
if article_type == "أكاديمي":
|
| 50 |
-
body = f"""
|
| 51 |
-
{random.choice(transitions)} تتعدد الجوانب النظرية والتطبيقية لـ{topic}، حيث يمكن تحليله من خلال ثلاثة محاور
|
| 52 |
-
رئيسية. يتمثل المحور الأول في الأسس النظرية والمفاهيم الأساسية، والتي تشكل القاعدة المعرفية الضرورية لفهم
|
| 53 |
-
وتطوير هذا المجال. {random.choice(transitions)} يتناول المحور الثاني التطبيقات العملية والتجارب الحديثة،
|
| 54 |
-
والتي تظهر القدرات الهائلة والإمكانات الواعدة لهذه التقنية في مختلف القطاعات.
|
| 55 |
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
المجال يفتح آفاقاً جديدة للابتكار والتطوير، مع ضرورة الموازنة بين التقدم التقني والاعتبارات الإنسانية والأخلاقية.
|
| 59 |
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
قدرة {topic} على إحداث نقلة نوعية في أساليب العمل وطرق معالجة البيانات واتخاذ القرارات."""
|
| 63 |
-
else:
|
| 64 |
-
body = f"""
|
| 65 |
-
{random.choice(transitions)} يشهد {topic} تطوراً متسارعاً في السنوات الأخيرة، مدفوعاً بالتقدم التكنولوجي
|
| 66 |
-
والاحتياجات المتزايدة للمجتمع المعاصر. وقد أدى هذا التطور إلى ظهور تطبيقات متنوعة تمس مختلف جوانب حياتنا
|
| 67 |
-
اليومية، من الهواتف الذكية إلى أنظمة النقل الذكية والرعاية الصحية المتقدمة.
|
| 68 |
|
| 69 |
-
|
| 70 |
-
جودة الحياة وتطوير الخدمات وزيادة الإنتاجية. وتشير التجارب العملية إلى أن استخدام {topic} قد أدى إلى تحسين
|
| 71 |
-
كفاءة العمليات وتقليل الأخطاء وتوفير الوقت والجهد.
|
| 72 |
-
|
| 73 |
-
{random.choice(transitions)} يواجه تطوير واستخدام {topic} مجموعة من التحديات التي تتطلب تضافر الجهود
|
| 74 |
-
لمواجهتها، مثل الحاجة إلى تطوير البنية التحتية المناسبة وتدريب الكوادر المتخصصة وضمان الأمن والخصوصية."""
|
| 75 |
-
|
| 76 |
-
# إنشاء الخاتمة
|
| 77 |
-
conclusion = f"""وختاماً، يمكن القول إن {topic} يمثل ثورة حقيقية في عالم التكنولوجيا والعلوم، مع ما يحمله
|
| 78 |
-
من إمكانات واعدة وتحديات جوهرية. ومن هذا المنطلق، تبرز أهمية تكثيف الجهود البحثية وتعزيز التعاون الدولي
|
| 79 |
-
في هذا المجال، مع التركيز على تطوير حلول مبتكرة تراعي الاحتياجات الإنسانية والاعتبارات الأخلاقية. وفي ظل
|
| 80 |
-
التطورات المتسارعة، يبدو جلياً أن مستقبل {topic} سيكون له تأثير عميق على مستقبل البشرية وتطورها."""
|
| 81 |
-
|
| 82 |
-
# تجميع المقال
|
| 83 |
-
article = f"""{introduction}
|
| 84 |
-
|
| 85 |
-
{body}
|
| 86 |
-
|
| 87 |
-
{conclusion}"""
|
| 88 |
-
|
| 89 |
-
return article
|
| 90 |
-
|
| 91 |
-
except Exception as e:
|
| 92 |
-
return f"حدث خطأ أثناء إنشاء المقال: {str(e)}"
|
| 93 |
-
|
| 94 |
-
def generate_simple_article(topic, article_type, length, style):
|
| 95 |
-
"""
|
| 96 |
-
توليد مقال بسيط في حالة عدم توفر النموذج الرئيسي
|
| 97 |
-
"""
|
| 98 |
-
# قوالب للمقدمات
|
| 99 |
-
intros = [
|
| 100 |
-
f"يعد موضوع {topic} من المواضيع الهامة التي تستحق الدراسة والبحث.",
|
| 101 |
-
f"في ظل التطورات المتسارعة، يبرز موضوع {topic} كقضية محورية.",
|
| 102 |
-
f"يثير {topic} اهتماماً متزايداً في الآونة الأخيرة."
|
| 103 |
-
]
|
| 104 |
-
|
| 105 |
-
# قوالب للخاتمة
|
| 106 |
-
conclusions = [
|
| 107 |
-
f"وختاماً، يمكننا القول أن {topic} يستحق المزيد من الاهتمام والدراسة.",
|
| 108 |
-
f"في النهاية، نؤكد على أهمية {topic} في حياتنا المعاصرة.",
|
| 109 |
-
"وبناءً على ما سبق، نوصي بمزيد من البحث والدراسة في هذا المجال."
|
| 110 |
-
]
|
| 111 |
-
|
| 112 |
-
# إنشاء المقال
|
| 113 |
-
article = f"""
|
| 114 |
-
{random.choice(intros)}
|
| 115 |
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
ثانياً: التطبيقات العملية
|
| 122 |
-
ثالثاً: التحديات والفرص المستقبلية
|
| 123 |
|
| 124 |
-
|
| 125 |
-
|
|
|
|
| 126 |
|
| 127 |
-
|
|
|
|
|
|
|
| 128 |
|
| 129 |
-
|
| 130 |
-
"""
|
| 131 |
-
تحسين أسلوب النص وتقديم اقتراحات
|
| 132 |
-
"""
|
| 133 |
-
suggestions = [
|
| 134 |
-
"✍️ حاول استخدام جمل أقصر وأكثر وضوحاً",
|
| 135 |
-
"🎯 تجنب تكرار الكلمات واستخدم مرادفات",
|
| 136 |
-
"🔄 استخدم روابط منطقية بين الفقرات",
|
| 137 |
-
"💡 أضف أمثلة توضيحية لتعزيز الفكرة",
|
| 138 |
-
"📝 استخدم علامات الترقيم بشكل صحيح",
|
| 139 |
-
"🎨 نوع في الأساليب اللغوية",
|
| 140 |
-
"📚 استشهد بمصادر موثوقة"
|
| 141 |
-
]
|
| 142 |
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
| 144 |
|
| 145 |
# إنشاء واجهة المستخدم
|
| 146 |
with gr.Blocks(title="مساعد كتابة المقالات العربية") as demo:
|
| 147 |
gr.Markdown("# 📝 مساعد كتابة المقالات العربية")
|
| 148 |
gr.Markdown("### منصة ذكية لإنشاء وتحسين المقالات العربية")
|
| 149 |
|
| 150 |
-
with gr.Tab("إنشاء مقال
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
)
|
| 157 |
-
article_type = gr.Dropdown(
|
| 158 |
-
choices=["أكاديمي", "صحفي", "مدونة", "تقني"],
|
| 159 |
-
label="نوع المقال",
|
| 160 |
-
value="أكاديمي"
|
| 161 |
-
)
|
| 162 |
-
length = gr.Radio(
|
| 163 |
-
choices=["قصير", "متوسط", "طويل"],
|
| 164 |
-
label="طول المقال",
|
| 165 |
-
value="متوسط"
|
| 166 |
-
)
|
| 167 |
-
style = gr.Dropdown(
|
| 168 |
-
choices=["رسمي", "أدبي", "تقني", "صحفي"],
|
| 169 |
-
label="الأسلوب",
|
| 170 |
-
value="رسمي"
|
| 171 |
-
)
|
| 172 |
-
|
| 173 |
-
generate_btn = gr.Button("إنشاء المقال", variant="primary")
|
| 174 |
-
article_output = gr.Textbox(
|
| 175 |
-
label="المقال المُنشأ",
|
| 176 |
-
lines=10,
|
| 177 |
-
placeholder="سيظهر المقال هنا..."
|
| 178 |
)
|
|
|
|
|
|
|
| 179 |
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
label="الاقتراحات",
|
| 189 |
-
lines=7
|
| 190 |
)
|
| 191 |
-
|
| 192 |
-
# ربط الأزرار بالوظائف
|
| 193 |
-
generate_btn.click(
|
| 194 |
-
generate_article,
|
| 195 |
-
inputs=[topic_input, article_type, length, style],
|
| 196 |
-
outputs=article_output
|
| 197 |
-
)
|
| 198 |
-
|
| 199 |
-
improve_btn.click(
|
| 200 |
-
improve_style,
|
| 201 |
-
inputs=[text_input],
|
| 202 |
-
outputs=suggestions_output
|
| 203 |
-
)
|
| 204 |
|
| 205 |
-
|
| 206 |
-
demo.launch()
|
|
|
|
| 5 |
import arabic_reshaper
|
| 6 |
from bidi.algorithm import get_display
|
| 7 |
|
| 8 |
+
# تهيئة النموذج
|
| 9 |
try:
|
| 10 |
+
model_name = "aubmindlab/aragpt2-medium"
|
| 11 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 12 |
model = AutoModelForCausalLM.from_pretrained(model_name)
|
| 13 |
except Exception as e:
|
| 14 |
print(f"Error loading model: {e}")
|
|
|
|
| 15 |
model = None
|
| 16 |
tokenizer = None
|
| 17 |
|
| 18 |
+
def generate_professional_article(topic, article_type="عام"):
|
| 19 |
"""
|
| 20 |
+
توليد مقال احترافي كامل مع جميع العناصر المطلوبة
|
| 21 |
"""
|
| 22 |
+
# قوالب للربط بين الفقرات
|
| 23 |
+
transitions = [
|
| 24 |
+
"وفي هذا السياق،",
|
| 25 |
+
"ومن الجدير بالذكر أن",
|
| 26 |
+
"إضافة إلى ذلك،",
|
| 27 |
+
"وعلاوة على ما سبق،",
|
| 28 |
+
"ومن منظور آخر،",
|
| 29 |
+
"وفي ضوء ذلك،"
|
| 30 |
+
]
|
| 31 |
+
|
| 32 |
+
article = {
|
| 33 |
+
"title": f"{topic}",
|
| 34 |
+
"introduction": f"""في ظل التطورات المتسارعة التي يشهدها العالم اليوم، يبرز {topic} كأحد أهم المواضيع
|
| 35 |
+
التي تستحوذ على اهتمام المختصين والباحثين. ويمثل هذا المجال نقطة تحول محورية في مسيرة التقدم العلمي
|
| 36 |
+
والتكنولوجي، لما له من تأثير عميق على مختلف جوانب الحياة المعاصرة.""",
|
| 37 |
+
|
| 38 |
+
"main_subtitle": "الأبعاد الرئيسية والتطورات الحديثة",
|
| 39 |
+
"introductory_paragraph": f"""يشهد مجال {topic} تطوراً متسارعاً في الآونة الأخيرة، مدفوعاً بالتقدم
|
| 40 |
+
التكنولوجي والاحتياجات المتزايدة للمجتمع المعاصر. {random.choice(transitions)} أصبح من الضروري فهم
|
| 41 |
+
الأبعاد المختلفة لهذا المجال وتأثيراته المتعددة.""",
|
| 42 |
+
|
| 43 |
+
"subtitles": [
|
| 44 |
+
{
|
| 45 |
+
"title": "الأسس النظرية والمفاهيم الأساسية",
|
| 46 |
+
"content": f"""يستند {topic} إلى مجموعة من المفاهيم والنظريات الأساسية التي تشكل إطاره المعرفي.
|
| 47 |
+
{random.choice(transitions)} تتضمن هذه الأسس مجموعة من المبادئ والقواعد التي تحكم تطوره وتطبيقاته.
|
| 48 |
+
وتعتبر هذه المفاهيم حجر الأساس في فهم وتطوير الحلول والتطبيقات المختلفة في هذا المجال."""
|
| 49 |
+
},
|
| 50 |
+
{
|
| 51 |
+
"title": "التطبيقات العملية والتجارب الحديثة",
|
| 52 |
+
"content": f"""تتعدد التطبيقات العملية لـ{topic} في مختلف المجالات، من الصناعة إلى الطب والتعليم.
|
| 53 |
+
{random.choice(transitions)} أظهرت التجارب الحديثة قدرة هذا المجال على إحداث تحول جذري في أساليب العمل
|
| 54 |
+
وطرق معالجة المشكلات. وقد ساهمت هذه التطبيقات في تحسين الكفاءة وتقليل التكاليف وتطوير حلول مبتكرة."""
|
| 55 |
+
},
|
| 56 |
+
{
|
| 57 |
+
"title": "التحديات والفرص المستقبلية",
|
| 58 |
+
"content": f"""يواجه {topic} مجموعة من التحديات التي تتطلب حلولاً مبتكرة ورؤية مستقبلية واضحة.
|
| 59 |
+
{random.choice(transitions)} تتمثل أبرز هذه التحديات في الجوانب التقنية والأخلاقية والاجتماعية. ومع ذلك،
|
| 60 |
+
تفتح هذه التحديات آفاقاً جديدة للابتكار والتطوير، مما يخلق فرصاً واعدة للمستقبل."""
|
| 61 |
+
}
|
| 62 |
+
],
|
| 63 |
+
|
| 64 |
+
"faq": [
|
| 65 |
+
{
|
| 66 |
+
"question": f"ما هي أهم مميزات {topic}؟",
|
| 67 |
+
"answer": f"""يتميز {topic} بمجموعة من الخصائص الفريدة، أهمها قدرته على التكيف مع المتغيرات
|
| 68 |
+
المختلفة، وإمكانية تطبيقه في مجالات متعددة، إضافة إلى فعاليته في حل المشكلات المعقدة."""
|
| 69 |
+
},
|
| 70 |
+
{
|
| 71 |
+
"question": f"كيف يمكن الاستفادة من {topic} في الحياة العملية؟",
|
| 72 |
+
"answer": f"""يمكن الاستفادة من {topic} في العديد من المجالات العملية، مثل تحسين الإنتاجية،
|
| 73 |
+
وتطوير الخدمات، وابتكار حلول جديدة للمشكلات القائمة. كما يمكن توظيفه في مجالات التعليم والصحة والأعمال."""
|
| 74 |
+
},
|
| 75 |
+
{
|
| 76 |
+
"question": f"ما هي التوقعات المستقبلية لتطور {topic}؟",
|
| 77 |
+
"answer": f"""تشير التوقعات المستقبلية إلى استمرار نمو وتطور {topic} بشكل متسارع، مع ظهور
|
| 78 |
+
تطبيقات جديدة وابتكارات مهمة. ومن المتوقع أن يلعب دوراً محورياً في تشكيل مستقبل العديد من القطاعات."""
|
| 79 |
+
}
|
| 80 |
+
],
|
| 81 |
+
|
| 82 |
+
"conclusion": f"""في الختام، يمثل {topic} مجالاً حيوياً يتسم بالديناميكية والتطور المستمر. وقد أثبتت
|
| 83 |
+
التجارب والدراسات أهميته المتزايدة في عصرنا الحالي. ومع استمرار التطور التقني والعلمي، نتوقع أن يشهد هذا
|
| 84 |
+
المجال المزيد من الابتكارات والتطبيقات التي ستساهم في تحسين حياة الإنسان وتطوير المجتمعات."""
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
return article
|
| 88 |
|
| 89 |
+
def format_article(article):
|
| 90 |
"""
|
| 91 |
+
تنسيق المقال بشكل منظم ومرتب
|
| 92 |
"""
|
| 93 |
+
formatted_text = f"""# {article['title']}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
|
| 95 |
+
## مقدمة
|
| 96 |
+
{article['introduction']}
|
|
|
|
| 97 |
|
| 98 |
+
## {article['main_subtitle']}
|
| 99 |
+
{article['introductory_paragraph']}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
|
| 101 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
|
| 103 |
+
for subtitle in article['subtitles']:
|
| 104 |
+
formatted_text += f"""### {subtitle['title']}
|
| 105 |
+
{subtitle['content']}
|
| 106 |
+
|
| 107 |
+
"""
|
|
|
|
|
|
|
| 108 |
|
| 109 |
+
formatted_text += """## الأسئلة الشائعة
|
| 110 |
+
|
| 111 |
+
"""
|
| 112 |
|
| 113 |
+
for qa in article['faq']:
|
| 114 |
+
formatted_text += f"""### {qa['question']}
|
| 115 |
+
{qa['answer']}
|
| 116 |
|
| 117 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
+
formatted_text += f"""## الخاتمة
|
| 120 |
+
{article['conclusion']}"""
|
| 121 |
+
|
| 122 |
+
return formatted_text
|
| 123 |
|
| 124 |
# إنشاء واجهة المستخدم
|
| 125 |
with gr.Blocks(title="مساعد كتابة المقالات العربية") as demo:
|
| 126 |
gr.Markdown("# 📝 مساعد كتابة المقالات العربية")
|
| 127 |
gr.Markdown("### منصة ذكية لإنشاء وتحسين المقالات العربية")
|
| 128 |
|
| 129 |
+
with gr.Tab("إنشاء مقال احترافي"):
|
| 130 |
+
topic_input = gr.Textbox(label="موضوع المقال")
|
| 131 |
+
article_type = gr.Dropdown(
|
| 132 |
+
choices=["عام", "أكاديمي", "صحفي", "تقني"],
|
| 133 |
+
label="نوع المقال",
|
| 134 |
+
value="عام"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
)
|
| 136 |
+
generate_btn = gr.Button("إنشاء المقال")
|
| 137 |
+
output = gr.Textbox(label="المقال المُنشأ", lines=20)
|
| 138 |
|
| 139 |
+
def generate_and_format(topic, article_type):
|
| 140 |
+
article = generate_professional_article(topic, article_type)
|
| 141 |
+
return format_article(article)
|
| 142 |
+
|
| 143 |
+
generate_btn.click(
|
| 144 |
+
generate_and_format,
|
| 145 |
+
inputs=[topic_input, article_type],
|
| 146 |
+
outputs=output
|
|
|
|
|
|
|
| 147 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
|
| 149 |
+
demo.launch()
|
|
|
requirements.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
-
transformers
|
| 2 |
-
torch
|
| 3 |
-
gradio
|
| 4 |
python-dotenv==1.0.0
|
| 5 |
sentencepiece==0.1.99
|
| 6 |
-
arabic-reshaper
|
| 7 |
-
python-bidi
|
|
|
|
| 1 |
+
transformers>=4.30.0
|
| 2 |
+
torch>=2.0.0
|
| 3 |
+
gradio>=3.50.2
|
| 4 |
python-dotenv==1.0.0
|
| 5 |
sentencepiece==0.1.99
|
| 6 |
+
arabic-reshaper>=3.0.0
|
| 7 |
+
python-bidi>=0.4.2
|