البنية
كيف بُني المحرّك.
نحو ٢١٠٠ سطرٍ من TypeScript في ثلاث طبقات: نموذجٌ للحروف، ومفسِّرٌ للأحكام، وبياناتُ أحكامٍ تصريحيةٌ مع الإحالات. بلا اعتماديّات وقت التشغيل.
مبادئ التصميم
- الاستنباط من الحروف والحركات وحدها. إشارات النطق المطبوعة في الترميز العثماني (الميم الصغيرة، والمدّة، والحروف الصغيرة علاماتٍ للنتيجة) لا يقرؤها المحرّك قطّ؛ بل هي مُدَّخرةٌ للتحقق.
- الأحكام بيانات، والمحرّك مفسِّر. أسماءُ كلِّ حكمٍ وإحالته وقالبا استنباطه
تعيش في جدولٍ تصريحيٍّ (
RULE_META)؛ والمحرّك يطبّق الشروط. والمواصفة الموجَّهة للعلماء (docs/SPEC.md) مُبقاةٌ مطابقةً للمحرّك بالاختبارات. - ما لا يُستنبَط فهو بيانٌ، ويُوسَم بذلك. مواضع السكت الأربعة المنقولة عن حفصٍ بيانُ روايةٍ؛ وعلامات الوقف المطبوعة بيانُ مصحف؛ وأوجه الوقف بحسب المعنى رأيٌ منقول. ولا يُستنبَط شيءٌ من ذلك من الرسم، فتحمله المكتبة بياناتٍ صريحةً بدل ادّعاء استنباطه.
- الفشلُ صريح. النقاط الرمزية المجهولة، والعلامات اليتيمة، والإدخال الفارغ
تُطلِق استثناءً. وحيث تنقل المصادر وجهين جائزين، يُخرَج الموضع بـ
confidence: "flagged"بدل الاختيار الصامت. - الرواية معطًى. حفصٌ من طريق الشاطبية معطًى افتراضيٌّ لا افتراضٌ مُثبَّتٌ في الكود. والبنية تفصل الأصول عن الفرش لتُضاف رواياتٌ أخرى معطياتٍ.
الطبقة الأولى: نموذج الحروف
يحوّل المُقطِّع نصَّ الآية إلى كلماتٍ وحروف، فاصلًا في مسائل الترميز التي يتوقّف عليها صحّةُ أيِّ حكمٍ بعده:
- كراسي الهمزة: الهمزة المرسومة على ألفٍ أو واوٍ أو ياءٍ أو نبرةٍ أو ألفٍ خنجريةٍ حرفٌ واحدٌ هو الهمزة، والكرسيُّ ليس حرفًا مستقلًّا؛
- الألف الخنجرية وحروف الصلة الصغيرة حروفَ مدٍّ للحرف قبلها؛
- الشدّة تضعيفًا، بما فيه التضعيف الناشئ عبر حدود الكلمة والآية بالإدغام؛
- التنوين نونًا ساكنةً في الأحكام، محمولًا على الحركة الأخيرة؛
- حفظ رتبة العلامات المركَّبة كما يكتبها تنزيل، ولذلك يجب ألّا يُطبَّع الإدخال بـ NFC.
وقد عاش خللٌ واحدٌ وُجِد أثناء التحقق في هذه الطبقة (همزةٌ على ألفٍ خنجريةٍ قُرِئت حرفَ مدّ، R-006)؛ فنموذج الحروف، لا الأحكام، هو حيث تختبئ مثل هذه الأخطاء، ولذلك كان طبقةً مستقلةً باختباراتها.
الطبقة الثانية: المفسِّر
يمشي المحرّك في النص المُقطَّع فيُقيِّم شروط كلِّ أسرة أحكام: أسرتَي النون الساكنة
والميم الساكنة عبر حدود الكلمات، وأحكام اللام بصور اتصال التعريف، وأحكام تفخيم الراء
بشروط سياقها، وأسرة المدّ كاملةً مع تطبيق أقوى المدَّين عند اجتماع سببين على حرفٍ
واحد، ونموذج الفواتح حيث تُبسَط الحروف المقطَّعة إلى أسمائها المنطوقة وتنطبق الأحكام
عبر الأسماء. ويدخل سياق التلاوة (وصلٌ، وقفٌ، وقفٌ عند كلمة، ابتداءٌ) معطياتٍ
صريحةً، وتحمل المواضع المتعلّقة بالحال وسمَ
appliesIn عند طلب الحالين.
الطبقة الثالثة: بيانات الأحكام
يحمل RULE_META لكلٍّ من الأحكام الـ٤١: الاسم العربي المعتمد، ونقحرته،
وترجمته، وقالبَي الاستنباط بالعربية والإنجليزية، والإحالة بأرقام الأبيات، ووسم
التعلّق بالوقف. ونصوص المنظومتين في docs/sources/ هي مرجع الإحالة؛
وفهرس الأحكام في هذا الموقع مُولَّدٌ من هذا الجدول، وطاقمُ
اختباراتٍ يفرض تطابق المواصفة والجدول والمحرّك.
النِّسَب
| المكوّن | الأسطر | الدور |
|---|---|---|
| engine.ts | 917 | المفسِّر: شروط الأحكام كلها |
| rules/meta.ts | 307 | جدول الأحكام: الأسماء والإحالات والاستنباط |
| tokenizer.ts | 268 | نموذج الحروف |
| chars.ts, letters.ts | 290 | جداول النقاط الرمزية؛ بطاقات الحروف بالمخارج والصفات |
| البقية | ~300 | الواجهة، وطلب الآية، وعلامات الوقف، وبيانات الرواية |
| الاختبارات | 692 | 112 اختبارًا، منها تطابق المواصفة والمحرّك |
أما جهاز التحقق (المُقارِن، وربط المرجع، وتقارير الانحراف) فأكبر من المكتبة نفسها ويعيش في مساحة عمل التحقق الخاصة؛ والمكتبة لا تُشحن إلا بما يُشغِّله المستهلك.