EGYADMIN commited on
Commit
ba583c4
·
verified ·
1 Parent(s): 256d3b6

Delete modules/utils/arabic_font_config.py

Browse files
Files changed (1) hide show
  1. modules/utils/arabic_font_config.py +0 -271
modules/utils/arabic_font_config.py DELETED
@@ -1,271 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- وحدة تكوين الخطوط العربية
4
-
5
- هذا الملف يحتوي على أدوات لتكوين وإدارة الخطوط العربية للرسوم البيانية
6
- """
7
-
8
- import os
9
- import sys
10
- import matplotlib.font_manager as fm
11
- import matplotlib.pyplot as plt
12
- import arabic_reshaper
13
- from bidi.algorithm import get_display
14
- import json
15
- import glob
16
-
17
- class ArabicFontManager:
18
- """مدير الخطوط العربية للرسوم البيانية"""
19
-
20
- def __init__(self):
21
- """تهيئة مدير الخطوط العربية"""
22
- # قائمة بمسارات الخطوط العربية المعروفة
23
- self.known_font_paths = {
24
- 'Amiri': '/usr/share/fonts/truetype/hosny-amiri/',
25
- 'Lateef': '/usr/share/fonts/truetype/sil/',
26
- 'Scheherazade': '/usr/share/fonts/truetype/sil/',
27
- 'KACST': '/usr/share/fonts/truetype/kacst/',
28
- 'Noto Naskh Arabic': '/usr/share/fonts/truetype/noto/',
29
- 'Harmattan': '/usr/share/fonts/truetype/sil/',
30
- 'Alkalami': '/usr/share/fonts/truetype/sil/'
31
- }
32
-
33
- # قائمة بالخطوط العربية المتاحة
34
- self.available_fonts = {}
35
-
36
- # البحث عن الخطوط العربية المتاحة
37
- self.scan_available_fonts()
38
-
39
- def scan_available_fonts(self):
40
- """البحث عن الخطوط العربية المتاحة في النظام"""
41
- # مسح المسارات المعروفة
42
- for font_family, font_path in self.known_font_paths.items():
43
- if os.path.exists(font_path):
44
- font_files = []
45
- # البحث عن ملفات الخطوط في المسار
46
- for font_file in os.listdir(font_path):
47
- if font_file.endswith('.ttf') or font_file.endswith('.otf'):
48
- full_path = os.path.join(font_path, font_file)
49
- font_files.append(full_path)
50
-
51
- if font_files:
52
- self.available_fonts[font_family] = font_files
53
-
54
- # البحث في المسارات الإضافية
55
- additional_paths = [
56
- '/usr/share/fonts/',
57
- '/usr/local/share/fonts/',
58
- os.path.expanduser('~/.fonts/')
59
- ]
60
-
61
- # استخدام قائمة الخطوط المتاحة في matplotlib
62
- font_list = fm.findSystemFonts()
63
- arabic_fonts = []
64
-
65
- # البحث عن الخطوط العربية
66
- for font_path in font_list:
67
- try:
68
- font_name = os.path.basename(font_path).split('.')[0]
69
- if 'arab' in font_name.lower() or 'naskh' in font_name.lower() or 'kufi' in font_name.lower():
70
- if font_name not in self.available_fonts:
71
- self.available_fonts[font_name] = []
72
- self.available_fonts[font_name].append(font_path)
73
- except Exception as e:
74
- print(f"خطأ في معالجة الخط {font_path}: {e}")
75
-
76
- def configure_matplotlib(self, preferred_font=None):
77
- """
78
- تكوين matplotlib لاستخدام الخطوط العربية
79
-
80
- المعلمات:
81
- preferred_font: اسم الخط المفضل (اختياري)
82
-
83
- العوائد:
84
- قائمة بأسماء الخطوط العربية المتاحة
85
- """
86
- # تحديد الخط المفضل
87
- if preferred_font and preferred_font in self.available_fonts:
88
- primary_font = preferred_font
89
- elif 'NotoNaskhArabic-Regular' in self.available_fonts:
90
- primary_font = 'NotoNaskhArabic-Regular'
91
- elif 'NotoSansArabic-Regular' in self.available_fonts:
92
- primary_font = 'NotoSansArabic-Regular'
93
- elif len(self.available_fonts) > 0:
94
- primary_font = list(self.available_fonts.keys())[0]
95
- else:
96
- primary_font = 'sans-serif'
97
-
98
- # تكوين الخط الافتراضي
99
- font_list = [primary_font] + list(self.available_fonts.keys()) + ['sans-serif']
100
- plt.rcParams['font.family'] = ', '.join(font_list)
101
-
102
- return list(self.available_fonts.keys())
103
-
104
- def get_font_list(self):
105
- """
106
- الحصول على قائمة بالخطوط العربية المتاحة
107
-
108
- العوائد:
109
- قائمة بأسماء الخطوط العربية المتاحة
110
- """
111
- return list(self.available_fonts.keys())
112
-
113
- def get_best_font(self):
114
- """
115
- الحصول على أفضل خط عربي متاح
116
-
117
- العوائد:
118
- اسم أفضل خط عربي متاح
119
- """
120
- preferred_fonts = [
121
- 'NotoNaskhArabic-Regular',
122
- 'NotoSansArabic-Regular',
123
- 'Amiri',
124
- 'Scheherazade',
125
- 'Lateef',
126
- 'KACST'
127
- ]
128
-
129
- for font in preferred_fonts:
130
- if font in self.available_fonts:
131
- return font
132
-
133
- if len(self.available_fonts) > 0:
134
- return list(self.available_fonts.keys())[0]
135
-
136
- return 'sans-serif'
137
-
138
- def save_font_config(self, config_file='arabic_font_config.json'):
139
- """
140
- حفظ تكوين الخطوط العربية إلى ملف
141
-
142
- المعلمات:
143
- config_file: اسم ملف التكوين
144
- """
145
- config = {
146
- 'available_fonts': {k: v for k, v in self.available_fonts.items()},
147
- 'best_font': self.get_best_font()
148
- }
149
-
150
- with open(config_file, 'w', encoding='utf-8') as f:
151
- json.dump(config, f, ensure_ascii=False, indent=4)
152
-
153
- def load_font_config(self, config_file='arabic_font_config.json'):
154
- """
155
- تحميل تكوين الخطوط العربية من ملف
156
-
157
- المعلمات:
158
- config_file: اسم ملف التكوين
159
-
160
- العوائد:
161
- True إذا تم تحميل التكوين بنجاح، False خلاف ذلك
162
- """
163
- if not os.path.exists(config_file):
164
- return False
165
-
166
- try:
167
- with open(config_file, 'r', encoding='utf-8') as f:
168
- config = json.load(f)
169
-
170
- if 'available_fonts' in config:
171
- self.available_fonts = config['available_fonts']
172
- return True
173
- except Exception as e:
174
- print(f"خطأ في تحميل ملف التكوين: {e}")
175
-
176
- return False
177
-
178
- def get_display_arabic(text):
179
- """
180
- تحويل النص العربي للعرض الصحيح في الرسوم البيانية
181
-
182
- المعلمات:
183
- text: النص العربي المراد تحويله
184
-
185
- العوائد:
186
- النص بعد المعالجة للعرض الصحيح
187
- """
188
- # التحقق من أن النص ليس فارغًا
189
- if not text:
190
- return text
191
-
192
- # تشكيل النص العربي وتحويله للعرض الصحيح
193
- try:
194
- reshaped_text = arabic_reshaper.reshape(text)
195
- bidi_text = get_display(reshaped_text)
196
- return bidi_text
197
- except Exception as e:
198
- print(f"خطأ في معالجة النص العربي: {e}")
199
- return text
200
-
201
- def setup_arabic_fonts(preferred_font=None):
202
- """
203
- إعداد الخطوط العربية لاستخدامها في matplotlib
204
-
205
- المعلمات:
206
- preferred_font: اسم الخط المفضل (اختياري)
207
-
208
- العوائد:
209
- قائمة بأسماء الخطوط العربية المتاحة
210
- """
211
- font_manager = ArabicFontManager()
212
- return font_manager.configure_matplotlib(preferred_font)
213
-
214
- def test_arabic_fonts():
215
- """
216
- اختبار الخطوط العربية المتاحة
217
-
218
- هذه الدالة تقوم بإنشاء رسم بياني لاختبار الخطوط العربية المتاحة
219
- """
220
- # إنشاء مدير الخطوط العربية
221
- font_manager = ArabicFontManager()
222
- available_fonts = font_manager.configure_matplotlib()
223
-
224
- if not available_fonts:
225
- print("لا توجد خطوط عربية متاحة!")
226
- return
227
-
228
- # نص الاختبار
229
- test_text = "هذا نص عربي لاختبار الخطوط: أبجد هوز حطي كلمن"
230
-
231
- # اختيار عدد محدود من الخطوط للاختبار
232
- test_fonts = available_fonts[:5] if len(available_fonts) > 5 else available_fonts
233
-
234
- # إنشاء رسم بياني لكل خط
235
- fig, axes = plt.subplots(len(test_fonts), 1, figsize=(10, len(test_fonts) * 1.5))
236
-
237
- if len(test_fonts) == 1:
238
- axes = [axes]
239
-
240
- for i, font in enumerate(test_fonts):
241
- axes[i].text(0.5, 0.5, get_display_arabic(test_text),
242
- fontfamily=font, fontsize=14, ha='center', va='center')
243
- axes[i].set_title(f"Font: {font}", fontsize=10)
244
- axes[i].axis('off')
245
-
246
- plt.tight_layout()
247
- plt.savefig("arabic_fonts_test.png", dpi=150)
248
- print(f"تم إنشاء صورة اختبار الخطوط العربية: arabic_fonts_test.png")
249
-
250
- # اختبار الوحدة إذا تم تشغيل الملف مباشرة
251
- if __name__ == "__main__":
252
- # إنشاء مدير الخطوط العربية
253
- font_manager = ArabicFontManager()
254
-
255
- # البحث عن الخطوط العربية المتاحة
256
- available_fonts = font_manager.get_font_list()
257
-
258
- print("الخطوط العربية المتاحة:")
259
- for font in available_fonts:
260
- print(f" - {font}")
261
-
262
- # حفظ تكوين الخطوط العربية
263
- font_manager.save_font_config()
264
-
265
- # اختبار الخطوط العربية
266
- try:
267
- test_arabic_fonts()
268
- except Exception as e:
269
- print(f"خطأ في اختبار الخطوط العربية: {e}")
270
-
271
- print("أفضل خط عربي متاح:", font_manager.get_best_font())