ويكاموس arwiktionary https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9 MediaWiki 1.47.0-wmf.16 case-sensitive ميديا خاص نقاش مستخدم نقاش المستخدم ويكاموس نقاش ويكاموس ملف نقاش الملف ميدياويكي نقاش ميدياويكي قالب نقاش القالب مساعدة نقاش المساعدة تصنيف نقاش التصنيف ملحق نقاش الملحق مكنز نقاش المكنز نص زمني نقاش النص الزمني وحدة نقاش الوحدة فعالية نقاش فعالية ويكاموس:الميدان 4 623 1099185 1098988 2026-08-22T18:47:21Z Najem Ajem 20465 /* اضافة اسم مستعار مختصر لنطاق ويكاموس */ تعليق 1099185 wikitext text/x-wiki {{/مقدمة}}__فهرس__ == تشكيل عنوان المقالة في ويكاموس العربي والنسخ اللغوية الأخرى == يعتمد ويكاموس العربي تشكيل اسم الصفحة باعتبار أنه مع اختلاف التشكيل فإننا المفردة مختلفة عن أختها، لكن أغلب النسخ اللغوية الأخرى ومن أهمها الإنجليزي تعتمد اسم الصفحة بدون تشكيل وتجمع جميع المفردات التي تشترك في نفس رسم الكلمة بدون تشكيل في صفحة واحدة. ;تأثير هذا الاختلاف: يؤثر هذه الاختلاف بين النسخ اللغوية في الربط بين النسخ اللغوية المختلفة لأن الربط يكون باسم الصفحة وإذا وجدت صفحة مشكلة وصفحة غير مشكلة فإنهما صفحتان مختلفتان لذا فإنها لا تربط لا حظ مثلا صفحة [[قَتَلَ]] تجد أنها مربوطة مع النسخة الفرنسية فقط ولكن افتح صفحة [[:en:قتل]] تجد أنها مربوطة ب 25 نسخة لغوية، وهذا يؤثر على الاستفادة من المحتوى العربي في ويكاموس العربي بشدة. لذا فأرجو إعادة النظر في منهجية تشكيل اسم الصفحةة في ويكاموس، وهذا نقاش مفتوح وكل يذكر ما يراه صوابا مع الأسباب، وقد فتحت نقاشا في مجموعة التلجرام فتبين أن ويكاموس الفرنسي والإيطالي يلتزمان بالتشكيل في عنوان الصفحة. وهذا الأمر يستوجب وجود سياسة عالمية لأنها تحدد الربط بين المشاريع. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 08:54، 17 نوفمبر 2025 (ت ع م) :[[ويكاموس:الميدان/أرشيف/2017#مفردات ويكاموس|نقاش سابق]]، إشارة إلى المشاركين فيه @[[مستخدم:أحمد ناجي|أحمد ناجي]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:أسامة الجزري|أسامة الجزري]] @[[مستخدم:ميسرة|ميسرة]] @[[مستخدم:أبو آسر|أبو آسر]] @[[مستخدم:يوسف عاشق الجبل|يوسف عاشق الجبل]]. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 12:03، 17 نوفمبر 2025 (ت ع م) ::@[[مستخدم:حبيشان|حبيشان]] أنا مؤيد لإزالة التشكيل من العناوين وإضافة المفردات المشكلة المرجوة لذات الصفحة لتسهيل الوصول إلى المفردة والمفردات ذات الصلة وهذا المعمول به في المواد غير العربية ومخالفة المواد العربية يعسر البحث. مثلا عندنا [[أَكْل]] و[[أَكَلَ]] لكن في المفردات غير العربية عندنا مادة واحدة لاسم ولفعل ولصفة مثل [[present]]، فأقترح إزالة التشكيل في العناوين وكتابة المفردات المرجوة في الصفحة ومنها اشتقاقات الجذر ولتزل صفحات التوضيح. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 22:24، 17 نوفمبر 2025 (ت ع م) ::هذا النقاش يثار كلما جاء وفد من ويكيبيديا وقارن ويكاموس العربي بالنسخ اللغوية الأخرى. ويكاموس العربي يعتمد على صفحات التوضيح منذ زمن بعيد، وهي كفيلة بربط هذه النسخة مع باقي النسخ الأخرى، مثلا صفحة [[قتل]] مربوطة ب25 نسخة، وصفحة [[كتب]] ب24 نسخة، وكذا صفحة [[نظر]] مرتبطة ب19 نسخة. فإذا كنت تدعم العناوين بدون تشكيل فهو أمر معمول به أصلا (صفحات التوضيح) وإذا كنت تريد أن نزيل الوصلات ونجمع المحتويات كلها في صفحة واحدة فهذا لن يزيد من الربط، بل سيبقى الربط كما هو. أصلا لا توجد مشكلة في الربط، بل المشكلة في النقص العددي لصفحات ويكاموس، حتى أن صفحة [[ربط]] غير موجودة لحظة كتابتي لهذا التعليق. أقول أنه ليس على ويكاموس العربي أن يتبع ويكاموس الإنجليزي أو الفرنسي، إذا فكرنا من وجهة نظر موضوعية، فإن الأصل هو وجود صفحة واحدة لكل كلمة، [[قَتَلَ]] ليست هي نفسها [[قَتَّلَ]] أو [[قَتْل]]، لذا وجود صفحات مستقلة هو أمر طبيعي وجيد ويُتيح إمكانية التفصيل في شرح مختلف المعاني. ثم مع هذا توجد صفحة التوضيح [[قتل]] (بدون تشكيل) التي تكون مرتبطة مع مختلف النسخ اللغوية. '''هذا ليس عيب، بل ميزة معمول بها منذ زمن طويل'''. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 17 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Najem Ajem|Najem Ajem]] لا أرى ميزة إضافية لفصل المفردات حسب شكلها إلا زيادة عدد الصفحات، بينما نخسر مميزات إضافية ذكرتها أدنا. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:21، 22 نوفمبر 2025 (ت ع م) ::أتفق مع الزميل @[[مستخدم:Najem Ajem|الناجم العاجم]] في الحفاظ على أسماء الصفحات بالتشكيل، مع وجود صفحات التوضيح. أُضيف إلى ما قيل: في المستقبل نُريد ربط صفحات ويكاموس مع الوحدات المُعجمية في ويكي بيانات، وهذا سيكون أسهل إذا كانت الصفحات مُستقلة. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:23، 20 نوفمبر 2025 (ت ع م) :::@[[مستخدم:ForzaGreen|ForzaGreen]] الصفحة في ويكاموس تقبل جميع اللغات التي تستعمل نفس رسم الكلمة، بينما المعجمية في ويكي بيانات مقيدة بلغة معينة، فالربط لا يمكن أن يتم آليا، فما دام يدويًا فلا ميزة إضافية لفصل الكلمات حسب شكلها في صفحات مستقلة. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:18، 22 نوفمبر 2025 (ت ع م) :: {{ضد}} التشكيل ضرورة حتمية في المعاجم، ووجود نفس الرسم في معاجم أخرى يُعدّ جهدًا ضائعًا (إذ تصبح صفحة الكلمة مكررة بعدّة لغات، ولا أعلم ما الفائدة!). الأصل أن تُربط المفردة بما يقابلها بالترجمة، لا بالرسم. الأمر نفسه ينطبق على الكلمات غير العربية (أو على الأقل غير المنطوقة بلهجات عربية) في ويكاموس العربي؛ فوجودها مكررة في عدّة معاجم بلغات أخرى لا فائدة منه. منذ مدة وأنا أفكر في طريقة لربط الكلمات بين المعاجم اللغوية، ووجدت — حتى الآن — أن قسم الترجمة يمكنه القيام بذلك، لكنه بدوره يحتاج إلى ربط آلي. تحياتي --[[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> ::: {{ر|Nehaoua}} لن نفقد التشكيل عندما نجمع المفردات المتفقة في الرسم في صفحة واحدة، فستكون المفردات في عناوين فرعية وهي المسماة في ويكاموس الإنجليزي headwords، وكل نسخ ويكاموس متعددة لغات المفردات، فالمفردات العربية موجودة (أو لها أن تكون موجودة) في كافة النسخ اللغوية الأخرى، وللأسف المفردات العربية في ويكاموس الإنجليزي أكثر من العربي.--[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:26، 22 نوفمبر 2025 (ت ع م) :::مرحبًا @[[مستخدم:حبيشان|حبيشان]] رسمُ الكلمةِ العربية لا يكون مكتملًا إلا بالتشكيل، وكلُّ صيغةٍ مشكلة تُعدّ مفردة مستقلة، حتى ولو اشتركت في الرسم، لأن اختلاف التشكيل يؤدي إلى اختلافٍ في المعنى والمغزى. ولا يمكن القياس على الإنجليزية، فهي تعتمد على [[w:صائت|الصوائت]] التي تُميّز بين الكلمات (والمقابل لها في اللغة العربية الحركات الثلاثة -الفتح والكسر والضم-)، مثل: :::*[https://en.wiktionary.org/wiki/pin pin] (دبوس) :::*[https://en.wiktionary.org/wiki/pun pun] (تورية) :::*[https://en.wiktionary.org/wiki/pan pan] (مِقلاة) :::ولا تُعدّها الإنجليزية مفردة واحدة. :::أمّا ما ذُكر من أن {{مض|المفردات العربية في ويكاموس الإنجليزي أكثر من العربي}}} فهذا – في الواقع – مثال واضح على الجهد الضائع، إذ تُكرَّر الصفحات في معاجم أخرى بدل تطوير النسخة العربية ذاتها. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:55، 23 نوفمبر 2025 (ت ع م) ::::@[[مستخدم:Nehaoua|Nehaoua]] لابد من تشكيل المفردة عند ذكرها والشرح، وليس هذا محل خلاف، ولا خلاف أن الاختلاف في التشكيل غالبا يعني مفردة مختلفة، لكن النقاش عن جمع المفردات في صفحة واحدة وفقا لرسمها المجرد من التشكيل، فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتففق في الحروف في مدخل واحد، وهذا الطريقة المتفردة تفقد ويكاموس العربي بعض المميزات التقنية، بعض الميزات الأخرى التي ذكرتها. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 07:36، 24 نوفمبر 2025 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] عفوًا pin وpun وpan من جدوز مختلفة لا علاقة لها ببعض. كل واحدة free base morpheme لا صلة لها بالأخرى. أما عن الحركات العربية فهي تعود لجذر واحد فلا تصح المقارنة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 08:29، 24 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Nehaoua|Nehaoua]] أيضا لا يمكن حصر التشكيل مقابلًا للصوائت لأن منها short vowel sounds ومنها long vowel sounds التي هي أقرب إلى حروف العلة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:26، 24 نوفمبر 2025 (ت ع م) ::::::مرحبًا @[[مستخدم:كريم رائد|كريم رائد]] لا يوجد مفهوم الجذر في الإنجليزية، وأنا متفق أنه {{مض|لا تصح المقارنة}} لأن الطلب اصلا مبني على المقارنة! تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:39، 24 نوفمبر 2025 (ت ع م) :::::::@[[مستخدم:Nehaoua|Nehaoua]] بل يوجد؛ طالع إن شئت Root (linguistics) ومقارنتك تشكيل العناوين بتلك المفردات في غير محلها لأن كل من هذه المفردات له معنى مختلف وجذره مختلف. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:09، 24 نوفمبر 2025 (ت ع م) ::::::::@[[مستخدم:كريم رائد|كريم رائد]] تمتاز اللغات السامية بأنها جذرية واشتقاقية؛ إذ يمكن اشتقاق مئات الكلمات من الجذر الواحد بتغييرات بسيطة ومنها التشكيل، في حين أن الـ '''Root '''في اللغات الأخرى يتغيّر عادةً بإضافة السوابق واللواحق (أمور معروفة لا تحتاج لإطالة). ::::::::{{مض|ومقارنتك تشكيل العناوين بتلك المفردات في غير محلّها}}، لأن المقصود هو أن التشكيل في العربية يوافق الصوائت؛ فالفتحة تقابلها "A"، والضمة "O"، والكسرة "I"، وهذا تحديدًا ما أردتُ مقارنته (وأعتذر عن إعادة ما سبق أن قلتُه). ::::::::وأكتفي هنا حتى لا يتحول النقاش إلى جدال. وفي النهاية، ما الفائدة من جمع تعريفات جميع معاني الرسم «عبر» في صفحة واحدة، من جمع [[عِبْرَة|لعِبرة]] إلى الفعل [[عَبَرَ|عَبَرَ]] وغيرها؟ ::::::::أكتفي بهذا القدر وقد بيّنتُ وجهة نظري. تحياتي. [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:24، 24 نوفمبر 2025 (ت ع م) :::::مرحبًا @[[مستخدم:حبيشان|حبيشان]]، :::::* {{مض|ولا خلاف أن الاختلاف في التشكيل غالبًا يعني مفردة مختلفة}} فكلُّ اختلافٍ في التشكيل يُنتج مفردةً مختلفة، وبالتالي مدخلة مختلفة. :::::* {{مض|النقاش عن جمع المفردات في صفحة واحدة وفقًا لرسمها المجرَّد من التشكيل}} وصفحات التوضيح تكفي في هذا الباب. :::::* {{مض|فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتفق في الحروف في مدخل واحد}} لا تتبع جميع المعاجم هذا النهج، فالمعجم الوسيط مثلًا لم يجمع كل المفردات ذات الرسم الواحد؛ انظر مثلًا مدخل: [https://shamela.ws/book/7028/640#p1 «عين»]، حيث تكرّرت عدة مرات، وبينها تعريفات لكلمات مختلفة الرسم. وكذلك نحن نعمل في مشروع لا يقتضي النسخ الحرفي للمطبوع. :::::* {{مض|وهذه الطريقة المتفردة تفقد ويكاموس العربي بعض المزايا التقنية}} إن اختلاف الرسم والمفردات في العربية أمرٌ أصيل، ووجود صعوبات تقنية حالية لا يبرّر تقليل شأن اللغة أو التخفيف من خصائصها؛ فقد كانت كتابة العربية يومًا ما مستحيلة تقنيًا، ولو اتبعنا المنطق نفسه لكتبناها اليوم بالأحرف اللاتينية. :::::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:09، 24 نوفمبر 2025 (ت ع م) === مميزات جمع المفردات في صفحة واحدة إذا اتفقت في رسهما الخالي من التشكيل === # أولا بالنظر إلى معاجمنا العربية الأصيلة فيهم تجمع المفردات لأكثر من ذلك فكل المفردات تحت جذر واحد تجمع في مدخل واحد في المعجم العربي بل بعض المعاجم تضم إليها التقاليب (جبذ، جذب، بجذ...)، فالجمع المقترح أقرب إلى العمل المعمول به في معاجمنا من الطريقة الحالية. # كثير من الكلمات العربية يكون فيها أكثر من وجه في الضبط لدينا مثلا كلمة «إِصبَع» فيها تسع لغات حيث يجوز في أولها وثالثها الحركات الثلاث، فعلى هذا سيكون للأصبع 9 صفحات وهي مفردة واحدة ولكن فيها عدة أوجه أو لغات، وكثير من مفردات اللغة يجوز في حرف من حروفها أكثر من حركة ( ومنها باب المثلث في اللغة)، لذا فجمعها في صفحة أيسر في الوقوف على الفائدة، وأبعد من إيهام التغاير. # أن القارئ ربما يريد أن يستفيد ما هو الضبط الصحيح لكلمة معينة، وجود أكثر من عنوان مشكولة يؤخره في البحث عن الكلمة. # أن القارئ لا يستطيع أن يصل بسهولة من صفحة مفردة إلى ما يقابلها في اللغات الأخرى فيحتاج أن ينتقل غلى صفحة توضيح أو أن يبحث عنها. # نفس الشيء بالنسبة للقارئ في النسخ الأخرى الذي يرغب أن يطلع على النسخة العربية. --[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:15، 22 نوفمبر 2025 (ت ع م) :{{ر|حبيشان}} :# نحن في قاموس إلكتروني، حيث تتوفر الوصلات وصناديق البحث، لماذا سنتبع طريقة الكتب القديمة. :# عندما يكون للكلمة الواحدة أكثر من تهجئة واحدة، فحينئذ نضع صفحة تحتوي على المعنى، وصفحات أخرى تحوّل أو توصل إليها، مع ذكر هذه الملاحظة في صفحة المعنى. وهذا طبيعي جدا حتى أن النسخ الأخرى تقوم بالأمر نفسه، مثلا في ويكاموس الإنجليزي صفحة [[:en:colour|colour]] لا تحتوي على المعاني، ذكروا فقط أنها تهجئة مختلفة للكلمة [[:en:color|color]]. :# النقطة 2 تفيد أيضا في حال وجود تهجئات خاطئة وشائعة. :# من المفترض أن تحتوي الصفحات على قالب {{قا|أيضا}} في الأعلى، ويشير إلى صفحة التوضيح (التي تتضمن الكلمات التي لها الرسم نفسه) كما هو معمول به في النسخ الأخرى. :# القارئ من النسخ الأخرى سيجد صفحة التوضيح من خلال وصلات الأنترويكي. بالمناسبة العناوين بالتشكيل موجودة في نسخ أخرى غير العربية. :[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 22 نوفمبر 2025 (ت ع م) * في الوضع الحالي وبعد ترتيب المفردات في التصانيف، فلا بأس عندي ببقاء عناوين المشكلة، مع الآتي: ** تنقيح تعليمات [[ويكاموس:صيغة الكتابة/الحركات والتشكيل|تشكيل العناوين]] ووسمها سياسةً لكي تكون ملزمة. ** جعل إنشاء صفحات التوضيح (بدون شكل) آليا عبر بوت، وكذلك الوصلة إليها من صفحات المفردات المشكلة.--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 18:08، الأربعاء 2 شعبان 1447هـ (+3) 15:08، 21 يناير 2026 (ت ع م) :{{ر|حبيشان}} راجعتُ صفحة [[وق:تشكيل|تشكيل العناوين]]، وجعلت القواعد أكثر وضوحا، يرجى إلقاء نظرة عليها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:09، 22 يناير 2026 (ت ع م) ::مرحبًا @[[مستخدم:Najem Ajem|Najem Ajem]] شكرًا لتوضيحك [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:49، 28 يناير 2026 (ت ع م) === نقاش حول [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]] (مقترح سياسة) === * {{ر|Najem Ajem}} اعتذر عن تأخري بالرد بسبب انشغالي بالخارج، المقترح فيه بعض القصور، وايضا هناك [[خاص:فرق/1076134|تغيير محوري]] أضيف بعد الخلاصة لم يناقش بالمرة، لذا أرجو حذف الخلاصة والعودة إلى النقاش، وهذه الملاحظات على الصيغة الحالية: ** تغير كلمة (حركات) إلى (شكلات)، لأن الشدة ليست حركة وكذلك السكون عند البعض. ** توضح أحرف المد بـ (وهي الألف (ا) مطلقا، والواو (و) الساكنة المضموم ما قبلها، والياء (ي) الساكنة <s>المضموم</s> المكسور ما قبلها). ** اقترح تعديل النقطة الثانية إلى: ::: {{مض|يترك محل الإعراب (آخر الكلمة المفردة) في الكلمات المعربة بالحركات بدون حركة أو سكون -وتبقى الشدة إذا كان مشددًأ-؛ لأن حركته تتغير حسب موقع الكلمة في الجملة}} وعليه فإن «مُعَلِّمُونَ» تشكل النون وإن كانت آخر الكلمة لأن معلمون تعرب بالحروف. ::: بتعديل هذه النقطة نسنغني عن النقاط بعدها إلا إذا قصد بها التوضيح. ** في نقطة الأفعال يفهم منها أنه يجب شكل آخر المضارع ولكنه معرب والأولى أن يشمله ما يشمل الأسماء لذلك أقترحت هنا أن تكون النقطة عامة للأسماء والأفعال واستخدمت مصطلح (الكلمات). ** لو ينص على وجوب نقط الياء المتطرفة تمييزا لها عن الألف المطوية. ** ماذا عن همزة الوصل هل تشكل أم لا، لو تنص القاعدة على ذلك صراحة وهل تستعمل ألف مجردة عن الهمزة أم (ٱ) ألف عليها ص. ** لا أتفق مع تجريد العنوان المدخلة من الشكل عندما تحتمل الكلمة قراءة واحدة فقط، لأسباب: *** أن ذلك إذا غلب على ظن من أدخلها قد يكون مخطئًا فنضطر للنقل بعد ذلك. *** أن هذه القاعدة ربما تؤخر من يريد إضافة مفردة فيلتزم بالبحث هل يشاركها في الرسم مفردة أخرى أم لا. *** المشروع لا يميمز صفحات توضيح المفردات إلا بالتجريد من التشكيل فعندما يرى المستخدم عنوانا غير مشكل يظن أنها صفحة توضيح. --[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:10، الثلاثاء 7 رمضان 1447هـ (+3) 18:10، 24 فبراير 2026 (ت ع م) :إشارة @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:القلموني|القلموني]]. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:18، الثلاثاء 7 رمضان 1447هـ (+3) 18:18، 24 فبراير 2026 (ت ع م) * {{ر|حبيشان}} فيما يلي تعليقاتي على ملاحظاتك: ** <s>أوافق على استخدام (شكلات)، مع الإبقاء على (حركات) كمرادف أو لتفادي التكرار.</s> تعديل: بعد البحث وجدت أن "شكلات" غير فصيحة، بينما المستخدم هو فعلا "حركات" أو "حركات التشكيل". ** {{مض|فإننا دائما نستثني حروف المد (و، ا، ي)}} هنا عبارة "حروف المد" تفيد التوضيح بنفسها، فهي تشير إلى استثناء الحروف الثلاثة عندما -فقط- تفيد المد، بدل عبارة "الحروف" أو "حروف العلة" التي تشير إلى استثناء مطلق. لكن أوافق على إضافة التعريف الذي كتبتَه كملاحظة في الأسفل. ** صحيح أن بعض الكلمات لا يعرب بالشكلات وإنما بالحروف، فجمع المذكر السالم مثلا يضم بالواو والنون بينما ينصب ويجر بالياء والنون، لكن هذا لا يتعارض مع النقطة الثانية. لمزيد من الاتضاح سأشرح السياسة المقترحة، وهي بالمناسبة توثيق أكثر من كونها "اقتراحا جديدا": '''الأصل البسيط''' هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد، سنجد أن تطبيق هذا الأصل على الأفعال وتصريفاتها (كيفما كانت أزمنتها) وعلى الأسماء المبنية سيكون تطبيقا خاليا من أية إشكالية، لماذا؟ لأن الحرف الأخير من هذه الكلمات يقبل حركة واحدة غير متغيرة، إلا بعض الاستثناءات عندما تكون الكلمة وخصوصا الفعل في جملة، وهذا لا يعنينا فنحن نتحدث عن عناوين يعني كلمات مستقلة. من هنا فتطبيق قاعدة "الأصل" لن يجد أي إشكال ماعدا في الأسماء المعربة، لماذا؟ لأن حرفها الأخير قد يقبل أي شكلة حتا إذا كانت الكلمة مجرد عنوان، مثلا هَاتِفٌ هَاتِفُ هَاتِفًا هَاتِفَ هَاتِفٍ هَاتِفِ، هذا يجعلنا حائرين بخصوص تشكيل آخر حرف من الكلمة المعربة، من هنا عدلنا قاعدة "الأصل" لنستثني تشكيل آخر حرف من الكلمة المعربة (كيفما كانت). ما شرحته إلى حدود الآن هو ما يشكل النقط الخمسة المدونة في السياسة حاليا. وبهذا تكون السياسة سهلة تسمح لأي محرر بتطبيقها ولو لم يكن بارعا بالإعراب وتفاصيله، كل ما يلزمه هو التفريق بين الكلمة المبنية والكلمة المعربة فقط. وعليه فأنا لا أتفق مع تغيير النقطة الثانية (الأسماء المعربة) والثالثة (الأفعال) إذ لا حاجة -وليس من المفترض أصلا- لإضافة استثناءات أخرى تتعلق بالإعراب. فالمبدأ هو أن لا نضيف استثناء إلا لتفادي إشكال حاصل. ** أوافق على إضافة ملاحظة الياء المتطرفة. وبخصوص همزة الوصل فلتكن همزة قطع (مجردة من الهمزة) وتأخذ كسرة في حال تشكيلها. ** تعليقاتي أعلاه تخص الإجابة عن سؤال "فوق أية أحرف نضع الشكلات؟" أما السؤال الثاني الذي تجيب عنه السياسة هو "متى أصلا نضع شكلات في العنوان؟" والإجابة عن هذا السؤال تحتمل خيارين: 1. نضع شكلات في جميع العناوين بدون استثناء 2. نضع شكلات فقط للتمييز بين الكلمات التي لها الرسم نفسه. والسياسة حاليا تختار الجواب (2) لأنها تنطلق من الفكرة التالية: جعل ويكاموس العربي مرتبطا بمختلف النسخ الأخرى قدر الإمكان، وإذ أن أغلب النسخ خاصة الكبرى تضع مدخلات عربية دون شكلات، اتخذنا كأصل عدم وضع شكلات مطلقا، هكذا كان الأصل ثم صنعنا استثناء لغرض تجاوز إشكال واحد، والإشكال هو وجود كلمات متعددة لها الرسم نفسه (طَالِب، طَالَبَ) ثم جعلنا صفحات توضيح لنبقي على العنوان المجرد من الشكلات، هذه الطريقة أفضل بكثير من جمع الكلمات في صفحة واحدة، فذلك لا يناسب الغنى الذي تتمتع به اللغة العربية. بالنظر إلى السياسة هكذا نجد الأصل الأول الذي يعطي أولوية للعناوين المجردة من الشكلات، ثم عناوين بشكلات تكون فرعية لصفحات توضيح، هكذا يبقى القاموس مرتبطا بوصلات أنترويكي تلقائية. أما بالنسبة للمحررين فالفكرة أن يضعوا دائما عنوانا خاليا من الشكلات، لا داعي للتردد إلا إذا علموا يقينا بوجود كلمات أخرى بالرسم نفسه، أما وقوع خطإ فليس مشكلا، يكتشف محرر آخر في وقت آخر وجود كلمة أخرى فيقوم بالنقل ووضع صفحة توضيح. هذا نمو طبيعي للقاموس. من هنا، نرى مثلا أن إنشاء صفحات توضيح أمر مفيد مثله مثل إنشاء صفحة تعريف. هكذا الأمر وضحتُه لترى السياسة من وجهة نظر عامة تنطلق من أصل عناوين بدون شكلات لتعزيز وصلات إنترويكي ثم يكون الاستثناء للتمييز بين الكلمات التي لها الرسم نفسه ثم فوق هذا يكون استثناء الحرف الأخير من الكلمات المعربة. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 10:35، 26 فبراير 2026 (ت ع م) :شكرا للإشارة، بصراحة منذ أيام وأنا أريد أن أكتب تعليقا ولكن كلما راجعت المقترح واستعرضت أمثلة من المفردات أتردد وأحير ماذا أكتب، أنا أميل إلى تشكيل جميع المفردات (باستثناء حروف فالمد) عدا صفحات التوضيح التي يُفترض أنها تحتوي على مجموعة كلمات متشابهة بالرسم ومختلفة بالمعنى حسب الحركات أو الشكلات فيها فعناوينها تكون مجردة، وأما الكلمات التي لا مشابه لها مثل '''[[استعمار]]''' و'''[[استعمال]]''' و'''[[منجنيق]]''' فأرى الواجب تشكيلها لضمان عدم التكرار والخلط أو الخطأ مثل ('''[[اِستعمال]]''' و'''[[اِسْتِعْمَال]]''' مفردتان لكلمة واحدة) أو ('''[[اِسْتَعْمَلَ]]''' و'''[[استعمل]]''' مفردتان لكلمة واحدة)، وضعت تعديلات على المقترح في ([[ويكاموس:صيغة الكتابة/الحركات والتشكيل/مسودة]]) وأظن أن المقترح بحاجة لنقاش أوسع وأتمنى مشاركة الزملاء لاكتشاف الأخطاء المحتملة، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:19، 27 فبراير 2026 (ت ع م) :مرحبًا بالجميع، أنا مع {{مض|'''الأصل البسيط'''}} هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد}} مادام يوجد هناك حل التحويل والتوضيح تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 27 فبراير 2026 (ت ع م) ::{{ر|أبو هشام}} اعتماد المقترح -بعد النقاش- كسياسة رسمية هو السبيل الضامن لتفادي التكرار والخلط، فالخطأ ليس ناجما عن مقترح دون الآخر وإنما عن غياب سياسة رسمية ملزِمة. في مسودتك ألاحظ تقريبا توافقا تاما بخصوص كيفية وضع الشكلات. النقطة التي فيها خلاف هي بخصوص الكلمات المنفردة برسمها أنضع شكلات في عناوينها أم نتركها بدون شكلات. إذا اعتمدنا الصورة الحالية التي شرحتُها سيكون ويكاموس العربي مرتبطا بوصلات أنترويكي تلقائية مع باقي القواميس، بحيث كل وصلة إلى ويكاموس تكون إما صفحة توضيح (بدون حركات) أو صفحة تعريف (بدون حركات)، نظرا لكون الويكاموسات الكبرى تعتمد عناوين عربية بدون حركات مع جمع المتشابهة في صفحة واحدة -أنا أقول أن جمع متشابهات الرسم في صفحة واحدة غير متناسب مع الغنى اللغوي الذي تتمتع به العربية كما أنه سيعيق الاسترسال في التعريفات فضلا عن تقزيمه لعدد الصفحات العربية بالقاموس-. أما اقتراحك واقتراح {{ر|حبيشان}} القاضي بوضع شكلات حتى في عناوين الكلمات المنفردة برسمها فسيجعل ويكاموس معزولا نسبيا عن باقي القواميس، سيتصفح القارئ كلمات عربية في ويكاموس الإنجليزي أو الفرنسي ولن يجد وصلة أنترويكي إلى ويكاموس العربي، نأخذ على سبيل المثال كلمة استعمال وهي منفردة برسمها، لو كانت بدون شكلات "[[خاص:فرق/792168|استعمال]]" ستكون لها 14 وصلة أنترويكي مع مختلف الويكاموسات، بينما لو كانت بشكلات "[[خاص:فرق/1076577|اِسْتِعْمَال]]" فلن تكون مرتبطة بأي وصلة أنترويكي. بالمناسبة [[خاص:فرق/1071100|اِستعمال]] ينبغي دمجها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 18:52، 1 مارس 2026 (ت ع م) :::أنا أميل إلى تشكيل كلّ العناوين، لأنّ استثناءَ بعض الكلمات فيه تضاربٌ في السياسة ويؤدّي إلى ارتباك القرّاء، والمنفعةُ منه محدودة. في رأيي، مسألةُ الربط والوصلات تحتاج إلى تفكيرٍ أعمق لاقتراح حلٍّ تقني يناسب الويكاموسات التي تستعمل الحركات. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:03، 10 مارس 2026 (ت ع م) {{خلاصة}} أجريتُ '''تعديلات طفيفة''' في نص السياسة مع الإبقاء على جوهرها كما كان، يرجى مطالعة النسخة المحيّنة، أرى أن نعتمدها '''سياسة رسمية'''. النقاش يبقى دائما مفتوحا في حال وجود ملاحظات مستقبلية. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 08:11، 6 مارس 2026 (ت ع م) == أداة مراجعة معاني الأفعال == في إطار العمل على إحياء ويكاموس والربط مع ويكي بيانات (تتمة لنقاش [[ويكاموس:الميدان#قوالب جديدة + إنشاء صفحات الأفعال]])، أنشأنا أداة لمراجعة معاني الأفعال العربية ونشرها: {{وسط|https://ar-senses.toolforge.org}} يمكن الاطلاع على توثيق الأداة على [[ويكاموس:ويكي بيانات#أداة مراجعة المعاني (تجريبي)]]. تحتوى الأداة على معاني مستخلصة آليا بالبحث في 16 معجما عربيا (لسان العرب، تاج العروس، المعجم الوسيط، القاموس المحيط، وغيرها) وبالاعتماد على نموذج لغوي ضخم لتجميع المعاني وترتيبها. الهدف من الأداة هو تمكين المحررين من مراجعة المعلومات ثم نشرها في ويكي بيانات وويكاموس. بدأنا بعدد محدود من الأفعال. أرجو من الزملاء تجربتها وإبداء ملاحظاتهم، سواء على المعاني المُستخلصة أو على واجهة الأداة أو تجربة المستخدم، [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 00:58، 23 مارس 2026 (ت ع م) :إشارة إلى الزملاء النشطين في المشروع @[[مستخدم:حبيشان|حبيشان]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:Najem Ajem|Najem Ajem]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:RASHEEDYE|RASHEEDYE]] @[[مستخدم:أويس2003|أويس2003]] @[[مستخدم:ماهر الماهر|ماهر الماهر]]. شكرا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:25، 27 مارس 2026 (ت ع م) ::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] أداة رائعة، جربت عدة أمور، فقط لدي بعض الملاحظات: ::* عدم ذكر معجم الغني مصدرًا ::* عدم إمكانية انشاء وصلات داخلية في المعاني ::* عدم إمكانية إعادة إنشاء صفحة ويكاموس (الموجودة قد لا تُلبي نفس المقاييس، أو ناقصة) كما لا يمكن استخراج النموذج لديل صفحة موجودة ::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:17، 27 مارس 2026 (ت ع م) :::شكرا @[[مستخدم:Nehaoua|Nehaoua]] على التجريب وعلى الملاحظات القَيّمة. :::* مع الأسف ليس عندي معجم الغني بصيغة رقمية. :::* ملاحظة مهمة في موضوع الوصلات الداخلية. سأبحث عن حل تقني في ويكي بيانات وفي قالب {{قا|معجمية}}. :::* بالنسبة لإعادة إنشاء صفحات ويكاموس، كان أحد الاقتراحات في [https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D9%85%D9%8A%D8%AF%D8%A7%D9%86#c-%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86-20260121100000-ForzaGreen-20260117223000 النقاش السابق] هو عدم حذف المحتوى الحالي في ويكاموس. لذلك كان التركيز في تطوير الأداة على إنشاء معاني جديدة فقط، في ويكي بيانات، ثم إنشاء صفحات ويكاموس إن لم تكن موجودة. :::[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:30، 28 مارس 2026 (ت ع م) ::::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] شكرا لردك، بالنسبة لإعادة إنشاء صفحات ويكاموس، حبذا لو تُنشئ أو تفعل أداة نسخ محتوى انشاء صفحة ويكاموس وكأننا ستُنشئها من جديد، حتى يتسنى النقل اليدوي إلى الصفحة الموجودة والتعديل بما يوافق الحالة. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:25، 28 مارس 2026 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] {{تم}}. الآن في صفحات مراجعة الأفعال الموجودة سلفا في ويكاموس، والتي أُنشئت خارج الأداة، مثلا صفحة [https://ar-senses.toolforge.org/review/L1489133 أَدَّبَ L1489133]، يظهر سطر جديد: "''لمعاينة ما كانت الأداة ستنشئه لو لم تكن الصفحة موجودة في ويكاموس: (زر معاينة)''". :::::هل هذا ما قصدت ؟ [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 18:36، 28 مارس 2026 (ت ع م) ::::::مرحبًا @[[مستخدم:ForzaGreen|وائل]] بوركت، هذا ما تمنيت وقد حققته، شكرًا مرة أخرى [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:01، 28 مارس 2026 (ت ع م) ::@[[مستخدم:ForzaGreen|ForzaGreen]] عمل جبار تشكر عليه، سأجربها، وافضل أن تستعمل رابط إلى موقع تراث بدلا من موقع الشاملة، لأنه يعرض نسخة الpdf بسهولة والنسخة النصية لم تنقل جميع الاصطلاحات من النسخة المطبوعة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 02:11، السبت 9 شوال 1447هـ (+3) 23:11، 27 مارس 2026 (ت ع م) :::{{تم}}. الآن تظهر روابط موقع تراث بدل الشاملة. :::وفي موضوع ذو صلة، عدلتُ سابقا [[وحدة:Cite Q]] المستعملة في {{قا|استشهاد بويكي بيانات}} وعناصر المعاجم في ويكي بيانات، بحيث يؤدي رابط المرجع مباشرة إلى الجزء ورقم الصفحة في موقع archive.org (إن كانت طبعة المعجم متوفرة في الموقع). [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 10:31، 28 مارس 2026 (ت ع م) :أقترح وضع رابط لها في الصفحة الرئيسة لتسهيل الوصول إليها. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 23:11، الأحد 23 ذو القعدة 1447هـ (+3) 20:11، 10 مايو 2026 (ت ع م) == Request for comment (the future of Abstract Wikipedia) == <bdi lang="en" dir="ltr" class="mw-content-ltr"> Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}} You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}} [[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25، 24 يوليو 2026 (ت ع م) </bdi> <!-- الرسالة التي أرسلها User:DreamRimmer@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 --> == تحديث لوحدات الاستشهاد == يوجد تحديث جديد لوحدات الاستشهاد في الملعب يحتوى التحديث: * إضافة وسيط {{وسيط|التاريخ الهجري}} لإدخال التاريخ الهجري، مع إضافة تصنيفات للأخطاء في التاريخ أو عدم التوافق مع التاريخ الميلادي. وفي الاستشهاد بويكي بيانات بالإضافة إلى الميزة السابقة: * استيراد التاريخ الأصلي من ويكي بيانات إذا كان موجودا في عنصر العمل أو الاعتماد على تاريخ وفاة المؤلف. * تحسينات شتى وتلافي بعض الأخطاء. * اعتماد نص خاصية [ذكر كـ] دائمًا عند الوجود، حتى عند المؤلف المجهول. مع ملاحظة أن بعض الميزات الجديدة نوقشت في ويكيبديا العربية. أرجو التجربة، وهناك صفحة [[قالب:استشهاد بويكي بيانات/مختبر]] للفرق بين النسخة القديمة والجديدة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 00:15، الثلاثاء 14 صفر 1448هـ (+3) 21:15، 27 يوليو 2026 (ت ع م) :{{تم}} التحديث، أرجو الإبلاغ عن أية أخطاء. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 22:57، الاثنين 20 صفر 1448هـ (+3) 19:57، 3 أغسطس 2026 (ت ع م) == إنشاء صفحات صيغ الأفعال المُصَرَّفة == أقترح إنشاء صفحة لكل صيغة مصرَّفة من صيغ الأفعال العربية بالبوت. الوضعية الحالية: توجد اليوم نحو 7,483 صفحة صيغة أُنشئت يدويا. مثلا: [[أَكَلْتُ]]، [[يَكْتُبُونَ]]، [[اُكْتُبْ]]. تعتمد هذه الصفحات على قالب التصريف القديم. سنقتصر على الأفعال الموجودة في ويكاموس، وعددها تقريبا 7,363. مثلا توجد صفحة الفعل [[اِسْتَبْتَلَ]]، إذن سننشئ الصفحات [[اِسْتَبْتَلْتُ]]، [[اِسْتَبْتَلْنَا]]، [[اِسْتَبْتَلْتُمْ]]... بينما لا توجد اليوم صفحة [[زَمَجَ]]، وبالتالي لن ننشئ صفحاتها الفرعية. هذه أمثلة لشكل الصفحات المُقْتَرَح إنشاؤها: [[قُلْنَا]]، [[اُكْتُبِي]]، [[رَمَوْا]]، [[دَحْرَجْتُمَا]]، [[آتَتْ]]. سيكون شكل الصفحات الجديدة قريبا من النسق القديم مع بعض التحسينات: * إضافة بطاقة معلومات صيغة الفعل، وتحتوي على إحالة واضحة إلى صفحة الفعل الرئيسية ("''المعاني والشواهد والمراجع على صفحة الفعل''") والجذر ووزن الفعل ووزن الصيغة. * إضافة طريقة النطق بنظام الألفبائية الصوتية الدولية، باستعمال قالب {{قا|أصد-عر}}. * استعمال قالب التصريف الجديد {{قا|تصريف}} مع فتح الجدول تلقائيا وإظهار كل صيغ التصاريف (المبني للمجهول، المُضارع المرفوع والمنصوب والمجزوم)، ثم تأطير الكلمة بعنوان أصفر وخط غليظ لتبيين موضعها في تصريف الفعل. * إضافة التصانيف آليا. سيكون مُحتوى الصفحة بسيطا ومُولَّدا آليا لتقليل كلفة الصيانة وتركيزها في [[وحدة:ar-verb-form]] وفي قالب {{قا|صيغة فعل}}. نص الويكي فيه سطران لا غير: <pre> == {{اللغة|عربية}} == {{صيغة فعل|جذر=أكل|وزن=فعَل يفعُل}} </pre> وهذا يُوَلِّد كل الفقرات. توجد إمكانية توليد الفقرات منفصلة (انظر شرح {{قا|صيغة فعل}})، كما في صفحة [[اِرْمِ]]، لمن أراد إضافة محتوى آخر بين الفقرات، مع أننا ننصح بإبقاء هذه الصفحات بسيطة وثانوية، وكتابة المعاني والأمثلة في صفحة الفعل الرئيسية. سأنشئ وأعدل الصفحات، باستعمال البوت {{مس|ForzaGreenBot}}، على مراحل: * إنشاء صيغ الأفعال المبنية للمعلوم لكل الأفعال الموجودة في ويكاموس => ستكون النتيجة تقريبا 200 ألف صفحة جديدة. * تعديل صفحات صيغ الأفعال الموجودة => تعديل حوالي 7 آلاف صفحة. * زيادة عدد [[نقاش الوحدة:ar-verb/مختبر|اختبارات]] [[وحدة:ar-verb]] للتأكد من صحة تصريفات المبني للمجهول. نُشير إلى أن [[نقاش الوحدة:ar-verb/مختبر|مختبر]] الوحدة يحتوي حاليا على أكثر من 230 اختبارا للتأكد من صحة خوارزمية التصريف. * إنشاء الصيغ المبنية للمجهول => بضع عشرات الآلاف من الصفحات. * كُلَّما أُضيفت أفعال جديدة إلى ويكاموس، تُنشأ صفحات تصريفاتها. ولاحقا، إنشاء هذه الصفحات آليا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:38، 3 أغسطس 2026 (ت ع م) :إشارة إلى الزملاء الإداريين وإلى النشطين في المشروع: @[[مستخدم:Nehaoua|Nehaoua]]، @[[مستخدم:Najem Ajem|Najem Ajem]]، @[[مستخدم:حبيشان|حبيشان]]، @[[مستخدم:Avicenno|Avicenno]]، @[[مستخدم:Ajwaan|Ajwaan]]، @[[مستخدم:أبو هشام|أبو هشام]]، @[[مستخدم:إسلام|إسلام]]، @[[مستخدم:رِفْد|رِفْد]]، @[[مستخدم:نور إسماعيل|نور إسماعيل]]. شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:53، 13 أغسطس 2026 (ت ع م) ::{{أتفق}} [[مستخدم:Avicenno|Avicenno]] ([[نقاش المستخدم:Avicenno|نقاش]]) 19:43، 13 أغسطس 2026 (ت ع م) {{أتفق}} وداعم للمهمة، سلمت الأيادي.--[[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 09:34، 5 أغسطس 2026 (ت ع م) {{تعليق}} بدايًة أشكر جميع الجهود ولدي تساؤل بخصوص المقترح، هل من المجدي تخصيص صفحة مستقلة فقط لنبيّن أن هذه اللفظة تصريف كذا كذا للفعل كذا «بالإضافة لباقي التصريفات»، لا أدري، لكن أرى جدول تصريفات يُغني عن ذلك في صفحة الفعل، الإ أن تكون المشقتة لها معنىً مستقل، مثال [[مَكْتُوب]]، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:23، 11 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:Mdktb|Mdktb]] على التعليق. ملاحظة وجيهة، وقد كان لي نفس التساؤل لما اكتشفت تفاصيل ويكاموس. في الحقيقة، انطلقت من ما هو موجود في المشروع وفي سياساته (مثلا [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]])، وافترضت أن الموضوع نُوقش واتُفق على إنشاء هذه الصفحات. لاحظت كذلك أن مجتمعات اللغات الأخرى تعتمد كذلك هذه الصيغة، وهذه أمثلة من ويكاموس الإنجليزي: [[:en:كتبتم]] والإسباني: [[:es:escribimos]] والفرنسي: [[:fr:parlons]]. :في رأيي هذا الموضوع يتجاوز المُقترح الذي قدَّمتُه، وإعادة النظر فيه سيتطلب فتح نقاش جديد لتعديل السياسات الرسمية. تحياتي. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:14، 12 أغسطس 2026 (ت ع م) ::العفو @[[مستخدم:ForzaGreen|ForzaGreen]]، ربما كحل وسط أن يجري تقسيم تنفيذ المقترح لمراحل ويكون تركيز المقترح بدايًة على الألفاظ التي تحمل معانً يمكن إيرادها في صفحة التصريف، على أن يبقى النقاش مفتوحًا لتقدير جدوى إنشاء صفحات مستقلة لباقي التصريفات، يعني مثلا تتبعت تصريفات الفعل الماضي المبني للمعلوم «كتب» مع صيغة المخاطب، وفي الواقع وجدت المحتوى مجرد وصف لموضع اللفظة في جدول التصريفات، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 16:28، 12 أغسطس 2026 (ت ع م) :::حاليا لا توجد صيغ مُصَرَّفة تحمل معانٍ في صفحاتها، وإن كان، فذلك استثناء ونادر جدا. وفي الاقتراح أعلاه، فضَّلتُ إبقاء كل المعاني في صفحة الفعل الرئيسية، والإحالة دائما بوضوح إليها، حتى لا تتشتت المعلومات بين الصفحات. وسيبقى الباب مفتوحا لتعديل ما يظهر في هذه الصفحات الثانوية. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 08:59، 13 أغسطس 2026 (ت ع م) ::::كنت أقصد معنىً متعلق بالاشتقاق نفسه، مثلا مكتوب تأتي بمعنى رسالة، وأود الإشارة لمسألة اعتدنا عليها في المشاريع الشقيقة، وهي أن الإنشاء البوتي الكمّي لمحتوى ما لا يعامل معاملة الإنشاء المتفرّق لذات المحتوى، ولو كانت طبيعة المحتوى نفسه غير مخالفة، المقصد أنه يخضع لنقاش وتقييم أطول عادًة، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 17:17، 13 أغسطس 2026 (ت ع م) {{تعليق}} مرحبا وشكرا للإشارة، بصراحة الرقم المذكور في بداية النقاش كبير جدا (200 ألف صفحة لتصريفات الأفعال) يدعو لإعادة التفكير قبل البدء بتنفيذ المهمة، خصوصا أن هذه الصفحات ستكون صفحات قصيرة شبه فارغة ولا تذكر سوى وصف التصريف، وعددها أكبر من صفحات محتوى ويكاموس بثلاثة أضعاف تقريبا، لكن لأن سياسة ويكاموس لا تعارض أو تمنع إنشاء مثل هذه الصفحات فلا يمكن رفض المقترح، كما لا يمكن قبوله دون تمعّن ونقاش حقيقي موسّع ينظر في جوانب المقترح كلها، هل ستكون لهذه الصفحات فائدة حقيقية؟ هل يمكن تطويرها أو توسيعها مثلا؟ هل يمكن إنشاء قالب يشرح التصريفات المتعلقة بكل فعل ويوضع في صفحته؟ عذرا للإطالة وأدعو إلى مشاركة أكثر في النقاش، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:16، 13 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:أبو هشام|أبو هشام]] على التعليق. نعم يُمكن تطوير وتوسيع هذه الصفحات، لكن رأيي أن نتفادى ذلك ونُركز كل المعلومات في صفحة الفعل الأساسية. :أما عن فائدة هذه الصفحات، فهذا موضوع يخص سياسات المشروع، وتعديلها يحتاج نقاشا خارج موضوع المُقترح. فالخيارات الحالية ثلاثة: :# إما أن نعمل بالسياسات الحالية وبالتالي نُنشئ الصفحات. وهذا رأيي. :# وإما أن نُعدِّل السياسة بعد نقاش مستقل يُفضي إلى عدم جدوى هذه الصفحات. وفي هذه الحالة نحذف الصفحات الموجودة، وعددها حوالي 7 آلاف صفحة. :# وإما أن نُبقي الأمور جامدة كما هي عليه دون إنشاء الصفحات، وهذا يعني وجود تناقض بين السياسات وواقع المشروع، وهذا أسوأ الخيارات. :شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 16:02، 13 أغسطس 2026 (ت ع م) ::مرحبا وائل، قد يُفهم من تعليقي أني أعترض على المهمة وأنا لست معترضا فعلا، لكني أدعو إلى مشاركة أكبر في النقاش وطرح أفكار قد تعود بفائدة على المشروع، لذلك أنا مؤيد للمهمة ومستعد للمشاركة في مراجعة المفردات التجريبية والتأكد من سلامتها، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:39، 15 أغسطس 2026 (ت ع م) * {{تعليق}} أتفق مع إنشاء الصفحات آليا، لكن أعتقد أن الصفحات يجب أن يتسع محتواها أكثر من المثال الحالي. مثال: إضافة قالب يحتوي على معاني وأمثلة الفعل الماضي المبني للمعلوم. كذلك يمكن إضافة قالب يحتوي على زر يتيح للقارئ أو المحرر إضافة أمثلة لصيغة الفعل المصرفية. تحياتي لكم.--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:19، 16 أغسطس 2026 (ت ع م) *:محتوى الصفحات المُقترحة قابل للاتساع، ويستطيع المُحرر إضافة أمثلة أو أي محتوى آخر. تحياتي. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 07:53، 17 أغسطس 2026 (ت ع م) == اضافة اسم مستعار مختصر لنطاق ويكاموس == تحياتي لكم، حاليًا المشروع بدون اسم مستعار ومختصر لنطاق المشروع «ويكاموس»، مثلا <code>WT:</code> في النسخة الإنجليزية أو كما في باقي المشاريع العربية الشقيقة مثال <code>وب:</code> في ويكيبيديا العربية «للتوضيح: [[w:وب:ترحيب بالقادمين الجدد|وب:ترحيب بالقادمين الجدد]]»، وعليه اقترح اضافة اختصار مناسب ويفضّل غير مستعمل في المشاريع الشقيقة مثل <code>وس:</code>، أو أي اقتراح آخر مناسب، «تنويه: <code>وم:</code> مستعملة في ويكي مصدر، <code>وق:</code> مستعملة في ويكي الاقتباس» تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:48، 14 أغسطس 2026 (ت ع م) :مرحبا {{ر|Mdktb}} وشكرا لطرح الموضوع، أتفق وليكن الاقتراح الأول <code>وس:</code>، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:58، 14 أغسطس 2026 (ت ع م) :{{أتفق}} [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 17 أغسطس 2026 (ت ع م) :{{تعليق}} أرى أنه ليس من الضروري للاختصار أن يكون مغايرا عن اختصارات المشاريع الأخرى، وإن كان هذا محببا، إذ المشاريع في نهاية المطاف تتمتع بنوع من الاستقلالية. أنا أقول هذا لأن المجتمع هنا دَرج على استخدام الاختصار <code>وق:</code> كما في ويكي الاقتباس، منذ 2014 على الأقل. فيما يلي أمثلة، وإن كانت هذه الاختصارات لازالت على شكل تحويلات اعتيادية: [[وق:الميدان]]، [[وق:تشكيل]]، [[وق:تخريب]]، [[وق:ملعب]]. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 18:47، 22 أغسطس 2026 (ت ع م) == تحديث قالب رأس صفحة نقاش == مرحبا بالزملاء، أقترح تحديث قالب {{قا|رأس صفحة نقاش}} ليعرض الأرشيف عندما يكون موجودا كما في ويكيبيديا، شكرا لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:06، 15 أغسطس 2026 (ت ع م) :{{نفذ}}. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:24، 15 أغسطس 2026 (ت ع م) == ترقيم تسلسل الاستشهادات المكررة بالحروف بدلا من الأرقام كويكيبيديا == حاليا تسلسل الاستشهادات المكررة بأرقام كسرية فأقترح جعلها بحروف الجمل كويكيبيديا العربية، مثل<ref name="r1">الاستشهاد الأول</ref> وهذا الآخر<ref name="r1"/> [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:17، الاثنين 4 ربيع الأول 1448هـ (+3) 18:17، 17 أغسطس 2026 (ت ع م) {{مراجع}} إشارة إلى النشطين {{ر|Najem Ajem|Nehaoua|أبو هشام|Mdktb|ForzaGreen}}--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:38، الاثنين 4 ربيع الأول 1448هـ (+3) 18:38، 17 أغسطس 2026 (ت ع م) :{{أتفق}}. شكرا لك. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:31، 17 أغسطس 2026 (ت ع م) :{{أتفق}} وشكرا لجهودك. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:23، 17 أغسطس 2026 (ت ع م) :{{أتفق}} شكرا لك مسبقًا [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:03، 17 أغسطس 2026 (ت ع م) :{{أتفق}} اقتراح مفيد ومشكور --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 12:22، 18 أغسطس 2026 (ت ع م) 5we6zb58qzgbtgj86qek49z0misjz6x 1099188 1099185 2026-08-22T19:04:16Z Najem Ajem 20465 /* */ أرشفة: ويكيبيديا المجردة 1099188 wikitext text/x-wiki {{/مقدمة}}__فهرس__ == تشكيل عنوان المقالة في ويكاموس العربي والنسخ اللغوية الأخرى == يعتمد ويكاموس العربي تشكيل اسم الصفحة باعتبار أنه مع اختلاف التشكيل فإننا المفردة مختلفة عن أختها، لكن أغلب النسخ اللغوية الأخرى ومن أهمها الإنجليزي تعتمد اسم الصفحة بدون تشكيل وتجمع جميع المفردات التي تشترك في نفس رسم الكلمة بدون تشكيل في صفحة واحدة. ;تأثير هذا الاختلاف: يؤثر هذه الاختلاف بين النسخ اللغوية في الربط بين النسخ اللغوية المختلفة لأن الربط يكون باسم الصفحة وإذا وجدت صفحة مشكلة وصفحة غير مشكلة فإنهما صفحتان مختلفتان لذا فإنها لا تربط لا حظ مثلا صفحة [[قَتَلَ]] تجد أنها مربوطة مع النسخة الفرنسية فقط ولكن افتح صفحة [[:en:قتل]] تجد أنها مربوطة ب 25 نسخة لغوية، وهذا يؤثر على الاستفادة من المحتوى العربي في ويكاموس العربي بشدة. لذا فأرجو إعادة النظر في منهجية تشكيل اسم الصفحةة في ويكاموس، وهذا نقاش مفتوح وكل يذكر ما يراه صوابا مع الأسباب، وقد فتحت نقاشا في مجموعة التلجرام فتبين أن ويكاموس الفرنسي والإيطالي يلتزمان بالتشكيل في عنوان الصفحة. وهذا الأمر يستوجب وجود سياسة عالمية لأنها تحدد الربط بين المشاريع. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 08:54، 17 نوفمبر 2025 (ت ع م) :[[ويكاموس:الميدان/أرشيف/2017#مفردات ويكاموس|نقاش سابق]]، إشارة إلى المشاركين فيه @[[مستخدم:أحمد ناجي|أحمد ناجي]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:أسامة الجزري|أسامة الجزري]] @[[مستخدم:ميسرة|ميسرة]] @[[مستخدم:أبو آسر|أبو آسر]] @[[مستخدم:يوسف عاشق الجبل|يوسف عاشق الجبل]]. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 12:03، 17 نوفمبر 2025 (ت ع م) ::@[[مستخدم:حبيشان|حبيشان]] أنا مؤيد لإزالة التشكيل من العناوين وإضافة المفردات المشكلة المرجوة لذات الصفحة لتسهيل الوصول إلى المفردة والمفردات ذات الصلة وهذا المعمول به في المواد غير العربية ومخالفة المواد العربية يعسر البحث. مثلا عندنا [[أَكْل]] و[[أَكَلَ]] لكن في المفردات غير العربية عندنا مادة واحدة لاسم ولفعل ولصفة مثل [[present]]، فأقترح إزالة التشكيل في العناوين وكتابة المفردات المرجوة في الصفحة ومنها اشتقاقات الجذر ولتزل صفحات التوضيح. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 22:24، 17 نوفمبر 2025 (ت ع م) ::هذا النقاش يثار كلما جاء وفد من ويكيبيديا وقارن ويكاموس العربي بالنسخ اللغوية الأخرى. ويكاموس العربي يعتمد على صفحات التوضيح منذ زمن بعيد، وهي كفيلة بربط هذه النسخة مع باقي النسخ الأخرى، مثلا صفحة [[قتل]] مربوطة ب25 نسخة، وصفحة [[كتب]] ب24 نسخة، وكذا صفحة [[نظر]] مرتبطة ب19 نسخة. فإذا كنت تدعم العناوين بدون تشكيل فهو أمر معمول به أصلا (صفحات التوضيح) وإذا كنت تريد أن نزيل الوصلات ونجمع المحتويات كلها في صفحة واحدة فهذا لن يزيد من الربط، بل سيبقى الربط كما هو. أصلا لا توجد مشكلة في الربط، بل المشكلة في النقص العددي لصفحات ويكاموس، حتى أن صفحة [[ربط]] غير موجودة لحظة كتابتي لهذا التعليق. أقول أنه ليس على ويكاموس العربي أن يتبع ويكاموس الإنجليزي أو الفرنسي، إذا فكرنا من وجهة نظر موضوعية، فإن الأصل هو وجود صفحة واحدة لكل كلمة، [[قَتَلَ]] ليست هي نفسها [[قَتَّلَ]] أو [[قَتْل]]، لذا وجود صفحات مستقلة هو أمر طبيعي وجيد ويُتيح إمكانية التفصيل في شرح مختلف المعاني. ثم مع هذا توجد صفحة التوضيح [[قتل]] (بدون تشكيل) التي تكون مرتبطة مع مختلف النسخ اللغوية. '''هذا ليس عيب، بل ميزة معمول بها منذ زمن طويل'''. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 17 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Najem Ajem|Najem Ajem]] لا أرى ميزة إضافية لفصل المفردات حسب شكلها إلا زيادة عدد الصفحات، بينما نخسر مميزات إضافية ذكرتها أدنا. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:21، 22 نوفمبر 2025 (ت ع م) ::أتفق مع الزميل @[[مستخدم:Najem Ajem|الناجم العاجم]] في الحفاظ على أسماء الصفحات بالتشكيل، مع وجود صفحات التوضيح. أُضيف إلى ما قيل: في المستقبل نُريد ربط صفحات ويكاموس مع الوحدات المُعجمية في ويكي بيانات، وهذا سيكون أسهل إذا كانت الصفحات مُستقلة. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:23، 20 نوفمبر 2025 (ت ع م) :::@[[مستخدم:ForzaGreen|ForzaGreen]] الصفحة في ويكاموس تقبل جميع اللغات التي تستعمل نفس رسم الكلمة، بينما المعجمية في ويكي بيانات مقيدة بلغة معينة، فالربط لا يمكن أن يتم آليا، فما دام يدويًا فلا ميزة إضافية لفصل الكلمات حسب شكلها في صفحات مستقلة. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:18، 22 نوفمبر 2025 (ت ع م) :: {{ضد}} التشكيل ضرورة حتمية في المعاجم، ووجود نفس الرسم في معاجم أخرى يُعدّ جهدًا ضائعًا (إذ تصبح صفحة الكلمة مكررة بعدّة لغات، ولا أعلم ما الفائدة!). الأصل أن تُربط المفردة بما يقابلها بالترجمة، لا بالرسم. الأمر نفسه ينطبق على الكلمات غير العربية (أو على الأقل غير المنطوقة بلهجات عربية) في ويكاموس العربي؛ فوجودها مكررة في عدّة معاجم بلغات أخرى لا فائدة منه. منذ مدة وأنا أفكر في طريقة لربط الكلمات بين المعاجم اللغوية، ووجدت — حتى الآن — أن قسم الترجمة يمكنه القيام بذلك، لكنه بدوره يحتاج إلى ربط آلي. تحياتي --[[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> ::: {{ر|Nehaoua}} لن نفقد التشكيل عندما نجمع المفردات المتفقة في الرسم في صفحة واحدة، فستكون المفردات في عناوين فرعية وهي المسماة في ويكاموس الإنجليزي headwords، وكل نسخ ويكاموس متعددة لغات المفردات، فالمفردات العربية موجودة (أو لها أن تكون موجودة) في كافة النسخ اللغوية الأخرى، وللأسف المفردات العربية في ويكاموس الإنجليزي أكثر من العربي.--[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:26، 22 نوفمبر 2025 (ت ع م) :::مرحبًا @[[مستخدم:حبيشان|حبيشان]] رسمُ الكلمةِ العربية لا يكون مكتملًا إلا بالتشكيل، وكلُّ صيغةٍ مشكلة تُعدّ مفردة مستقلة، حتى ولو اشتركت في الرسم، لأن اختلاف التشكيل يؤدي إلى اختلافٍ في المعنى والمغزى. ولا يمكن القياس على الإنجليزية، فهي تعتمد على [[w:صائت|الصوائت]] التي تُميّز بين الكلمات (والمقابل لها في اللغة العربية الحركات الثلاثة -الفتح والكسر والضم-)، مثل: :::*[https://en.wiktionary.org/wiki/pin pin] (دبوس) :::*[https://en.wiktionary.org/wiki/pun pun] (تورية) :::*[https://en.wiktionary.org/wiki/pan pan] (مِقلاة) :::ولا تُعدّها الإنجليزية مفردة واحدة. :::أمّا ما ذُكر من أن {{مض|المفردات العربية في ويكاموس الإنجليزي أكثر من العربي}}} فهذا – في الواقع – مثال واضح على الجهد الضائع، إذ تُكرَّر الصفحات في معاجم أخرى بدل تطوير النسخة العربية ذاتها. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:55، 23 نوفمبر 2025 (ت ع م) ::::@[[مستخدم:Nehaoua|Nehaoua]] لابد من تشكيل المفردة عند ذكرها والشرح، وليس هذا محل خلاف، ولا خلاف أن الاختلاف في التشكيل غالبا يعني مفردة مختلفة، لكن النقاش عن جمع المفردات في صفحة واحدة وفقا لرسمها المجرد من التشكيل، فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتففق في الحروف في مدخل واحد، وهذا الطريقة المتفردة تفقد ويكاموس العربي بعض المميزات التقنية، بعض الميزات الأخرى التي ذكرتها. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 07:36، 24 نوفمبر 2025 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] عفوًا pin وpun وpan من جدوز مختلفة لا علاقة لها ببعض. كل واحدة free base morpheme لا صلة لها بالأخرى. أما عن الحركات العربية فهي تعود لجذر واحد فلا تصح المقارنة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 08:29، 24 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Nehaoua|Nehaoua]] أيضا لا يمكن حصر التشكيل مقابلًا للصوائت لأن منها short vowel sounds ومنها long vowel sounds التي هي أقرب إلى حروف العلة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:26، 24 نوفمبر 2025 (ت ع م) ::::::مرحبًا @[[مستخدم:كريم رائد|كريم رائد]] لا يوجد مفهوم الجذر في الإنجليزية، وأنا متفق أنه {{مض|لا تصح المقارنة}} لأن الطلب اصلا مبني على المقارنة! تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:39، 24 نوفمبر 2025 (ت ع م) :::::::@[[مستخدم:Nehaoua|Nehaoua]] بل يوجد؛ طالع إن شئت Root (linguistics) ومقارنتك تشكيل العناوين بتلك المفردات في غير محلها لأن كل من هذه المفردات له معنى مختلف وجذره مختلف. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:09، 24 نوفمبر 2025 (ت ع م) ::::::::@[[مستخدم:كريم رائد|كريم رائد]] تمتاز اللغات السامية بأنها جذرية واشتقاقية؛ إذ يمكن اشتقاق مئات الكلمات من الجذر الواحد بتغييرات بسيطة ومنها التشكيل، في حين أن الـ '''Root '''في اللغات الأخرى يتغيّر عادةً بإضافة السوابق واللواحق (أمور معروفة لا تحتاج لإطالة). ::::::::{{مض|ومقارنتك تشكيل العناوين بتلك المفردات في غير محلّها}}، لأن المقصود هو أن التشكيل في العربية يوافق الصوائت؛ فالفتحة تقابلها "A"، والضمة "O"، والكسرة "I"، وهذا تحديدًا ما أردتُ مقارنته (وأعتذر عن إعادة ما سبق أن قلتُه). ::::::::وأكتفي هنا حتى لا يتحول النقاش إلى جدال. وفي النهاية، ما الفائدة من جمع تعريفات جميع معاني الرسم «عبر» في صفحة واحدة، من جمع [[عِبْرَة|لعِبرة]] إلى الفعل [[عَبَرَ|عَبَرَ]] وغيرها؟ ::::::::أكتفي بهذا القدر وقد بيّنتُ وجهة نظري. تحياتي. [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:24، 24 نوفمبر 2025 (ت ع م) :::::مرحبًا @[[مستخدم:حبيشان|حبيشان]]، :::::* {{مض|ولا خلاف أن الاختلاف في التشكيل غالبًا يعني مفردة مختلفة}} فكلُّ اختلافٍ في التشكيل يُنتج مفردةً مختلفة، وبالتالي مدخلة مختلفة. :::::* {{مض|النقاش عن جمع المفردات في صفحة واحدة وفقًا لرسمها المجرَّد من التشكيل}} وصفحات التوضيح تكفي في هذا الباب. :::::* {{مض|فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتفق في الحروف في مدخل واحد}} لا تتبع جميع المعاجم هذا النهج، فالمعجم الوسيط مثلًا لم يجمع كل المفردات ذات الرسم الواحد؛ انظر مثلًا مدخل: [https://shamela.ws/book/7028/640#p1 «عين»]، حيث تكرّرت عدة مرات، وبينها تعريفات لكلمات مختلفة الرسم. وكذلك نحن نعمل في مشروع لا يقتضي النسخ الحرفي للمطبوع. :::::* {{مض|وهذه الطريقة المتفردة تفقد ويكاموس العربي بعض المزايا التقنية}} إن اختلاف الرسم والمفردات في العربية أمرٌ أصيل، ووجود صعوبات تقنية حالية لا يبرّر تقليل شأن اللغة أو التخفيف من خصائصها؛ فقد كانت كتابة العربية يومًا ما مستحيلة تقنيًا، ولو اتبعنا المنطق نفسه لكتبناها اليوم بالأحرف اللاتينية. :::::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:09، 24 نوفمبر 2025 (ت ع م) === مميزات جمع المفردات في صفحة واحدة إذا اتفقت في رسهما الخالي من التشكيل === # أولا بالنظر إلى معاجمنا العربية الأصيلة فيهم تجمع المفردات لأكثر من ذلك فكل المفردات تحت جذر واحد تجمع في مدخل واحد في المعجم العربي بل بعض المعاجم تضم إليها التقاليب (جبذ، جذب، بجذ...)، فالجمع المقترح أقرب إلى العمل المعمول به في معاجمنا من الطريقة الحالية. # كثير من الكلمات العربية يكون فيها أكثر من وجه في الضبط لدينا مثلا كلمة «إِصبَع» فيها تسع لغات حيث يجوز في أولها وثالثها الحركات الثلاث، فعلى هذا سيكون للأصبع 9 صفحات وهي مفردة واحدة ولكن فيها عدة أوجه أو لغات، وكثير من مفردات اللغة يجوز في حرف من حروفها أكثر من حركة ( ومنها باب المثلث في اللغة)، لذا فجمعها في صفحة أيسر في الوقوف على الفائدة، وأبعد من إيهام التغاير. # أن القارئ ربما يريد أن يستفيد ما هو الضبط الصحيح لكلمة معينة، وجود أكثر من عنوان مشكولة يؤخره في البحث عن الكلمة. # أن القارئ لا يستطيع أن يصل بسهولة من صفحة مفردة إلى ما يقابلها في اللغات الأخرى فيحتاج أن ينتقل غلى صفحة توضيح أو أن يبحث عنها. # نفس الشيء بالنسبة للقارئ في النسخ الأخرى الذي يرغب أن يطلع على النسخة العربية. --[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:15، 22 نوفمبر 2025 (ت ع م) :{{ر|حبيشان}} :# نحن في قاموس إلكتروني، حيث تتوفر الوصلات وصناديق البحث، لماذا سنتبع طريقة الكتب القديمة. :# عندما يكون للكلمة الواحدة أكثر من تهجئة واحدة، فحينئذ نضع صفحة تحتوي على المعنى، وصفحات أخرى تحوّل أو توصل إليها، مع ذكر هذه الملاحظة في صفحة المعنى. وهذا طبيعي جدا حتى أن النسخ الأخرى تقوم بالأمر نفسه، مثلا في ويكاموس الإنجليزي صفحة [[:en:colour|colour]] لا تحتوي على المعاني، ذكروا فقط أنها تهجئة مختلفة للكلمة [[:en:color|color]]. :# النقطة 2 تفيد أيضا في حال وجود تهجئات خاطئة وشائعة. :# من المفترض أن تحتوي الصفحات على قالب {{قا|أيضا}} في الأعلى، ويشير إلى صفحة التوضيح (التي تتضمن الكلمات التي لها الرسم نفسه) كما هو معمول به في النسخ الأخرى. :# القارئ من النسخ الأخرى سيجد صفحة التوضيح من خلال وصلات الأنترويكي. بالمناسبة العناوين بالتشكيل موجودة في نسخ أخرى غير العربية. :[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 22 نوفمبر 2025 (ت ع م) * في الوضع الحالي وبعد ترتيب المفردات في التصانيف، فلا بأس عندي ببقاء عناوين المشكلة، مع الآتي: ** تنقيح تعليمات [[ويكاموس:صيغة الكتابة/الحركات والتشكيل|تشكيل العناوين]] ووسمها سياسةً لكي تكون ملزمة. ** جعل إنشاء صفحات التوضيح (بدون شكل) آليا عبر بوت، وكذلك الوصلة إليها من صفحات المفردات المشكلة.--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 18:08، الأربعاء 2 شعبان 1447هـ (+3) 15:08، 21 يناير 2026 (ت ع م) :{{ر|حبيشان}} راجعتُ صفحة [[وق:تشكيل|تشكيل العناوين]]، وجعلت القواعد أكثر وضوحا، يرجى إلقاء نظرة عليها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:09، 22 يناير 2026 (ت ع م) ::مرحبًا @[[مستخدم:Najem Ajem|Najem Ajem]] شكرًا لتوضيحك [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:49، 28 يناير 2026 (ت ع م) === نقاش حول [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]] (مقترح سياسة) === * {{ر|Najem Ajem}} اعتذر عن تأخري بالرد بسبب انشغالي بالخارج، المقترح فيه بعض القصور، وايضا هناك [[خاص:فرق/1076134|تغيير محوري]] أضيف بعد الخلاصة لم يناقش بالمرة، لذا أرجو حذف الخلاصة والعودة إلى النقاش، وهذه الملاحظات على الصيغة الحالية: ** تغير كلمة (حركات) إلى (شكلات)، لأن الشدة ليست حركة وكذلك السكون عند البعض. ** توضح أحرف المد بـ (وهي الألف (ا) مطلقا، والواو (و) الساكنة المضموم ما قبلها، والياء (ي) الساكنة <s>المضموم</s> المكسور ما قبلها). ** اقترح تعديل النقطة الثانية إلى: ::: {{مض|يترك محل الإعراب (آخر الكلمة المفردة) في الكلمات المعربة بالحركات بدون حركة أو سكون -وتبقى الشدة إذا كان مشددًأ-؛ لأن حركته تتغير حسب موقع الكلمة في الجملة}} وعليه فإن «مُعَلِّمُونَ» تشكل النون وإن كانت آخر الكلمة لأن معلمون تعرب بالحروف. ::: بتعديل هذه النقطة نسنغني عن النقاط بعدها إلا إذا قصد بها التوضيح. ** في نقطة الأفعال يفهم منها أنه يجب شكل آخر المضارع ولكنه معرب والأولى أن يشمله ما يشمل الأسماء لذلك أقترحت هنا أن تكون النقطة عامة للأسماء والأفعال واستخدمت مصطلح (الكلمات). ** لو ينص على وجوب نقط الياء المتطرفة تمييزا لها عن الألف المطوية. ** ماذا عن همزة الوصل هل تشكل أم لا، لو تنص القاعدة على ذلك صراحة وهل تستعمل ألف مجردة عن الهمزة أم (ٱ) ألف عليها ص. ** لا أتفق مع تجريد العنوان المدخلة من الشكل عندما تحتمل الكلمة قراءة واحدة فقط، لأسباب: *** أن ذلك إذا غلب على ظن من أدخلها قد يكون مخطئًا فنضطر للنقل بعد ذلك. *** أن هذه القاعدة ربما تؤخر من يريد إضافة مفردة فيلتزم بالبحث هل يشاركها في الرسم مفردة أخرى أم لا. *** المشروع لا يميمز صفحات توضيح المفردات إلا بالتجريد من التشكيل فعندما يرى المستخدم عنوانا غير مشكل يظن أنها صفحة توضيح. --[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:10، الثلاثاء 7 رمضان 1447هـ (+3) 18:10، 24 فبراير 2026 (ت ع م) :إشارة @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:القلموني|القلموني]]. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:18، الثلاثاء 7 رمضان 1447هـ (+3) 18:18، 24 فبراير 2026 (ت ع م) * {{ر|حبيشان}} فيما يلي تعليقاتي على ملاحظاتك: ** <s>أوافق على استخدام (شكلات)، مع الإبقاء على (حركات) كمرادف أو لتفادي التكرار.</s> تعديل: بعد البحث وجدت أن "شكلات" غير فصيحة، بينما المستخدم هو فعلا "حركات" أو "حركات التشكيل". ** {{مض|فإننا دائما نستثني حروف المد (و، ا، ي)}} هنا عبارة "حروف المد" تفيد التوضيح بنفسها، فهي تشير إلى استثناء الحروف الثلاثة عندما -فقط- تفيد المد، بدل عبارة "الحروف" أو "حروف العلة" التي تشير إلى استثناء مطلق. لكن أوافق على إضافة التعريف الذي كتبتَه كملاحظة في الأسفل. ** صحيح أن بعض الكلمات لا يعرب بالشكلات وإنما بالحروف، فجمع المذكر السالم مثلا يضم بالواو والنون بينما ينصب ويجر بالياء والنون، لكن هذا لا يتعارض مع النقطة الثانية. لمزيد من الاتضاح سأشرح السياسة المقترحة، وهي بالمناسبة توثيق أكثر من كونها "اقتراحا جديدا": '''الأصل البسيط''' هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد، سنجد أن تطبيق هذا الأصل على الأفعال وتصريفاتها (كيفما كانت أزمنتها) وعلى الأسماء المبنية سيكون تطبيقا خاليا من أية إشكالية، لماذا؟ لأن الحرف الأخير من هذه الكلمات يقبل حركة واحدة غير متغيرة، إلا بعض الاستثناءات عندما تكون الكلمة وخصوصا الفعل في جملة، وهذا لا يعنينا فنحن نتحدث عن عناوين يعني كلمات مستقلة. من هنا فتطبيق قاعدة "الأصل" لن يجد أي إشكال ماعدا في الأسماء المعربة، لماذا؟ لأن حرفها الأخير قد يقبل أي شكلة حتا إذا كانت الكلمة مجرد عنوان، مثلا هَاتِفٌ هَاتِفُ هَاتِفًا هَاتِفَ هَاتِفٍ هَاتِفِ، هذا يجعلنا حائرين بخصوص تشكيل آخر حرف من الكلمة المعربة، من هنا عدلنا قاعدة "الأصل" لنستثني تشكيل آخر حرف من الكلمة المعربة (كيفما كانت). ما شرحته إلى حدود الآن هو ما يشكل النقط الخمسة المدونة في السياسة حاليا. وبهذا تكون السياسة سهلة تسمح لأي محرر بتطبيقها ولو لم يكن بارعا بالإعراب وتفاصيله، كل ما يلزمه هو التفريق بين الكلمة المبنية والكلمة المعربة فقط. وعليه فأنا لا أتفق مع تغيير النقطة الثانية (الأسماء المعربة) والثالثة (الأفعال) إذ لا حاجة -وليس من المفترض أصلا- لإضافة استثناءات أخرى تتعلق بالإعراب. فالمبدأ هو أن لا نضيف استثناء إلا لتفادي إشكال حاصل. ** أوافق على إضافة ملاحظة الياء المتطرفة. وبخصوص همزة الوصل فلتكن همزة قطع (مجردة من الهمزة) وتأخذ كسرة في حال تشكيلها. ** تعليقاتي أعلاه تخص الإجابة عن سؤال "فوق أية أحرف نضع الشكلات؟" أما السؤال الثاني الذي تجيب عنه السياسة هو "متى أصلا نضع شكلات في العنوان؟" والإجابة عن هذا السؤال تحتمل خيارين: 1. نضع شكلات في جميع العناوين بدون استثناء 2. نضع شكلات فقط للتمييز بين الكلمات التي لها الرسم نفسه. والسياسة حاليا تختار الجواب (2) لأنها تنطلق من الفكرة التالية: جعل ويكاموس العربي مرتبطا بمختلف النسخ الأخرى قدر الإمكان، وإذ أن أغلب النسخ خاصة الكبرى تضع مدخلات عربية دون شكلات، اتخذنا كأصل عدم وضع شكلات مطلقا، هكذا كان الأصل ثم صنعنا استثناء لغرض تجاوز إشكال واحد، والإشكال هو وجود كلمات متعددة لها الرسم نفسه (طَالِب، طَالَبَ) ثم جعلنا صفحات توضيح لنبقي على العنوان المجرد من الشكلات، هذه الطريقة أفضل بكثير من جمع الكلمات في صفحة واحدة، فذلك لا يناسب الغنى الذي تتمتع به اللغة العربية. بالنظر إلى السياسة هكذا نجد الأصل الأول الذي يعطي أولوية للعناوين المجردة من الشكلات، ثم عناوين بشكلات تكون فرعية لصفحات توضيح، هكذا يبقى القاموس مرتبطا بوصلات أنترويكي تلقائية. أما بالنسبة للمحررين فالفكرة أن يضعوا دائما عنوانا خاليا من الشكلات، لا داعي للتردد إلا إذا علموا يقينا بوجود كلمات أخرى بالرسم نفسه، أما وقوع خطإ فليس مشكلا، يكتشف محرر آخر في وقت آخر وجود كلمة أخرى فيقوم بالنقل ووضع صفحة توضيح. هذا نمو طبيعي للقاموس. من هنا، نرى مثلا أن إنشاء صفحات توضيح أمر مفيد مثله مثل إنشاء صفحة تعريف. هكذا الأمر وضحتُه لترى السياسة من وجهة نظر عامة تنطلق من أصل عناوين بدون شكلات لتعزيز وصلات إنترويكي ثم يكون الاستثناء للتمييز بين الكلمات التي لها الرسم نفسه ثم فوق هذا يكون استثناء الحرف الأخير من الكلمات المعربة. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 10:35، 26 فبراير 2026 (ت ع م) :شكرا للإشارة، بصراحة منذ أيام وأنا أريد أن أكتب تعليقا ولكن كلما راجعت المقترح واستعرضت أمثلة من المفردات أتردد وأحير ماذا أكتب، أنا أميل إلى تشكيل جميع المفردات (باستثناء حروف فالمد) عدا صفحات التوضيح التي يُفترض أنها تحتوي على مجموعة كلمات متشابهة بالرسم ومختلفة بالمعنى حسب الحركات أو الشكلات فيها فعناوينها تكون مجردة، وأما الكلمات التي لا مشابه لها مثل '''[[استعمار]]''' و'''[[استعمال]]''' و'''[[منجنيق]]''' فأرى الواجب تشكيلها لضمان عدم التكرار والخلط أو الخطأ مثل ('''[[اِستعمال]]''' و'''[[اِسْتِعْمَال]]''' مفردتان لكلمة واحدة) أو ('''[[اِسْتَعْمَلَ]]''' و'''[[استعمل]]''' مفردتان لكلمة واحدة)، وضعت تعديلات على المقترح في ([[ويكاموس:صيغة الكتابة/الحركات والتشكيل/مسودة]]) وأظن أن المقترح بحاجة لنقاش أوسع وأتمنى مشاركة الزملاء لاكتشاف الأخطاء المحتملة، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:19، 27 فبراير 2026 (ت ع م) :مرحبًا بالجميع، أنا مع {{مض|'''الأصل البسيط'''}} هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد}} مادام يوجد هناك حل التحويل والتوضيح تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 27 فبراير 2026 (ت ع م) ::{{ر|أبو هشام}} اعتماد المقترح -بعد النقاش- كسياسة رسمية هو السبيل الضامن لتفادي التكرار والخلط، فالخطأ ليس ناجما عن مقترح دون الآخر وإنما عن غياب سياسة رسمية ملزِمة. في مسودتك ألاحظ تقريبا توافقا تاما بخصوص كيفية وضع الشكلات. النقطة التي فيها خلاف هي بخصوص الكلمات المنفردة برسمها أنضع شكلات في عناوينها أم نتركها بدون شكلات. إذا اعتمدنا الصورة الحالية التي شرحتُها سيكون ويكاموس العربي مرتبطا بوصلات أنترويكي تلقائية مع باقي القواميس، بحيث كل وصلة إلى ويكاموس تكون إما صفحة توضيح (بدون حركات) أو صفحة تعريف (بدون حركات)، نظرا لكون الويكاموسات الكبرى تعتمد عناوين عربية بدون حركات مع جمع المتشابهة في صفحة واحدة -أنا أقول أن جمع متشابهات الرسم في صفحة واحدة غير متناسب مع الغنى اللغوي الذي تتمتع به العربية كما أنه سيعيق الاسترسال في التعريفات فضلا عن تقزيمه لعدد الصفحات العربية بالقاموس-. أما اقتراحك واقتراح {{ر|حبيشان}} القاضي بوضع شكلات حتى في عناوين الكلمات المنفردة برسمها فسيجعل ويكاموس معزولا نسبيا عن باقي القواميس، سيتصفح القارئ كلمات عربية في ويكاموس الإنجليزي أو الفرنسي ولن يجد وصلة أنترويكي إلى ويكاموس العربي، نأخذ على سبيل المثال كلمة استعمال وهي منفردة برسمها، لو كانت بدون شكلات "[[خاص:فرق/792168|استعمال]]" ستكون لها 14 وصلة أنترويكي مع مختلف الويكاموسات، بينما لو كانت بشكلات "[[خاص:فرق/1076577|اِسْتِعْمَال]]" فلن تكون مرتبطة بأي وصلة أنترويكي. بالمناسبة [[خاص:فرق/1071100|اِستعمال]] ينبغي دمجها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 18:52، 1 مارس 2026 (ت ع م) :::أنا أميل إلى تشكيل كلّ العناوين، لأنّ استثناءَ بعض الكلمات فيه تضاربٌ في السياسة ويؤدّي إلى ارتباك القرّاء، والمنفعةُ منه محدودة. في رأيي، مسألةُ الربط والوصلات تحتاج إلى تفكيرٍ أعمق لاقتراح حلٍّ تقني يناسب الويكاموسات التي تستعمل الحركات. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:03، 10 مارس 2026 (ت ع م) {{خلاصة}} أجريتُ '''تعديلات طفيفة''' في نص السياسة مع الإبقاء على جوهرها كما كان، يرجى مطالعة النسخة المحيّنة، أرى أن نعتمدها '''سياسة رسمية'''. النقاش يبقى دائما مفتوحا في حال وجود ملاحظات مستقبلية. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 08:11، 6 مارس 2026 (ت ع م) == أداة مراجعة معاني الأفعال == في إطار العمل على إحياء ويكاموس والربط مع ويكي بيانات (تتمة لنقاش [[ويكاموس:الميدان#قوالب جديدة + إنشاء صفحات الأفعال]])، أنشأنا أداة لمراجعة معاني الأفعال العربية ونشرها: {{وسط|https://ar-senses.toolforge.org}} يمكن الاطلاع على توثيق الأداة على [[ويكاموس:ويكي بيانات#أداة مراجعة المعاني (تجريبي)]]. تحتوى الأداة على معاني مستخلصة آليا بالبحث في 16 معجما عربيا (لسان العرب، تاج العروس، المعجم الوسيط، القاموس المحيط، وغيرها) وبالاعتماد على نموذج لغوي ضخم لتجميع المعاني وترتيبها. الهدف من الأداة هو تمكين المحررين من مراجعة المعلومات ثم نشرها في ويكي بيانات وويكاموس. بدأنا بعدد محدود من الأفعال. أرجو من الزملاء تجربتها وإبداء ملاحظاتهم، سواء على المعاني المُستخلصة أو على واجهة الأداة أو تجربة المستخدم، [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 00:58، 23 مارس 2026 (ت ع م) :إشارة إلى الزملاء النشطين في المشروع @[[مستخدم:حبيشان|حبيشان]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:Najem Ajem|Najem Ajem]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:RASHEEDYE|RASHEEDYE]] @[[مستخدم:أويس2003|أويس2003]] @[[مستخدم:ماهر الماهر|ماهر الماهر]]. شكرا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:25، 27 مارس 2026 (ت ع م) ::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] أداة رائعة، جربت عدة أمور، فقط لدي بعض الملاحظات: ::* عدم ذكر معجم الغني مصدرًا ::* عدم إمكانية انشاء وصلات داخلية في المعاني ::* عدم إمكانية إعادة إنشاء صفحة ويكاموس (الموجودة قد لا تُلبي نفس المقاييس، أو ناقصة) كما لا يمكن استخراج النموذج لديل صفحة موجودة ::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:17، 27 مارس 2026 (ت ع م) :::شكرا @[[مستخدم:Nehaoua|Nehaoua]] على التجريب وعلى الملاحظات القَيّمة. :::* مع الأسف ليس عندي معجم الغني بصيغة رقمية. :::* ملاحظة مهمة في موضوع الوصلات الداخلية. سأبحث عن حل تقني في ويكي بيانات وفي قالب {{قا|معجمية}}. :::* بالنسبة لإعادة إنشاء صفحات ويكاموس، كان أحد الاقتراحات في [https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D9%85%D9%8A%D8%AF%D8%A7%D9%86#c-%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86-20260121100000-ForzaGreen-20260117223000 النقاش السابق] هو عدم حذف المحتوى الحالي في ويكاموس. لذلك كان التركيز في تطوير الأداة على إنشاء معاني جديدة فقط، في ويكي بيانات، ثم إنشاء صفحات ويكاموس إن لم تكن موجودة. :::[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:30، 28 مارس 2026 (ت ع م) ::::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] شكرا لردك، بالنسبة لإعادة إنشاء صفحات ويكاموس، حبذا لو تُنشئ أو تفعل أداة نسخ محتوى انشاء صفحة ويكاموس وكأننا ستُنشئها من جديد، حتى يتسنى النقل اليدوي إلى الصفحة الموجودة والتعديل بما يوافق الحالة. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:25، 28 مارس 2026 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] {{تم}}. الآن في صفحات مراجعة الأفعال الموجودة سلفا في ويكاموس، والتي أُنشئت خارج الأداة، مثلا صفحة [https://ar-senses.toolforge.org/review/L1489133 أَدَّبَ L1489133]، يظهر سطر جديد: "''لمعاينة ما كانت الأداة ستنشئه لو لم تكن الصفحة موجودة في ويكاموس: (زر معاينة)''". :::::هل هذا ما قصدت ؟ [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 18:36، 28 مارس 2026 (ت ع م) ::::::مرحبًا @[[مستخدم:ForzaGreen|وائل]] بوركت، هذا ما تمنيت وقد حققته، شكرًا مرة أخرى [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:01، 28 مارس 2026 (ت ع م) ::@[[مستخدم:ForzaGreen|ForzaGreen]] عمل جبار تشكر عليه، سأجربها، وافضل أن تستعمل رابط إلى موقع تراث بدلا من موقع الشاملة، لأنه يعرض نسخة الpdf بسهولة والنسخة النصية لم تنقل جميع الاصطلاحات من النسخة المطبوعة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 02:11، السبت 9 شوال 1447هـ (+3) 23:11، 27 مارس 2026 (ت ع م) :::{{تم}}. الآن تظهر روابط موقع تراث بدل الشاملة. :::وفي موضوع ذو صلة، عدلتُ سابقا [[وحدة:Cite Q]] المستعملة في {{قا|استشهاد بويكي بيانات}} وعناصر المعاجم في ويكي بيانات، بحيث يؤدي رابط المرجع مباشرة إلى الجزء ورقم الصفحة في موقع archive.org (إن كانت طبعة المعجم متوفرة في الموقع). [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 10:31، 28 مارس 2026 (ت ع م) :أقترح وضع رابط لها في الصفحة الرئيسة لتسهيل الوصول إليها. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 23:11، الأحد 23 ذو القعدة 1447هـ (+3) 20:11، 10 مايو 2026 (ت ع م) == تحديث لوحدات الاستشهاد == يوجد تحديث جديد لوحدات الاستشهاد في الملعب يحتوى التحديث: * إضافة وسيط {{وسيط|التاريخ الهجري}} لإدخال التاريخ الهجري، مع إضافة تصنيفات للأخطاء في التاريخ أو عدم التوافق مع التاريخ الميلادي. وفي الاستشهاد بويكي بيانات بالإضافة إلى الميزة السابقة: * استيراد التاريخ الأصلي من ويكي بيانات إذا كان موجودا في عنصر العمل أو الاعتماد على تاريخ وفاة المؤلف. * تحسينات شتى وتلافي بعض الأخطاء. * اعتماد نص خاصية [ذكر كـ] دائمًا عند الوجود، حتى عند المؤلف المجهول. مع ملاحظة أن بعض الميزات الجديدة نوقشت في ويكيبديا العربية. أرجو التجربة، وهناك صفحة [[قالب:استشهاد بويكي بيانات/مختبر]] للفرق بين النسخة القديمة والجديدة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 00:15، الثلاثاء 14 صفر 1448هـ (+3) 21:15، 27 يوليو 2026 (ت ع م) :{{تم}} التحديث، أرجو الإبلاغ عن أية أخطاء. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 22:57، الاثنين 20 صفر 1448هـ (+3) 19:57، 3 أغسطس 2026 (ت ع م) == إنشاء صفحات صيغ الأفعال المُصَرَّفة == أقترح إنشاء صفحة لكل صيغة مصرَّفة من صيغ الأفعال العربية بالبوت. الوضعية الحالية: توجد اليوم نحو 7,483 صفحة صيغة أُنشئت يدويا. مثلا: [[أَكَلْتُ]]، [[يَكْتُبُونَ]]، [[اُكْتُبْ]]. تعتمد هذه الصفحات على قالب التصريف القديم. سنقتصر على الأفعال الموجودة في ويكاموس، وعددها تقريبا 7,363. مثلا توجد صفحة الفعل [[اِسْتَبْتَلَ]]، إذن سننشئ الصفحات [[اِسْتَبْتَلْتُ]]، [[اِسْتَبْتَلْنَا]]، [[اِسْتَبْتَلْتُمْ]]... بينما لا توجد اليوم صفحة [[زَمَجَ]]، وبالتالي لن ننشئ صفحاتها الفرعية. هذه أمثلة لشكل الصفحات المُقْتَرَح إنشاؤها: [[قُلْنَا]]، [[اُكْتُبِي]]، [[رَمَوْا]]، [[دَحْرَجْتُمَا]]، [[آتَتْ]]. سيكون شكل الصفحات الجديدة قريبا من النسق القديم مع بعض التحسينات: * إضافة بطاقة معلومات صيغة الفعل، وتحتوي على إحالة واضحة إلى صفحة الفعل الرئيسية ("''المعاني والشواهد والمراجع على صفحة الفعل''") والجذر ووزن الفعل ووزن الصيغة. * إضافة طريقة النطق بنظام الألفبائية الصوتية الدولية، باستعمال قالب {{قا|أصد-عر}}. * استعمال قالب التصريف الجديد {{قا|تصريف}} مع فتح الجدول تلقائيا وإظهار كل صيغ التصاريف (المبني للمجهول، المُضارع المرفوع والمنصوب والمجزوم)، ثم تأطير الكلمة بعنوان أصفر وخط غليظ لتبيين موضعها في تصريف الفعل. * إضافة التصانيف آليا. سيكون مُحتوى الصفحة بسيطا ومُولَّدا آليا لتقليل كلفة الصيانة وتركيزها في [[وحدة:ar-verb-form]] وفي قالب {{قا|صيغة فعل}}. نص الويكي فيه سطران لا غير: <pre> == {{اللغة|عربية}} == {{صيغة فعل|جذر=أكل|وزن=فعَل يفعُل}} </pre> وهذا يُوَلِّد كل الفقرات. توجد إمكانية توليد الفقرات منفصلة (انظر شرح {{قا|صيغة فعل}})، كما في صفحة [[اِرْمِ]]، لمن أراد إضافة محتوى آخر بين الفقرات، مع أننا ننصح بإبقاء هذه الصفحات بسيطة وثانوية، وكتابة المعاني والأمثلة في صفحة الفعل الرئيسية. سأنشئ وأعدل الصفحات، باستعمال البوت {{مس|ForzaGreenBot}}، على مراحل: * إنشاء صيغ الأفعال المبنية للمعلوم لكل الأفعال الموجودة في ويكاموس => ستكون النتيجة تقريبا 200 ألف صفحة جديدة. * تعديل صفحات صيغ الأفعال الموجودة => تعديل حوالي 7 آلاف صفحة. * زيادة عدد [[نقاش الوحدة:ar-verb/مختبر|اختبارات]] [[وحدة:ar-verb]] للتأكد من صحة تصريفات المبني للمجهول. نُشير إلى أن [[نقاش الوحدة:ar-verb/مختبر|مختبر]] الوحدة يحتوي حاليا على أكثر من 230 اختبارا للتأكد من صحة خوارزمية التصريف. * إنشاء الصيغ المبنية للمجهول => بضع عشرات الآلاف من الصفحات. * كُلَّما أُضيفت أفعال جديدة إلى ويكاموس، تُنشأ صفحات تصريفاتها. ولاحقا، إنشاء هذه الصفحات آليا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:38، 3 أغسطس 2026 (ت ع م) :إشارة إلى الزملاء الإداريين وإلى النشطين في المشروع: @[[مستخدم:Nehaoua|Nehaoua]]، @[[مستخدم:Najem Ajem|Najem Ajem]]، @[[مستخدم:حبيشان|حبيشان]]، @[[مستخدم:Avicenno|Avicenno]]، @[[مستخدم:Ajwaan|Ajwaan]]، @[[مستخدم:أبو هشام|أبو هشام]]، @[[مستخدم:إسلام|إسلام]]، @[[مستخدم:رِفْد|رِفْد]]، @[[مستخدم:نور إسماعيل|نور إسماعيل]]. شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:53، 13 أغسطس 2026 (ت ع م) ::{{أتفق}} [[مستخدم:Avicenno|Avicenno]] ([[نقاش المستخدم:Avicenno|نقاش]]) 19:43، 13 أغسطس 2026 (ت ع م) {{أتفق}} وداعم للمهمة، سلمت الأيادي.--[[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 09:34، 5 أغسطس 2026 (ت ع م) {{تعليق}} بدايًة أشكر جميع الجهود ولدي تساؤل بخصوص المقترح، هل من المجدي تخصيص صفحة مستقلة فقط لنبيّن أن هذه اللفظة تصريف كذا كذا للفعل كذا «بالإضافة لباقي التصريفات»، لا أدري، لكن أرى جدول تصريفات يُغني عن ذلك في صفحة الفعل، الإ أن تكون المشقتة لها معنىً مستقل، مثال [[مَكْتُوب]]، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:23، 11 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:Mdktb|Mdktb]] على التعليق. ملاحظة وجيهة، وقد كان لي نفس التساؤل لما اكتشفت تفاصيل ويكاموس. في الحقيقة، انطلقت من ما هو موجود في المشروع وفي سياساته (مثلا [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]])، وافترضت أن الموضوع نُوقش واتُفق على إنشاء هذه الصفحات. لاحظت كذلك أن مجتمعات اللغات الأخرى تعتمد كذلك هذه الصيغة، وهذه أمثلة من ويكاموس الإنجليزي: [[:en:كتبتم]] والإسباني: [[:es:escribimos]] والفرنسي: [[:fr:parlons]]. :في رأيي هذا الموضوع يتجاوز المُقترح الذي قدَّمتُه، وإعادة النظر فيه سيتطلب فتح نقاش جديد لتعديل السياسات الرسمية. تحياتي. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:14، 12 أغسطس 2026 (ت ع م) ::العفو @[[مستخدم:ForzaGreen|ForzaGreen]]، ربما كحل وسط أن يجري تقسيم تنفيذ المقترح لمراحل ويكون تركيز المقترح بدايًة على الألفاظ التي تحمل معانً يمكن إيرادها في صفحة التصريف، على أن يبقى النقاش مفتوحًا لتقدير جدوى إنشاء صفحات مستقلة لباقي التصريفات، يعني مثلا تتبعت تصريفات الفعل الماضي المبني للمعلوم «كتب» مع صيغة المخاطب، وفي الواقع وجدت المحتوى مجرد وصف لموضع اللفظة في جدول التصريفات، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 16:28، 12 أغسطس 2026 (ت ع م) :::حاليا لا توجد صيغ مُصَرَّفة تحمل معانٍ في صفحاتها، وإن كان، فذلك استثناء ونادر جدا. وفي الاقتراح أعلاه، فضَّلتُ إبقاء كل المعاني في صفحة الفعل الرئيسية، والإحالة دائما بوضوح إليها، حتى لا تتشتت المعلومات بين الصفحات. وسيبقى الباب مفتوحا لتعديل ما يظهر في هذه الصفحات الثانوية. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 08:59، 13 أغسطس 2026 (ت ع م) ::::كنت أقصد معنىً متعلق بالاشتقاق نفسه، مثلا مكتوب تأتي بمعنى رسالة، وأود الإشارة لمسألة اعتدنا عليها في المشاريع الشقيقة، وهي أن الإنشاء البوتي الكمّي لمحتوى ما لا يعامل معاملة الإنشاء المتفرّق لذات المحتوى، ولو كانت طبيعة المحتوى نفسه غير مخالفة، المقصد أنه يخضع لنقاش وتقييم أطول عادًة، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 17:17، 13 أغسطس 2026 (ت ع م) {{تعليق}} مرحبا وشكرا للإشارة، بصراحة الرقم المذكور في بداية النقاش كبير جدا (200 ألف صفحة لتصريفات الأفعال) يدعو لإعادة التفكير قبل البدء بتنفيذ المهمة، خصوصا أن هذه الصفحات ستكون صفحات قصيرة شبه فارغة ولا تذكر سوى وصف التصريف، وعددها أكبر من صفحات محتوى ويكاموس بثلاثة أضعاف تقريبا، لكن لأن سياسة ويكاموس لا تعارض أو تمنع إنشاء مثل هذه الصفحات فلا يمكن رفض المقترح، كما لا يمكن قبوله دون تمعّن ونقاش حقيقي موسّع ينظر في جوانب المقترح كلها، هل ستكون لهذه الصفحات فائدة حقيقية؟ هل يمكن تطويرها أو توسيعها مثلا؟ هل يمكن إنشاء قالب يشرح التصريفات المتعلقة بكل فعل ويوضع في صفحته؟ عذرا للإطالة وأدعو إلى مشاركة أكثر في النقاش، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:16، 13 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:أبو هشام|أبو هشام]] على التعليق. نعم يُمكن تطوير وتوسيع هذه الصفحات، لكن رأيي أن نتفادى ذلك ونُركز كل المعلومات في صفحة الفعل الأساسية. :أما عن فائدة هذه الصفحات، فهذا موضوع يخص سياسات المشروع، وتعديلها يحتاج نقاشا خارج موضوع المُقترح. فالخيارات الحالية ثلاثة: :# إما أن نعمل بالسياسات الحالية وبالتالي نُنشئ الصفحات. وهذا رأيي. :# وإما أن نُعدِّل السياسة بعد نقاش مستقل يُفضي إلى عدم جدوى هذه الصفحات. وفي هذه الحالة نحذف الصفحات الموجودة، وعددها حوالي 7 آلاف صفحة. :# وإما أن نُبقي الأمور جامدة كما هي عليه دون إنشاء الصفحات، وهذا يعني وجود تناقض بين السياسات وواقع المشروع، وهذا أسوأ الخيارات. :شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 16:02، 13 أغسطس 2026 (ت ع م) ::مرحبا وائل، قد يُفهم من تعليقي أني أعترض على المهمة وأنا لست معترضا فعلا، لكني أدعو إلى مشاركة أكبر في النقاش وطرح أفكار قد تعود بفائدة على المشروع، لذلك أنا مؤيد للمهمة ومستعد للمشاركة في مراجعة المفردات التجريبية والتأكد من سلامتها، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:39، 15 أغسطس 2026 (ت ع م) * {{تعليق}} أتفق مع إنشاء الصفحات آليا، لكن أعتقد أن الصفحات يجب أن يتسع محتواها أكثر من المثال الحالي. مثال: إضافة قالب يحتوي على معاني وأمثلة الفعل الماضي المبني للمعلوم. كذلك يمكن إضافة قالب يحتوي على زر يتيح للقارئ أو المحرر إضافة أمثلة لصيغة الفعل المصرفية. تحياتي لكم.--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:19، 16 أغسطس 2026 (ت ع م) *:محتوى الصفحات المُقترحة قابل للاتساع، ويستطيع المُحرر إضافة أمثلة أو أي محتوى آخر. تحياتي. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 07:53، 17 أغسطس 2026 (ت ع م) == اضافة اسم مستعار مختصر لنطاق ويكاموس == تحياتي لكم، حاليًا المشروع بدون اسم مستعار ومختصر لنطاق المشروع «ويكاموس»، مثلا <code>WT:</code> في النسخة الإنجليزية أو كما في باقي المشاريع العربية الشقيقة مثال <code>وب:</code> في ويكيبيديا العربية «للتوضيح: [[w:وب:ترحيب بالقادمين الجدد|وب:ترحيب بالقادمين الجدد]]»، وعليه اقترح اضافة اختصار مناسب ويفضّل غير مستعمل في المشاريع الشقيقة مثل <code>وس:</code>، أو أي اقتراح آخر مناسب، «تنويه: <code>وم:</code> مستعملة في ويكي مصدر، <code>وق:</code> مستعملة في ويكي الاقتباس» تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:48، 14 أغسطس 2026 (ت ع م) :مرحبا {{ر|Mdktb}} وشكرا لطرح الموضوع، أتفق وليكن الاقتراح الأول <code>وس:</code>، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:58، 14 أغسطس 2026 (ت ع م) :{{أتفق}} [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 17 أغسطس 2026 (ت ع م) :{{تعليق}} أرى أنه ليس من الضروري للاختصار أن يكون مغايرا عن اختصارات المشاريع الأخرى، وإن كان هذا محببا، إذ المشاريع في نهاية المطاف تتمتع بنوع من الاستقلالية. أنا أقول هذا لأن المجتمع هنا دَرج على استخدام الاختصار <code>وق:</code> كما في ويكي الاقتباس، منذ 2014 على الأقل. فيما يلي أمثلة، وإن كانت هذه الاختصارات لازالت على شكل تحويلات اعتيادية: [[وق:الميدان]]، [[وق:تشكيل]]، [[وق:تخريب]]، [[وق:ملعب]]. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 18:47، 22 أغسطس 2026 (ت ع م) == تحديث قالب رأس صفحة نقاش == مرحبا بالزملاء، أقترح تحديث قالب {{قا|رأس صفحة نقاش}} ليعرض الأرشيف عندما يكون موجودا كما في ويكيبيديا، شكرا لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:06، 15 أغسطس 2026 (ت ع م) :{{نفذ}}. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:24، 15 أغسطس 2026 (ت ع م) == ترقيم تسلسل الاستشهادات المكررة بالحروف بدلا من الأرقام كويكيبيديا == حاليا تسلسل الاستشهادات المكررة بأرقام كسرية فأقترح جعلها بحروف الجمل كويكيبيديا العربية، مثل<ref name="r1">الاستشهاد الأول</ref> وهذا الآخر<ref name="r1"/> [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:17، الاثنين 4 ربيع الأول 1448هـ (+3) 18:17، 17 أغسطس 2026 (ت ع م) {{مراجع}} إشارة إلى النشطين {{ر|Najem Ajem|Nehaoua|أبو هشام|Mdktb|ForzaGreen}}--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:38، الاثنين 4 ربيع الأول 1448هـ (+3) 18:38، 17 أغسطس 2026 (ت ع م) :{{أتفق}}. شكرا لك. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:31، 17 أغسطس 2026 (ت ع م) :{{أتفق}} وشكرا لجهودك. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:23، 17 أغسطس 2026 (ت ع م) :{{أتفق}} شكرا لك مسبقًا [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:03، 17 أغسطس 2026 (ت ع م) :{{أتفق}} اقتراح مفيد ومشكور --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 12:22، 18 أغسطس 2026 (ت ع م) j51ks8x564dltqm40277ozanmkvybyz 1099189 1099188 2026-08-22T20:36:59Z Mdktb 25941 /* اضافة اسم مستعار مختصر لنطاق ويكاموس */ ردّ 1099189 wikitext text/x-wiki {{/مقدمة}}__فهرس__ == تشكيل عنوان المقالة في ويكاموس العربي والنسخ اللغوية الأخرى == يعتمد ويكاموس العربي تشكيل اسم الصفحة باعتبار أنه مع اختلاف التشكيل فإننا المفردة مختلفة عن أختها، لكن أغلب النسخ اللغوية الأخرى ومن أهمها الإنجليزي تعتمد اسم الصفحة بدون تشكيل وتجمع جميع المفردات التي تشترك في نفس رسم الكلمة بدون تشكيل في صفحة واحدة. ;تأثير هذا الاختلاف: يؤثر هذه الاختلاف بين النسخ اللغوية في الربط بين النسخ اللغوية المختلفة لأن الربط يكون باسم الصفحة وإذا وجدت صفحة مشكلة وصفحة غير مشكلة فإنهما صفحتان مختلفتان لذا فإنها لا تربط لا حظ مثلا صفحة [[قَتَلَ]] تجد أنها مربوطة مع النسخة الفرنسية فقط ولكن افتح صفحة [[:en:قتل]] تجد أنها مربوطة ب 25 نسخة لغوية، وهذا يؤثر على الاستفادة من المحتوى العربي في ويكاموس العربي بشدة. لذا فأرجو إعادة النظر في منهجية تشكيل اسم الصفحةة في ويكاموس، وهذا نقاش مفتوح وكل يذكر ما يراه صوابا مع الأسباب، وقد فتحت نقاشا في مجموعة التلجرام فتبين أن ويكاموس الفرنسي والإيطالي يلتزمان بالتشكيل في عنوان الصفحة. وهذا الأمر يستوجب وجود سياسة عالمية لأنها تحدد الربط بين المشاريع. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 08:54، 17 نوفمبر 2025 (ت ع م) :[[ويكاموس:الميدان/أرشيف/2017#مفردات ويكاموس|نقاش سابق]]، إشارة إلى المشاركين فيه @[[مستخدم:أحمد ناجي|أحمد ناجي]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:أسامة الجزري|أسامة الجزري]] @[[مستخدم:ميسرة|ميسرة]] @[[مستخدم:أبو آسر|أبو آسر]] @[[مستخدم:يوسف عاشق الجبل|يوسف عاشق الجبل]]. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 12:03، 17 نوفمبر 2025 (ت ع م) ::@[[مستخدم:حبيشان|حبيشان]] أنا مؤيد لإزالة التشكيل من العناوين وإضافة المفردات المشكلة المرجوة لذات الصفحة لتسهيل الوصول إلى المفردة والمفردات ذات الصلة وهذا المعمول به في المواد غير العربية ومخالفة المواد العربية يعسر البحث. مثلا عندنا [[أَكْل]] و[[أَكَلَ]] لكن في المفردات غير العربية عندنا مادة واحدة لاسم ولفعل ولصفة مثل [[present]]، فأقترح إزالة التشكيل في العناوين وكتابة المفردات المرجوة في الصفحة ومنها اشتقاقات الجذر ولتزل صفحات التوضيح. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 22:24، 17 نوفمبر 2025 (ت ع م) ::هذا النقاش يثار كلما جاء وفد من ويكيبيديا وقارن ويكاموس العربي بالنسخ اللغوية الأخرى. ويكاموس العربي يعتمد على صفحات التوضيح منذ زمن بعيد، وهي كفيلة بربط هذه النسخة مع باقي النسخ الأخرى، مثلا صفحة [[قتل]] مربوطة ب25 نسخة، وصفحة [[كتب]] ب24 نسخة، وكذا صفحة [[نظر]] مرتبطة ب19 نسخة. فإذا كنت تدعم العناوين بدون تشكيل فهو أمر معمول به أصلا (صفحات التوضيح) وإذا كنت تريد أن نزيل الوصلات ونجمع المحتويات كلها في صفحة واحدة فهذا لن يزيد من الربط، بل سيبقى الربط كما هو. أصلا لا توجد مشكلة في الربط، بل المشكلة في النقص العددي لصفحات ويكاموس، حتى أن صفحة [[ربط]] غير موجودة لحظة كتابتي لهذا التعليق. أقول أنه ليس على ويكاموس العربي أن يتبع ويكاموس الإنجليزي أو الفرنسي، إذا فكرنا من وجهة نظر موضوعية، فإن الأصل هو وجود صفحة واحدة لكل كلمة، [[قَتَلَ]] ليست هي نفسها [[قَتَّلَ]] أو [[قَتْل]]، لذا وجود صفحات مستقلة هو أمر طبيعي وجيد ويُتيح إمكانية التفصيل في شرح مختلف المعاني. ثم مع هذا توجد صفحة التوضيح [[قتل]] (بدون تشكيل) التي تكون مرتبطة مع مختلف النسخ اللغوية. '''هذا ليس عيب، بل ميزة معمول بها منذ زمن طويل'''. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 17 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Najem Ajem|Najem Ajem]] لا أرى ميزة إضافية لفصل المفردات حسب شكلها إلا زيادة عدد الصفحات، بينما نخسر مميزات إضافية ذكرتها أدنا. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:21، 22 نوفمبر 2025 (ت ع م) ::أتفق مع الزميل @[[مستخدم:Najem Ajem|الناجم العاجم]] في الحفاظ على أسماء الصفحات بالتشكيل، مع وجود صفحات التوضيح. أُضيف إلى ما قيل: في المستقبل نُريد ربط صفحات ويكاموس مع الوحدات المُعجمية في ويكي بيانات، وهذا سيكون أسهل إذا كانت الصفحات مُستقلة. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:23، 20 نوفمبر 2025 (ت ع م) :::@[[مستخدم:ForzaGreen|ForzaGreen]] الصفحة في ويكاموس تقبل جميع اللغات التي تستعمل نفس رسم الكلمة، بينما المعجمية في ويكي بيانات مقيدة بلغة معينة، فالربط لا يمكن أن يتم آليا، فما دام يدويًا فلا ميزة إضافية لفصل الكلمات حسب شكلها في صفحات مستقلة. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:18، 22 نوفمبر 2025 (ت ع م) :: {{ضد}} التشكيل ضرورة حتمية في المعاجم، ووجود نفس الرسم في معاجم أخرى يُعدّ جهدًا ضائعًا (إذ تصبح صفحة الكلمة مكررة بعدّة لغات، ولا أعلم ما الفائدة!). الأصل أن تُربط المفردة بما يقابلها بالترجمة، لا بالرسم. الأمر نفسه ينطبق على الكلمات غير العربية (أو على الأقل غير المنطوقة بلهجات عربية) في ويكاموس العربي؛ فوجودها مكررة في عدّة معاجم بلغات أخرى لا فائدة منه. منذ مدة وأنا أفكر في طريقة لربط الكلمات بين المعاجم اللغوية، ووجدت — حتى الآن — أن قسم الترجمة يمكنه القيام بذلك، لكنه بدوره يحتاج إلى ربط آلي. تحياتي --[[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> ::: {{ر|Nehaoua}} لن نفقد التشكيل عندما نجمع المفردات المتفقة في الرسم في صفحة واحدة، فستكون المفردات في عناوين فرعية وهي المسماة في ويكاموس الإنجليزي headwords، وكل نسخ ويكاموس متعددة لغات المفردات، فالمفردات العربية موجودة (أو لها أن تكون موجودة) في كافة النسخ اللغوية الأخرى، وللأسف المفردات العربية في ويكاموس الإنجليزي أكثر من العربي.--[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:26، 22 نوفمبر 2025 (ت ع م) :::مرحبًا @[[مستخدم:حبيشان|حبيشان]] رسمُ الكلمةِ العربية لا يكون مكتملًا إلا بالتشكيل، وكلُّ صيغةٍ مشكلة تُعدّ مفردة مستقلة، حتى ولو اشتركت في الرسم، لأن اختلاف التشكيل يؤدي إلى اختلافٍ في المعنى والمغزى. ولا يمكن القياس على الإنجليزية، فهي تعتمد على [[w:صائت|الصوائت]] التي تُميّز بين الكلمات (والمقابل لها في اللغة العربية الحركات الثلاثة -الفتح والكسر والضم-)، مثل: :::*[https://en.wiktionary.org/wiki/pin pin] (دبوس) :::*[https://en.wiktionary.org/wiki/pun pun] (تورية) :::*[https://en.wiktionary.org/wiki/pan pan] (مِقلاة) :::ولا تُعدّها الإنجليزية مفردة واحدة. :::أمّا ما ذُكر من أن {{مض|المفردات العربية في ويكاموس الإنجليزي أكثر من العربي}}} فهذا – في الواقع – مثال واضح على الجهد الضائع، إذ تُكرَّر الصفحات في معاجم أخرى بدل تطوير النسخة العربية ذاتها. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:55، 23 نوفمبر 2025 (ت ع م) ::::@[[مستخدم:Nehaoua|Nehaoua]] لابد من تشكيل المفردة عند ذكرها والشرح، وليس هذا محل خلاف، ولا خلاف أن الاختلاف في التشكيل غالبا يعني مفردة مختلفة، لكن النقاش عن جمع المفردات في صفحة واحدة وفقا لرسمها المجرد من التشكيل، فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتففق في الحروف في مدخل واحد، وهذا الطريقة المتفردة تفقد ويكاموس العربي بعض المميزات التقنية، بعض الميزات الأخرى التي ذكرتها. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 07:36، 24 نوفمبر 2025 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] عفوًا pin وpun وpan من جدوز مختلفة لا علاقة لها ببعض. كل واحدة free base morpheme لا صلة لها بالأخرى. أما عن الحركات العربية فهي تعود لجذر واحد فلا تصح المقارنة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 08:29، 24 نوفمبر 2025 (ت ع م) :::@[[مستخدم:Nehaoua|Nehaoua]] أيضا لا يمكن حصر التشكيل مقابلًا للصوائت لأن منها short vowel sounds ومنها long vowel sounds التي هي أقرب إلى حروف العلة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:26، 24 نوفمبر 2025 (ت ع م) ::::::مرحبًا @[[مستخدم:كريم رائد|كريم رائد]] لا يوجد مفهوم الجذر في الإنجليزية، وأنا متفق أنه {{مض|لا تصح المقارنة}} لأن الطلب اصلا مبني على المقارنة! تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 18:39، 24 نوفمبر 2025 (ت ع م) :::::::@[[مستخدم:Nehaoua|Nehaoua]] بل يوجد؛ طالع إن شئت Root (linguistics) ومقارنتك تشكيل العناوين بتلك المفردات في غير محلها لأن كل من هذه المفردات له معنى مختلف وجذره مختلف. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 19:09، 24 نوفمبر 2025 (ت ع م) ::::::::@[[مستخدم:كريم رائد|كريم رائد]] تمتاز اللغات السامية بأنها جذرية واشتقاقية؛ إذ يمكن اشتقاق مئات الكلمات من الجذر الواحد بتغييرات بسيطة ومنها التشكيل، في حين أن الـ '''Root '''في اللغات الأخرى يتغيّر عادةً بإضافة السوابق واللواحق (أمور معروفة لا تحتاج لإطالة). ::::::::{{مض|ومقارنتك تشكيل العناوين بتلك المفردات في غير محلّها}}، لأن المقصود هو أن التشكيل في العربية يوافق الصوائت؛ فالفتحة تقابلها "A"، والضمة "O"، والكسرة "I"، وهذا تحديدًا ما أردتُ مقارنته (وأعتذر عن إعادة ما سبق أن قلتُه). ::::::::وأكتفي هنا حتى لا يتحول النقاش إلى جدال. وفي النهاية، ما الفائدة من جمع تعريفات جميع معاني الرسم «عبر» في صفحة واحدة، من جمع [[عِبْرَة|لعِبرة]] إلى الفعل [[عَبَرَ|عَبَرَ]] وغيرها؟ ::::::::أكتفي بهذا القدر وقد بيّنتُ وجهة نظري. تحياتي. [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:24، 24 نوفمبر 2025 (ت ع م) :::::مرحبًا @[[مستخدم:حبيشان|حبيشان]]، :::::* {{مض|ولا خلاف أن الاختلاف في التشكيل غالبًا يعني مفردة مختلفة}} فكلُّ اختلافٍ في التشكيل يُنتج مفردةً مختلفة، وبالتالي مدخلة مختلفة. :::::* {{مض|النقاش عن جمع المفردات في صفحة واحدة وفقًا لرسمها المجرَّد من التشكيل}} وصفحات التوضيح تكفي في هذا الباب. :::::* {{مض|فويكاموس العربي لم يتبع نهج المعاجم العربية في جمع المفردات تحت جذر واحد وكذلك لم يتبع نهج أغلب نسخ ويكاموس في جمع المفردات التي تتفق في الحروف في مدخل واحد}} لا تتبع جميع المعاجم هذا النهج، فالمعجم الوسيط مثلًا لم يجمع كل المفردات ذات الرسم الواحد؛ انظر مثلًا مدخل: [https://shamela.ws/book/7028/640#p1 «عين»]، حيث تكرّرت عدة مرات، وبينها تعريفات لكلمات مختلفة الرسم. وكذلك نحن نعمل في مشروع لا يقتضي النسخ الحرفي للمطبوع. :::::* {{مض|وهذه الطريقة المتفردة تفقد ويكاموس العربي بعض المزايا التقنية}} إن اختلاف الرسم والمفردات في العربية أمرٌ أصيل، ووجود صعوبات تقنية حالية لا يبرّر تقليل شأن اللغة أو التخفيف من خصائصها؛ فقد كانت كتابة العربية يومًا ما مستحيلة تقنيًا، ولو اتبعنا المنطق نفسه لكتبناها اليوم بالأحرف اللاتينية. :::::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:09، 24 نوفمبر 2025 (ت ع م) === مميزات جمع المفردات في صفحة واحدة إذا اتفقت في رسهما الخالي من التشكيل === # أولا بالنظر إلى معاجمنا العربية الأصيلة فيهم تجمع المفردات لأكثر من ذلك فكل المفردات تحت جذر واحد تجمع في مدخل واحد في المعجم العربي بل بعض المعاجم تضم إليها التقاليب (جبذ، جذب، بجذ...)، فالجمع المقترح أقرب إلى العمل المعمول به في معاجمنا من الطريقة الحالية. # كثير من الكلمات العربية يكون فيها أكثر من وجه في الضبط لدينا مثلا كلمة «إِصبَع» فيها تسع لغات حيث يجوز في أولها وثالثها الحركات الثلاث، فعلى هذا سيكون للأصبع 9 صفحات وهي مفردة واحدة ولكن فيها عدة أوجه أو لغات، وكثير من مفردات اللغة يجوز في حرف من حروفها أكثر من حركة ( ومنها باب المثلث في اللغة)، لذا فجمعها في صفحة أيسر في الوقوف على الفائدة، وأبعد من إيهام التغاير. # أن القارئ ربما يريد أن يستفيد ما هو الضبط الصحيح لكلمة معينة، وجود أكثر من عنوان مشكولة يؤخره في البحث عن الكلمة. # أن القارئ لا يستطيع أن يصل بسهولة من صفحة مفردة إلى ما يقابلها في اللغات الأخرى فيحتاج أن ينتقل غلى صفحة توضيح أو أن يبحث عنها. # نفس الشيء بالنسبة للقارئ في النسخ الأخرى الذي يرغب أن يطلع على النسخة العربية. --[[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:15، 22 نوفمبر 2025 (ت ع م) :{{ر|حبيشان}} :# نحن في قاموس إلكتروني، حيث تتوفر الوصلات وصناديق البحث، لماذا سنتبع طريقة الكتب القديمة. :# عندما يكون للكلمة الواحدة أكثر من تهجئة واحدة، فحينئذ نضع صفحة تحتوي على المعنى، وصفحات أخرى تحوّل أو توصل إليها، مع ذكر هذه الملاحظة في صفحة المعنى. وهذا طبيعي جدا حتى أن النسخ الأخرى تقوم بالأمر نفسه، مثلا في ويكاموس الإنجليزي صفحة [[:en:colour|colour]] لا تحتوي على المعاني، ذكروا فقط أنها تهجئة مختلفة للكلمة [[:en:color|color]]. :# النقطة 2 تفيد أيضا في حال وجود تهجئات خاطئة وشائعة. :# من المفترض أن تحتوي الصفحات على قالب {{قا|أيضا}} في الأعلى، ويشير إلى صفحة التوضيح (التي تتضمن الكلمات التي لها الرسم نفسه) كما هو معمول به في النسخ الأخرى. :# القارئ من النسخ الأخرى سيجد صفحة التوضيح من خلال وصلات الأنترويكي. بالمناسبة العناوين بالتشكيل موجودة في نسخ أخرى غير العربية. :[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 23:11، 22 نوفمبر 2025 (ت ع م) * في الوضع الحالي وبعد ترتيب المفردات في التصانيف، فلا بأس عندي ببقاء عناوين المشكلة، مع الآتي: ** تنقيح تعليمات [[ويكاموس:صيغة الكتابة/الحركات والتشكيل|تشكيل العناوين]] ووسمها سياسةً لكي تكون ملزمة. ** جعل إنشاء صفحات التوضيح (بدون شكل) آليا عبر بوت، وكذلك الوصلة إليها من صفحات المفردات المشكلة.--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 18:08، الأربعاء 2 شعبان 1447هـ (+3) 15:08، 21 يناير 2026 (ت ع م) :{{ر|حبيشان}} راجعتُ صفحة [[وق:تشكيل|تشكيل العناوين]]، وجعلت القواعد أكثر وضوحا، يرجى إلقاء نظرة عليها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:09، 22 يناير 2026 (ت ع م) ::مرحبًا @[[مستخدم:Najem Ajem|Najem Ajem]] شكرًا لتوضيحك [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:49، 28 يناير 2026 (ت ع م) === نقاش حول [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]] (مقترح سياسة) === * {{ر|Najem Ajem}} اعتذر عن تأخري بالرد بسبب انشغالي بالخارج، المقترح فيه بعض القصور، وايضا هناك [[خاص:فرق/1076134|تغيير محوري]] أضيف بعد الخلاصة لم يناقش بالمرة، لذا أرجو حذف الخلاصة والعودة إلى النقاش، وهذه الملاحظات على الصيغة الحالية: ** تغير كلمة (حركات) إلى (شكلات)، لأن الشدة ليست حركة وكذلك السكون عند البعض. ** توضح أحرف المد بـ (وهي الألف (ا) مطلقا، والواو (و) الساكنة المضموم ما قبلها، والياء (ي) الساكنة <s>المضموم</s> المكسور ما قبلها). ** اقترح تعديل النقطة الثانية إلى: ::: {{مض|يترك محل الإعراب (آخر الكلمة المفردة) في الكلمات المعربة بالحركات بدون حركة أو سكون -وتبقى الشدة إذا كان مشددًأ-؛ لأن حركته تتغير حسب موقع الكلمة في الجملة}} وعليه فإن «مُعَلِّمُونَ» تشكل النون وإن كانت آخر الكلمة لأن معلمون تعرب بالحروف. ::: بتعديل هذه النقطة نسنغني عن النقاط بعدها إلا إذا قصد بها التوضيح. ** في نقطة الأفعال يفهم منها أنه يجب شكل آخر المضارع ولكنه معرب والأولى أن يشمله ما يشمل الأسماء لذلك أقترحت هنا أن تكون النقطة عامة للأسماء والأفعال واستخدمت مصطلح (الكلمات). ** لو ينص على وجوب نقط الياء المتطرفة تمييزا لها عن الألف المطوية. ** ماذا عن همزة الوصل هل تشكل أم لا، لو تنص القاعدة على ذلك صراحة وهل تستعمل ألف مجردة عن الهمزة أم (ٱ) ألف عليها ص. ** لا أتفق مع تجريد العنوان المدخلة من الشكل عندما تحتمل الكلمة قراءة واحدة فقط، لأسباب: *** أن ذلك إذا غلب على ظن من أدخلها قد يكون مخطئًا فنضطر للنقل بعد ذلك. *** أن هذه القاعدة ربما تؤخر من يريد إضافة مفردة فيلتزم بالبحث هل يشاركها في الرسم مفردة أخرى أم لا. *** المشروع لا يميمز صفحات توضيح المفردات إلا بالتجريد من التشكيل فعندما يرى المستخدم عنوانا غير مشكل يظن أنها صفحة توضيح. --[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:10، الثلاثاء 7 رمضان 1447هـ (+3) 18:10، 24 فبراير 2026 (ت ع م) :إشارة @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:القلموني|القلموني]]. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:18، الثلاثاء 7 رمضان 1447هـ (+3) 18:18، 24 فبراير 2026 (ت ع م) * {{ر|حبيشان}} فيما يلي تعليقاتي على ملاحظاتك: ** <s>أوافق على استخدام (شكلات)، مع الإبقاء على (حركات) كمرادف أو لتفادي التكرار.</s> تعديل: بعد البحث وجدت أن "شكلات" غير فصيحة، بينما المستخدم هو فعلا "حركات" أو "حركات التشكيل". ** {{مض|فإننا دائما نستثني حروف المد (و، ا، ي)}} هنا عبارة "حروف المد" تفيد التوضيح بنفسها، فهي تشير إلى استثناء الحروف الثلاثة عندما -فقط- تفيد المد، بدل عبارة "الحروف" أو "حروف العلة" التي تشير إلى استثناء مطلق. لكن أوافق على إضافة التعريف الذي كتبتَه كملاحظة في الأسفل. ** صحيح أن بعض الكلمات لا يعرب بالشكلات وإنما بالحروف، فجمع المذكر السالم مثلا يضم بالواو والنون بينما ينصب ويجر بالياء والنون، لكن هذا لا يتعارض مع النقطة الثانية. لمزيد من الاتضاح سأشرح السياسة المقترحة، وهي بالمناسبة توثيق أكثر من كونها "اقتراحا جديدا": '''الأصل البسيط''' هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد، سنجد أن تطبيق هذا الأصل على الأفعال وتصريفاتها (كيفما كانت أزمنتها) وعلى الأسماء المبنية سيكون تطبيقا خاليا من أية إشكالية، لماذا؟ لأن الحرف الأخير من هذه الكلمات يقبل حركة واحدة غير متغيرة، إلا بعض الاستثناءات عندما تكون الكلمة وخصوصا الفعل في جملة، وهذا لا يعنينا فنحن نتحدث عن عناوين يعني كلمات مستقلة. من هنا فتطبيق قاعدة "الأصل" لن يجد أي إشكال ماعدا في الأسماء المعربة، لماذا؟ لأن حرفها الأخير قد يقبل أي شكلة حتا إذا كانت الكلمة مجرد عنوان، مثلا هَاتِفٌ هَاتِفُ هَاتِفًا هَاتِفَ هَاتِفٍ هَاتِفِ، هذا يجعلنا حائرين بخصوص تشكيل آخر حرف من الكلمة المعربة، من هنا عدلنا قاعدة "الأصل" لنستثني تشكيل آخر حرف من الكلمة المعربة (كيفما كانت). ما شرحته إلى حدود الآن هو ما يشكل النقط الخمسة المدونة في السياسة حاليا. وبهذا تكون السياسة سهلة تسمح لأي محرر بتطبيقها ولو لم يكن بارعا بالإعراب وتفاصيله، كل ما يلزمه هو التفريق بين الكلمة المبنية والكلمة المعربة فقط. وعليه فأنا لا أتفق مع تغيير النقطة الثانية (الأسماء المعربة) والثالثة (الأفعال) إذ لا حاجة -وليس من المفترض أصلا- لإضافة استثناءات أخرى تتعلق بالإعراب. فالمبدأ هو أن لا نضيف استثناء إلا لتفادي إشكال حاصل. ** أوافق على إضافة ملاحظة الياء المتطرفة. وبخصوص همزة الوصل فلتكن همزة قطع (مجردة من الهمزة) وتأخذ كسرة في حال تشكيلها. ** تعليقاتي أعلاه تخص الإجابة عن سؤال "فوق أية أحرف نضع الشكلات؟" أما السؤال الثاني الذي تجيب عنه السياسة هو "متى أصلا نضع شكلات في العنوان؟" والإجابة عن هذا السؤال تحتمل خيارين: 1. نضع شكلات في جميع العناوين بدون استثناء 2. نضع شكلات فقط للتمييز بين الكلمات التي لها الرسم نفسه. والسياسة حاليا تختار الجواب (2) لأنها تنطلق من الفكرة التالية: جعل ويكاموس العربي مرتبطا بمختلف النسخ الأخرى قدر الإمكان، وإذ أن أغلب النسخ خاصة الكبرى تضع مدخلات عربية دون شكلات، اتخذنا كأصل عدم وضع شكلات مطلقا، هكذا كان الأصل ثم صنعنا استثناء لغرض تجاوز إشكال واحد، والإشكال هو وجود كلمات متعددة لها الرسم نفسه (طَالِب، طَالَبَ) ثم جعلنا صفحات توضيح لنبقي على العنوان المجرد من الشكلات، هذه الطريقة أفضل بكثير من جمع الكلمات في صفحة واحدة، فذلك لا يناسب الغنى الذي تتمتع به اللغة العربية. بالنظر إلى السياسة هكذا نجد الأصل الأول الذي يعطي أولوية للعناوين المجردة من الشكلات، ثم عناوين بشكلات تكون فرعية لصفحات توضيح، هكذا يبقى القاموس مرتبطا بوصلات أنترويكي تلقائية. أما بالنسبة للمحررين فالفكرة أن يضعوا دائما عنوانا خاليا من الشكلات، لا داعي للتردد إلا إذا علموا يقينا بوجود كلمات أخرى بالرسم نفسه، أما وقوع خطإ فليس مشكلا، يكتشف محرر آخر في وقت آخر وجود كلمة أخرى فيقوم بالنقل ووضع صفحة توضيح. هذا نمو طبيعي للقاموس. من هنا، نرى مثلا أن إنشاء صفحات توضيح أمر مفيد مثله مثل إنشاء صفحة تعريف. هكذا الأمر وضحتُه لترى السياسة من وجهة نظر عامة تنطلق من أصل عناوين بدون شكلات لتعزيز وصلات إنترويكي ثم يكون الاستثناء للتمييز بين الكلمات التي لها الرسم نفسه ثم فوق هذا يكون استثناء الحرف الأخير من الكلمات المعربة. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 10:35، 26 فبراير 2026 (ت ع م) :شكرا للإشارة، بصراحة منذ أيام وأنا أريد أن أكتب تعليقا ولكن كلما راجعت المقترح واستعرضت أمثلة من المفردات أتردد وأحير ماذا أكتب، أنا أميل إلى تشكيل جميع المفردات (باستثناء حروف فالمد) عدا صفحات التوضيح التي يُفترض أنها تحتوي على مجموعة كلمات متشابهة بالرسم ومختلفة بالمعنى حسب الحركات أو الشكلات فيها فعناوينها تكون مجردة، وأما الكلمات التي لا مشابه لها مثل '''[[استعمار]]''' و'''[[استعمال]]''' و'''[[منجنيق]]''' فأرى الواجب تشكيلها لضمان عدم التكرار والخلط أو الخطأ مثل ('''[[اِستعمال]]''' و'''[[اِسْتِعْمَال]]''' مفردتان لكلمة واحدة) أو ('''[[اِسْتَعْمَلَ]]''' و'''[[استعمل]]''' مفردتان لكلمة واحدة)، وضعت تعديلات على المقترح في ([[ويكاموس:صيغة الكتابة/الحركات والتشكيل/مسودة]]) وأظن أن المقترح بحاجة لنقاش أوسع وأتمنى مشاركة الزملاء لاكتشاف الأخطاء المحتملة، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:19، 27 فبراير 2026 (ت ع م) :مرحبًا بالجميع، أنا مع {{مض|'''الأصل البسيط'''}} هو أن توضع الشكلات فوق الحروف كلها باستثناء حروف المد}} مادام يوجد هناك حل التحويل والتوضيح تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 27 فبراير 2026 (ت ع م) ::{{ر|أبو هشام}} اعتماد المقترح -بعد النقاش- كسياسة رسمية هو السبيل الضامن لتفادي التكرار والخلط، فالخطأ ليس ناجما عن مقترح دون الآخر وإنما عن غياب سياسة رسمية ملزِمة. في مسودتك ألاحظ تقريبا توافقا تاما بخصوص كيفية وضع الشكلات. النقطة التي فيها خلاف هي بخصوص الكلمات المنفردة برسمها أنضع شكلات في عناوينها أم نتركها بدون شكلات. إذا اعتمدنا الصورة الحالية التي شرحتُها سيكون ويكاموس العربي مرتبطا بوصلات أنترويكي تلقائية مع باقي القواميس، بحيث كل وصلة إلى ويكاموس تكون إما صفحة توضيح (بدون حركات) أو صفحة تعريف (بدون حركات)، نظرا لكون الويكاموسات الكبرى تعتمد عناوين عربية بدون حركات مع جمع المتشابهة في صفحة واحدة -أنا أقول أن جمع متشابهات الرسم في صفحة واحدة غير متناسب مع الغنى اللغوي الذي تتمتع به العربية كما أنه سيعيق الاسترسال في التعريفات فضلا عن تقزيمه لعدد الصفحات العربية بالقاموس-. أما اقتراحك واقتراح {{ر|حبيشان}} القاضي بوضع شكلات حتى في عناوين الكلمات المنفردة برسمها فسيجعل ويكاموس معزولا نسبيا عن باقي القواميس، سيتصفح القارئ كلمات عربية في ويكاموس الإنجليزي أو الفرنسي ولن يجد وصلة أنترويكي إلى ويكاموس العربي، نأخذ على سبيل المثال كلمة استعمال وهي منفردة برسمها، لو كانت بدون شكلات "[[خاص:فرق/792168|استعمال]]" ستكون لها 14 وصلة أنترويكي مع مختلف الويكاموسات، بينما لو كانت بشكلات "[[خاص:فرق/1076577|اِسْتِعْمَال]]" فلن تكون مرتبطة بأي وصلة أنترويكي. بالمناسبة [[خاص:فرق/1071100|اِستعمال]] ينبغي دمجها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 18:52، 1 مارس 2026 (ت ع م) :::أنا أميل إلى تشكيل كلّ العناوين، لأنّ استثناءَ بعض الكلمات فيه تضاربٌ في السياسة ويؤدّي إلى ارتباك القرّاء، والمنفعةُ منه محدودة. في رأيي، مسألةُ الربط والوصلات تحتاج إلى تفكيرٍ أعمق لاقتراح حلٍّ تقني يناسب الويكاموسات التي تستعمل الحركات. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:03، 10 مارس 2026 (ت ع م) {{خلاصة}} أجريتُ '''تعديلات طفيفة''' في نص السياسة مع الإبقاء على جوهرها كما كان، يرجى مطالعة النسخة المحيّنة، أرى أن نعتمدها '''سياسة رسمية'''. النقاش يبقى دائما مفتوحا في حال وجود ملاحظات مستقبلية. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 08:11، 6 مارس 2026 (ت ع م) == أداة مراجعة معاني الأفعال == في إطار العمل على إحياء ويكاموس والربط مع ويكي بيانات (تتمة لنقاش [[ويكاموس:الميدان#قوالب جديدة + إنشاء صفحات الأفعال]])، أنشأنا أداة لمراجعة معاني الأفعال العربية ونشرها: {{وسط|https://ar-senses.toolforge.org}} يمكن الاطلاع على توثيق الأداة على [[ويكاموس:ويكي بيانات#أداة مراجعة المعاني (تجريبي)]]. تحتوى الأداة على معاني مستخلصة آليا بالبحث في 16 معجما عربيا (لسان العرب، تاج العروس، المعجم الوسيط، القاموس المحيط، وغيرها) وبالاعتماد على نموذج لغوي ضخم لتجميع المعاني وترتيبها. الهدف من الأداة هو تمكين المحررين من مراجعة المعلومات ثم نشرها في ويكي بيانات وويكاموس. بدأنا بعدد محدود من الأفعال. أرجو من الزملاء تجربتها وإبداء ملاحظاتهم، سواء على المعاني المُستخلصة أو على واجهة الأداة أو تجربة المستخدم، [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 00:58، 23 مارس 2026 (ت ع م) :إشارة إلى الزملاء النشطين في المشروع @[[مستخدم:حبيشان|حبيشان]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:Najem Ajem|Najem Ajem]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:كريم أحمد|كريم أحمد]] @[[مستخدم:RASHEEDYE|RASHEEDYE]] @[[مستخدم:أويس2003|أويس2003]] @[[مستخدم:ماهر الماهر|ماهر الماهر]]. شكرا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:25، 27 مارس 2026 (ت ع م) ::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] أداة رائعة، جربت عدة أمور، فقط لدي بعض الملاحظات: ::* عدم ذكر معجم الغني مصدرًا ::* عدم إمكانية انشاء وصلات داخلية في المعاني ::* عدم إمكانية إعادة إنشاء صفحة ويكاموس (الموجودة قد لا تُلبي نفس المقاييس، أو ناقصة) كما لا يمكن استخراج النموذج لديل صفحة موجودة ::تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:17، 27 مارس 2026 (ت ع م) :::شكرا @[[مستخدم:Nehaoua|Nehaoua]] على التجريب وعلى الملاحظات القَيّمة. :::* مع الأسف ليس عندي معجم الغني بصيغة رقمية. :::* ملاحظة مهمة في موضوع الوصلات الداخلية. سأبحث عن حل تقني في ويكي بيانات وفي قالب {{قا|معجمية}}. :::* بالنسبة لإعادة إنشاء صفحات ويكاموس، كان أحد الاقتراحات في [https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D9%85%D9%8A%D8%AF%D8%A7%D9%86#c-%D8%AD%D8%A8%D9%8A%D8%B4%D8%A7%D9%86-20260121100000-ForzaGreen-20260117223000 النقاش السابق] هو عدم حذف المحتوى الحالي في ويكاموس. لذلك كان التركيز في تطوير الأداة على إنشاء معاني جديدة فقط، في ويكي بيانات، ثم إنشاء صفحات ويكاموس إن لم تكن موجودة. :::[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:30، 28 مارس 2026 (ت ع م) ::::مرحبًا @[[مستخدم:ForzaGreen|ForzaGreen]] شكرا لردك، بالنسبة لإعادة إنشاء صفحات ويكاموس، حبذا لو تُنشئ أو تفعل أداة نسخ محتوى انشاء صفحة ويكاموس وكأننا ستُنشئها من جديد، حتى يتسنى النقل اليدوي إلى الصفحة الموجودة والتعديل بما يوافق الحالة. تحياتي [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 11:25، 28 مارس 2026 (ت ع م) :::::@[[مستخدم:Nehaoua|Nehaoua]] {{تم}}. الآن في صفحات مراجعة الأفعال الموجودة سلفا في ويكاموس، والتي أُنشئت خارج الأداة، مثلا صفحة [https://ar-senses.toolforge.org/review/L1489133 أَدَّبَ L1489133]، يظهر سطر جديد: "''لمعاينة ما كانت الأداة ستنشئه لو لم تكن الصفحة موجودة في ويكاموس: (زر معاينة)''". :::::هل هذا ما قصدت ؟ [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 18:36، 28 مارس 2026 (ت ع م) ::::::مرحبًا @[[مستخدم:ForzaGreen|وائل]] بوركت، هذا ما تمنيت وقد حققته، شكرًا مرة أخرى [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 19:01، 28 مارس 2026 (ت ع م) ::@[[مستخدم:ForzaGreen|ForzaGreen]] عمل جبار تشكر عليه، سأجربها، وافضل أن تستعمل رابط إلى موقع تراث بدلا من موقع الشاملة، لأنه يعرض نسخة الpdf بسهولة والنسخة النصية لم تنقل جميع الاصطلاحات من النسخة المطبوعة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 02:11، السبت 9 شوال 1447هـ (+3) 23:11، 27 مارس 2026 (ت ع م) :::{{تم}}. الآن تظهر روابط موقع تراث بدل الشاملة. :::وفي موضوع ذو صلة، عدلتُ سابقا [[وحدة:Cite Q]] المستعملة في {{قا|استشهاد بويكي بيانات}} وعناصر المعاجم في ويكي بيانات، بحيث يؤدي رابط المرجع مباشرة إلى الجزء ورقم الصفحة في موقع archive.org (إن كانت طبعة المعجم متوفرة في الموقع). [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 10:31، 28 مارس 2026 (ت ع م) :أقترح وضع رابط لها في الصفحة الرئيسة لتسهيل الوصول إليها. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 23:11، الأحد 23 ذو القعدة 1447هـ (+3) 20:11، 10 مايو 2026 (ت ع م) == تحديث لوحدات الاستشهاد == يوجد تحديث جديد لوحدات الاستشهاد في الملعب يحتوى التحديث: * إضافة وسيط {{وسيط|التاريخ الهجري}} لإدخال التاريخ الهجري، مع إضافة تصنيفات للأخطاء في التاريخ أو عدم التوافق مع التاريخ الميلادي. وفي الاستشهاد بويكي بيانات بالإضافة إلى الميزة السابقة: * استيراد التاريخ الأصلي من ويكي بيانات إذا كان موجودا في عنصر العمل أو الاعتماد على تاريخ وفاة المؤلف. * تحسينات شتى وتلافي بعض الأخطاء. * اعتماد نص خاصية [ذكر كـ] دائمًا عند الوجود، حتى عند المؤلف المجهول. مع ملاحظة أن بعض الميزات الجديدة نوقشت في ويكيبديا العربية. أرجو التجربة، وهناك صفحة [[قالب:استشهاد بويكي بيانات/مختبر]] للفرق بين النسخة القديمة والجديدة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 00:15، الثلاثاء 14 صفر 1448هـ (+3) 21:15، 27 يوليو 2026 (ت ع م) :{{تم}} التحديث، أرجو الإبلاغ عن أية أخطاء. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 22:57، الاثنين 20 صفر 1448هـ (+3) 19:57، 3 أغسطس 2026 (ت ع م) == إنشاء صفحات صيغ الأفعال المُصَرَّفة == أقترح إنشاء صفحة لكل صيغة مصرَّفة من صيغ الأفعال العربية بالبوت. الوضعية الحالية: توجد اليوم نحو 7,483 صفحة صيغة أُنشئت يدويا. مثلا: [[أَكَلْتُ]]، [[يَكْتُبُونَ]]، [[اُكْتُبْ]]. تعتمد هذه الصفحات على قالب التصريف القديم. سنقتصر على الأفعال الموجودة في ويكاموس، وعددها تقريبا 7,363. مثلا توجد صفحة الفعل [[اِسْتَبْتَلَ]]، إذن سننشئ الصفحات [[اِسْتَبْتَلْتُ]]، [[اِسْتَبْتَلْنَا]]، [[اِسْتَبْتَلْتُمْ]]... بينما لا توجد اليوم صفحة [[زَمَجَ]]، وبالتالي لن ننشئ صفحاتها الفرعية. هذه أمثلة لشكل الصفحات المُقْتَرَح إنشاؤها: [[قُلْنَا]]، [[اُكْتُبِي]]، [[رَمَوْا]]، [[دَحْرَجْتُمَا]]، [[آتَتْ]]. سيكون شكل الصفحات الجديدة قريبا من النسق القديم مع بعض التحسينات: * إضافة بطاقة معلومات صيغة الفعل، وتحتوي على إحالة واضحة إلى صفحة الفعل الرئيسية ("''المعاني والشواهد والمراجع على صفحة الفعل''") والجذر ووزن الفعل ووزن الصيغة. * إضافة طريقة النطق بنظام الألفبائية الصوتية الدولية، باستعمال قالب {{قا|أصد-عر}}. * استعمال قالب التصريف الجديد {{قا|تصريف}} مع فتح الجدول تلقائيا وإظهار كل صيغ التصاريف (المبني للمجهول، المُضارع المرفوع والمنصوب والمجزوم)، ثم تأطير الكلمة بعنوان أصفر وخط غليظ لتبيين موضعها في تصريف الفعل. * إضافة التصانيف آليا. سيكون مُحتوى الصفحة بسيطا ومُولَّدا آليا لتقليل كلفة الصيانة وتركيزها في [[وحدة:ar-verb-form]] وفي قالب {{قا|صيغة فعل}}. نص الويكي فيه سطران لا غير: <pre> == {{اللغة|عربية}} == {{صيغة فعل|جذر=أكل|وزن=فعَل يفعُل}} </pre> وهذا يُوَلِّد كل الفقرات. توجد إمكانية توليد الفقرات منفصلة (انظر شرح {{قا|صيغة فعل}})، كما في صفحة [[اِرْمِ]]، لمن أراد إضافة محتوى آخر بين الفقرات، مع أننا ننصح بإبقاء هذه الصفحات بسيطة وثانوية، وكتابة المعاني والأمثلة في صفحة الفعل الرئيسية. سأنشئ وأعدل الصفحات، باستعمال البوت {{مس|ForzaGreenBot}}، على مراحل: * إنشاء صيغ الأفعال المبنية للمعلوم لكل الأفعال الموجودة في ويكاموس => ستكون النتيجة تقريبا 200 ألف صفحة جديدة. * تعديل صفحات صيغ الأفعال الموجودة => تعديل حوالي 7 آلاف صفحة. * زيادة عدد [[نقاش الوحدة:ar-verb/مختبر|اختبارات]] [[وحدة:ar-verb]] للتأكد من صحة تصريفات المبني للمجهول. نُشير إلى أن [[نقاش الوحدة:ar-verb/مختبر|مختبر]] الوحدة يحتوي حاليا على أكثر من 230 اختبارا للتأكد من صحة خوارزمية التصريف. * إنشاء الصيغ المبنية للمجهول => بضع عشرات الآلاف من الصفحات. * كُلَّما أُضيفت أفعال جديدة إلى ويكاموس، تُنشأ صفحات تصريفاتها. ولاحقا، إنشاء هذه الصفحات آليا. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:38، 3 أغسطس 2026 (ت ع م) :إشارة إلى الزملاء الإداريين وإلى النشطين في المشروع: @[[مستخدم:Nehaoua|Nehaoua]]، @[[مستخدم:Najem Ajem|Najem Ajem]]، @[[مستخدم:حبيشان|حبيشان]]، @[[مستخدم:Avicenno|Avicenno]]، @[[مستخدم:Ajwaan|Ajwaan]]، @[[مستخدم:أبو هشام|أبو هشام]]، @[[مستخدم:إسلام|إسلام]]، @[[مستخدم:رِفْد|رِفْد]]، @[[مستخدم:نور إسماعيل|نور إسماعيل]]. شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 09:53، 13 أغسطس 2026 (ت ع م) ::{{أتفق}} [[مستخدم:Avicenno|Avicenno]] ([[نقاش المستخدم:Avicenno|نقاش]]) 19:43، 13 أغسطس 2026 (ت ع م) {{أتفق}} وداعم للمهمة، سلمت الأيادي.--[[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 09:34، 5 أغسطس 2026 (ت ع م) {{تعليق}} بدايًة أشكر جميع الجهود ولدي تساؤل بخصوص المقترح، هل من المجدي تخصيص صفحة مستقلة فقط لنبيّن أن هذه اللفظة تصريف كذا كذا للفعل كذا «بالإضافة لباقي التصريفات»، لا أدري، لكن أرى جدول تصريفات يُغني عن ذلك في صفحة الفعل، الإ أن تكون المشقتة لها معنىً مستقل، مثال [[مَكْتُوب]]، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:23، 11 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:Mdktb|Mdktb]] على التعليق. ملاحظة وجيهة، وقد كان لي نفس التساؤل لما اكتشفت تفاصيل ويكاموس. في الحقيقة، انطلقت من ما هو موجود في المشروع وفي سياساته (مثلا [[ويكاموس:صيغة الكتابة/الحركات والتشكيل]])، وافترضت أن الموضوع نُوقش واتُفق على إنشاء هذه الصفحات. لاحظت كذلك أن مجتمعات اللغات الأخرى تعتمد كذلك هذه الصيغة، وهذه أمثلة من ويكاموس الإنجليزي: [[:en:كتبتم]] والإسباني: [[:es:escribimos]] والفرنسي: [[:fr:parlons]]. :في رأيي هذا الموضوع يتجاوز المُقترح الذي قدَّمتُه، وإعادة النظر فيه سيتطلب فتح نقاش جديد لتعديل السياسات الرسمية. تحياتي. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:14، 12 أغسطس 2026 (ت ع م) ::العفو @[[مستخدم:ForzaGreen|ForzaGreen]]، ربما كحل وسط أن يجري تقسيم تنفيذ المقترح لمراحل ويكون تركيز المقترح بدايًة على الألفاظ التي تحمل معانً يمكن إيرادها في صفحة التصريف، على أن يبقى النقاش مفتوحًا لتقدير جدوى إنشاء صفحات مستقلة لباقي التصريفات، يعني مثلا تتبعت تصريفات الفعل الماضي المبني للمعلوم «كتب» مع صيغة المخاطب، وفي الواقع وجدت المحتوى مجرد وصف لموضع اللفظة في جدول التصريفات، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 16:28، 12 أغسطس 2026 (ت ع م) :::حاليا لا توجد صيغ مُصَرَّفة تحمل معانٍ في صفحاتها، وإن كان، فذلك استثناء ونادر جدا. وفي الاقتراح أعلاه، فضَّلتُ إبقاء كل المعاني في صفحة الفعل الرئيسية، والإحالة دائما بوضوح إليها، حتى لا تتشتت المعلومات بين الصفحات. وسيبقى الباب مفتوحا لتعديل ما يظهر في هذه الصفحات الثانوية. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 08:59، 13 أغسطس 2026 (ت ع م) ::::كنت أقصد معنىً متعلق بالاشتقاق نفسه، مثلا مكتوب تأتي بمعنى رسالة، وأود الإشارة لمسألة اعتدنا عليها في المشاريع الشقيقة، وهي أن الإنشاء البوتي الكمّي لمحتوى ما لا يعامل معاملة الإنشاء المتفرّق لذات المحتوى، ولو كانت طبيعة المحتوى نفسه غير مخالفة، المقصد أنه يخضع لنقاش وتقييم أطول عادًة، تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 17:17، 13 أغسطس 2026 (ت ع م) {{تعليق}} مرحبا وشكرا للإشارة، بصراحة الرقم المذكور في بداية النقاش كبير جدا (200 ألف صفحة لتصريفات الأفعال) يدعو لإعادة التفكير قبل البدء بتنفيذ المهمة، خصوصا أن هذه الصفحات ستكون صفحات قصيرة شبه فارغة ولا تذكر سوى وصف التصريف، وعددها أكبر من صفحات محتوى ويكاموس بثلاثة أضعاف تقريبا، لكن لأن سياسة ويكاموس لا تعارض أو تمنع إنشاء مثل هذه الصفحات فلا يمكن رفض المقترح، كما لا يمكن قبوله دون تمعّن ونقاش حقيقي موسّع ينظر في جوانب المقترح كلها، هل ستكون لهذه الصفحات فائدة حقيقية؟ هل يمكن تطويرها أو توسيعها مثلا؟ هل يمكن إنشاء قالب يشرح التصريفات المتعلقة بكل فعل ويوضع في صفحته؟ عذرا للإطالة وأدعو إلى مشاركة أكثر في النقاش، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:16، 13 أغسطس 2026 (ت ع م) :شكرا لك @[[مستخدم:أبو هشام|أبو هشام]] على التعليق. نعم يُمكن تطوير وتوسيع هذه الصفحات، لكن رأيي أن نتفادى ذلك ونُركز كل المعلومات في صفحة الفعل الأساسية. :أما عن فائدة هذه الصفحات، فهذا موضوع يخص سياسات المشروع، وتعديلها يحتاج نقاشا خارج موضوع المُقترح. فالخيارات الحالية ثلاثة: :# إما أن نعمل بالسياسات الحالية وبالتالي نُنشئ الصفحات. وهذا رأيي. :# وإما أن نُعدِّل السياسة بعد نقاش مستقل يُفضي إلى عدم جدوى هذه الصفحات. وفي هذه الحالة نحذف الصفحات الموجودة، وعددها حوالي 7 آلاف صفحة. :# وإما أن نُبقي الأمور جامدة كما هي عليه دون إنشاء الصفحات، وهذا يعني وجود تناقض بين السياسات وواقع المشروع، وهذا أسوأ الخيارات. :شكرا. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 16:02، 13 أغسطس 2026 (ت ع م) ::مرحبا وائل، قد يُفهم من تعليقي أني أعترض على المهمة وأنا لست معترضا فعلا، لكني أدعو إلى مشاركة أكبر في النقاش وطرح أفكار قد تعود بفائدة على المشروع، لذلك أنا مؤيد للمهمة ومستعد للمشاركة في مراجعة المفردات التجريبية والتأكد من سلامتها، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:39، 15 أغسطس 2026 (ت ع م) * {{تعليق}} أتفق مع إنشاء الصفحات آليا، لكن أعتقد أن الصفحات يجب أن يتسع محتواها أكثر من المثال الحالي. مثال: إضافة قالب يحتوي على معاني وأمثلة الفعل الماضي المبني للمعلوم. كذلك يمكن إضافة قالب يحتوي على زر يتيح للقارئ أو المحرر إضافة أمثلة لصيغة الفعل المصرفية. تحياتي لكم.--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:19، 16 أغسطس 2026 (ت ع م) *:محتوى الصفحات المُقترحة قابل للاتساع، ويستطيع المُحرر إضافة أمثلة أو أي محتوى آخر. تحياتي. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 07:53، 17 أغسطس 2026 (ت ع م) == اضافة اسم مستعار مختصر لنطاق ويكاموس == تحياتي لكم، حاليًا المشروع بدون اسم مستعار ومختصر لنطاق المشروع «ويكاموس»، مثلا <code>WT:</code> في النسخة الإنجليزية أو كما في باقي المشاريع العربية الشقيقة مثال <code>وب:</code> في ويكيبيديا العربية «للتوضيح: [[w:وب:ترحيب بالقادمين الجدد|وب:ترحيب بالقادمين الجدد]]»، وعليه اقترح اضافة اختصار مناسب ويفضّل غير مستعمل في المشاريع الشقيقة مثل <code>وس:</code>، أو أي اقتراح آخر مناسب، «تنويه: <code>وم:</code> مستعملة في ويكي مصدر، <code>وق:</code> مستعملة في ويكي الاقتباس» تحياتي --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 18:48، 14 أغسطس 2026 (ت ع م) :مرحبا {{ر|Mdktb}} وشكرا لطرح الموضوع، أتفق وليكن الاقتراح الأول <code>وس:</code>، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:58، 14 أغسطس 2026 (ت ع م) :{{أتفق}} [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:04، 17 أغسطس 2026 (ت ع م) :{{تعليق}} أرى أنه ليس من الضروري للاختصار أن يكون مغايرا عن اختصارات المشاريع الأخرى، وإن كان هذا محببا، إذ المشاريع في نهاية المطاف تتمتع بنوع من الاستقلالية. أنا أقول هذا لأن المجتمع هنا دَرج على استخدام الاختصار <code>وق:</code> كما في ويكي الاقتباس، منذ 2014 على الأقل. فيما يلي أمثلة، وإن كانت هذه الاختصارات لازالت على شكل تحويلات اعتيادية: [[وق:الميدان]]، [[وق:تشكيل]]، [[وق:تخريب]]، [[وق:ملعب]]. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 18:47، 22 أغسطس 2026 (ت ع م) ::الفكرة أن المساهم قد ينوي الإشارة لوصلة في مشروع شقيق وينسى أحيانًا البادئة الخاصة بالمشروع، في هذه الحالة قد تشير الوصلة لصفحة محلية تستعمل نفس الاختصار «إن كانت موجودة» وقد يغفل عن ملاحظة الخطأ، مثلا أراد ميدان ويكي الاقتباس [[q:وق:الميدان]]، ولكنه نسي البادئة <code>q:</code>، في حال اُستعمل اختصار مميز فإنها تظهر كوصلة حمراء وتنبهه لوجود خطأ --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 20:36، 22 أغسطس 2026 (ت ع م) == تحديث قالب رأس صفحة نقاش == مرحبا بالزملاء، أقترح تحديث قالب {{قا|رأس صفحة نقاش}} ليعرض الأرشيف عندما يكون موجودا كما في ويكيبيديا، شكرا لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:06، 15 أغسطس 2026 (ت ع م) :{{نفذ}}. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:24، 15 أغسطس 2026 (ت ع م) == ترقيم تسلسل الاستشهادات المكررة بالحروف بدلا من الأرقام كويكيبيديا == حاليا تسلسل الاستشهادات المكررة بأرقام كسرية فأقترح جعلها بحروف الجمل كويكيبيديا العربية، مثل<ref name="r1">الاستشهاد الأول</ref> وهذا الآخر<ref name="r1"/> [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:17، الاثنين 4 ربيع الأول 1448هـ (+3) 18:17، 17 أغسطس 2026 (ت ع م) {{مراجع}} إشارة إلى النشطين {{ر|Najem Ajem|Nehaoua|أبو هشام|Mdktb|ForzaGreen}}--[[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 21:38، الاثنين 4 ربيع الأول 1448هـ (+3) 18:38، 17 أغسطس 2026 (ت ع م) :{{أتفق}}. شكرا لك. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 19:31، 17 أغسطس 2026 (ت ع م) :{{أتفق}} وشكرا لجهودك. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:23، 17 أغسطس 2026 (ت ع م) :{{أتفق}} شكرا لك مسبقًا [[مستخدم:Nehaoua|<span style="color:#000000; font-size:18px; font-family:traditional arabic;">'''نحاوة'''</span>]] <sup>([[نقاش المستخدم:Nehaoua|<span style="color:blue; font-size:small; font-family:traditional arabic;">'''راسلني'''</span>]])</sup> 21:03، 17 أغسطس 2026 (ت ع م) :{{أتفق}} اقتراح مفيد ومشكور --[[مستخدم:Mdktb|Mdktb]] ([[نقاش المستخدم:Mdktb|نقاش]]) 12:22، 18 أغسطس 2026 (ت ع م) g65f2tpfp24qcks5b4asfir33xfj81h نقاش المستخدم:Najem Ajem 3 187890 1099183 1098152 2026-08-22T18:14:24Z Najem Ajem 20465 /* إزالة كمية */ رد 1099183 wikitext text/x-wiki [[ملف:Basmala.svg|بسم الله الرحمن الرحيم|يمين]] <br><small> {{يسار|[[نقاش المستخدم:Najem Ajem/2023-2024|'''أرشيف 23-24 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2021-2022|'''أرشيف 21-22 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2019-2020|'''أرشيف 19-20 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2017-2018|'''أرشيف 17-18 ''']]}} </small><br> == طلب حذف صفحة == مرحبا أخي؛ أحتاج منك للقيام بحذف الصفحة [[مستخدم:عبد الإله صديقي/vector.js]] لأنها تظهر ك[[خاص:تحويلات مزدوجة|تحويلة مزدوجة]]؛ لا يمكن للبوت الخاص بي تعديل الصفحة لأنها محمية من تعديلات البوت لأنها صفحة سكريبت مستخدم؛ شكرا لك مقدما. [[مستخدم:Meno25|Meno25]] ([[نقاش المستخدم:Meno25|نقاش]]) 20:39، 27 يناير 2025 (ت ع م) :{{ر|Meno25}} لقد عالجت التحويلة المكسورة، شكرا لك. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:32، 27 يناير 2025 (ت ع م) == طلب == أرجو منك مراجعة صفحات طلبات الصلاحيات. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:25، 2 فبراير 2025 (ت ع م) :{{تم}} [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 20:47، 10 فبراير 2025 (ت ع م) ::أخ ما قصة هذه الكلمات الإنجليزية المبالغ فيها في [[خاص:عرض صلاحيات المجموعات#autopatrolled|هذه]] الصفحة، هل هي ضرورية لأنني أفكر في فتح نقاش بخصوصها فهي غير منطقية فهذا مشروع عربي، هل توافقني في الرأي؟ [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 14:23، 11 فبراير 2025 (ت ع م) :::{{ر|جودت}} الصفحة مترجمة إلى العربية ولا إشكال فيها، تتضمن شروحات عربية مفهومة للصلاحيات، مع كلمات تقنية أو وصوفات للصلاحيات بالإنجليزية، وهي وصوفات ضرورية للمعايرة والتوحيد وتطوير برامج ويكيميديا. يرجى أيضا أن تلاحظ أن نفس الصفحة موجودة في المشاريع الأخرى، والوصوفات الإنجليزية لا تترجم لخصوصيتها سواء في المشاريع العربية أو غيرها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 19:30، 11 فبراير 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] هل [[مستخدم:Zina1|هذا]] المستخدم يستحق صلاحية حقا؟ هل يمكنك مراجعة مساهماته، فأنا أجد بعضا من مقالاته تخالف سياسات القاموس مثل [[slave of the glorious|هذه]] الصفحة التي انشئها في 2018 وهو يملك صلاحية منذ 2016 لذلك يجب مراجعة مقالاته وتعديلاته وسحب الصلاحية إن تبين وجود مخالفات. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:28، 16 فبراير 2025 (ت ع م) :::::{{ر|جودت}} ذلك المستخدِم لم يعد نشطا في الموقع وآخر تعديل له كان في 2017. لقد حذفتُ الصفحة التي أشرتَ إليها. شكرا لك. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 22:06، 16 فبراير 2025 (ت ع م) == طلب منع == مرحبا، أرجو منك منع [[مستخدم:156.202.57.199]] فهو آي بي للدعاية فقط. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:10، 24 أبريل 2025 (ت ع م) :{{تم}} {{ر|جودت}}، شكرا على الإبلاغ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:02، 24 أبريل 2025 (ت ع م) == مستخدم:Dr.H.Seif/ملعب == من فضلك احذفها ثم احميها؛ لا فائدة من منع الآي بي. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 15:27، 24 أبريل 2025 (ت ع م) :{{ر|كريم رائد}}، شكرا لقد حميت إنشاء الصفحة. وأرى أن المنع مفيد لأن المستخدم قام بتخريب صفحات أخرى. المنع المطبق مؤقت. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 16:56، 24 أبريل 2025 (ت ع م) ::شكر جزيلا! [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 16:59، 24 أبريل 2025 (ت ع م) :::@[[مستخدم:Najem Ajem|Najem Ajem]] أرجو إخفاء [https://ar.m.wiktionary.org/w/index.php?title=%D8%AE%D8%A7%D8%B5:%D8%B3%D8%AC%D9%84&logid=246871 ملخص الإنشاء هذا] لأن فيه بيانات شخصية حساسة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 10:53، 25 أبريل 2025 (ت ع م) :::{{ر|كريم رائد}} {{تم}}. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:23، 25 أبريل 2025 (ت ع م) ==إضافة أداة== مرحبا أرجو منك إضافة أداة تبديل الأرقام [https://ar.wikipedia.org/wiki/%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Gadget-Numeral-converter-toggle.js Gadget-Numeral-converter-toggle.js] الموجودة في ويكيبيديا إلى تفضيلات المستخدم في قسم الإضافات.[[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 18:40، 4 مايو 2025 (ت ع م) :{{ر|جودت}} {{تم}} شكرا على الاقتراح. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 18:15، 6 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] زر تبديل الأرقام لا يظهر عند تفعيل الإضافة، الميزة الأساسية لهذه الإضافة هو أنه عند تفعيلها يظهر زر في الخيارات يتيح للمستخدم تبديل الأرقام بضغطة زر واحدة إلى مشرقية أو العكس. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:39، 7 مايو 2025 (ت ع م) :::{{ر|جودت}} توجد الآن إضافتين جديدتين، واحدة تبدل الأرقام المغربية إلى مشرقية فقط بدون أن تختار، والأخرى (أسفل منها مباشرة) هي التي تعطيك خيارات علوية في القائمة المنسدلة للمستخدم، وتسمح لك بالتبديل بين الأرقام المغربية والأرقام المشرقية. جربتُهما البارحة واليوم، كلتا الإضافتين يشتغلان عندي، فقط اعلم أن الإضافة الأخيرة هي التي تعطيك الخيارات في القائمة العلوية كما قلت. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 15:05، 7 مايو 2025 (ت ع م) :::{{ر|جودت}} هل الأمور تمام بخصوص الإضافة ؟ أي مظهر تستخدم ؟ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 11:26، 8 مايو 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] الأمور تمام لكن حبذ لو جعلت تفعيل زر تبديل الأرقام والزر الذي يحول الأرقام لمشرقية يعملان معا بمجرد تفعيل أحدهما مع إمكانية إغلاق أحد الزرين بعد حفظ التفضيلات، كما في ويكيبيديا. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:02، 8 مايو 2025 (ت ع م) :::::نقلت الأدوات كما هي من ويكيبيديا. ما رأيك يا أخي {{ر|حبيشان}}، هل فاتني شيء ما؟ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:16، 9 مايو 2025 (ت ع م) ::::::@[[مستخدم:Najem Ajem|Najem Ajem]] أشكرك على تفعيل الإضافة، @[[مستخدم:جودت|جودت]] أشكرك على الاقتراح، والإضافة تعمل كما في ويكيبيديا العربية [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 13:24، 9 مايو 2025 (ت ع م) == علم سوريا == مرحبا أرجو منك التوقف عن إضافة تلك الخريطة، لقد اصبح علم سوريا الجديد رسميا في منظمات عالمية مثل الأمم المتحدة. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:10، 8 مايو 2025 (ت ع م) :وأيضا الصورة التي وضعتها لا تحوي علم فلسطين على الرغم من أن فلسطين دولة معترف بها دوليا وتعتبر الضفة الغربية المحتلة وقطاع غزة أراض فلسطينية. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:12، 8 مايو 2025 (ت ع م) ::لذا ساعدني برفع الملف المناسب إن كنت ترى الملف الذي رفعته مؤخرا غير صالح. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:14، 8 مايو 2025 (ت ع م) :::{{ر|جودت}} عذرا، لم ألحظ هذه التفاصيل. لكن، ما لم يعجبني هو أن خارطة المغرب مبتورة. فإما أن تكون كاملة، أو ببساطة نضع صورة جغرافية لا تحمل أي علم. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:16، 9 مايو 2025 (ت ع م) == الخريطة == في [[قالب:دول عربية]] قطاع غزة غير موجود، أرجو منك تغيير الخريطة، وأيضا حمايتك للصفحة فيها استعجال. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:17، 13 مايو 2025 (ت ع م) :{{ر|جودت}}، :أولا: إذا أمعَنتَ النظر قد ترى قطاع غزة في الخريطة. :ثانيا: أنا لا أصنع الخرائط، الصورة (ونظيراتها) موجودة في كومنز ومستخدمة في مشاريع أخرى بما في ذلك المشاريع العربية. :ثالثا: هذا ليس مكانا لمناقشة الجيوبوليتيك أو السياسات العالمية أو تضخيم الأمور، شخص عادي يجد صورة معبرة عن الدول العربية (ومستخدمة في ويكيبيديا الشقيقة)، صورة محايدة، يضعها في القالب، ويحميه لتفادي حروب تحرير مرتبطة بالأعلام أو ما شابه. :[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 04:47، 13 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] أرجو إضافة هذا الملف: [[:ملف:Arab nationalism Map.svg]] موجود في ويكيبيديا الشقيقة. فلسطين في الخريطة الحالية معلمة بالرمادي مع أن فلسطين جزء من ثقافة الوطن العربي، والصورة الحالية ذات طابع سياسي ومثيرة للرأي العام العربي. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:02، 13 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] هل من تعقيب؟ ما رأيك بالملف المقترح؟ [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:34، 14 مايو 2025 (ت ع م) :::{{ر|جودت}} هذا النقاش لا طائل ولا مغزى منه. الصورة الموجودة في القالب تعبر أصلا عن الدول العربية ولا حاجة لتغييرها إذ لا شائب فيها. وأرجو أن نستوعب أن ويكاموس مشروع قاموسي، نحن لا نصنع الخراط هنا ولا نناقش التفاصيل السياسية ولا نؤجج الصراعات، بل نعرّف الكلمات والمصطلحات ونوضح سياقات استخدامها، إذا لاحظتَ فالقالب هدفه البسيط هو جمع وصلات إلى صفحات محتوى، الصورة المرفوقة (التي بطريقة استثنائية عجيبة وغير مفهومة تثير حفيظتك) موجودة للتوضيح أو على الأقل للتزيين، وخرائط مطابقة لها موجودة في كل مكان، في ويكيبيديا العربية أيضا (بطبيعة الحال). فأرجو أن نتوقف عن التكلم بخصوص هذا الموضوع. وكمعلومة، الخريطة التي اقترحتَها أنت تضم مناطق من إيران، فهي لا تعبر عن الدول العربية، بل عن مكان انتشار العرب. تحياتي، [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 07:48، 14 مايو 2025 (ت ع م) == لديك بريد == مرحبا، لقد ارسلت رسالة لك بالبريد. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:39، 23 يونيو 2025 (ت ع م) :مرحبا {{ر|جودت}} لقد أرسلت لك ردا عبر الإيميل قبل يومين، فقط تأكد من "الرسائل غير المرغوبة" إن لزم الأمر. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:23، 24 يونيو 2025 (ت ع م) ::عفوا، يتعذر علي الوصول لحسابي. اكتب ردك هنا لو سمحت. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:46، 25 يونيو 2025 (ت ع م) :::'''سؤالك كان''': <blockquote>''مرحبا، أود ترشيح نفسي بعد أشهر لصلاحية الإداري، ما النصائح؟ وهل الترشيح لا يزال مبكرا؟''</blockquote> :::'''جوابي كان''': <blockquote> السلام عليك يا جودت، أهم ما يُنتظر من الإداري هو: * تقبّل آراء الآخرين والتعامل بتفهّم. * تجنّب الصدامات والمشاحنات مع الإداريين الآخرين. * صيانة الموقع دون اللجوء إلى إغراقه بتعديلات غير ضرورية. * التشاور مع المجتمع وبقية الإداريين في الأمور الجوهرية. مساهماتك الحالية جيدة، ولكن لم يمضِ على تسجيلك بعد سوى أقل من خمسة أشهر. دعنا نمنح الأمر بعض الوقت، ثم أرشحك للصلاحية بعد أشهر، بإذن الله. </blockquote> :::[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 20:46، 26 يونيو 2025 (ت ع م) == سؤال == لمَ تراجعت عن ترشيح الشطب؟ إن كان البرنامج معروفا فهذا لا يعني أن له مكانا هنا. ما رأيك بإنشاء صفحة لمايكروسوفت كليب تشامب (Clipchamp)! إنه مجرد برنامج من تطوير شركة. وليس مفردة ولا علاقة له بالمحتوى القاموسي. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 17:45، 6 يوليو 2025 (ت ع م) :وبخصوص [[جوجل]] و [[Google]] فهي مواقع شعبية ومعروفة في جميع أنحاء العالم لكن [[أوتوكاد]] برنامج من تطوير شركة. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 09:45، 7 يوليو 2025 (ت ع م) ::«هدفنا من ويكاموس هو إنشاء قاموس يعتمد عليه، لا بل أن ننشئ أكبر قاموس في التاريخ سواء في العرض أو العمق.» ولن يتحقق ذلك بجعل القاموس يغرق بالصفحات العشوائية غير القاموسية. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 09:52، 7 يوليو 2025 (ت ع م) :::{{ر|جودت}} ويكاموس قاموس عام لا يضم فقط المدخلات اللغوية بل يضم أيضا المصطلحات التقنية والعلمية والاقتصادية وغيرها. هذا ينطبق على جميع النسخ ليس فقط النسخة العربية. وأوتوكاد ليس مجرد "منتج" بل برنامج مشهور وأُلِفّت له كتب تعليمية وتقنية عديدة لذا هذا المصطلح ليس صفحة عشوائية. وبالمناسبة ويكاموس الإنجليزي يضم صفحات لبرامج حاسوبية أقل شهرة بكثير من أوتوكاد مثل [[:en:CXF|CXF]]. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:39، 7 يوليو 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] شكرا على التوضيح. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 08:56، 8 يوليو 2025 (ت ع م) == إضافة تبديل الأرقام == مرحبا @[[مستخدم:Najem Ajem|Najem Ajem]] بسبب حساسية المشروع يرجى التعديل على إضافة [[ميدياويكي:Gadget-Numeral-converter-toggle.js]] بحيث لا تؤثر على الصفحات ضمن النطاق العام، لقد أنشأت مؤخرا المدخلة [[180s]] وبسبب قيامي بتفعيل الإضافة تغيرت الأرقام للمشرقية. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 14:02، 18 يوليو 2025 (ت ع م) :@[[مستخدم:Najem Ajem|Najem Ajem]] لعل الإشارة لم تصل [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 08:57، 21 يوليو 2025 (ت ع م) == وضع رابط للصفحات الخاصة == أرجو إضافة رابط للصفحات الخاصة كما في ويكي مصدر [[s:خاص:فرق/530005]]. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:20، 19 سبتمبر 2025 (ت ع م) :{{تم}}. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] == [[وحدة:auto cat]] == Hi there. Can you delete this module because obsoleted and not used anypages. [[مستخدم:Hiyuune|Hiyuune]] ([[نقاش المستخدم:Hiyuune|نقاش]]) 01:14، 20 مارس 2026 (ت ع م) :{{ر|Hiyuune}} {{نفذ}} [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 02:57، 20 مارس 2026 (ت ع م) == حذف صفحات ميدياويكي == أرجو حذف الصفحات التالية: # [[ميدياويكي:Chick.css]] # [[ميدياويكي:Chick.js]] # [[ميدياويكي:Simple.css]] # [[ميدياويكي:Simple.js]] # [[ميدياويكي:Standard.js]] # [[ميدياويكي:Standard.css]] # [[ميدياويكي:Geshi.css]] # [[ميدياويكي:Handheld.css]] الصفحات متعلقة بمظاهر محذوفة حاليا، وميزات محذوفة حاليا. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 00:41، الجمعة 22 شوال 1447هـ (+3) :{{ر|حبيشان}} {{تم}} شكرا على الملاحظة. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 13:22، 10 أبريل 2026 (ت ع م) == You may be an eligible candidate for the U4C election == <div lang="en" dir="ltr" class="mw-content-ltr"> Greetings, The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] seeks candidates for the 2026 election. The U4C is the global committee responsible for overseeing enforcement of the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]]. Elections are held annually, if elected a committee member serves for two years. This year the U4C requires candidates to hold administrator rights on at least one wiki, which is why you are being contacted as you appear to hold this right. There are other requirements, such as candidates must be at least 18 years old and may not be employed by the Wikimedia Foundation or other related chapters and affiliates. You can find more information in the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026#Call_for_Candidates|call for candidates on Meta-wiki]]. Additionally, the committee's working language is English; some ability to communicate in English is required. The election opens on 18 May, if you are eligible and interested you have until 10 May to submit your candidacy. There will week between for candidates to answer questions from the community. Voting takes place privately in [[m:Special:MyLanguage/SecurePoll|SecurePoll]], successful candidates must receive at least 60% support. More information is available on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the 2026 Elections page]], including timelines and other candidacy information. If you read over the material and consider yourself qualified, please consider submitting your name to run for the committee. If you think someone else in your community might be interested and qualified, please encourage them to run. In partnership with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 18:30، 28 أبريل 2026 (ت ع م) </div> <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30471712 --> == قد تكون مؤهلاً للتصويت في انتخابات U4C == <section begin="announcement-content" /> أتواصل معك لأنك شاركتَ سابقًا في انتخابات [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|لجنة تنسيق قواعد السلوك العالمية (U4C)]]. قد تكون مؤهلًا للتصويت في انتخابات U4C الحالية، المفتوحة الآن وتُغلق في 2 يونيو 2026. يمكنك معرفة المزيد عن المرشحين والانتخابات على [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|صفحة الانتخابات في ميتا]]، ومن هناك يمكنك الوصول إلى صفحة التصويت. مشاركتك في هذه الانتخابات مهمة لإدارة مجتمعات ويكيميديا، ونُقدّر وقتك الذي تُخصّصه للتعرف على المرشحين والتصويت. -- بالتعاون مع اللجنة، [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> [[m:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 17:20، 20 مايو 2026 (ت ع م) (تم إرسال هذه الرسالة إلى [[:نقاش المستخدم:الناجم العاجم]] ويتم نشرها هنا بسبب إعادة التوجيه.) <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30569831 --> == تعديلات على بعض القوالب والتصانيف == السلام عليكم أخي، عدلت بعض النصوص المضبوطة بالشكل ضبطًا مبالغًا فيه في قوالب تصريف الأفعال، ولم أتمكن من تعديل [[قالب:وثق]] لأنه محمي، فلو تعدله فضلًا كما سائر القوالب الأخرى. أقترح أيضًا أن تنقلوا [https://ar.wikipedia.org/wiki/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D9%82%D9%88%D8%A7%D8%B9%D8%AF_%D8%A7%D9%84%D8%B6%D8%A8%D8%B7_%D8%A8%D8%A7%D9%84%D8%B4%D9%83%D9%84 قواعد الضبط بالشكل] وتعتمدوها في ويكاموس. خالص المودة. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 10:21، 7 يونيو 2026 (ت ع م) :مرحبا {{ر|Michel Bakni}} لقد عدلت {{قا|وثق}} كما طلبت. وفيما يخص النقطة الثانية، فتوجد بالفعل صفحة [[ويكاموس:قواعد الضبط بالشكل]]، وكان الزميل حبيشان قد نقلها سابقا، هذه الصفحة مشار إليها في [[وق:تشكيل|سياسة التشكيل]]. إذا كانت لديك فكرة حول كيفية تعميم الصفحة أو جعلها أكثر وصولا، فأفكارك مرحب بها. تحياتي [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 17:42، 21 يونيو 2026 (ت ع م) == بخصوص قالب:تمفعل == السلام عليكم أخي، أريد أن ألفت نظرك لوجود هذا القالب وهو غير صحيح ويلزم شطبه. ثمة طائفة من الأفعال تُلحق بالرباعي وهي من أصول ثلاثية بتوهم أصالة الميم، أشهرها يُمركِز ويُمفصِل ويُمَحوِر ويُمعجِم. هذه يكون وزنها يُفعلِل وتعامل معاملة الرباعي. خالص المودة [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 08:42، 29 يونيو 2026 (ت ع م) :وعليكم السلام ورحمة الله وبركاته. لقد حذفتُ [[قالب:تمفعل]]، فحقا لا يوجد في أوزان لغة العرب القياسية وزن للأفعال يسمى "تَمَفْعَلَ". الزيادة بالتاء والميم معاً في أول الفعل غير واردة في أوزان الفعل الخماسي ولا السداسي. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 14:21، 4 أغسطس 2026 (ت ع م) == إزالة كمية == مرحبًا زميل، لاحظتُ أنك أزلتَ بعض الصفحات المنشأة عبر [https://ar-senses.toolforge.org/ أداة مراجعة المعاني] إزالة كمية للسبب: "تنسيق خاطئ"، فهل لن أن تُوضِّحَ تفاصيل مشكلة التنسيق حتى نعمل على حلّها؟ شكرًا لك [[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:47، 6 أغسطس 2026 (ت ع م) :مرحبا، {{ر|عباد ديرانية}} عدد تلك الصفحات لا يتجاوز عشرين صفحة، أنشأها الزميل {{مس|DERDAKI ILIAS}} ورشحها للحذف الأخ {{مس|ForzaGreen}}، عندما راجعتُها وجدتُها فعلا مليئة بالأخطاء بشكل ملحوظ، على مستوى التنسيق وكذلك على مستوى اللغة. وهذه الأخطاء راجعة لكون إلياس لازال مبتدئا وحسابه حديث، وليس لكون الأداة خاطئة، وقد ناقشه وائل بهذا الخصوص. شكرا لمتابعتك [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 18:14، 22 أغسطس 2026 (ت ع م) 3oxswxeg9hcc8d6tbuy1r2ms61pfmiz 1099184 1099183 2026-08-22T18:45:15Z ForzaGreen 28665 /* إزالة كمية */ ردّ 1099184 wikitext text/x-wiki [[ملف:Basmala.svg|بسم الله الرحمن الرحيم|يمين]] <br><small> {{يسار|[[نقاش المستخدم:Najem Ajem/2023-2024|'''أرشيف 23-24 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2021-2022|'''أرشيف 21-22 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2019-2020|'''أرشيف 19-20 ''']]}} {{يسار|[[نقاش المستخدم:Najem Ajem/2017-2018|'''أرشيف 17-18 ''']]}} </small><br> == طلب حذف صفحة == مرحبا أخي؛ أحتاج منك للقيام بحذف الصفحة [[مستخدم:عبد الإله صديقي/vector.js]] لأنها تظهر ك[[خاص:تحويلات مزدوجة|تحويلة مزدوجة]]؛ لا يمكن للبوت الخاص بي تعديل الصفحة لأنها محمية من تعديلات البوت لأنها صفحة سكريبت مستخدم؛ شكرا لك مقدما. [[مستخدم:Meno25|Meno25]] ([[نقاش المستخدم:Meno25|نقاش]]) 20:39، 27 يناير 2025 (ت ع م) :{{ر|Meno25}} لقد عالجت التحويلة المكسورة، شكرا لك. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:32، 27 يناير 2025 (ت ع م) == طلب == أرجو منك مراجعة صفحات طلبات الصلاحيات. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:25، 2 فبراير 2025 (ت ع م) :{{تم}} [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 20:47، 10 فبراير 2025 (ت ع م) ::أخ ما قصة هذه الكلمات الإنجليزية المبالغ فيها في [[خاص:عرض صلاحيات المجموعات#autopatrolled|هذه]] الصفحة، هل هي ضرورية لأنني أفكر في فتح نقاش بخصوصها فهي غير منطقية فهذا مشروع عربي، هل توافقني في الرأي؟ [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 14:23، 11 فبراير 2025 (ت ع م) :::{{ر|جودت}} الصفحة مترجمة إلى العربية ولا إشكال فيها، تتضمن شروحات عربية مفهومة للصلاحيات، مع كلمات تقنية أو وصوفات للصلاحيات بالإنجليزية، وهي وصوفات ضرورية للمعايرة والتوحيد وتطوير برامج ويكيميديا. يرجى أيضا أن تلاحظ أن نفس الصفحة موجودة في المشاريع الأخرى، والوصوفات الإنجليزية لا تترجم لخصوصيتها سواء في المشاريع العربية أو غيرها. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 19:30، 11 فبراير 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] هل [[مستخدم:Zina1|هذا]] المستخدم يستحق صلاحية حقا؟ هل يمكنك مراجعة مساهماته، فأنا أجد بعضا من مقالاته تخالف سياسات القاموس مثل [[slave of the glorious|هذه]] الصفحة التي انشئها في 2018 وهو يملك صلاحية منذ 2016 لذلك يجب مراجعة مقالاته وتعديلاته وسحب الصلاحية إن تبين وجود مخالفات. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:28، 16 فبراير 2025 (ت ع م) :::::{{ر|جودت}} ذلك المستخدِم لم يعد نشطا في الموقع وآخر تعديل له كان في 2017. لقد حذفتُ الصفحة التي أشرتَ إليها. شكرا لك. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 22:06، 16 فبراير 2025 (ت ع م) == طلب منع == مرحبا، أرجو منك منع [[مستخدم:156.202.57.199]] فهو آي بي للدعاية فقط. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:10، 24 أبريل 2025 (ت ع م) :{{تم}} {{ر|جودت}}، شكرا على الإبلاغ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:02، 24 أبريل 2025 (ت ع م) == مستخدم:Dr.H.Seif/ملعب == من فضلك احذفها ثم احميها؛ لا فائدة من منع الآي بي. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 15:27، 24 أبريل 2025 (ت ع م) :{{ر|كريم رائد}}، شكرا لقد حميت إنشاء الصفحة. وأرى أن المنع مفيد لأن المستخدم قام بتخريب صفحات أخرى. المنع المطبق مؤقت. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 16:56، 24 أبريل 2025 (ت ع م) ::شكر جزيلا! [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 16:59، 24 أبريل 2025 (ت ع م) :::@[[مستخدم:Najem Ajem|Najem Ajem]] أرجو إخفاء [https://ar.m.wiktionary.org/w/index.php?title=%D8%AE%D8%A7%D8%B5:%D8%B3%D8%AC%D9%84&logid=246871 ملخص الإنشاء هذا] لأن فيه بيانات شخصية حساسة. [[مستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:black;">كريم {{أخضر|رائد}}</span> ]] [[نقاش المستخدم:كريم رائد|<span style="font-size:medium;font-family:Script MT Bold;color:red;">نقاش</span>]] 10:53، 25 أبريل 2025 (ت ع م) :::{{ر|كريم رائد}} {{تم}}. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:23، 25 أبريل 2025 (ت ع م) ==إضافة أداة== مرحبا أرجو منك إضافة أداة تبديل الأرقام [https://ar.wikipedia.org/wiki/%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Gadget-Numeral-converter-toggle.js Gadget-Numeral-converter-toggle.js] الموجودة في ويكيبيديا إلى تفضيلات المستخدم في قسم الإضافات.[[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 18:40، 4 مايو 2025 (ت ع م) :{{ر|جودت}} {{تم}} شكرا على الاقتراح. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 18:15، 6 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] زر تبديل الأرقام لا يظهر عند تفعيل الإضافة، الميزة الأساسية لهذه الإضافة هو أنه عند تفعيلها يظهر زر في الخيارات يتيح للمستخدم تبديل الأرقام بضغطة زر واحدة إلى مشرقية أو العكس. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:39، 7 مايو 2025 (ت ع م) :::{{ر|جودت}} توجد الآن إضافتين جديدتين، واحدة تبدل الأرقام المغربية إلى مشرقية فقط بدون أن تختار، والأخرى (أسفل منها مباشرة) هي التي تعطيك خيارات علوية في القائمة المنسدلة للمستخدم، وتسمح لك بالتبديل بين الأرقام المغربية والأرقام المشرقية. جربتُهما البارحة واليوم، كلتا الإضافتين يشتغلان عندي، فقط اعلم أن الإضافة الأخيرة هي التي تعطيك الخيارات في القائمة العلوية كما قلت. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 15:05، 7 مايو 2025 (ت ع م) :::{{ر|جودت}} هل الأمور تمام بخصوص الإضافة ؟ أي مظهر تستخدم ؟ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 11:26، 8 مايو 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] الأمور تمام لكن حبذ لو جعلت تفعيل زر تبديل الأرقام والزر الذي يحول الأرقام لمشرقية يعملان معا بمجرد تفعيل أحدهما مع إمكانية إغلاق أحد الزرين بعد حفظ التفضيلات، كما في ويكيبيديا. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:02، 8 مايو 2025 (ت ع م) :::::نقلت الأدوات كما هي من ويكيبيديا. ما رأيك يا أخي {{ر|حبيشان}}، هل فاتني شيء ما؟ [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:16، 9 مايو 2025 (ت ع م) ::::::@[[مستخدم:Najem Ajem|Najem Ajem]] أشكرك على تفعيل الإضافة، @[[مستخدم:جودت|جودت]] أشكرك على الاقتراح، والإضافة تعمل كما في ويكيبيديا العربية [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 13:24، 9 مايو 2025 (ت ع م) == علم سوريا == مرحبا أرجو منك التوقف عن إضافة تلك الخريطة، لقد اصبح علم سوريا الجديد رسميا في منظمات عالمية مثل الأمم المتحدة. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:10، 8 مايو 2025 (ت ع م) :وأيضا الصورة التي وضعتها لا تحوي علم فلسطين على الرغم من أن فلسطين دولة معترف بها دوليا وتعتبر الضفة الغربية المحتلة وقطاع غزة أراض فلسطينية. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:12، 8 مايو 2025 (ت ع م) ::لذا ساعدني برفع الملف المناسب إن كنت ترى الملف الذي رفعته مؤخرا غير صالح. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 16:14، 8 مايو 2025 (ت ع م) :::{{ر|جودت}} عذرا، لم ألحظ هذه التفاصيل. لكن، ما لم يعجبني هو أن خارطة المغرب مبتورة. فإما أن تكون كاملة، أو ببساطة نضع صورة جغرافية لا تحمل أي علم. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:16، 9 مايو 2025 (ت ع م) == الخريطة == في [[قالب:دول عربية]] قطاع غزة غير موجود، أرجو منك تغيير الخريطة، وأيضا حمايتك للصفحة فيها استعجال. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:17، 13 مايو 2025 (ت ع م) :{{ر|جودت}}، :أولا: إذا أمعَنتَ النظر قد ترى قطاع غزة في الخريطة. :ثانيا: أنا لا أصنع الخرائط، الصورة (ونظيراتها) موجودة في كومنز ومستخدمة في مشاريع أخرى بما في ذلك المشاريع العربية. :ثالثا: هذا ليس مكانا لمناقشة الجيوبوليتيك أو السياسات العالمية أو تضخيم الأمور، شخص عادي يجد صورة معبرة عن الدول العربية (ومستخدمة في ويكيبيديا الشقيقة)، صورة محايدة، يضعها في القالب، ويحميه لتفادي حروب تحرير مرتبطة بالأعلام أو ما شابه. :[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 04:47، 13 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] أرجو إضافة هذا الملف: [[:ملف:Arab nationalism Map.svg]] موجود في ويكيبيديا الشقيقة. فلسطين في الخريطة الحالية معلمة بالرمادي مع أن فلسطين جزء من ثقافة الوطن العربي، والصورة الحالية ذات طابع سياسي ومثيرة للرأي العام العربي. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 13:02، 13 مايو 2025 (ت ع م) ::@[[مستخدم:Najem Ajem|Najem Ajem]] هل من تعقيب؟ ما رأيك بالملف المقترح؟ [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 04:34، 14 مايو 2025 (ت ع م) :::{{ر|جودت}} هذا النقاش لا طائل ولا مغزى منه. الصورة الموجودة في القالب تعبر أصلا عن الدول العربية ولا حاجة لتغييرها إذ لا شائب فيها. وأرجو أن نستوعب أن ويكاموس مشروع قاموسي، نحن لا نصنع الخراط هنا ولا نناقش التفاصيل السياسية ولا نؤجج الصراعات، بل نعرّف الكلمات والمصطلحات ونوضح سياقات استخدامها، إذا لاحظتَ فالقالب هدفه البسيط هو جمع وصلات إلى صفحات محتوى، الصورة المرفوقة (التي بطريقة استثنائية عجيبة وغير مفهومة تثير حفيظتك) موجودة للتوضيح أو على الأقل للتزيين، وخرائط مطابقة لها موجودة في كل مكان، في ويكيبيديا العربية أيضا (بطبيعة الحال). فأرجو أن نتوقف عن التكلم بخصوص هذا الموضوع. وكمعلومة، الخريطة التي اقترحتَها أنت تضم مناطق من إيران، فهي لا تعبر عن الدول العربية، بل عن مكان انتشار العرب. تحياتي، [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 07:48، 14 مايو 2025 (ت ع م) == لديك بريد == مرحبا، لقد ارسلت رسالة لك بالبريد. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:39، 23 يونيو 2025 (ت ع م) :مرحبا {{ر|جودت}} لقد أرسلت لك ردا عبر الإيميل قبل يومين، فقط تأكد من "الرسائل غير المرغوبة" إن لزم الأمر. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:23، 24 يونيو 2025 (ت ع م) ::عفوا، يتعذر علي الوصول لحسابي. اكتب ردك هنا لو سمحت. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 12:46، 25 يونيو 2025 (ت ع م) :::'''سؤالك كان''': <blockquote>''مرحبا، أود ترشيح نفسي بعد أشهر لصلاحية الإداري، ما النصائح؟ وهل الترشيح لا يزال مبكرا؟''</blockquote> :::'''جوابي كان''': <blockquote> السلام عليك يا جودت، أهم ما يُنتظر من الإداري هو: * تقبّل آراء الآخرين والتعامل بتفهّم. * تجنّب الصدامات والمشاحنات مع الإداريين الآخرين. * صيانة الموقع دون اللجوء إلى إغراقه بتعديلات غير ضرورية. * التشاور مع المجتمع وبقية الإداريين في الأمور الجوهرية. مساهماتك الحالية جيدة، ولكن لم يمضِ على تسجيلك بعد سوى أقل من خمسة أشهر. دعنا نمنح الأمر بعض الوقت، ثم أرشحك للصلاحية بعد أشهر، بإذن الله. </blockquote> :::[[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 20:46، 26 يونيو 2025 (ت ع م) == سؤال == لمَ تراجعت عن ترشيح الشطب؟ إن كان البرنامج معروفا فهذا لا يعني أن له مكانا هنا. ما رأيك بإنشاء صفحة لمايكروسوفت كليب تشامب (Clipchamp)! إنه مجرد برنامج من تطوير شركة. وليس مفردة ولا علاقة له بالمحتوى القاموسي. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 17:45، 6 يوليو 2025 (ت ع م) :وبخصوص [[جوجل]] و [[Google]] فهي مواقع شعبية ومعروفة في جميع أنحاء العالم لكن [[أوتوكاد]] برنامج من تطوير شركة. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 09:45، 7 يوليو 2025 (ت ع م) ::«هدفنا من ويكاموس هو إنشاء قاموس يعتمد عليه، لا بل أن ننشئ أكبر قاموس في التاريخ سواء في العرض أو العمق.» ولن يتحقق ذلك بجعل القاموس يغرق بالصفحات العشوائية غير القاموسية. تحياتي [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 09:52، 7 يوليو 2025 (ت ع م) :::{{ر|جودت}} ويكاموس قاموس عام لا يضم فقط المدخلات اللغوية بل يضم أيضا المصطلحات التقنية والعلمية والاقتصادية وغيرها. هذا ينطبق على جميع النسخ ليس فقط النسخة العربية. وأوتوكاد ليس مجرد "منتج" بل برنامج مشهور وأُلِفّت له كتب تعليمية وتقنية عديدة لذا هذا المصطلح ليس صفحة عشوائية. وبالمناسبة ويكاموس الإنجليزي يضم صفحات لبرامج حاسوبية أقل شهرة بكثير من أوتوكاد مثل [[:en:CXF|CXF]]. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 21:39، 7 يوليو 2025 (ت ع م) ::::@[[مستخدم:Najem Ajem|Najem Ajem]] شكرا على التوضيح. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 08:56، 8 يوليو 2025 (ت ع م) == إضافة تبديل الأرقام == مرحبا @[[مستخدم:Najem Ajem|Najem Ajem]] بسبب حساسية المشروع يرجى التعديل على إضافة [[ميدياويكي:Gadget-Numeral-converter-toggle.js]] بحيث لا تؤثر على الصفحات ضمن النطاق العام، لقد أنشأت مؤخرا المدخلة [[180s]] وبسبب قيامي بتفعيل الإضافة تغيرت الأرقام للمشرقية. [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 14:02، 18 يوليو 2025 (ت ع م) :@[[مستخدم:Najem Ajem|Najem Ajem]] لعل الإشارة لم تصل [[مستخدم:جودت|<span style="font-size:medium;font-family:Script MT Bold;color:green;"> <span style="color:#008000">جودت</span></span> ]] [[نقاش المستخدم:جودت|<span style="font-size:small;font-family:Script MT Bold;color:#FF0000;"><span style="color:#cc0000">★</span></span>ناقشني]] 08:57، 21 يوليو 2025 (ت ع م) == وضع رابط للصفحات الخاصة == أرجو إضافة رابط للصفحات الخاصة كما في ويكي مصدر [[s:خاص:فرق/530005]]. [[مستخدم:حبيشان|حبيشان]] ([[نقاش المستخدم:حبيشان|نقاش]]) 21:20، 19 سبتمبر 2025 (ت ع م) :{{تم}}. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] == [[وحدة:auto cat]] == Hi there. Can you delete this module because obsoleted and not used anypages. [[مستخدم:Hiyuune|Hiyuune]] ([[نقاش المستخدم:Hiyuune|نقاش]]) 01:14، 20 مارس 2026 (ت ع م) :{{ر|Hiyuune}} {{نفذ}} [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 02:57، 20 مارس 2026 (ت ع م) == حذف صفحات ميدياويكي == أرجو حذف الصفحات التالية: # [[ميدياويكي:Chick.css]] # [[ميدياويكي:Chick.js]] # [[ميدياويكي:Simple.css]] # [[ميدياويكي:Simple.js]] # [[ميدياويكي:Standard.js]] # [[ميدياويكي:Standard.css]] # [[ميدياويكي:Geshi.css]] # [[ميدياويكي:Handheld.css]] الصفحات متعلقة بمظاهر محذوفة حاليا، وميزات محذوفة حاليا. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 00:41، الجمعة 22 شوال 1447هـ (+3) :{{ر|حبيشان}} {{تم}} شكرا على الملاحظة. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 13:22، 10 أبريل 2026 (ت ع م) == You may be an eligible candidate for the U4C election == <div lang="en" dir="ltr" class="mw-content-ltr"> Greetings, The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] seeks candidates for the 2026 election. The U4C is the global committee responsible for overseeing enforcement of the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]]. Elections are held annually, if elected a committee member serves for two years. This year the U4C requires candidates to hold administrator rights on at least one wiki, which is why you are being contacted as you appear to hold this right. There are other requirements, such as candidates must be at least 18 years old and may not be employed by the Wikimedia Foundation or other related chapters and affiliates. You can find more information in the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026#Call_for_Candidates|call for candidates on Meta-wiki]]. Additionally, the committee's working language is English; some ability to communicate in English is required. The election opens on 18 May, if you are eligible and interested you have until 10 May to submit your candidacy. There will week between for candidates to answer questions from the community. Voting takes place privately in [[m:Special:MyLanguage/SecurePoll|SecurePoll]], successful candidates must receive at least 60% support. More information is available on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the 2026 Elections page]], including timelines and other candidacy information. If you read over the material and consider yourself qualified, please consider submitting your name to run for the committee. If you think someone else in your community might be interested and qualified, please encourage them to run. In partnership with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 18:30، 28 أبريل 2026 (ت ع م) </div> <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30471712 --> == قد تكون مؤهلاً للتصويت في انتخابات U4C == <section begin="announcement-content" /> أتواصل معك لأنك شاركتَ سابقًا في انتخابات [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|لجنة تنسيق قواعد السلوك العالمية (U4C)]]. قد تكون مؤهلًا للتصويت في انتخابات U4C الحالية، المفتوحة الآن وتُغلق في 2 يونيو 2026. يمكنك معرفة المزيد عن المرشحين والانتخابات على [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|صفحة الانتخابات في ميتا]]، ومن هناك يمكنك الوصول إلى صفحة التصويت. مشاركتك في هذه الانتخابات مهمة لإدارة مجتمعات ويكيميديا، ونُقدّر وقتك الذي تُخصّصه للتعرف على المرشحين والتصويت. -- بالتعاون مع اللجنة، [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> [[m:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 17:20، 20 مايو 2026 (ت ع م) (تم إرسال هذه الرسالة إلى [[:نقاش المستخدم:الناجم العاجم]] ويتم نشرها هنا بسبب إعادة التوجيه.) <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30569831 --> == تعديلات على بعض القوالب والتصانيف == السلام عليكم أخي، عدلت بعض النصوص المضبوطة بالشكل ضبطًا مبالغًا فيه في قوالب تصريف الأفعال، ولم أتمكن من تعديل [[قالب:وثق]] لأنه محمي، فلو تعدله فضلًا كما سائر القوالب الأخرى. أقترح أيضًا أن تنقلوا [https://ar.wikipedia.org/wiki/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D9%82%D9%88%D8%A7%D8%B9%D8%AF_%D8%A7%D9%84%D8%B6%D8%A8%D8%B7_%D8%A8%D8%A7%D9%84%D8%B4%D9%83%D9%84 قواعد الضبط بالشكل] وتعتمدوها في ويكاموس. خالص المودة. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 10:21، 7 يونيو 2026 (ت ع م) :مرحبا {{ر|Michel Bakni}} لقد عدلت {{قا|وثق}} كما طلبت. وفيما يخص النقطة الثانية، فتوجد بالفعل صفحة [[ويكاموس:قواعد الضبط بالشكل]]، وكان الزميل حبيشان قد نقلها سابقا، هذه الصفحة مشار إليها في [[وق:تشكيل|سياسة التشكيل]]. إذا كانت لديك فكرة حول كيفية تعميم الصفحة أو جعلها أكثر وصولا، فأفكارك مرحب بها. تحياتي [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 17:42، 21 يونيو 2026 (ت ع م) == بخصوص قالب:تمفعل == السلام عليكم أخي، أريد أن ألفت نظرك لوجود هذا القالب وهو غير صحيح ويلزم شطبه. ثمة طائفة من الأفعال تُلحق بالرباعي وهي من أصول ثلاثية بتوهم أصالة الميم، أشهرها يُمركِز ويُمفصِل ويُمَحوِر ويُمعجِم. هذه يكون وزنها يُفعلِل وتعامل معاملة الرباعي. خالص المودة [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 08:42، 29 يونيو 2026 (ت ع م) :وعليكم السلام ورحمة الله وبركاته. لقد حذفتُ [[قالب:تمفعل]]، فحقا لا يوجد في أوزان لغة العرب القياسية وزن للأفعال يسمى "تَمَفْعَلَ". الزيادة بالتاء والميم معاً في أول الفعل غير واردة في أوزان الفعل الخماسي ولا السداسي. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 14:21، 4 أغسطس 2026 (ت ع م) == إزالة كمية == مرحبًا زميل، لاحظتُ أنك أزلتَ بعض الصفحات المنشأة عبر [https://ar-senses.toolforge.org/ أداة مراجعة المعاني] إزالة كمية للسبب: "تنسيق خاطئ"، فهل لن أن تُوضِّحَ تفاصيل مشكلة التنسيق حتى نعمل على حلّها؟ شكرًا لك [[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:47، 6 أغسطس 2026 (ت ع م) :مرحبا، {{ر|عباد ديرانية}} عدد تلك الصفحات لا يتجاوز عشرين صفحة، أنشأها الزميل {{مس|DERDAKI ILIAS}} ورشحها للحذف الأخ {{مس|ForzaGreen}}، عندما راجعتُها وجدتُها فعلا مليئة بالأخطاء بشكل ملحوظ، على مستوى التنسيق وكذلك على مستوى اللغة. وهذه الأخطاء راجعة لكون إلياس لازال مبتدئا وحسابه حديث، وليس لكون الأداة خاطئة، وقد ناقشه وائل بهذا الخصوص. شكرا لمتابعتك [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 18:14، 22 أغسطس 2026 (ت ع م) ::@[[مستخدم:عباد ديرانية|عباد]]، أضيفُ لما قاله الزميل @[[مستخدم:Najem Ajem|Najem Ajem]]: الصفحات لم تُنشأ عبر [https://ar-senses.toolforge.org/ أداة مراجعة المعاني]، وإنما كانت باستعمال بوت من تطوير الزميل إلياس. شكرا للجميع. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 18:45، 22 أغسطس 2026 (ت ع م) 6b5m3gb8wmue3wog2y5kyfu2gpu6yah وحدة:ar-verb 828 188226 1099159 1097879 2026-08-22T15:13:31Z ForzaGreen 28665 مزامنة من مستودع GitHub: تصحيح تصريف المثال الواوي (يَوْجُلُ)، المضاعف بالإتباع (هَمُمْتَ)، الناقص على وزن فعُل (تَسْهُوِينَ)، وأمر المؤنث للناقص (اِدْعِي) 1099159 Scribunto text/plain local export = {} --[=[ This module implements {{ar-conj}} and provides the underlying conjugation functions for {{ar-verb}} (whose actual formatting is done in [[Module:ar-headword]]). Author: User:Benwing, from an early version (2013-2014) by User:Atitarev, User:ZxxZxxZ. ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "past_1s" (past tense first-person singular), "juss_pass_3fp" (non-past jussive passive third-person feminine plural) "ap" (active participle). Each slot is filled with zero or more forms. -- "form" = The conjugated Arabic form representing the value of a given slot. -- "lemma" = The dictionary form of a given Arabic term. For Arabic, normally the third person masculine singular past, although other forms may be used if this form is missing (e.g. in passive-only verbs or verbs lacking the past). ]=] --[=[ FIXME: 1. Finish unimplemented conjugation types. Only IX-final-weak left (extremely rare, possibly only one verb اِعْمَايَ (according to Haywood and Nahmad p. 244, who are very specific about the irregular occurrence of alif + yā instead of expected اِعْمَيَّ with doubled yā). Not in Hans Wehr. NOTE: Not true about this, cf. form IX اِرْعَوَى "to desist, to repent, to see the light". Also note form XII اِخْضَوْضَرَ = form IX اِخْضَرَّ "to be or become green". [DONE except for اِعْمَايَ] 2. Implement irregular verbs as special cases and recognize them, e.g. -- laysa "to not be"; only exists in the past tense, no non-past, no imperative, no participles, no passive, no verbal noun. Irregular alternation las-/lays-. [IMPLEMENTABLE USING OVERRIDES] -- istaḥā yastaḥī "be ashamed of" -- this is complex according to Hans Wehr because there are two verbs, regular istaḥyā yastaḥyī "to spare (someone)'s life" and irregular istaḥyā yastaḥyī "to be ashamed to face (someone)", which is irregular because it has the alternate irregular form istaḥā yastaḥī which only applies to this meaning. Currently we follow Haywood and Nahmad in saying that both varieties can be spelled istaḥyā/istaḥā/istaḥḥā, but we should instead use a variant= param similar to حَيَّ to distinguish the two possibilities, and maybe not include istaḥḥā. -- ʿayya/ʿayiya yaʿayyu/yaʿyā "to not find the right way, be incapable of, stammer, falter, fall ill". This appears to be a mixture of a geminate and final-weak verb. Unclear what the whole paradigm looks like. Do the consonant-ending parts in the past follow the final-weak paradigm? Is it the same in the non-past? Or can you conjugate the non-past fully as either geminate or final-weak? -- اِنْمَحَى inmaḥā or يمَّحَى immaḥā "to be effaced, obliterated; to disappear, vanish" has irregular assimilation of inm- to imm- as an alternative. inmalasa "to become smooth; to glide; to slip away; to escape" also has immalasa as an alternative. The only other form VII verbs in Hans Wehr beginning with -m- are inmalaḵa "to be pulled out, torn out, wrenched" and inmāʿa "to be melted, to melt, to dissolve", which are not listed with imm- alternatives, but might have them; if so, we should handle this generally. [DONE] -- يَرَعَ yaraʕa yariʕu "to be a coward, to be chickenhearted" as an alternative form of يَرِعَ yariʕa yayraʕu (as given in Wehr). [IMPLEMENTABLE USING OVERRIDES] 3. Implement individual override parameters for each paradigm part. See Module:fro-verb for an example of how to do this generally. Note that {{temp|ar-conj-I}} and other of the older templates already had such individual override params. [DONE] Irregular verbs already implemented: -- [ḥayya/ḥayiya yaḥyā "live" -- behaves like a normal final-weak verb (e.g. past first singular ḥayītu) except in the past-tense parts with vowel-initial endings (all the third person except for the third feminine plural). The normal singular and dual endings have -yiya- in them, which compresses to -yya-, with the normal endings the less preferred ones. In masculine third plural, expected ḥayū is replaced by ḥayyū by analogy to the -yy- parts, and the regular form is not given as an alternant in John Mace. Barron's 201 verbs appears to have the regular ḥayū as the part, however. Note also that final -yā appears with tall alif. This appears to be a spelling convention of Arabic, also applying in ḥayyā (form II, "to keep (someone) alive") and 'aḥyā (form IV, "to animate, revive, give birth to, give new life to").] -- implemented -- [ittaxadha yattaxidhu "take"] -- implemented -- [sa'ala yas'alu "ask" with alternative jussive/imperative yasal/sal] -- implemented -- [ra'ā yarā "see"] -- implemented -- ['arā yurī "show"] -- implemented -- ['akala ya'kulu "eat" with imperative kul] -- implemented -- ['axadha ya'xudhu "take" with imperative xudh] -- implemented -- ['amara ya'muru "order" with imperative mur] -- implemented --]=] local force_cat = false -- set to true for debugging -- if true, always maintain manual translit during processing, and compare against full translit at the end local debug_translit = false local lang = require("Module:languages").getByCode("ar") local m_links = require("Module:links") local m_string_utilities = require("Module:string utilities") local m_table = require("Module:table") local ar_utilities = require("Module:ar-utilities") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local list_to_text = mw.text.listToText local rfind = m_string_utilities.find local rsubn = m_string_utilities.gsub local rmatch = m_string_utilities.match local rsplit = m_string_utilities.split local usub = m_string_utilities.sub local ulen = m_string_utilities.len local u = m_string_utilities.char local unpack = unpack or table.unpack -- Lua 5.2 compatibility local dump = mw.dumpObject -- Within this module, conjugations are the functions that do the actual -- conjugating by creating the parts of a basic verb. -- They are defined further down. local conjugations = {} -- hamza variants local HAMZA = u(0x0621) -- hamza on the line (stand-alone hamza) = ء local HAMZA_ON_ALIF = u(0x0623) local HAMZA_ON_W = u(0x0624) local HAMZA_UNDER_ALIF = u(0x0625) local HAMZA_ON_Y = u(0x0626) local HAMZA_ANY = "[" .. HAMZA .. HAMZA_ON_ALIF .. HAMZA_UNDER_ALIF .. HAMZA_ON_W .. HAMZA_ON_Y .. "]" local HAMZA_PH = u(0xFFF0) -- hamza placeholder local BAD = u(0xFFF1) local BORDER = u(0xFFF2) -- diacritics local A = u(0x064E) -- fatḥa local AN = u(0x064B) -- fatḥatān (fatḥa tanwīn) local U = u(0x064F) -- ḍamma local UN = u(0x064C) -- ḍammatān (ḍamma tanwīn) local I = u(0x0650) -- kasra local IN = u(0x064D) -- kasratān (kasra tanwīn) local SK = u(0x0652) -- sukūn = no vowel local SH = u(0x0651) -- šadda = gemination of consonants local DAGGER_ALIF = u(0x0670) local DIACRITIC_ANY_BUT_SH = "[" .. A .. I .. U .. AN .. IN .. UN .. SK .. DAGGER_ALIF .. "]" -- Pattern matching short vowels local AIU = "[" .. A .. I .. U .. "]" -- Pattern matching short vowels or sukūn local AIUSK = "[" .. A .. I .. U .. SK .. "]" -- Pattern matching any diacritics that may be on a consonant local DIACRITIC = SH .. "?" .. DIACRITIC_ANY_BUT_SH -- translit_patterns local vowels = "aeiouāēīōū" local NV = "[^" .. vowels .. "]" local dia = {a = A, i = I, u = U} local undia = {[A] = "a", [I] = "i", [U] = "u", ["-"] = "-"} -- various letters and signs local ALIF = u(0x0627) -- ʾalif = ا local AMAQ = u(0x0649) -- ʾalif maqṣūra = ى local AMAD = u(0x0622) -- ʾalif madda = آ local TAM = u(0x0629) -- tāʾ marbūṭa = ة local T = u(0x062A) -- tāʾ = ت local HYPHEN = u(0x0640) local N = u(0x0646) -- nūn = ن local W = u(0x0648) -- wāw = و local Y = u(0x064A) -- yāʾ = ي local S = "س" local M = "م" local LRM = u(0x200e) -- left-to-right mark -- common combinations local AH = A .. TAM local AT = A .. T local AA = A .. ALIF local AAMAQ = A .. AMAQ local AAH = AA .. TAM local AAT = AA .. T local II = I .. Y local UU = U .. W local AY = A .. Y local AW = A .. W local AYSK = AY .. SK local AWSK = AW .. SK local NA = N .. A local NI = N .. I local AAN = AA .. N local AANI = AA .. NI local AYNI = AYSK .. NI local AWNA = AWSK .. NA local AYNA = AYSK .. NA local AYAAT = AY .. AAT local UNU = "[" .. UN .. U .. "]" local MA = M .. A local MU = M .. U local TA = T .. A local TU = T .. U local _I = ALIF .. I local _U = ALIF .. U --W: Morphological pattern (الوزن الصرفي) to verb form mapping local MORPHOLOGICAL_PATTERN_TO_FORM = { ["فعَل يفعُل"] = "I/a~u", ["فعَل يفعِل"] = "I/a~i", ["فعَل يفعَل"] = "I/a~a", ["فعُل يفعُل"] = "I/u~u", ["فعِل يفعَل"] = "I/i~a", ["فعِل يفعِل"] = "I/i~i", ["فعّل"] = "II", ["فاعل"] = "III", ["أفعل"] = "IV", ["تفعّل"] = "V", ["تفاعل"] = "VI", ["انفعل"] = "VII", ["افتعل"] = "VIII", ["افعلّ"] = "IX", ["استفعل"] = "X", ["افعالّ"] = "XI", ["افعوعل"] = "XII", ["افعوّل"] = "XIII", ["فعلل"] = "Iq", ["تفعلل"] = "IIq", ["افعنلل"] = "IIIq", -- "XIV" should not be used ["افعللّ"] = "IVq", } --W: Create reverse mapping from form to morphological pattern local FORM_TO_MORPHOLOGICAL_PATTERN = {} for pattern, form in pairs(MORPHOLOGICAL_PATTERN_TO_FORM) do FORM_TO_MORPHOLOGICAL_PATTERN[form] = pattern end --W: local MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV = { ["فعَل يفعُل"] = "مُجرَّد", ["فعَل يفعِل"] = "مُجرَّد", ["فعَل يفعَل"] = "مُجرَّد", ["فعُل يفعُل"] = "مُجرَّد", ["فعِل يفعَل"] = "مُجرَّد", ["فعِل يفعِل"] = "مُجرَّد", ["فعّل"] = "مزيد بحرف", ["فاعل"] = "مزيد بحرف", ["أفعل"] = "مزيد بحرف", ["تفعّل"] = "مزيد بحرفين", ["تفاعل"] = "مزيد بحرفين", ["انفعل"] = "مزيد بحرفين", ["افتعل"] = "مزيد بحرفين", ["افعلّ"] = "مزيد بحرفين", ["استفعل"] = "مزيد بثلاثة أحرف", ["افعالّ"] = "مزيد بثلاثة أحرف", ["افعوعل"] = "مزيد بثلاثة أحرف", ["افعوّل"] = "مزيد بثلاثة أحرف", ["فعلل"] = "مُجرَّد", ["تفعلل"] = "مزيد بحرف", ["افعنلل"] = "مزيد بحرفين", ["افعللّ"] = "مزيد بحرفين", } local translit_cache = { -- hamza variants [HAMZA] = "ʔ", [HAMZA_ON_ALIF] = "ʔ", [HAMZA_ON_W] = "ʔ", [HAMZA_UNDER_ALIF] = "ʔ", [HAMZA_ON_Y] = "ʔ", [HAMZA_PH] = "ʔ", -- diacritics [A] = "a", [AN] = "an", [U] = "u", [UN] = "un", [I] = "i", [IN] = "in", [SK] = "", [SH] = "*", -- handled specially [DAGGER_ALIF] = "ā", -- various letters and signs [""] = "", [ALIF] = BAD, -- we should never be transliterating ALIF by itself, as its translit in isolation is ambiguous [AMAQ] = BAD, [AMAD] = "ʔā", [TAM] = "", [T] = "t", [N] = "n", [W] = "w", [Y] = "y", [S] = "s", [M] = "m", [LRM] = "", -- common combinations [AH] = "a", [AT] = "at", [AA] = "ā", [AAMAQ] = "ā", [AAH] = "āh", [AAT] = "āt", [II] = "ī", [UU] = "ū", [AY] = "ay", [AW] = "aw", [AYSK] = "ay", [AWSK] = "aw", [NA] = "na", [NI] = "ni", [AAN] = "ān", [AANI] = "āni", [AYNI] = "ayni", [AWNA] = "awna", [AYNA] = "ayna", [AYAAT] = "ayāt", [MA] = "ma", [MU] = "mu", [TA] = "ta", [TU] = "tu", [_I] = "i", [_U] = "u", } local function transliterate(text) local cached = translit_cache[text] if cached then if cached == BAD then error(("Internal error: Unable to transliterate %s because explicitly marked as BAD"):format(text)) end return cached end local tr = (lang:transliterate(text)) if not tr then error(("Internal error: Unable to transliterate: %s"):format(text)) end translit_cache[text] = tr return tr end local all_person_number_list = { "1s", "2ms", "2fs", "3ms", "3fs", "2d", "3md", "3fd", "1p", "2mp", "2fp", "3mp", "3fp" } local function make_person_number_slot_accel_list(list) local slot_accel_list = {} return slot_accel_list end local imp_person_number_list = {} for _, pn in ipairs(all_person_number_list) do if pn:find("^2") then table.insert(imp_person_number_list, pn) end end local passive_types = m_table.listToSet { "pass", -- verb has both active and passive "ipass", -- verb is active with impersonal passive "nopass", -- verb is active-only "onlypass", -- verb is passive-only "onlypass-impers", -- verb itself is impersonal, meaning passive-only with impersonal passive } local indicator_flags = m_table.listToSet { "nopast", "no_nonpast", "noimp", "nocat", -- don't categorize or include annotations about this; useful in suppletive parts of verbs "reduced", -- verb has assimilation/reduction of initial coronals "altgem", -- form X with alternative past geminate forms with final-weak endings } export.potential_lemma_slots = {"past_3ms", "past_pass_3ms", "ind_3ms", "ind_pass_3ms", "imp_2ms"} export.unsettable_slots = {} for _, potential_lemma_slot in ipairs(export.potential_lemma_slots) do table.insert(export.unsettable_slots, potential_lemma_slot .. "_linked") end -- We don't set the active participle directly for form I because we don't want stative verbs (with past vowel i or u) -- to default to فَاعِل. Instead we set the special slot 'ap1' and later copy it to 'ap' for non-stative verbs. The user -- meanwhile can explicitly request the فَاعِل form for active participles for stative verbs using `ap:+`. table.insert(export.unsettable_slots, "ap1") -- primary default فَاعِل for form I active participles table.insert(export.unsettable_slots, "ap2") -- secondary default فَعِيل for form I active participles (stative I) table.insert(export.unsettable_slots, "ap3") -- secondary default فَعِل for form I active participles (stative II) table.insert(export.unsettable_slots, "apcd") -- secondary default أَفْعَل for form I active participles (color/defect) table.insert(export.unsettable_slots, "apan") -- secondary default فَعْلَان for form I active participles (in -ān) table.insert(export.unsettable_slots, "pp2") -- secondary default فَعِيل for form I passive participles (same as ap2) table.insert(export.unsettable_slots, "vn2") -- secondary default فِعَال for form III verbal nouns export.unsettable_slots_set = m_table.listToSet(export.unsettable_slots) local default_indicator_to_active_participle_slot = { ["+"] = "ap1", ["++"] = "ap2", ["+++"] = "ap3", ["+cd"] = "apcd", ["+an"] = "apan", } local slots_that_may_be_uncertain = { vn = "verbal noun", ap = "active participle", } -- Initialize all the slots for which we generate forms. local function add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_slots = { {"ap", "act|part"}, {"pp", "pass|part"}, {"vn", "vnoun"}, } for _, unsettable_slot in ipairs(export.unsettable_slots) do table.insert(alternant_multiword_spec.verb_slots, {unsettable_slot, "-"}) end -- Add entries for a slot with person/number variants. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is a string listing the set of inflection tags to add after the person/number tags. -- `person_number_list` is a list of the person/number slot suffixes to add to `slot_prefix`. local function add_personal_slot(slot_prefix, tag_suffix, person_number_list) for _, persnum in ipairs(person_number_list) do local slot = slot_prefix .. "_" .. persnum local accel = persnum:gsub("(.)", "%1|") .. tag_suffix table.insert(alternant_multiword_spec.verb_slots, {slot, accel}) end end local tenses = { {"past", "past|%s"}, {"ind", "non-past|%s|ind"}, {"sub", "non-past|%s|sub"}, {"juss", "non-past|%s|juss"}, } for _, slot_accel in ipairs(tenses) do local slot, accel = unpack(slot_accel) for _, voice in ipairs {"act", "pass"} do add_personal_slot(voice == "act" and slot or slot .. "_pass", accel:format(voice), all_person_number_list) end end add_personal_slot("imp", "imp", imp_person_number_list) alternant_multiword_spec.verb_slots_map = {} for _, slot_accel in ipairs(alternant_multiword_spec.verb_slots) do local slot, accel = unpack(slot_accel) alternant_multiword_spec.verb_slots_map[slot] = accel end end local overridable_stems = {} local slot_override_param_mods = { footnote = { item_dest = "footnotes", store = "insert", }, alt = {}, t = { -- [[Module:links]] expects the gloss in "gloss". item_dest = "gloss", }, gloss = {}, g = { -- [[Module:links]] expects the genders in "g". `sublist = true` automatically splits on comma (optionally -- with surrounding whitespace). item_dest = "genders", sublist = true, }, pos = {}, lit = {}, id = {}, --W: The q/qq/l/ll (qualifier and label) modifiers were removed: rendering them -- needs [[Module:pron qualifier]], which does not exist on ar.wiktionary, so any -- use of them raised a script error. Accepting them here again requires importing -- that module first and restoring the block in generate_link() below. } local function generate_obj(formval, parse_err, prefix, is_slot_override) local val, uncertain = formval:match("^(.*)(%?)$") val = val or formval uncertain = not not uncertain local ar, translit = val:match("^(.*)//(.*)$") if not ar then ar = val end if ar == "" then if uncertain then ar = "?" else error(("Can't specify blank value for override for %s override '%s'"):format( is_slot_override and "slot" or "stem", prefix)) end end return {form = ar, translit = translit, uncertain = uncertain} end local function parse_inline_modifiers(comma_separated_group, parse_err, prefix, is_slot_override) local function this_generate_obj(formval, parse_err) return generate_obj(formval, parse_err, prefix, is_slot_override) end return put.parse_inline_modifiers_from_segments { group = comma_separated_group, props = { param_mods = slot_override_param_mods, parse_err = parse_err, generate_obj = this_generate_obj, pre_normalize_modifiers = function(data) local modtext = data.modtext modtext = modtext:match("^(%[.*%])$") if modtext then return ("<footnote:%s>"):format(modtext) end return data.modtext end, }, } end local function allow_multiple_values_for_override(comma_separated_groups, data, is_slot_override) local retvals = {} for _, comma_separated_group in ipairs(comma_separated_groups) do local retval if is_slot_override then --W: pass `prefix` and `is_slot_override` through; without them the error -- raised for a blank override value formatted a nil prefix, which is a -- crash on Lua 5.1 rather than the intended message. Reachable from e.g. -- <I/a~u.vn:[[كتابة]]>, where the [[...]] is consumed as a footnote and -- leaves the value empty. retval = parse_inline_modifiers(comma_separated_group, data.parse_err, data.prefix, is_slot_override) else retval = generate_obj(comma_separated_group[1], data.parse_err, data.prefix, is_slot_override) retval.footnotes = data.fetch_footnotes(comma_separated_group) end table.insert(retvals, retval) end for _, form in ipairs(retvals) do if form.form == "+" or default_indicator_to_active_participle_slot[form.form] then if form.form ~= "+" and default_indicator_to_active_participle_slot[form.form] and not is_slot_override then error(("Stem override '%s' cannot use %s to request a secondary default"):format( data.prefix, form.form)) end data.base.slot_override_uses_default[data.prefix] = true end end for _, form in ipairs(retvals) do if form.form == "-" then data.base.slot_explicitly_missing[data.prefix] = true break end end if data.base.slot_explicitly_missing[data.prefix] then for _, form in ipairs(retvals) do if form.form ~= "-" then data.parse_err(("For slot or stem '%s', saw both - and a value other than -, which isn't allowed"): format(data.prefix)) end end return nil end return retvals end local function simple_choice(choices) return function(separated_groups, data) if #separated_groups > 1 then data.parse_err("For spec '" .. data.prefix .. ":', only one value currently allowed") end if #separated_groups[1] > 1 then data.parse_err("For spec '" .. data.prefix .. ":', no footnotes currently allowed") end local choice = separated_groups[1][1] if not m_table.contains(choices, choice) then data.parse_err("For spec '" .. data.prefix .. ":', saw value '" .. choice .. "' but expected one of '" .. table.concat(choices, "،") .. "'") end return choice end end for _, overridable_stem in ipairs { "past", "past_v", "past_c", "past_pass", "past_pass_v", "past_pass_c", "nonpast", "nonpast_v", "nonpast_c", "nonpast_pass", "nonpast_pass_v", "nonpast_pass_c", "imp", "imp_v", "imp_c", } do overridable_stems[overridable_stem] = allow_multiple_values_for_override end overridable_stems.past_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.past_pass_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.nonpast_final_weak_vowel = simple_choice { "ā", "ī", "ū" } overridable_stems.nonpast_pass_final_weak_vowel = simple_choice { "ā", "ī", "ū" } ------------------------------------------------------------------------------- -- Utility functions -- ------------------------------------------------------------------------------- -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) return (rsubn(term, foo, bar)) end -- version of rsubn() that returns a 2nd argument boolean indicating whether a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end -- Concatenate one or more strings or form objects. local function q(...) local not_all_strings = debug_translit local has_manual_translit = debug_translit for i = 1, select("#", ...) do local argt = select(i, ...) if not argt then error(("Internal error: Saw nil at index %s: %s"):format(i, dump({...}))) end if type(argt) ~= "string" then not_all_strings = true if argt.translit then has_manual_translit = true break end end end if not not_all_strings then -- just strings, concatenate directly return table.concat({...}) end local formvals = {} local translit = has_manual_translit and {} or nil local footnotes for i = 1, select("#", ...) do local argt = select(i, ...) if type(argt) == "string" then formvals[i] = argt if has_manual_translit then translit[i] = transliterate(argt) end else formvals[i] = argt.form if has_manual_translit then translit[i] = argt.translit or transliterate(argt.form) end footnotes = iut.combine_footnotes(footnotes, argt.footnotes) end end -- FIXME: Do we want to support other properties? return { form = table.concat(formvals), translit = has_manual_translit and table.concat(translit) or nil, footnotes = footnotes, } end -- Return the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget(rad) if type(rad) == "string" then return rad elseif type(rad) == "table" then return rad.form else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end export.rget = rget -- for use in [[Module:ar-headword]] -- Return the footnotes associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget_footnotes(rad) if type(rad) == "string" then return nil elseif type(rad) == "table" then return rad.footnotes else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end -- Return true if the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object) -- is `val`. local function req(rad, val) return rget(rad) == val end -- True if a form-I verb whose first radical is wāw elides that wāw in the non-past (يَعِدُ for -- *يَوْعِدُ) rather than keeping it (يَوْجَلُ). The elision belongs to the kasra non-past -- a~i -- وَعَدَ يَعِدُ, i~i وَرِثَ يَرِثُ -- and to the fatḥa non-past that is a throat-letter lowering of -- that same underlying kasra: a~a وَضَعَ يَضَعُ, وَهَبَ يَهَبُ. Everywhere else the wāw stays: -- i~a وَجِلَ يَوْجَلُ، وَنِيَ يَوْنَى (a fatḥa non-past that is the regular partner of a kasra past, -- not a lowered kasra) -- *~u وَجَلَ يَوْجُلُ، وَجُهَ يَوْجُهُ (a ḍamma non-past is never a lowered kasra) -- The two elided-anyway lexemes with a kasra past (وَسِعَ يَسَعُ, وَطِئَ يَطَأُ) are lexical and are -- what the explicit `I-assimilated` weakness exists to express -- see the comment on it in -- detect_indicator_spec(). -- -- The u-non-past half of this is attested directly: أنطوان الدحداح، معجم تصريف الأفعال العربية -- prints يَوْجُلُ/اُوْجُلْ for وَجَلَ (ص١٣٦) and says so in the page's own note -- "لا تُحذَفُ واوُ -- الفعلِ في المُضارعِ ولا تُقلَبُ في الأمرِ" -- and يَوْنَى/اِوْنَ for وَنِيَ (ص٢٣٠). -- -- Returns true when the vowels aren't known, which keeps the historical default for callers -- that have radicals but no vowel pattern. local function form_i_w_assimilated(past_vowel, nonpast_vowel) if not past_vowel or not nonpast_vowel then return true end return req(nonpast_vowel, I) or req(nonpast_vowel, A) and req(past_vowel, A) end --W: Geminate form-I roots whose degemination vowel follows the مضارع by إتباع. -- When gemination breaks under a consonant-initial suffix, the vowel that surfaces on the -- second radical (مَدَدْتَ's second د) is normally the verb's own past vowel, which the وزن -- fixes at one value per measure: فتح for فعَل يفعُل (مَدَدْتَ، فَرَرْتَ، عَضَضْتَ), كسر for -- فعِل يفعَل (ظَلِلْتَ). Classical grammar also attests a minority إتباع variant on the -- فعَل يفعُل measure, where that vowel instead follows the مضارع's own ضمة (هَمُمْتَ). Which -- of the two a given verb takes is a fact about the lexeme, not about its وزن -- هَمَّ and -- مَدَّ share the measure and differ here -- so it cannot be derived from جذر + وزن and is -- listed, the same way SOUND_FORM_I_UU_ROOTS lists هَيُؤَ. Keyed rad1..rad2..rad3 and gated -- on the a~u pattern, so a listed root still degeminates normally under any other pattern. local GEMINATE_ITBAA_ROOTS = { ["همم"] = true, -- هَمَّ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، ص١٩٢ } -- The vowel that surfaces on the second radical of a geminate form-I verb once gemination -- breaks. `past_vowel` unless the root is an attested إتباع lexeme; see GEMINATE_ITBAA_ROOTS. local function geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel) if past_vowel and nonpast_vowel and req(past_vowel, A) and req(nonpast_vowel, U) and GEMINATE_ITBAA_ROOTS[rad1 .. rad2 .. rad3] then return nonpast_vowel end return past_vowel end --W: True if a form-I final-weak verb keeps rad3 as a consonant in the 2fs non-past and -- imperative (تَسْهُوِينَ، اُسْهُوِي) instead of contracting it away (تَسْهِينَ، اِسْهِي). -- -- Gated on the فعُل يفعُل measure, i.e. both ending vowels being ū. That measure is what -- keeps rad3 consonantal in the first place -- its past 3ms is سَهُوَ, not the سَها a~u root -- like دَعَا gives -- and the module already retains rad3 in every other slot of the -- paradigm (يَسْهُو، تَسْهُونَ، اُسْهُوا). The 2fs was the one slot that fell back to the -- contracted stem, so this makes the measure internally consistent rather than adding a -- new behaviour. دَعَا is untouched: its past ending vowel is aw, not ū, so تَدْعِينَ stands. -- -- Evidence is one printed paradigm, سَهُوَ (p.204, model 147), generalised to its measure: -- the corpus has no second فعُل يفعُل final-weak page to cross-check against, and سَرُوَ, -- the obvious other member, is outside it. If that generalisation turns out to be too -- wide, narrow it here -- a root table gated the same way, as SOUND_FORM_I_UU_ROOTS does -- for هَيُؤَ -- rather than in make_final_weak_verb(). See README "Open findings" #8. local function final_weak_uu_retains_rad3(past_ending_vowel, nonpast_ending_vowel) return past_ending_vowel == "ū" and nonpast_ending_vowel == "ū" end -- Map `vow` (a past/non-past vowel, either a string or form object without translit) by passing the formval through -- `fn`. Don't call this on radicals because they may have manual translit and it isn't clear how to handle that. local function map_vowel(vow, fn) if type(vow) == "string" then return fn(vow) elseif type(vow) == "table" then return {form = fn(vow.form), footnotes = vow.footnotes} else error(("Internal error: Unexpected type for past/non-past vowel: %s"):format(dump(vow))) end end local function get_radicals_3(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.past, vowel_spec.nonpast end local function get_radicals_4(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.rad4 end local function is_final_weak(base, vowel_spec) return vowel_spec.weakness == "final-weak" or base.form == "XV" end --W: Create a simple link local function link_term_simple(text) return "[[" .. text .. "]]" end local function link_term(text, face, id) return m_links.full_link({lang = lang, term = text, tr = "-", id = id}, face) end local function tag_text(text, tag, class) return m_links.full_link({lang = lang, alt = text, tr = "-"}) end local function track(page) require("Module:debug/track")("ar-verb/" .. page) return true end local function track_if_ar_conj(base, page) if base.alternant_multiword_spec.source_template == "ar-conj" then require("Module:debug/track")("ar-verb/" .. page) end return true end local function reorder_shadda(word) -- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets -- replaced with short-vowel+shadda during NFC normalisation, which -- MediaWiki does for all Unicode strings; however, it makes various -- processes inconvenient, so undo it. word = rsub(word, "(" .. DIACRITIC_ANY_BUT_SH .. ")" .. SH, SH .. "%1") return word end local function apply_nfc_shadda(word) -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization. This reverses the -- internal shadda+vowel format used during processing. word = rsub(word, SH .. "(" .. DIACRITIC_ANY_BUT_SH .. ")", "%1" .. SH) return word end ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- local function skip_slot(base, slot, allow_overrides) if base.slot_explicitly_missing[slot] then return true end if not allow_overrides and base.slot_overrides[slot] and not base.slot_override_uses_default[slot] then -- Skip any slots for which there are overrides, except those that request the default value using +, ++, etc. return true end if base.passive == "nopass" and (slot == "pp" or slot:find("_pass")) then return true elseif base.passive == "onlypass" and slot ~= "pp" and slot ~= "vn" and not slot:find("_pass") then return true elseif base.passive == "ipass" and slot:find("_pass") and not slot:find("3ms") then return true elseif base.passive == "onlypass-impers" and slot ~= "pp" and slot ~= "vn" and (not slot:find("_pass") or slot:find("_pass") and not slot:find("3ms")) then return true end if base.nopast and slot:find("^past_") then return true end if base.noimp and slot:find("^imp_") then return true end if base.no_nonpast and (slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss")) then return true end return false end local function basic_combine_stem_ending(stem, ending) return stem .. ending end local function basic_combine_stem_ending_tr(stem, ending) return stem .. ending end -- Concatenate `prefixes`, `stems` and `endings` (any of which may be an abbreviate form list, i.e. strings, form -- objects or lists of strings or form objects) and store into `slot`. If a user-supplied override exists for the slot, -- nothing will happen unless `allow_overrides` is provided. local function add3(base, slot, prefixes, stems, endings, allow_overrides) if skip_slot(base, slot, allow_overrides) then return end -- Optimization since the prefixes are almost always single strings. if type(prefixes) == "string" then local function do_combine_stem_ending(stem, ending) return prefixes .. stem .. ending end local function do_combine_stem_ending_tr(stem, ending) return transliterate(prefixes) .. stem .. ending end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, transliterate, do_combine_stem_ending_tr, base.form_footnotes) else iut.add_multiple_forms(base.forms, slot, {prefixes, stems, endings}, basic_combine_stem_ending, transliterate, basic_combine_stem_ending_tr, base.form_footnotes) end end -- Insert one or more forms in `form_or_forms` into `slot`. `form_or_forms` is an abbreviated form list (see comment at -- top of [[Module:inflection utilities]]). If a user-supplied override exists for the slot, nothing will happen unless -- `allow_overrides` is provided. BEWARE: One form object should never occur in two different slots, or twice in a given -- slot; if taking a form object from an existing slot, make sure to shallowCopy() it. local function insert_form_or_forms(base, slot, form_or_forms, allow_overrides, uncertain) if not skip_slot(base, slot, allow_overrides) then -- Some optimizations of the most common case of inserting a single string. if type(form_or_forms) == "string" and not base.form_footnotes then form_or_forms = {form = form_or_forms, uncertain = uncertain} iut.insert_form(base.forms, slot, form_or_forms) else local list = iut.convert_to_general_list_form(form_or_forms, base.form_footnotes) if uncertain then for _, formobj in ipairs(list) do formobj.uncertain = true end end iut.insert_forms(base.forms, slot, list) end end end -- Insert `string_or_form` into both the ap2 and pp2 slots, shallowCopying a form object to make sure no form objects -- occur in two slots. local function insert_ap2_pp2(base, string_or_form) insert_form_or_forms(base, "ap2", string_or_form) if type(string_or_form) == "table" then string_or_form = m_table.shallowCopy(string_or_form) end insert_form_or_forms(base, "pp2", string_or_form) end -- Convert `stemforms` (a string, a form object, or a list of strings and/or form objects) into "general form" (a list -- of form objects) and map `fn` over the list of objects. `fn` is passed two arguments (form value and translit) and -- should likewise return the new form value and translit. Footnotes will be preserved. FIXME: Preserve other metadata. local function map_general(stemforms, fn) return iut.map_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Similar to map_general() except that `fn` should return a single value (one or more strings or form objects), instead -- of two values (form value and translit), and the resulting value(s) from all calls to `fn` will be flattened to -- construct the overall return value. Footnotes will be preserved. FIXME: Preserve other metadata. local function flatmap_general(stemforms, fn) return iut.flatmap_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Given user-supplied stem overrides in `base`, construct any derived stem overrides (e.g. vowel-specific or -- consonant-specific variants), and truncate initial y-/ي- in any non-past overrides. local function construct_stems(base) local stems = base.stem_overrides stems.past_v = stems.past_v or stems.past stems.past_c = stems.past_c or stems.past stems.past_pass_v = stems.past_pass_v or stems.past_pass stems.past_pass_c = stems.past_pass_c or stems.past_pass stems.nonpast_v = stems.nonpast_v or stems.nonpast stems.nonpast_c = stems.nonpast_c or stems.nonpast stems.nonpast_pass_v = stems.nonpast_pass_v or stems.nonpast_pass stems.nonpast_pass_c = stems.nonpast_pass_c or stems.nonpast_pass stems.imp_v = stems.imp_v or stems.imp stems.imp_c = stems.imp_c or stems.imp local function truncate_nonpast_initial_cons(stem_type, form, translit) if form == "+" then return form, translit end if not form:find("^" .. Y) then error(("Form value %s for stem type '%s' should begin with ي"):format(form, stem_type)) end form = form:gsub("^" .. Y, "") if translit then if not translit:find("^y") then error(("Translit value %s for stem type '%s' should begin with y"):format(translit, stem_type)) end translit = translit:gsub("^y", "") end return form, translit end for _, nonpast_stem_type in ipairs { "nonpast_v", "nonpast_c", "nonpast_pass_v", "nonpast_pass_c" } do if stems[nonpast_stem_type] then stems[nonpast_stem_type] = map_general(stems[nonpast_stem_type], function(form, translit) return truncate_nonpast_initial_cons(nonpast_stem_type, form, translit) end) end end end -- Given user-specified overrides for stem `stemname`, return overrides with occurrences of + replaced by -- `default_stem`. If no overrides, return `default_stem`, or {} if no default. local function override_stem_if_needed(base, stemname, default_stem) local overrides = base.stem_overrides[stemname] if not overrides then return default_stem or {} end return map_general(overrides, function(form, translit) if form ~= "+" and default_indicator_to_active_participle_slot[form] then error(("Stem overrides cannot use secondary default indicators but saw %s in stem override '%s'"):format( form, stemname)) end if form == "+" then if translit then error(("Cannot supply manual translit along with + for stem override '%s'"):format(stemname)) end if not default_stem then error(("Cannot use + for stem override '%s' because no default is available"):format(stemname)) end if type(default_stem) ~= "string" then error(("Internal error: Default stem for '%s' is not a string: %s"):format(stemname, dump(default_stem))) end return default_stem end return form, translit end) end ------------------------------------------------------------------------------- -- Properties of different verbal forms -- ------------------------------------------------------------------------------- local allowed_vforms = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "Iq", "IIq", "IIIq", "IVq"} local allowed_vforms_set = m_table.listToSet(allowed_vforms) local allowed_vforms_with_weakness = m_table.shallowCopy(allowed_vforms) -- The user needs to be able to explicitly specify that a form-I verb (specifically one whose initial radical is و) is -- sound. Cf. wajiʕa yawjaʕu (not #yajaʕu) "to ache, to hurt". In general, i~a and u~u verbs whose initial radical is و -- seem to not assimilate the first radical; cf. وقح "to be shameless", variously waqaḥa~yaqiḥu, waquḥa~yawquḥu and -- waqiḥa~yawqaḥu, whereas a~i verbs (wafaḍa~yafiḍu "to rush"), i~i verbs (wafiqa~yafiqu "to be proper, to be suitable") -- and a~a verbs (waḍaʕa~yaḍaʕu "to set down, to place") do assimilate. But there are naturally exceptions, e.g. -- waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; waṯiʔa~yaṯaʔu "to get bruised, -- to be sprained". Also beware of waniya~yawnā "to be faint; to languish", which is sound in the first radical and -- final-weak in the last radical. Nonetheless, the regularity of the patterns mentioned above suggest we should provide -- them as defaults. -- Note that there are other cases of unexpectedly sound verbs, e.g. izdawaja~yazdawiju "to be in pairs", layisa~yalyasu -- "to be valiant, to be brave", ʔaḥwaja~yuḥwiju "to need", istahwana~yastahwinu "to consider easy", sawisa~yaswasu "to -- be or become moth-eaten or worm-eaten" (vs. sāsa~yasūsu "to govern, to rule" from the same radicals), ʕawira~yaʕwaru -- "to be one-eyed", istajwaba~yastajwibu "to interrogate", etc. But in these cases there is no need for explicit user -- specification as the lemma itself specifies the unexpected soundness. for _, form_with_weakness in ipairs { "I-sound", "I-assimilated", "none-sound", "none-hollow", "none-geminate", "none-final-weak" } do table.insert(allowed_vforms_with_weakness, form_with_weakness) end local allowed_vforms_with_weakness_set = m_table.listToSet(allowed_vforms_with_weakness) local function vform_supports_final_weak(vform) return vform ~= "XI" and vform ~= "XV" and vform ~= "IVq" end local function vform_supports_geminate(vform) return vform == "I" or vform == "III" or vform == "IV" or vform == "VI" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_supports_hollow(vform) return vform == "I" or vform == "IV" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_probably_impersonal_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, I) or vform == "V" or vform == "VI" or vform == "X" or vform == "IIq" end local function vform_probably_full_passive(vform) return vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" end local function vform_probably_no_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, U) or vform == "VII" or vform == "IX" or vform == "XI" or vform == "XII" or vform == "XIII" or vform == "XIV" or vform == "XV" or vform == "IIIq" or vform == "IVq" end -- Active vforms II, III, IV, Iq use non-past prefixes in -u- instead of -a-. local function prefix_vowel_from_vform(vform) if vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" then return "u" else return "a" end end -- True if the active non-past takes a-vocalization rather than i-vocalization in its last syllable. local function vform_nonpast_a_vowel(vform) return vform == "V" or vform == "VI" or vform == "XV" or vform == "IIq" end -- True if the `passive` spec indicates a passive-only verb. local function is_passive_only(passive) return passive == "onlypass" or passive == "onlypass-impers" end export.is_passive_only = is_passive_only -- for use in [[Module:ar-headword]] ------------------------------------------------------------------------------- -- Properties of specific sounds -- ------------------------------------------------------------------------------- -- Is radical wāw (و) or yāʾ (ي)? local function is_waw_ya(rad) return req(rad, W) or req(rad, Y) end -- Check that radical is wāw (و) or yāʾ (ي), error if not local function check_waw_ya(rad) if not is_waw_ya(rad) then error("Expecting weak radical: '" .. rget(rad) .. "' should be " .. W .. " or " .. Y) end end -- Form-I verb حيّ or حيي and form-X verb استحيا or استحى local function hayy_radicals(rad1, rad2, rad3) return req(rad1, "ح") and req(rad2, Y) and is_waw_ya(rad3) end -- FUCK ME HARD. "Lua error at line 1514: main function has more than 200 local variables". local function create_conjugations() ------------------------------------------------------------------------------- -- Radicals associated with various irregular verbs -- ------------------------------------------------------------------------------- -- Form-I verb أخذ or form-VIII verb اتخذ local function axadh_radicals(rad1, rad2, rad3) return req(rad1, HAMZA) and req(rad2, "خ") and req(rad3, "ذ") end -- Form-I verb whose imperative has a reduced form: أكل and أخذ and أمر. Return "shortonly" if only -- short-form imperatives exist (أكل and أخذ) or "shortlong" if long-form imperatives also exist (أمر); -- they are used after a clitic like فَ and وَ. local function reduced_imperative_verb(rad1, rad2, rad3) return axadh_radicals(rad1, rad2, rad3) and "shortonly" or req(rad1, HAMZA) and req(rad2, "ك") and req(rad3, "ل") and "shortonly" or req(rad1, HAMZA) and req(rad2, "م") and req(rad3, "ر") and "shortlong" end -- Form-I verb رأى and form-IV verb أرى local function raa_radicals(rad1, rad2, rad3) return req(rad1, "ر") and req(rad2, HAMZA) and is_waw_ya(rad3) end -- Form-I verb سأل local function saal_radicals(rad1, rad2, rad3) return req(rad1, "س") and req(rad2, HAMZA) and req(rad3, "ل") end -- Form-I verb كان local function kaan_radicals(rad1, rad2, rad3) return req(rad1, "ك") and req(rad2, W) and req(rad3, N) end ------------------------------------------------------------------------------- -- Sets of past endings -- ------------------------------------------------------------------------------- -- The 13 endings of the sound/hollow/geminate past tense. local past_endings = { -- singular SK .. TU, SK .. TA, SK .. "تِ", A, A .. "تْ", --dual SK .. "تُمَا", AA, A .. "تَا", -- plural SK .. "نَا", SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this SK .. "تُن" .. SH .. A, UU .. ALIF, SK .. "نَ" } -- Make endings for final-weak past in -aytu or -awtu. AYAW is AY or AW as appropriate. Note that AA and AW are -- global variables. local function make_past_endings_ay_aw(ayaw, third_sg_masc) return { -- singular ayaw .. SK .. TU, ayaw .. SK .. TA, ayaw .. SK .. "تِ", third_sg_masc, A .. "تْ", --dual ayaw .. SK .. "تُمَا", ayaw .. AA, A .. "تَا", -- plural ayaw .. SK .. "نَا", ayaw .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this ayaw .. SK .. "تُن" .. SH .. A, AW .. SK .. ALIF, ayaw .. SK .. "نَ" } end -- past final-weak -aytu endings local past_endings_ay = make_past_endings_ay_aw(AY, AAMAQ) -- past final-weak -awtu endings local past_endings_aw = make_past_endings_ay_aw(AW, AA) -- used for alternative endings for form-X geminate verbs like اِسْتَمَرَّ local past_endings_ay_12_person_only = { -- singular AY .. SK .. TU, AY .. SK .. TA, AY .. SK .. "تِ", {}, {}, --dual AY .. SK .. "تُمَا", {}, {}, -- plural AY .. SK .. "نَا", AY .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this AY .. SK .. "تُن" .. SH .. A, {}, {}, } -- Make endings for final-weak past in -ītu or -ūtu. IIUU is ī or ū as appropriate. Note that AA and UU are global -- variables. local function make_past_endings_ii_uu(iiuu) return { -- singular iiuu .. TU, iiuu .. TA, iiuu .. "تِ", iiuu .. A, iiuu .. A .. "تْ", --dual iiuu .. "تُمَا", iiuu .. AA, iiuu .. A .. "تَا", -- plural iiuu .. "نَا", iiuu .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this iiuu .. "تُن" .. SH .. A, UU .. ALIF, iiuu .. "نَ" } end -- past final-weak -ītu endings local past_endings_ii = make_past_endings_ii_uu(II) -- past final-weak -ūtu endings local past_endings_uu = make_past_endings_ii_uu(UU) ------------------------------------------------------------------------------- -- Sets of non-past prefixes and endings -- ------------------------------------------------------------------------------- local nonpast_prefix_consonants = { -- singular HAMZA, T, T, Y, T, -- dual T, Y, T, -- plural N, T, T, Y, Y } -- There are only five distinct endings in all non-past verbs. Make any set of non-past endings given these five -- distinct endings. local function make_nonpast_endings(null, fem, dual, pl, fempl) return { -- singular null, null, fem, null, null, -- dual dual, dual, dual, -- plural null, pl, fempl, pl, fempl } end -- endings for non-past indicative local ind_endings = make_nonpast_endings( U, II .. NA, AANI, UU .. NA, SK .. NA ) -- Make the endings for non-past subjunctive/jussive, given the vowel diacritic used in "null" endings -- (1s/2ms/3ms/3fs/1p). local function make_sub_juss_endings(dia_null) return make_nonpast_endings( dia_null, II, AA, UU .. ALIF, SK .. NA ) end -- endings for non-past subjunctive local sub_endings = make_sub_juss_endings(A) -- endings for non-past jussive local juss_endings = make_sub_juss_endings(SK) -- endings for alternative geminate non-past jussive in -a; same as subjunctive local juss_endings_alt_a = sub_endings -- endings for alternative geminate non-past jussive in -i local juss_endings_alt_i = make_sub_juss_endings(I) -- Endings for final-weak non-past indicative in -ā. Note that AY, AW and AAMAQ are global variables. local ind_endings_aa = make_nonpast_endings( AAMAQ, AYSK .. NA, AY .. AANI, AWSK .. NA, AYSK .. NA ) -- Make endings for final-weak non-past indicative in -ī or -ū; IIUU is ī or ū as appropriate. Note that II and UU -- are global variables. local function make_ind_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu, II .. NA, iiuu .. AANI, UU .. NA, iiuu .. NA ) end -- endings for final-weak non-past indicative in -ī local ind_endings_ii = make_ind_endings_ii_uu(II) -- endings for final-weak non-past indicative in -ū local ind_endings_uu = make_ind_endings_ii_uu(UU) -- Endings for final-weak non-past subjunctive in -ā. Note that AY, AW, ALIF, AAMAQ are global variables. local sub_endings_aa = make_nonpast_endings( AAMAQ, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past subjunctive in -ī or -ū. IIUU is ī or ū as appropriate. Note that AA, II, -- UU, ALIF are global variables. local function make_sub_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu .. A, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past subjunctive in -ī local sub_endings_ii = make_sub_endings_ii_uu(II) -- endings for final-weak non-past subjunctive in -ū local sub_endings_uu = make_sub_endings_ii_uu(UU) -- endings for final-weak non-past jussive in -ā local juss_endings_aa = make_nonpast_endings( A, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past jussive in -ī or -ū. IU is short i or u, IIUU is long ī or ū as appropriate. -- Note that AA, II, UU, ALIF are global variables. local function make_juss_endings_ii_uu(iu, iiuu) return make_nonpast_endings( iu, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past jussive in -ī local juss_endings_ii = make_juss_endings_ii_uu(I, II) -- endings for final-weak non-past jussive in -ū local juss_endings_uu = make_juss_endings_ii_uu(U, UU) ------------------------------------------------------------------------------- -- Sets of imperative endings -- ------------------------------------------------------------------------------- -- Extract the second person jussive endings to get corresponding imperative endings. local function imperative_endings_from_jussive(endings) return {endings[2], endings[3], endings[6], endings[10], endings[11]} end -- normal imperative endings local imp_endings = imperative_endings_from_jussive(juss_endings) -- alternative geminate imperative endings in -a local imp_endings_alt_a = imperative_endings_from_jussive(juss_endings_alt_a) -- alternative geminate imperative endings in -i local imp_endings_alt_i = imperative_endings_from_jussive(juss_endings_alt_i) -- final-weak imperative endings in -ā local imp_endings_aa = imperative_endings_from_jussive(juss_endings_aa) -- final-weak imperative endings in -ī local imp_endings_ii = imperative_endings_from_jussive(juss_endings_ii) -- final-weak imperative endings in -ū local imp_endings_uu = imperative_endings_from_jussive(juss_endings_uu) ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. Each of `prefixes`, `stems` and -- `endings` is either a sequence of 5 (for the imperative) or 13 (for other tenses) abbreviated form lists (each of -- which is either a string, a form object, or a list of strings and/or form objects; see -- [[Module:inflection utilities]] for more info). Alternatively, any of `prefixes`, `stems` or `endings` can be a -- single-element list containing an abbreviated form list, with an additional key `all_same` set to true, or (as a -- special case) a single string; in the latter cases, the same value is used for all 5 or 13 slots. If existing -- inflections already exist, they will be added to, not overridden. `pnums` is the list of person/number slot name -- suffixes, which must match up with the elements in `prefixes`, `stems` and `endings` (i.e. 5 for imperative, 13 -- otherwise). local function inflect_tense_1(base, tense, prefixes, stems, endings, pnums) if not prefixes or not stems or not endings then return end local function verify_affixes(affixname, affixes) local function interr(msg) error(("Internal error: For tense '%s', '%s' %s: %s"):format(tense, affixname, msg, dump(affixes))) end if type(affixes) == "string" then -- do nothing elseif type(affixes) ~= "table" then interr("is not a table or string") elseif affixes.all_same then if #affixes ~= 1 then interr(("with all_same = true should have length 1 but has length %s"):format(#affixes)) end else if #affixes ~= #pnums then interr(("should have length %s but has length %s"):format(#pnums, #affixes)) end end end verify_affixes("prefixes", prefixes) verify_affixes("stems", stems) verify_affixes("endings", endings) local function get_affix(affixes, i) if type(affixes) == "string" then return affixes elseif affixes.all_same then return affixes[1] else return affixes[i] end end for i, pnum in ipairs(pnums) do local prefix = get_affix(prefixes, i) local stem = get_affix(stems, i) local ending = get_affix(endings, i) local slot = tense .. "_" .. pnum add3(base, slot, prefix, stem, ending) end end -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. This is a simple wrapper around -- inflect_tense_1() that applies to all tenses other than the imperative; see inflect_tense_1() for more -- information about the parameters. local function inflect_tense(base, tense, prefixes, stems, endings) inflect_tense_1(base, tense, prefixes, stems, endings, all_person_number_list) end -- Like inflect_tense() but for the imperative, which has only five parts instead of 13 and no prefixes. local function inflect_tense_imp(base, stems, endings) inflect_tense_1(base, "imp", "", stems, endings, imp_person_number_list) end ------------------------------------------------------------------------------- -- Functions to inflect the past tense -- ------------------------------------------------------------------------------- -- Generate past verbs using specified vowel and consonant stems; works for sound, assimilated, hollow, and geminate -- verbs, active and passive. local function past_2stem_conj(base, tense, v_stem, c_stem, footnote_12) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "past" .. passive .. "_v", v_stem) local c_stem_12 = c_stem if footnote_12 then c_stem_12 = iut.combine_form_and_footnotes(c_stem_12, footnote_12) end c_stem_12 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem_12) local c_stem_3 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem) inflect_tense(base, tense, "", { -- singular c_stem_12, c_stem_12, c_stem_12, v_stem, v_stem, --dual c_stem_12, v_stem, v_stem, -- plural c_stem_12, c_stem_12, c_stem_12, v_stem, c_stem_3 }, past_endings) end -- Generate past verbs using single specified stem; works for sound and assimilated verbs, active and passive. local function past_1stem_conj(base, tense, stem) past_2stem_conj(base, tense, stem, stem) end ------------------------------------------------------------------------------- -- Functions to inflect non-past tenses -- ------------------------------------------------------------------------------- -- Generate non-past conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for active and passive; for all forms; for all weaknesses (sound, assimilated, hollow, final-weak and -- geminate) and for all types of non-past (indicative, subjunctive, jussive) except for the imperative. (There is a -- separate wrapper function below for geminate jussives because they have three alternants.) Both stems may be the -- same, e.g. for sound verbs. -- `prefix_vowel` will be either "a" or "u". `endings` should be an array of 13 items. If `endings` is nil or -- omitted, infer the endings from the tense. If `jussive` is true, or `endings` is nil and `tense` indicatives -- jussive, use the jussive pattern of vowel/consonant stems (different from the normal ones). local function nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, endings, jussive) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_v", v_stem and q(dia[prefix_vowel], v_stem) or nil) c_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_c", c_stem and q(dia[prefix_vowel], c_stem) or nil) if not endings then if tense:find("^ind") then endings = ind_endings elseif tense:find("^sub") then endings = sub_endings elseif tense:find("^juss") then jussive = true endings = juss_endings else error("Internal error: Unrecognized tense '" .. tense .."'") end end if not jussive then inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular v_stem, v_stem, v_stem, v_stem, v_stem, --dual v_stem, v_stem, v_stem, -- plural v_stem, v_stem, c_stem, v_stem, c_stem }, endings) else inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular -- 'adlul, tadlul, tadullī, yadlul, tadlul c_stem, c_stem, v_stem, c_stem, c_stem, --dual -- tadullā, yadullā, tadullā v_stem, v_stem, v_stem, -- plural -- nadlul, tadullū, tadlulna, yadullū, yadlulna c_stem, v_stem, c_stem, v_stem, c_stem }, endings) end end -- Generate non-past conjugation with one stem (no distinct stems for vowel-initial and consonant-initial endings). -- See nonpast_2stem_conj(). local function nonpast_1stem_conj(base, tense, prefix_vowel, stem, endings, jussive) nonpast_2stem_conj(base, tense, prefix_vowel, stem, stem, endings, jussive) end -- Generate active/passive jussive geminative. There are three alternants, two with terminations -a and -i and one -- in a null termination with a distinct pattern of vowel/consonant stem usage. See nonpast_2stem_conj() for a -- description of the arguments. local function jussive_gem_conj(base, tense, prefix_vowel, v_stem, c_stem) -- alternative in -a nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_a) -- alternative in -i nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_i) -- alternative in -null; requires different combination of v_stem and -- c_stem since the null endings require the c_stem (e.g. "tadlul" here) -- whereas the corresponding endings above in -a or -i require the v_stem -- (e.g. "tadulla, tadulli" above) nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings, "jussive") end ------------------------------------------------------------------------------- -- Functions to inflect the imperative -- ------------------------------------------------------------------------------- -- Generate imperative conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for all forms, and for all weaknesses other than final-weak. Note that the two stems may be the same -- (specifically for sound and assimilated verbs). If `endings` is nil or omitted, use `imp_endings`. If `alt_gem` -- is specified, use the pattern of vowel and consonant stems appropriate for the alternative geminate imperatives -- that use a null ending of -a or -i instead of an empty ending. local function make_2stem_imperative(base, v_stem, c_stem, endings, alt_gem) endings = endings or imp_endings -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "imp_v", v_stem) c_stem = override_stem_if_needed(base, "imp_c", c_stem) if alt_gem then inflect_tense_imp(base, {v_stem, v_stem, v_stem, v_stem, c_stem}, endings) else inflect_tense_imp(base, {c_stem, v_stem, v_stem, v_stem, c_stem}, endings) end end -- Generate imperative parts for sound or assimilated verbs. local function make_1stem_imperative(base, stem) make_2stem_imperative(base, stem, stem) end -- Generate imperative parts for geminate verbs form I (also IV, VII, VIII, X). local function make_gem_imperative(base, v_stem, c_stem) make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_a, "alt gem") make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_i, "alt gem") make_2stem_imperative(base, v_stem, c_stem) end ------------------------------------------------------------------------------- -- Functions to inflect entire verbs -- ------------------------------------------------------------------------------- -- Generate finite parts of a sound verb (also works for assimilated verbs) from five stems (past and non-past, -- active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"). local function make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) past_1stem_conj(base, "past", past_stem) past_1stem_conj(base, "past_pass", past_pass_stem) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem) make_1stem_imperative(base, imp_stem) end local function past_final_weak_endings_from_vowel(vowel) if vowel == "ay" then return past_endings_ay elseif vowel == "aw" then return past_endings_aw elseif vowel == "ī" then return past_endings_ii elseif vowel == "ū" then return past_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized past final-weak vowel spec '%s'"):format(vowel)) end end local function nonpast_final_weak_endings_from_vowel(vowel) if vowel == "ā" then return ind_endings_aa, sub_endings_aa, juss_endings_aa, imp_endings_aa elseif vowel == "ī" then return ind_endings_ii, sub_endings_ii, juss_endings_ii, imp_endings_ii elseif vowel == "ū" then return ind_endings_uu, sub_endings_uu, juss_endings_uu, imp_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized non-past final-weak vowel spec '%s'"):format(vowel)) end end -- Generate finite parts of a final-weak verb from five stems (past and non-past, active and passive, plus -- imperative), the past active ending vowel (ay, aw, ī or ū), the non-past active ending vowel (ā, ī or ū) and the -- prefix vowel in the active non-past (a or u). `imp_stem_2fs`, if given, overrides `imp_stem` for the 2fs -- imperative only -- needed because the 2fs jussive/imperative ending is always -ī regardless of the verb's -- past~non-past vowel class (see `make_juss_endings_ii_uu`'s hardcoded `fem = II`), so its hamzat wasl is always -- kasra even for a u-class verb like دَعَا (اِدْعِي, not اُدْعِي; see README "Open findings" #5). -- -- `retain_rad3_2fs`, if true, keeps rad3 as a consonant before that -ī instead of letting it -- contract away: تَسْهُوِينَ / اُسْهُوِي rather than تَسْهِينَ / اِسْهِي. See README "Open findings" #8 -- and final_weak_uu_retains_rad3(). It also cancels `imp_stem_2fs`, because #5's kasra hamzat -- wasl exists only for the contracted stem, whose ending begins with that kasra; a retained -- rad3 puts its own ḍamma there, so the imperative takes the ordinary stem (اُسْهُوِي). local function make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, past_ending_vowel, nonpast_ending_vowel, prefix_vowel, imp_stem_2fs, retain_rad3_2fs) past_stem = override_stem_if_needed(base, "past", past_stem) past_pass_stem = override_stem_if_needed(base, "past_pass", past_pass_stem) -- Don't call override_stem_if_needed() here for non-past stems; it's called in nonpast_2stem_conj(). imp_stem = override_stem_if_needed(base, "imp", imp_stem) -- + not supported for ending vowel overrides past_ending_vowel = base.stem_overrides.past_final_weak_vowel or past_ending_vowel local past_pass_ending_vowel = base.stem_overrides.past_pass_final_weak_vowel or "ī" nonpast_ending_vowel = base.stem_overrides.nonpast_final_weak_vowel or nonpast_ending_vowel local nonpast_pass_ending_vowel = base.stem_overrides.nonpast_pass_final_weak_vowel or "ā" local past_endings = past_final_weak_endings_from_vowel(past_ending_vowel) local past_pass_endings = past_final_weak_endings_from_vowel(past_pass_ending_vowel) local ind_endings, sub_endings, juss_endings, imp_endings = nonpast_final_weak_endings_from_vowel(nonpast_ending_vowel) local ind_pass_endings, sub_pass_endings, juss_pass_endings = nonpast_final_weak_endings_from_vowel(nonpast_pass_ending_vowel) if retain_rad3_2fs then -- rad3 surfaces as a consonant carrying the class's own ḍamma, then the regular -ī: -- سْهـ + ُوِينَ, not سْهـ + ِينَ. The 2fs sits at index 3 of a make_nonpast_endings() -- table (`fem`) and at index 2 of the five imperative endings that -- imperative_endings_from_jussive() extracts from it. Copied rather than mutated -- -- these ending tables are module-level constants shared by every final-weak verb. -- Written out inline, not via a helper: create_conjugations() is at Lua's 60-upvalue -- ceiling, and one more captured local stops the module loading at all. local function set_2fs(endings, index, ending) local out = {} for i, v in ipairs(endings) do out[i] = v end out[index] = ending return out end ind_endings = set_2fs(ind_endings, 3, UU .. II .. NA) sub_endings = set_2fs(sub_endings, 3, UU .. II) juss_endings = set_2fs(juss_endings, 3, UU .. II) imp_endings = set_2fs(imp_endings, 2, UU .. II) imp_stem_2fs = nil end inflect_tense(base, "past", "", {past_stem, all_same = 1}, past_endings) inflect_tense(base, "past_pass", "", {past_pass_stem, all_same = 1}, past_pass_endings) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem, ind_endings) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem, sub_endings) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem, juss_endings) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_pass_endings) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_pass_endings) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_pass_endings) if imp_stem_2fs then imp_stem_2fs = override_stem_if_needed(base, "imp", imp_stem_2fs) inflect_tense_imp(base, {imp_stem, imp_stem_2fs, imp_stem, imp_stem, imp_stem}, imp_endings) else inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings) end end -- Generate finite parts of an augmented (form II+) final-weak verb from five stems (past and non-past, active and -- passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u") and a flag indicating if it -- behaves like a form V/VI verb in taking non-past endings in -ā instead of -ī. local function make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "ay", form56 and "ā" or "ī", prefix_vowel) end -- Generate finite parts of an augmented (form II+) sound or final-weak verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (active past stem minus last syllable (= -al or -ā)); -- * `nonpast_stem_base` (non-past stem minus last syllable (= -al/-il or -ā/-ī); -- * `past_pass_stem_base` (passive past stem minus last syllable (= -il or -ī)); -- * `vn` (verbal noun). local function make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local final_weak = is_final_weak(base, vowel_spec) local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local form56 = vform_nonpast_a_vowel(base.verb_form) local a_base_suffix = final_weak and "" or q(A, lastrad) local i_base_suffix = final_weak and "" or q(I, lastrad) -- past and non-past stems, active and passive local past_stem = q(past_stem_base, a_base_suffix) -- In forms 5 and 6, non-past has /a/ as last stem vowel in the non-past -- in both active and passive, but /i/ in the active participle and /a/ -- in the passive participle. Elsewhere, consistent /i/ in active non-past -- and participle, consistent /a/ in passive non-past and participle. -- Hence, forms 5 and 6 differ only in the non-past active (but not -- active participle), so we have to split the finite non-past stem and -- active participle stem. local nonpast_stem = q(nonpast_stem_base, form56 and a_base_suffix or i_base_suffix) local ap_stem = q(nonpast_stem_base, i_base_suffix) local past_pass_stem = q(past_pass_stem_base, i_base_suffix) local nonpast_pass_stem = q(nonpast_stem_base, a_base_suffix) -- imperative stem local imp_stem = q(past_stem_base, form56 and a_base_suffix or i_base_suffix) -- make parts if final_weak then make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) else make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) end -- active and passive participle if final_weak then insert_form_or_forms(base, "ap", q(MU, ap_stem, IN)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem, AN, AMAQ)) else insert_form_or_forms(base, "ap", q(MU, ap_stem)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem)) end end -- Generate finite parts of a hollow or geminate verb from ten stems (vowel and consonant stems for each of past and -- non-past, active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"), plus a -- flag indicating if we are a geminate verb. local function make_hollow_geminate_verb(base, geminate, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) past_2stem_conj(base, "past", past_v_stem, past_c_stem, altgem_note) past_2stem_conj(base, "past_pass", past_pass_v_stem, past_pass_c_stem) nonpast_2stem_conj(base, "ind", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "sub", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "ind_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) nonpast_2stem_conj(base, "sub_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) if geminate then jussive_gem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) jussive_gem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_gem_imperative(base, imp_v_stem, imp_c_stem) else nonpast_2stem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_2stem_imperative(base, imp_v_stem, imp_c_stem) end end -- Generate finite parts of an augmented (form II+) hollow verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun). local function make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local form410 = base.verb_form == "IV" or base.verb_form == "X" local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c a_base_suffix_v = q(AA, lastrad) -- 'af-āl-a, inf-āl-a a_base_suffix_c = q(A, lastrad) -- 'af-al-tu, inf-al-tu i_base_suffix_v = q(II, lastrad) -- 'uf-īl-a, unf-īl-a i_base_suffix_c = q(I, lastrad) -- 'uf-il-tu, unf-il-tu -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) -- yu-f-īl-u, ya-staf-īl-u but yanf-āl-u, yaft-āl-u local nonpast_v_stem = q(nonpast_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local imp_c_stem = q(past_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end -- Generate finite parts of an augmented (form II+) geminate verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem; this and the stem bases below will end with a consonant -- for forms IV, X, IVq, and a short vowel for the others); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun); -- * `altgem_note` (footnote to add to active past 1/2-person forms, when alternative forms are supplied [form X]). local function make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, altgem_note) insert_form_or_forms(base, "vn", vn) local vform = base.verb_form local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local prefix_vowel = prefix_vowel_from_vform(vform) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c if vform == "IV" or vform == "X" or vform == "IVq" then a_base_suffix_v = q(A, lastrad, SH) -- 'af-all a_base_suffix_c = q(SK, lastrad, A, lastrad) -- 'af-lal i_base_suffix_v = q(I, lastrad, SH) -- yuf-ill i_base_suffix_c = q(SK, lastrad, I, lastrad) -- yuf-lil else a_base_suffix_v = q(lastrad, SH) -- fā-ll, infa-ll a_base_suffix_c = q(lastrad, A, lastrad) -- fā-lal, infa-lal i_base_suffix_v = q(lastrad, SH) -- yufā-ll, yanfa-ll i_base_suffix_c = q(lastrad, I, lastrad) -- yufā-lil, yanfa-lil end -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) local nonpast_v_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- NOTE: Formerly had a comment that "vform III and VI passive past do not have contracted parts, only -- uncontracted parts, which are added separately by those functions". This is based on Mace -- "Arabic Verbs and Essential Grammar" (1999) entry 63 (continued), which shows passive ḥūjija but no ḥūjja; -- but that is apparently a mistake, as (1) verb tables in other books do show contracted passive parts for -- these forms; (2) there is no mention of such an exception on p. 99, which explains how geminate ("doubled") -- verbs work (on the contrary, it says "The contracted and uncontracted pairs (see above) are found all -- over Forms III and VI of the doubled verbs"). local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local imp_c_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end ------------------------------------------------------------------------------- -- Conjugation functions for specific conjugation types -- ------------------------------------------------------------------------------- local function form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local imp_vowel = map_vowel(nonpast_vowel, function(vow) if vow == A or vow == I then return I elseif vow == U then return U elseif not skip_slot(base, "imp_2ms") then error(("Internal error: Non-past vowel %s isn't a, i, or u, should have been caught earlier"):format( dump(nonpast_vowel))) else -- Passive-only; imperative won't ever be displayed so it doesn't matter. return I end end) -- Mace ("Arabic Verbs and Essentials of Grammar" p. 63: [https://archive.org/details/arabicverbsessen00john/page/62/mode/2up]) -- claims that initial hamza is assimilated/elided into a long vowel in the form-I imperative, but apparently -- this isn't corrrect. local vowel_on_alif = map_vowel(imp_vowel, function(vow) return ALIF .. vow end) return q(vowel_on_alif, rad1, SK) end -- Implement form-I sound or assimilated verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_sound_assimilated_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied -- past and non-past stems, active and passive local past_stem = q(rad1, A, rad2, past_vowel, rad3) local nonpast_stem = assimilated and q(rad2, nonpast_vowel, rad3) or q(rad1, SK, rad2, nonpast_vowel, rad3) local past_pass_stem = q(rad1, U, rad2, I, rad3) local nonpast_pass_stem = q(rad1, SK, rad2, A, rad3) -- imperative stem -- check for irregular verb with reduced imperative (أَخَذَ or أَكَلَ or أَمَرَ) local reducedimp = reduced_imperative_verb(rad1, rad2, rad3) if reducedimp then base.irregular = true end local imp_stem_suffix = q(rad2, nonpast_vowel, rad3) local long_imp_stem_base = form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local short_imp_stem_base = "" local imp_stem = q((assimilated or reducedimp) and "" or long_imp_stem_base, imp_stem_suffix) -- make parts make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "a") if reducedimp == "shortlong" then make_1stem_imperative(base, iut.combine_form_and_footnotes(q(long_imp_stem_base, imp_stem_suffix), mw.getCurrentFrame():preprocess("[used especially with a clitic such as {{m|ar|فَ}} or {{m|ar|وَ}}]"))) end -- Check for irregular verb سَأَلَ with alternative jussive and imperative. Calling this after make_sound_verb() -- adds additional entries to the paradigm parts. if saal_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_1stem_conj(base, "juss", "a", "سَل") nonpast_1stem_conj(base, "juss_pass", "u", "سَل") make_1stem_imperative(base, "سَل") end -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, I, rad3)) -- Insert alternative active participle (stative type I) فَعِيل. Since not all verbs have this, we require that -- verbs that do have it specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <ap:++> to -- indicate that the alternative form should be used for the active participle, <ap:+,++> to indicate that both -- forms can be used, and <ap:-> to indicate that there is no active participle). The same form is used for -- secondary default passive participle. insert_ap2_pp2(base, q(rad1, A, rad2, II, rad3)) -- Active participle, stative type II فَعِل (+++). insert_form_or_forms(base, "ap3", q(rad1, A, rad2, I, rad3)) -- Active participle, color/defect أَفْعَل (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَعْلَان (+an). insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad3)) end conjugations["I-sound"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, false) end conjugations["none-sound"] = function(base, vowel_spec) -- All default stems are nil. make_sound_verb(base) end conjugations["none-hollow"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, false) end conjugations["none-geminate"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, "geminate") end conjugations["none-final-weak"] = function(base, vowel_spec) -- All default stems are nil. make_final_weak_verb(base) end conjugations["I-assimilated"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, "assimilated") end local function make_form_i_hayy_verb(base, vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied base.irregular = true -- past and non-past stems, active and passive, and imperative stem local past_c_stem = "حَيِي" local past_v_stem_long = past_c_stem local past_v_stem_short = "حَيّ" -- 3mp of the long variant (حَيِيَ) is حَيُوا, not the geminated حَيُّوا of the short -- variant (حَيَّ) -- rad2 (ي) here is a plain radical, not doubled; see README -- "Open findings" #4. Needs its own stem, distinct from both the long and short ones. local past_v_stem_3mp = "حَي" local past_pass_c_stem = "حُيِي" local past_pass_v_stem_long = past_pass_c_stem local past_pass_v_stem_short = "حُيّ" local past_pass_v_stem_3mp = "حُي" local nonpast_stem = "حْي" local nonpast_pass_stem = nonpast_stem local imp_stem = _I .. nonpast_stem -- make parts past_2stem_conj(base, "past", {}, past_c_stem) past_2stem_conj(base, "past_pass", {}, past_pass_c_stem) local variant = vowel_spec.variant or "both" if variant == "short" or variant == "both" then past_2stem_conj(base, "past", past_v_stem_short, {}) past_2stem_conj(base, "past_pass", past_pass_v_stem_short, {}) end function inflect_long_variant(tense, long_stem, mp_stem) inflect_tense_1(base, tense, "", {long_stem, long_stem, long_stem, long_stem, mp_stem}, {past_endings[4], past_endings[5], past_endings[7], past_endings[8], past_endings[12]}, {"3ms", "3fs", "3md", "3fd", "3mp"}) end if variant == "long" or variant == "both" then inflect_long_variant("past", past_v_stem_long, past_v_stem_3mp) inflect_long_variant("past_pass", past_pass_v_stem_long, past_pass_v_stem_3mp) end nonpast_1stem_conj(base, "ind", "a", nonpast_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub", "a", nonpast_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss", "a", nonpast_stem, juss_endings_aa) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_endings_aa) inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings_aa) -- active and passive participles apparently do not exist for this verb end -- Implement form-I final-weak assimilated+final-weak verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_final_weak_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- حَيَّ or حَيِيَ is weird enough that we handle it as a separate function. if hayy_radicals(rad1, rad2, rad3) then make_form_i_hayy_verb(base, vowel_spec) return end -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- Past and non-past stems, active and passive, and imperative stem. local past_stem = q(rad1, A, rad2) local past_pass_stem = q(rad1, U, rad2) local nonpast_stem, nonpast_pass_stem, imp_stem, imp_stem_2fs if raa_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_stem = rad1 nonpast_pass_stem = rad1 imp_stem = rad1 else nonpast_pass_stem = q(rad1, SK, rad2) if assimilated then nonpast_stem = rad2 imp_stem = rad2 else nonpast_stem = nonpast_pass_stem imp_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2) -- The 2fs imperative always has hamzat wasl with kasra, since its ending is -- always -ī regardless of the verb's vowel class; see make_final_weak_verb(). imp_stem_2fs = q(form_i_imp_stem_through_rad1(base, I, rad1), rad2) end end -- Make parts. local past_ending_vowel = req(rad3, Y) and req(past_vowel, A) and "ay" or req(rad3, W) and req(past_vowel, A) and "aw" or req(past_vowel, I) and "ī" or "ū" -- Try to preserve footnotes attached to the third radical and/or past and/or non-past vowels. local past_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(past_vowel)) local nonpast_ending_vowel = req(nonpast_vowel, A) and "ā" or req(nonpast_vowel, I) and "ī" or "ū" local nonpast_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(nonpast_vowel)) make_final_weak_verb(base, iut.combine_form_and_footnotes(past_stem, past_footnotes), iut.combine_form_and_footnotes(past_pass_stem, past_footnotes), iut.combine_form_and_footnotes(nonpast_stem, nonpast_footnotes), iut.combine_form_and_footnotes(nonpast_pass_stem, nonpast_footnotes), iut.combine_form_and_footnotes(imp_stem, nonpast_footnotes), past_ending_vowel, nonpast_ending_vowel, "a", imp_stem_2fs and iut.combine_form_and_footnotes(imp_stem_2fs, nonpast_footnotes) or nil, final_weak_uu_retains_rad3(past_ending_vowel, nonpast_ending_vowel)) -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, IN)) -- Active participle, stative type I فَعِيّ (++). FIXME: Is this correct when rad3 is W? insert_ap2_pp2(base, q(rad1, A, rad2, II, SH)) -- Active participle, stative type II فَعٍ (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, rad2, IN)) -- Active participle, color/defect أَفْعَى (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, AAMAQ)) -- Active participle, -ān فَعْيَان or فَعْوَان (+an). -- FIXME: Any examples of this for both rad3 = W and y to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, req(rad3, Y) and II or UU, SH)) end conjugations["I-final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, false) end conjugations["I-assimilated+final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, "assimilated") end conjugations["I-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- In some sense, hollow vowels i~i and u~u are more "correct" than a~i and a~u, but the latter follow the -- pattern of other form-I verbs, so we map i~i to a~i and u~u to a~u in infer_radicals(). Now however we have -- to undo this to get the actual past vowel based on the non-past vowel. if req(past_vowel, A) then past_vowel = map_vowel(past_vowel, function(vow) return req(nonpast_vowel, A) and I or rget(nonpast_vowel) end) end local lengthened_nonpast = map_vowel(nonpast_vowel, function(vow) return vow == U and UU or vow == I and II or AA end) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) local past_v_stem = q(rad1, AA, rad3) local past_c_stem = q(rad1, past_vowel, rad3) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, lengthened_nonpast, rad3) local nonpast_c_stem = q(rad1, nonpast_vowel, rad3) -- passive past stems - vowel (v) and consonant (c) -- 'ufīla always; the contracted stem takes whichever of i/u the active past_c_stem -- *isn't* -- xāfa/xiftu (i) -> passive xufta (u), qāla/qultu (u) -> passive qilta (i). -- Contraction drops rad2, so this vowel is the only thing distinguishing active from -- passive in these forms, hence the two roots' behaviour is opposite, not independent. -- Confirmed on two printed pages (خافَ p.224 "خُفْتَ", قالَ p.138 "قِلْتَ"); previously -- hardcoded to u from خافَ alone, which is only half the pattern -- see README. local past_pass_v_stem = q(rad1, II, rad3) local past_pass_c_stem = q(rad1, map_vowel(past_vowel, function(vow) return vow == I and U or I end), rad3) -- passive non-past stems - vowel (v) and consonant (c) -- yufāla/yufalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, AA, rad3) local nonpast_pass_c_stem = q(rad1, A, rad3) -- imperative stem local imp_v_stem = nonpast_v_stem local imp_c_stem = nonpast_c_stem -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") if kaan_radicals(rad1, rad2, rad3) then local endings = make_nonpast_endings(U, {}, {}, {}, {}) inflect_tense(base, "juss", nonpast_prefix_consonants, q(A, rad1), endings) base.irregular = true end -- Active participle. insert_form_or_forms(base, "ap1", req(rad3, HAMZA) and q(rad1, AA, HAMZA, IN) or q(rad1, AA, HAMZA, I, rad3)) -- Active participle, stative type I فَيِّد (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, Y, SH, I, rad3)) -- Active participle, stative type II فَيِد (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, Y, I, rad3)) -- Active participle, color/defect أَفّيَد or أَفّوَد (+cd). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَيْدَان or فَوْدَان (+an). Example: جَاعَ "to be hungry", act part جَوْعَان insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, req(rad2, Y) and II or UU, rad3)) end conjugations["I-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) -- The contracted stem's vowel is the past vowel for most roots (مَدَدْتَ) but follows the -- مضارع for the إتباع lexemes (هَمُمْتَ); see geminate_degemination_vowel(). local past_v_stem = q(rad1, A, rad2, SH) local past_c_stem = q(rad1, A, rad2, geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel), rad2) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, nonpast_vowel, rad2, SH) local nonpast_c_stem = q(rad1, SK, rad2, nonpast_vowel, rad2) -- passive past stems - vowel (v) and consonant (c) -- dulla/dulilta local past_pass_v_stem = q(rad1, U, rad2, SH) local past_pass_c_stem = q(rad1, U, rad2, I, rad2) -- passive non-past stems - vowel (v) and consonant (c) --yudallu/yudlalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, A, rad2, SH) local nonpast_pass_c_stem = q(rad1, SK, rad2, A, rad2) -- imperative stem local imp_v_stem = q(rad1, nonpast_vowel, rad2, SH) local imp_c_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2, nonpast_vowel, rad2) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, SH)) -- Active participle, stative type I فَعِيع (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, rad2, II, rad2)) -- Active participle, stative type II فَعّ (+++). Example: بَرَّ "to be pious", active participle بَرّ insert_form_or_forms(base, "ap3", q(rad1, A, rad2, SH)) -- Active participle, color/defect أَفَعّ (+cd). -- Example: لَصَّ "to be thievish, to steal repeatedly", active participle أَلَصّ. insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, A, rad2, SH)) -- Active participle, -ān فَعَّان (+an). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SH, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad2)) end -- Return the ta- (active, past and non-past) and tu- (passive past) prefixes for a form II/III/V/VI verb. -- Form V and VI verbs normally use ta- and tu-, but reduced (base.reduced) verbs use different prefixes. Form II -- and III verbs have no prefix. local function form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vform = base.verb_form if vform == "V" or vform == "VI" then if base.reduced then -- To simplify the code, we generate two rad1's with a sukūn between them, which is cleaned up in -- postprocessing. return q(_I, rad1, SK), q(rad1, SK), q(_U, rad1, SK) else return TA, TA, TU end else return "", "", "" end end -- Make form II or V sound or final-weak verb. local function make_form_ii_v_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "V" and q(ta_past_prefix, rad1, A, rad2, SH, final_weak and IN or q(U, rad3)) or q(TA, rad1, SK, rad2, II, final_weak and AH or rad3) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, A, rad2, SH) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, A, rad2, SH) local past_pass_stem_base = q(tu_past_prefix, rad1, U, rad2, SH) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["II-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["II-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end local function make_form_iii_alt_vn(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- Insert alternative verbal noun فِعَال. Since not all verbs have this, we require that verbs that do have it -- specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <vn:+,++> to indicate that -- both the normal verbal noun مُفَاعَلَة and secondary verbal noun فِعَال are available). insert_form_or_forms(base, "vn2", q(rad1, I, rad2, AA, final_weak and HAMZA or rad3)) end -- Make form III or VI sound or final-weak verb. local function make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, final_weak and IN or q(U, rad3)) or q(MU, rad1, AA, rad2, final_weak and AAH or q(A, rad3, AH)) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, AA, rad2) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA, rad2) local past_pass_stem_base = q(tu_past_prefix, rad1, UU, rad2) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) if vform == "III" then make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["III-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end -- Make form III or VI geminate verb. local function make_form_iii_vi_geminate_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) -- Alternative verbal noun فِعَال will be inserted when we add sound parts below. local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, SH) or q(MU, rad1, AA, rad2, SH, AH) -- Various stem bases. local past_stem_base = q(ta_past_prefix, rad1, AA) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA) local past_pass_stem_base = q(tu_past_prefix, rad1, UU) -- Make parts. local variant = vowel_spec.variant or "short" if variant == "short" or variant == "both" then make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Also add alternative sound (non-compressed) parts. This will lead to some duplicate entries, but they are -- removed during addition. if variant == "long" or variant == "both" then make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) elseif vform == "III" then -- Still need to add the alternative form-III verbal noun. make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make form IV sound or final-weak verb. local function make_form_iv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- core of stem base, minus stem prefixes local stem_core -- check for irregular verb أَرَى local is_raa = raa_radicals(rad1, rad2, rad3) if is_raa then base.irregular = true stem_core = rad1 else stem_core = q(rad1, SK, rad2) end -- verbal noun local vn = is_raa and q(HAMZA, I, stem_core, AA, HAMZA, AH) or q(HAMZA, I, stem_core, AA, final_weak and HAMZA or rad3) -- various stem bases local past_stem_base = q(HAMZA, A, stem_core) local nonpast_stem_base = stem_core local past_pass_stem_base = q(HAMZA, U, stem_core) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-sound"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-final-weak"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- verbal noun local vn = q(HAMZA, I, rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(HAMZA, I, rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["V-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["V-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make a verbal noun of the general form that applies to forms VII and above. RAD12 is the first consonant cluster -- (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the final consonant. local function high_form_verbal_noun(rad12, rad34, rad5) return q(_I, rad12, I, rad34, AA, rad5) end -- Populate a sound or final-weak verb for any of the various high-numbered augmented forms (form VII and up) that -- have up to 5 consonants in two clusters in the stem and the same pattern of vowels between. Some of these -- consonants in certain verb parts are w's, which leads to apparent anomalies in certain stems of these parts, but -- these anomalies are handled automatically in postprocessing, where we resolve sequences of iwC -> īC, uwC -> ūC, -- w + sukūn + w -> w + shadda. -- RAD12 is the first consonant cluster (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the -- final consonant. local function make_high_form_sound_final_weak_verb(base, vowel_spec, rad12, rad34, rad5) local final_weak = is_final_weak(base, vowel_spec) local vn = high_form_verbal_noun(rad12, rad34, final_weak and HAMZA or rad5) -- various stem bases local nonpast_stem_base = q(rad12, A, rad34) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad12, U, rad34) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end local function form_vii_nrad1(base, rad1) if base.reduced then if not req(rad1, M) then error(("Internal error: Form VII first radical %s is not م but .reduced specified; should have been caught earlier"): format(rget(rad1))) end return M .. SH else return q("نْ", rad1) end end -- Make form VII sound or final-weak verb. local function make_form_vii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, form_vii_nrad1(base, rad1), rad2, rad3) end conjugations["VII-sound"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-final-weak"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, Y, rad3) -- various stem bases local nonpast_stem_base = nrad1 local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(nrad1, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Return Form VIII verbal noun. local function form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad3) local final_weak = is_final_weak(base, vowel_spec) rad3 = final_weak and HAMZA or rad3 return {high_form_verbal_noun(vowel_spec.form_viii_assim, rad2, rad3)} end -- Make form VIII sound or final-weak verb. local function make_form_viii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِتَّخَذَ if axadh_radicals(rad1, rad2, rad3) then base.irregular = true rad1 = T end make_high_form_sound_final_weak_verb(base, vowel_spec, vowel_spec.form_viii_assim, rad2, rad3) end conjugations["VIII-sound"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-final-weak"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, Y, rad3) -- various stem bases local nonpast_stem_base = vowel_spec.form_viii_assim local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nonpast_stem_base) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VIII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(vowel_spec.form_viii_assim, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, vowel_spec.form_viii_assim, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-final-weak"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), rad3, rad3) end -- Populate a sound or final-weak verb for any of the various high-numbered -- augmented forms that have 5 consonants in the stem and the same pattern of -- vowels. Some of these consonants in certain verb parts are w's, which leads to -- apparent anomalies in certain stems of these parts, but these anomalies -- are handled automatically in postprocessing, where we resolve sequences of -- iwC -> īC, uwC -> ūC, w + sukūn + w -> w + shadda. local function make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, rad3, rad4, rad5) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), q(rad3, SK, rad4), rad5) end -- Make form X sound or final-weak verb. local function make_form_x_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِسْتَحْيَا (also اِسْتَحَى) local is_hayy = hayy_radicals(rad1, rad2, rad3) local variant = vowel_spec.variant or "both" if not is_hayy or variant == "long" or variant == "both" then make_high5_form_sound_final_weak_verb(base, vowel_spec, S, T, rad1, rad2, rad3) end if is_hayy and (variant == "short" or variant == "both") then base.irregular = true -- Add alternative entries to the verbal paradigms. Any duplicates are removed during addition. make_high_form_sound_final_weak_verb(base, vowel_spec, S .. SK .. T, rad1, rad3) end end conjugations["X-sound"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-final-weak"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(base.reduced and "اِسْ" or "اِسْتِ", rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(base.reduced and "اِسْ" or "اِسْتَ", rad1) local nonpast_stem_base = q(base.reduced and "سْ" or "سْتَ", rad1) local past_pass_stem_base = q(base.reduced and "اُسْ" or "اُسْتُ", rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["X-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q("اِسْتِ", rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q("اِسْتَ", rad1) local nonpast_stem_base = q("سْتَ", rad1) local past_pass_stem_base = q("اُسْتُ", rad1) -- make parts if base.altgem then inflect_tense(base, "past", "", {q(past_stem_base, A, rad2, SH), all_same = 1}, past_endings_ay_12_person_only) end make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, base.altgem and "[uncommon]" or nil) end conjugations["XI-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, II, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, AA) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, UU) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form XI final-weak, since already geminate in form; would behave as XI-sound. -- Make form XII sound or final-weak verb. local function make_form_xii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, rad2, rad3) end conjugations["XII-sound"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end conjugations["XII-final-weak"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end -- Make form XIII sound or final-weak verb. local function make_form_xiii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, W, rad3) end conjugations["XIII-sound"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end conjugations["XIII-final-weak"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end -- Make a form XIV or XV sound or final-weak verb. Last radical appears twice (if`anlala / yaf`anlilu) so if it were -- w or y you'd get if`anwā / yaf`anwī or if`anyā / yaf`anyī, i.e. unlike for most augmented verbs, the identity of -- the radical matters. local function make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local lastrad = base.verb_form == "XV" and Y or rad3 make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, lastrad) end conjugations["XIV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XIV-final-weak"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end -- Probably no form XV final-weak, since already final-weak in form; would behave as XV-sound. -- Make form Iq or IIq sound or final-weak verb. local function make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local vn = vform == "IIq" and q(TA, rad1, A, rad2, SK, rad3, (final_weak and IN or q(U, rad4))) or q(rad1, A, rad2, SK, rad3, (final_weak and AAH or q(A, rad4, AH))) local ta_pref = vform == "IIq" and TA or "" local tu_pref = vform == "IIq" and TU or "" -- various stem bases local past_stem_base = q(ta_pref, rad1, A, rad2, SK, rad3) local nonpast_stem_base = past_stem_base local past_pass_stem_base = q(tu_pref, rad1, U, rad2, SK, rad3) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["Iq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["Iq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end -- Make form IIIq sound or final-weak verb. local function make_form_iiiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, rad4) end conjugations["IIIq-sound"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIIq-final-weak"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IVq-sound"] = function(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, SK, rad4, AA, rad4) -- various stem bases local past_stem_base = q(_I, rad1, SK, rad2, A, rad3) local nonpast_stem_base = q(rad1, SK, rad2, A, rad3) local past_pass_stem_base = q(_U, rad1, SK, rad2, U, rad3) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form IVq final-weak, since already geminate in form; would behave as IVq-sound. end create_conjugations() ------------------------------------------------------------------------------- -- Guts of main conjugation function -- ------------------------------------------------------------------------------- -- Given form, weakness and radicals, check to make sure the radicals present are allowable for the weakness. Hamzas on -- alif/wāw/yāʾ seats are never allowed (should always appear as hamza-on-the-line), and various weaknesses have various -- strictures on allowable consonants. local function check_radicals(form, weakness, rad1, rad2, rad3, rad4) local function hamza_check(index, rad) if rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then error("Radical " .. index .. " is " .. rad .. " but should be ء (hamza on the line)") end end local function check_waw_ya(index, rad) if not is_waw_ya(rad) then error("Radical " .. index .. " is " .. rad .. " but should be و or ي") end end local function check_not_waw_ya(index, rad) if is_waw_ya(rad) then error("In a sound verb, radical " .. index .. " should not be و or ي") end end hamza_check(rad1) hamza_check(rad2) hamza_check(rad3) hamza_check(rad4) if weakness == "assimilated" or weakness == "assimilated+final-weak" then if rad1 ~= W then error("Radical 1 is " .. rad1 .. " but should be و") end -- don't check that non-assimilated form I verbs don't have wāw as their -- first radical because some form-I verbs exist where a first-radical wāw -- behaves as sound, e.g. wajuha yawjuhu "to be distinguished". end if weakness == "final-weak" or weakness == "assimilated+final-weak" then if rad4 then check_waw_ya(4, rad4) else check_waw_ya(3, rad3) end elseif vform_supports_final_weak(form) then -- non-final-weak verbs cannot have weak final radical if there's a corresponding -- final-weak verb category. I think this is safe. We may have problems with -- ḥayya/ḥayiya yaḥyā if we treat it as a geminate verb. if rad4 then check_not_waw_ya(4, rad4) else check_not_waw_ya(3, rad3) end end if weakness == "hollow" then check_waw_ya(2, rad2) -- don't check that non-hollow verbs in forms that support hollow verbs -- don't have wāw or yāʾ as their second radical because some verbs exist -- where a middle-radical wāw/yāʾ behaves as sound, e.g. form-VIII izdawaja -- "to be in pairs". end if weakness == "geminate" then if rad4 then error("Internal error: No geminate quadrilaterals, should not be seen") end if rad2 ~= rad3 then error("Weakness is geminate; radical 3 is " .. rad3 .. " but should be same as radical 2 " .. rad2) end elseif vform_supports_geminate(form) then -- non-geminate verbs cannot have second and third radical same if there's -- a corresponding geminate verb category. I think this is safe. We -- don't fuss over double wāw or double yāʾ because this could legitimately -- be a final-weak verb with middle wāw/yāʾ, treated as sound. if rad4 then error("Internal error: No quadrilaterals should support geminate verbs") end if rad2 == rad3 and not is_waw_ya(rad2) then error("Weakness is '" .. weakness .. "'; radical 2 and 3 are same at " .. rad2 .. " but should not be; consider making weakness 'geminate'") end end end -- array of substitutions; each element is a 2-entry array FROM, TO; do it -- this way so the concatenations only get evaluated once local postprocess_subs = { -- reorder short-vowel + shadda -> shadda + short-vowel for easier processing {"(" .. AIU .. ")" .. SH, SH .. "%1"}, ----------same letter separated by sukūn should instead use shadda--------- ------------happens e.g. in kun-nā "we were".----------------- {"(.)" .. SK .. "%1", "%1" .. SH}, ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {I .. W .. SK, II}, {I .. Y .. SK, II}, -- uw, uy -> ū (assimilated verbs) {U .. W .. SK, UU}, {U .. Y .. SK, UU}, -------------- final -yā uses tall alif not alif maqṣūra ------------------ {"(" .. Y .. SH .. "?" .. A .. ")" .. AMAQ, "%1" .. ALIF}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {HAMZA .. A .. HAMZA .. SK, HAMZA .. A .. ALIF}, {HAMZA .. I .. HAMZA .. SK, HAMZA .. I .. Y}, {HAMZA .. U .. HAMZA .. SK, HAMZA .. U .. W} } local postprocess_tr_subs = { {"ī([" .. vowels .. "y*])", "iy%1"}, {"ū([" .. vowels .. "w*])", "uw%1"}, {"(.)%*", "%1%1"}, -- implement shadda ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {"iw([^" .. vowels .. "w])", "ī%1"}, {"iy([^" .. vowels .. "y])", "ī%1"}, -- uw, uy -> ū (assimilated verbs) {"uw([^" .. vowels .. "w])", "ū%1"}, {"uy([^" .. vowels .. "y])", "ū%1"}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {"ʔaʔ(" .. NV .. ")", "ʔā%1"}, {"ʔiʔ(" .. NV .. ")", "ʔī%1"}, {"ʔuʔ(" .. NV .. ")", "ʔū%1"}, } -- Post-process verb parts to eliminate phonological anomalies. Many of the changes, particularly the tricky ones, -- involve converting hamza to have the proper seat. The rules for this are complicated and are documented on the -- [[w:Hamza]] Wikipedia page. In some cases there are alternatives allowed, and we handle them below by returning -- multiple possibilities. local function postprocess_term(term) if term == "?" then return "?" end -- Add BORDER at text boundaries. term = BORDER .. term .. BORDER -- Do the main post-processing, based on the pattern substitutions in postprocess_subs. for _, sub in ipairs(postprocess_subs) do term = rsub(term, sub[1], sub[2]) end term = term:gsub(BORDER, "") if not rfind(term, HAMZA) then return term end term = term:gsub(HAMZA, HAMZA_PH) term = ar_utilities.process_hamza(term) if #term == 1 then term = term[1] end return term end local function postprocess_translit(translit) if translit == "?" then return "?" end -- Add BORDER at text boundaries. translit = BORDER .. translit .. BORDER -- Do the main post-processing, based on the pattern substitutions in postprocess_tr_subs. for _, sub in ipairs(postprocess_tr_subs) do translit = rsub(translit, sub[1], sub[2]) end translit = translit:gsub(BORDER, "") return translit end local function postprocess_forms(base) local converted_values = {} for slot, forms in pairs(base.forms) do local need_dedup = false for i, form in ipairs(forms) do local term = postprocess_term(form.form) local translit = form.translit and postprocess_translit(form.translit) or nil if term ~= form.form or translit ~= form.translit then need_dedup = true end converted_values[i] = {term, translit} end if need_dedup then local temp_dedup = {} for i = 1, #forms do local new_term, new_translit = unpack(converted_values[i]) if type(new_term) == "table" then for _, nt in ipairs(new_term) do local new_formobj = { form = nt, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end else local new_formobj = { form = new_term, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end end base.forms[slot] = temp_dedup.temp end end end local function process_slot_overrides(base) for slot, forms in pairs(base.slot_overrides) do local existing_values = base.forms[slot] base.forms[slot] = nil for _, form in ipairs(forms) do -- + in active participle for form I requests slot ap1 if form.form == "+" and (base.verb_form ~= "I" or slot ~= "ap") then if not existing_values then error(("Slot '%s' requested the default value but no such value available"):format(slot)) end -- We maintain an invariant that no two slots share a form object (although they may share the footnote -- lists inside the form objects). However, there is no need to copy the form objects here because there -- is a one-to-one correspondence between slots and slot overrides, i.e. you can't have a default value -- go into two slots. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) elseif default_indicator_to_active_participle_slot[form.form] then if form.form == "++" then if slot ~= "vn" and slot ~= "ap" and slot ~= "pp" then error(("Secondary default value request '++' only applicable to verbal nouns and pariciples, but found in slot '%s'"): format(slot)) end else if slot ~= "ap" then error(("Secondary default value request '%s' only applicable to active pariciples, but found in slot '%s'"): format(form.form, slot)) end end local secondary_default_slot = slot == "vn" and "vn2" or slot == "pp" and "pp2" or default_indicator_to_active_participle_slot[form.form] local existing_values = base.forms[secondary_default_slot] if not existing_values then error(("Slot '%s' requested a secondary default value using '%s' but no such value available"): format(slot, form.form)) end -- See comment above about the lack of need to copy the form objects. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) -- To make sure there aren't shared form objects. base.forms[secondary_default_slot] = nil else insert_form_or_forms(base, slot, form, "allow overrides", form.uncertain) end end end -- Now, for non-stative form-I verbs, fill the active participle slot from ap1 unless it should be missing (e.g. -- passive-only or user specified 'ap:-'). if base.verb_form == "I" and not base.forms.ap and base.forms.ap1 and not skip_slot(base, "ap") then local saw_non_stative = false for _, vowel_spec in ipairs(base.conj_vowels) do if req(vowel_spec.past, A) then saw_non_stative = true break end end if saw_non_stative then base.forms.ap = base.forms.ap1 -- To make sure there aren't shared form objects. base.forms.ap1 = nil end end end local function handle_lemma_linked(base) -- Compute linked versions of potential lemma slots, for use in {{ar-verb}}. We substitute the original lemma -- (before removing links) for forms that are the same as the lemma, if the original lemma has links. for _, slot in ipairs(export.potential_lemma_slots) do if base.forms[slot] then insert_form_or_forms(base, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function add_missing_links_to_forms(base) -- Any forms without links should get them now. Redundant ones will be stripped later. for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do if not form.form:find("%[%[") then form.form = "[[" .. form.form .. "]]" end end end end local function conjugate_verb(base) construct_stems(base) for _, vowel_spec in ipairs(base.conj_vowels) do -- Reconstruct conjugation type from verb form and (possibly inferred) weakness. conj_type = base.verb_form .. "-" .. vowel_spec.weakness -- Check that the conjugation type is recognized. if not conjugations[conj_type] then error("Unknown conjugation type '" .. conj_type .. "'") end -- The way the conjugation functions work is they always add entries to the appropriate parts of the paradigm -- (each of which is an array), rather than setting the values. This makes it possible to call more than one -- conjugation function and essentially get a paradigm of the "either A or B" kind. Doing this may insert -- duplicate entries into a particular paradigm part, but this is not a problem because we check for duplicate -- entries when adding them, and don't insert in that case. conjugations[conj_type](base, vowel_spec) end postprocess_forms(base) process_slot_overrides(base) -- This should happen before add_missing_links_to_forms() so that the comparison `form == base.lemma` in -- handle_lemma_linked() works correctly and compares unlinked forms to unlinked forms. handle_lemma_linked(base) process_addnote_specs(base) if not base.alternant_multiword_spec.args.noautolinkverb then add_missing_links_to_forms(base) end end local function parse_indicator_spec(angle_bracket_spec) -- Store the original angle bracket spec so we can reconstruct the overall conj spec with the lemma(s) in them. local base = { angle_bracket_spec = angle_bracket_spec, conj_vowels = {}, root_consonants = {}, user_stem_overrides = {}, user_slot_overrides = {}, slot_explicitly_missing = {}, slot_uncertain = {}, slot_override_uses_default = {}, addnote_specs = {}, } local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) local segments = put.parse_multi_delimiter_balanced_segment_run(inside, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- The first dot-separated element must specify the verb form, e.g. IV or IIq. If the form is I, it needs to include -- the the past and non-past vowels, e.g. I/a~u for kataba ~ yaktubu. More than one vowel can be given, -- comma-separated, and more than one past~non-past pair can be given, slash-separated, e.g. I/a,u~u/i~a for form I -- كمل, which can be conjugated as kamala/kamula ~ yakmulu or kamila ~ yakmalu. An individual vowel spec must be one -- of a, i or u and in general (a) at least one past~non-past pair most be given, and (b) both past and non-past -- vowels must be given even though sometimes the vowel can be determined from the unvocalized form. An exception is -- passive-only verbs, where the vowels can't in general be determined (except indirectly in some cases by looking -- at an associated non-passive verb); in that case, the vowel~vowel spec can left out. local slash_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_groups[1], "/") local form_spec = slash_separated_groups[1] base.form_footnotes = fetch_footnotes(form_spec) if form_spec[1] == "" then parse_err("Missing verb form") end if not allowed_vforms_with_weakness_set[form_spec[1]] then parse_err(("Unrecognized verb form '%s', should be one of %s"):format( form_spec[1], list_to_text(allowed_vforms, nil, " or "))) end if form_spec[1]:find("%-") then base.verb_form, base.explicit_weakness = form_spec[1]:match("^(.-)%-(.*)$") else base.verb_form = form_spec[1] end if #slash_separated_groups > 1 then if base.verb_form ~= "I" then parse_err(("Past~non-past vowels can only be specified when verb form is I, but saw form '%s'"):format( base.verb_form)) end for i = 2, #slash_separated_groups do local slash_separated_group = slash_separated_groups[i] local tilde_separated_groups = put.split_alternating_runs_and_strip_spaces(slash_separated_group, "~") if #tilde_separated_groups ~= 2 then parse_err(("Expected two tilde-separated vowel specs: %s"):format(table.concat(slash_separated_group))) end local function parse_conj_vowels(tilde_separated_group, vtype) local conj_vowel_objects = {} local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(tilde_separated_group, ",") for _, comma_separated_group in ipairs(comma_separated_groups) do local conj_vowel = comma_separated_group[1] if conj_vowel ~= "a" and conj_vowel ~= "i" and conj_vowel ~= "u" then parse_err(("Expected %s conjugation vowel '%s' to be one of a, i or u in %s"):format( vtype, conj_vowel, table.concat(slash_separated_group))) end conj_vowel = dia[conj_vowel] local conj_vowel_footnotes = fetch_footnotes(comma_separated_group) -- Try to use strings when possible as it makes q() significantly more efficient. if conj_vowel_footnotes then table.insert(conj_vowel_objects, {form = conj_vowel, footnotes = conj_vowel_footnotes}) else table.insert(conj_vowel_objects, conj_vowel) end end return conj_vowel_objects end local conj_vowel_spec = { past = parse_conj_vowels(tilde_separated_groups[1], "past"), nonpast = parse_conj_vowels(tilde_separated_groups[2], "non-past"), } table.insert(base.conj_vowels, conj_vowel_spec) end end for i = 2, #dot_separated_groups do local dot_separated_group = dot_separated_groups[i] local first_element = dot_separated_group[1] if first_element == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, {slot_specs = slot_specs, footnotes = spec_and_footnotes}) elseif first_element:find("^var:") then if #dot_separated_group > 1 then parse_err(("Can't attach footnotes to 'var:' spec '%s'"):format(first_element)) end base.variant = first_element:match("^var:(.*)$") elseif first_element:find("^I+V?:") then local root_cons, root_cons_value = first_element:match("^(I+V?):(.*)$") local root_index if root_cons == "I" then root_index = 1 elseif root_cons == "II" then root_index = 2 elseif root_cons == "III" then root_index = 3 elseif root_cons == "IV" then root_index = 4 if not base.verb_form:find("q$") then parse_err(("Can't specify root consonant IV for non-quadriliteral verb form '%s': %s"):format( base.verb_form, first_element)) end end local cons, translit = root_cons_value:match("^(.*)//(.*)$") if not cons then cons = root_cons_value end local root_footnotes = fetch_footnotes(dot_separated_group) if not translit and not root_footnotes then base.root_consonants[root_index] = cons else base.root_consonants[root_index] = {form = cons, translit = translit, footnotes = root_footnotes} end elseif first_element:find("^[a-z][a-z0-9_]*:") then local slot_or_stem, remainder = first_element:match("^(.-):(.*)$") dot_separated_group[1] = remainder local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_group, "[,،]") if overridable_stems[slot_or_stem] then if base.user_stem_overrides[slot_or_stem] then parse_err("Overridable stem '" .. slot_or_stem .. "' specified twice") end base.user_stem_overrides[slot_or_stem] = overridable_stems[slot_or_stem](comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) else -- assume a form override; we validate further later when the possible slots are available if base.user_slot_overrides[slot_or_stem] then parse_err("Form override '" .. slot_or_stem .. "' specified twice") end base.user_slot_overrides[slot_or_stem] = allow_multiple_values_for_override(comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}, "is form override") end elseif indicator_flags[first_element] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base[first_element] then parse_err("Spec '" .. first_element .. "' specified twice") end base[first_element] = true else local passive, uncertain = first_element:match("^(.*)(%?)$") passive = passive or first_element uncertain = not not uncertain if passive_types[passive] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. passive .. "' spec") end if base.passive then parse_err("Value for passive type specified twice") end base.passive = passive base.passive_uncertain = uncertain else parse_err("Unrecognized spec '" .. first_element .. "'") end end end return base end -- Normalize all lemmas, substituting the pagename for blank lemmas and adding links to multiword lemmas. local function normalize_all_lemmas(alternant_multiword_spec, head) -- (1) Add links to all before and after text. Remember the original text so we can reconstruct the verb spec later. if not alternant_multiword_spec.args.noautolinktext then iut.add_links_to_before_and_after_text(alternant_multiword_spec, "remember original") end -- (2) Remove any links from the lemma, but remember the original form so we can use it below in the 'lemma_linked' -- form. iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = head end base.user_specified_lemma = base.lemma base.lemma = m_links.remove_links(base.lemma) base.user_specified_verb = base.lemma base.verb = base.user_specified_verb local linked_lemma if alternant_multiword_spec.args.noautolinkverb or base.user_specified_lemma:find("%[%[") then linked_lemma = base.user_specified_lemma else -- Add links to the lemma so the user doesn't specifically need to, since we preserve -- links in multiword lemmas and include links in non-lemma forms rather than allowing -- the entire form to be a link. linked_lemma = iut.add_links(base.user_specified_lemma) end base.linked_lemma = linked_lemma end) end --W: Lexical exceptions — yāʾ-middle roots whose Form IV (أفعل) keeps the yāʾ SOUND -- instead of undergoing the regular إعلال to a hollow verb (أَفْيَلَ, not أَفَالَ). -- These are attested verbs (not the صفة مشبهة like أَخْيَف/خَيْفاء); each is sourced below. -- Only Form IV is affected; forms VII/VIII/X of these roots remain hollow. -- Keyed by rad1..rad2..rad3. local SOUND_FORM_IV_ROOTS = { ["خيل"] = true, -- أَخْيَلَ: أخيلت السماءُ تهيأت للمطر — المعجم الوسيط ج1 ص266 (وبه أَخالت أيضًا) ["غيل"] = true, -- أَغْيَلَ: أغيلته فهي مُغْيِل، سقته الغَيْل — لسان العرب ج11 ص111 (وبه أغالت أيضًا) ["حيج"] = true, -- أَحْيَجَ: أحيجت الأرضُ، على خلاف القياس — تاج العروس ج5 ص500 ["حين"] = true, -- أَحْيَنَ: أحين القومُ آن لهم أن يبلغوا ما أملوه — المعجم الوسيط ج1 ص212 ["خيف"] = true, -- أَخْيَفَ: أخيف الحاجُّ نزلوا خيف منى — كتاب الأفعال لابن القوطية ص35 ["ريف"] = true, -- أَرْيَفَ: أريفت الأرضُ إريافًا (خصبت) — المحيط في اللغة ج10 ص256 ["زين"] = true, -- أَزْيَنَ: أزينت الأرضُ، حسّنها عشبها — مقاييس اللغة ج3 ص41 } --W: Lexical exceptions — hollow roots in the Form I فَعُلَ pattern (past~non-past u~u) -- that keep the middle radical SOUND instead of contracting to a long vowel (هَيُؤَ / -- يَهْيُؤُ, not هَاءَ / يَهُوءُ). This is not the general rule for u~u hollow verbs -- -- طَالَ / يَطُولُ (ط-و-ل) contracts as normal -- so each entry here is a specific -- attested exception, not a phonological class. -- Keyed by rad1..rad2..rad3. -- Keyed with bare hamza (ء) for rad3, matching normalize_root()'s canonicalization of root radicals -- (HAMZA_ON_ALIF etc. all fold to HAMZA) -- the raw root "هيأ" normalizes to radicals ه, ي, ء. local SOUND_FORM_I_UU_ROOTS = { ["هي" .. HAMZA] = true, -- هَيُؤَ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان، ط٢، ١٩٩٥، ص٢٠٣ } -- Determine weakness from radicals. Used when root given in place of lemma (e.g. for {{ar-verb forms}}). -- `past_vowel`/`nonpast_vowel`, if given, are the past/non-past vowel of a form-I verb (a string or -- footnote-bearing form object, per `req()`); they let SOUND_FORM_I_UU_ROOTS single out the specific -- vowel pattern under which a hollow root is attested as sound, without affecting its other patterns -- (e.g. a root could still contract normally under a different past~non-past pairing). local function weakness_from_radicals(form, rad1, rad2, rad3, rad4, past_vowel, nonpast_vowel) local weakness = nil local quadlit = form:find("q$") -- If weakness unspecified, derive from radicals. if not quadlit then if is_waw_ya(rad3) and rad1 == W and form == "I" then weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated+final-weak" or "final-weak" elseif is_waw_ya(rad3) and vform_supports_final_weak(form) then weakness = "final-weak" elseif rad2 == rad3 and vform_supports_geminate(form) then weakness = "geminate" elseif is_waw_ya(rad2) and vform_supports_hollow(form) then --W: Both wāw (و) and yāʾ (ي) in the middle position create hollow verbs, in form I -- (قَالَ from ق-و-ل, بَاعَ from ب-ي-ع) and in the augmented forms IV, VII, VIII, X -- (أَتَاسَ from ت-ي-س, أَبَانَ from ب-ي-ن, أَطَاحَ from ط-ي-ح — معجم متن اللغة). if form == "IV" and rad2 == Y and SOUND_FORM_IV_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form IV keeps the yāʾ sound (أَفْيَلَ); see SOUND_FORM_IV_ROOTS. weakness = "sound" elseif form == "I" and past_vowel and nonpast_vowel and req(past_vowel, U) and req(nonpast_vowel, U) and SOUND_FORM_I_UU_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form I فَعُلَ keeps the middle radical sound (هَيُؤَ); see -- SOUND_FORM_I_UU_ROOTS. Gated to u~u specifically since that's the attested pattern. weakness = "sound" else weakness = "hollow" end elseif rad1 == W and form == "I" then -- Vowel-conditioned, like the lemma path below: a wāw-initial form-I verb only -- elides its wāw under a kasra (or lowered-kasra) non-past. Before this, the two -- inference paths in this module disagreed -- infer_radicals() kept the wāw for -- i~a and u~u while this one dropped it for every vowel pattern. weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated" or "sound" else weakness = "sound" end else if is_waw_ya(rad4) then weakness = "final-weak" else weakness = "sound" end end return weakness end -- Join the infixed tāʔ (ت) to the first radical in form VIII verbs. This may cause assimilation of the tāʔ to the -- radical or in some cases the radical to the tāʔ. Used when a root is supplied instead of a lemma (which already has -- the appropriate assimilation in it). local function form_viii_join_ta(rad) if rad == W or rad == Y or rad == "ت" then return "تّ" elseif rad == "د" then return "دّ" elseif rad == "ث" then return "ثّ" elseif rad == "ذ" then return "ذّ" elseif rad == "ز" then return "زْد" elseif rad == "ص" then return "صْط" elseif rad == "ض" then return "ضْط" elseif rad == "ط" then return "طّ" elseif rad == "ظ" then return "ظّ" else return rad .. SK .. "ت" end end local function detect_indicator_spec(base) base.forms = {} base.stem_overrides = {} base.slot_overrides = {} if not base.conj_vowels[1] then -- These may be converted to inferred vowels. If not, we throw an error if form I and not passive-only. base.conj_vowels = {{ past = "-", nonpast = "-", }} else -- If multiple vowels specified for a given vowel type (e.g. a,u~u), expand so that each spec in local expansion = {} for _, spec in ipairs(base.conj_vowels) do for _, past in ipairs(spec.past) do for _, nonpast in ipairs(spec.nonpast) do table.insert(expansion, {past = past, nonpast = nonpast}) end end end base.conj_vowels = expansion end local vform = base.verb_form -- check for quadriliteral form (Iq, IIq, IIIq, IVq) base.quadlit = not not vform:find("q$") -- Infer radicals as necessary. We infer a separate set of radicals for each past~non-past vowel combination because -- they may be different (particularly with form-I hollow verbs). for _, vowel_spec in ipairs(base.conj_vowels) do -- NOTE: rad1, rad2, etc. refer to user-specified radicals, which are formobj tables that optionally specify an -- explicit manual translit, whereas ir1, ir2, etc. refer to inferred radicals, which are either strings or -- lists of possible radicals. local rads = base.root_consonants local rad1, rad2, rad3, rad4 = rads[1], rads[2], rads[3], rads[4] -- Default any unspecified radicals to radicals determined from the headword. The returned radicals may be -- lists of possible radicals, where the first radical should be chosen if the user didn't explicitly specify a -- radical but all are allowed. If `ambig = true` is set in the table, the radical is considered ambiguous and -- categories won't be created for weak radicals. local weakness, ir1, ir2, ir3, ir4 if vform ~= "none" then ir1, ir2, ir3 = rmatch(base.lemma, "^([^_])_([^_])_([^_])$") if not ir1 then ir1, ir2, ir3, ir4 = rmatch(base.lemma, "^([^_])_([^_])_([^_])_([^_])$") end if ir1 then -- root given instead of lemma weakness = weakness_from_radicals(vform, ir1, ir2, ir3, ir4, vowel_spec.past, vowel_spec.nonpast) if vform == "VIII" then vowel_spec.form_viii_assim = form_viii_join_ta(ir1) end else local ret = export.infer_radicals { headword = base.lemma, vform = vform, passive = base.passive, past_vowel = vowel_spec.past, nonpast_vowel = vowel_spec.nonpast, is_reduced = base.reduced, } weakness, ir1, ir2, ir3, ir4 = ret.weakness, ret.rad1, ret.rad2, ret.rad3, ret.rad4 vowel_spec.form_viii_assim = ret.form_viii_assim vowel_spec.past = ret.past_vowel vowel_spec.nonpast = ret.nonpast_vowel vowel_spec.variant = base.variant or ret.variant end end -- For most ambiguous radicals, the choice of radical doesn't matter because it doesn't affect the conjugation -- one way or another. For form I hollow verbs, however, it definitely does. In fact, the choice of radical is -- critical even beyond the past and non-past vowels because it affects the form of the passive participle. So, -- check for this and signal an error if the radical could not be inferred and is not given explicitly. if vform == "I" and type(ir2) == "table" and ir2.need_radical and not rad2 then error("Unable to guess middle radical of hollow form I verb; need to specify radical explicitly") end if vform == "I" and not is_passive_only(base.passive) and ( rget(vowel_spec.past) == "-" or rget(vowel_spec.nonpast) == "-") then error("Form I verb that isn't passive-only or final-weak must have past~non-past vowels specified") end -- Convert ambiguous radicals. local function regularize_inferred_radical(rad) if type(rad) == "table" then if rad.ambig then return {form = rad[1], ambig = true} else return rad[1] end else return rad end end -- Return the appropriate radical at index `index` (1 through 4), based either on the user-specified radical -- `user_radical` or (if unspecified) `inferred_radical`, inferred from the unvocalized lemma. Two values are -- returned, the "regularized" version of the radical (where ambiguous inferred radicals are converted to their -- most likely actual radical) and the non-regularized version. The returned values are form objects rather than -- strings. local function fetch_radical(user_radical, inferred_radical, index) if not user_radical then return regularize_inferred_radical(inferred_radical), inferred_radical else local rad_formval = rget(user_radical) if type(inferred_radical) == "table" then local allowed_radical_set = m_table.listToSet(inferred_radical) if not allowed_radical_set[rad_formval] then error(("For lemma %s, radical %s ambiguously inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, list_to_text(inferred_radical, nil, " or "), rad_formval)) end elseif rad_formval ~= inferred_radical then error(("For lemma %s, radical %s inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, inferred_radical, rad_formval)) end return user_radical, user_radical end end if vform ~= "none" then vowel_spec.rad1, vowel_spec.unreg_rad1 = fetch_radical(rad1, ir1, 1) vowel_spec.rad2, vowel_spec.unreg_rad2 = fetch_radical(rad2, ir2, 2) vowel_spec.rad3, vowel_spec.unreg_rad3 = fetch_radical(rad3, ir3, 3) if base.quadlit then vowel_spec.rad4, vowel_spec.unreg_rad4 = fetch_radical(rad4, ir4, 4) end end if vform == "I" then -- If explicit weakness given using 'I-sound' or 'I-assimilated', we may need to adjust the inferred weakness. if base.explicit_weakness == "sound" then if weakness == "assimilated" then weakness = "sound" elseif weakness == "assimilated+final-weak" then -- Verbs like waniya~yawnā "to be faint; to languish" (although the defaults should handle this -- correctly) weakness = "final-weak" else error(("Can't specify form 'I-sound' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness == "assimilated" then if weakness == "sound" then -- i~a verbs like waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; -- waṯiʔa~yaṯaʔu "to get bruised, to be sprained", which would default to sound. weakness = "assimilated" elseif weakness == "final-weak" then -- For completeness; not clear if any verbs occur where this is needed. (There are plenty of -- assimilated+final-weak verbs but the defaults should take care of them.) weakness = "assimilated+final-weak" else error(("Can't specify form 'I-assimilated' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness then error(("Internal error: Unrecognized value '%s' for base.explicit_weakness"):format(base.explicit_weakness)) end elseif vform == "none" then weakness = base.explicit_weakness elseif base.explicit_weakness then error(("Internal error: Explicit weakness should not be specifiable except with forms I and none, but saw explicit weakness '%s' with verb form '%s'"): format(base.explicit_weakness, vform)) end vowel_spec.weakness = weakness if vform ~= "none" then -- Error if radicals are wrong given the weakness. More likely to happen if the weakness is explicitly given -- rather than inferred. Will also happen if certain incorrect letters are included as radicals e.g. hamza on -- top of various letters, alif maqṣūra, tā' marbūṭa. check_radicals(vform, weakness, rget(vowel_spec.rad1), rget(vowel_spec.rad2), rget(vowel_spec.rad3), base.quadlit and rget(vowel_spec.rad4) or nil) end -- Check the variant value. local form_iii_vi_geminate = (vform == "III" or vform == "VI") and rget(vowel_spec.rad2) == rget(vowel_spec.rad3) and not req(vowel_spec.rad2, Y) local hayy_i_x = hayy_radicals(vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3) and (vform == "I" or vform == "X") if form_iii_vi_geminate or hayy_i_x then if vowel_spec.variant and vowel_spec.variant ~= "long" and vowel_spec.variant ~= "short" and vowel_spec.variant ~= "both" then error(("For form-III/VI geminate verb or form-I/X verb with ح-ي-ي radicals, saw unrecognized 'var:%s' value; should be 'var:long', 'var:short' or 'var:both'"):format( vowel_spec.variant)) end elseif vowel_spec.variant then error(("Variant value 'var:%s' not allowed in this context"):format(vowel_spec.variant)) end end -- If form I, regroup expanded vowels for display purposes. if vform == "I" then local group_by_past = {} for _, vowel_spec in ipairs(base.conj_vowels) do m_table.insertIfNot(group_by_past, { past = undia[rget(vowel_spec.past)], nonpasts = {undia[rget(vowel_spec.nonpast)]}, }, { key = function(obj) return obj.past end, combine = function(obj1, obj2) for _, nonpast in ipairs(obj2.nonpasts) do m_table.insertIfNot(obj1.nonpasts, nonpast) end end, }) end local group_by_nonpast = {} for _, vowel_spec in ipairs(group_by_past) do m_table.insertIfNot(group_by_nonpast, { pasts = {vowel_spec.past}, nonpasts = vowel_spec.nonpasts, }, { key = function(obj) return obj.nonpasts end, combine = function(obj1, obj2) for _, past in ipairs(obj2.pasts) do m_table.insertIfNot(obj1.pasts, past) end end, }) end base.grouped_conj_vowels = group_by_nonpast end -- Set value of passive. If not specified, default is yes for forms II, III, IV and Iq; no but uncertainly for -- forms VII, IX, XI - XV and IIIq - IVq, as well as form I with past vowel u; impersonal but uncertainly for form -- V, VI, X and IIq, as well as form I with past vowel i; and yes but uncertainly for the remainder (form I with -- past vowel only a and form VIII). if not base.passive then base.passive_defaulted = true -- Temporary tracking for defaulted passives by verb form, weakness and (for form I) past/non-past vowels. track_if_ar_conj(base, "passive-defaulted/" .. vform) for _, vowel_spec in ipairs(base.conj_vowels) do track_if_ar_conj(base, "passive-defaulted/" .. vform.. "/" .. vowel_spec.weakness) if vform == "I" then --W: use rget(); the vowel is a form object when the user attached a footnote -- (e.g. <I/a[نادر]~u>), and undia[<table>] is nil, which crashes format() on Lua 5.1. local past_nonpast = ("%s~%s"):format(undia[rget(vowel_spec.past)], undia[rget(vowel_spec.nonpast)]) track_if_ar_conj(base, "passive-defaulted/I/" .. past_nonpast) track_if_ar_conj(base, "passive-defaulted/I/" .. vowel_spec.weakness .. "/" .. past_nonpast) end end if vform_probably_full_passive(vform) then base.passive = "pass" else base.passive_uncertain = true for _, vowel_spec in ipairs(base.conj_vowels) do if vform_probably_no_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "nopass" break elseif vform_probably_impersonal_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "ipass" break end end base.passive = base.passive or "pass" end end -- NOTE: Currently there are no built-in stems or form overrides for Arabic; this code is inherited from -- [[Module:ca-verb]], where such things do exist, and is kept for generality in case we decide in the future to -- implement such things. -- Override built-in verb stems and overrides with user-specified ones. for stem, values in pairs(base.user_stem_overrides) do base.stem_overrides[stem] = values end for slot, values in pairs(base.user_slot_overrides) do if not base.alternant_multiword_spec.verb_slots_map[slot] then error("Unrecognized override slot '" .. slot .. "': " .. base.angle_bracket_spec) end if export.unsettable_slots_set[slot] then error("Slot '" .. slot .. "' cannot be set using an override: " .. base.angle_bracket_spec) end if skip_slot(base, slot, "allow overrides") then error("Override slot '" .. slot .. "' would be skipped based on the passive, 'noimp' and/or 'no_nonpast' settings: " .. base.angle_bracket_spec) end base.slot_overrides[slot] = values end if base.verb_form == "none-final-weak" then for _, stem_type in ipairs { "past", "past_pass", "nonpast", "nonpast_pass" } do if base.stem_overrides[stem_type .. "_c"] or base.stem_overrides[stem_type .. "_v"] then error(("Specify past stem for verb type 'none-final-weak' using '%s:...' not '%s_c:...' or '%s_v:...'"): format(stem_type, stem_type, stem_type)) end end for _, stem_type in ipairs { "past", "nonpast" } do if base.stem_overrides[stem_type] or not base.stem_overrides[stem_type .. "_final_weak_vowel"] then error(("For verb type 'none-final-weak', if '%s:...' specified, so must '%s_final_weak_vowel:...'"): format(stem_type, stem_type)) end end end end local function detect_all_indicator_specs(alternant_multiword_spec) add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_forms = {} -- This means at least one individual base had the slot marked as explicitly missing. Another base (e.g. when -- there are multiple alternants) might have a value for the slot. In practice, we only respect this when there are -- no overall values in the slot and `slot_uncertain` isn't set; in this case, we display "no ..." for the slot -- instead of simply not displaying anything for the slot. alternant_multiword_spec.slot_explicitly_missing = {} -- This means at least one individual base had no values for the slot and the slot marked as explicitly uncertain. -- Note that this is different from a value being present but marked as uncertain (e.g. if an override was given -- with a ? after it); this causes the form object for the value to have `uncertain = true` set. If there are no -- overall values in the slot and `slot_uncertain` is set, we display this in the headword. alternant_multiword_spec.slot_uncertain = {} iut.map_word_specs(alternant_multiword_spec, function(base) -- So arguments, etc. can be accessed. WARNING: Creates circular reference. base.alternant_multiword_spec = alternant_multiword_spec detect_indicator_spec(base) if not base.nocat then m_table.insertIfNot(alternant_multiword_spec.verb_forms, base.verb_form) end if base.passive then alternant_multiword_spec.passive = base.passive end if base.passive_uncertain then alternant_multiword_spec.passive_uncertain = true end for slot, _ in pairs(base.slot_explicitly_missing) do alternant_multiword_spec.slot_explicitly_missing[slot] = true end end) end local function determine_slot_uncertainty_from_forms(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) -- If no verbal noun and verb form is not 'none' (manually-specified stems) — which currently only happens for -- form I — and the verbal noun wasn't explicitly indicated as missing using <vn:->, we assume it's just -- unknown/unspecified rather than missing. Same with active participles. for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not base.forms[uncertain_slot] and vform ~= "none" and not skip_slot(base, uncertain_slot) then base.slot_uncertain[uncertain_slot] = true end end -- Propagate slot uncertainty up. Currently only the verbal noun can have this set but we write the code -- generally. for slot, _ in pairs(base.slot_uncertain) do alternant_multiword_spec.slot_uncertain[slot] = true end end) -- If slot is uncertain and has no value, explicitly set its value to "?". for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not alternant_multiword_spec.forms[uncertain_slot] and alternant_multiword_spec.slot_uncertain[uncertain_slot] then alternant_multiword_spec.forms[uncertain_slot] = {{form = "?"}} end end end -- Determine certain properties of the verb from the overall forms, such as whether the verb is active-only or -- passive-only, is impersonal, lacks an imperative, etc. local function determine_verb_properties_from_forms(alternant_multiword_spec) alternant_multiword_spec.has_active = false alternant_multiword_spec.has_passive = false alternant_multiword_spec.has_non_impers_active = false alternant_multiword_spec.has_non_impers_passive = false alternant_multiword_spec.has_imp = false alternant_multiword_spec.has_past = false alternant_multiword_spec.has_nonpast = false for slot, _ in pairs(alternant_multiword_spec.forms) do if slot == "ap" or slot:find("[123]") and not slot:find("_pass") then alternant_multiword_spec.has_active = true end if slot == "pp" or slot:find("[123]") and slot:find("_pass") then alternant_multiword_spec.has_passive = true end if slot:find("[123]") and not slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_active = true end if slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_passive = true end if slot:find("^imp_") then alternant_multiword_spec.has_imp = true end if slot:find("^past_") then alternant_multiword_spec.has_past = true end if slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss_") then alternant_multiword_spec.has_nonpast = true end end end local function add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) -- Useful e.g. in constructing suppletive verbs out of parts. For a verb like جاء or أتى whose imperative comes -- from the unrelated verb تعالى, we don't want the latter verb showing up in categories or annotations. if base.nocat then return end local vform = base.verb_form if vform ~= "none" then insert_ann("form", vform) insert_cat("form-" .. vform .. " verbs") --W: Add morphological pattern corresponding to the form local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[vform] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end if base.reduced then insert_ann("reduced", "reduced") if vform ~= "none" then insert_cat("form-" .. vform .. " reduced verbs") end end if base.quadlit then insert_cat("verbs with quadriliteral roots") end if base.passive_defaulted then insert_cat("verbs with defaulted passive") end for _, vowel_spec in ipairs(base.conj_vowels) do local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local weakness = vowel_spec.weakness -- We have to distinguish weakness by form and weakness by conjugation. Weakness by form merely indicates the -- presence of weak letters in certain positions in the radicals. Weakness by conjugation is related to how the -- verbs are conjugated. For example, form-II verbs that are "hollow by form" (middle radical is wāw or yāʾ) are -- conjugated as sound verbs. Another example: form-I verbs with initial wāw are "assimilated by form" and most -- are assimilated by conjugation as well, but a few are sound by conjugation, e.g. wajuha yawjuhu "to be -- distinguished" (rather than wajuha yajuhu); similarly for some hollow-by-form verbs in various forms, e.g. -- form VIII izdawaja yazdawiju "to be in pairs" (rather than izdāja yazdāju). Categories referring to weakness -- always refer to weakness by conjugation; weakness by form is distinguished only by categories such as -- [[:Category:Arabic form-III verbs with و as second radical]]. insert_ann("weakness", weakness) if vform ~= "none" then insert_cat(("%s form-%s verbs"):format(weakness, vform)) end local function radical_is_ambiguous(rad) return type(rad) == "table" and rad.ambig end local function radical_is_unambiguous_weak(rad) return not radical_is_ambiguous(rad) and (is_waw_ya(rad) or req(rad, HAMZA)) end if vform ~= "none" then local ur1, ur2, ur3, ur4 = vowel_spec.unreg_rad1, vowel_spec.unreg_rad2, vowel_spec.unreg_rad3, vowel_spec.unreg_rad4 -- Create headword categories based on the radicals. Do the following before -- converting the Latin radicals into Arabic ones so we distinguish -- between ambiguous and non-ambiguous radicals. if radical_is_ambiguous(ur1) or radical_is_ambiguous(ur2) or radical_is_ambiguous(ur3) or ur4 and radical_is_ambiguous(ur4) then insert_cat("verbs with ambiguous radicals") end if radical_is_unambiguous_weak(ur1) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur1) .. " as first radical") end if radical_is_unambiguous_weak(ur2) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur2) .. " as second radical") end if radical_is_unambiguous_weak(ur3) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur3) .. " as third radical") end if ur4 and radical_is_unambiguous_weak(ur4) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur4) .. " as fourth radical") end end end if vform == "I" and not is_passive_only(base.passive) then for _, vowel_spec in ipairs(base.grouped_conj_vowels) do insert_ann("vowels", ("%s ~ %s"):format(table.concat(vowel_spec.pasts, "/"), table.concat(vowel_spec.nonpasts, "/"))) for _, past in ipairs(vowel_spec.pasts) do for _, nonpast in ipairs(vowel_spec.nonpasts) do if past == "-" or nonpast == "-" then error("Internal error: Saw form I past vowel %s and non-past vowel %s but - in place of vowel should have triggered an error earlier") end insert_cat(("form-I verbs with past vowel %s and non-past vowel %s"):format(past, nonpast)) --W: Add morphological pattern for form I based on vowels local form_i_with_vowels = ("I/%s~%s"):format(past, nonpast) local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[form_i_with_vowels] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end end end end for slot, name in pairs(slots_that_may_be_uncertain) do if base.slot_uncertain[slot] then -- An unspecified and non-defaulted verbal noun (form I) is considered uncertain rather than explicitly -- missing. Use <vn:-> to explicitly indicate the lack of verbal noun. Same for form-I stative active -- participles. insert_cat(("verbs with unknown or uncertain %ss"):format(name)) end end if base.irregular then insert_ann("irreg", "irregular") insert_cat("irregular verbs") end end -- Compute the categories to add the verb to, as well as the annotation to display in the conjugation title bar. We -- combine the code to do these functions as both categories and title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.categories = {} local ann = {} alternant_multiword_spec.annotation = ann ann.form = {} ann.morph_pattern = {} --W: arabic morphological pattern corresponding to the form ann.weakness = {} ann.vowels = {} ann.passive = nil ann.reduced = {} ann.irreg = {} ann.defective = {} local multiword_lemma = false for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do if formobj.form:find(" ") then multiword_lemma = true break end end break end end local function insert_ann(anntype, value) m_table.insertIfNot(alternant_multiword_spec.annotation[anntype], value) end local function insert_cat(cat, also_when_multiword) -- Don't place multiword terms in categories like 'Arabic form-II verbs' to avoid spamming the categories with -- such terms. if also_when_multiword or not multiword_lemma then m_table.insertIfNot(alternant_multiword_spec.categories, "Arabic " .. cat) end end iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) end) for slot, name in pairs(slots_that_may_be_uncertain) do if alternant_multiword_spec.forms[slot] then for _, form in ipairs(alternant_multiword_spec.forms[slot]) do if form.uncertain then if form.form == "?" then insert_cat(("verbs with explicitly unknown %ss"):format(name)) else insert_cat(("verbs needing %s checked"):format(name)) end break end end end end if alternant_multiword_spec.has_active then if alternant_multiword_spec.has_passive and alternant_multiword_spec.has_non_impers_passive then insert_cat("verbs with full passive") ann.passive = "full passive" elseif alternant_multiword_spec.has_passive then insert_cat("verbs with impersonal passive") ann.passive = "impersonal passive" else insert_cat("verbs lacking passive forms") ann.passive = "no passive" end else if alternant_multiword_spec.has_non_impers_passive then insert_cat("passive verbs") insert_cat("verbs with full passive") ann.passive = "passive-only" else insert_cat("passive verbs") insert_cat("impersonal verbs") insert_cat("verbs with impersonal passive") ann.passive = "impersonal (passive-only)" end end if alternant_multiword_spec.passive_uncertain then insert_cat("verbs needing passive checked") ann.passive = ann.passive .. ' <abbr title="passive status uncertain">(?)</abbr>' end if alternant_multiword_spec.has_active and not alternant_multiword_spec.has_imp then insert_ann("defective", "no imperative") insert_cat("verbs lacking imperative forms") end if not alternant_multiword_spec.has_past then insert_ann("defective", "no past") insert_cat("verbs lacking past forms") end if not alternant_multiword_spec.has_nonpast then insert_ann("defective", "no non-past") insert_cat("verbs lacking non-past forms") end local ann_parts = {} local function insert_ann_part(part, conj) local val = table.concat(ann[part], conj or " or ") if val ~= "" and val ~= "regular" then table.insert(ann_parts, val) end end insert_ann_part("form") insert_ann_part("weakness") insert_ann_part("reduced") insert_ann_part("vowels") if ann.passive then table.insert(ann_parts, ann.passive) end insert_ann_part("irreg") insert_ann_part("defective", "، ") --W: Save morph_pattern before overwriting annotation with string alternant_multiword_spec.morph_pattern = ann.morph_pattern alternant_multiword_spec.annotation = table.concat(ann_parts, "، ") end local function show_forms(alternant_multiword_spec) local lemmas = {} for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do table.insert(lemmas, formobj) end break end end alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() alternant_multiword_spec.vn = alternant_multiword_spec.forms.vn -- save for later use in make_table() -- Reconstruct the original verb spec without overrides for verbal nouns and participles, since those specific slots -- are ignored by {{ar-verb form}}. Compute this once beforehand; `transform_accel_obj` is called repeatedly on each -- form and we don't want to compute this repeatedly. local reconstructed_verb_spec = iut.reconstruct_original_spec(alternant_multiword_spec, { preprocess_angle_bracket_spec = function(spec) spec = spec:match("^<(.*)>$") assert(spec) local segments = put.parse_multi_delimiter_balanced_segment_run(spec, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- Rejoin each dot-separated group into a single string, since we aren't actually going to do any parsing -- of bracket-bounded textual runs; then filter out overrides for verbal nouns and participles. local filtered_indicators = {} for _, dot_separated_group in ipairs(dot_separated_groups) do local indicator = table.concat(dot_separated_group) -- FIXME: Do we want to filter out any other indicators? if not (indicator:find("^vn:") or indicator:find("^[ap]p:")) then table.insert(filtered_indicators, indicator) end end return ("<%s>"):format(table.concat(filtered_indicators, ".")) end, }) -- If we're dealing with a single word, no alternants and a single verb form, use the auto-conjugation-fetching -- variant. local reconstructed_lemma, inside = reconstructed_verb_spec:match("^([^ <>()]+)(%b<>)$") if inside and alternant_multiword_spec.verb_forms[1] and not alternant_multiword_spec.verb_forms[2] then reconstructed_verb_spec = ("+%s<%s>"):format(reconstructed_lemma, alternant_multiword_spec.verb_forms[1]) end local function transform_accel_obj(slot, formobj, accel_obj) if not accel_obj then return accel_obj end if slot == "ap" or slot == "pp" or slot == "vn" then -- FIXME: [[Module:accel]] can't correctly handle more than one verb form for participles and verbal nouns accel_obj.form = slot .. "-" .. table.concat(alternant_multiword_spec.verb_forms, "،") else accel_obj.form = "verb-form-" .. reconstructed_verb_spec end return accel_obj end local function generate_link(data) local form = data.form local term = form.formval_for_link local alt = form.alt if term == "?" then term = nil alt = "?" end --W: Create simple link for verb forms without #Arabic anchor local display = alt or term local link if display then link = link_term_simple(display) else link = "" end link = link .. iut.get_footnote_text(form.footnotes, data.footnote_obj) --W: qualifier/label rendering removed along with the q/qq/l/ll modifiers; -- it required [[Module:pron qualifier]], absent on ar.wiktionary. return link end local props = { lang = lang, lemmas = lemmas, transform_accel_obj = transform_accel_obj, generate_link = generate_link, slot_list = alternant_multiword_spec.verb_slots, include_translit = false, } iut.show_forms(alternant_multiword_spec.forms, props) end --W: Tatweel and the invisible direction/joining marks survive copy-paste and -- MediaWiki keeps them in page titles, so strip them from both sides before -- comparing a |بؤرة= value against a generated form. local FOCUS_IGNORE = "[" .. u(0x0640) .. u(0x061C) .. u(0x200B) .. "-" .. u(0x200F) .. u(0x202A) .. "-" .. u(0x202E) .. u(0xFEFF) .. "]" local function normalize_for_focus(s) return (rsub(s, FOCUS_IGNORE, "")) end --W: Which slots hold `focus`? Must run before show_forms() turns the form -- lists into rendered wikitext. local function find_focus_slots(alternant_multiword_spec, focus) if not focus or focus == "" then return nil end local target = normalize_for_focus(focus) local slots = {} for slot, forms in pairs(alternant_multiword_spec.forms) do if type(forms) == "table" then for _, formobj in ipairs(forms) do if type(formobj) == "table" and formobj.form and normalize_for_focus(formobj.form) == target then slots[slot] = true break end end end end return slots end --W: 'yes' unless |موسع= asked for the table open. [[Template:inflection-table-top]] -- turns any non-empty |tall= into the mw-collapsed class. local function collapsed_arg(alternant_multiword_spec) if alternant_multiword_spec.expanded then return nil end return 'yes' end --W: Put the marker class on the cell itself rather than on a span around its -- contents, so the highlight covers the whole cell instead of hugging the word. -- Runs on the table wikitext below, before m_string_utilities.format() fills the -- {slot} placeholders in. Every form cell in either table has one of two shapes: -- -- | {past_1s} -> | class="avf-focus" | {past_1s} -- | rowspan="2" | {past_1s} -> | rowspan="2" class="avf-focus" | {past_1s} -- -- Styled by [[Template:ar-verb-form/style.css]] (.inflection-table td.avf-focus). local function mark_focus_cells(text, focus_slots) if not focus_slots then return text end return (rsub(text, "\n(|[^\n]*)", function(cell) local slot = rmatch(cell, "^|%s*{([%w_]+)}%s*$") if slot then if focus_slots[slot] then return '\n| class="avf-focus" | {' .. slot .. "}" end return nil end local attrs attrs, slot = rmatch(cell, "^|%s*(.-)%s*|%s*{([%w_]+)}%s*$") if slot and focus_slots[slot] then return "\n| " .. attrs .. ' class="avf-focus" | {' .. slot .. "}" end return nil end)) end ------------------------------------------------------------------------------- -- Functions to create inflection tables -- ------------------------------------------------------------------------------- -- Make the conjugation table. Called from export.show(). local function make_table(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } text = text .. [=[ ! colspan="6" | <<الْمَصْدَر>> | colspan="7" | {vn} ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْفَاعِل>> | colspan="7" | {ap} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْمَفْعُول>> | colspan="7" | {pp} ]=] end text = text .. [=[ |- ! colspan="999" class="separator" | ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="12" class="outer" | <<الْفِعْل الْمَعْلُوم>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="12" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="12" class="separator" | ! colspan="3"| <<الْجَمْع>> |- ! colspan="2"| ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_1s} | {past_2ms} | {past_3ms} | rowspan="2" | {past_2d} | {past_3md} | rowspan="2" | {past_1p} | {past_2mp} | {past_3mp} |- ! class="secondary" | المؤنث | {past_2fs} | {past_3fs} | {past_3fd} | {past_2fp} | {past_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_1s} | {ind_2ms} | {ind_3ms} | rowspan="2" | {ind_2d} | {ind_3md} | rowspan="2" | {ind_1p} | {ind_2mp} | {ind_3mp} |- ! class="secondary" | المؤنث | {ind_2fs} | {ind_3fs} | {ind_3fd} | {ind_2fp} | {ind_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_1s} | {sub_2ms} | {sub_3ms} | rowspan="2" | {sub_2d} | {sub_3md} | rowspan="2" | {sub_1p} | {sub_2mp} | {sub_3mp} |- ! class="secondary" | المؤنث | {sub_2fs} | {sub_3fs} | {sub_3fd} | {sub_2fp} | {sub_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_1s} | {juss_2ms} | {juss_3ms} | rowspan="2" | {juss_2d} | {juss_3md} | rowspan="2" | {juss_1p} | {juss_2mp} | {juss_3mp} |- ! class="secondary" | المؤنث | {juss_2fs} | {juss_3fs} | {juss_3fd} | {juss_2fp} | {juss_3fp} |- ! rowspan="2" | <<الْأَمْر>> ! class="secondary" | المذكر | rowspan="2" | | {imp_2ms} | rowspan="2" | | rowspan="2" | {imp_2d} | rowspan="2" | | rowspan="2" | | {imp_2mp} | rowspan="2" | |- ! class="secondary" | المؤنث | {imp_2fs} | {imp_2fp} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="999" class="separator" | |- ! colspan="12" class="outer" | <<الْفِعْل الْمَجْهُول>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="10" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="10" class="separator" | ! colspan="3" | <<الْجَمْع>> |- ! colspan="2" | ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_pass_1s} | {past_pass_2ms} | {past_pass_3ms} | rowspan="2" | {past_pass_2d} | {past_pass_3md} | rowspan="2" | {past_pass_1p} | {past_pass_2mp} | {past_pass_3mp} |- ! class="secondary" | المؤنث | {past_pass_2fs} | {past_pass_3fs} | {past_pass_3fd} | {past_pass_2fp} | {past_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_pass_1s} | {ind_pass_2ms} | {ind_pass_3ms} | rowspan="2" | {ind_pass_2d} | {ind_pass_3md} | rowspan="2" | {ind_pass_1p} | {ind_pass_2mp} | {ind_pass_3mp} |- ! class="secondary" | المؤنث | {ind_pass_2fs} | {ind_pass_3fs} | {ind_pass_3fd} | {ind_pass_2fp} | {ind_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_pass_1s} | {sub_pass_2ms} | {sub_pass_3ms} | rowspan="2" | {sub_pass_2d} | {sub_pass_3md} | rowspan="2" | {sub_pass_1p} | {sub_pass_2mp} | {sub_pass_3mp} |- ! class="secondary" | المؤنث | {sub_pass_2fs} | {sub_pass_3fs} | {sub_pass_3fd} | {sub_pass_2fp} | {sub_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_pass_1s} | {juss_pass_2ms} | {juss_pass_3ms} | rowspan="2" | {juss_pass_2d} | {juss_pass_3md} | rowspan="2" | {juss_pass_1p} | {juss_pass_2mp} | {juss_pass_3mp} |- ! class="secondary" | المؤنث | {juss_pass_2fs} | {juss_pass_3fs} | {juss_pass_3fd} | {juss_pass_2fp} | {juss_pass_3fp} ]=] end text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end if alternant_multiword_spec.vn then local linked_vns = {} for _, form in ipairs(alternant_multiword_spec.vn) do table.insert(linked_vns, link_term(form.form, "term")) end table.insert(ann_parts, (#linked_vns > 1 and "verbal nouns" or "verbal noun") .. " " .. table.concat(linked_vns, "، ")) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end -- Helper function to get root letters and verb classification for simplified table header -- Returns: root_display (e.g., "ح س ب"), verb_type (e.g., "فعل ثلاثي صحيح سالم") local function get_verb_info(alternant_multiword_spec) local root_display = "" local verb_type = "فعل" local rad1, rad2, rad3, rad4 -- Extract radicals from the base word spec using iut.map_word_specs -- This accesses the radicals directly from the parsed verb specification iut.map_word_specs(alternant_multiword_spec, function(base) -- Get radicals from the first conjugation vowel spec if base.conj_vowels and #base.conj_vowels > 0 then local vowel_spec = base.conj_vowels[1] -- Extract radicals, handling both table and string types local function extract_radical(rad) if type(rad) == "table" then -- If it's a table, get the first element or the string representation return rad[1] or rget(rad) else return rad end end rad1 = extract_radical(vowel_spec.rad1) rad2 = extract_radical(vowel_spec.rad2) rad3 = extract_radical(vowel_spec.rad3) rad4 = vowel_spec.rad4 and extract_radical(vowel_spec.rad4) end end) -- Get basic/derived classification from morphological pattern local basic_deriv if alternant_multiword_spec.morph_pattern and #alternant_multiword_spec.morph_pattern > 0 then local morph_pattern = alternant_multiword_spec.morph_pattern[1] basic_deriv = MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV[morph_pattern] end -- Format root display with spaces between letters if rad1 and rad2 and rad3 then if rad4 then -- Quadrilateral root_display = rad1 .. " " .. rad2 .. " " .. rad3 .. " " .. rad4 verb_type = "فعل رباعي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv end else -- triliteral root_display = rad1 .. " " .. rad2 .. " " .. rad3 verb_type = "فعل ثلاثي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv if basic_deriv == "مُجرَّد" then --W: the classification concerns only triliteral basic verbs (الثلاثي المُجرَّد) local classification = export.classify_triliteral_verb(rad1, rad2, rad3) verb_type = verb_type .. " " .. classification end end end end return root_display, verb_type end -- Make simplified conjugation table for ar.wiktionary. Called from export.show(). -- This table shows only past, present indicative, and imperative forms. -- No passive voice, no participles, no verbal nouns. local function make_table_ar(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } -- Get verb root and classification local root_display, verb_type = get_verb_info(alternant_multiword_spec) -- First row: Root and verb type spanning all columns text = text .. "! colspan=\"2\" | <<الجذر>>: " .. root_display .. "\n" text = text .. "| colspan=\"3\" | <<'''" .. verb_type .. "'''>>\n" text = text .. [=[ |- ! colspan="2" | <<الضمائر>> ! <<الماضي>> ! <<المضارع>> ! <<الأمر>> |- ! rowspan="2" | <<المتكلّم>> | <<أنا>> | {past_1s} | {ind_1s} | |- | <<نحن>> | {past_1p} | {ind_1p} | |- ! rowspan="5" | <<المخاطب>> | <<أنتَ>> | {past_2ms} | {ind_2ms} | {imp_2ms} |- | <<أنتِ>> | {past_2fs} | {ind_2fs} | {imp_2fs} |- | <<أنتما>> | {past_2d} | {ind_2d} | {imp_2d} |- | <<أنتم>> | {past_2mp} | {ind_2mp} | {imp_2mp} |- | <<أنتنّ>> | {past_2fp} | {ind_2fp} | {imp_2fp} |- ! rowspan="6" | <<الغائب>> | <<هو>> | {past_3ms} | {ind_3ms} | |- | <<هي>> | {past_3fs} | {ind_3fs} | |- | <<هما>> | {past_3md} | {ind_3md} | |- | <<هما>> | {past_3fd} | {ind_3fd} | |- | <<هم>> | {past_3mp} | {ind_3mp} | |- | <<هنّ>> | {past_3fp} | {ind_3fp} | ]=] text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end ------------------------------------------------------------------------------- -- Verb classification functions -- ------------------------------------------------------------------------------- --[=[ تصنيف الفعل الثلاثي المُجرَّد حسب نوعه Classify an Arabic triliteral basic verb root based on its three letters. @param r1 الحرف الأول (first root letter - الفاء) @param r2 الحرف الثاني (second root letter - العين) @param r3 الحرف الثالث (third root letter - اللام) @return str: نوع الفعل (verb type classification in Arabic) Examples: classify_triliteral_verb('ك', 'ت', 'ب') --> 'صحيح سالم' classify_triliteral_verb('أ', 'ت', 'ي') --> 'معتل ناقص يائي مهموز الفاء' classify_triliteral_verb('ق', 'ل', 'و') --> 'معتل ناقص واوي' ]=] function export.classify_triliteral_verb(r1, r2, r3) -- تعريف أحرف العلة والهمزة -- الحروف الضعيفة (أحرف العلة): واو وياء فقط local weak_letters = {[W] = true, [Y] = true} -- الهمزة: جميع أشكال الهمزة (ء، أ، إ، ؤ، ئ) local hamza_letters = { [HAMZA] = true, -- ء [HAMZA_ON_ALIF] = true, -- أ [HAMZA_UNDER_ALIF] = true, -- إ [HAMZA_ON_W] = true, -- ؤ [HAMZA_ON_Y] = true -- ئ } -- فحص كل حرف local is_hamza = {hamza_letters[r1] or false, hamza_letters[r2] or false, hamza_letters[r3] or false} local is_weak = {weak_letters[r1] or false, weak_letters[r2] or false, weak_letters[r3] or false} -- عدد أحرف العلة local weak_count = (is_weak[1] and 1 or 0) + (is_weak[2] and 1 or 0) + (is_weak[3] and 1 or 0) -- فحص التضعيف (الحرف الثاني = الثالث) local is_doubled = (r2 == r3) -- ═══════════════════════════════════════════════════════════ -- المُعتل: الفعل الذي يحتوي على حرف أو أكثر من أحرف العلة -- ═══════════════════════════════════════════════════════════ if weak_count > 0 then -- ───────────────────────────────────────────────────── -- لفيف: يحتوي على حرفين أو أكثر من أحرف العلة -- ───────────────────────────────────────────────────── if weak_count >= 2 then -- مقرون: حرفا العلة متجاوران if is_weak[2] and is_weak[3] then -- الثاني والثالث if is_hamza[1] then return "معتل لفيف مقرون مهموز الفاء" end return "معتل لفيف مقرون" elseif is_weak[1] and is_weak[2] then -- الأول والثاني return "معتل لفيف مقرون" -- مفروق: الأول والثالث حرفا علة elseif is_weak[1] and is_weak[3] then if is_hamza[2] then return "معتل لفيف مفروق مهموز العين" end return "معتل لفيف مفروق" end -- ───────────────────────────────────────────────────── -- مثال: الحرف الأول حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[1] then if r1 == W then -- واوي if is_hamza[3] then return "معتل مثال واوي مهموز اللام" elseif is_doubled then return "معتل مثال واوي مُضعَّف" elseif is_hamza[2] then return "معتل مثال واوي مهموز العين" end return "معتل مثال واوي" else -- يائي (ي) if is_doubled then return "معتل مثال يائي مُضعَّف" elseif is_hamza[2] then return "معتل مثال يائي مهموز العين" end return "معتل مثال يائي" end -- ───────────────────────────────────────────────────── -- أجوف: الحرف الثاني حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[2] then if r2 == W then -- واوي if is_hamza[3] then return "معتل أجوف واوي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف واوي مهموز الفاء" end return "معتل أجوف واوي" else -- يائي (ي) if is_hamza[3] then return "معتل أجوف يائي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف يائي مهموز الفاء" end return "معتل أجوف يائي" end -- ───────────────────────────────────────────────────── -- ناقص: الحرف الثالث حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[3] then if r3 == W then -- واوي if is_hamza[1] then return "معتل ناقص واوي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص واوي مهموز العين" end return "معتل ناقص واوي" else -- يائي (ي) if is_hamza[1] then return "معتل ناقص يائي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص يائي مهموز العين" end return "معتل ناقص يائي" end end -- ═══════════════════════════════════════════════════════════ -- الصحيح: الفعل الذي لا يحتوي على أحرف العلة -- ═══════════════════════════════════════════════════════════ else -- ───────────────────────────────────────────────────── -- مهموز: يحتوي على همزة -- ───────────────────────────────────────────────────── if is_hamza[1] or is_hamza[2] or is_hamza[3] then -- مهموز الفاء واللام: الأول والثالث همزة if is_hamza[1] and is_hamza[3] then return "صحيح مهموز الفاء واللام" -- مهموز الفاء elseif is_hamza[1] then if is_doubled then return "صحيح مُضعَّف مهموز الفاء" end return "صحيح مهموز الفاء" -- مهموز العين elseif is_hamza[2] then return "صحيح مهموز العين" -- مهموز اللام elseif is_hamza[3] then return "صحيح مهموز اللام" end -- ───────────────────────────────────────────────────── -- مُضعَّف: الحرف الثاني = الثالث -- ───────────────────────────────────────────────────── elseif is_doubled then return "صحيح مُضعَّف" -- ───────────────────────────────────────────────────── -- سالم: لا همزة، لا حرف علة، لا تضعيف -- ───────────────────────────────────────────────────── else return "صحيح سالم" end end return "غير معروف" end ------------------------------------------------------------------------------- -- External entry points -- ------------------------------------------------------------------------------- --W: Normalize root to use underscores as separators -- Accepts: "كتب", "ك_ت_ب", or "ك ت ب" -- Returns: "ك_ت_ب" local function normalize_root(root) if not root then return nil end -- Helper function to normalize a single character/radical local function normalize_char(char) -- Convert all hamza variants to canonical bare hamza if char == HAMZA_ON_ALIF or char == HAMZA_UNDER_ALIF or char == HAMZA_ON_W or char == HAMZA_ON_Y then return HAMZA -- Convert alif maqṣūra to yaa (ى → ي) elseif char == AMAQ then return Y -- Reject alif - it's not a root radical elseif char == ALIF then error("Root contains alif (ا) which is not a valid root radical. For weak verbs, use و (waw) or ي (yaa) instead.") end return char end -- Convert alif madda to hamza + alif for processing (will be caught as error below) root = root:gsub(AMAD, HAMZA .. ALIF) -- Replace spaces with underscores root = root:gsub(" ", "_") -- If no underscores yet, insert them between each character if not root:find("_") then -- Extract only Arabic letters (excluding diacritics) -- Arabic letter range: U+0621 to U+064A (basic letters) local chars = {} for char in mw.ustring.gmatch(root, "[ء-ي]") do table.insert(chars, normalize_char(char)) end root = table.concat(chars, "_") else -- Root already has underscores (e.g., "أ_م_ن"), normalize each radical local parts = mw.text.split(root, "_") for i, part in ipairs(parts) do parts[i] = normalize_char(part) end root = table.concat(parts, "_") end return root end --W: Construct the [1] parameter from root (جذر) and morphological pattern (وزن) -- Example: -- input: root="كتب", pattern="فعَل يفعُل" -- output: "ك_ت_ب<I/a~u>" -- `force_full_passive`, if true, appends ".pass" so the verb gets a full personal -- passive paradigm instead of the module's default impersonal-passive guess for -- vforms like I (past vowel i), V, VI, X and IIq (see |مبني للمجهول= on {{ar-conj}}). -- `reduced`, if true, appends ".reduced" so forms V/VI use the assimilated تاء -- التفعّل prefix (اِسَّمَّعَ) instead of the default تَ- prefix (تَسَمَّعَ) -- see -- |مدغم= on {{ar-conj}}. Not every root with an assimilable first radical is -- necessarily attested with the assimilated form, so this isn't inferred automatically -- from the root; it must be requested. local function construct_verb_spec(root, pattern, force_full_passive, reduced) if not root or not pattern then return nil end local normalized_root = normalize_root(root) local form_code = MORPHOLOGICAL_PATTERN_TO_FORM[pattern] if not form_code then error("Unknown morphological pattern (وزن صرفي): " .. pattern) end if force_full_passive then form_code = form_code .. ".pass" end if reduced then form_code = form_code .. ".reduced" end return normalized_root .. "<" .. form_code .. ">" end -- Wrapper function that accepts جذر (root) and وزن (pattern) as parameters -- Returns: verb_type (e.g., "فعل ثلاثي مُجرَّد صحيح سالم") -- Example: export.get_verb_type({["جذر"] = "كتب", ["وزن"] = "فعَل يفعُل"}) function export.get_verb_type(args) local verb_spec if args["جذر"] and args["وزن"] then verb_spec = construct_verb_spec(args["جذر"], args["وزن"]) elseif args[1] then verb_spec = args[1] else error("Must provide either جذر and وزن, or a verb specification in args[1]") end local alternant_multiword_spec = export.do_generate_forms({[1] = verb_spec}) local _, verb_type = get_verb_info(alternant_multiword_spec) return verb_type end -- Append two lists `l1` and `l2`, removing duplicates. If either is {nil}, just return the other. local function combine_lists(l1, l2) -- combine_footnotes() does exactly what we want. return iut.combine_footnotes(l1, l2) end local function combine_metadata(data) local src1 = data.form1 local src2 = data.form2 local dest = data.dest_form dest.uncertain = src1.uncertain or src2.uncertain if src1.genders and src2.genders and not m_table.deepEquals(src1.genders, src2.genders) then -- do nothing else dest.genders = src1.genders or src2.genders end if src1.pos and src2.pos and src1.pos ~= src2.pos then -- do nothing else dest.pos = src1.pos or src2.pos end -- Don't copy .alt, .gloss, .lit, .id, which describe a single term and don't extend to multiword terms. dest.q = combine_lists(src1.q, src2.q) dest.qq = combine_lists(src1.qq, src2.qq) dest.l = combine_lists(src1.l, src2.l) dest.ll = combine_lists(src1.ll, src2.ll) end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, source_template, headword_head) local PAGENAME = mw.loadData("Module:headword/data").pagename local function in_template_space() local nsText = mw.title.getCurrentTitle().nsText return nsText == "Template" or nsText == "قالب" end -- Determine the verb spec we're being asked to generate the conjugation of. This may be taken from the current page -- title or the value of |pagename=; but not when called from {{ar-verb form}}, where the page title is a -- non-lemma form. Note that the verb spec may omit the lemma; e.g. it may be "<II>". For this reason, we use the -- value of `pagename` computed here down below, when calling normalize_all_lemmas(). local pagename = source_template ~= "ar-verb form" and args.pagename or PAGENAME local head = headword_head or pagename --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local arg1 = args[1] if not arg1 then if (pagename == "ar-conj" or pagename == "ar-verb" or pagename == "ar-verb form" or pagename == "تصريف") and in_template_space() then arg1 = "كتب<I/a~u.pass>" else arg1 = "<>" end end -- When called from {{ar-verb form}}, determine the non-lemma form whose inflections we're being asked to -- determine. This normally comes from the page title or the value of |pagename=. local verb_form_of_form if source_template == "ar-verb form" then verb_form_of_form = args.pagename if not verb_form_of_form then if PAGENAME == "ar-verb form" and in_template_space() then verb_form_of_form = "كتبت" else verb_form_of_form = PAGENAME end end end local incorporated_headword_head_into_lemma = false if arg1:find("^<.*>$") then -- missing lemma if head:find(" ") then -- If multiword lemma, try to add arg spec after the first word. -- Try to preserve the brackets in the part after the verb, but don't do it -- if there aren't the same number of left and right brackets in the verb -- (which means the verb was linked as part of a larger expression). local first_word, post = rmatch(head, "^(.-)( .*)$") local left_brackets = rsub(first_word, "[^%[]", "") local right_brackets = rsub(first_word, "[^%]]", "") if #left_brackets == #right_brackets then arg1 = iut.remove_redundant_links(first_word) .. arg1 .. post incorporated_headword_head_into_lemma = true else -- Try again using the form without links. local linkless_head = m_links.remove_links(head) if linkless_head:find(" ") then first_word, post = rmatch(linkless_head, "^(.-)( .*)$") arg1 = first_word .. arg1 .. post else error("Unable to incorporate <...> spec into explicit head due to a multiword linked verb or " .. "unbalanced brackets; please include <> explicitly: " .. arg1) end end else -- Will be incorporated through `head` below in the call to normalize_all_lemmas(). incorporated_headword_head_into_lemma = true end end local parse_props = { parse_indicator_spec = parse_indicator_spec, angle_brackets_omittable = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template alternant_multiword_spec.verb_form_of_form = verb_form_of_form alternant_multiword_spec.incorporated_headword_head_into_lemma = incorporated_headword_head_into_lemma normalize_all_lemmas(alternant_multiword_spec, head) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { lang = lang, slot_list = alternant_multiword_spec.verb_slots, inflect_word_spec = conjugate_verb, combine_metadata = combine_metadata, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) if debug_translit then for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do if form.translit then local full_form_translit = (lang:transliterate(m_links.remove_links(form.form))) if full_form_translit ~= form.translit then error(("Internal error: For slot '%s', form '%s' incremental translit '%s' not same as full translit '%s'"): format(slot, form.form, form.translit, full_form_translit)) end end form.form = iut.remove_redundant_links(form.form) end end end -- Remove redundant brackets around entire forms. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = iut.remove_redundant_links(form.form) end end -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization (which is applied on enwiktionary -- but not in local Lua environments). This reverses the postprocessing step. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = apply_nfc_shadda(form.form) end end determine_slot_uncertainty_from_forms(alternant_multiword_spec) determine_verb_properties_from_forms(alternant_multiword_spec) compute_categories_and_annotation(alternant_multiword_spec) if args.json and source_template == "ar-conj" then -- There is a circular reference in `base.alternant_multiword_spec`, which points back to top level. iut.map_word_specs(alternant_multiword_spec, function(base) base.alternant_multiword_spec = nil end) return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{ar-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent() and frame:getParent().args or frame.args --W local params = { [1] = {}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["t"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["id"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use --W: additional parameters for ar.wiktionary.org ["جذر"] = {type = "string"}, --W: الجذر اللغوي, root ["وزن"] = {type = "string"}, --W: الوزن الصرفي, morphological pattern ["مبني للمجهول"] = {type = "boolean"}, --W: force a full personal passive paradigm, -- overriding the default impersonal-passive guess for vforms like I (past vowel -- i), V, VI, X and IIq ["مدغم"] = {type = "boolean"}, --W: for forms V/VI, assimilate the تاء التفعّل prefix -- into the first radical (اِسَّمَّعَ instead of تَسَمَّعَ) ["كامل"] = {type = "boolean"}, --W: show full table (default is simplified table) ["بؤرة"] = {type = "string"}, --W: highlight the cells holding this form ["موسع"] = {type = "boolean"}, --W: show the table expanded (default: collapsed) } local args = require("Module:parameters").process(parent_args, params) --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local alternant_multiword_spec = export.do_generate_forms(args, "ar-conj") if type(alternant_multiword_spec) == "string" then -- JSON return value return alternant_multiword_spec end --W: |بؤرة= marks the cells holding a given form, so that a conjugated-form -- page ([[Module:ar-verb-form]]) can show the reader where in the paradigm -- the word they looked up actually sits. The slots have to be found before -- show_forms(), which replaces each form list with rendered wikitext. alternant_multiword_spec.focus_slots = find_focus_slots(alternant_multiword_spec, args["بؤرة"]) --W: A table whose one relevant cell is highlighted is no use folded away, so -- [[Module:ar-verb-form]] asks for it open. Lemma pages keep it collapsed. alternant_multiword_spec.expanded = args["موسع"] or false show_forms(alternant_multiword_spec) --W: Choose table type: simplified (default) or full (comprehensive) local table_html if args["كامل"] then table_html = make_table(alternant_multiword_spec) else table_html = make_table_ar(alternant_multiword_spec) end --W: don't add categories --W: TODO: all lines with insert_cat() are to be removed. -- return table_html .. -- require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang, nil, nil, force_cat) return table_html end function export.verb_forms(frame) local parargs = frame:getParent().args local params = { [1] = {}, [2] = {}, [3] = {}, [4] = {}, [5] = {}, pagename = {}, } for _, form in ipairs(allowed_vforms) do -- FIXME: We go up to 5 here. The code supports unlimited variants but it's unlikely we will ever see more than -- 2. for index = 1, 5 do local prefix = index == 1 and form or form .. index params[prefix .. "-pv"] = {} for _, extn in ipairs { "", "-vn", "-ap", "-pp" } do params[prefix .. extn] = {} params[prefix .. extn .. "-head"] = {} -- FIXME: No -tr? params[prefix .. extn .. "-gloss"] = {} end end end local args = require("Module:parameters").process(parargs, params) local i = 1 local past_vowel_re = "^[aui,]*$" local combined_root = nil if not args[i] or rfind(args[i], past_vowel_re) then combined_root = args.pagename or mw.loadData("Module:headword/data").pagename if not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ])$") and not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ]) ([^ ])$") then error("When inferring roots from page title, need three or four space-separated radicals: " .. combined_root) end elseif rfind(args[i], " ") then combined_root = args[i] i = i + 1 else local separate_roots = {} while args[i] and not rfind(args[i], past_vowel_re) do table.insert(separate_roots, args[i]) i = i + 1 end combined_root = table.concat(separate_roots, " ") end local past_vowel = args[i] i = i + 1 if past_vowel and not rfind(past_vowel, past_vowel_re) then error("Unrecognized past vowel, should be 'a', 'i', 'u', 'a,u', etc. or empty: " .. past_vowel) end -- Spaces interfere with parsing as a unit in [[Module:inflection utilities]], so replace with underscore. combined_root = combined_root:gsub(" ", "_") local split_root = rsplit(combined_root, "_") -- Map from verb forms (I, II, etc.) to a table of verb properties, -- which has entries e.g. for "verb" (either true to autogenerate the verb -- head, or an explicitly specified verb head using e.g. argument "I-head"), -- and for "verb-gloss" (which comes from e.g. the argument "I" or "I-gloss"), -- and for "vn" and "vn-gloss", "ap" and "ap-gloss", "pp" and "pp-gloss". local verb_properties = {} for _, form in ipairs(allowed_vforms) do local formpropslist = {} local derivs = {{"verb", ""}, {"vn", "-vn"}, {"ap", "-ap"}, {"pp", "-pp"}} local index = 1 while true do local formprops = {} local prefix = index == 1 and form or form .. index if prefix == "I" then formprops.pv = past_vowel end if args[prefix .. "-pv"] then formprops.pv = args[prefix .. "-pv"] end for _, deriv in ipairs(derivs) do local prop = deriv[1] local extn = deriv[2] if args[prefix .. extn] == "+" then formprops[prop] = true elseif args[prefix .. extn] == "-" then formprops[prop] = false elseif args[prefix .. extn] then formprops[prop] = true formprops[prop .. "-gloss"] = args[prefix .. extn] end if args[prefix .. extn .. "-head"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop] = args[prefix .. extn .. "-head"] end if args[prefix .. extn .. "-gloss"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop .. "-gloss"] = args[prefix .. extn .. "-gloss"] end end if formprops.verb then -- If a verb form specified, also turn on vn (unless form I, with -- unpredictable vn) and ap, and maybe pp, according to form, -- weakness and past vowel. But don't turn these on if there's -- an explicit on/off specification for them (e.g. I-pp=-). if form ~= "I" and formprops.vn == nil then formprops.vn = true end if formprops.ap == nil then formprops.ap = true end local weakness = weakness_from_radicals(form, split_root[1], split_root[2], split_root[3], split_root[4]) if formprops.pp == nil and not vform_probably_no_passive(form, weakness, rsplit(formprops.pv or "", ","), {}) then formprops.pp = true end if formprops.verb == true or formprops.vn == true or formprops.ap == true or formprops.pp == true then formprops.need_autogen = true end table.insert(formpropslist, formprops) index = index + 1 else break end end table.insert(verb_properties, {form, formpropslist}) end -- Go through and create the verb form derivations as necessary, when they haven't been explicitly given. for _, vplist in ipairs(verb_properties) do local vform = vplist[1] for _, props in ipairs(vplist[2]) do if props.need_autogen then local form_with_vowels if vform == "I" then local pv = props.pv if not pv then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak form_with_vowels = "I/a~u" elseif split_root[3] == Y then form_with_vowels = "I/a~i" elseif split_root[2] == W then --hollow form_with_vowels = "I/u~u" elseif split_root[2] == Y then form_with_vowels = "I/i~i" else -- most common; doesn't matter so much since we're not displaying the non-past form_with_vowels = "I/a~u" end else local pvs = rsplit(pv, ",") local vowel_sufs = {} for _, pv in ipairs(pvs) do local vowel_spec if pv == "a" then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak vowel_spec = "a~u" elseif split_root[3] == Y then vowel_spec = "a~i" elseif split_root[2] == W then --hollow vowel_spec = "a~u" elseif split_root[2] == Y then vowel_spec = "a~i" else -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "a~u" end elseif pv == "i" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "i~a" elseif pv == "u" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "u~u" else error(("Internal error: Bad past vowel '%s' in {{ar-verb forms}}"):format(pv)) end table.insert(vowel_sufs, vowel_spec) end form_with_vowels = "I/" .. table.concat(vowel_sufs, "/") end else form_with_vowels = vform end local angle_bracket_spec = ("%s<%s.pass>"):format(combined_root, form_with_vowels) local alternant_multiword_spec = export.do_generate_forms({angle_bracket_spec}, "ar-verb forms") local function format_forms(forms) if not forms then return "-" -- FIXME: Throw an error? end local formatted = {} for _, form in ipairs(forms) do if form.translit then table.insert(formatted, ("%s//%s"):format(form.form, form.translit)) else table.insert(formatted, form.form) end end return table.concat(formatted, "،") end if props.verb == true then props.verb = format_forms(alternant_multiword_spec.forms.past_3ms) end for _, deriv in ipairs({"vn", "ap", "pp"}) do if props[deriv] == true then props[deriv] = format_forms(alternant_multiword_spec.forms[deriv]) end end end end end -- Go through and output the result local formtextarr = {} for _, vplist in ipairs(verb_properties) do local form = vplist[1] for _, props in ipairs(vplist[2]) do local textarr = {} if props.verb then local text = "* '''[[Appendix:Arabic verbs#Form " .. form .. "|Form " .. form .. "]]''': " local linktext = {} local splitheads = rsplit(props.verb, "[,،]") for _, head in ipairs(splitheads) do table.insert(linktext, m_links.full_link({lang = lang, term = head, gloss = props["verb-gloss"]})) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) for _, derivengl in ipairs({{"vn", "Verbal noun"}, {"ap", "Active participle"}, {"pp", "Passive participle"}}) do local deriv = derivengl[1] local engl = derivengl[2] if props[deriv] then local text = "** " .. engl .. ": " local linktext = {} local splitheads = rsplit(props[deriv], "[,،]") for _, head in ipairs(splitheads) do local ar, translit = head:match("^(.*)//(.-)$") if not ar then ar = head end table.insert(linktext, m_links.full_link {lang = lang, term = ar, tr = translit, gloss = props[deriv .. "-gloss"]} ) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) end end table.insert(formtextarr, table.concat(textarr, "\n")) end end end return table.concat(formtextarr, "\n") end -- Infer radicals from lemma headword (i.e. 3rd masculine singular past) and verb form (I, II, etc.). Throw an error if -- headword is malformed. A given returned radical may be actually be a list of possible radicals, where the first one -- should be used if the user didn't explicitly give the radical. If the list contains a field `ambig = true`, the -- radical is considered ambiguous and should not be categorized. `is_reduced` indicates that the user specified -- `.reduced` to indicate that the verb form is reduced by assimilation and/or haplology (typically archaic Koranic -- forms such as اِدَّارَأَ instead of تَدَارَأَ; or اِسْطَاعَ instead of اِسْتِطَاعَ; etc. function export.infer_radicals(data) local headword, vform, passive, past_vowel, nonpast_vowel, is_reduced = data.headword, data.vform, data.passive, data.past_vowel, data.nonpast_vowel, data.is_reduced past_vowel = past_vowel or "-" nonpast_vowel = nonpast_vowel or "-" local function verify_vowel(vowel, param) --W: A past/non-past vowel may legitimately be a form object {form=..., footnotes=...} -- when the user attaches a footnote, e.g. <I/a[نادر]~u>, so compare the formval. -- Comparing the raw value crashed on Lua 5.1 ("bad argument #2 to 'format'"). local formval = rget(vowel) if formval ~= A and formval ~= I and formval ~= U and formval ~= "-" then error(("Internal error: Bad value for %s: %s (should be Arabic diacritic vowel or '-')"):format( param, dump(vowel))) end end verify_vowel(past_vowel, "past_vowel") verify_vowel(nonpast_vowel, "nonpast_vowel") local ch = {} local form_viii_assim, variant -- sub out alif-madda for easier processing headword = rsub(headword, AMAD, HAMZA .. ALIF) local function infer_err(msg, noann) local anns = {} local nohead, novform if noann == "nohead" then nohead = true elseif noann == "novform" then novform = true elseif noann == "nohead-vform" then nohead = true novform = true elseif noann then error(("Internal error: Unrecognized value for 'noann': %s"):format(dump(noann))) end if not nohead then table.insert(anns, ("headword=%s"):format(data.headword)) end if not novform then table.insert(anns, ("verb form=%s"):format(data.vform)) end anns = table.concat(anns, "، ") if anns ~= "" then anns = ": " .. anns end error(msg .. anns) end local len = ulen(headword) local expected_length -- extract the headword letters into an array for i = 1, len do table.insert(ch, usub(headword, i, i)) end -- check that the letter at the given index is the given string, or -- is one of the members of the given array local function check(index, must) local letter = ch[index] if type(must) == "string" then if not letter then infer_err("Letter " .. index .. " is nil") end if letter ~= must then infer_err(("For verb form %s, letter %s must be %s, not %s"):format(vform, index, must, letter), "novform") end elseif not m_table.contains(must, letter) then infer_err("For verb form " .. vform .. ", radical " .. index .. " must be one of " .. table.concat(must, " ") .. ", not " .. letter, "novform") end end -- Check that length of headword is within [min, max] local function check_len(min, max) if min and len < min then infer_err(("Not enough letters for verb form %s, expected at least %s"):format(vform, min), "novform") end if max and len > max then infer_err(("Too many letters for verb form %s, expected at most %s"):format(vform, max), "novform") end end -- A form I verb beginning with w- keeps the w in the non-past unless the non-past vowel is a kasra or a -- lowered kasra; see form_i_w_assimilated(), which the radicals path uses too. This used to be spelt out -- here as "i~a or u~u", which missed a~u (وَجَلَ يَوْجُلُ). local function form_I_w_non_assimilated() return not form_i_w_assimilated(past_vowel, nonpast_vowel) end -- Convert radicals to canonical form (handle various hamza varieties and check for misplaced alif or alif maqṣūra; -- legitimate cases of these letters are handled above). local function convert(rad, index) if type(rad) == "table" then for i, r in ipairs(rad) do rad[i] = convert(r, index) end return rad elseif rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then return HAMZA elseif rad == AMAQ then infer_err("Radical " .. index .. " must not be alif maqṣūra") elseif rad == ALIF then infer_err("Radical " .. index .. " must not be alif") else return rad end end local quadlit = vform:find("q$") -- find first radical, start of second/third radicals, check for -- required letters local radstart, rad1, rad2, rad3, rad4 local weakness if vform == "I" or vform == "II" then rad1 = ch[1] radstart = 2 elseif vform == "III" then rad1 = ch[1] check(2, {ALIF, W}) -- W occurs in passive-only verbs radstart = 3 elseif vform == "IV" then -- this would be alif-madda but we replaced it with hamza-alif above. if ch[1] == HAMZA and ch[2] == ALIF then rad1 = HAMZA else check(1, HAMZA_ON_ALIF) rad1 = ch[2] end radstart = 3 elseif vform == "V" then check(1, is_reduced and ALIF or T) rad1 = ch[2] radstart = 3 elseif vform == "VI" then check(1, is_reduced and ALIF or T) if ch[2] == AMAD then rad1 = HAMZA radstart = 3 else rad1 = ch[2] check(3, {ALIF, W}) -- W occurs in passive-only verbs radstart = 4 end elseif vform == "VII" then check(1, ALIF) if is_reduced then check(2, M) rad1 = M radstart = 3 else check(2, N) rad1 = ch[3] radstart = 4 end elseif vform == "VIII" then check(1, ALIF) rad1 = ch[2] if rad1 == "د" then rad1 = {"د", "ذ"} -- not considered ambiguous since it's usually د radstart = 3 form_viii_assim = "دّ" elseif rad1 == "ظ" and ch[3] == "ط" and len >= 5 then -- [[اظطلم]], variant of [[اظلم]] radstart = 4 form_viii_assim = "ظْط" elseif rad1 == "ذ" and ch[3] == "د" and len >= 5 then -- [[اذدكر]], variant of [[اذكر]] radstart = 4 form_viii_assim = "ذْد" elseif rad1 == T or rad1 == "ث" or rad1 == "ذ" or rad1 == "ط" or rad1 == "ظ" then radstart = 3 form_viii_assim = rad1 .. SH elseif rad1 == "ز" then check(3, "د") radstart = 4 form_viii_assim = "زْد" elseif rad1 == "ص" or rad1 == "ض" then check(3, "ط") radstart = 4 form_viii_assim = rad1 .. SK .. "ط" else check(3, T) radstart = 4 rad1 = convert(rad1, 1) form_viii_assim = rad1 .. SK .. "ت" end if rad1 == T then -- Radical is ambiguous, might be ت or و or ي but doesn't affect conjugation. Note that there are no -- form-VIII verbs with initial radical ي given in Hans Wehr but Lane mentions at least: -- - (page 2973) اِتَّأَسَ, with assimilation of the ي to ت, from root ي ء س; -- - (page 2975) اِتَّبَسَ non-past يَتَّبِسُ and alternative اِيتَبَسَ non-past يَاتَبِسُ from the root ي ب س; -- - (page 2976) اِتَّسَرَ non-past يَتَّسِرُ or alternatively يَأْتَسِرُ with hamza preserved from the root ي س ر. -- These alternative forms seem very rare and probably not worth worrying about, but if we want to handle -- them, we can do it when the time comes. rad1 = {T, W, Y, ambig = true} -- اِتَّخَذَ irregularly has hamza as the radical but assimilates like و if ch[3] == "خ" and ch[4] == "ذ" then rad1[4] = HAMZA end end elseif vform == "IX" then check(1, ALIF) rad1 = ch[2] radstart = 3 elseif vform == "X" then check(1, ALIF) check(2, S) if is_reduced then rad1 = ch[3] radstart = 4 else check(3, T) rad1 = ch[4] radstart = 5 end elseif vform == "Iq" then rad1 = ch[1] rad2 = ch[2] radstart = 3 elseif vform == "IIq" then check(1, T) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "IIIq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) radstart = 5 elseif vform == "IVq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "XI" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, ALIF) rad3 = ch[5] weakness = "sound" elseif vform == "XII" then check(1, ALIF) rad1 = ch[2] if ch[3] ~= ch[5] then infer_err("For verb form XII, letters 3 and 5 should be the same", "novform") end check(4, W) radstart = 5 elseif vform == "XIII" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, W) rad3 = ch[5] if rad3 == AMAQ then weakness = "final-weak" else weakness = "sound" end elseif vform == "XIV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if ch[6] == AMAQ then check_waw_ya(rad3) weakness = "final-weak" else if ch[5] ~= ch[6] then infer_err("For verb form XIV, letters 5 and 6 should be the same", "novform") end weakness = "sound" end elseif vform == "XV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if rad3 == Y then check(6, ALIF) else check(6, AMAQ) end weakness = "sound" else error("Internal error: Unrecognized verb form " .. vform) end -- Process the last two radicals. RADSTART is the index of the first of the two. If it's nil then all radicals have -- already been processed above, and we don't do anything. if radstart then -- There must (normally) be one or two letters left. if len == radstart then if vform == "I" and ch[len] == Y then -- short form حَيَّ weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" elseif vform == "IV" and rad1 == "ر" and ch[len] == AMAQ then -- irregular verb أَرَى weakness = "final-weak" rad2 = HAMZA rad3 = Y elseif vform == "X" and rad1 == "ح" and ch[len] == AMAQ then -- irregular verb اِسْتَحَى weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" else -- If one letter left, then it's a geminate verb. If the letter is alif or alif maqṣūra, it will trigger -- an error down the line. if vform_supports_geminate(vform) then weakness = "geminate" rad2 = ch[len] rad3 = ch[len] if vform == "III" or vform == "VI" then variant = "short" end else infer_err("Apparent geminate verb, but geminate verbs not allowed for this verb form") end end elseif quadlit then -- Process last two radicals of a quadriliteral verb form. rad3 = ch[radstart] rad4 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if rad4 == AMAQ or rad4 == ALIF and rad3 == Y or rad4 == Y then -- rad4 can be Y in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws in a row); it could be wāw or -- yāʾ, but doesn't affect the conjugation. rad4 = rad3 == W and {Y, W, ambig = true} or {W, Y, ambig = true} else infer_err("Last radical is " .. rad4 .. " but verb form " .. vform .. " doesn't support final-weak verbs", "novform") end else weakness = "sound" end else -- Process last two radicals of a triliteral verb form. rad2 = ch[radstart] rad3 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if vform == "I" and (is_waw_ya(rad3) or rad3 == ALIF or rad3 == AMAQ) then local inferred_past_vowel, inferred_nonpast_vowel -- Check for final-weak form I verb. It can end in tall alif (rad3 = wāw) or alif maqṣūra (rad3 = yāʾ) -- or a wāw or yāʾ (with a past vowel of i or u, e.g. nasiya/yansā "forget" or with a passive-only -- verb). if rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated+final-weak" else weakness = "final-weak" end if rad3 == ALIF then rad3 = W inferred_past_vowel = A inferred_nonpast_vowel = U if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not tall alif (ا)", "novform") end elseif rad3 == AMAQ then rad3 = Y inferred_past_vowel = A inferred_nonpast_vowel = I if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not alif maqṣūra (ى)", "novform") end elseif rad1 == "ح" and rad2 == Y and rad3 == Y then -- Long variant حَيِيَ. inferred_past_vowel = I inferred_nonpast_vowel = A variant = "long" else if not is_passive_only(passive) then -- does a non-passive final-weak verb in -uwa ever happen? (YES: e.g. [[رجو]] "to be slack") inferred_past_vowel = rad3 == Y and I or U inferred_nonpast_vowel = A end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} -- ambiguous end if inferred_past_vowel then local raw_past_vowel = rget(past_vowel) local raw_nonpast_vowel = rget(nonpast_vowel) if raw_past_vowel ~= "-" then if raw_past_vowel ~= inferred_past_vowel then infer_err(("Final-weak form-I verb inferred past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_past_vowel], undia[raw_past_vowel]), "novform") else -- in case of footnote in past_vowel inferred_past_vowel = past_vowel end end if raw_nonpast_vowel ~= "-" and raw_nonpast_vowel ~= A and inferred_nonpast_vowel == U then -- if inferred as I or A, the reality can be the reverse; form-I final-weak verbs with a~a and -- i~i exist, e.g. سَعَى/يَسْعَى, وَلِيَ/يَلِي. Weird verb [[صها]] (also written [[صهى]]) has non-past -- يصهى so we can't throw an error in this situation. if raw_nonpast_vowel ~= inferred_nonpast_vowel then infer_err(("Final-weak form-I verb inferred non-past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_nonpast_vowel], undia[raw_nonpast_vowel]), "novform") else -- in case of footnote in nonpast_vowel inferred_nonpast_vowel = nonpast_vowel end end end if not is_passive_only(passive) then if rget(past_vowel) == "-" then past_vowel = inferred_past_vowel end if rget(nonpast_vowel) == "-" then nonpast_vowel = inferred_nonpast_vowel end end elseif vform == "IX" and is_waw_ya(rad3) and len == radstart + 2 and ch[len] == AMAQ then -- Final-weak form IX verbs like اِرْعَوَى "to desist, to repent, to see the light". weakness = "final-weak" expected_length = radstart + 2 elseif vform == "X" and rad1 == "ح" and rad2 == Y and rad3 == ALIF then -- Long variant اِسْتَحْيَا. weakness = "final-weak" rad3 = Y variant = "long" elseif rad3 == AMAQ or rad2 == Y and rad3 == ALIF or rad3 == Y then -- rad3 == Y happens in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" else infer_err("Last radical is " .. rad3 .. " but verb form doesn't support final-weak verbs") end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} elseif rad2 == ALIF then if vform_supports_hollow(vform) then weakness = "hollow" local function set_past_to_a() if req(past_vowel, A) then -- already set elseif req(past_vowel, "-") or req(past_vowel, rget(nonpast_vowel)) then past_vowel = A else infer_err(("Form I hollow verb with nonpast vowel set to '%s' must have past vowel set to 'a' or the same value, not %s"): format(undia[rget(nonpast_vowel)], undia[rget(past_vowel)]), "novform") end end if vform == "I" and req(nonpast_vowel, U) then rad2 = W set_past_to_a() elseif vform == "I" and req(nonpast_vowel, I) then rad2 = Y set_past_to_a() else if req(nonpast_vowel, A) and not req(past_vowel, I) then infer_err(("Form I hollow verb with nonpast vowel set to 'a' must have past vowel set to 'i', not %s"): format(undia[rget(past_vowel)]), "novform") end -- Ambiguous radical; could be wāw or yāʾ; if verb form I, it's critical to get this right, and -- the caller checks for this situation and throws an error if non-past vowel is "a" and second -- radical isn't explicitly given. rad2 = {W, Y, ambig = true, need_radical = true} end else infer_err("Second radical is alif but verb form doesn't support hollow verbs") end elseif vform == "I" and rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated" elseif rad2 == rad3 and (vform == "III" or vform == "VI") then weakness = "geminate" variant = "long" else weakness = "sound" end end if expected_length then check_len(expected_length, expected_length) end end rad1 = convert(rad1, 1) rad2 = convert(rad2, 2) rad3 = convert(rad3, 3) rad4 = convert(rad4, 4) if not weakness then error("Internal error: Returned weakness from infer_radicals() is nil") end return { weakness = weakness, rad1 = rad1, rad2 = rad2, rad3 = rad3, rad4 = rad4, past_vowel = past_vowel, nonpast_vowel = nonpast_vowel, form_viii_assim = form_viii_assim, variant = variant, } end -- bot interface to infer_radicals() function export.infer_radicals_json(frame) local iparams = { headword = {}, vform = {}, passive = {}, past_vowel = {}, nonpast_vowel = {}, is_reduced = {type = "boolean"}, } local iargs = require("Module:parameters").process(frame.args, iparams) return require("Module:JSON").toJSON(export.infer_radicals(iargs)) end -- Infer vocalization from participle headword (active or passive), verb form (I, II, etc.) and whether the headword is -- active or passive. Throw an error if headword is malformed. Returned radicals may contain Latin letters "t", "w" or "y" -- indicating ambiguous radicals guessed to be tāʾ, wāw or yāʾ respectively. function export.infer_participle_vocalization(headword, vform, weakness, is_active) local chars = {} local orig_headword = headword -- Sub out alif-madda for easier processing. headword = rsub(headword, AMAD, HAMZA .. ALIF) local len = ulen(headword) -- Extract the headword letters into an array. for i = 1, len do table.insert(chars, usub(headword, i, i)) end local function form_intro_error_msg() return ("For verb form %s %s%s participle %s, "):format(vform, orig_headword ~= headword and "normalized " or "", is_active and "active" or "passive", headword) end local function err(msg) error(form_intro_error_msg() .. msg, 1) end -- Check that length of headword is within [min, max]. local function check_len(min, max) if min and len < min then err(("expected at least %s letters but saw %s"):format(min, len)) elseif max and len > max then err(("expected at most %s letters but saw %s"):format(max, len)) end end -- Get the character at `ind`, making sure it exists. local function c(ind) check_len(ind) return chars[ind] end -- Check that the letter at the given index is the given string, or is one of the members of the given array local function check(index, must) local letter = chars[index] local function make_possible_values() if type(must) == "string" then return must else return list_to_text(must, nil, " or ") end end if not letter then err(("expected a letter (specifically %s) at position %s, but participle is too short"):format( make_possible_values(), index)) end local matches if type(must) == "string" then matches = letter == must else matches = m_table.contains(must, letter) end if not matches then err(("letter %s at index %s must be %s"):format(letter, index, make_possible_values())) end end local function check_weakness(values, allow_missing, invert_condition) local function make_possible_weaknesses() for i, val in ipairs(values) do values[i] = "'" .. val .. "'" end return list_to_text(values, nil, " or ") end if allow_missing and invert_condition then error("Internal error: Can't specify both allow_missing and invert_condition") end if not weakness then if allow_missing or invert_condition then return else err(("weakness is unspecified but must be %s"):format(make_possible_weaknesses())) end else local matches = m_table.contains(values, weakness) if invert_condition and matches then err(("weakness '%s' must not be %s"):format(weakness, make_possible_weaknesses())) elseif not invert_condition and not matches then err(("weakness '%s' must be %s"):format(weakness, make_possible_weaknesses())) end end end local vocalized local function handle_possibly_final_weak(sound_prefix, expected_length) check_len(expected_length, expected_length) if c(expected_length) == AMAQ then -- passive final-weak if is_active then err("participle in -ِى only allowed for passive participles") end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. AN .. AMAQ else -- all others behave as if sound check_weakness({"final-weak", "assimilated+final-weak"}, nil, "invert condition") vocalized = sound_prefix .. (is_active and I or A) .. c(expected_length) end end if not (vform == "I" and is_active) then -- all participles except verb form I active begin in م-. check(1, M) end if vform == "I" then if is_active then check(2, ALIF) local sound_prefix = c(1) .. AA .. c(3) if len == 3 then if c(3) == HAMZA then -- Either hollow with hamzated third radical, e.g. [[شاء]] active participle 'شَاءٍ', or final-weak -- with hamzated second radical, e.g. [[رأى]] active participle 'رَاءٍ'. Theoretically (?), also -- geminate with hamzated second/third radical, but I don't know if any such verbs exist. if weakness == "geminate" then vocalized = sound_prefix .. SH else check_weakness({"hollow", "final-weak"}, "allow missing") vocalized = sound_prefix .. IN end else check_weakness({"final-weak", "geminate"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end end else check_len(4, 4) -- we will convert back to alif maqṣūra below as needed vocalized = sound_prefix .. I .. c(4) end else -- assimilated verbs: regular, e.g. مَوْزُون "weighed" -- geminate verbs: regular, e.g. مَبْلُول "moistened" -- third-hamzated verbs: مَبْرُوء -- hollow verbs: مَقُود "led, driven"; مَزِيد "added, increased" -- hollow first-hamzated verbs: مَئِيض "returned, reverted"; مَأْيُوس "despaired" (NOTE: formation is sound); -- مَأُود or مَؤُود "bent; depleted" -- hollow third-hamzated verbs: مَشِيء "willed, intended", مَضُوء "glittered?" -- final-weak: مَلْقِيّ "found, encountered"; مَصْغُوّ "inclined" -- hollow + final-weak: مَشْوِيّ "fried, grilled", مَهْوِيّ "loved" -- first-hamzated + hollow + final-weak: مَأْوِيّ "received hospitably" local sound_prefix = MA .. c(2) .. SK .. c(3) if len == 5 then -- sound, assimilated or geminate check(4, W) vocalized = sound_prefix .. UU .. c(5) else check_len(4, 4) if c(4) == W then -- final-weak third-wāw vocalized = sound_prefix .. U .. W .. SH elseif c(4) == Y then -- final-weak third-yāʾ vocalized = sound_prefix .. I .. Y .. SH else -- hollow check(3, {W, Y}) if c(3) == W then vocalized = MA .. c(2) .. UU .. c(4) else vocalized = MA .. c(2) .. II .. c(4) end end end end elseif vform == "II" or vform == "V" or vform == "XII" or vform == "XIII" or vform == "Iq" or vform == "IIq" or vform == "IIIq" then local sound_prefix, expected_length if vform == "II" then sound_prefix = MU .. c(2) .. A .. c(3) .. SH expected_length = 4 elseif vform == "V" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SH expected_length = 5 elseif vform == "XII" then -- e.g. [[احدودب]] "to be or become convex or humpbacked", مُحْدَوْدِب (active); -- [[اثنونى]] "to be bent; to be doubled up", مُثْنَوْنٍ (active) check(4, W) if c(3) ~= c(5) then err(("third letter %s should be the same as the fifth letter %s"):format(c(3), c(5))) end sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SK .. c(5) expected_length = 6 elseif vform == "XIII" then -- e.g. [[اخروط]] "to get entangled; to extend", مُخْرَوِّط (active), مُخْرَوَّط (passive) check(4, W) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SH expected_length = 5 elseif vform == "Iq" then sound_prefix = MU .. c(2) .. A .. c(3) .. SK .. c(4) expected_length = 5 elseif vform == "IIq" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SK .. c(5) expected_length = 6 elseif vform == "IIIq" then -- e.g. [[اخرنطم]] "to be proud and angry" check(4, T) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. N .. SK .. c(5) expected_length = 6 else error("Internal error: Unhandled verb form " .. vform) end if len == expected_length - 1 then -- active final-weak if not is_active then err(("length-%s participle only allowed for active participles"):format(len)) end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. IN else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "III" or vform == "VI" then local sound_prefix, expected_length if vform == "VI" then check(2, T) check(4, ALIF) sound_prefix = MU .. T .. A .. c(3) .. AA .. c(5) expected_length = 6 else sound_prefix = MU .. c(2) .. AA .. c(4) expected_length = 5 end if len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. SH end else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "IV" or vform == "X" then -- form IV: -- sound: مُرْسِخ (active, "entrenching"), مُرْسَخ (passive, "entrenched") -- first-hamzated (like sound): مُؤْيِس (active, "causing to despair"), مُؤْيَس (passive, "caused to despair") -- final-weak: مُكْرٍ (active, "renting out"), مُكْرًى (passive, "rented out") -- assimilated: مُورِد (active, "transferring"), مُورَد (passive, "transferred"); same when first-Y, e.g. -- أَيْقَنَ "to be certain of": مُوقِن (active), مُوقَن (passive) -- assimilated + final-weak: مُورٍ (active, "setting fire, kindling"), مُورًى (passive, "set fire, kindled") -- geminate: مُمِدّ (active, "granting, helping"), مُمَدّ (passive, "granted, helped") -- hollow: مُزِيل (active, "eliminating"), مُزَال (passive, "eliminated") -- hollow + final-weak: مُعْيٍ (active, "tiring"), مُعْيًى (passive, "tired") local sound_prefix, expected_length if vform == "X" then check(2, S) check(3, T) sound_prefix = MU .. S .. SK .. T .. A .. c(4) expected_length = 6 else sound_prefix = MU .. c(2) expected_length = 4 end if len == expected_length and c(len - 1) == Y and c(len) ~= AMAQ then -- active hollow if not is_active then err("this shape only allowed for active participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. II .. c(len) elseif len == expected_length and c(len - 1) == ALIF then -- passive hollow if is_active then err("this shape only allowed for passive participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(len) elseif len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. I .. c(len) .. SH elseif vform == "IV" and c(2) == W then -- assimilated final-weak vocalized = sound_prefix .. c(len) .. IN else vocalized = sound_prefix .. SK .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else if vform == "IV" and c(2) == W then -- assimilated, possibly final-weak sound_prefix = sound_prefix .. c(expected_length - 1) else sound_prefix = sound_prefix .. SK .. c(expected_length - 1) end handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "VII" or vform == "VIII" then -- form VII (passive participles are fairly rare but do exist): -- sound: مُنْكَتِب (active "subscribing"), مُنْكَتَب (passive "subscribed") -- geminate: مُنْضَمّ (both active "joining, containing" and passive "joined, contained") -- final-weak: مُنْطَلٍ (active "fooling (someone)"), مُنْطَلًى (passive "fooled") -- final-weak with medial wāw: مُنْطَوٍ (active "involving"), مُنْطَوًى (passive "involved") -- hollow: مُنْقَاد (both active "complying with" and passive "complied with") -- -- for form VIII, the same variants exist but things are complicated by assimilations involving the template T. -- sound third-hamzated no assimilation: مُبْتَدِئ (active "beginning"), مُبْتَدَأ (passive "begun") -- geminate no assimilation: مُبْتَزّ (both active "robbing" and passive "robbed") -- final-weak no assimilation: مُبْتَنٍ (active "building"), مُبْتَنًى (passive "built") -- final-weak with medial wāw no assimilation: مُحْتَوٍ (active "containing"), مُحْتَوًى (passive "contained") -- hollow no assimilation: مُخْتَار (both active "choosing" and passive "chosen") -- -- sound with total assimilation: مُتَّبِع (active "following"), مُتَّبَع (passive "followed") -- sound with total assimilation, assimilating wāw: مُتَّعِد (active "threatening"), مُتَّعَد (passive "threatened") -- sound with total assimilation, irregularly assimilating hamza: مُتَّخِذ (active "taking"), مُتَّخَذ (passive "taken") -- sound with total assimilation (to ḏāl, producing dāl): مُدَّخِر (active "reserving"), مُدَّخَر (passive "reserved") -- sound with total assimilation (to ḏāl): مُذَّكِر (active "remembering"), مُذَّكَر (passive "remembered") -- sound with total assimilation (to ṭāʔ): مُطَّرِح (active "discarding"), مُطَّرَح (passive "discarded") -- sound with total assimilation (to ẓāʔ): مُظَّلِم (active "tolerating"), مُظَّلَم (passive "tolerated") -- final-weak with total assimilation, assimilating wāw: مُتَّقٍ (active "guarding against"), مُتَّقًى (passive "guarded against") -- final-weak with total assimilation (to ṯāʔ): مُثَّنٍ (active "undulating"), مُثَّنًى (passive "undulated") -- final-weak with total assimilation (to dāl): مُدَّعٍ (active "claiming"), مُدَّعًى (passive "claimed") -- sound with partial assimilation (to zayn): مُزْدَهِر (active "thriving"), مُزْدَهَر (passive "thrived") -- sound with medial wāw with partial assimilation (to zayn): مُزْدَوِج (active "appearing twice") -- sound with partial assimilation (to ṣād): مُصْطَبِح (active "illuminating"), مُصْطَبَح (passive, "illuminated") -- sound with partial assimilation (to ḍād): مُضْطَرِب (active "to be disturbed"; no passive) -- geminate with partial assimilation (to ṣād): مُصْطَبّ (both active "effusing" and passive "effused") -- geminate with partial assimilation (to ḍād): مُضْطَرّ (both active "forcing" and passive "forced") -- final-weak with partial assimilation (to ṣād): مُصْطَلٍ (active "warming"), مُصْطَلًى (passive "warmed") -- hollow with partial assimilation (to zayn): مُزْدَاد (both active "increasing" and passive "increased") -- hollow with partial assimilation (to ṣad): مُصْطَاد (both active "hunting" and passive "hunted") local sound_prefix, sufind if vform == "VII" then check(2, N) sound_prefix = MU .. N .. SK .. c(3) sufind = 4 else local c2 = c(2) if c2 == T or c2 == "د" or c2 == "ث" or c2 == "ذ" or c2 == "ط" or c2 == "ظ" then -- full assimilation sound_prefix = MU .. c2 .. SH sufind = 3 else -- partial or no assimilation if c2 == "ز" then check(3, "د") elseif c2 == "ص" or c2 == "ض" then check(3, "ط") else check(3, T) end sound_prefix = MU .. c2 .. SK .. c(3) sufind = 4 end end if c(sufind) == ALIF then -- hollow, active or passive check_len(sufind + 1, sufind + 1) check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(sufind + 1) elseif len == sufind then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. A .. c(len) .. SH else vocalized = sound_prefix .. A .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else sound_prefix = sound_prefix .. A .. c(sufind) handle_possibly_final_weak(sound_prefix, sufind + 1) end elseif vform == "IX" then check_len(4, 4) vocalized = MU .. c(2) .. SK .. c(3) .. A .. c(4) .. SH elseif vform == "IVq" then -- e.g. [[اذلعب]] "to scamper away", مُذْلَعِبّ (active), مُذْلَعَبّ (passive); -- [[اطمأن]] "to remain quietly; to be certain", مُطْمَئِنّ (active), مُطْمَأَنّ (passive) check_len(5, 5) local sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. c(4) if is_active then vocalized = sound_prefix .. I .. c(5) .. SH else vocalized = sound_prefix .. A .. c(5) .. SH end elseif vform == "XI" then check_len(5, 5) check(4, ALIF) vocalized = MU .. c(2) .. SK .. c(3) .. AA .. c(5) .. SH -- e.g. [[احمار]] "to turn red, to blush", مُحْمَارّ (active) elseif vform == "XIV" or vform == "XV" then -- FIXME: Implement. No examples in Wiktionary currently; need to look up in a grammar. error("Support for verb form " .. vform .. " not implemented yet") else error("Don't recognize verb form " .. vform) end vocalized = rsub(vocalized, HAMZA .. AA, AMAD) local reconstructed_headword = lang:makeEntryName(vocalized) if reconstructed_headword ~= orig_headword then error(("Internal error: Vocalized participle %s doesn't match original participle %s"):format( vocalized, orig_headword)) end -- Apply NFC-style normalization to match MediaWiki's automatic normalization return apply_nfc_shadda(vocalized) end function export.infer_participle_vocalization_json(frame) local iparams = { [1] = {required = true}, [2] = {required = true}, ["weakness"] = {}, ["passive"] = {type = "boolean"} } local iargs = require("Module:parameters").process(frame.args, iparams) return export.infer_participle_vocalization(iargs[1], iargs[2], iargs.weakness, not iargs.passive) end return export ajba0ryqad6iraky5rppbc0v3j61s6n 1099186 1099159 2026-08-22T18:58:54Z ForzaGreen 28665 مزامنة من مستودع GitHub: عدم قلب واو المثال ياءً في الأمر (اِوْنَ)، وحصر إبقاء اللام الواوية في سَهُوَ 1099186 Scribunto text/plain local export = {} --[=[ This module implements {{ar-conj}} and provides the underlying conjugation functions for {{ar-verb}} (whose actual formatting is done in [[Module:ar-headword]]). Author: User:Benwing, from an early version (2013-2014) by User:Atitarev, User:ZxxZxxZ. ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "past_1s" (past tense first-person singular), "juss_pass_3fp" (non-past jussive passive third-person feminine plural) "ap" (active participle). Each slot is filled with zero or more forms. -- "form" = The conjugated Arabic form representing the value of a given slot. -- "lemma" = The dictionary form of a given Arabic term. For Arabic, normally the third person masculine singular past, although other forms may be used if this form is missing (e.g. in passive-only verbs or verbs lacking the past). ]=] --[=[ FIXME: 1. Finish unimplemented conjugation types. Only IX-final-weak left (extremely rare, possibly only one verb اِعْمَايَ (according to Haywood and Nahmad p. 244, who are very specific about the irregular occurrence of alif + yā instead of expected اِعْمَيَّ with doubled yā). Not in Hans Wehr. NOTE: Not true about this, cf. form IX اِرْعَوَى "to desist, to repent, to see the light". Also note form XII اِخْضَوْضَرَ = form IX اِخْضَرَّ "to be or become green". [DONE except for اِعْمَايَ] 2. Implement irregular verbs as special cases and recognize them, e.g. -- laysa "to not be"; only exists in the past tense, no non-past, no imperative, no participles, no passive, no verbal noun. Irregular alternation las-/lays-. [IMPLEMENTABLE USING OVERRIDES] -- istaḥā yastaḥī "be ashamed of" -- this is complex according to Hans Wehr because there are two verbs, regular istaḥyā yastaḥyī "to spare (someone)'s life" and irregular istaḥyā yastaḥyī "to be ashamed to face (someone)", which is irregular because it has the alternate irregular form istaḥā yastaḥī which only applies to this meaning. Currently we follow Haywood and Nahmad in saying that both varieties can be spelled istaḥyā/istaḥā/istaḥḥā, but we should instead use a variant= param similar to حَيَّ to distinguish the two possibilities, and maybe not include istaḥḥā. -- ʿayya/ʿayiya yaʿayyu/yaʿyā "to not find the right way, be incapable of, stammer, falter, fall ill". This appears to be a mixture of a geminate and final-weak verb. Unclear what the whole paradigm looks like. Do the consonant-ending parts in the past follow the final-weak paradigm? Is it the same in the non-past? Or can you conjugate the non-past fully as either geminate or final-weak? -- اِنْمَحَى inmaḥā or يمَّحَى immaḥā "to be effaced, obliterated; to disappear, vanish" has irregular assimilation of inm- to imm- as an alternative. inmalasa "to become smooth; to glide; to slip away; to escape" also has immalasa as an alternative. The only other form VII verbs in Hans Wehr beginning with -m- are inmalaḵa "to be pulled out, torn out, wrenched" and inmāʿa "to be melted, to melt, to dissolve", which are not listed with imm- alternatives, but might have them; if so, we should handle this generally. [DONE] -- يَرَعَ yaraʕa yariʕu "to be a coward, to be chickenhearted" as an alternative form of يَرِعَ yariʕa yayraʕu (as given in Wehr). [IMPLEMENTABLE USING OVERRIDES] 3. Implement individual override parameters for each paradigm part. See Module:fro-verb for an example of how to do this generally. Note that {{temp|ar-conj-I}} and other of the older templates already had such individual override params. [DONE] Irregular verbs already implemented: -- [ḥayya/ḥayiya yaḥyā "live" -- behaves like a normal final-weak verb (e.g. past first singular ḥayītu) except in the past-tense parts with vowel-initial endings (all the third person except for the third feminine plural). The normal singular and dual endings have -yiya- in them, which compresses to -yya-, with the normal endings the less preferred ones. In masculine third plural, expected ḥayū is replaced by ḥayyū by analogy to the -yy- parts, and the regular form is not given as an alternant in John Mace. Barron's 201 verbs appears to have the regular ḥayū as the part, however. Note also that final -yā appears with tall alif. This appears to be a spelling convention of Arabic, also applying in ḥayyā (form II, "to keep (someone) alive") and 'aḥyā (form IV, "to animate, revive, give birth to, give new life to").] -- implemented -- [ittaxadha yattaxidhu "take"] -- implemented -- [sa'ala yas'alu "ask" with alternative jussive/imperative yasal/sal] -- implemented -- [ra'ā yarā "see"] -- implemented -- ['arā yurī "show"] -- implemented -- ['akala ya'kulu "eat" with imperative kul] -- implemented -- ['axadha ya'xudhu "take" with imperative xudh] -- implemented -- ['amara ya'muru "order" with imperative mur] -- implemented --]=] local force_cat = false -- set to true for debugging -- if true, always maintain manual translit during processing, and compare against full translit at the end local debug_translit = false local lang = require("Module:languages").getByCode("ar") local m_links = require("Module:links") local m_string_utilities = require("Module:string utilities") local m_table = require("Module:table") local ar_utilities = require("Module:ar-utilities") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local list_to_text = mw.text.listToText local rfind = m_string_utilities.find local rsubn = m_string_utilities.gsub local rmatch = m_string_utilities.match local rsplit = m_string_utilities.split local usub = m_string_utilities.sub local ulen = m_string_utilities.len local u = m_string_utilities.char local unpack = unpack or table.unpack -- Lua 5.2 compatibility local dump = mw.dumpObject -- Within this module, conjugations are the functions that do the actual -- conjugating by creating the parts of a basic verb. -- They are defined further down. local conjugations = {} -- hamza variants local HAMZA = u(0x0621) -- hamza on the line (stand-alone hamza) = ء local HAMZA_ON_ALIF = u(0x0623) local HAMZA_ON_W = u(0x0624) local HAMZA_UNDER_ALIF = u(0x0625) local HAMZA_ON_Y = u(0x0626) local HAMZA_ANY = "[" .. HAMZA .. HAMZA_ON_ALIF .. HAMZA_UNDER_ALIF .. HAMZA_ON_W .. HAMZA_ON_Y .. "]" local HAMZA_PH = u(0xFFF0) -- hamza placeholder local BAD = u(0xFFF1) local BORDER = u(0xFFF2) local KEEP_W_PH = u(0xFFF3) -- retained-wāw placeholder; see postprocess_term() -- diacritics local A = u(0x064E) -- fatḥa local AN = u(0x064B) -- fatḥatān (fatḥa tanwīn) local U = u(0x064F) -- ḍamma local UN = u(0x064C) -- ḍammatān (ḍamma tanwīn) local I = u(0x0650) -- kasra local IN = u(0x064D) -- kasratān (kasra tanwīn) local SK = u(0x0652) -- sukūn = no vowel local SH = u(0x0651) -- šadda = gemination of consonants local DAGGER_ALIF = u(0x0670) local DIACRITIC_ANY_BUT_SH = "[" .. A .. I .. U .. AN .. IN .. UN .. SK .. DAGGER_ALIF .. "]" -- Pattern matching short vowels local AIU = "[" .. A .. I .. U .. "]" -- Pattern matching short vowels or sukūn local AIUSK = "[" .. A .. I .. U .. SK .. "]" -- Pattern matching any diacritics that may be on a consonant local DIACRITIC = SH .. "?" .. DIACRITIC_ANY_BUT_SH -- translit_patterns local vowels = "aeiouāēīōū" local NV = "[^" .. vowels .. "]" local dia = {a = A, i = I, u = U} local undia = {[A] = "a", [I] = "i", [U] = "u", ["-"] = "-"} -- various letters and signs local ALIF = u(0x0627) -- ʾalif = ا local AMAQ = u(0x0649) -- ʾalif maqṣūra = ى local AMAD = u(0x0622) -- ʾalif madda = آ local TAM = u(0x0629) -- tāʾ marbūṭa = ة local T = u(0x062A) -- tāʾ = ت local HYPHEN = u(0x0640) local N = u(0x0646) -- nūn = ن local W = u(0x0648) -- wāw = و local Y = u(0x064A) -- yāʾ = ي local S = "س" local M = "م" local LRM = u(0x200e) -- left-to-right mark -- common combinations local AH = A .. TAM local AT = A .. T local AA = A .. ALIF local AAMAQ = A .. AMAQ local AAH = AA .. TAM local AAT = AA .. T local II = I .. Y local UU = U .. W local AY = A .. Y local AW = A .. W local AYSK = AY .. SK local AWSK = AW .. SK local NA = N .. A local NI = N .. I local AAN = AA .. N local AANI = AA .. NI local AYNI = AYSK .. NI local AWNA = AWSK .. NA local AYNA = AYSK .. NA local AYAAT = AY .. AAT local UNU = "[" .. UN .. U .. "]" local MA = M .. A local MU = M .. U local TA = T .. A local TU = T .. U local _I = ALIF .. I local _U = ALIF .. U --W: Morphological pattern (الوزن الصرفي) to verb form mapping local MORPHOLOGICAL_PATTERN_TO_FORM = { ["فعَل يفعُل"] = "I/a~u", ["فعَل يفعِل"] = "I/a~i", ["فعَل يفعَل"] = "I/a~a", ["فعُل يفعُل"] = "I/u~u", ["فعِل يفعَل"] = "I/i~a", ["فعِل يفعِل"] = "I/i~i", ["فعّل"] = "II", ["فاعل"] = "III", ["أفعل"] = "IV", ["تفعّل"] = "V", ["تفاعل"] = "VI", ["انفعل"] = "VII", ["افتعل"] = "VIII", ["افعلّ"] = "IX", ["استفعل"] = "X", ["افعالّ"] = "XI", ["افعوعل"] = "XII", ["افعوّل"] = "XIII", ["فعلل"] = "Iq", ["تفعلل"] = "IIq", ["افعنلل"] = "IIIq", -- "XIV" should not be used ["افعللّ"] = "IVq", } --W: Create reverse mapping from form to morphological pattern local FORM_TO_MORPHOLOGICAL_PATTERN = {} for pattern, form in pairs(MORPHOLOGICAL_PATTERN_TO_FORM) do FORM_TO_MORPHOLOGICAL_PATTERN[form] = pattern end --W: local MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV = { ["فعَل يفعُل"] = "مُجرَّد", ["فعَل يفعِل"] = "مُجرَّد", ["فعَل يفعَل"] = "مُجرَّد", ["فعُل يفعُل"] = "مُجرَّد", ["فعِل يفعَل"] = "مُجرَّد", ["فعِل يفعِل"] = "مُجرَّد", ["فعّل"] = "مزيد بحرف", ["فاعل"] = "مزيد بحرف", ["أفعل"] = "مزيد بحرف", ["تفعّل"] = "مزيد بحرفين", ["تفاعل"] = "مزيد بحرفين", ["انفعل"] = "مزيد بحرفين", ["افتعل"] = "مزيد بحرفين", ["افعلّ"] = "مزيد بحرفين", ["استفعل"] = "مزيد بثلاثة أحرف", ["افعالّ"] = "مزيد بثلاثة أحرف", ["افعوعل"] = "مزيد بثلاثة أحرف", ["افعوّل"] = "مزيد بثلاثة أحرف", ["فعلل"] = "مُجرَّد", ["تفعلل"] = "مزيد بحرف", ["افعنلل"] = "مزيد بحرفين", ["افعللّ"] = "مزيد بحرفين", } local translit_cache = { -- hamza variants [HAMZA] = "ʔ", [HAMZA_ON_ALIF] = "ʔ", [HAMZA_ON_W] = "ʔ", [HAMZA_UNDER_ALIF] = "ʔ", [HAMZA_ON_Y] = "ʔ", [HAMZA_PH] = "ʔ", -- diacritics [A] = "a", [AN] = "an", [U] = "u", [UN] = "un", [I] = "i", [IN] = "in", [SK] = "", [SH] = "*", -- handled specially [DAGGER_ALIF] = "ā", -- various letters and signs [""] = "", [ALIF] = BAD, -- we should never be transliterating ALIF by itself, as its translit in isolation is ambiguous [AMAQ] = BAD, [AMAD] = "ʔā", [TAM] = "", [T] = "t", [N] = "n", [W] = "w", [Y] = "y", [S] = "s", [M] = "m", [LRM] = "", -- common combinations [AH] = "a", [AT] = "at", [AA] = "ā", [AAMAQ] = "ā", [AAH] = "āh", [AAT] = "āt", [II] = "ī", [UU] = "ū", [AY] = "ay", [AW] = "aw", [AYSK] = "ay", [AWSK] = "aw", [NA] = "na", [NI] = "ni", [AAN] = "ān", [AANI] = "āni", [AYNI] = "ayni", [AWNA] = "awna", [AYNA] = "ayna", [AYAAT] = "ayāt", [MA] = "ma", [MU] = "mu", [TA] = "ta", [TU] = "tu", [_I] = "i", [_U] = "u", } local function transliterate(text) local cached = translit_cache[text] if cached then if cached == BAD then error(("Internal error: Unable to transliterate %s because explicitly marked as BAD"):format(text)) end return cached end local tr = (lang:transliterate(text)) if not tr then error(("Internal error: Unable to transliterate: %s"):format(text)) end translit_cache[text] = tr return tr end local all_person_number_list = { "1s", "2ms", "2fs", "3ms", "3fs", "2d", "3md", "3fd", "1p", "2mp", "2fp", "3mp", "3fp" } local function make_person_number_slot_accel_list(list) local slot_accel_list = {} return slot_accel_list end local imp_person_number_list = {} for _, pn in ipairs(all_person_number_list) do if pn:find("^2") then table.insert(imp_person_number_list, pn) end end local passive_types = m_table.listToSet { "pass", -- verb has both active and passive "ipass", -- verb is active with impersonal passive "nopass", -- verb is active-only "onlypass", -- verb is passive-only "onlypass-impers", -- verb itself is impersonal, meaning passive-only with impersonal passive } local indicator_flags = m_table.listToSet { "nopast", "no_nonpast", "noimp", "nocat", -- don't categorize or include annotations about this; useful in suppletive parts of verbs "reduced", -- verb has assimilation/reduction of initial coronals "altgem", -- form X with alternative past geminate forms with final-weak endings } export.potential_lemma_slots = {"past_3ms", "past_pass_3ms", "ind_3ms", "ind_pass_3ms", "imp_2ms"} export.unsettable_slots = {} for _, potential_lemma_slot in ipairs(export.potential_lemma_slots) do table.insert(export.unsettable_slots, potential_lemma_slot .. "_linked") end -- We don't set the active participle directly for form I because we don't want stative verbs (with past vowel i or u) -- to default to فَاعِل. Instead we set the special slot 'ap1' and later copy it to 'ap' for non-stative verbs. The user -- meanwhile can explicitly request the فَاعِل form for active participles for stative verbs using `ap:+`. table.insert(export.unsettable_slots, "ap1") -- primary default فَاعِل for form I active participles table.insert(export.unsettable_slots, "ap2") -- secondary default فَعِيل for form I active participles (stative I) table.insert(export.unsettable_slots, "ap3") -- secondary default فَعِل for form I active participles (stative II) table.insert(export.unsettable_slots, "apcd") -- secondary default أَفْعَل for form I active participles (color/defect) table.insert(export.unsettable_slots, "apan") -- secondary default فَعْلَان for form I active participles (in -ān) table.insert(export.unsettable_slots, "pp2") -- secondary default فَعِيل for form I passive participles (same as ap2) table.insert(export.unsettable_slots, "vn2") -- secondary default فِعَال for form III verbal nouns export.unsettable_slots_set = m_table.listToSet(export.unsettable_slots) local default_indicator_to_active_participle_slot = { ["+"] = "ap1", ["++"] = "ap2", ["+++"] = "ap3", ["+cd"] = "apcd", ["+an"] = "apan", } local slots_that_may_be_uncertain = { vn = "verbal noun", ap = "active participle", } -- Initialize all the slots for which we generate forms. local function add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_slots = { {"ap", "act|part"}, {"pp", "pass|part"}, {"vn", "vnoun"}, } for _, unsettable_slot in ipairs(export.unsettable_slots) do table.insert(alternant_multiword_spec.verb_slots, {unsettable_slot, "-"}) end -- Add entries for a slot with person/number variants. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is a string listing the set of inflection tags to add after the person/number tags. -- `person_number_list` is a list of the person/number slot suffixes to add to `slot_prefix`. local function add_personal_slot(slot_prefix, tag_suffix, person_number_list) for _, persnum in ipairs(person_number_list) do local slot = slot_prefix .. "_" .. persnum local accel = persnum:gsub("(.)", "%1|") .. tag_suffix table.insert(alternant_multiword_spec.verb_slots, {slot, accel}) end end local tenses = { {"past", "past|%s"}, {"ind", "non-past|%s|ind"}, {"sub", "non-past|%s|sub"}, {"juss", "non-past|%s|juss"}, } for _, slot_accel in ipairs(tenses) do local slot, accel = unpack(slot_accel) for _, voice in ipairs {"act", "pass"} do add_personal_slot(voice == "act" and slot or slot .. "_pass", accel:format(voice), all_person_number_list) end end add_personal_slot("imp", "imp", imp_person_number_list) alternant_multiword_spec.verb_slots_map = {} for _, slot_accel in ipairs(alternant_multiword_spec.verb_slots) do local slot, accel = unpack(slot_accel) alternant_multiword_spec.verb_slots_map[slot] = accel end end local overridable_stems = {} local slot_override_param_mods = { footnote = { item_dest = "footnotes", store = "insert", }, alt = {}, t = { -- [[Module:links]] expects the gloss in "gloss". item_dest = "gloss", }, gloss = {}, g = { -- [[Module:links]] expects the genders in "g". `sublist = true` automatically splits on comma (optionally -- with surrounding whitespace). item_dest = "genders", sublist = true, }, pos = {}, lit = {}, id = {}, --W: The q/qq/l/ll (qualifier and label) modifiers were removed: rendering them -- needs [[Module:pron qualifier]], which does not exist on ar.wiktionary, so any -- use of them raised a script error. Accepting them here again requires importing -- that module first and restoring the block in generate_link() below. } local function generate_obj(formval, parse_err, prefix, is_slot_override) local val, uncertain = formval:match("^(.*)(%?)$") val = val or formval uncertain = not not uncertain local ar, translit = val:match("^(.*)//(.*)$") if not ar then ar = val end if ar == "" then if uncertain then ar = "?" else error(("Can't specify blank value for override for %s override '%s'"):format( is_slot_override and "slot" or "stem", prefix)) end end return {form = ar, translit = translit, uncertain = uncertain} end local function parse_inline_modifiers(comma_separated_group, parse_err, prefix, is_slot_override) local function this_generate_obj(formval, parse_err) return generate_obj(formval, parse_err, prefix, is_slot_override) end return put.parse_inline_modifiers_from_segments { group = comma_separated_group, props = { param_mods = slot_override_param_mods, parse_err = parse_err, generate_obj = this_generate_obj, pre_normalize_modifiers = function(data) local modtext = data.modtext modtext = modtext:match("^(%[.*%])$") if modtext then return ("<footnote:%s>"):format(modtext) end return data.modtext end, }, } end local function allow_multiple_values_for_override(comma_separated_groups, data, is_slot_override) local retvals = {} for _, comma_separated_group in ipairs(comma_separated_groups) do local retval if is_slot_override then --W: pass `prefix` and `is_slot_override` through; without them the error -- raised for a blank override value formatted a nil prefix, which is a -- crash on Lua 5.1 rather than the intended message. Reachable from e.g. -- <I/a~u.vn:[[كتابة]]>, where the [[...]] is consumed as a footnote and -- leaves the value empty. retval = parse_inline_modifiers(comma_separated_group, data.parse_err, data.prefix, is_slot_override) else retval = generate_obj(comma_separated_group[1], data.parse_err, data.prefix, is_slot_override) retval.footnotes = data.fetch_footnotes(comma_separated_group) end table.insert(retvals, retval) end for _, form in ipairs(retvals) do if form.form == "+" or default_indicator_to_active_participle_slot[form.form] then if form.form ~= "+" and default_indicator_to_active_participle_slot[form.form] and not is_slot_override then error(("Stem override '%s' cannot use %s to request a secondary default"):format( data.prefix, form.form)) end data.base.slot_override_uses_default[data.prefix] = true end end for _, form in ipairs(retvals) do if form.form == "-" then data.base.slot_explicitly_missing[data.prefix] = true break end end if data.base.slot_explicitly_missing[data.prefix] then for _, form in ipairs(retvals) do if form.form ~= "-" then data.parse_err(("For slot or stem '%s', saw both - and a value other than -, which isn't allowed"): format(data.prefix)) end end return nil end return retvals end local function simple_choice(choices) return function(separated_groups, data) if #separated_groups > 1 then data.parse_err("For spec '" .. data.prefix .. ":', only one value currently allowed") end if #separated_groups[1] > 1 then data.parse_err("For spec '" .. data.prefix .. ":', no footnotes currently allowed") end local choice = separated_groups[1][1] if not m_table.contains(choices, choice) then data.parse_err("For spec '" .. data.prefix .. ":', saw value '" .. choice .. "' but expected one of '" .. table.concat(choices, "،") .. "'") end return choice end end for _, overridable_stem in ipairs { "past", "past_v", "past_c", "past_pass", "past_pass_v", "past_pass_c", "nonpast", "nonpast_v", "nonpast_c", "nonpast_pass", "nonpast_pass_v", "nonpast_pass_c", "imp", "imp_v", "imp_c", } do overridable_stems[overridable_stem] = allow_multiple_values_for_override end overridable_stems.past_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.past_pass_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.nonpast_final_weak_vowel = simple_choice { "ā", "ī", "ū" } overridable_stems.nonpast_pass_final_weak_vowel = simple_choice { "ā", "ī", "ū" } ------------------------------------------------------------------------------- -- Utility functions -- ------------------------------------------------------------------------------- -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) return (rsubn(term, foo, bar)) end -- version of rsubn() that returns a 2nd argument boolean indicating whether a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end -- Concatenate one or more strings or form objects. local function q(...) local not_all_strings = debug_translit local has_manual_translit = debug_translit for i = 1, select("#", ...) do local argt = select(i, ...) if not argt then error(("Internal error: Saw nil at index %s: %s"):format(i, dump({...}))) end if type(argt) ~= "string" then not_all_strings = true if argt.translit then has_manual_translit = true break end end end if not not_all_strings then -- just strings, concatenate directly return table.concat({...}) end local formvals = {} local translit = has_manual_translit and {} or nil local footnotes for i = 1, select("#", ...) do local argt = select(i, ...) if type(argt) == "string" then formvals[i] = argt if has_manual_translit then translit[i] = transliterate(argt) end else formvals[i] = argt.form if has_manual_translit then translit[i] = argt.translit or transliterate(argt.form) end footnotes = iut.combine_footnotes(footnotes, argt.footnotes) end end -- FIXME: Do we want to support other properties? return { form = table.concat(formvals), translit = has_manual_translit and table.concat(translit) or nil, footnotes = footnotes, } end -- Return the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget(rad) if type(rad) == "string" then return rad elseif type(rad) == "table" then return rad.form else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end export.rget = rget -- for use in [[Module:ar-headword]] -- Return the footnotes associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget_footnotes(rad) if type(rad) == "string" then return nil elseif type(rad) == "table" then return rad.footnotes else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end -- Return true if the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object) -- is `val`. local function req(rad, val) return rget(rad) == val end -- True if a form-I verb whose first radical is wāw elides that wāw in the non-past (يَعِدُ for -- *يَوْعِدُ) rather than keeping it (يَوْجَلُ). The elision belongs to the kasra non-past -- a~i -- وَعَدَ يَعِدُ, i~i وَرِثَ يَرِثُ -- and to the fatḥa non-past that is a throat-letter lowering of -- that same underlying kasra: a~a وَضَعَ يَضَعُ, وَهَبَ يَهَبُ. Everywhere else the wāw stays: -- i~a وَجِلَ يَوْجَلُ، وَنِيَ يَوْنَى (a fatḥa non-past that is the regular partner of a kasra past, -- not a lowered kasra) -- *~u وَجَلَ يَوْجُلُ، وَجُهَ يَوْجُهُ (a ḍamma non-past is never a lowered kasra) -- The two elided-anyway lexemes with a kasra past (وَسِعَ يَسَعُ, وَطِئَ يَطَأُ) are lexical and are -- what the explicit `I-assimilated` weakness exists to express -- see the comment on it in -- detect_indicator_spec(). -- -- The u-non-past half of this is attested directly: أنطوان الدحداح، معجم تصريف الأفعال العربية -- prints يَوْجُلُ/اُوْجُلْ for وَجَلَ (ص١٣٦) and says so in the page's own note -- "لا تُحذَفُ واوُ -- الفعلِ في المُضارعِ ولا تُقلَبُ في الأمرِ" -- and يَوْنَى/اِوْنَ for وَنِيَ (ص٢٣٠). -- -- Returns true when the vowels aren't known, which keeps the historical default for callers -- that have radicals but no vowel pattern. local function form_i_w_assimilated(past_vowel, nonpast_vowel) if not past_vowel or not nonpast_vowel then return true end return req(nonpast_vowel, I) or req(nonpast_vowel, A) and req(past_vowel, A) end --W: Geminate form-I roots whose degemination vowel follows the مضارع by إتباع. -- When gemination breaks under a consonant-initial suffix, the vowel that surfaces on the -- second radical (مَدَدْتَ's second د) is normally the verb's own past vowel, which the وزن -- fixes at one value per measure: فتح for فعَل يفعُل (مَدَدْتَ، فَرَرْتَ، عَضَضْتَ), كسر for -- فعِل يفعَل (ظَلِلْتَ). Classical grammar also attests a minority إتباع variant on the -- فعَل يفعُل measure, where that vowel instead follows the مضارع's own ضمة (هَمُمْتَ). Which -- of the two a given verb takes is a fact about the lexeme, not about its وزن -- هَمَّ and -- مَدَّ share the measure and differ here -- so it cannot be derived from جذر + وزن and is -- listed, the same way SOUND_FORM_I_UU_ROOTS lists هَيُؤَ. Keyed rad1..rad2..rad3 and gated -- on the a~u pattern, so a listed root still degeminates normally under any other pattern. local GEMINATE_ITBAA_ROOTS = { ["همم"] = true, -- هَمَّ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، ص١٩٢ } -- The vowel that surfaces on the second radical of a geminate form-I verb once gemination -- breaks. `past_vowel` unless the root is an attested إتباع lexeme; see GEMINATE_ITBAA_ROOTS. local function geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel) if past_vowel and nonpast_vowel and req(past_vowel, A) and req(nonpast_vowel, U) and GEMINATE_ITBAA_ROOTS[rad1 .. rad2 .. rad3] then return nonpast_vowel end return past_vowel end --W: Form-I final-weak roots that keep rad3 as a consonant in the 2fs non-past and -- imperative (تَسْهُوِينَ، اُسْهُوِي) instead of contracting it away (تَسْهِينَ، اِسْهِي). -- -- This was briefly gated on the فعُل يفعُل measure alone, which made every root of that -- measure retain rad3 -- سَرُوَ included, on the reasoning that the measure is what keeps -- rad3 consonantal in the first place (its past 3ms is سَهُوَ, not the سَها an a~u root like -- دَعَا gives). That is a real argument but it is not evidence: the corpus has exactly one -- فعُل يفعُل final-weak page, so there is no second paradigm to check it against, and the -- rule it would displace -- contract before the 2fs -ī, as دَعَا does -- is the one the -- module has applied for years. Generalising an unverified reading over a whole class of -- live entries is the wrong direction to be wrong in, so this is back to listing what is -- actually attested, keyed and gated exactly like SOUND_FORM_I_UU_ROOTS. -- -- If سَرُوَ and the rest of the measure turn out to behave the same way, widening this is -- one line: drop the table lookup and keep the vowel gate. local FINAL_WEAK_RETAINED_RAD3_ROOTS = { ["سهو"] = true, -- سَهُوَ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، ص٢٠٤ } local function final_weak_uu_retains_rad3(rad1, rad2, rad3, past_ending_vowel, nonpast_ending_vowel) return past_ending_vowel == "ū" and nonpast_ending_vowel == "ū" and FINAL_WEAK_RETAINED_RAD3_ROOTS[rad1 .. rad2 .. rad3] or false end -- Map `vow` (a past/non-past vowel, either a string or form object without translit) by passing the formval through -- `fn`. Don't call this on radicals because they may have manual translit and it isn't clear how to handle that. local function map_vowel(vow, fn) if type(vow) == "string" then return fn(vow) elseif type(vow) == "table" then return {form = fn(vow.form), footnotes = vow.footnotes} else error(("Internal error: Unexpected type for past/non-past vowel: %s"):format(dump(vow))) end end local function get_radicals_3(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.past, vowel_spec.nonpast end local function get_radicals_4(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.rad4 end local function is_final_weak(base, vowel_spec) return vowel_spec.weakness == "final-weak" or base.form == "XV" end --W: Create a simple link local function link_term_simple(text) return "[[" .. text .. "]]" end local function link_term(text, face, id) return m_links.full_link({lang = lang, term = text, tr = "-", id = id}, face) end local function tag_text(text, tag, class) return m_links.full_link({lang = lang, alt = text, tr = "-"}) end local function track(page) require("Module:debug/track")("ar-verb/" .. page) return true end local function track_if_ar_conj(base, page) if base.alternant_multiword_spec.source_template == "ar-conj" then require("Module:debug/track")("ar-verb/" .. page) end return true end local function reorder_shadda(word) -- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets -- replaced with short-vowel+shadda during NFC normalisation, which -- MediaWiki does for all Unicode strings; however, it makes various -- processes inconvenient, so undo it. word = rsub(word, "(" .. DIACRITIC_ANY_BUT_SH .. ")" .. SH, SH .. "%1") return word end local function apply_nfc_shadda(word) -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization. This reverses the -- internal shadda+vowel format used during processing. word = rsub(word, SH .. "(" .. DIACRITIC_ANY_BUT_SH .. ")", "%1" .. SH) return word end ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- local function skip_slot(base, slot, allow_overrides) if base.slot_explicitly_missing[slot] then return true end if not allow_overrides and base.slot_overrides[slot] and not base.slot_override_uses_default[slot] then -- Skip any slots for which there are overrides, except those that request the default value using +, ++, etc. return true end if base.passive == "nopass" and (slot == "pp" or slot:find("_pass")) then return true elseif base.passive == "onlypass" and slot ~= "pp" and slot ~= "vn" and not slot:find("_pass") then return true elseif base.passive == "ipass" and slot:find("_pass") and not slot:find("3ms") then return true elseif base.passive == "onlypass-impers" and slot ~= "pp" and slot ~= "vn" and (not slot:find("_pass") or slot:find("_pass") and not slot:find("3ms")) then return true end if base.nopast and slot:find("^past_") then return true end if base.noimp and slot:find("^imp_") then return true end if base.no_nonpast and (slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss")) then return true end return false end local function basic_combine_stem_ending(stem, ending) return stem .. ending end local function basic_combine_stem_ending_tr(stem, ending) return stem .. ending end -- Concatenate `prefixes`, `stems` and `endings` (any of which may be an abbreviate form list, i.e. strings, form -- objects or lists of strings or form objects) and store into `slot`. If a user-supplied override exists for the slot, -- nothing will happen unless `allow_overrides` is provided. local function add3(base, slot, prefixes, stems, endings, allow_overrides) if skip_slot(base, slot, allow_overrides) then return end -- Optimization since the prefixes are almost always single strings. if type(prefixes) == "string" then local function do_combine_stem_ending(stem, ending) return prefixes .. stem .. ending end local function do_combine_stem_ending_tr(stem, ending) return transliterate(prefixes) .. stem .. ending end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, transliterate, do_combine_stem_ending_tr, base.form_footnotes) else iut.add_multiple_forms(base.forms, slot, {prefixes, stems, endings}, basic_combine_stem_ending, transliterate, basic_combine_stem_ending_tr, base.form_footnotes) end end -- Insert one or more forms in `form_or_forms` into `slot`. `form_or_forms` is an abbreviated form list (see comment at -- top of [[Module:inflection utilities]]). If a user-supplied override exists for the slot, nothing will happen unless -- `allow_overrides` is provided. BEWARE: One form object should never occur in two different slots, or twice in a given -- slot; if taking a form object from an existing slot, make sure to shallowCopy() it. local function insert_form_or_forms(base, slot, form_or_forms, allow_overrides, uncertain) if not skip_slot(base, slot, allow_overrides) then -- Some optimizations of the most common case of inserting a single string. if type(form_or_forms) == "string" and not base.form_footnotes then form_or_forms = {form = form_or_forms, uncertain = uncertain} iut.insert_form(base.forms, slot, form_or_forms) else local list = iut.convert_to_general_list_form(form_or_forms, base.form_footnotes) if uncertain then for _, formobj in ipairs(list) do formobj.uncertain = true end end iut.insert_forms(base.forms, slot, list) end end end -- Insert `string_or_form` into both the ap2 and pp2 slots, shallowCopying a form object to make sure no form objects -- occur in two slots. local function insert_ap2_pp2(base, string_or_form) insert_form_or_forms(base, "ap2", string_or_form) if type(string_or_form) == "table" then string_or_form = m_table.shallowCopy(string_or_form) end insert_form_or_forms(base, "pp2", string_or_form) end -- Convert `stemforms` (a string, a form object, or a list of strings and/or form objects) into "general form" (a list -- of form objects) and map `fn` over the list of objects. `fn` is passed two arguments (form value and translit) and -- should likewise return the new form value and translit. Footnotes will be preserved. FIXME: Preserve other metadata. local function map_general(stemforms, fn) return iut.map_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Similar to map_general() except that `fn` should return a single value (one or more strings or form objects), instead -- of two values (form value and translit), and the resulting value(s) from all calls to `fn` will be flattened to -- construct the overall return value. Footnotes will be preserved. FIXME: Preserve other metadata. local function flatmap_general(stemforms, fn) return iut.flatmap_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Given user-supplied stem overrides in `base`, construct any derived stem overrides (e.g. vowel-specific or -- consonant-specific variants), and truncate initial y-/ي- in any non-past overrides. local function construct_stems(base) local stems = base.stem_overrides stems.past_v = stems.past_v or stems.past stems.past_c = stems.past_c or stems.past stems.past_pass_v = stems.past_pass_v or stems.past_pass stems.past_pass_c = stems.past_pass_c or stems.past_pass stems.nonpast_v = stems.nonpast_v or stems.nonpast stems.nonpast_c = stems.nonpast_c or stems.nonpast stems.nonpast_pass_v = stems.nonpast_pass_v or stems.nonpast_pass stems.nonpast_pass_c = stems.nonpast_pass_c or stems.nonpast_pass stems.imp_v = stems.imp_v or stems.imp stems.imp_c = stems.imp_c or stems.imp local function truncate_nonpast_initial_cons(stem_type, form, translit) if form == "+" then return form, translit end if not form:find("^" .. Y) then error(("Form value %s for stem type '%s' should begin with ي"):format(form, stem_type)) end form = form:gsub("^" .. Y, "") if translit then if not translit:find("^y") then error(("Translit value %s for stem type '%s' should begin with y"):format(translit, stem_type)) end translit = translit:gsub("^y", "") end return form, translit end for _, nonpast_stem_type in ipairs { "nonpast_v", "nonpast_c", "nonpast_pass_v", "nonpast_pass_c" } do if stems[nonpast_stem_type] then stems[nonpast_stem_type] = map_general(stems[nonpast_stem_type], function(form, translit) return truncate_nonpast_initial_cons(nonpast_stem_type, form, translit) end) end end end -- Given user-specified overrides for stem `stemname`, return overrides with occurrences of + replaced by -- `default_stem`. If no overrides, return `default_stem`, or {} if no default. local function override_stem_if_needed(base, stemname, default_stem) local overrides = base.stem_overrides[stemname] if not overrides then return default_stem or {} end return map_general(overrides, function(form, translit) if form ~= "+" and default_indicator_to_active_participle_slot[form] then error(("Stem overrides cannot use secondary default indicators but saw %s in stem override '%s'"):format( form, stemname)) end if form == "+" then if translit then error(("Cannot supply manual translit along with + for stem override '%s'"):format(stemname)) end if not default_stem then error(("Cannot use + for stem override '%s' because no default is available"):format(stemname)) end if type(default_stem) ~= "string" then error(("Internal error: Default stem for '%s' is not a string: %s"):format(stemname, dump(default_stem))) end return default_stem end return form, translit end) end ------------------------------------------------------------------------------- -- Properties of different verbal forms -- ------------------------------------------------------------------------------- local allowed_vforms = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "Iq", "IIq", "IIIq", "IVq"} local allowed_vforms_set = m_table.listToSet(allowed_vforms) local allowed_vforms_with_weakness = m_table.shallowCopy(allowed_vforms) -- The user needs to be able to explicitly specify that a form-I verb (specifically one whose initial radical is و) is -- sound. Cf. wajiʕa yawjaʕu (not #yajaʕu) "to ache, to hurt". In general, i~a and u~u verbs whose initial radical is و -- seem to not assimilate the first radical; cf. وقح "to be shameless", variously waqaḥa~yaqiḥu, waquḥa~yawquḥu and -- waqiḥa~yawqaḥu, whereas a~i verbs (wafaḍa~yafiḍu "to rush"), i~i verbs (wafiqa~yafiqu "to be proper, to be suitable") -- and a~a verbs (waḍaʕa~yaḍaʕu "to set down, to place") do assimilate. But there are naturally exceptions, e.g. -- waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; waṯiʔa~yaṯaʔu "to get bruised, -- to be sprained". Also beware of waniya~yawnā "to be faint; to languish", which is sound in the first radical and -- final-weak in the last radical. Nonetheless, the regularity of the patterns mentioned above suggest we should provide -- them as defaults. -- Note that there are other cases of unexpectedly sound verbs, e.g. izdawaja~yazdawiju "to be in pairs", layisa~yalyasu -- "to be valiant, to be brave", ʔaḥwaja~yuḥwiju "to need", istahwana~yastahwinu "to consider easy", sawisa~yaswasu "to -- be or become moth-eaten or worm-eaten" (vs. sāsa~yasūsu "to govern, to rule" from the same radicals), ʕawira~yaʕwaru -- "to be one-eyed", istajwaba~yastajwibu "to interrogate", etc. But in these cases there is no need for explicit user -- specification as the lemma itself specifies the unexpected soundness. for _, form_with_weakness in ipairs { "I-sound", "I-assimilated", "none-sound", "none-hollow", "none-geminate", "none-final-weak" } do table.insert(allowed_vforms_with_weakness, form_with_weakness) end local allowed_vforms_with_weakness_set = m_table.listToSet(allowed_vforms_with_weakness) local function vform_supports_final_weak(vform) return vform ~= "XI" and vform ~= "XV" and vform ~= "IVq" end local function vform_supports_geminate(vform) return vform == "I" or vform == "III" or vform == "IV" or vform == "VI" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_supports_hollow(vform) return vform == "I" or vform == "IV" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_probably_impersonal_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, I) or vform == "V" or vform == "VI" or vform == "X" or vform == "IIq" end local function vform_probably_full_passive(vform) return vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" end local function vform_probably_no_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, U) or vform == "VII" or vform == "IX" or vform == "XI" or vform == "XII" or vform == "XIII" or vform == "XIV" or vform == "XV" or vform == "IIIq" or vform == "IVq" end -- Active vforms II, III, IV, Iq use non-past prefixes in -u- instead of -a-. local function prefix_vowel_from_vform(vform) if vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" then return "u" else return "a" end end -- True if the active non-past takes a-vocalization rather than i-vocalization in its last syllable. local function vform_nonpast_a_vowel(vform) return vform == "V" or vform == "VI" or vform == "XV" or vform == "IIq" end -- True if the `passive` spec indicates a passive-only verb. local function is_passive_only(passive) return passive == "onlypass" or passive == "onlypass-impers" end export.is_passive_only = is_passive_only -- for use in [[Module:ar-headword]] ------------------------------------------------------------------------------- -- Properties of specific sounds -- ------------------------------------------------------------------------------- -- Is radical wāw (و) or yāʾ (ي)? local function is_waw_ya(rad) return req(rad, W) or req(rad, Y) end -- Check that radical is wāw (و) or yāʾ (ي), error if not local function check_waw_ya(rad) if not is_waw_ya(rad) then error("Expecting weak radical: '" .. rget(rad) .. "' should be " .. W .. " or " .. Y) end end -- Form-I verb حيّ or حيي and form-X verb استحيا or استحى local function hayy_radicals(rad1, rad2, rad3) return req(rad1, "ح") and req(rad2, Y) and is_waw_ya(rad3) end -- FUCK ME HARD. "Lua error at line 1514: main function has more than 200 local variables". local function create_conjugations() ------------------------------------------------------------------------------- -- Radicals associated with various irregular verbs -- ------------------------------------------------------------------------------- -- Form-I verb أخذ or form-VIII verb اتخذ local function axadh_radicals(rad1, rad2, rad3) return req(rad1, HAMZA) and req(rad2, "خ") and req(rad3, "ذ") end -- Form-I verb whose imperative has a reduced form: أكل and أخذ and أمر. Return "shortonly" if only -- short-form imperatives exist (أكل and أخذ) or "shortlong" if long-form imperatives also exist (أمر); -- they are used after a clitic like فَ and وَ. local function reduced_imperative_verb(rad1, rad2, rad3) return axadh_radicals(rad1, rad2, rad3) and "shortonly" or req(rad1, HAMZA) and req(rad2, "ك") and req(rad3, "ل") and "shortonly" or req(rad1, HAMZA) and req(rad2, "م") and req(rad3, "ر") and "shortlong" end -- Form-I verb رأى and form-IV verb أرى local function raa_radicals(rad1, rad2, rad3) return req(rad1, "ر") and req(rad2, HAMZA) and is_waw_ya(rad3) end -- Form-I verb سأل local function saal_radicals(rad1, rad2, rad3) return req(rad1, "س") and req(rad2, HAMZA) and req(rad3, "ل") end -- Form-I verb كان local function kaan_radicals(rad1, rad2, rad3) return req(rad1, "ك") and req(rad2, W) and req(rad3, N) end ------------------------------------------------------------------------------- -- Sets of past endings -- ------------------------------------------------------------------------------- -- The 13 endings of the sound/hollow/geminate past tense. local past_endings = { -- singular SK .. TU, SK .. TA, SK .. "تِ", A, A .. "تْ", --dual SK .. "تُمَا", AA, A .. "تَا", -- plural SK .. "نَا", SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this SK .. "تُن" .. SH .. A, UU .. ALIF, SK .. "نَ" } -- Make endings for final-weak past in -aytu or -awtu. AYAW is AY or AW as appropriate. Note that AA and AW are -- global variables. local function make_past_endings_ay_aw(ayaw, third_sg_masc) return { -- singular ayaw .. SK .. TU, ayaw .. SK .. TA, ayaw .. SK .. "تِ", third_sg_masc, A .. "تْ", --dual ayaw .. SK .. "تُمَا", ayaw .. AA, A .. "تَا", -- plural ayaw .. SK .. "نَا", ayaw .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this ayaw .. SK .. "تُن" .. SH .. A, AW .. SK .. ALIF, ayaw .. SK .. "نَ" } end -- past final-weak -aytu endings local past_endings_ay = make_past_endings_ay_aw(AY, AAMAQ) -- past final-weak -awtu endings local past_endings_aw = make_past_endings_ay_aw(AW, AA) -- used for alternative endings for form-X geminate verbs like اِسْتَمَرَّ local past_endings_ay_12_person_only = { -- singular AY .. SK .. TU, AY .. SK .. TA, AY .. SK .. "تِ", {}, {}, --dual AY .. SK .. "تُمَا", {}, {}, -- plural AY .. SK .. "نَا", AY .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this AY .. SK .. "تُن" .. SH .. A, {}, {}, } -- Make endings for final-weak past in -ītu or -ūtu. IIUU is ī or ū as appropriate. Note that AA and UU are global -- variables. local function make_past_endings_ii_uu(iiuu) return { -- singular iiuu .. TU, iiuu .. TA, iiuu .. "تِ", iiuu .. A, iiuu .. A .. "تْ", --dual iiuu .. "تُمَا", iiuu .. AA, iiuu .. A .. "تَا", -- plural iiuu .. "نَا", iiuu .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this iiuu .. "تُن" .. SH .. A, UU .. ALIF, iiuu .. "نَ" } end -- past final-weak -ītu endings local past_endings_ii = make_past_endings_ii_uu(II) -- past final-weak -ūtu endings local past_endings_uu = make_past_endings_ii_uu(UU) ------------------------------------------------------------------------------- -- Sets of non-past prefixes and endings -- ------------------------------------------------------------------------------- local nonpast_prefix_consonants = { -- singular HAMZA, T, T, Y, T, -- dual T, Y, T, -- plural N, T, T, Y, Y } -- There are only five distinct endings in all non-past verbs. Make any set of non-past endings given these five -- distinct endings. local function make_nonpast_endings(null, fem, dual, pl, fempl) return { -- singular null, null, fem, null, null, -- dual dual, dual, dual, -- plural null, pl, fempl, pl, fempl } end -- endings for non-past indicative local ind_endings = make_nonpast_endings( U, II .. NA, AANI, UU .. NA, SK .. NA ) -- Make the endings for non-past subjunctive/jussive, given the vowel diacritic used in "null" endings -- (1s/2ms/3ms/3fs/1p). local function make_sub_juss_endings(dia_null) return make_nonpast_endings( dia_null, II, AA, UU .. ALIF, SK .. NA ) end -- endings for non-past subjunctive local sub_endings = make_sub_juss_endings(A) -- endings for non-past jussive local juss_endings = make_sub_juss_endings(SK) -- endings for alternative geminate non-past jussive in -a; same as subjunctive local juss_endings_alt_a = sub_endings -- endings for alternative geminate non-past jussive in -i local juss_endings_alt_i = make_sub_juss_endings(I) -- Endings for final-weak non-past indicative in -ā. Note that AY, AW and AAMAQ are global variables. local ind_endings_aa = make_nonpast_endings( AAMAQ, AYSK .. NA, AY .. AANI, AWSK .. NA, AYSK .. NA ) -- Make endings for final-weak non-past indicative in -ī or -ū; IIUU is ī or ū as appropriate. Note that II and UU -- are global variables. local function make_ind_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu, II .. NA, iiuu .. AANI, UU .. NA, iiuu .. NA ) end -- endings for final-weak non-past indicative in -ī local ind_endings_ii = make_ind_endings_ii_uu(II) -- endings for final-weak non-past indicative in -ū local ind_endings_uu = make_ind_endings_ii_uu(UU) -- Endings for final-weak non-past subjunctive in -ā. Note that AY, AW, ALIF, AAMAQ are global variables. local sub_endings_aa = make_nonpast_endings( AAMAQ, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past subjunctive in -ī or -ū. IIUU is ī or ū as appropriate. Note that AA, II, -- UU, ALIF are global variables. local function make_sub_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu .. A, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past subjunctive in -ī local sub_endings_ii = make_sub_endings_ii_uu(II) -- endings for final-weak non-past subjunctive in -ū local sub_endings_uu = make_sub_endings_ii_uu(UU) -- endings for final-weak non-past jussive in -ā local juss_endings_aa = make_nonpast_endings( A, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past jussive in -ī or -ū. IU is short i or u, IIUU is long ī or ū as appropriate. -- Note that AA, II, UU, ALIF are global variables. local function make_juss_endings_ii_uu(iu, iiuu) return make_nonpast_endings( iu, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past jussive in -ī local juss_endings_ii = make_juss_endings_ii_uu(I, II) -- endings for final-weak non-past jussive in -ū local juss_endings_uu = make_juss_endings_ii_uu(U, UU) ------------------------------------------------------------------------------- -- Sets of imperative endings -- ------------------------------------------------------------------------------- -- Extract the second person jussive endings to get corresponding imperative endings. local function imperative_endings_from_jussive(endings) return {endings[2], endings[3], endings[6], endings[10], endings[11]} end -- normal imperative endings local imp_endings = imperative_endings_from_jussive(juss_endings) -- alternative geminate imperative endings in -a local imp_endings_alt_a = imperative_endings_from_jussive(juss_endings_alt_a) -- alternative geminate imperative endings in -i local imp_endings_alt_i = imperative_endings_from_jussive(juss_endings_alt_i) -- final-weak imperative endings in -ā local imp_endings_aa = imperative_endings_from_jussive(juss_endings_aa) -- final-weak imperative endings in -ī local imp_endings_ii = imperative_endings_from_jussive(juss_endings_ii) -- final-weak imperative endings in -ū local imp_endings_uu = imperative_endings_from_jussive(juss_endings_uu) ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. Each of `prefixes`, `stems` and -- `endings` is either a sequence of 5 (for the imperative) or 13 (for other tenses) abbreviated form lists (each of -- which is either a string, a form object, or a list of strings and/or form objects; see -- [[Module:inflection utilities]] for more info). Alternatively, any of `prefixes`, `stems` or `endings` can be a -- single-element list containing an abbreviated form list, with an additional key `all_same` set to true, or (as a -- special case) a single string; in the latter cases, the same value is used for all 5 or 13 slots. If existing -- inflections already exist, they will be added to, not overridden. `pnums` is the list of person/number slot name -- suffixes, which must match up with the elements in `prefixes`, `stems` and `endings` (i.e. 5 for imperative, 13 -- otherwise). local function inflect_tense_1(base, tense, prefixes, stems, endings, pnums) if not prefixes or not stems or not endings then return end local function verify_affixes(affixname, affixes) local function interr(msg) error(("Internal error: For tense '%s', '%s' %s: %s"):format(tense, affixname, msg, dump(affixes))) end if type(affixes) == "string" then -- do nothing elseif type(affixes) ~= "table" then interr("is not a table or string") elseif affixes.all_same then if #affixes ~= 1 then interr(("with all_same = true should have length 1 but has length %s"):format(#affixes)) end else if #affixes ~= #pnums then interr(("should have length %s but has length %s"):format(#pnums, #affixes)) end end end verify_affixes("prefixes", prefixes) verify_affixes("stems", stems) verify_affixes("endings", endings) local function get_affix(affixes, i) if type(affixes) == "string" then return affixes elseif affixes.all_same then return affixes[1] else return affixes[i] end end for i, pnum in ipairs(pnums) do local prefix = get_affix(prefixes, i) local stem = get_affix(stems, i) local ending = get_affix(endings, i) local slot = tense .. "_" .. pnum add3(base, slot, prefix, stem, ending) end end -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. This is a simple wrapper around -- inflect_tense_1() that applies to all tenses other than the imperative; see inflect_tense_1() for more -- information about the parameters. local function inflect_tense(base, tense, prefixes, stems, endings) inflect_tense_1(base, tense, prefixes, stems, endings, all_person_number_list) end -- Like inflect_tense() but for the imperative, which has only five parts instead of 13 and no prefixes. local function inflect_tense_imp(base, stems, endings) inflect_tense_1(base, "imp", "", stems, endings, imp_person_number_list) end ------------------------------------------------------------------------------- -- Functions to inflect the past tense -- ------------------------------------------------------------------------------- -- Generate past verbs using specified vowel and consonant stems; works for sound, assimilated, hollow, and geminate -- verbs, active and passive. local function past_2stem_conj(base, tense, v_stem, c_stem, footnote_12) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "past" .. passive .. "_v", v_stem) local c_stem_12 = c_stem if footnote_12 then c_stem_12 = iut.combine_form_and_footnotes(c_stem_12, footnote_12) end c_stem_12 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem_12) local c_stem_3 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem) inflect_tense(base, tense, "", { -- singular c_stem_12, c_stem_12, c_stem_12, v_stem, v_stem, --dual c_stem_12, v_stem, v_stem, -- plural c_stem_12, c_stem_12, c_stem_12, v_stem, c_stem_3 }, past_endings) end -- Generate past verbs using single specified stem; works for sound and assimilated verbs, active and passive. local function past_1stem_conj(base, tense, stem) past_2stem_conj(base, tense, stem, stem) end ------------------------------------------------------------------------------- -- Functions to inflect non-past tenses -- ------------------------------------------------------------------------------- -- Generate non-past conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for active and passive; for all forms; for all weaknesses (sound, assimilated, hollow, final-weak and -- geminate) and for all types of non-past (indicative, subjunctive, jussive) except for the imperative. (There is a -- separate wrapper function below for geminate jussives because they have three alternants.) Both stems may be the -- same, e.g. for sound verbs. -- `prefix_vowel` will be either "a" or "u". `endings` should be an array of 13 items. If `endings` is nil or -- omitted, infer the endings from the tense. If `jussive` is true, or `endings` is nil and `tense` indicatives -- jussive, use the jussive pattern of vowel/consonant stems (different from the normal ones). local function nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, endings, jussive) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_v", v_stem and q(dia[prefix_vowel], v_stem) or nil) c_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_c", c_stem and q(dia[prefix_vowel], c_stem) or nil) if not endings then if tense:find("^ind") then endings = ind_endings elseif tense:find("^sub") then endings = sub_endings elseif tense:find("^juss") then jussive = true endings = juss_endings else error("Internal error: Unrecognized tense '" .. tense .."'") end end if not jussive then inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular v_stem, v_stem, v_stem, v_stem, v_stem, --dual v_stem, v_stem, v_stem, -- plural v_stem, v_stem, c_stem, v_stem, c_stem }, endings) else inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular -- 'adlul, tadlul, tadullī, yadlul, tadlul c_stem, c_stem, v_stem, c_stem, c_stem, --dual -- tadullā, yadullā, tadullā v_stem, v_stem, v_stem, -- plural -- nadlul, tadullū, tadlulna, yadullū, yadlulna c_stem, v_stem, c_stem, v_stem, c_stem }, endings) end end -- Generate non-past conjugation with one stem (no distinct stems for vowel-initial and consonant-initial endings). -- See nonpast_2stem_conj(). local function nonpast_1stem_conj(base, tense, prefix_vowel, stem, endings, jussive) nonpast_2stem_conj(base, tense, prefix_vowel, stem, stem, endings, jussive) end -- Generate active/passive jussive geminative. There are three alternants, two with terminations -a and -i and one -- in a null termination with a distinct pattern of vowel/consonant stem usage. See nonpast_2stem_conj() for a -- description of the arguments. local function jussive_gem_conj(base, tense, prefix_vowel, v_stem, c_stem) -- alternative in -a nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_a) -- alternative in -i nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_i) -- alternative in -null; requires different combination of v_stem and -- c_stem since the null endings require the c_stem (e.g. "tadlul" here) -- whereas the corresponding endings above in -a or -i require the v_stem -- (e.g. "tadulla, tadulli" above) nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings, "jussive") end ------------------------------------------------------------------------------- -- Functions to inflect the imperative -- ------------------------------------------------------------------------------- -- Generate imperative conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for all forms, and for all weaknesses other than final-weak. Note that the two stems may be the same -- (specifically for sound and assimilated verbs). If `endings` is nil or omitted, use `imp_endings`. If `alt_gem` -- is specified, use the pattern of vowel and consonant stems appropriate for the alternative geminate imperatives -- that use a null ending of -a or -i instead of an empty ending. local function make_2stem_imperative(base, v_stem, c_stem, endings, alt_gem) endings = endings or imp_endings -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "imp_v", v_stem) c_stem = override_stem_if_needed(base, "imp_c", c_stem) if alt_gem then inflect_tense_imp(base, {v_stem, v_stem, v_stem, v_stem, c_stem}, endings) else inflect_tense_imp(base, {c_stem, v_stem, v_stem, v_stem, c_stem}, endings) end end -- Generate imperative parts for sound or assimilated verbs. local function make_1stem_imperative(base, stem) make_2stem_imperative(base, stem, stem) end -- Generate imperative parts for geminate verbs form I (also IV, VII, VIII, X). local function make_gem_imperative(base, v_stem, c_stem) make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_a, "alt gem") make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_i, "alt gem") make_2stem_imperative(base, v_stem, c_stem) end ------------------------------------------------------------------------------- -- Functions to inflect entire verbs -- ------------------------------------------------------------------------------- -- Generate finite parts of a sound verb (also works for assimilated verbs) from five stems (past and non-past, -- active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"). local function make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) past_1stem_conj(base, "past", past_stem) past_1stem_conj(base, "past_pass", past_pass_stem) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem) make_1stem_imperative(base, imp_stem) end local function past_final_weak_endings_from_vowel(vowel) if vowel == "ay" then return past_endings_ay elseif vowel == "aw" then return past_endings_aw elseif vowel == "ī" then return past_endings_ii elseif vowel == "ū" then return past_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized past final-weak vowel spec '%s'"):format(vowel)) end end local function nonpast_final_weak_endings_from_vowel(vowel) if vowel == "ā" then return ind_endings_aa, sub_endings_aa, juss_endings_aa, imp_endings_aa elseif vowel == "ī" then return ind_endings_ii, sub_endings_ii, juss_endings_ii, imp_endings_ii elseif vowel == "ū" then return ind_endings_uu, sub_endings_uu, juss_endings_uu, imp_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized non-past final-weak vowel spec '%s'"):format(vowel)) end end -- Generate finite parts of a final-weak verb from five stems (past and non-past, active and passive, plus -- imperative), the past active ending vowel (ay, aw, ī or ū), the non-past active ending vowel (ā, ī or ū) and the -- prefix vowel in the active non-past (a or u). `imp_stem_2fs`, if given, overrides `imp_stem` for the 2fs -- imperative only -- needed because the 2fs jussive/imperative ending is always -ī regardless of the verb's -- past~non-past vowel class (see `make_juss_endings_ii_uu`'s hardcoded `fem = II`), so its hamzat wasl is always -- kasra even for a u-class verb like دَعَا (اِدْعِي, not اُدْعِي; see README "Open findings" #5). -- -- `retain_rad3_2fs`, if true, keeps rad3 as a consonant before that -ī instead of letting it -- contract away: تَسْهُوِينَ / اُسْهُوِي rather than تَسْهِينَ / اِسْهِي. See README "Findings" #8 -- and final_weak_uu_retains_rad3(). It also cancels `imp_stem_2fs`, because #5's kasra hamzat -- wasl exists only for the contracted stem, whose ending begins with that kasra; a retained -- rad3 puts its own ḍamma there, so the imperative takes the ordinary stem (اُسْهُوِي). local function make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, past_ending_vowel, nonpast_ending_vowel, prefix_vowel, imp_stem_2fs, retain_rad3_2fs) past_stem = override_stem_if_needed(base, "past", past_stem) past_pass_stem = override_stem_if_needed(base, "past_pass", past_pass_stem) -- Don't call override_stem_if_needed() here for non-past stems; it's called in nonpast_2stem_conj(). imp_stem = override_stem_if_needed(base, "imp", imp_stem) -- + not supported for ending vowel overrides past_ending_vowel = base.stem_overrides.past_final_weak_vowel or past_ending_vowel local past_pass_ending_vowel = base.stem_overrides.past_pass_final_weak_vowel or "ī" nonpast_ending_vowel = base.stem_overrides.nonpast_final_weak_vowel or nonpast_ending_vowel local nonpast_pass_ending_vowel = base.stem_overrides.nonpast_pass_final_weak_vowel or "ā" local past_endings = past_final_weak_endings_from_vowel(past_ending_vowel) local past_pass_endings = past_final_weak_endings_from_vowel(past_pass_ending_vowel) local ind_endings, sub_endings, juss_endings, imp_endings = nonpast_final_weak_endings_from_vowel(nonpast_ending_vowel) local ind_pass_endings, sub_pass_endings, juss_pass_endings = nonpast_final_weak_endings_from_vowel(nonpast_pass_ending_vowel) if retain_rad3_2fs then -- rad3 surfaces as a consonant carrying the class's own ḍamma, then the regular -ī: -- سْهـ + ُوِينَ, not سْهـ + ِينَ. The 2fs sits at index 3 of a make_nonpast_endings() -- table (`fem`) and at index 2 of the five imperative endings that -- imperative_endings_from_jussive() extracts from it. Copied rather than mutated -- -- these ending tables are module-level constants shared by every final-weak verb. -- Written out inline, not via a helper: create_conjugations() is at Lua's 60-upvalue -- ceiling, and one more captured local stops the module loading at all. local function set_2fs(endings, index, ending) local out = {} for i, v in ipairs(endings) do out[i] = v end out[index] = ending return out end ind_endings = set_2fs(ind_endings, 3, UU .. II .. NA) sub_endings = set_2fs(sub_endings, 3, UU .. II) juss_endings = set_2fs(juss_endings, 3, UU .. II) imp_endings = set_2fs(imp_endings, 2, UU .. II) imp_stem_2fs = nil end inflect_tense(base, "past", "", {past_stem, all_same = 1}, past_endings) inflect_tense(base, "past_pass", "", {past_pass_stem, all_same = 1}, past_pass_endings) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem, ind_endings) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem, sub_endings) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem, juss_endings) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_pass_endings) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_pass_endings) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_pass_endings) if imp_stem_2fs then imp_stem_2fs = override_stem_if_needed(base, "imp", imp_stem_2fs) inflect_tense_imp(base, {imp_stem, imp_stem_2fs, imp_stem, imp_stem, imp_stem}, imp_endings) else inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings) end end -- Generate finite parts of an augmented (form II+) final-weak verb from five stems (past and non-past, active and -- passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u") and a flag indicating if it -- behaves like a form V/VI verb in taking non-past endings in -ā instead of -ī. local function make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "ay", form56 and "ā" or "ī", prefix_vowel) end -- Generate finite parts of an augmented (form II+) sound or final-weak verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (active past stem minus last syllable (= -al or -ā)); -- * `nonpast_stem_base` (non-past stem minus last syllable (= -al/-il or -ā/-ī); -- * `past_pass_stem_base` (passive past stem minus last syllable (= -il or -ī)); -- * `vn` (verbal noun). local function make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local final_weak = is_final_weak(base, vowel_spec) local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local form56 = vform_nonpast_a_vowel(base.verb_form) local a_base_suffix = final_weak and "" or q(A, lastrad) local i_base_suffix = final_weak and "" or q(I, lastrad) -- past and non-past stems, active and passive local past_stem = q(past_stem_base, a_base_suffix) -- In forms 5 and 6, non-past has /a/ as last stem vowel in the non-past -- in both active and passive, but /i/ in the active participle and /a/ -- in the passive participle. Elsewhere, consistent /i/ in active non-past -- and participle, consistent /a/ in passive non-past and participle. -- Hence, forms 5 and 6 differ only in the non-past active (but not -- active participle), so we have to split the finite non-past stem and -- active participle stem. local nonpast_stem = q(nonpast_stem_base, form56 and a_base_suffix or i_base_suffix) local ap_stem = q(nonpast_stem_base, i_base_suffix) local past_pass_stem = q(past_pass_stem_base, i_base_suffix) local nonpast_pass_stem = q(nonpast_stem_base, a_base_suffix) -- imperative stem local imp_stem = q(past_stem_base, form56 and a_base_suffix or i_base_suffix) -- make parts if final_weak then make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) else make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) end -- active and passive participle if final_weak then insert_form_or_forms(base, "ap", q(MU, ap_stem, IN)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem, AN, AMAQ)) else insert_form_or_forms(base, "ap", q(MU, ap_stem)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem)) end end -- Generate finite parts of a hollow or geminate verb from ten stems (vowel and consonant stems for each of past and -- non-past, active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"), plus a -- flag indicating if we are a geminate verb. local function make_hollow_geminate_verb(base, geminate, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) past_2stem_conj(base, "past", past_v_stem, past_c_stem, altgem_note) past_2stem_conj(base, "past_pass", past_pass_v_stem, past_pass_c_stem) nonpast_2stem_conj(base, "ind", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "sub", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "ind_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) nonpast_2stem_conj(base, "sub_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) if geminate then jussive_gem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) jussive_gem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_gem_imperative(base, imp_v_stem, imp_c_stem) else nonpast_2stem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_2stem_imperative(base, imp_v_stem, imp_c_stem) end end -- Generate finite parts of an augmented (form II+) hollow verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun). local function make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local form410 = base.verb_form == "IV" or base.verb_form == "X" local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c a_base_suffix_v = q(AA, lastrad) -- 'af-āl-a, inf-āl-a a_base_suffix_c = q(A, lastrad) -- 'af-al-tu, inf-al-tu i_base_suffix_v = q(II, lastrad) -- 'uf-īl-a, unf-īl-a i_base_suffix_c = q(I, lastrad) -- 'uf-il-tu, unf-il-tu -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) -- yu-f-īl-u, ya-staf-īl-u but yanf-āl-u, yaft-āl-u local nonpast_v_stem = q(nonpast_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local imp_c_stem = q(past_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end -- Generate finite parts of an augmented (form II+) geminate verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem; this and the stem bases below will end with a consonant -- for forms IV, X, IVq, and a short vowel for the others); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun); -- * `altgem_note` (footnote to add to active past 1/2-person forms, when alternative forms are supplied [form X]). local function make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, altgem_note) insert_form_or_forms(base, "vn", vn) local vform = base.verb_form local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local prefix_vowel = prefix_vowel_from_vform(vform) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c if vform == "IV" or vform == "X" or vform == "IVq" then a_base_suffix_v = q(A, lastrad, SH) -- 'af-all a_base_suffix_c = q(SK, lastrad, A, lastrad) -- 'af-lal i_base_suffix_v = q(I, lastrad, SH) -- yuf-ill i_base_suffix_c = q(SK, lastrad, I, lastrad) -- yuf-lil else a_base_suffix_v = q(lastrad, SH) -- fā-ll, infa-ll a_base_suffix_c = q(lastrad, A, lastrad) -- fā-lal, infa-lal i_base_suffix_v = q(lastrad, SH) -- yufā-ll, yanfa-ll i_base_suffix_c = q(lastrad, I, lastrad) -- yufā-lil, yanfa-lil end -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) local nonpast_v_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- NOTE: Formerly had a comment that "vform III and VI passive past do not have contracted parts, only -- uncontracted parts, which are added separately by those functions". This is based on Mace -- "Arabic Verbs and Essential Grammar" (1999) entry 63 (continued), which shows passive ḥūjija but no ḥūjja; -- but that is apparently a mistake, as (1) verb tables in other books do show contracted passive parts for -- these forms; (2) there is no mention of such an exception on p. 99, which explains how geminate ("doubled") -- verbs work (on the contrary, it says "The contracted and uncontracted pairs (see above) are found all -- over Forms III and VI of the doubled verbs"). local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local imp_c_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end ------------------------------------------------------------------------------- -- Conjugation functions for specific conjugation types -- ------------------------------------------------------------------------------- local function form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local imp_vowel = map_vowel(nonpast_vowel, function(vow) if vow == A or vow == I then return I elseif vow == U then return U elseif not skip_slot(base, "imp_2ms") then error(("Internal error: Non-past vowel %s isn't a, i, or u, should have been caught earlier"):format( dump(nonpast_vowel))) else -- Passive-only; imperative won't ever be displayed so it doesn't matter. return I end end) -- Mace ("Arabic Verbs and Essentials of Grammar" p. 63: [https://archive.org/details/arabicverbsessen00john/page/62/mode/2up]) -- claims that initial hamza is assimilated/elided into a long vowel in the form-I imperative, but apparently -- this isn't corrrect. local vowel_on_alif = map_vowel(imp_vowel, function(vow) return ALIF .. vow end) return q(vowel_on_alif, rad1, SK) end -- Implement form-I sound or assimilated verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_sound_assimilated_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied -- past and non-past stems, active and passive local past_stem = q(rad1, A, rad2, past_vowel, rad3) local nonpast_stem = assimilated and q(rad2, nonpast_vowel, rad3) or q(rad1, SK, rad2, nonpast_vowel, rad3) local past_pass_stem = q(rad1, U, rad2, I, rad3) local nonpast_pass_stem = q(rad1, SK, rad2, A, rad3) -- imperative stem -- check for irregular verb with reduced imperative (أَخَذَ or أَكَلَ or أَمَرَ) local reducedimp = reduced_imperative_verb(rad1, rad2, rad3) if reducedimp then base.irregular = true end local imp_stem_suffix = q(rad2, nonpast_vowel, rad3) local long_imp_stem_base = form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local short_imp_stem_base = "" local imp_stem = q((assimilated or reducedimp) and "" or long_imp_stem_base, imp_stem_suffix) -- A form-I mithal that keeps its wāw spells its imperative on a hamzat wasl, -- اِوْجَلْ / اِوْنَ. Tell postprocess_term() not to reduce that اِوْ to اِي -- see #10 -- there for why the substitution list can't decide this for itself. if not assimilated and req(rad1, W) then base.keep_initial_w = true end -- make parts make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "a") if reducedimp == "shortlong" then make_1stem_imperative(base, iut.combine_form_and_footnotes(q(long_imp_stem_base, imp_stem_suffix), mw.getCurrentFrame():preprocess("[used especially with a clitic such as {{m|ar|فَ}} or {{m|ar|وَ}}]"))) end -- Check for irregular verb سَأَلَ with alternative jussive and imperative. Calling this after make_sound_verb() -- adds additional entries to the paradigm parts. if saal_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_1stem_conj(base, "juss", "a", "سَل") nonpast_1stem_conj(base, "juss_pass", "u", "سَل") make_1stem_imperative(base, "سَل") end -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, I, rad3)) -- Insert alternative active participle (stative type I) فَعِيل. Since not all verbs have this, we require that -- verbs that do have it specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <ap:++> to -- indicate that the alternative form should be used for the active participle, <ap:+,++> to indicate that both -- forms can be used, and <ap:-> to indicate that there is no active participle). The same form is used for -- secondary default passive participle. insert_ap2_pp2(base, q(rad1, A, rad2, II, rad3)) -- Active participle, stative type II فَعِل (+++). insert_form_or_forms(base, "ap3", q(rad1, A, rad2, I, rad3)) -- Active participle, color/defect أَفْعَل (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَعْلَان (+an). insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad3)) end conjugations["I-sound"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, false) end conjugations["none-sound"] = function(base, vowel_spec) -- All default stems are nil. make_sound_verb(base) end conjugations["none-hollow"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, false) end conjugations["none-geminate"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, "geminate") end conjugations["none-final-weak"] = function(base, vowel_spec) -- All default stems are nil. make_final_weak_verb(base) end conjugations["I-assimilated"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, "assimilated") end local function make_form_i_hayy_verb(base, vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied base.irregular = true -- past and non-past stems, active and passive, and imperative stem local past_c_stem = "حَيِي" local past_v_stem_long = past_c_stem local past_v_stem_short = "حَيّ" -- 3mp of the long variant (حَيِيَ) is حَيُوا, not the geminated حَيُّوا of the short -- variant (حَيَّ) -- rad2 (ي) here is a plain radical, not doubled; see README -- "Open findings" #4. Needs its own stem, distinct from both the long and short ones. local past_v_stem_3mp = "حَي" local past_pass_c_stem = "حُيِي" local past_pass_v_stem_long = past_pass_c_stem local past_pass_v_stem_short = "حُيّ" local past_pass_v_stem_3mp = "حُي" local nonpast_stem = "حْي" local nonpast_pass_stem = nonpast_stem local imp_stem = _I .. nonpast_stem -- make parts past_2stem_conj(base, "past", {}, past_c_stem) past_2stem_conj(base, "past_pass", {}, past_pass_c_stem) local variant = vowel_spec.variant or "both" if variant == "short" or variant == "both" then past_2stem_conj(base, "past", past_v_stem_short, {}) past_2stem_conj(base, "past_pass", past_pass_v_stem_short, {}) end function inflect_long_variant(tense, long_stem, mp_stem) inflect_tense_1(base, tense, "", {long_stem, long_stem, long_stem, long_stem, mp_stem}, {past_endings[4], past_endings[5], past_endings[7], past_endings[8], past_endings[12]}, {"3ms", "3fs", "3md", "3fd", "3mp"}) end if variant == "long" or variant == "both" then inflect_long_variant("past", past_v_stem_long, past_v_stem_3mp) inflect_long_variant("past_pass", past_pass_v_stem_long, past_pass_v_stem_3mp) end nonpast_1stem_conj(base, "ind", "a", nonpast_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub", "a", nonpast_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss", "a", nonpast_stem, juss_endings_aa) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_endings_aa) inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings_aa) -- active and passive participles apparently do not exist for this verb end -- Implement form-I final-weak assimilated+final-weak verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_final_weak_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- حَيَّ or حَيِيَ is weird enough that we handle it as a separate function. if hayy_radicals(rad1, rad2, rad3) then make_form_i_hayy_verb(base, vowel_spec) return end -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- Past and non-past stems, active and passive, and imperative stem. local past_stem = q(rad1, A, rad2) local past_pass_stem = q(rad1, U, rad2) local nonpast_stem, nonpast_pass_stem, imp_stem, imp_stem_2fs if raa_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_stem = rad1 nonpast_pass_stem = rad1 imp_stem = rad1 else nonpast_pass_stem = q(rad1, SK, rad2) if assimilated then nonpast_stem = rad2 imp_stem = rad2 else nonpast_stem = nonpast_pass_stem imp_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2) -- The 2fs imperative always has hamzat wasl with kasra, since its ending is -- always -ī regardless of the verb's vowel class; see make_final_weak_verb(). imp_stem_2fs = q(form_i_imp_stem_through_rad1(base, I, rad1), rad2) end end -- A form-I mithal that keeps its wāw spells its imperative on a hamzat wasl, -- اِوْجَلْ / اِوْنَ. Tell postprocess_term() not to reduce that اِوْ to اِي -- see #10 -- there for why the substitution list can't decide this for itself. if not assimilated and req(rad1, W) then base.keep_initial_w = true end -- Make parts. local past_ending_vowel = req(rad3, Y) and req(past_vowel, A) and "ay" or req(rad3, W) and req(past_vowel, A) and "aw" or req(past_vowel, I) and "ī" or "ū" -- Try to preserve footnotes attached to the third radical and/or past and/or non-past vowels. local past_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(past_vowel)) local nonpast_ending_vowel = req(nonpast_vowel, A) and "ā" or req(nonpast_vowel, I) and "ī" or "ū" local nonpast_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(nonpast_vowel)) make_final_weak_verb(base, iut.combine_form_and_footnotes(past_stem, past_footnotes), iut.combine_form_and_footnotes(past_pass_stem, past_footnotes), iut.combine_form_and_footnotes(nonpast_stem, nonpast_footnotes), iut.combine_form_and_footnotes(nonpast_pass_stem, nonpast_footnotes), iut.combine_form_and_footnotes(imp_stem, nonpast_footnotes), past_ending_vowel, nonpast_ending_vowel, "a", imp_stem_2fs and iut.combine_form_and_footnotes(imp_stem_2fs, nonpast_footnotes) or nil, final_weak_uu_retains_rad3(rad1, rad2, rad3, past_ending_vowel, nonpast_ending_vowel)) -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, IN)) -- Active participle, stative type I فَعِيّ (++). FIXME: Is this correct when rad3 is W? insert_ap2_pp2(base, q(rad1, A, rad2, II, SH)) -- Active participle, stative type II فَعٍ (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, rad2, IN)) -- Active participle, color/defect أَفْعَى (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, AAMAQ)) -- Active participle, -ān فَعْيَان or فَعْوَان (+an). -- FIXME: Any examples of this for both rad3 = W and y to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, req(rad3, Y) and II or UU, SH)) end conjugations["I-final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, false) end conjugations["I-assimilated+final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, "assimilated") end conjugations["I-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- In some sense, hollow vowels i~i and u~u are more "correct" than a~i and a~u, but the latter follow the -- pattern of other form-I verbs, so we map i~i to a~i and u~u to a~u in infer_radicals(). Now however we have -- to undo this to get the actual past vowel based on the non-past vowel. if req(past_vowel, A) then past_vowel = map_vowel(past_vowel, function(vow) return req(nonpast_vowel, A) and I or rget(nonpast_vowel) end) end local lengthened_nonpast = map_vowel(nonpast_vowel, function(vow) return vow == U and UU or vow == I and II or AA end) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) local past_v_stem = q(rad1, AA, rad3) local past_c_stem = q(rad1, past_vowel, rad3) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, lengthened_nonpast, rad3) local nonpast_c_stem = q(rad1, nonpast_vowel, rad3) -- passive past stems - vowel (v) and consonant (c) -- 'ufīla always; the contracted stem takes whichever of i/u the active past_c_stem -- *isn't* -- xāfa/xiftu (i) -> passive xufta (u), qāla/qultu (u) -> passive qilta (i). -- Contraction drops rad2, so this vowel is the only thing distinguishing active from -- passive in these forms, hence the two roots' behaviour is opposite, not independent. -- Confirmed on two printed pages (خافَ p.224 "خُفْتَ", قالَ p.138 "قِلْتَ"); previously -- hardcoded to u from خافَ alone, which is only half the pattern -- see README. local past_pass_v_stem = q(rad1, II, rad3) local past_pass_c_stem = q(rad1, map_vowel(past_vowel, function(vow) return vow == I and U or I end), rad3) -- passive non-past stems - vowel (v) and consonant (c) -- yufāla/yufalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, AA, rad3) local nonpast_pass_c_stem = q(rad1, A, rad3) -- imperative stem local imp_v_stem = nonpast_v_stem local imp_c_stem = nonpast_c_stem -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") if kaan_radicals(rad1, rad2, rad3) then local endings = make_nonpast_endings(U, {}, {}, {}, {}) inflect_tense(base, "juss", nonpast_prefix_consonants, q(A, rad1), endings) base.irregular = true end -- Active participle. insert_form_or_forms(base, "ap1", req(rad3, HAMZA) and q(rad1, AA, HAMZA, IN) or q(rad1, AA, HAMZA, I, rad3)) -- Active participle, stative type I فَيِّد (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, Y, SH, I, rad3)) -- Active participle, stative type II فَيِد (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, Y, I, rad3)) -- Active participle, color/defect أَفّيَد or أَفّوَد (+cd). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَيْدَان or فَوْدَان (+an). Example: جَاعَ "to be hungry", act part جَوْعَان insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, req(rad2, Y) and II or UU, rad3)) end conjugations["I-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) -- The contracted stem's vowel is the past vowel for most roots (مَدَدْتَ) but follows the -- مضارع for the إتباع lexemes (هَمُمْتَ); see geminate_degemination_vowel(). local past_v_stem = q(rad1, A, rad2, SH) local past_c_stem = q(rad1, A, rad2, geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel), rad2) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, nonpast_vowel, rad2, SH) local nonpast_c_stem = q(rad1, SK, rad2, nonpast_vowel, rad2) -- passive past stems - vowel (v) and consonant (c) -- dulla/dulilta local past_pass_v_stem = q(rad1, U, rad2, SH) local past_pass_c_stem = q(rad1, U, rad2, I, rad2) -- passive non-past stems - vowel (v) and consonant (c) --yudallu/yudlalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, A, rad2, SH) local nonpast_pass_c_stem = q(rad1, SK, rad2, A, rad2) -- imperative stem local imp_v_stem = q(rad1, nonpast_vowel, rad2, SH) local imp_c_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2, nonpast_vowel, rad2) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, SH)) -- Active participle, stative type I فَعِيع (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, rad2, II, rad2)) -- Active participle, stative type II فَعّ (+++). Example: بَرَّ "to be pious", active participle بَرّ insert_form_or_forms(base, "ap3", q(rad1, A, rad2, SH)) -- Active participle, color/defect أَفَعّ (+cd). -- Example: لَصَّ "to be thievish, to steal repeatedly", active participle أَلَصّ. insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, A, rad2, SH)) -- Active participle, -ān فَعَّان (+an). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SH, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad2)) end -- Return the ta- (active, past and non-past) and tu- (passive past) prefixes for a form II/III/V/VI verb. -- Form V and VI verbs normally use ta- and tu-, but reduced (base.reduced) verbs use different prefixes. Form II -- and III verbs have no prefix. local function form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vform = base.verb_form if vform == "V" or vform == "VI" then if base.reduced then -- To simplify the code, we generate two rad1's with a sukūn between them, which is cleaned up in -- postprocessing. return q(_I, rad1, SK), q(rad1, SK), q(_U, rad1, SK) else return TA, TA, TU end else return "", "", "" end end -- Make form II or V sound or final-weak verb. local function make_form_ii_v_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "V" and q(ta_past_prefix, rad1, A, rad2, SH, final_weak and IN or q(U, rad3)) or q(TA, rad1, SK, rad2, II, final_weak and AH or rad3) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, A, rad2, SH) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, A, rad2, SH) local past_pass_stem_base = q(tu_past_prefix, rad1, U, rad2, SH) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["II-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["II-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end local function make_form_iii_alt_vn(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- Insert alternative verbal noun فِعَال. Since not all verbs have this, we require that verbs that do have it -- specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <vn:+,++> to indicate that -- both the normal verbal noun مُفَاعَلَة and secondary verbal noun فِعَال are available). insert_form_or_forms(base, "vn2", q(rad1, I, rad2, AA, final_weak and HAMZA or rad3)) end -- Make form III or VI sound or final-weak verb. local function make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, final_weak and IN or q(U, rad3)) or q(MU, rad1, AA, rad2, final_weak and AAH or q(A, rad3, AH)) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, AA, rad2) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA, rad2) local past_pass_stem_base = q(tu_past_prefix, rad1, UU, rad2) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) if vform == "III" then make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["III-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end -- Make form III or VI geminate verb. local function make_form_iii_vi_geminate_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) -- Alternative verbal noun فِعَال will be inserted when we add sound parts below. local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, SH) or q(MU, rad1, AA, rad2, SH, AH) -- Various stem bases. local past_stem_base = q(ta_past_prefix, rad1, AA) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA) local past_pass_stem_base = q(tu_past_prefix, rad1, UU) -- Make parts. local variant = vowel_spec.variant or "short" if variant == "short" or variant == "both" then make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Also add alternative sound (non-compressed) parts. This will lead to some duplicate entries, but they are -- removed during addition. if variant == "long" or variant == "both" then make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) elseif vform == "III" then -- Still need to add the alternative form-III verbal noun. make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make form IV sound or final-weak verb. local function make_form_iv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- core of stem base, minus stem prefixes local stem_core -- check for irregular verb أَرَى local is_raa = raa_radicals(rad1, rad2, rad3) if is_raa then base.irregular = true stem_core = rad1 else stem_core = q(rad1, SK, rad2) end -- verbal noun local vn = is_raa and q(HAMZA, I, stem_core, AA, HAMZA, AH) or q(HAMZA, I, stem_core, AA, final_weak and HAMZA or rad3) -- various stem bases local past_stem_base = q(HAMZA, A, stem_core) local nonpast_stem_base = stem_core local past_pass_stem_base = q(HAMZA, U, stem_core) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-sound"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-final-weak"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- verbal noun local vn = q(HAMZA, I, rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(HAMZA, I, rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["V-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["V-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make a verbal noun of the general form that applies to forms VII and above. RAD12 is the first consonant cluster -- (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the final consonant. local function high_form_verbal_noun(rad12, rad34, rad5) return q(_I, rad12, I, rad34, AA, rad5) end -- Populate a sound or final-weak verb for any of the various high-numbered augmented forms (form VII and up) that -- have up to 5 consonants in two clusters in the stem and the same pattern of vowels between. Some of these -- consonants in certain verb parts are w's, which leads to apparent anomalies in certain stems of these parts, but -- these anomalies are handled automatically in postprocessing, where we resolve sequences of iwC -> īC, uwC -> ūC, -- w + sukūn + w -> w + shadda. -- RAD12 is the first consonant cluster (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the -- final consonant. local function make_high_form_sound_final_weak_verb(base, vowel_spec, rad12, rad34, rad5) local final_weak = is_final_weak(base, vowel_spec) local vn = high_form_verbal_noun(rad12, rad34, final_weak and HAMZA or rad5) -- various stem bases local nonpast_stem_base = q(rad12, A, rad34) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad12, U, rad34) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end local function form_vii_nrad1(base, rad1) if base.reduced then if not req(rad1, M) then error(("Internal error: Form VII first radical %s is not م but .reduced specified; should have been caught earlier"): format(rget(rad1))) end return M .. SH else return q("نْ", rad1) end end -- Make form VII sound or final-weak verb. local function make_form_vii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, form_vii_nrad1(base, rad1), rad2, rad3) end conjugations["VII-sound"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-final-weak"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, Y, rad3) -- various stem bases local nonpast_stem_base = nrad1 local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(nrad1, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Return Form VIII verbal noun. local function form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad3) local final_weak = is_final_weak(base, vowel_spec) rad3 = final_weak and HAMZA or rad3 return {high_form_verbal_noun(vowel_spec.form_viii_assim, rad2, rad3)} end -- Make form VIII sound or final-weak verb. local function make_form_viii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِتَّخَذَ if axadh_radicals(rad1, rad2, rad3) then base.irregular = true rad1 = T end make_high_form_sound_final_weak_verb(base, vowel_spec, vowel_spec.form_viii_assim, rad2, rad3) end conjugations["VIII-sound"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-final-weak"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, Y, rad3) -- various stem bases local nonpast_stem_base = vowel_spec.form_viii_assim local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nonpast_stem_base) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VIII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(vowel_spec.form_viii_assim, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, vowel_spec.form_viii_assim, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-final-weak"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), rad3, rad3) end -- Populate a sound or final-weak verb for any of the various high-numbered -- augmented forms that have 5 consonants in the stem and the same pattern of -- vowels. Some of these consonants in certain verb parts are w's, which leads to -- apparent anomalies in certain stems of these parts, but these anomalies -- are handled automatically in postprocessing, where we resolve sequences of -- iwC -> īC, uwC -> ūC, w + sukūn + w -> w + shadda. local function make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, rad3, rad4, rad5) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), q(rad3, SK, rad4), rad5) end -- Make form X sound or final-weak verb. local function make_form_x_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِسْتَحْيَا (also اِسْتَحَى) local is_hayy = hayy_radicals(rad1, rad2, rad3) local variant = vowel_spec.variant or "both" if not is_hayy or variant == "long" or variant == "both" then make_high5_form_sound_final_weak_verb(base, vowel_spec, S, T, rad1, rad2, rad3) end if is_hayy and (variant == "short" or variant == "both") then base.irregular = true -- Add alternative entries to the verbal paradigms. Any duplicates are removed during addition. make_high_form_sound_final_weak_verb(base, vowel_spec, S .. SK .. T, rad1, rad3) end end conjugations["X-sound"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-final-weak"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(base.reduced and "اِسْ" or "اِسْتِ", rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(base.reduced and "اِسْ" or "اِسْتَ", rad1) local nonpast_stem_base = q(base.reduced and "سْ" or "سْتَ", rad1) local past_pass_stem_base = q(base.reduced and "اُسْ" or "اُسْتُ", rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["X-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q("اِسْتِ", rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q("اِسْتَ", rad1) local nonpast_stem_base = q("سْتَ", rad1) local past_pass_stem_base = q("اُسْتُ", rad1) -- make parts if base.altgem then inflect_tense(base, "past", "", {q(past_stem_base, A, rad2, SH), all_same = 1}, past_endings_ay_12_person_only) end make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, base.altgem and "[uncommon]" or nil) end conjugations["XI-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, II, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, AA) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, UU) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form XI final-weak, since already geminate in form; would behave as XI-sound. -- Make form XII sound or final-weak verb. local function make_form_xii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, rad2, rad3) end conjugations["XII-sound"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end conjugations["XII-final-weak"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end -- Make form XIII sound or final-weak verb. local function make_form_xiii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, W, rad3) end conjugations["XIII-sound"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end conjugations["XIII-final-weak"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end -- Make a form XIV or XV sound or final-weak verb. Last radical appears twice (if`anlala / yaf`anlilu) so if it were -- w or y you'd get if`anwā / yaf`anwī or if`anyā / yaf`anyī, i.e. unlike for most augmented verbs, the identity of -- the radical matters. local function make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local lastrad = base.verb_form == "XV" and Y or rad3 make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, lastrad) end conjugations["XIV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XIV-final-weak"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end -- Probably no form XV final-weak, since already final-weak in form; would behave as XV-sound. -- Make form Iq or IIq sound or final-weak verb. local function make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local vn = vform == "IIq" and q(TA, rad1, A, rad2, SK, rad3, (final_weak and IN or q(U, rad4))) or q(rad1, A, rad2, SK, rad3, (final_weak and AAH or q(A, rad4, AH))) local ta_pref = vform == "IIq" and TA or "" local tu_pref = vform == "IIq" and TU or "" -- various stem bases local past_stem_base = q(ta_pref, rad1, A, rad2, SK, rad3) local nonpast_stem_base = past_stem_base local past_pass_stem_base = q(tu_pref, rad1, U, rad2, SK, rad3) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["Iq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["Iq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end -- Make form IIIq sound or final-weak verb. local function make_form_iiiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, rad4) end conjugations["IIIq-sound"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIIq-final-weak"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IVq-sound"] = function(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, SK, rad4, AA, rad4) -- various stem bases local past_stem_base = q(_I, rad1, SK, rad2, A, rad3) local nonpast_stem_base = q(rad1, SK, rad2, A, rad3) local past_pass_stem_base = q(_U, rad1, SK, rad2, U, rad3) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form IVq final-weak, since already geminate in form; would behave as IVq-sound. end create_conjugations() ------------------------------------------------------------------------------- -- Guts of main conjugation function -- ------------------------------------------------------------------------------- -- Given form, weakness and radicals, check to make sure the radicals present are allowable for the weakness. Hamzas on -- alif/wāw/yāʾ seats are never allowed (should always appear as hamza-on-the-line), and various weaknesses have various -- strictures on allowable consonants. local function check_radicals(form, weakness, rad1, rad2, rad3, rad4) local function hamza_check(index, rad) if rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then error("Radical " .. index .. " is " .. rad .. " but should be ء (hamza on the line)") end end local function check_waw_ya(index, rad) if not is_waw_ya(rad) then error("Radical " .. index .. " is " .. rad .. " but should be و or ي") end end local function check_not_waw_ya(index, rad) if is_waw_ya(rad) then error("In a sound verb, radical " .. index .. " should not be و or ي") end end hamza_check(rad1) hamza_check(rad2) hamza_check(rad3) hamza_check(rad4) if weakness == "assimilated" or weakness == "assimilated+final-weak" then if rad1 ~= W then error("Radical 1 is " .. rad1 .. " but should be و") end -- don't check that non-assimilated form I verbs don't have wāw as their -- first radical because some form-I verbs exist where a first-radical wāw -- behaves as sound, e.g. wajuha yawjuhu "to be distinguished". end if weakness == "final-weak" or weakness == "assimilated+final-weak" then if rad4 then check_waw_ya(4, rad4) else check_waw_ya(3, rad3) end elseif vform_supports_final_weak(form) then -- non-final-weak verbs cannot have weak final radical if there's a corresponding -- final-weak verb category. I think this is safe. We may have problems with -- ḥayya/ḥayiya yaḥyā if we treat it as a geminate verb. if rad4 then check_not_waw_ya(4, rad4) else check_not_waw_ya(3, rad3) end end if weakness == "hollow" then check_waw_ya(2, rad2) -- don't check that non-hollow verbs in forms that support hollow verbs -- don't have wāw or yāʾ as their second radical because some verbs exist -- where a middle-radical wāw/yāʾ behaves as sound, e.g. form-VIII izdawaja -- "to be in pairs". end if weakness == "geminate" then if rad4 then error("Internal error: No geminate quadrilaterals, should not be seen") end if rad2 ~= rad3 then error("Weakness is geminate; radical 3 is " .. rad3 .. " but should be same as radical 2 " .. rad2) end elseif vform_supports_geminate(form) then -- non-geminate verbs cannot have second and third radical same if there's -- a corresponding geminate verb category. I think this is safe. We -- don't fuss over double wāw or double yāʾ because this could legitimately -- be a final-weak verb with middle wāw/yāʾ, treated as sound. if rad4 then error("Internal error: No quadrilaterals should support geminate verbs") end if rad2 == rad3 and not is_waw_ya(rad2) then error("Weakness is '" .. weakness .. "'; radical 2 and 3 are same at " .. rad2 .. " but should not be; consider making weakness 'geminate'") end end end -- array of substitutions; each element is a 2-entry array FROM, TO; do it -- this way so the concatenations only get evaluated once local postprocess_subs = { -- reorder short-vowel + shadda -> shadda + short-vowel for easier processing {"(" .. AIU .. ")" .. SH, SH .. "%1"}, ----------same letter separated by sukūn should instead use shadda--------- ------------happens e.g. in kun-nā "we were".----------------- {"(.)" .. SK .. "%1", "%1" .. SH}, ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {I .. W .. SK, II}, {I .. Y .. SK, II}, -- uw, uy -> ū (assimilated verbs) {U .. W .. SK, UU}, {U .. Y .. SK, UU}, -------------- final -yā uses tall alif not alif maqṣūra ------------------ {"(" .. Y .. SH .. "?" .. A .. ")" .. AMAQ, "%1" .. ALIF}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {HAMZA .. A .. HAMZA .. SK, HAMZA .. A .. ALIF}, {HAMZA .. I .. HAMZA .. SK, HAMZA .. I .. Y}, {HAMZA .. U .. HAMZA .. SK, HAMZA .. U .. W} } local postprocess_tr_subs = { {"ī([" .. vowels .. "y*])", "iy%1"}, {"ū([" .. vowels .. "w*])", "uw%1"}, {"(.)%*", "%1%1"}, -- implement shadda ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {"iw([^" .. vowels .. "w])", "ī%1"}, {"iy([^" .. vowels .. "y])", "ī%1"}, -- uw, uy -> ū (assimilated verbs) {"uw([^" .. vowels .. "w])", "ū%1"}, {"uy([^" .. vowels .. "y])", "ū%1"}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {"ʔaʔ(" .. NV .. ")", "ʔā%1"}, {"ʔiʔ(" .. NV .. ")", "ʔī%1"}, {"ʔuʔ(" .. NV .. ")", "ʔū%1"}, } -- Post-process verb parts to eliminate phonological anomalies. Many of the changes, particularly the tricky ones, -- involve converting hamza to have the proper seat. The rules for this are complicated and are documented on the -- [[w:Hamza]] Wikipedia page. In some cases there are alternatives allowed, and we handle them below by returning -- multiple possibilities. -- `keep_initial_w` exempts one sequence from the iw -> ī reduction below: a word-initial -- hamzat wasl + wāw + sukūn, which is how a form-I mithal that keeps its wāw spells its -- imperative (اِوْنَ، اِوْجَلْ). The reduction is right everywhere else and cannot simply be -- dropped from postprocess_subs -- it is what turns the form VIII mithal past اِوْتَعَدَ into -- اِيتَعَدَ, in the same word-initial position, so position alone doesn't separate the two -- cases. Only the caller knows the verb's form, so the exemption is decided there and -- carried in as a flag; here the sequence is parked on a placeholder across the -- substitutions and restored afterwards. See README "Findings" #10. local function postprocess_term(term, keep_initial_w) if term == "?" then return "?" end -- Add BORDER at text boundaries. term = BORDER .. term .. BORDER if keep_initial_w then term = rsub(term, BORDER .. ALIF .. I .. W .. SK, BORDER .. ALIF .. I .. KEEP_W_PH .. SK) end -- Do the main post-processing, based on the pattern substitutions in postprocess_subs. for _, sub in ipairs(postprocess_subs) do term = rsub(term, sub[1], sub[2]) end term = term:gsub(KEEP_W_PH, W) term = term:gsub(BORDER, "") if not rfind(term, HAMZA) then return term end term = term:gsub(HAMZA, HAMZA_PH) term = ar_utilities.process_hamza(term) if #term == 1 then term = term[1] end return term end local function postprocess_translit(translit) if translit == "?" then return "?" end -- Add BORDER at text boundaries. translit = BORDER .. translit .. BORDER -- Do the main post-processing, based on the pattern substitutions in postprocess_tr_subs. for _, sub in ipairs(postprocess_tr_subs) do translit = rsub(translit, sub[1], sub[2]) end translit = translit:gsub(BORDER, "") return translit end local function postprocess_forms(base) local converted_values = {} for slot, forms in pairs(base.forms) do local need_dedup = false for i, form in ipairs(forms) do local term = postprocess_term(form.form, base.keep_initial_w) local translit = form.translit and postprocess_translit(form.translit) or nil if term ~= form.form or translit ~= form.translit then need_dedup = true end converted_values[i] = {term, translit} end if need_dedup then local temp_dedup = {} for i = 1, #forms do local new_term, new_translit = unpack(converted_values[i]) if type(new_term) == "table" then for _, nt in ipairs(new_term) do local new_formobj = { form = nt, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end else local new_formobj = { form = new_term, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end end base.forms[slot] = temp_dedup.temp end end end local function process_slot_overrides(base) for slot, forms in pairs(base.slot_overrides) do local existing_values = base.forms[slot] base.forms[slot] = nil for _, form in ipairs(forms) do -- + in active participle for form I requests slot ap1 if form.form == "+" and (base.verb_form ~= "I" or slot ~= "ap") then if not existing_values then error(("Slot '%s' requested the default value but no such value available"):format(slot)) end -- We maintain an invariant that no two slots share a form object (although they may share the footnote -- lists inside the form objects). However, there is no need to copy the form objects here because there -- is a one-to-one correspondence between slots and slot overrides, i.e. you can't have a default value -- go into two slots. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) elseif default_indicator_to_active_participle_slot[form.form] then if form.form == "++" then if slot ~= "vn" and slot ~= "ap" and slot ~= "pp" then error(("Secondary default value request '++' only applicable to verbal nouns and pariciples, but found in slot '%s'"): format(slot)) end else if slot ~= "ap" then error(("Secondary default value request '%s' only applicable to active pariciples, but found in slot '%s'"): format(form.form, slot)) end end local secondary_default_slot = slot == "vn" and "vn2" or slot == "pp" and "pp2" or default_indicator_to_active_participle_slot[form.form] local existing_values = base.forms[secondary_default_slot] if not existing_values then error(("Slot '%s' requested a secondary default value using '%s' but no such value available"): format(slot, form.form)) end -- See comment above about the lack of need to copy the form objects. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) -- To make sure there aren't shared form objects. base.forms[secondary_default_slot] = nil else insert_form_or_forms(base, slot, form, "allow overrides", form.uncertain) end end end -- Now, for non-stative form-I verbs, fill the active participle slot from ap1 unless it should be missing (e.g. -- passive-only or user specified 'ap:-'). if base.verb_form == "I" and not base.forms.ap and base.forms.ap1 and not skip_slot(base, "ap") then local saw_non_stative = false for _, vowel_spec in ipairs(base.conj_vowels) do if req(vowel_spec.past, A) then saw_non_stative = true break end end if saw_non_stative then base.forms.ap = base.forms.ap1 -- To make sure there aren't shared form objects. base.forms.ap1 = nil end end end local function handle_lemma_linked(base) -- Compute linked versions of potential lemma slots, for use in {{ar-verb}}. We substitute the original lemma -- (before removing links) for forms that are the same as the lemma, if the original lemma has links. for _, slot in ipairs(export.potential_lemma_slots) do if base.forms[slot] then insert_form_or_forms(base, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function add_missing_links_to_forms(base) -- Any forms without links should get them now. Redundant ones will be stripped later. for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do if not form.form:find("%[%[") then form.form = "[[" .. form.form .. "]]" end end end end local function conjugate_verb(base) construct_stems(base) for _, vowel_spec in ipairs(base.conj_vowels) do -- Reconstruct conjugation type from verb form and (possibly inferred) weakness. conj_type = base.verb_form .. "-" .. vowel_spec.weakness -- Check that the conjugation type is recognized. if not conjugations[conj_type] then error("Unknown conjugation type '" .. conj_type .. "'") end -- The way the conjugation functions work is they always add entries to the appropriate parts of the paradigm -- (each of which is an array), rather than setting the values. This makes it possible to call more than one -- conjugation function and essentially get a paradigm of the "either A or B" kind. Doing this may insert -- duplicate entries into a particular paradigm part, but this is not a problem because we check for duplicate -- entries when adding them, and don't insert in that case. conjugations[conj_type](base, vowel_spec) end postprocess_forms(base) process_slot_overrides(base) -- This should happen before add_missing_links_to_forms() so that the comparison `form == base.lemma` in -- handle_lemma_linked() works correctly and compares unlinked forms to unlinked forms. handle_lemma_linked(base) process_addnote_specs(base) if not base.alternant_multiword_spec.args.noautolinkverb then add_missing_links_to_forms(base) end end local function parse_indicator_spec(angle_bracket_spec) -- Store the original angle bracket spec so we can reconstruct the overall conj spec with the lemma(s) in them. local base = { angle_bracket_spec = angle_bracket_spec, conj_vowels = {}, root_consonants = {}, user_stem_overrides = {}, user_slot_overrides = {}, slot_explicitly_missing = {}, slot_uncertain = {}, slot_override_uses_default = {}, addnote_specs = {}, } local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) local segments = put.parse_multi_delimiter_balanced_segment_run(inside, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- The first dot-separated element must specify the verb form, e.g. IV or IIq. If the form is I, it needs to include -- the the past and non-past vowels, e.g. I/a~u for kataba ~ yaktubu. More than one vowel can be given, -- comma-separated, and more than one past~non-past pair can be given, slash-separated, e.g. I/a,u~u/i~a for form I -- كمل, which can be conjugated as kamala/kamula ~ yakmulu or kamila ~ yakmalu. An individual vowel spec must be one -- of a, i or u and in general (a) at least one past~non-past pair most be given, and (b) both past and non-past -- vowels must be given even though sometimes the vowel can be determined from the unvocalized form. An exception is -- passive-only verbs, where the vowels can't in general be determined (except indirectly in some cases by looking -- at an associated non-passive verb); in that case, the vowel~vowel spec can left out. local slash_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_groups[1], "/") local form_spec = slash_separated_groups[1] base.form_footnotes = fetch_footnotes(form_spec) if form_spec[1] == "" then parse_err("Missing verb form") end if not allowed_vforms_with_weakness_set[form_spec[1]] then parse_err(("Unrecognized verb form '%s', should be one of %s"):format( form_spec[1], list_to_text(allowed_vforms, nil, " or "))) end if form_spec[1]:find("%-") then base.verb_form, base.explicit_weakness = form_spec[1]:match("^(.-)%-(.*)$") else base.verb_form = form_spec[1] end if #slash_separated_groups > 1 then if base.verb_form ~= "I" then parse_err(("Past~non-past vowels can only be specified when verb form is I, but saw form '%s'"):format( base.verb_form)) end for i = 2, #slash_separated_groups do local slash_separated_group = slash_separated_groups[i] local tilde_separated_groups = put.split_alternating_runs_and_strip_spaces(slash_separated_group, "~") if #tilde_separated_groups ~= 2 then parse_err(("Expected two tilde-separated vowel specs: %s"):format(table.concat(slash_separated_group))) end local function parse_conj_vowels(tilde_separated_group, vtype) local conj_vowel_objects = {} local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(tilde_separated_group, ",") for _, comma_separated_group in ipairs(comma_separated_groups) do local conj_vowel = comma_separated_group[1] if conj_vowel ~= "a" and conj_vowel ~= "i" and conj_vowel ~= "u" then parse_err(("Expected %s conjugation vowel '%s' to be one of a, i or u in %s"):format( vtype, conj_vowel, table.concat(slash_separated_group))) end conj_vowel = dia[conj_vowel] local conj_vowel_footnotes = fetch_footnotes(comma_separated_group) -- Try to use strings when possible as it makes q() significantly more efficient. if conj_vowel_footnotes then table.insert(conj_vowel_objects, {form = conj_vowel, footnotes = conj_vowel_footnotes}) else table.insert(conj_vowel_objects, conj_vowel) end end return conj_vowel_objects end local conj_vowel_spec = { past = parse_conj_vowels(tilde_separated_groups[1], "past"), nonpast = parse_conj_vowels(tilde_separated_groups[2], "non-past"), } table.insert(base.conj_vowels, conj_vowel_spec) end end for i = 2, #dot_separated_groups do local dot_separated_group = dot_separated_groups[i] local first_element = dot_separated_group[1] if first_element == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, {slot_specs = slot_specs, footnotes = spec_and_footnotes}) elseif first_element:find("^var:") then if #dot_separated_group > 1 then parse_err(("Can't attach footnotes to 'var:' spec '%s'"):format(first_element)) end base.variant = first_element:match("^var:(.*)$") elseif first_element:find("^I+V?:") then local root_cons, root_cons_value = first_element:match("^(I+V?):(.*)$") local root_index if root_cons == "I" then root_index = 1 elseif root_cons == "II" then root_index = 2 elseif root_cons == "III" then root_index = 3 elseif root_cons == "IV" then root_index = 4 if not base.verb_form:find("q$") then parse_err(("Can't specify root consonant IV for non-quadriliteral verb form '%s': %s"):format( base.verb_form, first_element)) end end local cons, translit = root_cons_value:match("^(.*)//(.*)$") if not cons then cons = root_cons_value end local root_footnotes = fetch_footnotes(dot_separated_group) if not translit and not root_footnotes then base.root_consonants[root_index] = cons else base.root_consonants[root_index] = {form = cons, translit = translit, footnotes = root_footnotes} end elseif first_element:find("^[a-z][a-z0-9_]*:") then local slot_or_stem, remainder = first_element:match("^(.-):(.*)$") dot_separated_group[1] = remainder local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_group, "[,،]") if overridable_stems[slot_or_stem] then if base.user_stem_overrides[slot_or_stem] then parse_err("Overridable stem '" .. slot_or_stem .. "' specified twice") end base.user_stem_overrides[slot_or_stem] = overridable_stems[slot_or_stem](comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) else -- assume a form override; we validate further later when the possible slots are available if base.user_slot_overrides[slot_or_stem] then parse_err("Form override '" .. slot_or_stem .. "' specified twice") end base.user_slot_overrides[slot_or_stem] = allow_multiple_values_for_override(comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}, "is form override") end elseif indicator_flags[first_element] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base[first_element] then parse_err("Spec '" .. first_element .. "' specified twice") end base[first_element] = true else local passive, uncertain = first_element:match("^(.*)(%?)$") passive = passive or first_element uncertain = not not uncertain if passive_types[passive] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. passive .. "' spec") end if base.passive then parse_err("Value for passive type specified twice") end base.passive = passive base.passive_uncertain = uncertain else parse_err("Unrecognized spec '" .. first_element .. "'") end end end return base end -- Normalize all lemmas, substituting the pagename for blank lemmas and adding links to multiword lemmas. local function normalize_all_lemmas(alternant_multiword_spec, head) -- (1) Add links to all before and after text. Remember the original text so we can reconstruct the verb spec later. if not alternant_multiword_spec.args.noautolinktext then iut.add_links_to_before_and_after_text(alternant_multiword_spec, "remember original") end -- (2) Remove any links from the lemma, but remember the original form so we can use it below in the 'lemma_linked' -- form. iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = head end base.user_specified_lemma = base.lemma base.lemma = m_links.remove_links(base.lemma) base.user_specified_verb = base.lemma base.verb = base.user_specified_verb local linked_lemma if alternant_multiword_spec.args.noautolinkverb or base.user_specified_lemma:find("%[%[") then linked_lemma = base.user_specified_lemma else -- Add links to the lemma so the user doesn't specifically need to, since we preserve -- links in multiword lemmas and include links in non-lemma forms rather than allowing -- the entire form to be a link. linked_lemma = iut.add_links(base.user_specified_lemma) end base.linked_lemma = linked_lemma end) end --W: Lexical exceptions — yāʾ-middle roots whose Form IV (أفعل) keeps the yāʾ SOUND -- instead of undergoing the regular إعلال to a hollow verb (أَفْيَلَ, not أَفَالَ). -- These are attested verbs (not the صفة مشبهة like أَخْيَف/خَيْفاء); each is sourced below. -- Only Form IV is affected; forms VII/VIII/X of these roots remain hollow. -- Keyed by rad1..rad2..rad3. local SOUND_FORM_IV_ROOTS = { ["خيل"] = true, -- أَخْيَلَ: أخيلت السماءُ تهيأت للمطر — المعجم الوسيط ج1 ص266 (وبه أَخالت أيضًا) ["غيل"] = true, -- أَغْيَلَ: أغيلته فهي مُغْيِل، سقته الغَيْل — لسان العرب ج11 ص111 (وبه أغالت أيضًا) ["حيج"] = true, -- أَحْيَجَ: أحيجت الأرضُ، على خلاف القياس — تاج العروس ج5 ص500 ["حين"] = true, -- أَحْيَنَ: أحين القومُ آن لهم أن يبلغوا ما أملوه — المعجم الوسيط ج1 ص212 ["خيف"] = true, -- أَخْيَفَ: أخيف الحاجُّ نزلوا خيف منى — كتاب الأفعال لابن القوطية ص35 ["ريف"] = true, -- أَرْيَفَ: أريفت الأرضُ إريافًا (خصبت) — المحيط في اللغة ج10 ص256 ["زين"] = true, -- أَزْيَنَ: أزينت الأرضُ، حسّنها عشبها — مقاييس اللغة ج3 ص41 } --W: Lexical exceptions — hollow roots in the Form I فَعُلَ pattern (past~non-past u~u) -- that keep the middle radical SOUND instead of contracting to a long vowel (هَيُؤَ / -- يَهْيُؤُ, not هَاءَ / يَهُوءُ). This is not the general rule for u~u hollow verbs -- -- طَالَ / يَطُولُ (ط-و-ل) contracts as normal -- so each entry here is a specific -- attested exception, not a phonological class. -- Keyed by rad1..rad2..rad3. -- Keyed with bare hamza (ء) for rad3, matching normalize_root()'s canonicalization of root radicals -- (HAMZA_ON_ALIF etc. all fold to HAMZA) -- the raw root "هيأ" normalizes to radicals ه, ي, ء. local SOUND_FORM_I_UU_ROOTS = { ["هي" .. HAMZA] = true, -- هَيُؤَ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان، ط٢، ١٩٩٥، ص٢٠٣ } -- Determine weakness from radicals. Used when root given in place of lemma (e.g. for {{ar-verb forms}}). -- `past_vowel`/`nonpast_vowel`, if given, are the past/non-past vowel of a form-I verb (a string or -- footnote-bearing form object, per `req()`); they let SOUND_FORM_I_UU_ROOTS single out the specific -- vowel pattern under which a hollow root is attested as sound, without affecting its other patterns -- (e.g. a root could still contract normally under a different past~non-past pairing). local function weakness_from_radicals(form, rad1, rad2, rad3, rad4, past_vowel, nonpast_vowel) local weakness = nil local quadlit = form:find("q$") -- If weakness unspecified, derive from radicals. if not quadlit then if is_waw_ya(rad3) and rad1 == W and form == "I" then weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated+final-weak" or "final-weak" elseif is_waw_ya(rad3) and vform_supports_final_weak(form) then weakness = "final-weak" elseif rad2 == rad3 and vform_supports_geminate(form) then weakness = "geminate" elseif is_waw_ya(rad2) and vform_supports_hollow(form) then --W: Both wāw (و) and yāʾ (ي) in the middle position create hollow verbs, in form I -- (قَالَ from ق-و-ل, بَاعَ from ب-ي-ع) and in the augmented forms IV, VII, VIII, X -- (أَتَاسَ from ت-ي-س, أَبَانَ from ب-ي-ن, أَطَاحَ from ط-ي-ح — معجم متن اللغة). if form == "IV" and rad2 == Y and SOUND_FORM_IV_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form IV keeps the yāʾ sound (أَفْيَلَ); see SOUND_FORM_IV_ROOTS. weakness = "sound" elseif form == "I" and past_vowel and nonpast_vowel and req(past_vowel, U) and req(nonpast_vowel, U) and SOUND_FORM_I_UU_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form I فَعُلَ keeps the middle radical sound (هَيُؤَ); see -- SOUND_FORM_I_UU_ROOTS. Gated to u~u specifically since that's the attested pattern. weakness = "sound" else weakness = "hollow" end elseif rad1 == W and form == "I" then -- Vowel-conditioned, like the lemma path below: a wāw-initial form-I verb only -- elides its wāw under a kasra (or lowered-kasra) non-past. Before this, the two -- inference paths in this module disagreed -- infer_radicals() kept the wāw for -- i~a and u~u while this one dropped it for every vowel pattern. weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated" or "sound" else weakness = "sound" end else if is_waw_ya(rad4) then weakness = "final-weak" else weakness = "sound" end end return weakness end -- Join the infixed tāʔ (ت) to the first radical in form VIII verbs. This may cause assimilation of the tāʔ to the -- radical or in some cases the radical to the tāʔ. Used when a root is supplied instead of a lemma (which already has -- the appropriate assimilation in it). local function form_viii_join_ta(rad) if rad == W or rad == Y or rad == "ت" then return "تّ" elseif rad == "د" then return "دّ" elseif rad == "ث" then return "ثّ" elseif rad == "ذ" then return "ذّ" elseif rad == "ز" then return "زْد" elseif rad == "ص" then return "صْط" elseif rad == "ض" then return "ضْط" elseif rad == "ط" then return "طّ" elseif rad == "ظ" then return "ظّ" else return rad .. SK .. "ت" end end local function detect_indicator_spec(base) base.forms = {} base.stem_overrides = {} base.slot_overrides = {} if not base.conj_vowels[1] then -- These may be converted to inferred vowels. If not, we throw an error if form I and not passive-only. base.conj_vowels = {{ past = "-", nonpast = "-", }} else -- If multiple vowels specified for a given vowel type (e.g. a,u~u), expand so that each spec in local expansion = {} for _, spec in ipairs(base.conj_vowels) do for _, past in ipairs(spec.past) do for _, nonpast in ipairs(spec.nonpast) do table.insert(expansion, {past = past, nonpast = nonpast}) end end end base.conj_vowels = expansion end local vform = base.verb_form -- check for quadriliteral form (Iq, IIq, IIIq, IVq) base.quadlit = not not vform:find("q$") -- Infer radicals as necessary. We infer a separate set of radicals for each past~non-past vowel combination because -- they may be different (particularly with form-I hollow verbs). for _, vowel_spec in ipairs(base.conj_vowels) do -- NOTE: rad1, rad2, etc. refer to user-specified radicals, which are formobj tables that optionally specify an -- explicit manual translit, whereas ir1, ir2, etc. refer to inferred radicals, which are either strings or -- lists of possible radicals. local rads = base.root_consonants local rad1, rad2, rad3, rad4 = rads[1], rads[2], rads[3], rads[4] -- Default any unspecified radicals to radicals determined from the headword. The returned radicals may be -- lists of possible radicals, where the first radical should be chosen if the user didn't explicitly specify a -- radical but all are allowed. If `ambig = true` is set in the table, the radical is considered ambiguous and -- categories won't be created for weak radicals. local weakness, ir1, ir2, ir3, ir4 if vform ~= "none" then ir1, ir2, ir3 = rmatch(base.lemma, "^([^_])_([^_])_([^_])$") if not ir1 then ir1, ir2, ir3, ir4 = rmatch(base.lemma, "^([^_])_([^_])_([^_])_([^_])$") end if ir1 then -- root given instead of lemma weakness = weakness_from_radicals(vform, ir1, ir2, ir3, ir4, vowel_spec.past, vowel_spec.nonpast) if vform == "VIII" then vowel_spec.form_viii_assim = form_viii_join_ta(ir1) end else local ret = export.infer_radicals { headword = base.lemma, vform = vform, passive = base.passive, past_vowel = vowel_spec.past, nonpast_vowel = vowel_spec.nonpast, is_reduced = base.reduced, } weakness, ir1, ir2, ir3, ir4 = ret.weakness, ret.rad1, ret.rad2, ret.rad3, ret.rad4 vowel_spec.form_viii_assim = ret.form_viii_assim vowel_spec.past = ret.past_vowel vowel_spec.nonpast = ret.nonpast_vowel vowel_spec.variant = base.variant or ret.variant end end -- For most ambiguous radicals, the choice of radical doesn't matter because it doesn't affect the conjugation -- one way or another. For form I hollow verbs, however, it definitely does. In fact, the choice of radical is -- critical even beyond the past and non-past vowels because it affects the form of the passive participle. So, -- check for this and signal an error if the radical could not be inferred and is not given explicitly. if vform == "I" and type(ir2) == "table" and ir2.need_radical and not rad2 then error("Unable to guess middle radical of hollow form I verb; need to specify radical explicitly") end if vform == "I" and not is_passive_only(base.passive) and ( rget(vowel_spec.past) == "-" or rget(vowel_spec.nonpast) == "-") then error("Form I verb that isn't passive-only or final-weak must have past~non-past vowels specified") end -- Convert ambiguous radicals. local function regularize_inferred_radical(rad) if type(rad) == "table" then if rad.ambig then return {form = rad[1], ambig = true} else return rad[1] end else return rad end end -- Return the appropriate radical at index `index` (1 through 4), based either on the user-specified radical -- `user_radical` or (if unspecified) `inferred_radical`, inferred from the unvocalized lemma. Two values are -- returned, the "regularized" version of the radical (where ambiguous inferred radicals are converted to their -- most likely actual radical) and the non-regularized version. The returned values are form objects rather than -- strings. local function fetch_radical(user_radical, inferred_radical, index) if not user_radical then return regularize_inferred_radical(inferred_radical), inferred_radical else local rad_formval = rget(user_radical) if type(inferred_radical) == "table" then local allowed_radical_set = m_table.listToSet(inferred_radical) if not allowed_radical_set[rad_formval] then error(("For lemma %s, radical %s ambiguously inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, list_to_text(inferred_radical, nil, " or "), rad_formval)) end elseif rad_formval ~= inferred_radical then error(("For lemma %s, radical %s inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, inferred_radical, rad_formval)) end return user_radical, user_radical end end if vform ~= "none" then vowel_spec.rad1, vowel_spec.unreg_rad1 = fetch_radical(rad1, ir1, 1) vowel_spec.rad2, vowel_spec.unreg_rad2 = fetch_radical(rad2, ir2, 2) vowel_spec.rad3, vowel_spec.unreg_rad3 = fetch_radical(rad3, ir3, 3) if base.quadlit then vowel_spec.rad4, vowel_spec.unreg_rad4 = fetch_radical(rad4, ir4, 4) end end if vform == "I" then -- If explicit weakness given using 'I-sound' or 'I-assimilated', we may need to adjust the inferred weakness. if base.explicit_weakness == "sound" then if weakness == "assimilated" then weakness = "sound" elseif weakness == "assimilated+final-weak" then -- Verbs like waniya~yawnā "to be faint; to languish" (although the defaults should handle this -- correctly) weakness = "final-weak" else error(("Can't specify form 'I-sound' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness == "assimilated" then if weakness == "sound" then -- i~a verbs like waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; -- waṯiʔa~yaṯaʔu "to get bruised, to be sprained", which would default to sound. weakness = "assimilated" elseif weakness == "final-weak" then -- For completeness; not clear if any verbs occur where this is needed. (There are plenty of -- assimilated+final-weak verbs but the defaults should take care of them.) weakness = "assimilated+final-weak" else error(("Can't specify form 'I-assimilated' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness then error(("Internal error: Unrecognized value '%s' for base.explicit_weakness"):format(base.explicit_weakness)) end elseif vform == "none" then weakness = base.explicit_weakness elseif base.explicit_weakness then error(("Internal error: Explicit weakness should not be specifiable except with forms I and none, but saw explicit weakness '%s' with verb form '%s'"): format(base.explicit_weakness, vform)) end vowel_spec.weakness = weakness if vform ~= "none" then -- Error if radicals are wrong given the weakness. More likely to happen if the weakness is explicitly given -- rather than inferred. Will also happen if certain incorrect letters are included as radicals e.g. hamza on -- top of various letters, alif maqṣūra, tā' marbūṭa. check_radicals(vform, weakness, rget(vowel_spec.rad1), rget(vowel_spec.rad2), rget(vowel_spec.rad3), base.quadlit and rget(vowel_spec.rad4) or nil) end -- Check the variant value. local form_iii_vi_geminate = (vform == "III" or vform == "VI") and rget(vowel_spec.rad2) == rget(vowel_spec.rad3) and not req(vowel_spec.rad2, Y) local hayy_i_x = hayy_radicals(vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3) and (vform == "I" or vform == "X") if form_iii_vi_geminate or hayy_i_x then if vowel_spec.variant and vowel_spec.variant ~= "long" and vowel_spec.variant ~= "short" and vowel_spec.variant ~= "both" then error(("For form-III/VI geminate verb or form-I/X verb with ح-ي-ي radicals, saw unrecognized 'var:%s' value; should be 'var:long', 'var:short' or 'var:both'"):format( vowel_spec.variant)) end elseif vowel_spec.variant then error(("Variant value 'var:%s' not allowed in this context"):format(vowel_spec.variant)) end end -- If form I, regroup expanded vowels for display purposes. if vform == "I" then local group_by_past = {} for _, vowel_spec in ipairs(base.conj_vowels) do m_table.insertIfNot(group_by_past, { past = undia[rget(vowel_spec.past)], nonpasts = {undia[rget(vowel_spec.nonpast)]}, }, { key = function(obj) return obj.past end, combine = function(obj1, obj2) for _, nonpast in ipairs(obj2.nonpasts) do m_table.insertIfNot(obj1.nonpasts, nonpast) end end, }) end local group_by_nonpast = {} for _, vowel_spec in ipairs(group_by_past) do m_table.insertIfNot(group_by_nonpast, { pasts = {vowel_spec.past}, nonpasts = vowel_spec.nonpasts, }, { key = function(obj) return obj.nonpasts end, combine = function(obj1, obj2) for _, past in ipairs(obj2.pasts) do m_table.insertIfNot(obj1.pasts, past) end end, }) end base.grouped_conj_vowels = group_by_nonpast end -- Set value of passive. If not specified, default is yes for forms II, III, IV and Iq; no but uncertainly for -- forms VII, IX, XI - XV and IIIq - IVq, as well as form I with past vowel u; impersonal but uncertainly for form -- V, VI, X and IIq, as well as form I with past vowel i; and yes but uncertainly for the remainder (form I with -- past vowel only a and form VIII). if not base.passive then base.passive_defaulted = true -- Temporary tracking for defaulted passives by verb form, weakness and (for form I) past/non-past vowels. track_if_ar_conj(base, "passive-defaulted/" .. vform) for _, vowel_spec in ipairs(base.conj_vowels) do track_if_ar_conj(base, "passive-defaulted/" .. vform.. "/" .. vowel_spec.weakness) if vform == "I" then --W: use rget(); the vowel is a form object when the user attached a footnote -- (e.g. <I/a[نادر]~u>), and undia[<table>] is nil, which crashes format() on Lua 5.1. local past_nonpast = ("%s~%s"):format(undia[rget(vowel_spec.past)], undia[rget(vowel_spec.nonpast)]) track_if_ar_conj(base, "passive-defaulted/I/" .. past_nonpast) track_if_ar_conj(base, "passive-defaulted/I/" .. vowel_spec.weakness .. "/" .. past_nonpast) end end if vform_probably_full_passive(vform) then base.passive = "pass" else base.passive_uncertain = true for _, vowel_spec in ipairs(base.conj_vowels) do if vform_probably_no_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "nopass" break elseif vform_probably_impersonal_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "ipass" break end end base.passive = base.passive or "pass" end end -- NOTE: Currently there are no built-in stems or form overrides for Arabic; this code is inherited from -- [[Module:ca-verb]], where such things do exist, and is kept for generality in case we decide in the future to -- implement such things. -- Override built-in verb stems and overrides with user-specified ones. for stem, values in pairs(base.user_stem_overrides) do base.stem_overrides[stem] = values end for slot, values in pairs(base.user_slot_overrides) do if not base.alternant_multiword_spec.verb_slots_map[slot] then error("Unrecognized override slot '" .. slot .. "': " .. base.angle_bracket_spec) end if export.unsettable_slots_set[slot] then error("Slot '" .. slot .. "' cannot be set using an override: " .. base.angle_bracket_spec) end if skip_slot(base, slot, "allow overrides") then error("Override slot '" .. slot .. "' would be skipped based on the passive, 'noimp' and/or 'no_nonpast' settings: " .. base.angle_bracket_spec) end base.slot_overrides[slot] = values end if base.verb_form == "none-final-weak" then for _, stem_type in ipairs { "past", "past_pass", "nonpast", "nonpast_pass" } do if base.stem_overrides[stem_type .. "_c"] or base.stem_overrides[stem_type .. "_v"] then error(("Specify past stem for verb type 'none-final-weak' using '%s:...' not '%s_c:...' or '%s_v:...'"): format(stem_type, stem_type, stem_type)) end end for _, stem_type in ipairs { "past", "nonpast" } do if base.stem_overrides[stem_type] or not base.stem_overrides[stem_type .. "_final_weak_vowel"] then error(("For verb type 'none-final-weak', if '%s:...' specified, so must '%s_final_weak_vowel:...'"): format(stem_type, stem_type)) end end end end local function detect_all_indicator_specs(alternant_multiword_spec) add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_forms = {} -- This means at least one individual base had the slot marked as explicitly missing. Another base (e.g. when -- there are multiple alternants) might have a value for the slot. In practice, we only respect this when there are -- no overall values in the slot and `slot_uncertain` isn't set; in this case, we display "no ..." for the slot -- instead of simply not displaying anything for the slot. alternant_multiword_spec.slot_explicitly_missing = {} -- This means at least one individual base had no values for the slot and the slot marked as explicitly uncertain. -- Note that this is different from a value being present but marked as uncertain (e.g. if an override was given -- with a ? after it); this causes the form object for the value to have `uncertain = true` set. If there are no -- overall values in the slot and `slot_uncertain` is set, we display this in the headword. alternant_multiword_spec.slot_uncertain = {} iut.map_word_specs(alternant_multiword_spec, function(base) -- So arguments, etc. can be accessed. WARNING: Creates circular reference. base.alternant_multiword_spec = alternant_multiword_spec detect_indicator_spec(base) if not base.nocat then m_table.insertIfNot(alternant_multiword_spec.verb_forms, base.verb_form) end if base.passive then alternant_multiword_spec.passive = base.passive end if base.passive_uncertain then alternant_multiword_spec.passive_uncertain = true end for slot, _ in pairs(base.slot_explicitly_missing) do alternant_multiword_spec.slot_explicitly_missing[slot] = true end end) end local function determine_slot_uncertainty_from_forms(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) -- If no verbal noun and verb form is not 'none' (manually-specified stems) — which currently only happens for -- form I — and the verbal noun wasn't explicitly indicated as missing using <vn:->, we assume it's just -- unknown/unspecified rather than missing. Same with active participles. for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not base.forms[uncertain_slot] and vform ~= "none" and not skip_slot(base, uncertain_slot) then base.slot_uncertain[uncertain_slot] = true end end -- Propagate slot uncertainty up. Currently only the verbal noun can have this set but we write the code -- generally. for slot, _ in pairs(base.slot_uncertain) do alternant_multiword_spec.slot_uncertain[slot] = true end end) -- If slot is uncertain and has no value, explicitly set its value to "?". for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not alternant_multiword_spec.forms[uncertain_slot] and alternant_multiword_spec.slot_uncertain[uncertain_slot] then alternant_multiword_spec.forms[uncertain_slot] = {{form = "?"}} end end end -- Determine certain properties of the verb from the overall forms, such as whether the verb is active-only or -- passive-only, is impersonal, lacks an imperative, etc. local function determine_verb_properties_from_forms(alternant_multiword_spec) alternant_multiword_spec.has_active = false alternant_multiword_spec.has_passive = false alternant_multiword_spec.has_non_impers_active = false alternant_multiword_spec.has_non_impers_passive = false alternant_multiword_spec.has_imp = false alternant_multiword_spec.has_past = false alternant_multiword_spec.has_nonpast = false for slot, _ in pairs(alternant_multiword_spec.forms) do if slot == "ap" or slot:find("[123]") and not slot:find("_pass") then alternant_multiword_spec.has_active = true end if slot == "pp" or slot:find("[123]") and slot:find("_pass") then alternant_multiword_spec.has_passive = true end if slot:find("[123]") and not slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_active = true end if slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_passive = true end if slot:find("^imp_") then alternant_multiword_spec.has_imp = true end if slot:find("^past_") then alternant_multiword_spec.has_past = true end if slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss_") then alternant_multiword_spec.has_nonpast = true end end end local function add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) -- Useful e.g. in constructing suppletive verbs out of parts. For a verb like جاء or أتى whose imperative comes -- from the unrelated verb تعالى, we don't want the latter verb showing up in categories or annotations. if base.nocat then return end local vform = base.verb_form if vform ~= "none" then insert_ann("form", vform) insert_cat("form-" .. vform .. " verbs") --W: Add morphological pattern corresponding to the form local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[vform] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end if base.reduced then insert_ann("reduced", "reduced") if vform ~= "none" then insert_cat("form-" .. vform .. " reduced verbs") end end if base.quadlit then insert_cat("verbs with quadriliteral roots") end if base.passive_defaulted then insert_cat("verbs with defaulted passive") end for _, vowel_spec in ipairs(base.conj_vowels) do local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local weakness = vowel_spec.weakness -- We have to distinguish weakness by form and weakness by conjugation. Weakness by form merely indicates the -- presence of weak letters in certain positions in the radicals. Weakness by conjugation is related to how the -- verbs are conjugated. For example, form-II verbs that are "hollow by form" (middle radical is wāw or yāʾ) are -- conjugated as sound verbs. Another example: form-I verbs with initial wāw are "assimilated by form" and most -- are assimilated by conjugation as well, but a few are sound by conjugation, e.g. wajuha yawjuhu "to be -- distinguished" (rather than wajuha yajuhu); similarly for some hollow-by-form verbs in various forms, e.g. -- form VIII izdawaja yazdawiju "to be in pairs" (rather than izdāja yazdāju). Categories referring to weakness -- always refer to weakness by conjugation; weakness by form is distinguished only by categories such as -- [[:Category:Arabic form-III verbs with و as second radical]]. insert_ann("weakness", weakness) if vform ~= "none" then insert_cat(("%s form-%s verbs"):format(weakness, vform)) end local function radical_is_ambiguous(rad) return type(rad) == "table" and rad.ambig end local function radical_is_unambiguous_weak(rad) return not radical_is_ambiguous(rad) and (is_waw_ya(rad) or req(rad, HAMZA)) end if vform ~= "none" then local ur1, ur2, ur3, ur4 = vowel_spec.unreg_rad1, vowel_spec.unreg_rad2, vowel_spec.unreg_rad3, vowel_spec.unreg_rad4 -- Create headword categories based on the radicals. Do the following before -- converting the Latin radicals into Arabic ones so we distinguish -- between ambiguous and non-ambiguous radicals. if radical_is_ambiguous(ur1) or radical_is_ambiguous(ur2) or radical_is_ambiguous(ur3) or ur4 and radical_is_ambiguous(ur4) then insert_cat("verbs with ambiguous radicals") end if radical_is_unambiguous_weak(ur1) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur1) .. " as first radical") end if radical_is_unambiguous_weak(ur2) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur2) .. " as second radical") end if radical_is_unambiguous_weak(ur3) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur3) .. " as third radical") end if ur4 and radical_is_unambiguous_weak(ur4) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur4) .. " as fourth radical") end end end if vform == "I" and not is_passive_only(base.passive) then for _, vowel_spec in ipairs(base.grouped_conj_vowels) do insert_ann("vowels", ("%s ~ %s"):format(table.concat(vowel_spec.pasts, "/"), table.concat(vowel_spec.nonpasts, "/"))) for _, past in ipairs(vowel_spec.pasts) do for _, nonpast in ipairs(vowel_spec.nonpasts) do if past == "-" or nonpast == "-" then error("Internal error: Saw form I past vowel %s and non-past vowel %s but - in place of vowel should have triggered an error earlier") end insert_cat(("form-I verbs with past vowel %s and non-past vowel %s"):format(past, nonpast)) --W: Add morphological pattern for form I based on vowels local form_i_with_vowels = ("I/%s~%s"):format(past, nonpast) local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[form_i_with_vowels] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end end end end for slot, name in pairs(slots_that_may_be_uncertain) do if base.slot_uncertain[slot] then -- An unspecified and non-defaulted verbal noun (form I) is considered uncertain rather than explicitly -- missing. Use <vn:-> to explicitly indicate the lack of verbal noun. Same for form-I stative active -- participles. insert_cat(("verbs with unknown or uncertain %ss"):format(name)) end end if base.irregular then insert_ann("irreg", "irregular") insert_cat("irregular verbs") end end -- Compute the categories to add the verb to, as well as the annotation to display in the conjugation title bar. We -- combine the code to do these functions as both categories and title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.categories = {} local ann = {} alternant_multiword_spec.annotation = ann ann.form = {} ann.morph_pattern = {} --W: arabic morphological pattern corresponding to the form ann.weakness = {} ann.vowels = {} ann.passive = nil ann.reduced = {} ann.irreg = {} ann.defective = {} local multiword_lemma = false for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do if formobj.form:find(" ") then multiword_lemma = true break end end break end end local function insert_ann(anntype, value) m_table.insertIfNot(alternant_multiword_spec.annotation[anntype], value) end local function insert_cat(cat, also_when_multiword) -- Don't place multiword terms in categories like 'Arabic form-II verbs' to avoid spamming the categories with -- such terms. if also_when_multiword or not multiword_lemma then m_table.insertIfNot(alternant_multiword_spec.categories, "Arabic " .. cat) end end iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) end) for slot, name in pairs(slots_that_may_be_uncertain) do if alternant_multiword_spec.forms[slot] then for _, form in ipairs(alternant_multiword_spec.forms[slot]) do if form.uncertain then if form.form == "?" then insert_cat(("verbs with explicitly unknown %ss"):format(name)) else insert_cat(("verbs needing %s checked"):format(name)) end break end end end end if alternant_multiword_spec.has_active then if alternant_multiword_spec.has_passive and alternant_multiword_spec.has_non_impers_passive then insert_cat("verbs with full passive") ann.passive = "full passive" elseif alternant_multiword_spec.has_passive then insert_cat("verbs with impersonal passive") ann.passive = "impersonal passive" else insert_cat("verbs lacking passive forms") ann.passive = "no passive" end else if alternant_multiword_spec.has_non_impers_passive then insert_cat("passive verbs") insert_cat("verbs with full passive") ann.passive = "passive-only" else insert_cat("passive verbs") insert_cat("impersonal verbs") insert_cat("verbs with impersonal passive") ann.passive = "impersonal (passive-only)" end end if alternant_multiword_spec.passive_uncertain then insert_cat("verbs needing passive checked") ann.passive = ann.passive .. ' <abbr title="passive status uncertain">(?)</abbr>' end if alternant_multiword_spec.has_active and not alternant_multiword_spec.has_imp then insert_ann("defective", "no imperative") insert_cat("verbs lacking imperative forms") end if not alternant_multiword_spec.has_past then insert_ann("defective", "no past") insert_cat("verbs lacking past forms") end if not alternant_multiword_spec.has_nonpast then insert_ann("defective", "no non-past") insert_cat("verbs lacking non-past forms") end local ann_parts = {} local function insert_ann_part(part, conj) local val = table.concat(ann[part], conj or " or ") if val ~= "" and val ~= "regular" then table.insert(ann_parts, val) end end insert_ann_part("form") insert_ann_part("weakness") insert_ann_part("reduced") insert_ann_part("vowels") if ann.passive then table.insert(ann_parts, ann.passive) end insert_ann_part("irreg") insert_ann_part("defective", "، ") --W: Save morph_pattern before overwriting annotation with string alternant_multiword_spec.morph_pattern = ann.morph_pattern alternant_multiword_spec.annotation = table.concat(ann_parts, "، ") end local function show_forms(alternant_multiword_spec) local lemmas = {} for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do table.insert(lemmas, formobj) end break end end alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() alternant_multiword_spec.vn = alternant_multiword_spec.forms.vn -- save for later use in make_table() -- Reconstruct the original verb spec without overrides for verbal nouns and participles, since those specific slots -- are ignored by {{ar-verb form}}. Compute this once beforehand; `transform_accel_obj` is called repeatedly on each -- form and we don't want to compute this repeatedly. local reconstructed_verb_spec = iut.reconstruct_original_spec(alternant_multiword_spec, { preprocess_angle_bracket_spec = function(spec) spec = spec:match("^<(.*)>$") assert(spec) local segments = put.parse_multi_delimiter_balanced_segment_run(spec, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- Rejoin each dot-separated group into a single string, since we aren't actually going to do any parsing -- of bracket-bounded textual runs; then filter out overrides for verbal nouns and participles. local filtered_indicators = {} for _, dot_separated_group in ipairs(dot_separated_groups) do local indicator = table.concat(dot_separated_group) -- FIXME: Do we want to filter out any other indicators? if not (indicator:find("^vn:") or indicator:find("^[ap]p:")) then table.insert(filtered_indicators, indicator) end end return ("<%s>"):format(table.concat(filtered_indicators, ".")) end, }) -- If we're dealing with a single word, no alternants and a single verb form, use the auto-conjugation-fetching -- variant. local reconstructed_lemma, inside = reconstructed_verb_spec:match("^([^ <>()]+)(%b<>)$") if inside and alternant_multiword_spec.verb_forms[1] and not alternant_multiword_spec.verb_forms[2] then reconstructed_verb_spec = ("+%s<%s>"):format(reconstructed_lemma, alternant_multiword_spec.verb_forms[1]) end local function transform_accel_obj(slot, formobj, accel_obj) if not accel_obj then return accel_obj end if slot == "ap" or slot == "pp" or slot == "vn" then -- FIXME: [[Module:accel]] can't correctly handle more than one verb form for participles and verbal nouns accel_obj.form = slot .. "-" .. table.concat(alternant_multiword_spec.verb_forms, "،") else accel_obj.form = "verb-form-" .. reconstructed_verb_spec end return accel_obj end local function generate_link(data) local form = data.form local term = form.formval_for_link local alt = form.alt if term == "?" then term = nil alt = "?" end --W: Create simple link for verb forms without #Arabic anchor local display = alt or term local link if display then link = link_term_simple(display) else link = "" end link = link .. iut.get_footnote_text(form.footnotes, data.footnote_obj) --W: qualifier/label rendering removed along with the q/qq/l/ll modifiers; -- it required [[Module:pron qualifier]], absent on ar.wiktionary. return link end local props = { lang = lang, lemmas = lemmas, transform_accel_obj = transform_accel_obj, generate_link = generate_link, slot_list = alternant_multiword_spec.verb_slots, include_translit = false, } iut.show_forms(alternant_multiword_spec.forms, props) end --W: Tatweel and the invisible direction/joining marks survive copy-paste and -- MediaWiki keeps them in page titles, so strip them from both sides before -- comparing a |بؤرة= value against a generated form. local FOCUS_IGNORE = "[" .. u(0x0640) .. u(0x061C) .. u(0x200B) .. "-" .. u(0x200F) .. u(0x202A) .. "-" .. u(0x202E) .. u(0xFEFF) .. "]" local function normalize_for_focus(s) return (rsub(s, FOCUS_IGNORE, "")) end --W: Which slots hold `focus`? Must run before show_forms() turns the form -- lists into rendered wikitext. local function find_focus_slots(alternant_multiword_spec, focus) if not focus or focus == "" then return nil end local target = normalize_for_focus(focus) local slots = {} for slot, forms in pairs(alternant_multiword_spec.forms) do if type(forms) == "table" then for _, formobj in ipairs(forms) do if type(formobj) == "table" and formobj.form and normalize_for_focus(formobj.form) == target then slots[slot] = true break end end end end return slots end --W: 'yes' unless |موسع= asked for the table open. [[Template:inflection-table-top]] -- turns any non-empty |tall= into the mw-collapsed class. local function collapsed_arg(alternant_multiword_spec) if alternant_multiword_spec.expanded then return nil end return 'yes' end --W: Put the marker class on the cell itself rather than on a span around its -- contents, so the highlight covers the whole cell instead of hugging the word. -- Runs on the table wikitext below, before m_string_utilities.format() fills the -- {slot} placeholders in. Every form cell in either table has one of two shapes: -- -- | {past_1s} -> | class="avf-focus" | {past_1s} -- | rowspan="2" | {past_1s} -> | rowspan="2" class="avf-focus" | {past_1s} -- -- Styled by [[Template:ar-verb-form/style.css]] (.inflection-table td.avf-focus). local function mark_focus_cells(text, focus_slots) if not focus_slots then return text end return (rsub(text, "\n(|[^\n]*)", function(cell) local slot = rmatch(cell, "^|%s*{([%w_]+)}%s*$") if slot then if focus_slots[slot] then return '\n| class="avf-focus" | {' .. slot .. "}" end return nil end local attrs attrs, slot = rmatch(cell, "^|%s*(.-)%s*|%s*{([%w_]+)}%s*$") if slot and focus_slots[slot] then return "\n| " .. attrs .. ' class="avf-focus" | {' .. slot .. "}" end return nil end)) end ------------------------------------------------------------------------------- -- Functions to create inflection tables -- ------------------------------------------------------------------------------- -- Make the conjugation table. Called from export.show(). local function make_table(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } text = text .. [=[ ! colspan="6" | <<الْمَصْدَر>> | colspan="7" | {vn} ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْفَاعِل>> | colspan="7" | {ap} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْمَفْعُول>> | colspan="7" | {pp} ]=] end text = text .. [=[ |- ! colspan="999" class="separator" | ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="12" class="outer" | <<الْفِعْل الْمَعْلُوم>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="12" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="12" class="separator" | ! colspan="3"| <<الْجَمْع>> |- ! colspan="2"| ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_1s} | {past_2ms} | {past_3ms} | rowspan="2" | {past_2d} | {past_3md} | rowspan="2" | {past_1p} | {past_2mp} | {past_3mp} |- ! class="secondary" | المؤنث | {past_2fs} | {past_3fs} | {past_3fd} | {past_2fp} | {past_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_1s} | {ind_2ms} | {ind_3ms} | rowspan="2" | {ind_2d} | {ind_3md} | rowspan="2" | {ind_1p} | {ind_2mp} | {ind_3mp} |- ! class="secondary" | المؤنث | {ind_2fs} | {ind_3fs} | {ind_3fd} | {ind_2fp} | {ind_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_1s} | {sub_2ms} | {sub_3ms} | rowspan="2" | {sub_2d} | {sub_3md} | rowspan="2" | {sub_1p} | {sub_2mp} | {sub_3mp} |- ! class="secondary" | المؤنث | {sub_2fs} | {sub_3fs} | {sub_3fd} | {sub_2fp} | {sub_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_1s} | {juss_2ms} | {juss_3ms} | rowspan="2" | {juss_2d} | {juss_3md} | rowspan="2" | {juss_1p} | {juss_2mp} | {juss_3mp} |- ! class="secondary" | المؤنث | {juss_2fs} | {juss_3fs} | {juss_3fd} | {juss_2fp} | {juss_3fp} |- ! rowspan="2" | <<الْأَمْر>> ! class="secondary" | المذكر | rowspan="2" | | {imp_2ms} | rowspan="2" | | rowspan="2" | {imp_2d} | rowspan="2" | | rowspan="2" | | {imp_2mp} | rowspan="2" | |- ! class="secondary" | المؤنث | {imp_2fs} | {imp_2fp} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="999" class="separator" | |- ! colspan="12" class="outer" | <<الْفِعْل الْمَجْهُول>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="10" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="10" class="separator" | ! colspan="3" | <<الْجَمْع>> |- ! colspan="2" | ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_pass_1s} | {past_pass_2ms} | {past_pass_3ms} | rowspan="2" | {past_pass_2d} | {past_pass_3md} | rowspan="2" | {past_pass_1p} | {past_pass_2mp} | {past_pass_3mp} |- ! class="secondary" | المؤنث | {past_pass_2fs} | {past_pass_3fs} | {past_pass_3fd} | {past_pass_2fp} | {past_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_pass_1s} | {ind_pass_2ms} | {ind_pass_3ms} | rowspan="2" | {ind_pass_2d} | {ind_pass_3md} | rowspan="2" | {ind_pass_1p} | {ind_pass_2mp} | {ind_pass_3mp} |- ! class="secondary" | المؤنث | {ind_pass_2fs} | {ind_pass_3fs} | {ind_pass_3fd} | {ind_pass_2fp} | {ind_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_pass_1s} | {sub_pass_2ms} | {sub_pass_3ms} | rowspan="2" | {sub_pass_2d} | {sub_pass_3md} | rowspan="2" | {sub_pass_1p} | {sub_pass_2mp} | {sub_pass_3mp} |- ! class="secondary" | المؤنث | {sub_pass_2fs} | {sub_pass_3fs} | {sub_pass_3fd} | {sub_pass_2fp} | {sub_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_pass_1s} | {juss_pass_2ms} | {juss_pass_3ms} | rowspan="2" | {juss_pass_2d} | {juss_pass_3md} | rowspan="2" | {juss_pass_1p} | {juss_pass_2mp} | {juss_pass_3mp} |- ! class="secondary" | المؤنث | {juss_pass_2fs} | {juss_pass_3fs} | {juss_pass_3fd} | {juss_pass_2fp} | {juss_pass_3fp} ]=] end text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end if alternant_multiword_spec.vn then local linked_vns = {} for _, form in ipairs(alternant_multiword_spec.vn) do table.insert(linked_vns, link_term(form.form, "term")) end table.insert(ann_parts, (#linked_vns > 1 and "verbal nouns" or "verbal noun") .. " " .. table.concat(linked_vns, "، ")) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end -- Helper function to get root letters and verb classification for simplified table header -- Returns: root_display (e.g., "ح س ب"), verb_type (e.g., "فعل ثلاثي صحيح سالم") local function get_verb_info(alternant_multiword_spec) local root_display = "" local verb_type = "فعل" local rad1, rad2, rad3, rad4 -- Extract radicals from the base word spec using iut.map_word_specs -- This accesses the radicals directly from the parsed verb specification iut.map_word_specs(alternant_multiword_spec, function(base) -- Get radicals from the first conjugation vowel spec if base.conj_vowels and #base.conj_vowels > 0 then local vowel_spec = base.conj_vowels[1] -- Extract radicals, handling both table and string types local function extract_radical(rad) if type(rad) == "table" then -- If it's a table, get the first element or the string representation return rad[1] or rget(rad) else return rad end end rad1 = extract_radical(vowel_spec.rad1) rad2 = extract_radical(vowel_spec.rad2) rad3 = extract_radical(vowel_spec.rad3) rad4 = vowel_spec.rad4 and extract_radical(vowel_spec.rad4) end end) -- Get basic/derived classification from morphological pattern local basic_deriv if alternant_multiword_spec.morph_pattern and #alternant_multiword_spec.morph_pattern > 0 then local morph_pattern = alternant_multiword_spec.morph_pattern[1] basic_deriv = MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV[morph_pattern] end -- Format root display with spaces between letters if rad1 and rad2 and rad3 then if rad4 then -- Quadrilateral root_display = rad1 .. " " .. rad2 .. " " .. rad3 .. " " .. rad4 verb_type = "فعل رباعي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv end else -- triliteral root_display = rad1 .. " " .. rad2 .. " " .. rad3 verb_type = "فعل ثلاثي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv if basic_deriv == "مُجرَّد" then --W: the classification concerns only triliteral basic verbs (الثلاثي المُجرَّد) local classification = export.classify_triliteral_verb(rad1, rad2, rad3) verb_type = verb_type .. " " .. classification end end end end return root_display, verb_type end -- Make simplified conjugation table for ar.wiktionary. Called from export.show(). -- This table shows only past, present indicative, and imperative forms. -- No passive voice, no participles, no verbal nouns. local function make_table_ar(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } -- Get verb root and classification local root_display, verb_type = get_verb_info(alternant_multiword_spec) -- First row: Root and verb type spanning all columns text = text .. "! colspan=\"2\" | <<الجذر>>: " .. root_display .. "\n" text = text .. "| colspan=\"3\" | <<'''" .. verb_type .. "'''>>\n" text = text .. [=[ |- ! colspan="2" | <<الضمائر>> ! <<الماضي>> ! <<المضارع>> ! <<الأمر>> |- ! rowspan="2" | <<المتكلّم>> | <<أنا>> | {past_1s} | {ind_1s} | |- | <<نحن>> | {past_1p} | {ind_1p} | |- ! rowspan="5" | <<المخاطب>> | <<أنتَ>> | {past_2ms} | {ind_2ms} | {imp_2ms} |- | <<أنتِ>> | {past_2fs} | {ind_2fs} | {imp_2fs} |- | <<أنتما>> | {past_2d} | {ind_2d} | {imp_2d} |- | <<أنتم>> | {past_2mp} | {ind_2mp} | {imp_2mp} |- | <<أنتنّ>> | {past_2fp} | {ind_2fp} | {imp_2fp} |- ! rowspan="6" | <<الغائب>> | <<هو>> | {past_3ms} | {ind_3ms} | |- | <<هي>> | {past_3fs} | {ind_3fs} | |- | <<هما>> | {past_3md} | {ind_3md} | |- | <<هما>> | {past_3fd} | {ind_3fd} | |- | <<هم>> | {past_3mp} | {ind_3mp} | |- | <<هنّ>> | {past_3fp} | {ind_3fp} | ]=] text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end ------------------------------------------------------------------------------- -- Verb classification functions -- ------------------------------------------------------------------------------- --[=[ تصنيف الفعل الثلاثي المُجرَّد حسب نوعه Classify an Arabic triliteral basic verb root based on its three letters. @param r1 الحرف الأول (first root letter - الفاء) @param r2 الحرف الثاني (second root letter - العين) @param r3 الحرف الثالث (third root letter - اللام) @return str: نوع الفعل (verb type classification in Arabic) Examples: classify_triliteral_verb('ك', 'ت', 'ب') --> 'صحيح سالم' classify_triliteral_verb('أ', 'ت', 'ي') --> 'معتل ناقص يائي مهموز الفاء' classify_triliteral_verb('ق', 'ل', 'و') --> 'معتل ناقص واوي' ]=] function export.classify_triliteral_verb(r1, r2, r3) -- تعريف أحرف العلة والهمزة -- الحروف الضعيفة (أحرف العلة): واو وياء فقط local weak_letters = {[W] = true, [Y] = true} -- الهمزة: جميع أشكال الهمزة (ء، أ، إ، ؤ، ئ) local hamza_letters = { [HAMZA] = true, -- ء [HAMZA_ON_ALIF] = true, -- أ [HAMZA_UNDER_ALIF] = true, -- إ [HAMZA_ON_W] = true, -- ؤ [HAMZA_ON_Y] = true -- ئ } -- فحص كل حرف local is_hamza = {hamza_letters[r1] or false, hamza_letters[r2] or false, hamza_letters[r3] or false} local is_weak = {weak_letters[r1] or false, weak_letters[r2] or false, weak_letters[r3] or false} -- عدد أحرف العلة local weak_count = (is_weak[1] and 1 or 0) + (is_weak[2] and 1 or 0) + (is_weak[3] and 1 or 0) -- فحص التضعيف (الحرف الثاني = الثالث) local is_doubled = (r2 == r3) -- ═══════════════════════════════════════════════════════════ -- المُعتل: الفعل الذي يحتوي على حرف أو أكثر من أحرف العلة -- ═══════════════════════════════════════════════════════════ if weak_count > 0 then -- ───────────────────────────────────────────────────── -- لفيف: يحتوي على حرفين أو أكثر من أحرف العلة -- ───────────────────────────────────────────────────── if weak_count >= 2 then -- مقرون: حرفا العلة متجاوران if is_weak[2] and is_weak[3] then -- الثاني والثالث if is_hamza[1] then return "معتل لفيف مقرون مهموز الفاء" end return "معتل لفيف مقرون" elseif is_weak[1] and is_weak[2] then -- الأول والثاني return "معتل لفيف مقرون" -- مفروق: الأول والثالث حرفا علة elseif is_weak[1] and is_weak[3] then if is_hamza[2] then return "معتل لفيف مفروق مهموز العين" end return "معتل لفيف مفروق" end -- ───────────────────────────────────────────────────── -- مثال: الحرف الأول حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[1] then if r1 == W then -- واوي if is_hamza[3] then return "معتل مثال واوي مهموز اللام" elseif is_doubled then return "معتل مثال واوي مُضعَّف" elseif is_hamza[2] then return "معتل مثال واوي مهموز العين" end return "معتل مثال واوي" else -- يائي (ي) if is_doubled then return "معتل مثال يائي مُضعَّف" elseif is_hamza[2] then return "معتل مثال يائي مهموز العين" end return "معتل مثال يائي" end -- ───────────────────────────────────────────────────── -- أجوف: الحرف الثاني حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[2] then if r2 == W then -- واوي if is_hamza[3] then return "معتل أجوف واوي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف واوي مهموز الفاء" end return "معتل أجوف واوي" else -- يائي (ي) if is_hamza[3] then return "معتل أجوف يائي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف يائي مهموز الفاء" end return "معتل أجوف يائي" end -- ───────────────────────────────────────────────────── -- ناقص: الحرف الثالث حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[3] then if r3 == W then -- واوي if is_hamza[1] then return "معتل ناقص واوي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص واوي مهموز العين" end return "معتل ناقص واوي" else -- يائي (ي) if is_hamza[1] then return "معتل ناقص يائي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص يائي مهموز العين" end return "معتل ناقص يائي" end end -- ═══════════════════════════════════════════════════════════ -- الصحيح: الفعل الذي لا يحتوي على أحرف العلة -- ═══════════════════════════════════════════════════════════ else -- ───────────────────────────────────────────────────── -- مهموز: يحتوي على همزة -- ───────────────────────────────────────────────────── if is_hamza[1] or is_hamza[2] or is_hamza[3] then -- مهموز الفاء واللام: الأول والثالث همزة if is_hamza[1] and is_hamza[3] then return "صحيح مهموز الفاء واللام" -- مهموز الفاء elseif is_hamza[1] then if is_doubled then return "صحيح مُضعَّف مهموز الفاء" end return "صحيح مهموز الفاء" -- مهموز العين elseif is_hamza[2] then return "صحيح مهموز العين" -- مهموز اللام elseif is_hamza[3] then return "صحيح مهموز اللام" end -- ───────────────────────────────────────────────────── -- مُضعَّف: الحرف الثاني = الثالث -- ───────────────────────────────────────────────────── elseif is_doubled then return "صحيح مُضعَّف" -- ───────────────────────────────────────────────────── -- سالم: لا همزة، لا حرف علة، لا تضعيف -- ───────────────────────────────────────────────────── else return "صحيح سالم" end end return "غير معروف" end ------------------------------------------------------------------------------- -- External entry points -- ------------------------------------------------------------------------------- --W: Normalize root to use underscores as separators -- Accepts: "كتب", "ك_ت_ب", or "ك ت ب" -- Returns: "ك_ت_ب" local function normalize_root(root) if not root then return nil end -- Helper function to normalize a single character/radical local function normalize_char(char) -- Convert all hamza variants to canonical bare hamza if char == HAMZA_ON_ALIF or char == HAMZA_UNDER_ALIF or char == HAMZA_ON_W or char == HAMZA_ON_Y then return HAMZA -- Convert alif maqṣūra to yaa (ى → ي) elseif char == AMAQ then return Y -- Reject alif - it's not a root radical elseif char == ALIF then error("Root contains alif (ا) which is not a valid root radical. For weak verbs, use و (waw) or ي (yaa) instead.") end return char end -- Convert alif madda to hamza + alif for processing (will be caught as error below) root = root:gsub(AMAD, HAMZA .. ALIF) -- Replace spaces with underscores root = root:gsub(" ", "_") -- If no underscores yet, insert them between each character if not root:find("_") then -- Extract only Arabic letters (excluding diacritics) -- Arabic letter range: U+0621 to U+064A (basic letters) local chars = {} for char in mw.ustring.gmatch(root, "[ء-ي]") do table.insert(chars, normalize_char(char)) end root = table.concat(chars, "_") else -- Root already has underscores (e.g., "أ_م_ن"), normalize each radical local parts = mw.text.split(root, "_") for i, part in ipairs(parts) do parts[i] = normalize_char(part) end root = table.concat(parts, "_") end return root end --W: Construct the [1] parameter from root (جذر) and morphological pattern (وزن) -- Example: -- input: root="كتب", pattern="فعَل يفعُل" -- output: "ك_ت_ب<I/a~u>" -- `force_full_passive`, if true, appends ".pass" so the verb gets a full personal -- passive paradigm instead of the module's default impersonal-passive guess for -- vforms like I (past vowel i), V, VI, X and IIq (see |مبني للمجهول= on {{ar-conj}}). -- `reduced`, if true, appends ".reduced" so forms V/VI use the assimilated تاء -- التفعّل prefix (اِسَّمَّعَ) instead of the default تَ- prefix (تَسَمَّعَ) -- see -- |مدغم= on {{ar-conj}}. Not every root with an assimilable first radical is -- necessarily attested with the assimilated form, so this isn't inferred automatically -- from the root; it must be requested. local function construct_verb_spec(root, pattern, force_full_passive, reduced) if not root or not pattern then return nil end local normalized_root = normalize_root(root) local form_code = MORPHOLOGICAL_PATTERN_TO_FORM[pattern] if not form_code then error("Unknown morphological pattern (وزن صرفي): " .. pattern) end if force_full_passive then form_code = form_code .. ".pass" end if reduced then form_code = form_code .. ".reduced" end return normalized_root .. "<" .. form_code .. ">" end -- Wrapper function that accepts جذر (root) and وزن (pattern) as parameters -- Returns: verb_type (e.g., "فعل ثلاثي مُجرَّد صحيح سالم") -- Example: export.get_verb_type({["جذر"] = "كتب", ["وزن"] = "فعَل يفعُل"}) function export.get_verb_type(args) local verb_spec if args["جذر"] and args["وزن"] then verb_spec = construct_verb_spec(args["جذر"], args["وزن"]) elseif args[1] then verb_spec = args[1] else error("Must provide either جذر and وزن, or a verb specification in args[1]") end local alternant_multiword_spec = export.do_generate_forms({[1] = verb_spec}) local _, verb_type = get_verb_info(alternant_multiword_spec) return verb_type end -- Append two lists `l1` and `l2`, removing duplicates. If either is {nil}, just return the other. local function combine_lists(l1, l2) -- combine_footnotes() does exactly what we want. return iut.combine_footnotes(l1, l2) end local function combine_metadata(data) local src1 = data.form1 local src2 = data.form2 local dest = data.dest_form dest.uncertain = src1.uncertain or src2.uncertain if src1.genders and src2.genders and not m_table.deepEquals(src1.genders, src2.genders) then -- do nothing else dest.genders = src1.genders or src2.genders end if src1.pos and src2.pos and src1.pos ~= src2.pos then -- do nothing else dest.pos = src1.pos or src2.pos end -- Don't copy .alt, .gloss, .lit, .id, which describe a single term and don't extend to multiword terms. dest.q = combine_lists(src1.q, src2.q) dest.qq = combine_lists(src1.qq, src2.qq) dest.l = combine_lists(src1.l, src2.l) dest.ll = combine_lists(src1.ll, src2.ll) end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, source_template, headword_head) local PAGENAME = mw.loadData("Module:headword/data").pagename local function in_template_space() local nsText = mw.title.getCurrentTitle().nsText return nsText == "Template" or nsText == "قالب" end -- Determine the verb spec we're being asked to generate the conjugation of. This may be taken from the current page -- title or the value of |pagename=; but not when called from {{ar-verb form}}, where the page title is a -- non-lemma form. Note that the verb spec may omit the lemma; e.g. it may be "<II>". For this reason, we use the -- value of `pagename` computed here down below, when calling normalize_all_lemmas(). local pagename = source_template ~= "ar-verb form" and args.pagename or PAGENAME local head = headword_head or pagename --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local arg1 = args[1] if not arg1 then if (pagename == "ar-conj" or pagename == "ar-verb" or pagename == "ar-verb form" or pagename == "تصريف") and in_template_space() then arg1 = "كتب<I/a~u.pass>" else arg1 = "<>" end end -- When called from {{ar-verb form}}, determine the non-lemma form whose inflections we're being asked to -- determine. This normally comes from the page title or the value of |pagename=. local verb_form_of_form if source_template == "ar-verb form" then verb_form_of_form = args.pagename if not verb_form_of_form then if PAGENAME == "ar-verb form" and in_template_space() then verb_form_of_form = "كتبت" else verb_form_of_form = PAGENAME end end end local incorporated_headword_head_into_lemma = false if arg1:find("^<.*>$") then -- missing lemma if head:find(" ") then -- If multiword lemma, try to add arg spec after the first word. -- Try to preserve the brackets in the part after the verb, but don't do it -- if there aren't the same number of left and right brackets in the verb -- (which means the verb was linked as part of a larger expression). local first_word, post = rmatch(head, "^(.-)( .*)$") local left_brackets = rsub(first_word, "[^%[]", "") local right_brackets = rsub(first_word, "[^%]]", "") if #left_brackets == #right_brackets then arg1 = iut.remove_redundant_links(first_word) .. arg1 .. post incorporated_headword_head_into_lemma = true else -- Try again using the form without links. local linkless_head = m_links.remove_links(head) if linkless_head:find(" ") then first_word, post = rmatch(linkless_head, "^(.-)( .*)$") arg1 = first_word .. arg1 .. post else error("Unable to incorporate <...> spec into explicit head due to a multiword linked verb or " .. "unbalanced brackets; please include <> explicitly: " .. arg1) end end else -- Will be incorporated through `head` below in the call to normalize_all_lemmas(). incorporated_headword_head_into_lemma = true end end local parse_props = { parse_indicator_spec = parse_indicator_spec, angle_brackets_omittable = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template alternant_multiword_spec.verb_form_of_form = verb_form_of_form alternant_multiword_spec.incorporated_headword_head_into_lemma = incorporated_headword_head_into_lemma normalize_all_lemmas(alternant_multiword_spec, head) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { lang = lang, slot_list = alternant_multiword_spec.verb_slots, inflect_word_spec = conjugate_verb, combine_metadata = combine_metadata, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) if debug_translit then for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do if form.translit then local full_form_translit = (lang:transliterate(m_links.remove_links(form.form))) if full_form_translit ~= form.translit then error(("Internal error: For slot '%s', form '%s' incremental translit '%s' not same as full translit '%s'"): format(slot, form.form, form.translit, full_form_translit)) end end form.form = iut.remove_redundant_links(form.form) end end end -- Remove redundant brackets around entire forms. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = iut.remove_redundant_links(form.form) end end -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization (which is applied on enwiktionary -- but not in local Lua environments). This reverses the postprocessing step. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = apply_nfc_shadda(form.form) end end determine_slot_uncertainty_from_forms(alternant_multiword_spec) determine_verb_properties_from_forms(alternant_multiword_spec) compute_categories_and_annotation(alternant_multiword_spec) if args.json and source_template == "ar-conj" then -- There is a circular reference in `base.alternant_multiword_spec`, which points back to top level. iut.map_word_specs(alternant_multiword_spec, function(base) base.alternant_multiword_spec = nil end) return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{ar-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent() and frame:getParent().args or frame.args --W local params = { [1] = {}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["t"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["id"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use --W: additional parameters for ar.wiktionary.org ["جذر"] = {type = "string"}, --W: الجذر اللغوي, root ["وزن"] = {type = "string"}, --W: الوزن الصرفي, morphological pattern ["مبني للمجهول"] = {type = "boolean"}, --W: force a full personal passive paradigm, -- overriding the default impersonal-passive guess for vforms like I (past vowel -- i), V, VI, X and IIq ["مدغم"] = {type = "boolean"}, --W: for forms V/VI, assimilate the تاء التفعّل prefix -- into the first radical (اِسَّمَّعَ instead of تَسَمَّعَ) ["كامل"] = {type = "boolean"}, --W: show full table (default is simplified table) ["بؤرة"] = {type = "string"}, --W: highlight the cells holding this form ["موسع"] = {type = "boolean"}, --W: show the table expanded (default: collapsed) } local args = require("Module:parameters").process(parent_args, params) --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local alternant_multiword_spec = export.do_generate_forms(args, "ar-conj") if type(alternant_multiword_spec) == "string" then -- JSON return value return alternant_multiword_spec end --W: |بؤرة= marks the cells holding a given form, so that a conjugated-form -- page ([[Module:ar-verb-form]]) can show the reader where in the paradigm -- the word they looked up actually sits. The slots have to be found before -- show_forms(), which replaces each form list with rendered wikitext. alternant_multiword_spec.focus_slots = find_focus_slots(alternant_multiword_spec, args["بؤرة"]) --W: A table whose one relevant cell is highlighted is no use folded away, so -- [[Module:ar-verb-form]] asks for it open. Lemma pages keep it collapsed. alternant_multiword_spec.expanded = args["موسع"] or false show_forms(alternant_multiword_spec) --W: Choose table type: simplified (default) or full (comprehensive) local table_html if args["كامل"] then table_html = make_table(alternant_multiword_spec) else table_html = make_table_ar(alternant_multiword_spec) end --W: don't add categories --W: TODO: all lines with insert_cat() are to be removed. -- return table_html .. -- require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang, nil, nil, force_cat) return table_html end function export.verb_forms(frame) local parargs = frame:getParent().args local params = { [1] = {}, [2] = {}, [3] = {}, [4] = {}, [5] = {}, pagename = {}, } for _, form in ipairs(allowed_vforms) do -- FIXME: We go up to 5 here. The code supports unlimited variants but it's unlikely we will ever see more than -- 2. for index = 1, 5 do local prefix = index == 1 and form or form .. index params[prefix .. "-pv"] = {} for _, extn in ipairs { "", "-vn", "-ap", "-pp" } do params[prefix .. extn] = {} params[prefix .. extn .. "-head"] = {} -- FIXME: No -tr? params[prefix .. extn .. "-gloss"] = {} end end end local args = require("Module:parameters").process(parargs, params) local i = 1 local past_vowel_re = "^[aui,]*$" local combined_root = nil if not args[i] or rfind(args[i], past_vowel_re) then combined_root = args.pagename or mw.loadData("Module:headword/data").pagename if not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ])$") and not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ]) ([^ ])$") then error("When inferring roots from page title, need three or four space-separated radicals: " .. combined_root) end elseif rfind(args[i], " ") then combined_root = args[i] i = i + 1 else local separate_roots = {} while args[i] and not rfind(args[i], past_vowel_re) do table.insert(separate_roots, args[i]) i = i + 1 end combined_root = table.concat(separate_roots, " ") end local past_vowel = args[i] i = i + 1 if past_vowel and not rfind(past_vowel, past_vowel_re) then error("Unrecognized past vowel, should be 'a', 'i', 'u', 'a,u', etc. or empty: " .. past_vowel) end -- Spaces interfere with parsing as a unit in [[Module:inflection utilities]], so replace with underscore. combined_root = combined_root:gsub(" ", "_") local split_root = rsplit(combined_root, "_") -- Map from verb forms (I, II, etc.) to a table of verb properties, -- which has entries e.g. for "verb" (either true to autogenerate the verb -- head, or an explicitly specified verb head using e.g. argument "I-head"), -- and for "verb-gloss" (which comes from e.g. the argument "I" or "I-gloss"), -- and for "vn" and "vn-gloss", "ap" and "ap-gloss", "pp" and "pp-gloss". local verb_properties = {} for _, form in ipairs(allowed_vforms) do local formpropslist = {} local derivs = {{"verb", ""}, {"vn", "-vn"}, {"ap", "-ap"}, {"pp", "-pp"}} local index = 1 while true do local formprops = {} local prefix = index == 1 and form or form .. index if prefix == "I" then formprops.pv = past_vowel end if args[prefix .. "-pv"] then formprops.pv = args[prefix .. "-pv"] end for _, deriv in ipairs(derivs) do local prop = deriv[1] local extn = deriv[2] if args[prefix .. extn] == "+" then formprops[prop] = true elseif args[prefix .. extn] == "-" then formprops[prop] = false elseif args[prefix .. extn] then formprops[prop] = true formprops[prop .. "-gloss"] = args[prefix .. extn] end if args[prefix .. extn .. "-head"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop] = args[prefix .. extn .. "-head"] end if args[prefix .. extn .. "-gloss"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop .. "-gloss"] = args[prefix .. extn .. "-gloss"] end end if formprops.verb then -- If a verb form specified, also turn on vn (unless form I, with -- unpredictable vn) and ap, and maybe pp, according to form, -- weakness and past vowel. But don't turn these on if there's -- an explicit on/off specification for them (e.g. I-pp=-). if form ~= "I" and formprops.vn == nil then formprops.vn = true end if formprops.ap == nil then formprops.ap = true end local weakness = weakness_from_radicals(form, split_root[1], split_root[2], split_root[3], split_root[4]) if formprops.pp == nil and not vform_probably_no_passive(form, weakness, rsplit(formprops.pv or "", ","), {}) then formprops.pp = true end if formprops.verb == true or formprops.vn == true or formprops.ap == true or formprops.pp == true then formprops.need_autogen = true end table.insert(formpropslist, formprops) index = index + 1 else break end end table.insert(verb_properties, {form, formpropslist}) end -- Go through and create the verb form derivations as necessary, when they haven't been explicitly given. for _, vplist in ipairs(verb_properties) do local vform = vplist[1] for _, props in ipairs(vplist[2]) do if props.need_autogen then local form_with_vowels if vform == "I" then local pv = props.pv if not pv then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak form_with_vowels = "I/a~u" elseif split_root[3] == Y then form_with_vowels = "I/a~i" elseif split_root[2] == W then --hollow form_with_vowels = "I/u~u" elseif split_root[2] == Y then form_with_vowels = "I/i~i" else -- most common; doesn't matter so much since we're not displaying the non-past form_with_vowels = "I/a~u" end else local pvs = rsplit(pv, ",") local vowel_sufs = {} for _, pv in ipairs(pvs) do local vowel_spec if pv == "a" then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak vowel_spec = "a~u" elseif split_root[3] == Y then vowel_spec = "a~i" elseif split_root[2] == W then --hollow vowel_spec = "a~u" elseif split_root[2] == Y then vowel_spec = "a~i" else -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "a~u" end elseif pv == "i" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "i~a" elseif pv == "u" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "u~u" else error(("Internal error: Bad past vowel '%s' in {{ar-verb forms}}"):format(pv)) end table.insert(vowel_sufs, vowel_spec) end form_with_vowels = "I/" .. table.concat(vowel_sufs, "/") end else form_with_vowels = vform end local angle_bracket_spec = ("%s<%s.pass>"):format(combined_root, form_with_vowels) local alternant_multiword_spec = export.do_generate_forms({angle_bracket_spec}, "ar-verb forms") local function format_forms(forms) if not forms then return "-" -- FIXME: Throw an error? end local formatted = {} for _, form in ipairs(forms) do if form.translit then table.insert(formatted, ("%s//%s"):format(form.form, form.translit)) else table.insert(formatted, form.form) end end return table.concat(formatted, "،") end if props.verb == true then props.verb = format_forms(alternant_multiword_spec.forms.past_3ms) end for _, deriv in ipairs({"vn", "ap", "pp"}) do if props[deriv] == true then props[deriv] = format_forms(alternant_multiword_spec.forms[deriv]) end end end end end -- Go through and output the result local formtextarr = {} for _, vplist in ipairs(verb_properties) do local form = vplist[1] for _, props in ipairs(vplist[2]) do local textarr = {} if props.verb then local text = "* '''[[Appendix:Arabic verbs#Form " .. form .. "|Form " .. form .. "]]''': " local linktext = {} local splitheads = rsplit(props.verb, "[,،]") for _, head in ipairs(splitheads) do table.insert(linktext, m_links.full_link({lang = lang, term = head, gloss = props["verb-gloss"]})) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) for _, derivengl in ipairs({{"vn", "Verbal noun"}, {"ap", "Active participle"}, {"pp", "Passive participle"}}) do local deriv = derivengl[1] local engl = derivengl[2] if props[deriv] then local text = "** " .. engl .. ": " local linktext = {} local splitheads = rsplit(props[deriv], "[,،]") for _, head in ipairs(splitheads) do local ar, translit = head:match("^(.*)//(.-)$") if not ar then ar = head end table.insert(linktext, m_links.full_link {lang = lang, term = ar, tr = translit, gloss = props[deriv .. "-gloss"]} ) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) end end table.insert(formtextarr, table.concat(textarr, "\n")) end end end return table.concat(formtextarr, "\n") end -- Infer radicals from lemma headword (i.e. 3rd masculine singular past) and verb form (I, II, etc.). Throw an error if -- headword is malformed. A given returned radical may be actually be a list of possible radicals, where the first one -- should be used if the user didn't explicitly give the radical. If the list contains a field `ambig = true`, the -- radical is considered ambiguous and should not be categorized. `is_reduced` indicates that the user specified -- `.reduced` to indicate that the verb form is reduced by assimilation and/or haplology (typically archaic Koranic -- forms such as اِدَّارَأَ instead of تَدَارَأَ; or اِسْطَاعَ instead of اِسْتِطَاعَ; etc. function export.infer_radicals(data) local headword, vform, passive, past_vowel, nonpast_vowel, is_reduced = data.headword, data.vform, data.passive, data.past_vowel, data.nonpast_vowel, data.is_reduced past_vowel = past_vowel or "-" nonpast_vowel = nonpast_vowel or "-" local function verify_vowel(vowel, param) --W: A past/non-past vowel may legitimately be a form object {form=..., footnotes=...} -- when the user attaches a footnote, e.g. <I/a[نادر]~u>, so compare the formval. -- Comparing the raw value crashed on Lua 5.1 ("bad argument #2 to 'format'"). local formval = rget(vowel) if formval ~= A and formval ~= I and formval ~= U and formval ~= "-" then error(("Internal error: Bad value for %s: %s (should be Arabic diacritic vowel or '-')"):format( param, dump(vowel))) end end verify_vowel(past_vowel, "past_vowel") verify_vowel(nonpast_vowel, "nonpast_vowel") local ch = {} local form_viii_assim, variant -- sub out alif-madda for easier processing headword = rsub(headword, AMAD, HAMZA .. ALIF) local function infer_err(msg, noann) local anns = {} local nohead, novform if noann == "nohead" then nohead = true elseif noann == "novform" then novform = true elseif noann == "nohead-vform" then nohead = true novform = true elseif noann then error(("Internal error: Unrecognized value for 'noann': %s"):format(dump(noann))) end if not nohead then table.insert(anns, ("headword=%s"):format(data.headword)) end if not novform then table.insert(anns, ("verb form=%s"):format(data.vform)) end anns = table.concat(anns, "، ") if anns ~= "" then anns = ": " .. anns end error(msg .. anns) end local len = ulen(headword) local expected_length -- extract the headword letters into an array for i = 1, len do table.insert(ch, usub(headword, i, i)) end -- check that the letter at the given index is the given string, or -- is one of the members of the given array local function check(index, must) local letter = ch[index] if type(must) == "string" then if not letter then infer_err("Letter " .. index .. " is nil") end if letter ~= must then infer_err(("For verb form %s, letter %s must be %s, not %s"):format(vform, index, must, letter), "novform") end elseif not m_table.contains(must, letter) then infer_err("For verb form " .. vform .. ", radical " .. index .. " must be one of " .. table.concat(must, " ") .. ", not " .. letter, "novform") end end -- Check that length of headword is within [min, max] local function check_len(min, max) if min and len < min then infer_err(("Not enough letters for verb form %s, expected at least %s"):format(vform, min), "novform") end if max and len > max then infer_err(("Too many letters for verb form %s, expected at most %s"):format(vform, max), "novform") end end -- A form I verb beginning with w- keeps the w in the non-past unless the non-past vowel is a kasra or a -- lowered kasra; see form_i_w_assimilated(), which the radicals path uses too. This used to be spelt out -- here as "i~a or u~u", which missed a~u (وَجَلَ يَوْجُلُ). local function form_I_w_non_assimilated() return not form_i_w_assimilated(past_vowel, nonpast_vowel) end -- Convert radicals to canonical form (handle various hamza varieties and check for misplaced alif or alif maqṣūra; -- legitimate cases of these letters are handled above). local function convert(rad, index) if type(rad) == "table" then for i, r in ipairs(rad) do rad[i] = convert(r, index) end return rad elseif rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then return HAMZA elseif rad == AMAQ then infer_err("Radical " .. index .. " must not be alif maqṣūra") elseif rad == ALIF then infer_err("Radical " .. index .. " must not be alif") else return rad end end local quadlit = vform:find("q$") -- find first radical, start of second/third radicals, check for -- required letters local radstart, rad1, rad2, rad3, rad4 local weakness if vform == "I" or vform == "II" then rad1 = ch[1] radstart = 2 elseif vform == "III" then rad1 = ch[1] check(2, {ALIF, W}) -- W occurs in passive-only verbs radstart = 3 elseif vform == "IV" then -- this would be alif-madda but we replaced it with hamza-alif above. if ch[1] == HAMZA and ch[2] == ALIF then rad1 = HAMZA else check(1, HAMZA_ON_ALIF) rad1 = ch[2] end radstart = 3 elseif vform == "V" then check(1, is_reduced and ALIF or T) rad1 = ch[2] radstart = 3 elseif vform == "VI" then check(1, is_reduced and ALIF or T) if ch[2] == AMAD then rad1 = HAMZA radstart = 3 else rad1 = ch[2] check(3, {ALIF, W}) -- W occurs in passive-only verbs radstart = 4 end elseif vform == "VII" then check(1, ALIF) if is_reduced then check(2, M) rad1 = M radstart = 3 else check(2, N) rad1 = ch[3] radstart = 4 end elseif vform == "VIII" then check(1, ALIF) rad1 = ch[2] if rad1 == "د" then rad1 = {"د", "ذ"} -- not considered ambiguous since it's usually د radstart = 3 form_viii_assim = "دّ" elseif rad1 == "ظ" and ch[3] == "ط" and len >= 5 then -- [[اظطلم]], variant of [[اظلم]] radstart = 4 form_viii_assim = "ظْط" elseif rad1 == "ذ" and ch[3] == "د" and len >= 5 then -- [[اذدكر]], variant of [[اذكر]] radstart = 4 form_viii_assim = "ذْد" elseif rad1 == T or rad1 == "ث" or rad1 == "ذ" or rad1 == "ط" or rad1 == "ظ" then radstart = 3 form_viii_assim = rad1 .. SH elseif rad1 == "ز" then check(3, "د") radstart = 4 form_viii_assim = "زْد" elseif rad1 == "ص" or rad1 == "ض" then check(3, "ط") radstart = 4 form_viii_assim = rad1 .. SK .. "ط" else check(3, T) radstart = 4 rad1 = convert(rad1, 1) form_viii_assim = rad1 .. SK .. "ت" end if rad1 == T then -- Radical is ambiguous, might be ت or و or ي but doesn't affect conjugation. Note that there are no -- form-VIII verbs with initial radical ي given in Hans Wehr but Lane mentions at least: -- - (page 2973) اِتَّأَسَ, with assimilation of the ي to ت, from root ي ء س; -- - (page 2975) اِتَّبَسَ non-past يَتَّبِسُ and alternative اِيتَبَسَ non-past يَاتَبِسُ from the root ي ب س; -- - (page 2976) اِتَّسَرَ non-past يَتَّسِرُ or alternatively يَأْتَسِرُ with hamza preserved from the root ي س ر. -- These alternative forms seem very rare and probably not worth worrying about, but if we want to handle -- them, we can do it when the time comes. rad1 = {T, W, Y, ambig = true} -- اِتَّخَذَ irregularly has hamza as the radical but assimilates like و if ch[3] == "خ" and ch[4] == "ذ" then rad1[4] = HAMZA end end elseif vform == "IX" then check(1, ALIF) rad1 = ch[2] radstart = 3 elseif vform == "X" then check(1, ALIF) check(2, S) if is_reduced then rad1 = ch[3] radstart = 4 else check(3, T) rad1 = ch[4] radstart = 5 end elseif vform == "Iq" then rad1 = ch[1] rad2 = ch[2] radstart = 3 elseif vform == "IIq" then check(1, T) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "IIIq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) radstart = 5 elseif vform == "IVq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "XI" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, ALIF) rad3 = ch[5] weakness = "sound" elseif vform == "XII" then check(1, ALIF) rad1 = ch[2] if ch[3] ~= ch[5] then infer_err("For verb form XII, letters 3 and 5 should be the same", "novform") end check(4, W) radstart = 5 elseif vform == "XIII" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, W) rad3 = ch[5] if rad3 == AMAQ then weakness = "final-weak" else weakness = "sound" end elseif vform == "XIV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if ch[6] == AMAQ then check_waw_ya(rad3) weakness = "final-weak" else if ch[5] ~= ch[6] then infer_err("For verb form XIV, letters 5 and 6 should be the same", "novform") end weakness = "sound" end elseif vform == "XV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if rad3 == Y then check(6, ALIF) else check(6, AMAQ) end weakness = "sound" else error("Internal error: Unrecognized verb form " .. vform) end -- Process the last two radicals. RADSTART is the index of the first of the two. If it's nil then all radicals have -- already been processed above, and we don't do anything. if radstart then -- There must (normally) be one or two letters left. if len == radstart then if vform == "I" and ch[len] == Y then -- short form حَيَّ weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" elseif vform == "IV" and rad1 == "ر" and ch[len] == AMAQ then -- irregular verb أَرَى weakness = "final-weak" rad2 = HAMZA rad3 = Y elseif vform == "X" and rad1 == "ح" and ch[len] == AMAQ then -- irregular verb اِسْتَحَى weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" else -- If one letter left, then it's a geminate verb. If the letter is alif or alif maqṣūra, it will trigger -- an error down the line. if vform_supports_geminate(vform) then weakness = "geminate" rad2 = ch[len] rad3 = ch[len] if vform == "III" or vform == "VI" then variant = "short" end else infer_err("Apparent geminate verb, but geminate verbs not allowed for this verb form") end end elseif quadlit then -- Process last two radicals of a quadriliteral verb form. rad3 = ch[radstart] rad4 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if rad4 == AMAQ or rad4 == ALIF and rad3 == Y or rad4 == Y then -- rad4 can be Y in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws in a row); it could be wāw or -- yāʾ, but doesn't affect the conjugation. rad4 = rad3 == W and {Y, W, ambig = true} or {W, Y, ambig = true} else infer_err("Last radical is " .. rad4 .. " but verb form " .. vform .. " doesn't support final-weak verbs", "novform") end else weakness = "sound" end else -- Process last two radicals of a triliteral verb form. rad2 = ch[radstart] rad3 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if vform == "I" and (is_waw_ya(rad3) or rad3 == ALIF or rad3 == AMAQ) then local inferred_past_vowel, inferred_nonpast_vowel -- Check for final-weak form I verb. It can end in tall alif (rad3 = wāw) or alif maqṣūra (rad3 = yāʾ) -- or a wāw or yāʾ (with a past vowel of i or u, e.g. nasiya/yansā "forget" or with a passive-only -- verb). if rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated+final-weak" else weakness = "final-weak" end if rad3 == ALIF then rad3 = W inferred_past_vowel = A inferred_nonpast_vowel = U if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not tall alif (ا)", "novform") end elseif rad3 == AMAQ then rad3 = Y inferred_past_vowel = A inferred_nonpast_vowel = I if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not alif maqṣūra (ى)", "novform") end elseif rad1 == "ح" and rad2 == Y and rad3 == Y then -- Long variant حَيِيَ. inferred_past_vowel = I inferred_nonpast_vowel = A variant = "long" else if not is_passive_only(passive) then -- does a non-passive final-weak verb in -uwa ever happen? (YES: e.g. [[رجو]] "to be slack") inferred_past_vowel = rad3 == Y and I or U inferred_nonpast_vowel = A end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} -- ambiguous end if inferred_past_vowel then local raw_past_vowel = rget(past_vowel) local raw_nonpast_vowel = rget(nonpast_vowel) if raw_past_vowel ~= "-" then if raw_past_vowel ~= inferred_past_vowel then infer_err(("Final-weak form-I verb inferred past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_past_vowel], undia[raw_past_vowel]), "novform") else -- in case of footnote in past_vowel inferred_past_vowel = past_vowel end end if raw_nonpast_vowel ~= "-" and raw_nonpast_vowel ~= A and inferred_nonpast_vowel == U then -- if inferred as I or A, the reality can be the reverse; form-I final-weak verbs with a~a and -- i~i exist, e.g. سَعَى/يَسْعَى, وَلِيَ/يَلِي. Weird verb [[صها]] (also written [[صهى]]) has non-past -- يصهى so we can't throw an error in this situation. if raw_nonpast_vowel ~= inferred_nonpast_vowel then infer_err(("Final-weak form-I verb inferred non-past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_nonpast_vowel], undia[raw_nonpast_vowel]), "novform") else -- in case of footnote in nonpast_vowel inferred_nonpast_vowel = nonpast_vowel end end end if not is_passive_only(passive) then if rget(past_vowel) == "-" then past_vowel = inferred_past_vowel end if rget(nonpast_vowel) == "-" then nonpast_vowel = inferred_nonpast_vowel end end elseif vform == "IX" and is_waw_ya(rad3) and len == radstart + 2 and ch[len] == AMAQ then -- Final-weak form IX verbs like اِرْعَوَى "to desist, to repent, to see the light". weakness = "final-weak" expected_length = radstart + 2 elseif vform == "X" and rad1 == "ح" and rad2 == Y and rad3 == ALIF then -- Long variant اِسْتَحْيَا. weakness = "final-weak" rad3 = Y variant = "long" elseif rad3 == AMAQ or rad2 == Y and rad3 == ALIF or rad3 == Y then -- rad3 == Y happens in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" else infer_err("Last radical is " .. rad3 .. " but verb form doesn't support final-weak verbs") end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} elseif rad2 == ALIF then if vform_supports_hollow(vform) then weakness = "hollow" local function set_past_to_a() if req(past_vowel, A) then -- already set elseif req(past_vowel, "-") or req(past_vowel, rget(nonpast_vowel)) then past_vowel = A else infer_err(("Form I hollow verb with nonpast vowel set to '%s' must have past vowel set to 'a' or the same value, not %s"): format(undia[rget(nonpast_vowel)], undia[rget(past_vowel)]), "novform") end end if vform == "I" and req(nonpast_vowel, U) then rad2 = W set_past_to_a() elseif vform == "I" and req(nonpast_vowel, I) then rad2 = Y set_past_to_a() else if req(nonpast_vowel, A) and not req(past_vowel, I) then infer_err(("Form I hollow verb with nonpast vowel set to 'a' must have past vowel set to 'i', not %s"): format(undia[rget(past_vowel)]), "novform") end -- Ambiguous radical; could be wāw or yāʾ; if verb form I, it's critical to get this right, and -- the caller checks for this situation and throws an error if non-past vowel is "a" and second -- radical isn't explicitly given. rad2 = {W, Y, ambig = true, need_radical = true} end else infer_err("Second radical is alif but verb form doesn't support hollow verbs") end elseif vform == "I" and rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated" elseif rad2 == rad3 and (vform == "III" or vform == "VI") then weakness = "geminate" variant = "long" else weakness = "sound" end end if expected_length then check_len(expected_length, expected_length) end end rad1 = convert(rad1, 1) rad2 = convert(rad2, 2) rad3 = convert(rad3, 3) rad4 = convert(rad4, 4) if not weakness then error("Internal error: Returned weakness from infer_radicals() is nil") end return { weakness = weakness, rad1 = rad1, rad2 = rad2, rad3 = rad3, rad4 = rad4, past_vowel = past_vowel, nonpast_vowel = nonpast_vowel, form_viii_assim = form_viii_assim, variant = variant, } end -- bot interface to infer_radicals() function export.infer_radicals_json(frame) local iparams = { headword = {}, vform = {}, passive = {}, past_vowel = {}, nonpast_vowel = {}, is_reduced = {type = "boolean"}, } local iargs = require("Module:parameters").process(frame.args, iparams) return require("Module:JSON").toJSON(export.infer_radicals(iargs)) end -- Infer vocalization from participle headword (active or passive), verb form (I, II, etc.) and whether the headword is -- active or passive. Throw an error if headword is malformed. Returned radicals may contain Latin letters "t", "w" or "y" -- indicating ambiguous radicals guessed to be tāʾ, wāw or yāʾ respectively. function export.infer_participle_vocalization(headword, vform, weakness, is_active) local chars = {} local orig_headword = headword -- Sub out alif-madda for easier processing. headword = rsub(headword, AMAD, HAMZA .. ALIF) local len = ulen(headword) -- Extract the headword letters into an array. for i = 1, len do table.insert(chars, usub(headword, i, i)) end local function form_intro_error_msg() return ("For verb form %s %s%s participle %s, "):format(vform, orig_headword ~= headword and "normalized " or "", is_active and "active" or "passive", headword) end local function err(msg) error(form_intro_error_msg() .. msg, 1) end -- Check that length of headword is within [min, max]. local function check_len(min, max) if min and len < min then err(("expected at least %s letters but saw %s"):format(min, len)) elseif max and len > max then err(("expected at most %s letters but saw %s"):format(max, len)) end end -- Get the character at `ind`, making sure it exists. local function c(ind) check_len(ind) return chars[ind] end -- Check that the letter at the given index is the given string, or is one of the members of the given array local function check(index, must) local letter = chars[index] local function make_possible_values() if type(must) == "string" then return must else return list_to_text(must, nil, " or ") end end if not letter then err(("expected a letter (specifically %s) at position %s, but participle is too short"):format( make_possible_values(), index)) end local matches if type(must) == "string" then matches = letter == must else matches = m_table.contains(must, letter) end if not matches then err(("letter %s at index %s must be %s"):format(letter, index, make_possible_values())) end end local function check_weakness(values, allow_missing, invert_condition) local function make_possible_weaknesses() for i, val in ipairs(values) do values[i] = "'" .. val .. "'" end return list_to_text(values, nil, " or ") end if allow_missing and invert_condition then error("Internal error: Can't specify both allow_missing and invert_condition") end if not weakness then if allow_missing or invert_condition then return else err(("weakness is unspecified but must be %s"):format(make_possible_weaknesses())) end else local matches = m_table.contains(values, weakness) if invert_condition and matches then err(("weakness '%s' must not be %s"):format(weakness, make_possible_weaknesses())) elseif not invert_condition and not matches then err(("weakness '%s' must be %s"):format(weakness, make_possible_weaknesses())) end end end local vocalized local function handle_possibly_final_weak(sound_prefix, expected_length) check_len(expected_length, expected_length) if c(expected_length) == AMAQ then -- passive final-weak if is_active then err("participle in -ِى only allowed for passive participles") end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. AN .. AMAQ else -- all others behave as if sound check_weakness({"final-weak", "assimilated+final-weak"}, nil, "invert condition") vocalized = sound_prefix .. (is_active and I or A) .. c(expected_length) end end if not (vform == "I" and is_active) then -- all participles except verb form I active begin in م-. check(1, M) end if vform == "I" then if is_active then check(2, ALIF) local sound_prefix = c(1) .. AA .. c(3) if len == 3 then if c(3) == HAMZA then -- Either hollow with hamzated third radical, e.g. [[شاء]] active participle 'شَاءٍ', or final-weak -- with hamzated second radical, e.g. [[رأى]] active participle 'رَاءٍ'. Theoretically (?), also -- geminate with hamzated second/third radical, but I don't know if any such verbs exist. if weakness == "geminate" then vocalized = sound_prefix .. SH else check_weakness({"hollow", "final-weak"}, "allow missing") vocalized = sound_prefix .. IN end else check_weakness({"final-weak", "geminate"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end end else check_len(4, 4) -- we will convert back to alif maqṣūra below as needed vocalized = sound_prefix .. I .. c(4) end else -- assimilated verbs: regular, e.g. مَوْزُون "weighed" -- geminate verbs: regular, e.g. مَبْلُول "moistened" -- third-hamzated verbs: مَبْرُوء -- hollow verbs: مَقُود "led, driven"; مَزِيد "added, increased" -- hollow first-hamzated verbs: مَئِيض "returned, reverted"; مَأْيُوس "despaired" (NOTE: formation is sound); -- مَأُود or مَؤُود "bent; depleted" -- hollow third-hamzated verbs: مَشِيء "willed, intended", مَضُوء "glittered?" -- final-weak: مَلْقِيّ "found, encountered"; مَصْغُوّ "inclined" -- hollow + final-weak: مَشْوِيّ "fried, grilled", مَهْوِيّ "loved" -- first-hamzated + hollow + final-weak: مَأْوِيّ "received hospitably" local sound_prefix = MA .. c(2) .. SK .. c(3) if len == 5 then -- sound, assimilated or geminate check(4, W) vocalized = sound_prefix .. UU .. c(5) else check_len(4, 4) if c(4) == W then -- final-weak third-wāw vocalized = sound_prefix .. U .. W .. SH elseif c(4) == Y then -- final-weak third-yāʾ vocalized = sound_prefix .. I .. Y .. SH else -- hollow check(3, {W, Y}) if c(3) == W then vocalized = MA .. c(2) .. UU .. c(4) else vocalized = MA .. c(2) .. II .. c(4) end end end end elseif vform == "II" or vform == "V" or vform == "XII" or vform == "XIII" or vform == "Iq" or vform == "IIq" or vform == "IIIq" then local sound_prefix, expected_length if vform == "II" then sound_prefix = MU .. c(2) .. A .. c(3) .. SH expected_length = 4 elseif vform == "V" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SH expected_length = 5 elseif vform == "XII" then -- e.g. [[احدودب]] "to be or become convex or humpbacked", مُحْدَوْدِب (active); -- [[اثنونى]] "to be bent; to be doubled up", مُثْنَوْنٍ (active) check(4, W) if c(3) ~= c(5) then err(("third letter %s should be the same as the fifth letter %s"):format(c(3), c(5))) end sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SK .. c(5) expected_length = 6 elseif vform == "XIII" then -- e.g. [[اخروط]] "to get entangled; to extend", مُخْرَوِّط (active), مُخْرَوَّط (passive) check(4, W) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SH expected_length = 5 elseif vform == "Iq" then sound_prefix = MU .. c(2) .. A .. c(3) .. SK .. c(4) expected_length = 5 elseif vform == "IIq" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SK .. c(5) expected_length = 6 elseif vform == "IIIq" then -- e.g. [[اخرنطم]] "to be proud and angry" check(4, T) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. N .. SK .. c(5) expected_length = 6 else error("Internal error: Unhandled verb form " .. vform) end if len == expected_length - 1 then -- active final-weak if not is_active then err(("length-%s participle only allowed for active participles"):format(len)) end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. IN else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "III" or vform == "VI" then local sound_prefix, expected_length if vform == "VI" then check(2, T) check(4, ALIF) sound_prefix = MU .. T .. A .. c(3) .. AA .. c(5) expected_length = 6 else sound_prefix = MU .. c(2) .. AA .. c(4) expected_length = 5 end if len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. SH end else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "IV" or vform == "X" then -- form IV: -- sound: مُرْسِخ (active, "entrenching"), مُرْسَخ (passive, "entrenched") -- first-hamzated (like sound): مُؤْيِس (active, "causing to despair"), مُؤْيَس (passive, "caused to despair") -- final-weak: مُكْرٍ (active, "renting out"), مُكْرًى (passive, "rented out") -- assimilated: مُورِد (active, "transferring"), مُورَد (passive, "transferred"); same when first-Y, e.g. -- أَيْقَنَ "to be certain of": مُوقِن (active), مُوقَن (passive) -- assimilated + final-weak: مُورٍ (active, "setting fire, kindling"), مُورًى (passive, "set fire, kindled") -- geminate: مُمِدّ (active, "granting, helping"), مُمَدّ (passive, "granted, helped") -- hollow: مُزِيل (active, "eliminating"), مُزَال (passive, "eliminated") -- hollow + final-weak: مُعْيٍ (active, "tiring"), مُعْيًى (passive, "tired") local sound_prefix, expected_length if vform == "X" then check(2, S) check(3, T) sound_prefix = MU .. S .. SK .. T .. A .. c(4) expected_length = 6 else sound_prefix = MU .. c(2) expected_length = 4 end if len == expected_length and c(len - 1) == Y and c(len) ~= AMAQ then -- active hollow if not is_active then err("this shape only allowed for active participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. II .. c(len) elseif len == expected_length and c(len - 1) == ALIF then -- passive hollow if is_active then err("this shape only allowed for passive participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(len) elseif len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. I .. c(len) .. SH elseif vform == "IV" and c(2) == W then -- assimilated final-weak vocalized = sound_prefix .. c(len) .. IN else vocalized = sound_prefix .. SK .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else if vform == "IV" and c(2) == W then -- assimilated, possibly final-weak sound_prefix = sound_prefix .. c(expected_length - 1) else sound_prefix = sound_prefix .. SK .. c(expected_length - 1) end handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "VII" or vform == "VIII" then -- form VII (passive participles are fairly rare but do exist): -- sound: مُنْكَتِب (active "subscribing"), مُنْكَتَب (passive "subscribed") -- geminate: مُنْضَمّ (both active "joining, containing" and passive "joined, contained") -- final-weak: مُنْطَلٍ (active "fooling (someone)"), مُنْطَلًى (passive "fooled") -- final-weak with medial wāw: مُنْطَوٍ (active "involving"), مُنْطَوًى (passive "involved") -- hollow: مُنْقَاد (both active "complying with" and passive "complied with") -- -- for form VIII, the same variants exist but things are complicated by assimilations involving the template T. -- sound third-hamzated no assimilation: مُبْتَدِئ (active "beginning"), مُبْتَدَأ (passive "begun") -- geminate no assimilation: مُبْتَزّ (both active "robbing" and passive "robbed") -- final-weak no assimilation: مُبْتَنٍ (active "building"), مُبْتَنًى (passive "built") -- final-weak with medial wāw no assimilation: مُحْتَوٍ (active "containing"), مُحْتَوًى (passive "contained") -- hollow no assimilation: مُخْتَار (both active "choosing" and passive "chosen") -- -- sound with total assimilation: مُتَّبِع (active "following"), مُتَّبَع (passive "followed") -- sound with total assimilation, assimilating wāw: مُتَّعِد (active "threatening"), مُتَّعَد (passive "threatened") -- sound with total assimilation, irregularly assimilating hamza: مُتَّخِذ (active "taking"), مُتَّخَذ (passive "taken") -- sound with total assimilation (to ḏāl, producing dāl): مُدَّخِر (active "reserving"), مُدَّخَر (passive "reserved") -- sound with total assimilation (to ḏāl): مُذَّكِر (active "remembering"), مُذَّكَر (passive "remembered") -- sound with total assimilation (to ṭāʔ): مُطَّرِح (active "discarding"), مُطَّرَح (passive "discarded") -- sound with total assimilation (to ẓāʔ): مُظَّلِم (active "tolerating"), مُظَّلَم (passive "tolerated") -- final-weak with total assimilation, assimilating wāw: مُتَّقٍ (active "guarding against"), مُتَّقًى (passive "guarded against") -- final-weak with total assimilation (to ṯāʔ): مُثَّنٍ (active "undulating"), مُثَّنًى (passive "undulated") -- final-weak with total assimilation (to dāl): مُدَّعٍ (active "claiming"), مُدَّعًى (passive "claimed") -- sound with partial assimilation (to zayn): مُزْدَهِر (active "thriving"), مُزْدَهَر (passive "thrived") -- sound with medial wāw with partial assimilation (to zayn): مُزْدَوِج (active "appearing twice") -- sound with partial assimilation (to ṣād): مُصْطَبِح (active "illuminating"), مُصْطَبَح (passive, "illuminated") -- sound with partial assimilation (to ḍād): مُضْطَرِب (active "to be disturbed"; no passive) -- geminate with partial assimilation (to ṣād): مُصْطَبّ (both active "effusing" and passive "effused") -- geminate with partial assimilation (to ḍād): مُضْطَرّ (both active "forcing" and passive "forced") -- final-weak with partial assimilation (to ṣād): مُصْطَلٍ (active "warming"), مُصْطَلًى (passive "warmed") -- hollow with partial assimilation (to zayn): مُزْدَاد (both active "increasing" and passive "increased") -- hollow with partial assimilation (to ṣad): مُصْطَاد (both active "hunting" and passive "hunted") local sound_prefix, sufind if vform == "VII" then check(2, N) sound_prefix = MU .. N .. SK .. c(3) sufind = 4 else local c2 = c(2) if c2 == T or c2 == "د" or c2 == "ث" or c2 == "ذ" or c2 == "ط" or c2 == "ظ" then -- full assimilation sound_prefix = MU .. c2 .. SH sufind = 3 else -- partial or no assimilation if c2 == "ز" then check(3, "د") elseif c2 == "ص" or c2 == "ض" then check(3, "ط") else check(3, T) end sound_prefix = MU .. c2 .. SK .. c(3) sufind = 4 end end if c(sufind) == ALIF then -- hollow, active or passive check_len(sufind + 1, sufind + 1) check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(sufind + 1) elseif len == sufind then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. A .. c(len) .. SH else vocalized = sound_prefix .. A .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else sound_prefix = sound_prefix .. A .. c(sufind) handle_possibly_final_weak(sound_prefix, sufind + 1) end elseif vform == "IX" then check_len(4, 4) vocalized = MU .. c(2) .. SK .. c(3) .. A .. c(4) .. SH elseif vform == "IVq" then -- e.g. [[اذلعب]] "to scamper away", مُذْلَعِبّ (active), مُذْلَعَبّ (passive); -- [[اطمأن]] "to remain quietly; to be certain", مُطْمَئِنّ (active), مُطْمَأَنّ (passive) check_len(5, 5) local sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. c(4) if is_active then vocalized = sound_prefix .. I .. c(5) .. SH else vocalized = sound_prefix .. A .. c(5) .. SH end elseif vform == "XI" then check_len(5, 5) check(4, ALIF) vocalized = MU .. c(2) .. SK .. c(3) .. AA .. c(5) .. SH -- e.g. [[احمار]] "to turn red, to blush", مُحْمَارّ (active) elseif vform == "XIV" or vform == "XV" then -- FIXME: Implement. No examples in Wiktionary currently; need to look up in a grammar. error("Support for verb form " .. vform .. " not implemented yet") else error("Don't recognize verb form " .. vform) end vocalized = rsub(vocalized, HAMZA .. AA, AMAD) local reconstructed_headword = lang:makeEntryName(vocalized) if reconstructed_headword ~= orig_headword then error(("Internal error: Vocalized participle %s doesn't match original participle %s"):format( vocalized, orig_headword)) end -- Apply NFC-style normalization to match MediaWiki's automatic normalization return apply_nfc_shadda(vocalized) end function export.infer_participle_vocalization_json(frame) local iparams = { [1] = {required = true}, [2] = {required = true}, ["weakness"] = {}, ["passive"] = {type = "boolean"} } local iargs = require("Module:parameters").process(frame.args, iparams) return export.infer_participle_vocalization(iargs[1], iargs[2], iargs.weakness, not iargs.passive) end return export omf2d5lsrcg3zk9kkko1y36cxwc0wvg 1099198 1099186 2026-08-22T21:36:29Z ForzaGreen 28665 استبدال الأرقام العربية المشرقية بالأرقام الغربية في التعليقات والمراجع (تعليقات فقط، لا تغيير في التصريف) 1099198 Scribunto text/plain local export = {} --[=[ This module implements {{ar-conj}} and provides the underlying conjugation functions for {{ar-verb}} (whose actual formatting is done in [[Module:ar-headword]]). Author: User:Benwing, from an early version (2013-2014) by User:Atitarev, User:ZxxZxxZ. ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "past_1s" (past tense first-person singular), "juss_pass_3fp" (non-past jussive passive third-person feminine plural) "ap" (active participle). Each slot is filled with zero or more forms. -- "form" = The conjugated Arabic form representing the value of a given slot. -- "lemma" = The dictionary form of a given Arabic term. For Arabic, normally the third person masculine singular past, although other forms may be used if this form is missing (e.g. in passive-only verbs or verbs lacking the past). ]=] --[=[ FIXME: 1. Finish unimplemented conjugation types. Only IX-final-weak left (extremely rare, possibly only one verb اِعْمَايَ (according to Haywood and Nahmad p. 244, who are very specific about the irregular occurrence of alif + yā instead of expected اِعْمَيَّ with doubled yā). Not in Hans Wehr. NOTE: Not true about this, cf. form IX اِرْعَوَى "to desist, to repent, to see the light". Also note form XII اِخْضَوْضَرَ = form IX اِخْضَرَّ "to be or become green". [DONE except for اِعْمَايَ] 2. Implement irregular verbs as special cases and recognize them, e.g. -- laysa "to not be"; only exists in the past tense, no non-past, no imperative, no participles, no passive, no verbal noun. Irregular alternation las-/lays-. [IMPLEMENTABLE USING OVERRIDES] -- istaḥā yastaḥī "be ashamed of" -- this is complex according to Hans Wehr because there are two verbs, regular istaḥyā yastaḥyī "to spare (someone)'s life" and irregular istaḥyā yastaḥyī "to be ashamed to face (someone)", which is irregular because it has the alternate irregular form istaḥā yastaḥī which only applies to this meaning. Currently we follow Haywood and Nahmad in saying that both varieties can be spelled istaḥyā/istaḥā/istaḥḥā, but we should instead use a variant= param similar to حَيَّ to distinguish the two possibilities, and maybe not include istaḥḥā. -- ʿayya/ʿayiya yaʿayyu/yaʿyā "to not find the right way, be incapable of, stammer, falter, fall ill". This appears to be a mixture of a geminate and final-weak verb. Unclear what the whole paradigm looks like. Do the consonant-ending parts in the past follow the final-weak paradigm? Is it the same in the non-past? Or can you conjugate the non-past fully as either geminate or final-weak? -- اِنْمَحَى inmaḥā or يمَّحَى immaḥā "to be effaced, obliterated; to disappear, vanish" has irregular assimilation of inm- to imm- as an alternative. inmalasa "to become smooth; to glide; to slip away; to escape" also has immalasa as an alternative. The only other form VII verbs in Hans Wehr beginning with -m- are inmalaḵa "to be pulled out, torn out, wrenched" and inmāʿa "to be melted, to melt, to dissolve", which are not listed with imm- alternatives, but might have them; if so, we should handle this generally. [DONE] -- يَرَعَ yaraʕa yariʕu "to be a coward, to be chickenhearted" as an alternative form of يَرِعَ yariʕa yayraʕu (as given in Wehr). [IMPLEMENTABLE USING OVERRIDES] 3. Implement individual override parameters for each paradigm part. See Module:fro-verb for an example of how to do this generally. Note that {{temp|ar-conj-I}} and other of the older templates already had such individual override params. [DONE] Irregular verbs already implemented: -- [ḥayya/ḥayiya yaḥyā "live" -- behaves like a normal final-weak verb (e.g. past first singular ḥayītu) except in the past-tense parts with vowel-initial endings (all the third person except for the third feminine plural). The normal singular and dual endings have -yiya- in them, which compresses to -yya-, with the normal endings the less preferred ones. In masculine third plural, expected ḥayū is replaced by ḥayyū by analogy to the -yy- parts, and the regular form is not given as an alternant in John Mace. Barron's 201 verbs appears to have the regular ḥayū as the part, however. Note also that final -yā appears with tall alif. This appears to be a spelling convention of Arabic, also applying in ḥayyā (form II, "to keep (someone) alive") and 'aḥyā (form IV, "to animate, revive, give birth to, give new life to").] -- implemented -- [ittaxadha yattaxidhu "take"] -- implemented -- [sa'ala yas'alu "ask" with alternative jussive/imperative yasal/sal] -- implemented -- [ra'ā yarā "see"] -- implemented -- ['arā yurī "show"] -- implemented -- ['akala ya'kulu "eat" with imperative kul] -- implemented -- ['axadha ya'xudhu "take" with imperative xudh] -- implemented -- ['amara ya'muru "order" with imperative mur] -- implemented --]=] local force_cat = false -- set to true for debugging -- if true, always maintain manual translit during processing, and compare against full translit at the end local debug_translit = false local lang = require("Module:languages").getByCode("ar") local m_links = require("Module:links") local m_string_utilities = require("Module:string utilities") local m_table = require("Module:table") local ar_utilities = require("Module:ar-utilities") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local list_to_text = mw.text.listToText local rfind = m_string_utilities.find local rsubn = m_string_utilities.gsub local rmatch = m_string_utilities.match local rsplit = m_string_utilities.split local usub = m_string_utilities.sub local ulen = m_string_utilities.len local u = m_string_utilities.char local unpack = unpack or table.unpack -- Lua 5.2 compatibility local dump = mw.dumpObject -- Within this module, conjugations are the functions that do the actual -- conjugating by creating the parts of a basic verb. -- They are defined further down. local conjugations = {} -- hamza variants local HAMZA = u(0x0621) -- hamza on the line (stand-alone hamza) = ء local HAMZA_ON_ALIF = u(0x0623) local HAMZA_ON_W = u(0x0624) local HAMZA_UNDER_ALIF = u(0x0625) local HAMZA_ON_Y = u(0x0626) local HAMZA_ANY = "[" .. HAMZA .. HAMZA_ON_ALIF .. HAMZA_UNDER_ALIF .. HAMZA_ON_W .. HAMZA_ON_Y .. "]" local HAMZA_PH = u(0xFFF0) -- hamza placeholder local BAD = u(0xFFF1) local BORDER = u(0xFFF2) local KEEP_W_PH = u(0xFFF3) -- retained-wāw placeholder; see postprocess_term() -- diacritics local A = u(0x064E) -- fatḥa local AN = u(0x064B) -- fatḥatān (fatḥa tanwīn) local U = u(0x064F) -- ḍamma local UN = u(0x064C) -- ḍammatān (ḍamma tanwīn) local I = u(0x0650) -- kasra local IN = u(0x064D) -- kasratān (kasra tanwīn) local SK = u(0x0652) -- sukūn = no vowel local SH = u(0x0651) -- šadda = gemination of consonants local DAGGER_ALIF = u(0x0670) local DIACRITIC_ANY_BUT_SH = "[" .. A .. I .. U .. AN .. IN .. UN .. SK .. DAGGER_ALIF .. "]" -- Pattern matching short vowels local AIU = "[" .. A .. I .. U .. "]" -- Pattern matching short vowels or sukūn local AIUSK = "[" .. A .. I .. U .. SK .. "]" -- Pattern matching any diacritics that may be on a consonant local DIACRITIC = SH .. "?" .. DIACRITIC_ANY_BUT_SH -- translit_patterns local vowels = "aeiouāēīōū" local NV = "[^" .. vowels .. "]" local dia = {a = A, i = I, u = U} local undia = {[A] = "a", [I] = "i", [U] = "u", ["-"] = "-"} -- various letters and signs local ALIF = u(0x0627) -- ʾalif = ا local AMAQ = u(0x0649) -- ʾalif maqṣūra = ى local AMAD = u(0x0622) -- ʾalif madda = آ local TAM = u(0x0629) -- tāʾ marbūṭa = ة local T = u(0x062A) -- tāʾ = ت local HYPHEN = u(0x0640) local N = u(0x0646) -- nūn = ن local W = u(0x0648) -- wāw = و local Y = u(0x064A) -- yāʾ = ي local S = "س" local M = "م" local LRM = u(0x200e) -- left-to-right mark -- common combinations local AH = A .. TAM local AT = A .. T local AA = A .. ALIF local AAMAQ = A .. AMAQ local AAH = AA .. TAM local AAT = AA .. T local II = I .. Y local UU = U .. W local AY = A .. Y local AW = A .. W local AYSK = AY .. SK local AWSK = AW .. SK local NA = N .. A local NI = N .. I local AAN = AA .. N local AANI = AA .. NI local AYNI = AYSK .. NI local AWNA = AWSK .. NA local AYNA = AYSK .. NA local AYAAT = AY .. AAT local UNU = "[" .. UN .. U .. "]" local MA = M .. A local MU = M .. U local TA = T .. A local TU = T .. U local _I = ALIF .. I local _U = ALIF .. U --W: Morphological pattern (الوزن الصرفي) to verb form mapping local MORPHOLOGICAL_PATTERN_TO_FORM = { ["فعَل يفعُل"] = "I/a~u", ["فعَل يفعِل"] = "I/a~i", ["فعَل يفعَل"] = "I/a~a", ["فعُل يفعُل"] = "I/u~u", ["فعِل يفعَل"] = "I/i~a", ["فعِل يفعِل"] = "I/i~i", ["فعّل"] = "II", ["فاعل"] = "III", ["أفعل"] = "IV", ["تفعّل"] = "V", ["تفاعل"] = "VI", ["انفعل"] = "VII", ["افتعل"] = "VIII", ["افعلّ"] = "IX", ["استفعل"] = "X", ["افعالّ"] = "XI", ["افعوعل"] = "XII", ["افعوّل"] = "XIII", ["فعلل"] = "Iq", ["تفعلل"] = "IIq", ["افعنلل"] = "IIIq", -- "XIV" should not be used ["افعللّ"] = "IVq", } --W: Create reverse mapping from form to morphological pattern local FORM_TO_MORPHOLOGICAL_PATTERN = {} for pattern, form in pairs(MORPHOLOGICAL_PATTERN_TO_FORM) do FORM_TO_MORPHOLOGICAL_PATTERN[form] = pattern end --W: local MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV = { ["فعَل يفعُل"] = "مُجرَّد", ["فعَل يفعِل"] = "مُجرَّد", ["فعَل يفعَل"] = "مُجرَّد", ["فعُل يفعُل"] = "مُجرَّد", ["فعِل يفعَل"] = "مُجرَّد", ["فعِل يفعِل"] = "مُجرَّد", ["فعّل"] = "مزيد بحرف", ["فاعل"] = "مزيد بحرف", ["أفعل"] = "مزيد بحرف", ["تفعّل"] = "مزيد بحرفين", ["تفاعل"] = "مزيد بحرفين", ["انفعل"] = "مزيد بحرفين", ["افتعل"] = "مزيد بحرفين", ["افعلّ"] = "مزيد بحرفين", ["استفعل"] = "مزيد بثلاثة أحرف", ["افعالّ"] = "مزيد بثلاثة أحرف", ["افعوعل"] = "مزيد بثلاثة أحرف", ["افعوّل"] = "مزيد بثلاثة أحرف", ["فعلل"] = "مُجرَّد", ["تفعلل"] = "مزيد بحرف", ["افعنلل"] = "مزيد بحرفين", ["افعللّ"] = "مزيد بحرفين", } local translit_cache = { -- hamza variants [HAMZA] = "ʔ", [HAMZA_ON_ALIF] = "ʔ", [HAMZA_ON_W] = "ʔ", [HAMZA_UNDER_ALIF] = "ʔ", [HAMZA_ON_Y] = "ʔ", [HAMZA_PH] = "ʔ", -- diacritics [A] = "a", [AN] = "an", [U] = "u", [UN] = "un", [I] = "i", [IN] = "in", [SK] = "", [SH] = "*", -- handled specially [DAGGER_ALIF] = "ā", -- various letters and signs [""] = "", [ALIF] = BAD, -- we should never be transliterating ALIF by itself, as its translit in isolation is ambiguous [AMAQ] = BAD, [AMAD] = "ʔā", [TAM] = "", [T] = "t", [N] = "n", [W] = "w", [Y] = "y", [S] = "s", [M] = "m", [LRM] = "", -- common combinations [AH] = "a", [AT] = "at", [AA] = "ā", [AAMAQ] = "ā", [AAH] = "āh", [AAT] = "āt", [II] = "ī", [UU] = "ū", [AY] = "ay", [AW] = "aw", [AYSK] = "ay", [AWSK] = "aw", [NA] = "na", [NI] = "ni", [AAN] = "ān", [AANI] = "āni", [AYNI] = "ayni", [AWNA] = "awna", [AYNA] = "ayna", [AYAAT] = "ayāt", [MA] = "ma", [MU] = "mu", [TA] = "ta", [TU] = "tu", [_I] = "i", [_U] = "u", } local function transliterate(text) local cached = translit_cache[text] if cached then if cached == BAD then error(("Internal error: Unable to transliterate %s because explicitly marked as BAD"):format(text)) end return cached end local tr = (lang:transliterate(text)) if not tr then error(("Internal error: Unable to transliterate: %s"):format(text)) end translit_cache[text] = tr return tr end local all_person_number_list = { "1s", "2ms", "2fs", "3ms", "3fs", "2d", "3md", "3fd", "1p", "2mp", "2fp", "3mp", "3fp" } local function make_person_number_slot_accel_list(list) local slot_accel_list = {} return slot_accel_list end local imp_person_number_list = {} for _, pn in ipairs(all_person_number_list) do if pn:find("^2") then table.insert(imp_person_number_list, pn) end end local passive_types = m_table.listToSet { "pass", -- verb has both active and passive "ipass", -- verb is active with impersonal passive "nopass", -- verb is active-only "onlypass", -- verb is passive-only "onlypass-impers", -- verb itself is impersonal, meaning passive-only with impersonal passive } local indicator_flags = m_table.listToSet { "nopast", "no_nonpast", "noimp", "nocat", -- don't categorize or include annotations about this; useful in suppletive parts of verbs "reduced", -- verb has assimilation/reduction of initial coronals "altgem", -- form X with alternative past geminate forms with final-weak endings } export.potential_lemma_slots = {"past_3ms", "past_pass_3ms", "ind_3ms", "ind_pass_3ms", "imp_2ms"} export.unsettable_slots = {} for _, potential_lemma_slot in ipairs(export.potential_lemma_slots) do table.insert(export.unsettable_slots, potential_lemma_slot .. "_linked") end -- We don't set the active participle directly for form I because we don't want stative verbs (with past vowel i or u) -- to default to فَاعِل. Instead we set the special slot 'ap1' and later copy it to 'ap' for non-stative verbs. The user -- meanwhile can explicitly request the فَاعِل form for active participles for stative verbs using `ap:+`. table.insert(export.unsettable_slots, "ap1") -- primary default فَاعِل for form I active participles table.insert(export.unsettable_slots, "ap2") -- secondary default فَعِيل for form I active participles (stative I) table.insert(export.unsettable_slots, "ap3") -- secondary default فَعِل for form I active participles (stative II) table.insert(export.unsettable_slots, "apcd") -- secondary default أَفْعَل for form I active participles (color/defect) table.insert(export.unsettable_slots, "apan") -- secondary default فَعْلَان for form I active participles (in -ān) table.insert(export.unsettable_slots, "pp2") -- secondary default فَعِيل for form I passive participles (same as ap2) table.insert(export.unsettable_slots, "vn2") -- secondary default فِعَال for form III verbal nouns export.unsettable_slots_set = m_table.listToSet(export.unsettable_slots) local default_indicator_to_active_participle_slot = { ["+"] = "ap1", ["++"] = "ap2", ["+++"] = "ap3", ["+cd"] = "apcd", ["+an"] = "apan", } local slots_that_may_be_uncertain = { vn = "verbal noun", ap = "active participle", } -- Initialize all the slots for which we generate forms. local function add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_slots = { {"ap", "act|part"}, {"pp", "pass|part"}, {"vn", "vnoun"}, } for _, unsettable_slot in ipairs(export.unsettable_slots) do table.insert(alternant_multiword_spec.verb_slots, {unsettable_slot, "-"}) end -- Add entries for a slot with person/number variants. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is a string listing the set of inflection tags to add after the person/number tags. -- `person_number_list` is a list of the person/number slot suffixes to add to `slot_prefix`. local function add_personal_slot(slot_prefix, tag_suffix, person_number_list) for _, persnum in ipairs(person_number_list) do local slot = slot_prefix .. "_" .. persnum local accel = persnum:gsub("(.)", "%1|") .. tag_suffix table.insert(alternant_multiword_spec.verb_slots, {slot, accel}) end end local tenses = { {"past", "past|%s"}, {"ind", "non-past|%s|ind"}, {"sub", "non-past|%s|sub"}, {"juss", "non-past|%s|juss"}, } for _, slot_accel in ipairs(tenses) do local slot, accel = unpack(slot_accel) for _, voice in ipairs {"act", "pass"} do add_personal_slot(voice == "act" and slot or slot .. "_pass", accel:format(voice), all_person_number_list) end end add_personal_slot("imp", "imp", imp_person_number_list) alternant_multiword_spec.verb_slots_map = {} for _, slot_accel in ipairs(alternant_multiword_spec.verb_slots) do local slot, accel = unpack(slot_accel) alternant_multiword_spec.verb_slots_map[slot] = accel end end local overridable_stems = {} local slot_override_param_mods = { footnote = { item_dest = "footnotes", store = "insert", }, alt = {}, t = { -- [[Module:links]] expects the gloss in "gloss". item_dest = "gloss", }, gloss = {}, g = { -- [[Module:links]] expects the genders in "g". `sublist = true` automatically splits on comma (optionally -- with surrounding whitespace). item_dest = "genders", sublist = true, }, pos = {}, lit = {}, id = {}, --W: The q/qq/l/ll (qualifier and label) modifiers were removed: rendering them -- needs [[Module:pron qualifier]], which does not exist on ar.wiktionary, so any -- use of them raised a script error. Accepting them here again requires importing -- that module first and restoring the block in generate_link() below. } local function generate_obj(formval, parse_err, prefix, is_slot_override) local val, uncertain = formval:match("^(.*)(%?)$") val = val or formval uncertain = not not uncertain local ar, translit = val:match("^(.*)//(.*)$") if not ar then ar = val end if ar == "" then if uncertain then ar = "?" else error(("Can't specify blank value for override for %s override '%s'"):format( is_slot_override and "slot" or "stem", prefix)) end end return {form = ar, translit = translit, uncertain = uncertain} end local function parse_inline_modifiers(comma_separated_group, parse_err, prefix, is_slot_override) local function this_generate_obj(formval, parse_err) return generate_obj(formval, parse_err, prefix, is_slot_override) end return put.parse_inline_modifiers_from_segments { group = comma_separated_group, props = { param_mods = slot_override_param_mods, parse_err = parse_err, generate_obj = this_generate_obj, pre_normalize_modifiers = function(data) local modtext = data.modtext modtext = modtext:match("^(%[.*%])$") if modtext then return ("<footnote:%s>"):format(modtext) end return data.modtext end, }, } end local function allow_multiple_values_for_override(comma_separated_groups, data, is_slot_override) local retvals = {} for _, comma_separated_group in ipairs(comma_separated_groups) do local retval if is_slot_override then --W: pass `prefix` and `is_slot_override` through; without them the error -- raised for a blank override value formatted a nil prefix, which is a -- crash on Lua 5.1 rather than the intended message. Reachable from e.g. -- <I/a~u.vn:[[كتابة]]>, where the [[...]] is consumed as a footnote and -- leaves the value empty. retval = parse_inline_modifiers(comma_separated_group, data.parse_err, data.prefix, is_slot_override) else retval = generate_obj(comma_separated_group[1], data.parse_err, data.prefix, is_slot_override) retval.footnotes = data.fetch_footnotes(comma_separated_group) end table.insert(retvals, retval) end for _, form in ipairs(retvals) do if form.form == "+" or default_indicator_to_active_participle_slot[form.form] then if form.form ~= "+" and default_indicator_to_active_participle_slot[form.form] and not is_slot_override then error(("Stem override '%s' cannot use %s to request a secondary default"):format( data.prefix, form.form)) end data.base.slot_override_uses_default[data.prefix] = true end end for _, form in ipairs(retvals) do if form.form == "-" then data.base.slot_explicitly_missing[data.prefix] = true break end end if data.base.slot_explicitly_missing[data.prefix] then for _, form in ipairs(retvals) do if form.form ~= "-" then data.parse_err(("For slot or stem '%s', saw both - and a value other than -, which isn't allowed"): format(data.prefix)) end end return nil end return retvals end local function simple_choice(choices) return function(separated_groups, data) if #separated_groups > 1 then data.parse_err("For spec '" .. data.prefix .. ":', only one value currently allowed") end if #separated_groups[1] > 1 then data.parse_err("For spec '" .. data.prefix .. ":', no footnotes currently allowed") end local choice = separated_groups[1][1] if not m_table.contains(choices, choice) then data.parse_err("For spec '" .. data.prefix .. ":', saw value '" .. choice .. "' but expected one of '" .. table.concat(choices, "،") .. "'") end return choice end end for _, overridable_stem in ipairs { "past", "past_v", "past_c", "past_pass", "past_pass_v", "past_pass_c", "nonpast", "nonpast_v", "nonpast_c", "nonpast_pass", "nonpast_pass_v", "nonpast_pass_c", "imp", "imp_v", "imp_c", } do overridable_stems[overridable_stem] = allow_multiple_values_for_override end overridable_stems.past_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.past_pass_final_weak_vowel = simple_choice { "ay", "aw", "ī", "ū" } overridable_stems.nonpast_final_weak_vowel = simple_choice { "ā", "ī", "ū" } overridable_stems.nonpast_pass_final_weak_vowel = simple_choice { "ā", "ī", "ū" } ------------------------------------------------------------------------------- -- Utility functions -- ------------------------------------------------------------------------------- -- version of rsubn() that discards all but the first return value local function rsub(term, foo, bar) return (rsubn(term, foo, bar)) end -- version of rsubn() that returns a 2nd argument boolean indicating whether a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end -- Concatenate one or more strings or form objects. local function q(...) local not_all_strings = debug_translit local has_manual_translit = debug_translit for i = 1, select("#", ...) do local argt = select(i, ...) if not argt then error(("Internal error: Saw nil at index %s: %s"):format(i, dump({...}))) end if type(argt) ~= "string" then not_all_strings = true if argt.translit then has_manual_translit = true break end end end if not not_all_strings then -- just strings, concatenate directly return table.concat({...}) end local formvals = {} local translit = has_manual_translit and {} or nil local footnotes for i = 1, select("#", ...) do local argt = select(i, ...) if type(argt) == "string" then formvals[i] = argt if has_manual_translit then translit[i] = transliterate(argt) end else formvals[i] = argt.form if has_manual_translit then translit[i] = argt.translit or transliterate(argt.form) end footnotes = iut.combine_footnotes(footnotes, argt.footnotes) end end -- FIXME: Do we want to support other properties? return { form = table.concat(formvals), translit = has_manual_translit and table.concat(translit) or nil, footnotes = footnotes, } end -- Return the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget(rad) if type(rad) == "string" then return rad elseif type(rad) == "table" then return rad.form else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end export.rget = rget -- for use in [[Module:ar-headword]] -- Return the footnotes associated with `rad` (a radical or past/non-past vowel, either a string or form object). local function rget_footnotes(rad) if type(rad) == "string" then return nil elseif type(rad) == "table" then return rad.footnotes else error(("Internal error: Unexpected type for radical or past/non-past vowel: %s"):format(dump(rad))) end end -- Return true if the formval associated with `rad` (a radical or past/non-past vowel, either a string or form object) -- is `val`. local function req(rad, val) return rget(rad) == val end -- True if a form-I verb whose first radical is wāw elides that wāw in the non-past (يَعِدُ for -- *يَوْعِدُ) rather than keeping it (يَوْجَلُ). The elision belongs to the kasra non-past -- a~i -- وَعَدَ يَعِدُ, i~i وَرِثَ يَرِثُ -- and to the fatḥa non-past that is a throat-letter lowering of -- that same underlying kasra: a~a وَضَعَ يَضَعُ, وَهَبَ يَهَبُ. Everywhere else the wāw stays: -- i~a وَجِلَ يَوْجَلُ، وَنِيَ يَوْنَى (a fatḥa non-past that is the regular partner of a kasra past, -- not a lowered kasra) -- *~u وَجَلَ يَوْجُلُ، وَجُهَ يَوْجُهُ (a ḍamma non-past is never a lowered kasra) -- The two elided-anyway lexemes with a kasra past (وَسِعَ يَسَعُ, وَطِئَ يَطَأُ) are lexical and are -- what the explicit `I-assimilated` weakness exists to express -- see the comment on it in -- detect_indicator_spec(). -- -- The u-non-past half of this is attested directly: أنطوان الدحداح، معجم تصريف الأفعال العربية -- prints يَوْجُلُ/اُوْجُلْ for وَجَلَ (ص136) and says so in the page's own note -- "لا تُحذَفُ واوُ -- الفعلِ في المُضارعِ ولا تُقلَبُ في الأمرِ" -- and يَوْنَى/اِوْنَ for وَنِيَ (ص230). -- -- Returns true when the vowels aren't known, which keeps the historical default for callers -- that have radicals but no vowel pattern. local function form_i_w_assimilated(past_vowel, nonpast_vowel) if not past_vowel or not nonpast_vowel then return true end return req(nonpast_vowel, I) or req(nonpast_vowel, A) and req(past_vowel, A) end --W: Geminate form-I roots whose degemination vowel follows the مضارع by إتباع. -- When gemination breaks under a consonant-initial suffix, the vowel that surfaces on the -- second radical (مَدَدْتَ's second د) is normally the verb's own past vowel, which the وزن -- fixes at one value per measure: فتح for فعَل يفعُل (مَدَدْتَ، فَرَرْتَ، عَضَضْتَ), كسر for -- فعِل يفعَل (ظَلِلْتَ). Classical grammar also attests a minority إتباع variant on the -- فعَل يفعُل measure, where that vowel instead follows the مضارع's own ضمة (هَمُمْتَ). Which -- of the two a given verb takes is a fact about the lexeme, not about its وزن -- هَمَّ and -- مَدَّ share the measure and differ here -- so it cannot be derived from جذر + وزن and is -- listed, the same way SOUND_FORM_I_UU_ROOTS lists هَيُؤَ. Keyed rad1..rad2..rad3 and gated -- on the a~u pattern, so a listed root still degeminates normally under any other pattern. local GEMINATE_ITBAA_ROOTS = { ["همم"] = true, -- هَمَّ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، ص192 } -- The vowel that surfaces on the second radical of a geminate form-I verb once gemination -- breaks. `past_vowel` unless the root is an attested إتباع lexeme; see GEMINATE_ITBAA_ROOTS. local function geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel) if past_vowel and nonpast_vowel and req(past_vowel, A) and req(nonpast_vowel, U) and GEMINATE_ITBAA_ROOTS[rad1 .. rad2 .. rad3] then return nonpast_vowel end return past_vowel end --W: Form-I final-weak roots that keep rad3 as a consonant in the 2fs non-past and -- imperative (تَسْهُوِينَ، اُسْهُوِي) instead of contracting it away (تَسْهِينَ، اِسْهِي). -- -- This was briefly gated on the فعُل يفعُل measure alone, which made every root of that -- measure retain rad3 -- سَرُوَ included, on the reasoning that the measure is what keeps -- rad3 consonantal in the first place (its past 3ms is سَهُوَ, not the سَها an a~u root like -- دَعَا gives). That is a real argument but it is not evidence: the corpus has exactly one -- فعُل يفعُل final-weak page, so there is no second paradigm to check it against, and the -- rule it would displace -- contract before the 2fs -ī, as دَعَا does -- is the one the -- module has applied for years. Generalising an unverified reading over a whole class of -- live entries is the wrong direction to be wrong in, so this is back to listing what is -- actually attested, keyed and gated exactly like SOUND_FORM_I_UU_ROOTS. -- -- If سَرُوَ and the rest of the measure turn out to behave the same way, widening this is -- one line: drop the table lookup and keep the vowel gate. local FINAL_WEAK_RETAINED_RAD3_ROOTS = { ["سهو"] = true, -- سَهُوَ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، ص204 } local function final_weak_uu_retains_rad3(rad1, rad2, rad3, past_ending_vowel, nonpast_ending_vowel) return past_ending_vowel == "ū" and nonpast_ending_vowel == "ū" and FINAL_WEAK_RETAINED_RAD3_ROOTS[rad1 .. rad2 .. rad3] or false end -- Map `vow` (a past/non-past vowel, either a string or form object without translit) by passing the formval through -- `fn`. Don't call this on radicals because they may have manual translit and it isn't clear how to handle that. local function map_vowel(vow, fn) if type(vow) == "string" then return fn(vow) elseif type(vow) == "table" then return {form = fn(vow.form), footnotes = vow.footnotes} else error(("Internal error: Unexpected type for past/non-past vowel: %s"):format(dump(vow))) end end local function get_radicals_3(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.past, vowel_spec.nonpast end local function get_radicals_4(vowel_spec) return vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3, vowel_spec.rad4 end local function is_final_weak(base, vowel_spec) return vowel_spec.weakness == "final-weak" or base.form == "XV" end --W: Create a simple link local function link_term_simple(text) return "[[" .. text .. "]]" end local function link_term(text, face, id) return m_links.full_link({lang = lang, term = text, tr = "-", id = id}, face) end local function tag_text(text, tag, class) return m_links.full_link({lang = lang, alt = text, tr = "-"}) end local function track(page) require("Module:debug/track")("ar-verb/" .. page) return true end local function track_if_ar_conj(base, page) if base.alternant_multiword_spec.source_template == "ar-conj" then require("Module:debug/track")("ar-verb/" .. page) end return true end local function reorder_shadda(word) -- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets -- replaced with short-vowel+shadda during NFC normalisation, which -- MediaWiki does for all Unicode strings; however, it makes various -- processes inconvenient, so undo it. word = rsub(word, "(" .. DIACRITIC_ANY_BUT_SH .. ")" .. SH, SH .. "%1") return word end local function apply_nfc_shadda(word) -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization. This reverses the -- internal shadda+vowel format used during processing. word = rsub(word, SH .. "(" .. DIACRITIC_ANY_BUT_SH .. ")", "%1" .. SH) return word end ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- local function skip_slot(base, slot, allow_overrides) if base.slot_explicitly_missing[slot] then return true end if not allow_overrides and base.slot_overrides[slot] and not base.slot_override_uses_default[slot] then -- Skip any slots for which there are overrides, except those that request the default value using +, ++, etc. return true end if base.passive == "nopass" and (slot == "pp" or slot:find("_pass")) then return true elseif base.passive == "onlypass" and slot ~= "pp" and slot ~= "vn" and not slot:find("_pass") then return true elseif base.passive == "ipass" and slot:find("_pass") and not slot:find("3ms") then return true elseif base.passive == "onlypass-impers" and slot ~= "pp" and slot ~= "vn" and (not slot:find("_pass") or slot:find("_pass") and not slot:find("3ms")) then return true end if base.nopast and slot:find("^past_") then return true end if base.noimp and slot:find("^imp_") then return true end if base.no_nonpast and (slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss")) then return true end return false end local function basic_combine_stem_ending(stem, ending) return stem .. ending end local function basic_combine_stem_ending_tr(stem, ending) return stem .. ending end -- Concatenate `prefixes`, `stems` and `endings` (any of which may be an abbreviate form list, i.e. strings, form -- objects or lists of strings or form objects) and store into `slot`. If a user-supplied override exists for the slot, -- nothing will happen unless `allow_overrides` is provided. local function add3(base, slot, prefixes, stems, endings, allow_overrides) if skip_slot(base, slot, allow_overrides) then return end -- Optimization since the prefixes are almost always single strings. if type(prefixes) == "string" then local function do_combine_stem_ending(stem, ending) return prefixes .. stem .. ending end local function do_combine_stem_ending_tr(stem, ending) return transliterate(prefixes) .. stem .. ending end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, transliterate, do_combine_stem_ending_tr, base.form_footnotes) else iut.add_multiple_forms(base.forms, slot, {prefixes, stems, endings}, basic_combine_stem_ending, transliterate, basic_combine_stem_ending_tr, base.form_footnotes) end end -- Insert one or more forms in `form_or_forms` into `slot`. `form_or_forms` is an abbreviated form list (see comment at -- top of [[Module:inflection utilities]]). If a user-supplied override exists for the slot, nothing will happen unless -- `allow_overrides` is provided. BEWARE: One form object should never occur in two different slots, or twice in a given -- slot; if taking a form object from an existing slot, make sure to shallowCopy() it. local function insert_form_or_forms(base, slot, form_or_forms, allow_overrides, uncertain) if not skip_slot(base, slot, allow_overrides) then -- Some optimizations of the most common case of inserting a single string. if type(form_or_forms) == "string" and not base.form_footnotes then form_or_forms = {form = form_or_forms, uncertain = uncertain} iut.insert_form(base.forms, slot, form_or_forms) else local list = iut.convert_to_general_list_form(form_or_forms, base.form_footnotes) if uncertain then for _, formobj in ipairs(list) do formobj.uncertain = true end end iut.insert_forms(base.forms, slot, list) end end end -- Insert `string_or_form` into both the ap2 and pp2 slots, shallowCopying a form object to make sure no form objects -- occur in two slots. local function insert_ap2_pp2(base, string_or_form) insert_form_or_forms(base, "ap2", string_or_form) if type(string_or_form) == "table" then string_or_form = m_table.shallowCopy(string_or_form) end insert_form_or_forms(base, "pp2", string_or_form) end -- Convert `stemforms` (a string, a form object, or a list of strings and/or form objects) into "general form" (a list -- of form objects) and map `fn` over the list of objects. `fn` is passed two arguments (form value and translit) and -- should likewise return the new form value and translit. Footnotes will be preserved. FIXME: Preserve other metadata. local function map_general(stemforms, fn) return iut.map_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Similar to map_general() except that `fn` should return a single value (one or more strings or form objects), instead -- of two values (form value and translit), and the resulting value(s) from all calls to `fn` will be flattened to -- construct the overall return value. Footnotes will be preserved. FIXME: Preserve other metadata. local function flatmap_general(stemforms, fn) return iut.flatmap_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Given user-supplied stem overrides in `base`, construct any derived stem overrides (e.g. vowel-specific or -- consonant-specific variants), and truncate initial y-/ي- in any non-past overrides. local function construct_stems(base) local stems = base.stem_overrides stems.past_v = stems.past_v or stems.past stems.past_c = stems.past_c or stems.past stems.past_pass_v = stems.past_pass_v or stems.past_pass stems.past_pass_c = stems.past_pass_c or stems.past_pass stems.nonpast_v = stems.nonpast_v or stems.nonpast stems.nonpast_c = stems.nonpast_c or stems.nonpast stems.nonpast_pass_v = stems.nonpast_pass_v or stems.nonpast_pass stems.nonpast_pass_c = stems.nonpast_pass_c or stems.nonpast_pass stems.imp_v = stems.imp_v or stems.imp stems.imp_c = stems.imp_c or stems.imp local function truncate_nonpast_initial_cons(stem_type, form, translit) if form == "+" then return form, translit end if not form:find("^" .. Y) then error(("Form value %s for stem type '%s' should begin with ي"):format(form, stem_type)) end form = form:gsub("^" .. Y, "") if translit then if not translit:find("^y") then error(("Translit value %s for stem type '%s' should begin with y"):format(translit, stem_type)) end translit = translit:gsub("^y", "") end return form, translit end for _, nonpast_stem_type in ipairs { "nonpast_v", "nonpast_c", "nonpast_pass_v", "nonpast_pass_c" } do if stems[nonpast_stem_type] then stems[nonpast_stem_type] = map_general(stems[nonpast_stem_type], function(form, translit) return truncate_nonpast_initial_cons(nonpast_stem_type, form, translit) end) end end end -- Given user-specified overrides for stem `stemname`, return overrides with occurrences of + replaced by -- `default_stem`. If no overrides, return `default_stem`, or {} if no default. local function override_stem_if_needed(base, stemname, default_stem) local overrides = base.stem_overrides[stemname] if not overrides then return default_stem or {} end return map_general(overrides, function(form, translit) if form ~= "+" and default_indicator_to_active_participle_slot[form] then error(("Stem overrides cannot use secondary default indicators but saw %s in stem override '%s'"):format( form, stemname)) end if form == "+" then if translit then error(("Cannot supply manual translit along with + for stem override '%s'"):format(stemname)) end if not default_stem then error(("Cannot use + for stem override '%s' because no default is available"):format(stemname)) end if type(default_stem) ~= "string" then error(("Internal error: Default stem for '%s' is not a string: %s"):format(stemname, dump(default_stem))) end return default_stem end return form, translit end) end ------------------------------------------------------------------------------- -- Properties of different verbal forms -- ------------------------------------------------------------------------------- local allowed_vforms = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "Iq", "IIq", "IIIq", "IVq"} local allowed_vforms_set = m_table.listToSet(allowed_vforms) local allowed_vforms_with_weakness = m_table.shallowCopy(allowed_vforms) -- The user needs to be able to explicitly specify that a form-I verb (specifically one whose initial radical is و) is -- sound. Cf. wajiʕa yawjaʕu (not #yajaʕu) "to ache, to hurt". In general, i~a and u~u verbs whose initial radical is و -- seem to not assimilate the first radical; cf. وقح "to be shameless", variously waqaḥa~yaqiḥu, waquḥa~yawquḥu and -- waqiḥa~yawqaḥu, whereas a~i verbs (wafaḍa~yafiḍu "to rush"), i~i verbs (wafiqa~yafiqu "to be proper, to be suitable") -- and a~a verbs (waḍaʕa~yaḍaʕu "to set down, to place") do assimilate. But there are naturally exceptions, e.g. -- waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; waṯiʔa~yaṯaʔu "to get bruised, -- to be sprained". Also beware of waniya~yawnā "to be faint; to languish", which is sound in the first radical and -- final-weak in the last radical. Nonetheless, the regularity of the patterns mentioned above suggest we should provide -- them as defaults. -- Note that there are other cases of unexpectedly sound verbs, e.g. izdawaja~yazdawiju "to be in pairs", layisa~yalyasu -- "to be valiant, to be brave", ʔaḥwaja~yuḥwiju "to need", istahwana~yastahwinu "to consider easy", sawisa~yaswasu "to -- be or become moth-eaten or worm-eaten" (vs. sāsa~yasūsu "to govern, to rule" from the same radicals), ʕawira~yaʕwaru -- "to be one-eyed", istajwaba~yastajwibu "to interrogate", etc. But in these cases there is no need for explicit user -- specification as the lemma itself specifies the unexpected soundness. for _, form_with_weakness in ipairs { "I-sound", "I-assimilated", "none-sound", "none-hollow", "none-geminate", "none-final-weak" } do table.insert(allowed_vforms_with_weakness, form_with_weakness) end local allowed_vforms_with_weakness_set = m_table.listToSet(allowed_vforms_with_weakness) local function vform_supports_final_weak(vform) return vform ~= "XI" and vform ~= "XV" and vform ~= "IVq" end local function vform_supports_geminate(vform) return vform == "I" or vform == "III" or vform == "IV" or vform == "VI" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_supports_hollow(vform) return vform == "I" or vform == "IV" or vform == "VII" or vform == "VIII" or vform == "X" end local function vform_probably_impersonal_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, I) or vform == "V" or vform == "VI" or vform == "X" or vform == "IIq" end local function vform_probably_full_passive(vform) return vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" end local function vform_probably_no_passive(vform, weakness, past_vowel, nonpast_vowel) return vform == "I" and req(past_vowel, U) or vform == "VII" or vform == "IX" or vform == "XI" or vform == "XII" or vform == "XIII" or vform == "XIV" or vform == "XV" or vform == "IIIq" or vform == "IVq" end -- Active vforms II, III, IV, Iq use non-past prefixes in -u- instead of -a-. local function prefix_vowel_from_vform(vform) if vform == "II" or vform == "III" or vform == "IV" or vform == "Iq" then return "u" else return "a" end end -- True if the active non-past takes a-vocalization rather than i-vocalization in its last syllable. local function vform_nonpast_a_vowel(vform) return vform == "V" or vform == "VI" or vform == "XV" or vform == "IIq" end -- True if the `passive` spec indicates a passive-only verb. local function is_passive_only(passive) return passive == "onlypass" or passive == "onlypass-impers" end export.is_passive_only = is_passive_only -- for use in [[Module:ar-headword]] ------------------------------------------------------------------------------- -- Properties of specific sounds -- ------------------------------------------------------------------------------- -- Is radical wāw (و) or yāʾ (ي)? local function is_waw_ya(rad) return req(rad, W) or req(rad, Y) end -- Check that radical is wāw (و) or yāʾ (ي), error if not local function check_waw_ya(rad) if not is_waw_ya(rad) then error("Expecting weak radical: '" .. rget(rad) .. "' should be " .. W .. " or " .. Y) end end -- Form-I verb حيّ or حيي and form-X verb استحيا or استحى local function hayy_radicals(rad1, rad2, rad3) return req(rad1, "ح") and req(rad2, Y) and is_waw_ya(rad3) end -- FUCK ME HARD. "Lua error at line 1514: main function has more than 200 local variables". local function create_conjugations() ------------------------------------------------------------------------------- -- Radicals associated with various irregular verbs -- ------------------------------------------------------------------------------- -- Form-I verb أخذ or form-VIII verb اتخذ local function axadh_radicals(rad1, rad2, rad3) return req(rad1, HAMZA) and req(rad2, "خ") and req(rad3, "ذ") end -- Form-I verb whose imperative has a reduced form: أكل and أخذ and أمر. Return "shortonly" if only -- short-form imperatives exist (أكل and أخذ) or "shortlong" if long-form imperatives also exist (أمر); -- they are used after a clitic like فَ and وَ. local function reduced_imperative_verb(rad1, rad2, rad3) return axadh_radicals(rad1, rad2, rad3) and "shortonly" or req(rad1, HAMZA) and req(rad2, "ك") and req(rad3, "ل") and "shortonly" or req(rad1, HAMZA) and req(rad2, "م") and req(rad3, "ر") and "shortlong" end -- Form-I verb رأى and form-IV verb أرى local function raa_radicals(rad1, rad2, rad3) return req(rad1, "ر") and req(rad2, HAMZA) and is_waw_ya(rad3) end -- Form-I verb سأل local function saal_radicals(rad1, rad2, rad3) return req(rad1, "س") and req(rad2, HAMZA) and req(rad3, "ل") end -- Form-I verb كان local function kaan_radicals(rad1, rad2, rad3) return req(rad1, "ك") and req(rad2, W) and req(rad3, N) end ------------------------------------------------------------------------------- -- Sets of past endings -- ------------------------------------------------------------------------------- -- The 13 endings of the sound/hollow/geminate past tense. local past_endings = { -- singular SK .. TU, SK .. TA, SK .. "تِ", A, A .. "تْ", --dual SK .. "تُمَا", AA, A .. "تَا", -- plural SK .. "نَا", SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this SK .. "تُن" .. SH .. A, UU .. ALIF, SK .. "نَ" } -- Make endings for final-weak past in -aytu or -awtu. AYAW is AY or AW as appropriate. Note that AA and AW are -- global variables. local function make_past_endings_ay_aw(ayaw, third_sg_masc) return { -- singular ayaw .. SK .. TU, ayaw .. SK .. TA, ayaw .. SK .. "تِ", third_sg_masc, A .. "تْ", --dual ayaw .. SK .. "تُمَا", ayaw .. AA, A .. "تَا", -- plural ayaw .. SK .. "نَا", ayaw .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this ayaw .. SK .. "تُن" .. SH .. A, AW .. SK .. ALIF, ayaw .. SK .. "نَ" } end -- past final-weak -aytu endings local past_endings_ay = make_past_endings_ay_aw(AY, AAMAQ) -- past final-weak -awtu endings local past_endings_aw = make_past_endings_ay_aw(AW, AA) -- used for alternative endings for form-X geminate verbs like اِسْتَمَرَّ local past_endings_ay_12_person_only = { -- singular AY .. SK .. TU, AY .. SK .. TA, AY .. SK .. "تِ", {}, {}, --dual AY .. SK .. "تُمَا", {}, {}, -- plural AY .. SK .. "نَا", AY .. SK .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this AY .. SK .. "تُن" .. SH .. A, {}, {}, } -- Make endings for final-weak past in -ītu or -ūtu. IIUU is ī or ū as appropriate. Note that AA and UU are global -- variables. local function make_past_endings_ii_uu(iiuu) return { -- singular iiuu .. TU, iiuu .. TA, iiuu .. "تِ", iiuu .. A, iiuu .. A .. "تْ", --dual iiuu .. "تُمَا", iiuu .. AA, iiuu .. A .. "تَا", -- plural iiuu .. "نَا", iiuu .. "تُمْ", -- shadda + vowel diacritic ends up in the wrong order due to Unicode -- bug, so keep them separate to avoid this iiuu .. "تُن" .. SH .. A, UU .. ALIF, iiuu .. "نَ" } end -- past final-weak -ītu endings local past_endings_ii = make_past_endings_ii_uu(II) -- past final-weak -ūtu endings local past_endings_uu = make_past_endings_ii_uu(UU) ------------------------------------------------------------------------------- -- Sets of non-past prefixes and endings -- ------------------------------------------------------------------------------- local nonpast_prefix_consonants = { -- singular HAMZA, T, T, Y, T, -- dual T, Y, T, -- plural N, T, T, Y, Y } -- There are only five distinct endings in all non-past verbs. Make any set of non-past endings given these five -- distinct endings. local function make_nonpast_endings(null, fem, dual, pl, fempl) return { -- singular null, null, fem, null, null, -- dual dual, dual, dual, -- plural null, pl, fempl, pl, fempl } end -- endings for non-past indicative local ind_endings = make_nonpast_endings( U, II .. NA, AANI, UU .. NA, SK .. NA ) -- Make the endings for non-past subjunctive/jussive, given the vowel diacritic used in "null" endings -- (1s/2ms/3ms/3fs/1p). local function make_sub_juss_endings(dia_null) return make_nonpast_endings( dia_null, II, AA, UU .. ALIF, SK .. NA ) end -- endings for non-past subjunctive local sub_endings = make_sub_juss_endings(A) -- endings for non-past jussive local juss_endings = make_sub_juss_endings(SK) -- endings for alternative geminate non-past jussive in -a; same as subjunctive local juss_endings_alt_a = sub_endings -- endings for alternative geminate non-past jussive in -i local juss_endings_alt_i = make_sub_juss_endings(I) -- Endings for final-weak non-past indicative in -ā. Note that AY, AW and AAMAQ are global variables. local ind_endings_aa = make_nonpast_endings( AAMAQ, AYSK .. NA, AY .. AANI, AWSK .. NA, AYSK .. NA ) -- Make endings for final-weak non-past indicative in -ī or -ū; IIUU is ī or ū as appropriate. Note that II and UU -- are global variables. local function make_ind_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu, II .. NA, iiuu .. AANI, UU .. NA, iiuu .. NA ) end -- endings for final-weak non-past indicative in -ī local ind_endings_ii = make_ind_endings_ii_uu(II) -- endings for final-weak non-past indicative in -ū local ind_endings_uu = make_ind_endings_ii_uu(UU) -- Endings for final-weak non-past subjunctive in -ā. Note that AY, AW, ALIF, AAMAQ are global variables. local sub_endings_aa = make_nonpast_endings( AAMAQ, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past subjunctive in -ī or -ū. IIUU is ī or ū as appropriate. Note that AA, II, -- UU, ALIF are global variables. local function make_sub_endings_ii_uu(iiuu) return make_nonpast_endings( iiuu .. A, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past subjunctive in -ī local sub_endings_ii = make_sub_endings_ii_uu(II) -- endings for final-weak non-past subjunctive in -ū local sub_endings_uu = make_sub_endings_ii_uu(UU) -- endings for final-weak non-past jussive in -ā local juss_endings_aa = make_nonpast_endings( A, AYSK, AY .. AA, AWSK .. ALIF, AYSK .. NA ) -- Make endings for final-weak non-past jussive in -ī or -ū. IU is short i or u, IIUU is long ī or ū as appropriate. -- Note that AA, II, UU, ALIF are global variables. local function make_juss_endings_ii_uu(iu, iiuu) return make_nonpast_endings( iu, II, iiuu .. AA, UU .. ALIF, iiuu .. NA ) end -- endings for final-weak non-past jussive in -ī local juss_endings_ii = make_juss_endings_ii_uu(I, II) -- endings for final-weak non-past jussive in -ū local juss_endings_uu = make_juss_endings_ii_uu(U, UU) ------------------------------------------------------------------------------- -- Sets of imperative endings -- ------------------------------------------------------------------------------- -- Extract the second person jussive endings to get corresponding imperative endings. local function imperative_endings_from_jussive(endings) return {endings[2], endings[3], endings[6], endings[10], endings[11]} end -- normal imperative endings local imp_endings = imperative_endings_from_jussive(juss_endings) -- alternative geminate imperative endings in -a local imp_endings_alt_a = imperative_endings_from_jussive(juss_endings_alt_a) -- alternative geminate imperative endings in -i local imp_endings_alt_i = imperative_endings_from_jussive(juss_endings_alt_i) -- final-weak imperative endings in -ā local imp_endings_aa = imperative_endings_from_jussive(juss_endings_aa) -- final-weak imperative endings in -ī local imp_endings_ii = imperative_endings_from_jussive(juss_endings_ii) -- final-weak imperative endings in -ū local imp_endings_uu = imperative_endings_from_jussive(juss_endings_uu) ------------------------------------------------------------------------------- -- Basic functions to inflect tenses -- ------------------------------------------------------------------------------- -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. Each of `prefixes`, `stems` and -- `endings` is either a sequence of 5 (for the imperative) or 13 (for other tenses) abbreviated form lists (each of -- which is either a string, a form object, or a list of strings and/or form objects; see -- [[Module:inflection utilities]] for more info). Alternatively, any of `prefixes`, `stems` or `endings` can be a -- single-element list containing an abbreviated form list, with an additional key `all_same` set to true, or (as a -- special case) a single string; in the latter cases, the same value is used for all 5 or 13 slots. If existing -- inflections already exist, they will be added to, not overridden. `pnums` is the list of person/number slot name -- suffixes, which must match up with the elements in `prefixes`, `stems` and `endings` (i.e. 5 for imperative, 13 -- otherwise). local function inflect_tense_1(base, tense, prefixes, stems, endings, pnums) if not prefixes or not stems or not endings then return end local function verify_affixes(affixname, affixes) local function interr(msg) error(("Internal error: For tense '%s', '%s' %s: %s"):format(tense, affixname, msg, dump(affixes))) end if type(affixes) == "string" then -- do nothing elseif type(affixes) ~= "table" then interr("is not a table or string") elseif affixes.all_same then if #affixes ~= 1 then interr(("with all_same = true should have length 1 but has length %s"):format(#affixes)) end else if #affixes ~= #pnums then interr(("should have length %s but has length %s"):format(#pnums, #affixes)) end end end verify_affixes("prefixes", prefixes) verify_affixes("stems", stems) verify_affixes("endings", endings) local function get_affix(affixes, i) if type(affixes) == "string" then return affixes elseif affixes.all_same then return affixes[1] else return affixes[i] end end for i, pnum in ipairs(pnums) do local prefix = get_affix(prefixes, i) local stem = get_affix(stems, i) local ending = get_affix(endings, i) local slot = tense .. "_" .. pnum add3(base, slot, prefix, stem, ending) end end -- Add to `base` the inflections for the tense indicated by `tense` (the prefix in the slot names, e.g. 'past' -- or 'juss_pass'), formed by combining the `prefixes`, `stems` and `endings`. This is a simple wrapper around -- inflect_tense_1() that applies to all tenses other than the imperative; see inflect_tense_1() for more -- information about the parameters. local function inflect_tense(base, tense, prefixes, stems, endings) inflect_tense_1(base, tense, prefixes, stems, endings, all_person_number_list) end -- Like inflect_tense() but for the imperative, which has only five parts instead of 13 and no prefixes. local function inflect_tense_imp(base, stems, endings) inflect_tense_1(base, "imp", "", stems, endings, imp_person_number_list) end ------------------------------------------------------------------------------- -- Functions to inflect the past tense -- ------------------------------------------------------------------------------- -- Generate past verbs using specified vowel and consonant stems; works for sound, assimilated, hollow, and geminate -- verbs, active and passive. local function past_2stem_conj(base, tense, v_stem, c_stem, footnote_12) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "past" .. passive .. "_v", v_stem) local c_stem_12 = c_stem if footnote_12 then c_stem_12 = iut.combine_form_and_footnotes(c_stem_12, footnote_12) end c_stem_12 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem_12) local c_stem_3 = override_stem_if_needed(base, "past" .. passive .. "_c", c_stem) inflect_tense(base, tense, "", { -- singular c_stem_12, c_stem_12, c_stem_12, v_stem, v_stem, --dual c_stem_12, v_stem, v_stem, -- plural c_stem_12, c_stem_12, c_stem_12, v_stem, c_stem_3 }, past_endings) end -- Generate past verbs using single specified stem; works for sound and assimilated verbs, active and passive. local function past_1stem_conj(base, tense, stem) past_2stem_conj(base, tense, stem, stem) end ------------------------------------------------------------------------------- -- Functions to inflect non-past tenses -- ------------------------------------------------------------------------------- -- Generate non-past conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for active and passive; for all forms; for all weaknesses (sound, assimilated, hollow, final-weak and -- geminate) and for all types of non-past (indicative, subjunctive, jussive) except for the imperative. (There is a -- separate wrapper function below for geminate jussives because they have three alternants.) Both stems may be the -- same, e.g. for sound verbs. -- `prefix_vowel` will be either "a" or "u". `endings` should be an array of 13 items. If `endings` is nil or -- omitted, infer the endings from the tense. If `jussive` is true, or `endings` is nil and `tense` indicatives -- jussive, use the jussive pattern of vowel/consonant stems (different from the normal ones). local function nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, endings, jussive) local passive = tense:find("_pass") and "_pass" or "" -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_v", v_stem and q(dia[prefix_vowel], v_stem) or nil) c_stem = override_stem_if_needed(base, "nonpast" .. passive .. "_c", c_stem and q(dia[prefix_vowel], c_stem) or nil) if not endings then if tense:find("^ind") then endings = ind_endings elseif tense:find("^sub") then endings = sub_endings elseif tense:find("^juss") then jussive = true endings = juss_endings else error("Internal error: Unrecognized tense '" .. tense .."'") end end if not jussive then inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular v_stem, v_stem, v_stem, v_stem, v_stem, --dual v_stem, v_stem, v_stem, -- plural v_stem, v_stem, c_stem, v_stem, c_stem }, endings) else inflect_tense(base, tense, nonpast_prefix_consonants, { -- singular -- 'adlul, tadlul, tadullī, yadlul, tadlul c_stem, c_stem, v_stem, c_stem, c_stem, --dual -- tadullā, yadullā, tadullā v_stem, v_stem, v_stem, -- plural -- nadlul, tadullū, tadlulna, yadullū, yadlulna c_stem, v_stem, c_stem, v_stem, c_stem }, endings) end end -- Generate non-past conjugation with one stem (no distinct stems for vowel-initial and consonant-initial endings). -- See nonpast_2stem_conj(). local function nonpast_1stem_conj(base, tense, prefix_vowel, stem, endings, jussive) nonpast_2stem_conj(base, tense, prefix_vowel, stem, stem, endings, jussive) end -- Generate active/passive jussive geminative. There are three alternants, two with terminations -a and -i and one -- in a null termination with a distinct pattern of vowel/consonant stem usage. See nonpast_2stem_conj() for a -- description of the arguments. local function jussive_gem_conj(base, tense, prefix_vowel, v_stem, c_stem) -- alternative in -a nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_a) -- alternative in -i nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings_alt_i) -- alternative in -null; requires different combination of v_stem and -- c_stem since the null endings require the c_stem (e.g. "tadlul" here) -- whereas the corresponding endings above in -a or -i require the v_stem -- (e.g. "tadulla, tadulli" above) nonpast_2stem_conj(base, tense, prefix_vowel, v_stem, c_stem, juss_endings, "jussive") end ------------------------------------------------------------------------------- -- Functions to inflect the imperative -- ------------------------------------------------------------------------------- -- Generate imperative conjugation, with two stems, for vowel-initial and consonant-initial endings, respectively. -- Useful for all forms, and for all weaknesses other than final-weak. Note that the two stems may be the same -- (specifically for sound and assimilated verbs). If `endings` is nil or omitted, use `imp_endings`. If `alt_gem` -- is specified, use the pattern of vowel and consonant stems appropriate for the alternative geminate imperatives -- that use a null ending of -a or -i instead of an empty ending. local function make_2stem_imperative(base, v_stem, c_stem, endings, alt_gem) endings = endings or imp_endings -- Override stems with user-specified stems if available. v_stem = override_stem_if_needed(base, "imp_v", v_stem) c_stem = override_stem_if_needed(base, "imp_c", c_stem) if alt_gem then inflect_tense_imp(base, {v_stem, v_stem, v_stem, v_stem, c_stem}, endings) else inflect_tense_imp(base, {c_stem, v_stem, v_stem, v_stem, c_stem}, endings) end end -- Generate imperative parts for sound or assimilated verbs. local function make_1stem_imperative(base, stem) make_2stem_imperative(base, stem, stem) end -- Generate imperative parts for geminate verbs form I (also IV, VII, VIII, X). local function make_gem_imperative(base, v_stem, c_stem) make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_a, "alt gem") make_2stem_imperative(base, v_stem, c_stem, imp_endings_alt_i, "alt gem") make_2stem_imperative(base, v_stem, c_stem) end ------------------------------------------------------------------------------- -- Functions to inflect entire verbs -- ------------------------------------------------------------------------------- -- Generate finite parts of a sound verb (also works for assimilated verbs) from five stems (past and non-past, -- active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"). local function make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) past_1stem_conj(base, "past", past_stem) past_1stem_conj(base, "past_pass", past_pass_stem) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem) make_1stem_imperative(base, imp_stem) end local function past_final_weak_endings_from_vowel(vowel) if vowel == "ay" then return past_endings_ay elseif vowel == "aw" then return past_endings_aw elseif vowel == "ī" then return past_endings_ii elseif vowel == "ū" then return past_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized past final-weak vowel spec '%s'"):format(vowel)) end end local function nonpast_final_weak_endings_from_vowel(vowel) if vowel == "ā" then return ind_endings_aa, sub_endings_aa, juss_endings_aa, imp_endings_aa elseif vowel == "ī" then return ind_endings_ii, sub_endings_ii, juss_endings_ii, imp_endings_ii elseif vowel == "ū" then return ind_endings_uu, sub_endings_uu, juss_endings_uu, imp_endings_uu elseif not vowel then return nil else error(("Internal error: Unrecognized non-past final-weak vowel spec '%s'"):format(vowel)) end end -- Generate finite parts of a final-weak verb from five stems (past and non-past, active and passive, plus -- imperative), the past active ending vowel (ay, aw, ī or ū), the non-past active ending vowel (ā, ī or ū) and the -- prefix vowel in the active non-past (a or u). `imp_stem_2fs`, if given, overrides `imp_stem` for the 2fs -- imperative only -- needed because the 2fs jussive/imperative ending is always -ī regardless of the verb's -- past~non-past vowel class (see `make_juss_endings_ii_uu`'s hardcoded `fem = II`), so its hamzat wasl is always -- kasra even for a u-class verb like دَعَا (اِدْعِي, not اُدْعِي; see README "Open findings" #5). -- -- `retain_rad3_2fs`, if true, keeps rad3 as a consonant before that -ī instead of letting it -- contract away: تَسْهُوِينَ / اُسْهُوِي rather than تَسْهِينَ / اِسْهِي. See README "Findings" #8 -- and final_weak_uu_retains_rad3(). It also cancels `imp_stem_2fs`, because #5's kasra hamzat -- wasl exists only for the contracted stem, whose ending begins with that kasra; a retained -- rad3 puts its own ḍamma there, so the imperative takes the ordinary stem (اُسْهُوِي). local function make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, past_ending_vowel, nonpast_ending_vowel, prefix_vowel, imp_stem_2fs, retain_rad3_2fs) past_stem = override_stem_if_needed(base, "past", past_stem) past_pass_stem = override_stem_if_needed(base, "past_pass", past_pass_stem) -- Don't call override_stem_if_needed() here for non-past stems; it's called in nonpast_2stem_conj(). imp_stem = override_stem_if_needed(base, "imp", imp_stem) -- + not supported for ending vowel overrides past_ending_vowel = base.stem_overrides.past_final_weak_vowel or past_ending_vowel local past_pass_ending_vowel = base.stem_overrides.past_pass_final_weak_vowel or "ī" nonpast_ending_vowel = base.stem_overrides.nonpast_final_weak_vowel or nonpast_ending_vowel local nonpast_pass_ending_vowel = base.stem_overrides.nonpast_pass_final_weak_vowel or "ā" local past_endings = past_final_weak_endings_from_vowel(past_ending_vowel) local past_pass_endings = past_final_weak_endings_from_vowel(past_pass_ending_vowel) local ind_endings, sub_endings, juss_endings, imp_endings = nonpast_final_weak_endings_from_vowel(nonpast_ending_vowel) local ind_pass_endings, sub_pass_endings, juss_pass_endings = nonpast_final_weak_endings_from_vowel(nonpast_pass_ending_vowel) if retain_rad3_2fs then -- rad3 surfaces as a consonant carrying the class's own ḍamma, then the regular -ī: -- سْهـ + ُوِينَ, not سْهـ + ِينَ. The 2fs sits at index 3 of a make_nonpast_endings() -- table (`fem`) and at index 2 of the five imperative endings that -- imperative_endings_from_jussive() extracts from it. Copied rather than mutated -- -- these ending tables are module-level constants shared by every final-weak verb. -- Written out inline, not via a helper: create_conjugations() is at Lua's 60-upvalue -- ceiling, and one more captured local stops the module loading at all. local function set_2fs(endings, index, ending) local out = {} for i, v in ipairs(endings) do out[i] = v end out[index] = ending return out end ind_endings = set_2fs(ind_endings, 3, UU .. II .. NA) sub_endings = set_2fs(sub_endings, 3, UU .. II) juss_endings = set_2fs(juss_endings, 3, UU .. II) imp_endings = set_2fs(imp_endings, 2, UU .. II) imp_stem_2fs = nil end inflect_tense(base, "past", "", {past_stem, all_same = 1}, past_endings) inflect_tense(base, "past_pass", "", {past_pass_stem, all_same = 1}, past_pass_endings) nonpast_1stem_conj(base, "ind", prefix_vowel, nonpast_stem, ind_endings) nonpast_1stem_conj(base, "sub", prefix_vowel, nonpast_stem, sub_endings) nonpast_1stem_conj(base, "juss", prefix_vowel, nonpast_stem, juss_endings) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_pass_endings) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_pass_endings) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_pass_endings) if imp_stem_2fs then imp_stem_2fs = override_stem_if_needed(base, "imp", imp_stem_2fs) inflect_tense_imp(base, {imp_stem, imp_stem_2fs, imp_stem, imp_stem, imp_stem}, imp_endings) else inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings) end end -- Generate finite parts of an augmented (form II+) final-weak verb from five stems (past and non-past, active and -- passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u") and a flag indicating if it -- behaves like a form V/VI verb in taking non-past endings in -ā instead of -ī. local function make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) make_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "ay", form56 and "ā" or "ī", prefix_vowel) end -- Generate finite parts of an augmented (form II+) sound or final-weak verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (active past stem minus last syllable (= -al or -ā)); -- * `nonpast_stem_base` (non-past stem minus last syllable (= -al/-il or -ā/-ī); -- * `past_pass_stem_base` (passive past stem minus last syllable (= -il or -ī)); -- * `vn` (verbal noun). local function make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local final_weak = is_final_weak(base, vowel_spec) local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local form56 = vform_nonpast_a_vowel(base.verb_form) local a_base_suffix = final_weak and "" or q(A, lastrad) local i_base_suffix = final_weak and "" or q(I, lastrad) -- past and non-past stems, active and passive local past_stem = q(past_stem_base, a_base_suffix) -- In forms 5 and 6, non-past has /a/ as last stem vowel in the non-past -- in both active and passive, but /i/ in the active participle and /a/ -- in the passive participle. Elsewhere, consistent /i/ in active non-past -- and participle, consistent /a/ in passive non-past and participle. -- Hence, forms 5 and 6 differ only in the non-past active (but not -- active participle), so we have to split the finite non-past stem and -- active participle stem. local nonpast_stem = q(nonpast_stem_base, form56 and a_base_suffix or i_base_suffix) local ap_stem = q(nonpast_stem_base, i_base_suffix) local past_pass_stem = q(past_pass_stem_base, i_base_suffix) local nonpast_pass_stem = q(nonpast_stem_base, a_base_suffix) -- imperative stem local imp_stem = q(past_stem_base, form56 and a_base_suffix or i_base_suffix) -- make parts if final_weak then make_augmented_final_weak_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel, form56) else make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, prefix_vowel) end -- active and passive participle if final_weak then insert_form_or_forms(base, "ap", q(MU, ap_stem, IN)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem, AN, AMAQ)) else insert_form_or_forms(base, "ap", q(MU, ap_stem)) insert_form_or_forms(base, "pp", q(MU, nonpast_pass_stem)) end end -- Generate finite parts of a hollow or geminate verb from ten stems (vowel and consonant stems for each of past and -- non-past, active and passive, plus imperative) plus the prefix vowel in the active non-past ("a" or "u"), plus a -- flag indicating if we are a geminate verb. local function make_hollow_geminate_verb(base, geminate, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) past_2stem_conj(base, "past", past_v_stem, past_c_stem, altgem_note) past_2stem_conj(base, "past_pass", past_pass_v_stem, past_pass_c_stem) nonpast_2stem_conj(base, "ind", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "sub", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "ind_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) nonpast_2stem_conj(base, "sub_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) if geminate then jussive_gem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) jussive_gem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_gem_imperative(base, imp_v_stem, imp_c_stem) else nonpast_2stem_conj(base, "juss", prefix_vowel, nonpast_v_stem, nonpast_c_stem) nonpast_2stem_conj(base, "juss_pass", "u", nonpast_pass_v_stem, nonpast_pass_c_stem) make_2stem_imperative(base, imp_v_stem, imp_c_stem) end end -- Generate finite parts of an augmented (form II+) hollow verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun). local function make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) insert_form_or_forms(base, "vn", vn) local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local form410 = base.verb_form == "IV" or base.verb_form == "X" local prefix_vowel = prefix_vowel_from_vform(base.verb_form) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c a_base_suffix_v = q(AA, lastrad) -- 'af-āl-a, inf-āl-a a_base_suffix_c = q(A, lastrad) -- 'af-al-tu, inf-al-tu i_base_suffix_v = q(II, lastrad) -- 'uf-īl-a, unf-īl-a i_base_suffix_c = q(I, lastrad) -- 'uf-il-tu, unf-il-tu -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) -- yu-f-īl-u, ya-staf-īl-u but yanf-āl-u, yaft-āl-u local nonpast_v_stem = q(nonpast_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, form410 and i_base_suffix_v or a_base_suffix_v) local imp_c_stem = q(past_stem_base, form410 and i_base_suffix_c or a_base_suffix_c) -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end -- Generate finite parts of an augmented (form II+) geminate verb, given: -- * `base` (conjugation data structure); -- * `vowel_spec` (radicals, weakness); -- * `past_stem_base` (invariable part of active past stem; this and the stem bases below will end with a consonant -- for forms IV, X, IVq, and a short vowel for the others); -- * `nonpast_stem_base` (invariable part of nonpast stem); -- * `past_pass_stem_base` (invariable part of passive past stem); -- * `vn` (verbal noun); -- * `altgem_note` (footnote to add to active past 1/2-person forms, when alternative forms are supplied [form X]). local function make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, altgem_note) insert_form_or_forms(base, "vn", vn) local vform = base.verb_form local lastrad = base.quadlit and vowel_spec.rad4 or vowel_spec.rad3 local prefix_vowel = prefix_vowel_from_vform(vform) local a_base_suffix_v, a_base_suffix_c local i_base_suffix_v, i_base_suffix_c if vform == "IV" or vform == "X" or vform == "IVq" then a_base_suffix_v = q(A, lastrad, SH) -- 'af-all a_base_suffix_c = q(SK, lastrad, A, lastrad) -- 'af-lal i_base_suffix_v = q(I, lastrad, SH) -- yuf-ill i_base_suffix_c = q(SK, lastrad, I, lastrad) -- yuf-lil else a_base_suffix_v = q(lastrad, SH) -- fā-ll, infa-ll a_base_suffix_c = q(lastrad, A, lastrad) -- fā-lal, infa-lal i_base_suffix_v = q(lastrad, SH) -- yufā-ll, yanfa-ll i_base_suffix_c = q(lastrad, I, lastrad) -- yufā-lil, yanfa-lil end -- past and non-past stems, active and passive, for vowel-initial and -- consonant-initial endings local past_v_stem = q(past_stem_base, a_base_suffix_v) local past_c_stem = q(past_stem_base, a_base_suffix_c) local nonpast_v_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local nonpast_c_stem = q(nonpast_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- NOTE: Formerly had a comment that "vform III and VI passive past do not have contracted parts, only -- uncontracted parts, which are added separately by those functions". This is based on Mace -- "Arabic Verbs and Essential Grammar" (1999) entry 63 (continued), which shows passive ḥūjija but no ḥūjja; -- but that is apparently a mistake, as (1) verb tables in other books do show contracted passive parts for -- these forms; (2) there is no mention of such an exception on p. 99, which explains how geminate ("doubled") -- verbs work (on the contrary, it says "The contracted and uncontracted pairs (see above) are found all -- over Forms III and VI of the doubled verbs"). local past_pass_v_stem = q(past_pass_stem_base, i_base_suffix_v) local past_pass_c_stem = q(past_pass_stem_base, i_base_suffix_c) local nonpast_pass_v_stem = q(nonpast_stem_base, a_base_suffix_v) local nonpast_pass_c_stem = q(nonpast_stem_base, a_base_suffix_c) -- imperative stem local imp_v_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_v or i_base_suffix_v) local imp_c_stem = q(past_stem_base, vform_nonpast_a_vowel(vform) and a_base_suffix_c or i_base_suffix_c) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, prefix_vowel, altgem_note) -- active participle insert_form_or_forms(base, "ap", q(MU, nonpast_v_stem)) -- passive participle insert_form_or_forms(base, "pp", q(MU, nonpast_pass_v_stem)) end ------------------------------------------------------------------------------- -- Conjugation functions for specific conjugation types -- ------------------------------------------------------------------------------- local function form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local imp_vowel = map_vowel(nonpast_vowel, function(vow) if vow == A or vow == I then return I elseif vow == U then return U elseif not skip_slot(base, "imp_2ms") then error(("Internal error: Non-past vowel %s isn't a, i, or u, should have been caught earlier"):format( dump(nonpast_vowel))) else -- Passive-only; imperative won't ever be displayed so it doesn't matter. return I end end) -- Mace ("Arabic Verbs and Essentials of Grammar" p. 63: [https://archive.org/details/arabicverbsessen00john/page/62/mode/2up]) -- claims that initial hamza is assimilated/elided into a long vowel in the form-I imperative, but apparently -- this isn't corrrect. local vowel_on_alif = map_vowel(imp_vowel, function(vow) return ALIF .. vow end) return q(vowel_on_alif, rad1, SK) end -- Implement form-I sound or assimilated verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_sound_assimilated_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied -- past and non-past stems, active and passive local past_stem = q(rad1, A, rad2, past_vowel, rad3) local nonpast_stem = assimilated and q(rad2, nonpast_vowel, rad3) or q(rad1, SK, rad2, nonpast_vowel, rad3) local past_pass_stem = q(rad1, U, rad2, I, rad3) local nonpast_pass_stem = q(rad1, SK, rad2, A, rad3) -- imperative stem -- check for irregular verb with reduced imperative (أَخَذَ or أَكَلَ or أَمَرَ) local reducedimp = reduced_imperative_verb(rad1, rad2, rad3) if reducedimp then base.irregular = true end local imp_stem_suffix = q(rad2, nonpast_vowel, rad3) local long_imp_stem_base = form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1) local short_imp_stem_base = "" local imp_stem = q((assimilated or reducedimp) and "" or long_imp_stem_base, imp_stem_suffix) -- A form-I mithal that keeps its wāw spells its imperative on a hamzat wasl, -- اِوْجَلْ / اِوْنَ. Tell postprocess_term() not to reduce that اِوْ to اِي -- see #10 -- there for why the substitution list can't decide this for itself. if not assimilated and req(rad1, W) then base.keep_initial_w = true end -- make parts make_sound_verb(base, past_stem, past_pass_stem, nonpast_stem, nonpast_pass_stem, imp_stem, "a") if reducedimp == "shortlong" then make_1stem_imperative(base, iut.combine_form_and_footnotes(q(long_imp_stem_base, imp_stem_suffix), mw.getCurrentFrame():preprocess("[used especially with a clitic such as {{m|ar|فَ}} or {{m|ar|وَ}}]"))) end -- Check for irregular verb سَأَلَ with alternative jussive and imperative. Calling this after make_sound_verb() -- adds additional entries to the paradigm parts. if saal_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_1stem_conj(base, "juss", "a", "سَل") nonpast_1stem_conj(base, "juss_pass", "u", "سَل") make_1stem_imperative(base, "سَل") end -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, I, rad3)) -- Insert alternative active participle (stative type I) فَعِيل. Since not all verbs have this, we require that -- verbs that do have it specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <ap:++> to -- indicate that the alternative form should be used for the active participle, <ap:+,++> to indicate that both -- forms can be used, and <ap:-> to indicate that there is no active participle). The same form is used for -- secondary default passive participle. insert_ap2_pp2(base, q(rad1, A, rad2, II, rad3)) -- Active participle, stative type II فَعِل (+++). insert_form_or_forms(base, "ap3", q(rad1, A, rad2, I, rad3)) -- Active participle, color/defect أَفْعَل (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَعْلَان (+an). insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad3)) end conjugations["I-sound"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, false) end conjugations["none-sound"] = function(base, vowel_spec) -- All default stems are nil. make_sound_verb(base) end conjugations["none-hollow"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, false) end conjugations["none-geminate"] = function(base, vowel_spec) -- All default stems are nil. make_hollow_geminate_verb(base, "geminate") end conjugations["none-final-weak"] = function(base, vowel_spec) -- All default stems are nil. make_final_weak_verb(base) end conjugations["I-assimilated"] = function(base, vowel_spec) make_form_i_sound_assimilated_verb(base, vowel_spec, "assimilated") end local function make_form_i_hayy_verb(base, vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied base.irregular = true -- past and non-past stems, active and passive, and imperative stem local past_c_stem = "حَيِي" local past_v_stem_long = past_c_stem local past_v_stem_short = "حَيّ" -- 3mp of the long variant (حَيِيَ) is حَيُوا, not the geminated حَيُّوا of the short -- variant (حَيَّ) -- rad2 (ي) here is a plain radical, not doubled; see README -- "Open findings" #4. Needs its own stem, distinct from both the long and short ones. local past_v_stem_3mp = "حَي" local past_pass_c_stem = "حُيِي" local past_pass_v_stem_long = past_pass_c_stem local past_pass_v_stem_short = "حُيّ" local past_pass_v_stem_3mp = "حُي" local nonpast_stem = "حْي" local nonpast_pass_stem = nonpast_stem local imp_stem = _I .. nonpast_stem -- make parts past_2stem_conj(base, "past", {}, past_c_stem) past_2stem_conj(base, "past_pass", {}, past_pass_c_stem) local variant = vowel_spec.variant or "both" if variant == "short" or variant == "both" then past_2stem_conj(base, "past", past_v_stem_short, {}) past_2stem_conj(base, "past_pass", past_pass_v_stem_short, {}) end function inflect_long_variant(tense, long_stem, mp_stem) inflect_tense_1(base, tense, "", {long_stem, long_stem, long_stem, long_stem, mp_stem}, {past_endings[4], past_endings[5], past_endings[7], past_endings[8], past_endings[12]}, {"3ms", "3fs", "3md", "3fd", "3mp"}) end if variant == "long" or variant == "both" then inflect_long_variant("past", past_v_stem_long, past_v_stem_3mp) inflect_long_variant("past_pass", past_pass_v_stem_long, past_pass_v_stem_3mp) end nonpast_1stem_conj(base, "ind", "a", nonpast_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub", "a", nonpast_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss", "a", nonpast_stem, juss_endings_aa) nonpast_1stem_conj(base, "ind_pass", "u", nonpast_pass_stem, ind_endings_aa) nonpast_1stem_conj(base, "sub_pass", "u", nonpast_pass_stem, sub_endings_aa) nonpast_1stem_conj(base, "juss_pass", "u", nonpast_pass_stem, juss_endings_aa) inflect_tense_imp(base, {imp_stem, all_same = 1}, imp_endings_aa) -- active and passive participles apparently do not exist for this verb end -- Implement form-I final-weak assimilated+final-weak verb. ASSIMILATED is true for assimilated verbs. local function make_form_i_final_weak_verb(base, vowel_spec, assimilated) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- حَيَّ or حَيِيَ is weird enough that we handle it as a separate function. if hayy_radicals(rad1, rad2, rad3) then make_form_i_hayy_verb(base, vowel_spec) return end -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- Past and non-past stems, active and passive, and imperative stem. local past_stem = q(rad1, A, rad2) local past_pass_stem = q(rad1, U, rad2) local nonpast_stem, nonpast_pass_stem, imp_stem, imp_stem_2fs if raa_radicals(rad1, rad2, rad3) then base.irregular = true nonpast_stem = rad1 nonpast_pass_stem = rad1 imp_stem = rad1 else nonpast_pass_stem = q(rad1, SK, rad2) if assimilated then nonpast_stem = rad2 imp_stem = rad2 else nonpast_stem = nonpast_pass_stem imp_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2) -- The 2fs imperative always has hamzat wasl with kasra, since its ending is -- always -ī regardless of the verb's vowel class; see make_final_weak_verb(). imp_stem_2fs = q(form_i_imp_stem_through_rad1(base, I, rad1), rad2) end end -- A form-I mithal that keeps its wāw spells its imperative on a hamzat wasl, -- اِوْجَلْ / اِوْنَ. Tell postprocess_term() not to reduce that اِوْ to اِي -- see #10 -- there for why the substitution list can't decide this for itself. if not assimilated and req(rad1, W) then base.keep_initial_w = true end -- Make parts. local past_ending_vowel = req(rad3, Y) and req(past_vowel, A) and "ay" or req(rad3, W) and req(past_vowel, A) and "aw" or req(past_vowel, I) and "ī" or "ū" -- Try to preserve footnotes attached to the third radical and/or past and/or non-past vowels. local past_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(past_vowel)) local nonpast_ending_vowel = req(nonpast_vowel, A) and "ā" or req(nonpast_vowel, I) and "ī" or "ū" local nonpast_footnotes = iut.combine_footnotes(rget_footnotes(rad3), rget_footnotes(nonpast_vowel)) make_final_weak_verb(base, iut.combine_form_and_footnotes(past_stem, past_footnotes), iut.combine_form_and_footnotes(past_pass_stem, past_footnotes), iut.combine_form_and_footnotes(nonpast_stem, nonpast_footnotes), iut.combine_form_and_footnotes(nonpast_pass_stem, nonpast_footnotes), iut.combine_form_and_footnotes(imp_stem, nonpast_footnotes), past_ending_vowel, nonpast_ending_vowel, "a", imp_stem_2fs and iut.combine_form_and_footnotes(imp_stem_2fs, nonpast_footnotes) or nil, final_weak_uu_retains_rad3(rad1, rad2, rad3, past_ending_vowel, nonpast_ending_vowel)) -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, IN)) -- Active participle, stative type I فَعِيّ (++). FIXME: Is this correct when rad3 is W? insert_ap2_pp2(base, q(rad1, A, rad2, II, SH)) -- Active participle, stative type II فَعٍ (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, rad2, IN)) -- Active participle, color/defect أَفْعَى (+cd). insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, AAMAQ)) -- Active participle, -ān فَعْيَان or فَعْوَان (+an). -- FIXME: Any examples of this for both rad3 = W and y to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, req(rad3, Y) and II or UU, SH)) end conjugations["I-final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, false) end conjugations["I-assimilated+final-weak"] = function(base, vowel_spec) make_form_i_final_weak_verb(base, vowel_spec, "assimilated") end conjugations["I-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- In some sense, hollow vowels i~i and u~u are more "correct" than a~i and a~u, but the latter follow the -- pattern of other form-I verbs, so we map i~i to a~i and u~u to a~u in infer_radicals(). Now however we have -- to undo this to get the actual past vowel based on the non-past vowel. if req(past_vowel, A) then past_vowel = map_vowel(past_vowel, function(vow) return req(nonpast_vowel, A) and I or rget(nonpast_vowel) end) end local lengthened_nonpast = map_vowel(nonpast_vowel, function(vow) return vow == U and UU or vow == I and II or AA end) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) local past_v_stem = q(rad1, AA, rad3) local past_c_stem = q(rad1, past_vowel, rad3) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, lengthened_nonpast, rad3) local nonpast_c_stem = q(rad1, nonpast_vowel, rad3) -- passive past stems - vowel (v) and consonant (c) -- 'ufīla always; the contracted stem takes whichever of i/u the active past_c_stem -- *isn't* -- xāfa/xiftu (i) -> passive xufta (u), qāla/qultu (u) -> passive qilta (i). -- Contraction drops rad2, so this vowel is the only thing distinguishing active from -- passive in these forms, hence the two roots' behaviour is opposite, not independent. -- Confirmed on two printed pages (خافَ p.224 "خُفْتَ", قالَ p.138 "قِلْتَ"); previously -- hardcoded to u from خافَ alone, which is only half the pattern -- see README. local past_pass_v_stem = q(rad1, II, rad3) local past_pass_c_stem = q(rad1, map_vowel(past_vowel, function(vow) return vow == I and U or I end), rad3) -- passive non-past stems - vowel (v) and consonant (c) -- yufāla/yufalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, AA, rad3) local nonpast_pass_c_stem = q(rad1, A, rad3) -- imperative stem local imp_v_stem = nonpast_v_stem local imp_c_stem = nonpast_c_stem -- make parts make_hollow_geminate_verb(base, false, past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") if kaan_radicals(rad1, rad2, rad3) then local endings = make_nonpast_endings(U, {}, {}, {}, {}) inflect_tense(base, "juss", nonpast_prefix_consonants, q(A, rad1), endings) base.irregular = true end -- Active participle. insert_form_or_forms(base, "ap1", req(rad3, HAMZA) and q(rad1, AA, HAMZA, IN) or q(rad1, AA, HAMZA, I, rad3)) -- Active participle, stative type I فَيِّد (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, Y, SH, I, rad3)) -- Active participle, stative type II فَيِد (+++). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "ap3", q(rad1, A, Y, I, rad3)) -- Active participle, color/defect أَفّيَد or أَفّوَد (+cd). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, SK, rad2, A, rad3)) -- Active participle, -ān فَيْدَان or فَوْدَان (+an). Example: جَاعَ "to be hungry", act part جَوْعَان insert_form_or_forms(base, "apan", q(rad1, A, rad2, SK, rad3, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, req(rad2, Y) and II or UU, rad3)) end conjugations["I-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3, past_vowel, nonpast_vowel = get_radicals_3(vowel_spec) -- Verbal nouns (maṣādir) for form I are unpredictable and have to be supplied. -- active past stems - vowel (v) and consonant (c) -- The contracted stem's vowel is the past vowel for most roots (مَدَدْتَ) but follows the -- مضارع for the إتباع lexemes (هَمُمْتَ); see geminate_degemination_vowel(). local past_v_stem = q(rad1, A, rad2, SH) local past_c_stem = q(rad1, A, rad2, geminate_degemination_vowel(rad1, rad2, rad3, past_vowel, nonpast_vowel), rad2) -- active non-past stems - vowel (v) and consonant (c) local nonpast_v_stem = q(rad1, nonpast_vowel, rad2, SH) local nonpast_c_stem = q(rad1, SK, rad2, nonpast_vowel, rad2) -- passive past stems - vowel (v) and consonant (c) -- dulla/dulilta local past_pass_v_stem = q(rad1, U, rad2, SH) local past_pass_c_stem = q(rad1, U, rad2, I, rad2) -- passive non-past stems - vowel (v) and consonant (c) --yudallu/yudlalna -- stem is built differently but conjugation is identical to sound verbs local nonpast_pass_v_stem = q(rad1, A, rad2, SH) local nonpast_pass_c_stem = q(rad1, SK, rad2, A, rad2) -- imperative stem local imp_v_stem = q(rad1, nonpast_vowel, rad2, SH) local imp_c_stem = q(form_i_imp_stem_through_rad1(base, nonpast_vowel, rad1), rad2, nonpast_vowel, rad2) -- make parts make_hollow_geminate_verb(base, "geminate", past_v_stem, past_c_stem, past_pass_v_stem, past_pass_c_stem, nonpast_v_stem, nonpast_c_stem, nonpast_pass_v_stem, nonpast_pass_c_stem, imp_v_stem, imp_c_stem, "a") -- Active participle. insert_form_or_forms(base, "ap1", q(rad1, AA, rad2, SH)) -- Active participle, stative type I فَعِيع (++). FIXME: Any examples of this to verify it's correct? insert_ap2_pp2(base, q(rad1, A, rad2, II, rad2)) -- Active participle, stative type II فَعّ (+++). Example: بَرَّ "to be pious", active participle بَرّ insert_form_or_forms(base, "ap3", q(rad1, A, rad2, SH)) -- Active participle, color/defect أَفَعّ (+cd). -- Example: لَصَّ "to be thievish, to steal repeatedly", active participle أَلَصّ. insert_form_or_forms(base, "apcd", q(HAMZA, A, rad1, A, rad2, SH)) -- Active participle, -ān فَعَّان (+an). FIXME: Any examples of this to verify it's correct? insert_form_or_forms(base, "apan", q(rad1, A, rad2, SH, AAN)) -- Passive participle. insert_form_or_forms(base, "pp", q(MA, rad1, SK, rad2, UU, rad2)) end -- Return the ta- (active, past and non-past) and tu- (passive past) prefixes for a form II/III/V/VI verb. -- Form V and VI verbs normally use ta- and tu-, but reduced (base.reduced) verbs use different prefixes. Form II -- and III verbs have no prefix. local function form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vform = base.verb_form if vform == "V" or vform == "VI" then if base.reduced then -- To simplify the code, we generate two rad1's with a sukūn between them, which is cleaned up in -- postprocessing. return q(_I, rad1, SK), q(rad1, SK), q(_U, rad1, SK) else return TA, TA, TU end else return "", "", "" end end -- Make form II or V sound or final-weak verb. local function make_form_ii_v_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "V" and q(ta_past_prefix, rad1, A, rad2, SH, final_weak and IN or q(U, rad3)) or q(TA, rad1, SK, rad2, II, final_weak and AH or rad3) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, A, rad2, SH) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, A, rad2, SH) local past_pass_stem_base = q(tu_past_prefix, rad1, U, rad2, SH) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["II-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["II-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end local function make_form_iii_alt_vn(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- Insert alternative verbal noun فِعَال. Since not all verbs have this, we require that verbs that do have it -- specify it explicitly; a shortcut ++ is provided to make this easier (e.g. <vn:+,++> to indicate that -- both the normal verbal noun مُفَاعَلَة and secondary verbal noun فِعَال are available). insert_form_or_forms(base, "vn2", q(rad1, I, rad2, AA, final_weak and HAMZA or rad3)) end -- Make form III or VI sound or final-weak verb. local function make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, final_weak and IN or q(U, rad3)) or q(MU, rad1, AA, rad2, final_weak and AAH or q(A, rad3, AH)) -- various stem bases local past_stem_base = q(ta_past_prefix, rad1, AA, rad2) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA, rad2) local past_pass_stem_base = q(tu_past_prefix, rad1, UU, rad2) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) if vform == "III" then make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["III-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end -- Make form III or VI geminate verb. local function make_form_iii_vi_geminate_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vform = base.verb_form local ta_past_prefix, ta_nonpast_prefix, tu_past_prefix = form_ii_iii_v_vi_ta_tu_prefix(base, rad1) -- Alternative verbal noun فِعَال will be inserted when we add sound parts below. local vn = vform == "VI" and q(ta_past_prefix, rad1, AA, rad2, SH) or q(MU, rad1, AA, rad2, SH, AH) -- Various stem bases. local past_stem_base = q(ta_past_prefix, rad1, AA) local nonpast_stem_base = q(ta_nonpast_prefix, rad1, AA) local past_pass_stem_base = q(tu_past_prefix, rad1, UU) -- Make parts. local variant = vowel_spec.variant or "short" if variant == "short" or variant == "both" then make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Also add alternative sound (non-compressed) parts. This will lead to some duplicate entries, but they are -- removed during addition. if variant == "long" or variant == "both" then make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) elseif vform == "III" then -- Still need to add the alternative form-III verbal noun. make_form_iii_alt_vn(base, vowel_spec) end end conjugations["III-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make form IV sound or final-weak verb. local function make_form_iv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) -- core of stem base, minus stem prefixes local stem_core -- check for irregular verb أَرَى local is_raa = raa_radicals(rad1, rad2, rad3) if is_raa then base.irregular = true stem_core = rad1 else stem_core = q(rad1, SK, rad2) end -- verbal noun local vn = is_raa and q(HAMZA, I, stem_core, AA, HAMZA, AH) or q(HAMZA, I, stem_core, AA, final_weak and HAMZA or rad3) -- various stem bases local past_stem_base = q(HAMZA, A, stem_core) local nonpast_stem_base = stem_core local past_pass_stem_base = q(HAMZA, U, stem_core) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-sound"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-final-weak"] = function(base, vowel_spec) make_form_iv_sound_final_weak_verb(base, vowel_spec) end conjugations["IV-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- verbal noun local vn = q(HAMZA, I, rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IV-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(HAMZA, I, rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q(HAMZA, A, rad1) local nonpast_stem_base = rad1 local past_pass_stem_base = q(HAMZA, U, rad1) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["V-sound"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["V-final-weak"] = function(base, vowel_spec) make_form_ii_v_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-sound"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-final-weak"] = function(base, vowel_spec) make_form_iii_vi_sound_final_weak_verb(base, vowel_spec) end conjugations["VI-geminate"] = function(base, vowel_spec) make_form_iii_vi_geminate_verb(base, vowel_spec) end -- Make a verbal noun of the general form that applies to forms VII and above. RAD12 is the first consonant cluster -- (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the final consonant. local function high_form_verbal_noun(rad12, rad34, rad5) return q(_I, rad12, I, rad34, AA, rad5) end -- Populate a sound or final-weak verb for any of the various high-numbered augmented forms (form VII and up) that -- have up to 5 consonants in two clusters in the stem and the same pattern of vowels between. Some of these -- consonants in certain verb parts are w's, which leads to apparent anomalies in certain stems of these parts, but -- these anomalies are handled automatically in postprocessing, where we resolve sequences of iwC -> īC, uwC -> ūC, -- w + sukūn + w -> w + shadda. -- RAD12 is the first consonant cluster (after initial اِ) and RAD34 is the second consonant cluster. RAD5 is the -- final consonant. local function make_high_form_sound_final_weak_verb(base, vowel_spec, rad12, rad34, rad5) local final_weak = is_final_weak(base, vowel_spec) local vn = high_form_verbal_noun(rad12, rad34, final_weak and HAMZA or rad5) -- various stem bases local nonpast_stem_base = q(rad12, A, rad34) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad12, U, rad34) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end local function form_vii_nrad1(base, rad1) if base.reduced then if not req(rad1, M) then error(("Internal error: Form VII first radical %s is not م but .reduced specified; should have been caught earlier"): format(rget(rad1))) end return M .. SH else return q("نْ", rad1) end end -- Make form VII sound or final-weak verb. local function make_form_vii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, form_vii_nrad1(base, rad1), rad2, rad3) end conjugations["VII-sound"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-final-weak"] = function(base, vowel_spec) make_form_vii_sound_final_weak_verb(base, vowel_spec) end conjugations["VII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, Y, rad3) -- various stem bases local nonpast_stem_base = nrad1 local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local nrad1 = form_vii_nrad1(base, rad1) local vn = high_form_verbal_noun(nrad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(nrad1, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nrad1, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Return Form VIII verbal noun. local function form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad3) local final_weak = is_final_weak(base, vowel_spec) rad3 = final_weak and HAMZA or rad3 return {high_form_verbal_noun(vowel_spec.form_viii_assim, rad2, rad3)} end -- Make form VIII sound or final-weak verb. local function make_form_viii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِتَّخَذَ if axadh_radicals(rad1, rad2, rad3) then base.irregular = true rad1 = T end make_high_form_sound_final_weak_verb(base, vowel_spec, vowel_spec.form_viii_assim, rad2, rad3) end conjugations["VIII-sound"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-final-weak"] = function(base, vowel_spec) make_form_viii_sound_final_weak_verb(base, vowel_spec) end conjugations["VIII-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, Y, rad3) -- various stem bases local nonpast_stem_base = vowel_spec.form_viii_assim local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, nonpast_stem_base) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["VIII-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = form_viii_verbal_noun(base, vowel_spec, rad1, rad2, rad2) -- various stem bases local nonpast_stem_base = q(vowel_spec.form_viii_assim, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, vowel_spec.form_viii_assim, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, A) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, U) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["IX-final-weak"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), rad3, rad3) end -- Populate a sound or final-weak verb for any of the various high-numbered -- augmented forms that have 5 consonants in the stem and the same pattern of -- vowels. Some of these consonants in certain verb parts are w's, which leads to -- apparent anomalies in certain stems of these parts, but these anomalies -- are handled automatically in postprocessing, where we resolve sequences of -- iwC -> īC, uwC -> ūC, w + sukūn + w -> w + shadda. local function make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, rad3, rad4, rad5) make_high_form_sound_final_weak_verb(base, vowel_spec, q(rad1, SK, rad2), q(rad3, SK, rad4), rad5) end -- Make form X sound or final-weak verb. local function make_form_x_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) -- check for irregular verb اِسْتَحْيَا (also اِسْتَحَى) local is_hayy = hayy_radicals(rad1, rad2, rad3) local variant = vowel_spec.variant or "both" if not is_hayy or variant == "long" or variant == "both" then make_high5_form_sound_final_weak_verb(base, vowel_spec, S, T, rad1, rad2, rad3) end if is_hayy and (variant == "short" or variant == "both") then base.irregular = true -- Add alternative entries to the verbal paradigms. Any duplicates are removed during addition. make_high_form_sound_final_weak_verb(base, vowel_spec, S .. SK .. T, rad1, rad3) end end conjugations["X-sound"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-final-weak"] = function(base, vowel_spec) make_form_x_sound_final_weak_verb(base, vowel_spec) end conjugations["X-hollow"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(base.reduced and "اِسْ" or "اِسْتِ", rad1, AA, rad3, AH) -- various stem bases local past_stem_base = q(base.reduced and "اِسْ" or "اِسْتَ", rad1) local nonpast_stem_base = q(base.reduced and "سْ" or "سْتَ", rad1) local past_pass_stem_base = q(base.reduced and "اُسْ" or "اُسْتُ", rad1) -- make parts make_augmented_hollow_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["X-geminate"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q("اِسْتِ", rad1, SK, rad2, AA, rad2) -- various stem bases local past_stem_base = q("اِسْتَ", rad1) local nonpast_stem_base = q("سْتَ", rad1) local past_pass_stem_base = q("اُسْتُ", rad1) -- make parts if base.altgem then inflect_tense(base, "past", "", {q(past_stem_base, A, rad2, SH), all_same = 1}, past_endings_ay_12_person_only) end make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn, base.altgem and "[uncommon]" or nil) end conjugations["XI-sound"] = function(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local vn = q(_I, rad1, SK, rad2, II, rad3, AA, rad3) -- various stem bases local nonpast_stem_base = q(rad1, SK, rad2, AA) local past_stem_base = q(_I, nonpast_stem_base) local past_pass_stem_base = q(_U, rad1, SK, rad2, UU) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form XI final-weak, since already geminate in form; would behave as XI-sound. -- Make form XII sound or final-weak verb. local function make_form_xii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, rad2, rad3) end conjugations["XII-sound"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end conjugations["XII-final-weak"] = function(base, vowel_spec) make_form_xii_sound_final_weak_verb(base, vowel_spec) end -- Make form XIII sound or final-weak verb. local function make_form_xiii_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, W, W, rad3) end conjugations["XIII-sound"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end conjugations["XIII-final-weak"] = function(base, vowel_spec) make_form_xiii_sound_final_weak_verb(base, vowel_spec) end -- Make a form XIV or XV sound or final-weak verb. Last radical appears twice (if`anlala / yaf`anlilu) so if it were -- w or y you'd get if`anwā / yaf`anwī or if`anyā / yaf`anyī, i.e. unlike for most augmented verbs, the identity of -- the radical matters. local function make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3 = get_radicals_3(vowel_spec) local lastrad = base.verb_form == "XV" and Y or rad3 make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, lastrad) end conjugations["XIV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XIV-final-weak"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end conjugations["XV-sound"] = function(base, vowel_spec) make_form_xiv_xv_sound_final_weak_verb(base, vowel_spec) end -- Probably no form XV final-weak, since already final-weak in form; would behave as XV-sound. -- Make form Iq or IIq sound or final-weak verb. local function make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local vform = base.verb_form local vn = vform == "IIq" and q(TA, rad1, A, rad2, SK, rad3, (final_weak and IN or q(U, rad4))) or q(rad1, A, rad2, SK, rad3, (final_weak and AAH or q(A, rad4, AH))) local ta_pref = vform == "IIq" and TA or "" local tu_pref = vform == "IIq" and TU or "" -- various stem bases local past_stem_base = q(ta_pref, rad1, A, rad2, SK, rad3) local nonpast_stem_base = past_stem_base local past_pass_stem_base = q(tu_pref, rad1, U, rad2, SK, rad3) -- make parts make_augmented_sound_final_weak_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end conjugations["Iq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["Iq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-sound"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIq-final-weak"] = function(base, vowel_spec) make_form_iq_iiq_sound_final_weak_verb(base, vowel_spec) end -- Make form IIIq sound or final-weak verb. local function make_form_iiiq_sound_final_weak_verb(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) make_high5_form_sound_final_weak_verb(base, vowel_spec, rad1, rad2, N, rad3, rad4) end conjugations["IIIq-sound"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IIIq-final-weak"] = function(base, vowel_spec) make_form_iiiq_sound_final_weak_verb(base, vowel_spec) end conjugations["IVq-sound"] = function(base, vowel_spec) local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local vn = q(_I, rad1, SK, rad2, I, rad3, SK, rad4, AA, rad4) -- various stem bases local past_stem_base = q(_I, rad1, SK, rad2, A, rad3) local nonpast_stem_base = q(rad1, SK, rad2, A, rad3) local past_pass_stem_base = q(_U, rad1, SK, rad2, U, rad3) -- make parts make_augmented_geminate_verb(base, vowel_spec, past_stem_base, nonpast_stem_base, past_pass_stem_base, vn) end -- Probably no form IVq final-weak, since already geminate in form; would behave as IVq-sound. end create_conjugations() ------------------------------------------------------------------------------- -- Guts of main conjugation function -- ------------------------------------------------------------------------------- -- Given form, weakness and radicals, check to make sure the radicals present are allowable for the weakness. Hamzas on -- alif/wāw/yāʾ seats are never allowed (should always appear as hamza-on-the-line), and various weaknesses have various -- strictures on allowable consonants. local function check_radicals(form, weakness, rad1, rad2, rad3, rad4) local function hamza_check(index, rad) if rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then error("Radical " .. index .. " is " .. rad .. " but should be ء (hamza on the line)") end end local function check_waw_ya(index, rad) if not is_waw_ya(rad) then error("Radical " .. index .. " is " .. rad .. " but should be و or ي") end end local function check_not_waw_ya(index, rad) if is_waw_ya(rad) then error("In a sound verb, radical " .. index .. " should not be و or ي") end end hamza_check(rad1) hamza_check(rad2) hamza_check(rad3) hamza_check(rad4) if weakness == "assimilated" or weakness == "assimilated+final-weak" then if rad1 ~= W then error("Radical 1 is " .. rad1 .. " but should be و") end -- don't check that non-assimilated form I verbs don't have wāw as their -- first radical because some form-I verbs exist where a first-radical wāw -- behaves as sound, e.g. wajuha yawjuhu "to be distinguished". end if weakness == "final-weak" or weakness == "assimilated+final-weak" then if rad4 then check_waw_ya(4, rad4) else check_waw_ya(3, rad3) end elseif vform_supports_final_weak(form) then -- non-final-weak verbs cannot have weak final radical if there's a corresponding -- final-weak verb category. I think this is safe. We may have problems with -- ḥayya/ḥayiya yaḥyā if we treat it as a geminate verb. if rad4 then check_not_waw_ya(4, rad4) else check_not_waw_ya(3, rad3) end end if weakness == "hollow" then check_waw_ya(2, rad2) -- don't check that non-hollow verbs in forms that support hollow verbs -- don't have wāw or yāʾ as their second radical because some verbs exist -- where a middle-radical wāw/yāʾ behaves as sound, e.g. form-VIII izdawaja -- "to be in pairs". end if weakness == "geminate" then if rad4 then error("Internal error: No geminate quadrilaterals, should not be seen") end if rad2 ~= rad3 then error("Weakness is geminate; radical 3 is " .. rad3 .. " but should be same as radical 2 " .. rad2) end elseif vform_supports_geminate(form) then -- non-geminate verbs cannot have second and third radical same if there's -- a corresponding geminate verb category. I think this is safe. We -- don't fuss over double wāw or double yāʾ because this could legitimately -- be a final-weak verb with middle wāw/yāʾ, treated as sound. if rad4 then error("Internal error: No quadrilaterals should support geminate verbs") end if rad2 == rad3 and not is_waw_ya(rad2) then error("Weakness is '" .. weakness .. "'; radical 2 and 3 are same at " .. rad2 .. " but should not be; consider making weakness 'geminate'") end end end -- array of substitutions; each element is a 2-entry array FROM, TO; do it -- this way so the concatenations only get evaluated once local postprocess_subs = { -- reorder short-vowel + shadda -> shadda + short-vowel for easier processing {"(" .. AIU .. ")" .. SH, SH .. "%1"}, ----------same letter separated by sukūn should instead use shadda--------- ------------happens e.g. in kun-nā "we were".----------------- {"(.)" .. SK .. "%1", "%1" .. SH}, ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {I .. W .. SK, II}, {I .. Y .. SK, II}, -- uw, uy -> ū (assimilated verbs) {U .. W .. SK, UU}, {U .. Y .. SK, UU}, -------------- final -yā uses tall alif not alif maqṣūra ------------------ {"(" .. Y .. SH .. "?" .. A .. ")" .. AMAQ, "%1" .. ALIF}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {HAMZA .. A .. HAMZA .. SK, HAMZA .. A .. ALIF}, {HAMZA .. I .. HAMZA .. SK, HAMZA .. I .. Y}, {HAMZA .. U .. HAMZA .. SK, HAMZA .. U .. W} } local postprocess_tr_subs = { {"ī([" .. vowels .. "y*])", "iy%1"}, {"ū([" .. vowels .. "w*])", "uw%1"}, {"(.)%*", "%1%1"}, -- implement shadda ---------------------------- assimilated verbs ---------------------------- -- iw, iy -> ī (assimilated verbs) {"iw([^" .. vowels .. "w])", "ī%1"}, {"iy([^" .. vowels .. "y])", "ī%1"}, -- uw, uy -> ū (assimilated verbs) {"uw([^" .. vowels .. "w])", "ū%1"}, {"uy([^" .. vowels .. "y])", "ū%1"}, ----------------------- handle hamza assimilation ------------------------- -- initial hamza + short-vowel + hamza + sukūn -> hamza + long vowel {"ʔaʔ(" .. NV .. ")", "ʔā%1"}, {"ʔiʔ(" .. NV .. ")", "ʔī%1"}, {"ʔuʔ(" .. NV .. ")", "ʔū%1"}, } -- Post-process verb parts to eliminate phonological anomalies. Many of the changes, particularly the tricky ones, -- involve converting hamza to have the proper seat. The rules for this are complicated and are documented on the -- [[w:Hamza]] Wikipedia page. In some cases there are alternatives allowed, and we handle them below by returning -- multiple possibilities. -- `keep_initial_w` exempts one sequence from the iw -> ī reduction below: a word-initial -- hamzat wasl + wāw + sukūn, which is how a form-I mithal that keeps its wāw spells its -- imperative (اِوْنَ، اِوْجَلْ). The reduction is right everywhere else and cannot simply be -- dropped from postprocess_subs -- it is what turns the form VIII mithal past اِوْتَعَدَ into -- اِيتَعَدَ, in the same word-initial position, so position alone doesn't separate the two -- cases. Only the caller knows the verb's form, so the exemption is decided there and -- carried in as a flag; here the sequence is parked on a placeholder across the -- substitutions and restored afterwards. See README "Findings" #10. local function postprocess_term(term, keep_initial_w) if term == "?" then return "?" end -- Add BORDER at text boundaries. term = BORDER .. term .. BORDER if keep_initial_w then term = rsub(term, BORDER .. ALIF .. I .. W .. SK, BORDER .. ALIF .. I .. KEEP_W_PH .. SK) end -- Do the main post-processing, based on the pattern substitutions in postprocess_subs. for _, sub in ipairs(postprocess_subs) do term = rsub(term, sub[1], sub[2]) end term = term:gsub(KEEP_W_PH, W) term = term:gsub(BORDER, "") if not rfind(term, HAMZA) then return term end term = term:gsub(HAMZA, HAMZA_PH) term = ar_utilities.process_hamza(term) if #term == 1 then term = term[1] end return term end local function postprocess_translit(translit) if translit == "?" then return "?" end -- Add BORDER at text boundaries. translit = BORDER .. translit .. BORDER -- Do the main post-processing, based on the pattern substitutions in postprocess_tr_subs. for _, sub in ipairs(postprocess_tr_subs) do translit = rsub(translit, sub[1], sub[2]) end translit = translit:gsub(BORDER, "") return translit end local function postprocess_forms(base) local converted_values = {} for slot, forms in pairs(base.forms) do local need_dedup = false for i, form in ipairs(forms) do local term = postprocess_term(form.form, base.keep_initial_w) local translit = form.translit and postprocess_translit(form.translit) or nil if term ~= form.form or translit ~= form.translit then need_dedup = true end converted_values[i] = {term, translit} end if need_dedup then local temp_dedup = {} for i = 1, #forms do local new_term, new_translit = unpack(converted_values[i]) if type(new_term) == "table" then for _, nt in ipairs(new_term) do local new_formobj = { form = nt, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end else local new_formobj = { form = new_term, translit = new_translit, footnotes = forms[i].footnotes, } iut.insert_form(temp_dedup, "temp", new_formobj) end end base.forms[slot] = temp_dedup.temp end end end local function process_slot_overrides(base) for slot, forms in pairs(base.slot_overrides) do local existing_values = base.forms[slot] base.forms[slot] = nil for _, form in ipairs(forms) do -- + in active participle for form I requests slot ap1 if form.form == "+" and (base.verb_form ~= "I" or slot ~= "ap") then if not existing_values then error(("Slot '%s' requested the default value but no such value available"):format(slot)) end -- We maintain an invariant that no two slots share a form object (although they may share the footnote -- lists inside the form objects). However, there is no need to copy the form objects here because there -- is a one-to-one correspondence between slots and slot overrides, i.e. you can't have a default value -- go into two slots. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) elseif default_indicator_to_active_participle_slot[form.form] then if form.form == "++" then if slot ~= "vn" and slot ~= "ap" and slot ~= "pp" then error(("Secondary default value request '++' only applicable to verbal nouns and pariciples, but found in slot '%s'"): format(slot)) end else if slot ~= "ap" then error(("Secondary default value request '%s' only applicable to active pariciples, but found in slot '%s'"): format(form.form, slot)) end end local secondary_default_slot = slot == "vn" and "vn2" or slot == "pp" and "pp2" or default_indicator_to_active_participle_slot[form.form] local existing_values = base.forms[secondary_default_slot] if not existing_values then error(("Slot '%s' requested a secondary default value using '%s' but no such value available"): format(slot, form.form)) end -- See comment above about the lack of need to copy the form objects. insert_form_or_forms(base, slot, existing_values, "allow overrides", form.uncertain) -- To make sure there aren't shared form objects. base.forms[secondary_default_slot] = nil else insert_form_or_forms(base, slot, form, "allow overrides", form.uncertain) end end end -- Now, for non-stative form-I verbs, fill the active participle slot from ap1 unless it should be missing (e.g. -- passive-only or user specified 'ap:-'). if base.verb_form == "I" and not base.forms.ap and base.forms.ap1 and not skip_slot(base, "ap") then local saw_non_stative = false for _, vowel_spec in ipairs(base.conj_vowels) do if req(vowel_spec.past, A) then saw_non_stative = true break end end if saw_non_stative then base.forms.ap = base.forms.ap1 -- To make sure there aren't shared form objects. base.forms.ap1 = nil end end end local function handle_lemma_linked(base) -- Compute linked versions of potential lemma slots, for use in {{ar-verb}}. We substitute the original lemma -- (before removing links) for forms that are the same as the lemma, if the original lemma has links. for _, slot in ipairs(export.potential_lemma_slots) do if base.forms[slot] then insert_form_or_forms(base, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function add_missing_links_to_forms(base) -- Any forms without links should get them now. Redundant ones will be stripped later. for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do if not form.form:find("%[%[") then form.form = "[[" .. form.form .. "]]" end end end end local function conjugate_verb(base) construct_stems(base) for _, vowel_spec in ipairs(base.conj_vowels) do -- Reconstruct conjugation type from verb form and (possibly inferred) weakness. conj_type = base.verb_form .. "-" .. vowel_spec.weakness -- Check that the conjugation type is recognized. if not conjugations[conj_type] then error("Unknown conjugation type '" .. conj_type .. "'") end -- The way the conjugation functions work is they always add entries to the appropriate parts of the paradigm -- (each of which is an array), rather than setting the values. This makes it possible to call more than one -- conjugation function and essentially get a paradigm of the "either A or B" kind. Doing this may insert -- duplicate entries into a particular paradigm part, but this is not a problem because we check for duplicate -- entries when adding them, and don't insert in that case. conjugations[conj_type](base, vowel_spec) end postprocess_forms(base) process_slot_overrides(base) -- This should happen before add_missing_links_to_forms() so that the comparison `form == base.lemma` in -- handle_lemma_linked() works correctly and compares unlinked forms to unlinked forms. handle_lemma_linked(base) process_addnote_specs(base) if not base.alternant_multiword_spec.args.noautolinkverb then add_missing_links_to_forms(base) end end local function parse_indicator_spec(angle_bracket_spec) -- Store the original angle bracket spec so we can reconstruct the overall conj spec with the lemma(s) in them. local base = { angle_bracket_spec = angle_bracket_spec, conj_vowels = {}, root_consonants = {}, user_stem_overrides = {}, user_slot_overrides = {}, slot_explicitly_missing = {}, slot_uncertain = {}, slot_override_uses_default = {}, addnote_specs = {}, } local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) local segments = put.parse_multi_delimiter_balanced_segment_run(inside, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- The first dot-separated element must specify the verb form, e.g. IV or IIq. If the form is I, it needs to include -- the the past and non-past vowels, e.g. I/a~u for kataba ~ yaktubu. More than one vowel can be given, -- comma-separated, and more than one past~non-past pair can be given, slash-separated, e.g. I/a,u~u/i~a for form I -- كمل, which can be conjugated as kamala/kamula ~ yakmulu or kamila ~ yakmalu. An individual vowel spec must be one -- of a, i or u and in general (a) at least one past~non-past pair most be given, and (b) both past and non-past -- vowels must be given even though sometimes the vowel can be determined from the unvocalized form. An exception is -- passive-only verbs, where the vowels can't in general be determined (except indirectly in some cases by looking -- at an associated non-passive verb); in that case, the vowel~vowel spec can left out. local slash_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_groups[1], "/") local form_spec = slash_separated_groups[1] base.form_footnotes = fetch_footnotes(form_spec) if form_spec[1] == "" then parse_err("Missing verb form") end if not allowed_vforms_with_weakness_set[form_spec[1]] then parse_err(("Unrecognized verb form '%s', should be one of %s"):format( form_spec[1], list_to_text(allowed_vforms, nil, " or "))) end if form_spec[1]:find("%-") then base.verb_form, base.explicit_weakness = form_spec[1]:match("^(.-)%-(.*)$") else base.verb_form = form_spec[1] end if #slash_separated_groups > 1 then if base.verb_form ~= "I" then parse_err(("Past~non-past vowels can only be specified when verb form is I, but saw form '%s'"):format( base.verb_form)) end for i = 2, #slash_separated_groups do local slash_separated_group = slash_separated_groups[i] local tilde_separated_groups = put.split_alternating_runs_and_strip_spaces(slash_separated_group, "~") if #tilde_separated_groups ~= 2 then parse_err(("Expected two tilde-separated vowel specs: %s"):format(table.concat(slash_separated_group))) end local function parse_conj_vowels(tilde_separated_group, vtype) local conj_vowel_objects = {} local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(tilde_separated_group, ",") for _, comma_separated_group in ipairs(comma_separated_groups) do local conj_vowel = comma_separated_group[1] if conj_vowel ~= "a" and conj_vowel ~= "i" and conj_vowel ~= "u" then parse_err(("Expected %s conjugation vowel '%s' to be one of a, i or u in %s"):format( vtype, conj_vowel, table.concat(slash_separated_group))) end conj_vowel = dia[conj_vowel] local conj_vowel_footnotes = fetch_footnotes(comma_separated_group) -- Try to use strings when possible as it makes q() significantly more efficient. if conj_vowel_footnotes then table.insert(conj_vowel_objects, {form = conj_vowel, footnotes = conj_vowel_footnotes}) else table.insert(conj_vowel_objects, conj_vowel) end end return conj_vowel_objects end local conj_vowel_spec = { past = parse_conj_vowels(tilde_separated_groups[1], "past"), nonpast = parse_conj_vowels(tilde_separated_groups[2], "non-past"), } table.insert(base.conj_vowels, conj_vowel_spec) end end for i = 2, #dot_separated_groups do local dot_separated_group = dot_separated_groups[i] local first_element = dot_separated_group[1] if first_element == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, {slot_specs = slot_specs, footnotes = spec_and_footnotes}) elseif first_element:find("^var:") then if #dot_separated_group > 1 then parse_err(("Can't attach footnotes to 'var:' spec '%s'"):format(first_element)) end base.variant = first_element:match("^var:(.*)$") elseif first_element:find("^I+V?:") then local root_cons, root_cons_value = first_element:match("^(I+V?):(.*)$") local root_index if root_cons == "I" then root_index = 1 elseif root_cons == "II" then root_index = 2 elseif root_cons == "III" then root_index = 3 elseif root_cons == "IV" then root_index = 4 if not base.verb_form:find("q$") then parse_err(("Can't specify root consonant IV for non-quadriliteral verb form '%s': %s"):format( base.verb_form, first_element)) end end local cons, translit = root_cons_value:match("^(.*)//(.*)$") if not cons then cons = root_cons_value end local root_footnotes = fetch_footnotes(dot_separated_group) if not translit and not root_footnotes then base.root_consonants[root_index] = cons else base.root_consonants[root_index] = {form = cons, translit = translit, footnotes = root_footnotes} end elseif first_element:find("^[a-z][a-z0-9_]*:") then local slot_or_stem, remainder = first_element:match("^(.-):(.*)$") dot_separated_group[1] = remainder local comma_separated_groups = put.split_alternating_runs_and_strip_spaces(dot_separated_group, "[,،]") if overridable_stems[slot_or_stem] then if base.user_stem_overrides[slot_or_stem] then parse_err("Overridable stem '" .. slot_or_stem .. "' specified twice") end base.user_stem_overrides[slot_or_stem] = overridable_stems[slot_or_stem](comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) else -- assume a form override; we validate further later when the possible slots are available if base.user_slot_overrides[slot_or_stem] then parse_err("Form override '" .. slot_or_stem .. "' specified twice") end base.user_slot_overrides[slot_or_stem] = allow_multiple_values_for_override(comma_separated_groups, {prefix = slot_or_stem, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}, "is form override") end elseif indicator_flags[first_element] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base[first_element] then parse_err("Spec '" .. first_element .. "' specified twice") end base[first_element] = true else local passive, uncertain = first_element:match("^(.*)(%?)$") passive = passive or first_element uncertain = not not uncertain if passive_types[passive] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. passive .. "' spec") end if base.passive then parse_err("Value for passive type specified twice") end base.passive = passive base.passive_uncertain = uncertain else parse_err("Unrecognized spec '" .. first_element .. "'") end end end return base end -- Normalize all lemmas, substituting the pagename for blank lemmas and adding links to multiword lemmas. local function normalize_all_lemmas(alternant_multiword_spec, head) -- (1) Add links to all before and after text. Remember the original text so we can reconstruct the verb spec later. if not alternant_multiword_spec.args.noautolinktext then iut.add_links_to_before_and_after_text(alternant_multiword_spec, "remember original") end -- (2) Remove any links from the lemma, but remember the original form so we can use it below in the 'lemma_linked' -- form. iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = head end base.user_specified_lemma = base.lemma base.lemma = m_links.remove_links(base.lemma) base.user_specified_verb = base.lemma base.verb = base.user_specified_verb local linked_lemma if alternant_multiword_spec.args.noautolinkverb or base.user_specified_lemma:find("%[%[") then linked_lemma = base.user_specified_lemma else -- Add links to the lemma so the user doesn't specifically need to, since we preserve -- links in multiword lemmas and include links in non-lemma forms rather than allowing -- the entire form to be a link. linked_lemma = iut.add_links(base.user_specified_lemma) end base.linked_lemma = linked_lemma end) end --W: Lexical exceptions — yāʾ-middle roots whose Form IV (أفعل) keeps the yāʾ SOUND -- instead of undergoing the regular إعلال to a hollow verb (أَفْيَلَ, not أَفَالَ). -- These are attested verbs (not the صفة مشبهة like أَخْيَف/خَيْفاء); each is sourced below. -- Only Form IV is affected; forms VII/VIII/X of these roots remain hollow. -- Keyed by rad1..rad2..rad3. local SOUND_FORM_IV_ROOTS = { ["خيل"] = true, -- أَخْيَلَ: أخيلت السماءُ تهيأت للمطر — المعجم الوسيط ج1 ص266 (وبه أَخالت أيضًا) ["غيل"] = true, -- أَغْيَلَ: أغيلته فهي مُغْيِل، سقته الغَيْل — لسان العرب ج11 ص111 (وبه أغالت أيضًا) ["حيج"] = true, -- أَحْيَجَ: أحيجت الأرضُ، على خلاف القياس — تاج العروس ج5 ص500 ["حين"] = true, -- أَحْيَنَ: أحين القومُ آن لهم أن يبلغوا ما أملوه — المعجم الوسيط ج1 ص212 ["خيف"] = true, -- أَخْيَفَ: أخيف الحاجُّ نزلوا خيف منى — كتاب الأفعال لابن القوطية ص35 ["ريف"] = true, -- أَرْيَفَ: أريفت الأرضُ إريافًا (خصبت) — المحيط في اللغة ج10 ص256 ["زين"] = true, -- أَزْيَنَ: أزينت الأرضُ، حسّنها عشبها — مقاييس اللغة ج3 ص41 } --W: Lexical exceptions — hollow roots in the Form I فَعُلَ pattern (past~non-past u~u) -- that keep the middle radical SOUND instead of contracting to a long vowel (هَيُؤَ / -- يَهْيُؤُ, not هَاءَ / يَهُوءُ). This is not the general rule for u~u hollow verbs -- -- طَالَ / يَطُولُ (ط-و-ل) contracts as normal -- so each entry here is a specific -- attested exception, not a phonological class. -- Keyed by rad1..rad2..rad3. -- Keyed with bare hamza (ء) for rad3, matching normalize_root()'s canonicalization of root radicals -- (HAMZA_ON_ALIF etc. all fold to HAMZA) -- the raw root "هيأ" normalizes to radicals ه, ي, ء. local SOUND_FORM_I_UU_ROOTS = { ["هي" .. HAMZA] = true, -- هَيُؤَ ـُ: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان، ط2، 1995، ص203 } -- Determine weakness from radicals. Used when root given in place of lemma (e.g. for {{ar-verb forms}}). -- `past_vowel`/`nonpast_vowel`, if given, are the past/non-past vowel of a form-I verb (a string or -- footnote-bearing form object, per `req()`); they let SOUND_FORM_I_UU_ROOTS single out the specific -- vowel pattern under which a hollow root is attested as sound, without affecting its other patterns -- (e.g. a root could still contract normally under a different past~non-past pairing). local function weakness_from_radicals(form, rad1, rad2, rad3, rad4, past_vowel, nonpast_vowel) local weakness = nil local quadlit = form:find("q$") -- If weakness unspecified, derive from radicals. if not quadlit then if is_waw_ya(rad3) and rad1 == W and form == "I" then weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated+final-weak" or "final-weak" elseif is_waw_ya(rad3) and vform_supports_final_weak(form) then weakness = "final-weak" elseif rad2 == rad3 and vform_supports_geminate(form) then weakness = "geminate" elseif is_waw_ya(rad2) and vform_supports_hollow(form) then --W: Both wāw (و) and yāʾ (ي) in the middle position create hollow verbs, in form I -- (قَالَ from ق-و-ل, بَاعَ from ب-ي-ع) and in the augmented forms IV, VII, VIII, X -- (أَتَاسَ from ت-ي-س, أَبَانَ from ب-ي-ن, أَطَاحَ from ط-ي-ح — معجم متن اللغة). if form == "IV" and rad2 == Y and SOUND_FORM_IV_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form IV keeps the yāʾ sound (أَفْيَلَ); see SOUND_FORM_IV_ROOTS. weakness = "sound" elseif form == "I" and past_vowel and nonpast_vowel and req(past_vowel, U) and req(nonpast_vowel, U) and SOUND_FORM_I_UU_ROOTS[rad1 .. rad2 .. rad3] then -- Lexical exceptions whose Form I فَعُلَ keeps the middle radical sound (هَيُؤَ); see -- SOUND_FORM_I_UU_ROOTS. Gated to u~u specifically since that's the attested pattern. weakness = "sound" else weakness = "hollow" end elseif rad1 == W and form == "I" then -- Vowel-conditioned, like the lemma path below: a wāw-initial form-I verb only -- elides its wāw under a kasra (or lowered-kasra) non-past. Before this, the two -- inference paths in this module disagreed -- infer_radicals() kept the wāw for -- i~a and u~u while this one dropped it for every vowel pattern. weakness = form_i_w_assimilated(past_vowel, nonpast_vowel) and "assimilated" or "sound" else weakness = "sound" end else if is_waw_ya(rad4) then weakness = "final-weak" else weakness = "sound" end end return weakness end -- Join the infixed tāʔ (ت) to the first radical in form VIII verbs. This may cause assimilation of the tāʔ to the -- radical or in some cases the radical to the tāʔ. Used when a root is supplied instead of a lemma (which already has -- the appropriate assimilation in it). local function form_viii_join_ta(rad) if rad == W or rad == Y or rad == "ت" then return "تّ" elseif rad == "د" then return "دّ" elseif rad == "ث" then return "ثّ" elseif rad == "ذ" then return "ذّ" elseif rad == "ز" then return "زْد" elseif rad == "ص" then return "صْط" elseif rad == "ض" then return "ضْط" elseif rad == "ط" then return "طّ" elseif rad == "ظ" then return "ظّ" else return rad .. SK .. "ت" end end local function detect_indicator_spec(base) base.forms = {} base.stem_overrides = {} base.slot_overrides = {} if not base.conj_vowels[1] then -- These may be converted to inferred vowels. If not, we throw an error if form I and not passive-only. base.conj_vowels = {{ past = "-", nonpast = "-", }} else -- If multiple vowels specified for a given vowel type (e.g. a,u~u), expand so that each spec in local expansion = {} for _, spec in ipairs(base.conj_vowels) do for _, past in ipairs(spec.past) do for _, nonpast in ipairs(spec.nonpast) do table.insert(expansion, {past = past, nonpast = nonpast}) end end end base.conj_vowels = expansion end local vform = base.verb_form -- check for quadriliteral form (Iq, IIq, IIIq, IVq) base.quadlit = not not vform:find("q$") -- Infer radicals as necessary. We infer a separate set of radicals for each past~non-past vowel combination because -- they may be different (particularly with form-I hollow verbs). for _, vowel_spec in ipairs(base.conj_vowels) do -- NOTE: rad1, rad2, etc. refer to user-specified radicals, which are formobj tables that optionally specify an -- explicit manual translit, whereas ir1, ir2, etc. refer to inferred radicals, which are either strings or -- lists of possible radicals. local rads = base.root_consonants local rad1, rad2, rad3, rad4 = rads[1], rads[2], rads[3], rads[4] -- Default any unspecified radicals to radicals determined from the headword. The returned radicals may be -- lists of possible radicals, where the first radical should be chosen if the user didn't explicitly specify a -- radical but all are allowed. If `ambig = true` is set in the table, the radical is considered ambiguous and -- categories won't be created for weak radicals. local weakness, ir1, ir2, ir3, ir4 if vform ~= "none" then ir1, ir2, ir3 = rmatch(base.lemma, "^([^_])_([^_])_([^_])$") if not ir1 then ir1, ir2, ir3, ir4 = rmatch(base.lemma, "^([^_])_([^_])_([^_])_([^_])$") end if ir1 then -- root given instead of lemma weakness = weakness_from_radicals(vform, ir1, ir2, ir3, ir4, vowel_spec.past, vowel_spec.nonpast) if vform == "VIII" then vowel_spec.form_viii_assim = form_viii_join_ta(ir1) end else local ret = export.infer_radicals { headword = base.lemma, vform = vform, passive = base.passive, past_vowel = vowel_spec.past, nonpast_vowel = vowel_spec.nonpast, is_reduced = base.reduced, } weakness, ir1, ir2, ir3, ir4 = ret.weakness, ret.rad1, ret.rad2, ret.rad3, ret.rad4 vowel_spec.form_viii_assim = ret.form_viii_assim vowel_spec.past = ret.past_vowel vowel_spec.nonpast = ret.nonpast_vowel vowel_spec.variant = base.variant or ret.variant end end -- For most ambiguous radicals, the choice of radical doesn't matter because it doesn't affect the conjugation -- one way or another. For form I hollow verbs, however, it definitely does. In fact, the choice of radical is -- critical even beyond the past and non-past vowels because it affects the form of the passive participle. So, -- check for this and signal an error if the radical could not be inferred and is not given explicitly. if vform == "I" and type(ir2) == "table" and ir2.need_radical and not rad2 then error("Unable to guess middle radical of hollow form I verb; need to specify radical explicitly") end if vform == "I" and not is_passive_only(base.passive) and ( rget(vowel_spec.past) == "-" or rget(vowel_spec.nonpast) == "-") then error("Form I verb that isn't passive-only or final-weak must have past~non-past vowels specified") end -- Convert ambiguous radicals. local function regularize_inferred_radical(rad) if type(rad) == "table" then if rad.ambig then return {form = rad[1], ambig = true} else return rad[1] end else return rad end end -- Return the appropriate radical at index `index` (1 through 4), based either on the user-specified radical -- `user_radical` or (if unspecified) `inferred_radical`, inferred from the unvocalized lemma. Two values are -- returned, the "regularized" version of the radical (where ambiguous inferred radicals are converted to their -- most likely actual radical) and the non-regularized version. The returned values are form objects rather than -- strings. local function fetch_radical(user_radical, inferred_radical, index) if not user_radical then return regularize_inferred_radical(inferred_radical), inferred_radical else local rad_formval = rget(user_radical) if type(inferred_radical) == "table" then local allowed_radical_set = m_table.listToSet(inferred_radical) if not allowed_radical_set[rad_formval] then error(("For lemma %s, radical %s ambiguously inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, list_to_text(inferred_radical, nil, " or "), rad_formval)) end elseif rad_formval ~= inferred_radical then error(("For lemma %s, radical %s inferred as %s but user radical incompatibly given as %s"): format(base.lemma, index, inferred_radical, rad_formval)) end return user_radical, user_radical end end if vform ~= "none" then vowel_spec.rad1, vowel_spec.unreg_rad1 = fetch_radical(rad1, ir1, 1) vowel_spec.rad2, vowel_spec.unreg_rad2 = fetch_radical(rad2, ir2, 2) vowel_spec.rad3, vowel_spec.unreg_rad3 = fetch_radical(rad3, ir3, 3) if base.quadlit then vowel_spec.rad4, vowel_spec.unreg_rad4 = fetch_radical(rad4, ir4, 4) end end if vform == "I" then -- If explicit weakness given using 'I-sound' or 'I-assimilated', we may need to adjust the inferred weakness. if base.explicit_weakness == "sound" then if weakness == "assimilated" then weakness = "sound" elseif weakness == "assimilated+final-weak" then -- Verbs like waniya~yawnā "to be faint; to languish" (although the defaults should handle this -- correctly) weakness = "final-weak" else error(("Can't specify form 'I-sound' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness == "assimilated" then if weakness == "sound" then -- i~a verbs like waṭiʔa~yaṭaʔu "to tread, to trample"; wasiʕa~yasaʕu "to be spacious; to be well-off"; -- waṯiʔa~yaṯaʔu "to get bruised, to be sprained", which would default to sound. weakness = "assimilated" elseif weakness == "final-weak" then -- For completeness; not clear if any verbs occur where this is needed. (There are plenty of -- assimilated+final-weak verbs but the defaults should take care of them.) weakness = "assimilated+final-weak" else error(("Can't specify form 'I-assimilated' when inferred weakness is '%s' for lemma %s"):format( weakness, base.lemma)) end elseif base.explicit_weakness then error(("Internal error: Unrecognized value '%s' for base.explicit_weakness"):format(base.explicit_weakness)) end elseif vform == "none" then weakness = base.explicit_weakness elseif base.explicit_weakness then error(("Internal error: Explicit weakness should not be specifiable except with forms I and none, but saw explicit weakness '%s' with verb form '%s'"): format(base.explicit_weakness, vform)) end vowel_spec.weakness = weakness if vform ~= "none" then -- Error if radicals are wrong given the weakness. More likely to happen if the weakness is explicitly given -- rather than inferred. Will also happen if certain incorrect letters are included as radicals e.g. hamza on -- top of various letters, alif maqṣūra, tā' marbūṭa. check_radicals(vform, weakness, rget(vowel_spec.rad1), rget(vowel_spec.rad2), rget(vowel_spec.rad3), base.quadlit and rget(vowel_spec.rad4) or nil) end -- Check the variant value. local form_iii_vi_geminate = (vform == "III" or vform == "VI") and rget(vowel_spec.rad2) == rget(vowel_spec.rad3) and not req(vowel_spec.rad2, Y) local hayy_i_x = hayy_radicals(vowel_spec.rad1, vowel_spec.rad2, vowel_spec.rad3) and (vform == "I" or vform == "X") if form_iii_vi_geminate or hayy_i_x then if vowel_spec.variant and vowel_spec.variant ~= "long" and vowel_spec.variant ~= "short" and vowel_spec.variant ~= "both" then error(("For form-III/VI geminate verb or form-I/X verb with ح-ي-ي radicals, saw unrecognized 'var:%s' value; should be 'var:long', 'var:short' or 'var:both'"):format( vowel_spec.variant)) end elseif vowel_spec.variant then error(("Variant value 'var:%s' not allowed in this context"):format(vowel_spec.variant)) end end -- If form I, regroup expanded vowels for display purposes. if vform == "I" then local group_by_past = {} for _, vowel_spec in ipairs(base.conj_vowels) do m_table.insertIfNot(group_by_past, { past = undia[rget(vowel_spec.past)], nonpasts = {undia[rget(vowel_spec.nonpast)]}, }, { key = function(obj) return obj.past end, combine = function(obj1, obj2) for _, nonpast in ipairs(obj2.nonpasts) do m_table.insertIfNot(obj1.nonpasts, nonpast) end end, }) end local group_by_nonpast = {} for _, vowel_spec in ipairs(group_by_past) do m_table.insertIfNot(group_by_nonpast, { pasts = {vowel_spec.past}, nonpasts = vowel_spec.nonpasts, }, { key = function(obj) return obj.nonpasts end, combine = function(obj1, obj2) for _, past in ipairs(obj2.pasts) do m_table.insertIfNot(obj1.pasts, past) end end, }) end base.grouped_conj_vowels = group_by_nonpast end -- Set value of passive. If not specified, default is yes for forms II, III, IV and Iq; no but uncertainly for -- forms VII, IX, XI - XV and IIIq - IVq, as well as form I with past vowel u; impersonal but uncertainly for form -- V, VI, X and IIq, as well as form I with past vowel i; and yes but uncertainly for the remainder (form I with -- past vowel only a and form VIII). if not base.passive then base.passive_defaulted = true -- Temporary tracking for defaulted passives by verb form, weakness and (for form I) past/non-past vowels. track_if_ar_conj(base, "passive-defaulted/" .. vform) for _, vowel_spec in ipairs(base.conj_vowels) do track_if_ar_conj(base, "passive-defaulted/" .. vform.. "/" .. vowel_spec.weakness) if vform == "I" then --W: use rget(); the vowel is a form object when the user attached a footnote -- (e.g. <I/a[نادر]~u>), and undia[<table>] is nil, which crashes format() on Lua 5.1. local past_nonpast = ("%s~%s"):format(undia[rget(vowel_spec.past)], undia[rget(vowel_spec.nonpast)]) track_if_ar_conj(base, "passive-defaulted/I/" .. past_nonpast) track_if_ar_conj(base, "passive-defaulted/I/" .. vowel_spec.weakness .. "/" .. past_nonpast) end end if vform_probably_full_passive(vform) then base.passive = "pass" else base.passive_uncertain = true for _, vowel_spec in ipairs(base.conj_vowels) do if vform_probably_no_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "nopass" break elseif vform_probably_impersonal_passive(vform, vowel_spec.weakness, vowel_spec.past, vowel_spec.nonpast) then base.passive = "ipass" break end end base.passive = base.passive or "pass" end end -- NOTE: Currently there are no built-in stems or form overrides for Arabic; this code is inherited from -- [[Module:ca-verb]], where such things do exist, and is kept for generality in case we decide in the future to -- implement such things. -- Override built-in verb stems and overrides with user-specified ones. for stem, values in pairs(base.user_stem_overrides) do base.stem_overrides[stem] = values end for slot, values in pairs(base.user_slot_overrides) do if not base.alternant_multiword_spec.verb_slots_map[slot] then error("Unrecognized override slot '" .. slot .. "': " .. base.angle_bracket_spec) end if export.unsettable_slots_set[slot] then error("Slot '" .. slot .. "' cannot be set using an override: " .. base.angle_bracket_spec) end if skip_slot(base, slot, "allow overrides") then error("Override slot '" .. slot .. "' would be skipped based on the passive, 'noimp' and/or 'no_nonpast' settings: " .. base.angle_bracket_spec) end base.slot_overrides[slot] = values end if base.verb_form == "none-final-weak" then for _, stem_type in ipairs { "past", "past_pass", "nonpast", "nonpast_pass" } do if base.stem_overrides[stem_type .. "_c"] or base.stem_overrides[stem_type .. "_v"] then error(("Specify past stem for verb type 'none-final-weak' using '%s:...' not '%s_c:...' or '%s_v:...'"): format(stem_type, stem_type, stem_type)) end end for _, stem_type in ipairs { "past", "nonpast" } do if base.stem_overrides[stem_type] or not base.stem_overrides[stem_type .. "_final_weak_vowel"] then error(("For verb type 'none-final-weak', if '%s:...' specified, so must '%s_final_weak_vowel:...'"): format(stem_type, stem_type)) end end end end local function detect_all_indicator_specs(alternant_multiword_spec) add_slots(alternant_multiword_spec) alternant_multiword_spec.verb_forms = {} -- This means at least one individual base had the slot marked as explicitly missing. Another base (e.g. when -- there are multiple alternants) might have a value for the slot. In practice, we only respect this when there are -- no overall values in the slot and `slot_uncertain` isn't set; in this case, we display "no ..." for the slot -- instead of simply not displaying anything for the slot. alternant_multiword_spec.slot_explicitly_missing = {} -- This means at least one individual base had no values for the slot and the slot marked as explicitly uncertain. -- Note that this is different from a value being present but marked as uncertain (e.g. if an override was given -- with a ? after it); this causes the form object for the value to have `uncertain = true` set. If there are no -- overall values in the slot and `slot_uncertain` is set, we display this in the headword. alternant_multiword_spec.slot_uncertain = {} iut.map_word_specs(alternant_multiword_spec, function(base) -- So arguments, etc. can be accessed. WARNING: Creates circular reference. base.alternant_multiword_spec = alternant_multiword_spec detect_indicator_spec(base) if not base.nocat then m_table.insertIfNot(alternant_multiword_spec.verb_forms, base.verb_form) end if base.passive then alternant_multiword_spec.passive = base.passive end if base.passive_uncertain then alternant_multiword_spec.passive_uncertain = true end for slot, _ in pairs(base.slot_explicitly_missing) do alternant_multiword_spec.slot_explicitly_missing[slot] = true end end) end local function determine_slot_uncertainty_from_forms(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) -- If no verbal noun and verb form is not 'none' (manually-specified stems) — which currently only happens for -- form I — and the verbal noun wasn't explicitly indicated as missing using <vn:->, we assume it's just -- unknown/unspecified rather than missing. Same with active participles. for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not base.forms[uncertain_slot] and vform ~= "none" and not skip_slot(base, uncertain_slot) then base.slot_uncertain[uncertain_slot] = true end end -- Propagate slot uncertainty up. Currently only the verbal noun can have this set but we write the code -- generally. for slot, _ in pairs(base.slot_uncertain) do alternant_multiword_spec.slot_uncertain[slot] = true end end) -- If slot is uncertain and has no value, explicitly set its value to "?". for uncertain_slot, _ in pairs(slots_that_may_be_uncertain) do if not alternant_multiword_spec.forms[uncertain_slot] and alternant_multiword_spec.slot_uncertain[uncertain_slot] then alternant_multiword_spec.forms[uncertain_slot] = {{form = "?"}} end end end -- Determine certain properties of the verb from the overall forms, such as whether the verb is active-only or -- passive-only, is impersonal, lacks an imperative, etc. local function determine_verb_properties_from_forms(alternant_multiword_spec) alternant_multiword_spec.has_active = false alternant_multiword_spec.has_passive = false alternant_multiword_spec.has_non_impers_active = false alternant_multiword_spec.has_non_impers_passive = false alternant_multiword_spec.has_imp = false alternant_multiword_spec.has_past = false alternant_multiword_spec.has_nonpast = false for slot, _ in pairs(alternant_multiword_spec.forms) do if slot == "ap" or slot:find("[123]") and not slot:find("_pass") then alternant_multiword_spec.has_active = true end if slot == "pp" or slot:find("[123]") and slot:find("_pass") then alternant_multiword_spec.has_passive = true end if slot:find("[123]") and not slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_active = true end if slot:find("pass_[123]") and not slot:find("3ms") then alternant_multiword_spec.has_non_impers_passive = true end if slot:find("^imp_") then alternant_multiword_spec.has_imp = true end if slot:find("^past_") then alternant_multiword_spec.has_past = true end if slot:find("^ind_") or slot:find("^sub_") or slot:find("^juss_") then alternant_multiword_spec.has_nonpast = true end end end local function add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) -- Useful e.g. in constructing suppletive verbs out of parts. For a verb like جاء or أتى whose imperative comes -- from the unrelated verb تعالى, we don't want the latter verb showing up in categories or annotations. if base.nocat then return end local vform = base.verb_form if vform ~= "none" then insert_ann("form", vform) insert_cat("form-" .. vform .. " verbs") --W: Add morphological pattern corresponding to the form local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[vform] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end if base.reduced then insert_ann("reduced", "reduced") if vform ~= "none" then insert_cat("form-" .. vform .. " reduced verbs") end end if base.quadlit then insert_cat("verbs with quadriliteral roots") end if base.passive_defaulted then insert_cat("verbs with defaulted passive") end for _, vowel_spec in ipairs(base.conj_vowels) do local rad1, rad2, rad3, rad4 = get_radicals_4(vowel_spec) local final_weak = is_final_weak(base, vowel_spec) local weakness = vowel_spec.weakness -- We have to distinguish weakness by form and weakness by conjugation. Weakness by form merely indicates the -- presence of weak letters in certain positions in the radicals. Weakness by conjugation is related to how the -- verbs are conjugated. For example, form-II verbs that are "hollow by form" (middle radical is wāw or yāʾ) are -- conjugated as sound verbs. Another example: form-I verbs with initial wāw are "assimilated by form" and most -- are assimilated by conjugation as well, but a few are sound by conjugation, e.g. wajuha yawjuhu "to be -- distinguished" (rather than wajuha yajuhu); similarly for some hollow-by-form verbs in various forms, e.g. -- form VIII izdawaja yazdawiju "to be in pairs" (rather than izdāja yazdāju). Categories referring to weakness -- always refer to weakness by conjugation; weakness by form is distinguished only by categories such as -- [[:Category:Arabic form-III verbs with و as second radical]]. insert_ann("weakness", weakness) if vform ~= "none" then insert_cat(("%s form-%s verbs"):format(weakness, vform)) end local function radical_is_ambiguous(rad) return type(rad) == "table" and rad.ambig end local function radical_is_unambiguous_weak(rad) return not radical_is_ambiguous(rad) and (is_waw_ya(rad) or req(rad, HAMZA)) end if vform ~= "none" then local ur1, ur2, ur3, ur4 = vowel_spec.unreg_rad1, vowel_spec.unreg_rad2, vowel_spec.unreg_rad3, vowel_spec.unreg_rad4 -- Create headword categories based on the radicals. Do the following before -- converting the Latin radicals into Arabic ones so we distinguish -- between ambiguous and non-ambiguous radicals. if radical_is_ambiguous(ur1) or radical_is_ambiguous(ur2) or radical_is_ambiguous(ur3) or ur4 and radical_is_ambiguous(ur4) then insert_cat("verbs with ambiguous radicals") end if radical_is_unambiguous_weak(ur1) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur1) .. " as first radical") end if radical_is_unambiguous_weak(ur2) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur2) .. " as second radical") end if radical_is_unambiguous_weak(ur3) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur3) .. " as third radical") end if ur4 and radical_is_unambiguous_weak(ur4) then insert_cat("form-" .. vform .. " verbs with " .. rget(ur4) .. " as fourth radical") end end end if vform == "I" and not is_passive_only(base.passive) then for _, vowel_spec in ipairs(base.grouped_conj_vowels) do insert_ann("vowels", ("%s ~ %s"):format(table.concat(vowel_spec.pasts, "/"), table.concat(vowel_spec.nonpasts, "/"))) for _, past in ipairs(vowel_spec.pasts) do for _, nonpast in ipairs(vowel_spec.nonpasts) do if past == "-" or nonpast == "-" then error("Internal error: Saw form I past vowel %s and non-past vowel %s but - in place of vowel should have triggered an error earlier") end insert_cat(("form-I verbs with past vowel %s and non-past vowel %s"):format(past, nonpast)) --W: Add morphological pattern for form I based on vowels local form_i_with_vowels = ("I/%s~%s"):format(past, nonpast) local morph_pattern = FORM_TO_MORPHOLOGICAL_PATTERN[form_i_with_vowels] if morph_pattern then insert_ann("morph_pattern", morph_pattern) end end end end end for slot, name in pairs(slots_that_may_be_uncertain) do if base.slot_uncertain[slot] then -- An unspecified and non-defaulted verbal noun (form I) is considered uncertain rather than explicitly -- missing. Use <vn:-> to explicitly indicate the lack of verbal noun. Same for form-I stative active -- participles. insert_cat(("verbs with unknown or uncertain %ss"):format(name)) end end if base.irregular then insert_ann("irreg", "irregular") insert_cat("irregular verbs") end end -- Compute the categories to add the verb to, as well as the annotation to display in the conjugation title bar. We -- combine the code to do these functions as both categories and title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.categories = {} local ann = {} alternant_multiword_spec.annotation = ann ann.form = {} ann.morph_pattern = {} --W: arabic morphological pattern corresponding to the form ann.weakness = {} ann.vowels = {} ann.passive = nil ann.reduced = {} ann.irreg = {} ann.defective = {} local multiword_lemma = false for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do if formobj.form:find(" ") then multiword_lemma = true break end end break end end local function insert_ann(anntype, value) m_table.insertIfNot(alternant_multiword_spec.annotation[anntype], value) end local function insert_cat(cat, also_when_multiword) -- Don't place multiword terms in categories like 'Arabic form-II verbs' to avoid spamming the categories with -- such terms. if also_when_multiword or not multiword_lemma then m_table.insertIfNot(alternant_multiword_spec.categories, "Arabic " .. cat) end end iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma, insert_ann, insert_cat) end) for slot, name in pairs(slots_that_may_be_uncertain) do if alternant_multiword_spec.forms[slot] then for _, form in ipairs(alternant_multiword_spec.forms[slot]) do if form.uncertain then if form.form == "?" then insert_cat(("verbs with explicitly unknown %ss"):format(name)) else insert_cat(("verbs needing %s checked"):format(name)) end break end end end end if alternant_multiword_spec.has_active then if alternant_multiword_spec.has_passive and alternant_multiword_spec.has_non_impers_passive then insert_cat("verbs with full passive") ann.passive = "full passive" elseif alternant_multiword_spec.has_passive then insert_cat("verbs with impersonal passive") ann.passive = "impersonal passive" else insert_cat("verbs lacking passive forms") ann.passive = "no passive" end else if alternant_multiword_spec.has_non_impers_passive then insert_cat("passive verbs") insert_cat("verbs with full passive") ann.passive = "passive-only" else insert_cat("passive verbs") insert_cat("impersonal verbs") insert_cat("verbs with impersonal passive") ann.passive = "impersonal (passive-only)" end end if alternant_multiword_spec.passive_uncertain then insert_cat("verbs needing passive checked") ann.passive = ann.passive .. ' <abbr title="passive status uncertain">(?)</abbr>' end if alternant_multiword_spec.has_active and not alternant_multiword_spec.has_imp then insert_ann("defective", "no imperative") insert_cat("verbs lacking imperative forms") end if not alternant_multiword_spec.has_past then insert_ann("defective", "no past") insert_cat("verbs lacking past forms") end if not alternant_multiword_spec.has_nonpast then insert_ann("defective", "no non-past") insert_cat("verbs lacking non-past forms") end local ann_parts = {} local function insert_ann_part(part, conj) local val = table.concat(ann[part], conj or " or ") if val ~= "" and val ~= "regular" then table.insert(ann_parts, val) end end insert_ann_part("form") insert_ann_part("weakness") insert_ann_part("reduced") insert_ann_part("vowels") if ann.passive then table.insert(ann_parts, ann.passive) end insert_ann_part("irreg") insert_ann_part("defective", "، ") --W: Save morph_pattern before overwriting annotation with string alternant_multiword_spec.morph_pattern = ann.morph_pattern alternant_multiword_spec.annotation = table.concat(ann_parts, "، ") end local function show_forms(alternant_multiword_spec) local lemmas = {} for _, slot in ipairs(export.potential_lemma_slots) do if alternant_multiword_spec.forms[slot] then for _, formobj in ipairs(alternant_multiword_spec.forms[slot]) do table.insert(lemmas, formobj) end break end end alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() alternant_multiword_spec.vn = alternant_multiword_spec.forms.vn -- save for later use in make_table() -- Reconstruct the original verb spec without overrides for verbal nouns and participles, since those specific slots -- are ignored by {{ar-verb form}}. Compute this once beforehand; `transform_accel_obj` is called repeatedly on each -- form and we don't want to compute this repeatedly. local reconstructed_verb_spec = iut.reconstruct_original_spec(alternant_multiword_spec, { preprocess_angle_bracket_spec = function(spec) spec = spec:match("^<(.*)>$") assert(spec) local segments = put.parse_multi_delimiter_balanced_segment_run(spec, {{"[", "]"}, {"<", ">"}}) local dot_separated_groups = put.split_alternating_runs_and_strip_spaces(segments, "%.") -- Rejoin each dot-separated group into a single string, since we aren't actually going to do any parsing -- of bracket-bounded textual runs; then filter out overrides for verbal nouns and participles. local filtered_indicators = {} for _, dot_separated_group in ipairs(dot_separated_groups) do local indicator = table.concat(dot_separated_group) -- FIXME: Do we want to filter out any other indicators? if not (indicator:find("^vn:") or indicator:find("^[ap]p:")) then table.insert(filtered_indicators, indicator) end end return ("<%s>"):format(table.concat(filtered_indicators, ".")) end, }) -- If we're dealing with a single word, no alternants and a single verb form, use the auto-conjugation-fetching -- variant. local reconstructed_lemma, inside = reconstructed_verb_spec:match("^([^ <>()]+)(%b<>)$") if inside and alternant_multiword_spec.verb_forms[1] and not alternant_multiword_spec.verb_forms[2] then reconstructed_verb_spec = ("+%s<%s>"):format(reconstructed_lemma, alternant_multiword_spec.verb_forms[1]) end local function transform_accel_obj(slot, formobj, accel_obj) if not accel_obj then return accel_obj end if slot == "ap" or slot == "pp" or slot == "vn" then -- FIXME: [[Module:accel]] can't correctly handle more than one verb form for participles and verbal nouns accel_obj.form = slot .. "-" .. table.concat(alternant_multiword_spec.verb_forms, "،") else accel_obj.form = "verb-form-" .. reconstructed_verb_spec end return accel_obj end local function generate_link(data) local form = data.form local term = form.formval_for_link local alt = form.alt if term == "?" then term = nil alt = "?" end --W: Create simple link for verb forms without #Arabic anchor local display = alt or term local link if display then link = link_term_simple(display) else link = "" end link = link .. iut.get_footnote_text(form.footnotes, data.footnote_obj) --W: qualifier/label rendering removed along with the q/qq/l/ll modifiers; -- it required [[Module:pron qualifier]], absent on ar.wiktionary. return link end local props = { lang = lang, lemmas = lemmas, transform_accel_obj = transform_accel_obj, generate_link = generate_link, slot_list = alternant_multiword_spec.verb_slots, include_translit = false, } iut.show_forms(alternant_multiword_spec.forms, props) end --W: Tatweel and the invisible direction/joining marks survive copy-paste and -- MediaWiki keeps them in page titles, so strip them from both sides before -- comparing a |بؤرة= value against a generated form. local FOCUS_IGNORE = "[" .. u(0x0640) .. u(0x061C) .. u(0x200B) .. "-" .. u(0x200F) .. u(0x202A) .. "-" .. u(0x202E) .. u(0xFEFF) .. "]" local function normalize_for_focus(s) return (rsub(s, FOCUS_IGNORE, "")) end --W: Which slots hold `focus`? Must run before show_forms() turns the form -- lists into rendered wikitext. local function find_focus_slots(alternant_multiword_spec, focus) if not focus or focus == "" then return nil end local target = normalize_for_focus(focus) local slots = {} for slot, forms in pairs(alternant_multiword_spec.forms) do if type(forms) == "table" then for _, formobj in ipairs(forms) do if type(formobj) == "table" and formobj.form and normalize_for_focus(formobj.form) == target then slots[slot] = true break end end end end return slots end --W: 'yes' unless |موسع= asked for the table open. [[Template:inflection-table-top]] -- turns any non-empty |tall= into the mw-collapsed class. local function collapsed_arg(alternant_multiword_spec) if alternant_multiword_spec.expanded then return nil end return 'yes' end --W: Put the marker class on the cell itself rather than on a span around its -- contents, so the highlight covers the whole cell instead of hugging the word. -- Runs on the table wikitext below, before m_string_utilities.format() fills the -- {slot} placeholders in. Every form cell in either table has one of two shapes: -- -- | {past_1s} -> | class="avf-focus" | {past_1s} -- | rowspan="2" | {past_1s} -> | rowspan="2" class="avf-focus" | {past_1s} -- -- Styled by [[Template:ar-verb-form/style.css]] (.inflection-table td.avf-focus). local function mark_focus_cells(text, focus_slots) if not focus_slots then return text end return (rsub(text, "\n(|[^\n]*)", function(cell) local slot = rmatch(cell, "^|%s*{([%w_]+)}%s*$") if slot then if focus_slots[slot] then return '\n| class="avf-focus" | {' .. slot .. "}" end return nil end local attrs attrs, slot = rmatch(cell, "^|%s*(.-)%s*|%s*{([%w_]+)}%s*$") if slot and focus_slots[slot] then return "\n| " .. attrs .. ' class="avf-focus" | {' .. slot .. "}" end return nil end)) end ------------------------------------------------------------------------------- -- Functions to create inflection tables -- ------------------------------------------------------------------------------- -- Make the conjugation table. Called from export.show(). local function make_table(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } text = text .. [=[ ! colspan="6" | <<الْمَصْدَر>> | colspan="7" | {vn} ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْفَاعِل>> | colspan="7" | {ap} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="6" | <<اِسْم الْمَفْعُول>> | colspan="7" | {pp} ]=] end text = text .. [=[ |- ! colspan="999" class="separator" | ]=] if alternant_multiword_spec.has_active then text = text .. [=[ |- ! colspan="12" class="outer" | <<الْفِعْل الْمَعْلُوم>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="12" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="12" class="separator" | ! colspan="3"| <<الْجَمْع>> |- ! colspan="2"| ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_1s} | {past_2ms} | {past_3ms} | rowspan="2" | {past_2d} | {past_3md} | rowspan="2" | {past_1p} | {past_2mp} | {past_3mp} |- ! class="secondary" | المؤنث | {past_2fs} | {past_3fs} | {past_3fd} | {past_2fp} | {past_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_1s} | {ind_2ms} | {ind_3ms} | rowspan="2" | {ind_2d} | {ind_3md} | rowspan="2" | {ind_1p} | {ind_2mp} | {ind_3mp} |- ! class="secondary" | المؤنث | {ind_2fs} | {ind_3fs} | {ind_3fd} | {ind_2fp} | {ind_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_1s} | {sub_2ms} | {sub_3ms} | rowspan="2" | {sub_2d} | {sub_3md} | rowspan="2" | {sub_1p} | {sub_2mp} | {sub_3mp} |- ! class="secondary" | المؤنث | {sub_2fs} | {sub_3fs} | {sub_3fd} | {sub_2fp} | {sub_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_1s} | {juss_2ms} | {juss_3ms} | rowspan="2" | {juss_2d} | {juss_3md} | rowspan="2" | {juss_1p} | {juss_2mp} | {juss_3mp} |- ! class="secondary" | المؤنث | {juss_2fs} | {juss_3fs} | {juss_3fd} | {juss_2fp} | {juss_3fp} |- ! rowspan="2" | <<الْأَمْر>> ! class="secondary" | المذكر | rowspan="2" | | {imp_2ms} | rowspan="2" | | rowspan="2" | {imp_2d} | rowspan="2" | | rowspan="2" | | {imp_2mp} | rowspan="2" | |- ! class="secondary" | المؤنث | {imp_2fs} | {imp_2fp} ]=] end if alternant_multiword_spec.has_passive then text = text .. [=[ |- ! colspan="999" class="separator" | |- ! colspan="12" class="outer" | <<الْفِعْل الْمَجْهُول>> |- ! colspan="2" | ! colspan="3" | <<الْمُفْرَد>> ! rowspan="10" class="separator" | ! colspan="2" | <<الْمُثَنَّى>> ! rowspan="10" class="separator" | ! colspan="3" | <<الْجَمْع>> |- ! colspan="2" | ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> ! <<الْمُتَكَلِّم>> ! <<الْمُخَاطَب>> ! <<الْغَائِب>> |- ! rowspan="2" | <<الْمَاضِي>> ! class="secondary" | المذكر | rowspan="2" | {past_pass_1s} | {past_pass_2ms} | {past_pass_3ms} | rowspan="2" | {past_pass_2d} | {past_pass_3md} | rowspan="2" | {past_pass_1p} | {past_pass_2mp} | {past_pass_3mp} |- ! class="secondary" | المؤنث | {past_pass_2fs} | {past_pass_3fs} | {past_pass_3fd} | {past_pass_2fp} | {past_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَرْفُوع>> ! class="secondary" | المذكر | rowspan="2" | {ind_pass_1s} | {ind_pass_2ms} | {ind_pass_3ms} | rowspan="2" | {ind_pass_2d} | {ind_pass_3md} | rowspan="2" | {ind_pass_1p} | {ind_pass_2mp} | {ind_pass_3mp} |- ! class="secondary" | المؤنث | {ind_pass_2fs} | {ind_pass_3fs} | {ind_pass_3fd} | {ind_pass_2fp} | {ind_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَنْصُوب>> ! class="secondary" | المذكر | rowspan="2" | {sub_pass_1s} | {sub_pass_2ms} | {sub_pass_3ms} | rowspan="2" | {sub_pass_2d} | {sub_pass_3md} | rowspan="2" | {sub_pass_1p} | {sub_pass_2mp} | {sub_pass_3mp} |- ! class="secondary" | المؤنث | {sub_pass_2fs} | {sub_pass_3fs} | {sub_pass_3fd} | {sub_pass_2fp} | {sub_pass_3fp} |- ! rowspan="2" | <<الْمُضَارِع الْمَجْزُوم>> ! class="secondary" | المذكر | rowspan="2" | {juss_pass_1s} | {juss_pass_2ms} | {juss_pass_3ms} | rowspan="2" | {juss_pass_2d} | {juss_pass_3md} | rowspan="2" | {juss_pass_1p} | {juss_pass_2mp} | {juss_pass_3mp} |- ! class="secondary" | المؤنث | {juss_pass_2fs} | {juss_pass_3fs} | {juss_pass_3fd} | {juss_pass_2fp} | {juss_pass_3fp} ]=] end text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end if alternant_multiword_spec.vn then local linked_vns = {} for _, form in ipairs(alternant_multiword_spec.vn) do table.insert(linked_vns, link_term(form.form, "term")) end table.insert(ann_parts, (#linked_vns > 1 and "verbal nouns" or "verbal noun") .. " " .. table.concat(linked_vns, "، ")) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end -- Helper function to get root letters and verb classification for simplified table header -- Returns: root_display (e.g., "ح س ب"), verb_type (e.g., "فعل ثلاثي صحيح سالم") local function get_verb_info(alternant_multiword_spec) local root_display = "" local verb_type = "فعل" local rad1, rad2, rad3, rad4 -- Extract radicals from the base word spec using iut.map_word_specs -- This accesses the radicals directly from the parsed verb specification iut.map_word_specs(alternant_multiword_spec, function(base) -- Get radicals from the first conjugation vowel spec if base.conj_vowels and #base.conj_vowels > 0 then local vowel_spec = base.conj_vowels[1] -- Extract radicals, handling both table and string types local function extract_radical(rad) if type(rad) == "table" then -- If it's a table, get the first element or the string representation return rad[1] or rget(rad) else return rad end end rad1 = extract_radical(vowel_spec.rad1) rad2 = extract_radical(vowel_spec.rad2) rad3 = extract_radical(vowel_spec.rad3) rad4 = vowel_spec.rad4 and extract_radical(vowel_spec.rad4) end end) -- Get basic/derived classification from morphological pattern local basic_deriv if alternant_multiword_spec.morph_pattern and #alternant_multiword_spec.morph_pattern > 0 then local morph_pattern = alternant_multiword_spec.morph_pattern[1] basic_deriv = MORPHOLOGICAL_PATTERN_TO_BASIC_DERIV[morph_pattern] end -- Format root display with spaces between letters if rad1 and rad2 and rad3 then if rad4 then -- Quadrilateral root_display = rad1 .. " " .. rad2 .. " " .. rad3 .. " " .. rad4 verb_type = "فعل رباعي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv end else -- triliteral root_display = rad1 .. " " .. rad2 .. " " .. rad3 verb_type = "فعل ثلاثي" if basic_deriv then verb_type = verb_type .. " " .. basic_deriv if basic_deriv == "مُجرَّد" then --W: the classification concerns only triliteral basic verbs (الثلاثي المُجرَّد) local classification = export.classify_triliteral_verb(rad1, rad2, rad3) verb_type = verb_type .. " " .. classification end end end end return root_display, verb_type end -- Make simplified conjugation table for ar.wiktionary. Called from export.show(). -- This table shows only past, present indicative, and imperative forms. -- No passive voice, no participles, no verbal nouns. local function make_table_ar(alternant_multiword_spec) local text = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = 'تصريف {title}', --W: |tall= is what puts mw-collapsed on the wrapper. |موسع= drops it. -- (Not `expanded and nil or 'yes'` — in Lua that is always 'yes'.) tall = collapsed_arg(alternant_multiword_spec), palette = 'green', category = 'conjugation', class = 'tr-alongside', -- temp hack to prevent extra line break } } -- Get verb root and classification local root_display, verb_type = get_verb_info(alternant_multiword_spec) -- First row: Root and verb type spanning all columns text = text .. "! colspan=\"2\" | <<الجذر>>: " .. root_display .. "\n" text = text .. "| colspan=\"3\" | <<'''" .. verb_type .. "'''>>\n" text = text .. [=[ |- ! colspan="2" | <<الضمائر>> ! <<الماضي>> ! <<المضارع>> ! <<الأمر>> |- ! rowspan="2" | <<المتكلّم>> | <<أنا>> | {past_1s} | {ind_1s} | |- | <<نحن>> | {past_1p} | {ind_1p} | |- ! rowspan="5" | <<المخاطب>> | <<أنتَ>> | {past_2ms} | {ind_2ms} | {imp_2ms} |- | <<أنتِ>> | {past_2fs} | {ind_2fs} | {imp_2fs} |- | <<أنتما>> | {past_2d} | {ind_2d} | {imp_2d} |- | <<أنتم>> | {past_2mp} | {ind_2mp} | {imp_2mp} |- | <<أنتنّ>> | {past_2fp} | {ind_2fp} | {imp_2fp} |- ! rowspan="6" | <<الغائب>> | <<هو>> | {past_3ms} | {ind_3ms} | |- | <<هي>> | {past_3fs} | {ind_3fs} | |- | <<هما>> | {past_3md} | {ind_3md} | |- | <<هما>> | {past_3fd} | {ind_3fd} | |- | <<هم>> | {past_3mp} | {ind_3mp} | |- | <<هنّ>> | {past_3fp} | {ind_3fp} | ]=] text = text .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom', args = { notes = '{footnote}', } } local forms = alternant_multiword_spec.forms if not alternant_multiword_spec.lemmas then forms.title = "—" else local linked_lemmas = {} for _, form in ipairs(alternant_multiword_spec.lemmas) do --W: Create simple link for lemmas without #Arabic anchor -- table.insert(linked_lemmas, link_term(form.form, "term")) table.insert(linked_lemmas, link_term_simple(form.form)) end forms.title = table.concat(linked_lemmas, "، ") end local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end local annotation = table.concat(ann_parts, "، ") --W: use only arabic morphological pattern in title annotation local morph_patterns = alternant_multiword_spec.morph_pattern if morph_patterns and #morph_patterns > 0 then annotation = table.concat(morph_patterns, "، ") forms.title = forms.title .. " (" .. annotation .. ")" end -- Format the table. text = mark_focus_cells(text, alternant_multiword_spec.focus_slots) local tagged_table = rsub(text, "<<(.-)>>", tag_text) return m_string_utilities.format(tagged_table, forms) end ------------------------------------------------------------------------------- -- Verb classification functions -- ------------------------------------------------------------------------------- --[=[ تصنيف الفعل الثلاثي المُجرَّد حسب نوعه Classify an Arabic triliteral basic verb root based on its three letters. @param r1 الحرف الأول (first root letter - الفاء) @param r2 الحرف الثاني (second root letter - العين) @param r3 الحرف الثالث (third root letter - اللام) @return str: نوع الفعل (verb type classification in Arabic) Examples: classify_triliteral_verb('ك', 'ت', 'ب') --> 'صحيح سالم' classify_triliteral_verb('أ', 'ت', 'ي') --> 'معتل ناقص يائي مهموز الفاء' classify_triliteral_verb('ق', 'ل', 'و') --> 'معتل ناقص واوي' ]=] function export.classify_triliteral_verb(r1, r2, r3) -- تعريف أحرف العلة والهمزة -- الحروف الضعيفة (أحرف العلة): واو وياء فقط local weak_letters = {[W] = true, [Y] = true} -- الهمزة: جميع أشكال الهمزة (ء، أ، إ، ؤ، ئ) local hamza_letters = { [HAMZA] = true, -- ء [HAMZA_ON_ALIF] = true, -- أ [HAMZA_UNDER_ALIF] = true, -- إ [HAMZA_ON_W] = true, -- ؤ [HAMZA_ON_Y] = true -- ئ } -- فحص كل حرف local is_hamza = {hamza_letters[r1] or false, hamza_letters[r2] or false, hamza_letters[r3] or false} local is_weak = {weak_letters[r1] or false, weak_letters[r2] or false, weak_letters[r3] or false} -- عدد أحرف العلة local weak_count = (is_weak[1] and 1 or 0) + (is_weak[2] and 1 or 0) + (is_weak[3] and 1 or 0) -- فحص التضعيف (الحرف الثاني = الثالث) local is_doubled = (r2 == r3) -- ═══════════════════════════════════════════════════════════ -- المُعتل: الفعل الذي يحتوي على حرف أو أكثر من أحرف العلة -- ═══════════════════════════════════════════════════════════ if weak_count > 0 then -- ───────────────────────────────────────────────────── -- لفيف: يحتوي على حرفين أو أكثر من أحرف العلة -- ───────────────────────────────────────────────────── if weak_count >= 2 then -- مقرون: حرفا العلة متجاوران if is_weak[2] and is_weak[3] then -- الثاني والثالث if is_hamza[1] then return "معتل لفيف مقرون مهموز الفاء" end return "معتل لفيف مقرون" elseif is_weak[1] and is_weak[2] then -- الأول والثاني return "معتل لفيف مقرون" -- مفروق: الأول والثالث حرفا علة elseif is_weak[1] and is_weak[3] then if is_hamza[2] then return "معتل لفيف مفروق مهموز العين" end return "معتل لفيف مفروق" end -- ───────────────────────────────────────────────────── -- مثال: الحرف الأول حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[1] then if r1 == W then -- واوي if is_hamza[3] then return "معتل مثال واوي مهموز اللام" elseif is_doubled then return "معتل مثال واوي مُضعَّف" elseif is_hamza[2] then return "معتل مثال واوي مهموز العين" end return "معتل مثال واوي" else -- يائي (ي) if is_doubled then return "معتل مثال يائي مُضعَّف" elseif is_hamza[2] then return "معتل مثال يائي مهموز العين" end return "معتل مثال يائي" end -- ───────────────────────────────────────────────────── -- أجوف: الحرف الثاني حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[2] then if r2 == W then -- واوي if is_hamza[3] then return "معتل أجوف واوي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف واوي مهموز الفاء" end return "معتل أجوف واوي" else -- يائي (ي) if is_hamza[3] then return "معتل أجوف يائي مهموز اللام" elseif is_hamza[1] then return "معتل أجوف يائي مهموز الفاء" end return "معتل أجوف يائي" end -- ───────────────────────────────────────────────────── -- ناقص: الحرف الثالث حرف علة -- ───────────────────────────────────────────────────── elseif is_weak[3] then if r3 == W then -- واوي if is_hamza[1] then return "معتل ناقص واوي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص واوي مهموز العين" end return "معتل ناقص واوي" else -- يائي (ي) if is_hamza[1] then return "معتل ناقص يائي مهموز الفاء" elseif is_hamza[2] then return "معتل ناقص يائي مهموز العين" end return "معتل ناقص يائي" end end -- ═══════════════════════════════════════════════════════════ -- الصحيح: الفعل الذي لا يحتوي على أحرف العلة -- ═══════════════════════════════════════════════════════════ else -- ───────────────────────────────────────────────────── -- مهموز: يحتوي على همزة -- ───────────────────────────────────────────────────── if is_hamza[1] or is_hamza[2] or is_hamza[3] then -- مهموز الفاء واللام: الأول والثالث همزة if is_hamza[1] and is_hamza[3] then return "صحيح مهموز الفاء واللام" -- مهموز الفاء elseif is_hamza[1] then if is_doubled then return "صحيح مُضعَّف مهموز الفاء" end return "صحيح مهموز الفاء" -- مهموز العين elseif is_hamza[2] then return "صحيح مهموز العين" -- مهموز اللام elseif is_hamza[3] then return "صحيح مهموز اللام" end -- ───────────────────────────────────────────────────── -- مُضعَّف: الحرف الثاني = الثالث -- ───────────────────────────────────────────────────── elseif is_doubled then return "صحيح مُضعَّف" -- ───────────────────────────────────────────────────── -- سالم: لا همزة، لا حرف علة، لا تضعيف -- ───────────────────────────────────────────────────── else return "صحيح سالم" end end return "غير معروف" end ------------------------------------------------------------------------------- -- External entry points -- ------------------------------------------------------------------------------- --W: Normalize root to use underscores as separators -- Accepts: "كتب", "ك_ت_ب", or "ك ت ب" -- Returns: "ك_ت_ب" local function normalize_root(root) if not root then return nil end -- Helper function to normalize a single character/radical local function normalize_char(char) -- Convert all hamza variants to canonical bare hamza if char == HAMZA_ON_ALIF or char == HAMZA_UNDER_ALIF or char == HAMZA_ON_W or char == HAMZA_ON_Y then return HAMZA -- Convert alif maqṣūra to yaa (ى → ي) elseif char == AMAQ then return Y -- Reject alif - it's not a root radical elseif char == ALIF then error("Root contains alif (ا) which is not a valid root radical. For weak verbs, use و (waw) or ي (yaa) instead.") end return char end -- Convert alif madda to hamza + alif for processing (will be caught as error below) root = root:gsub(AMAD, HAMZA .. ALIF) -- Replace spaces with underscores root = root:gsub(" ", "_") -- If no underscores yet, insert them between each character if not root:find("_") then -- Extract only Arabic letters (excluding diacritics) -- Arabic letter range: U+0621 to U+064A (basic letters) local chars = {} for char in mw.ustring.gmatch(root, "[ء-ي]") do table.insert(chars, normalize_char(char)) end root = table.concat(chars, "_") else -- Root already has underscores (e.g., "أ_م_ن"), normalize each radical local parts = mw.text.split(root, "_") for i, part in ipairs(parts) do parts[i] = normalize_char(part) end root = table.concat(parts, "_") end return root end --W: Construct the [1] parameter from root (جذر) and morphological pattern (وزن) -- Example: -- input: root="كتب", pattern="فعَل يفعُل" -- output: "ك_ت_ب<I/a~u>" -- `force_full_passive`, if true, appends ".pass" so the verb gets a full personal -- passive paradigm instead of the module's default impersonal-passive guess for -- vforms like I (past vowel i), V, VI, X and IIq (see |مبني للمجهول= on {{ar-conj}}). -- `reduced`, if true, appends ".reduced" so forms V/VI use the assimilated تاء -- التفعّل prefix (اِسَّمَّعَ) instead of the default تَ- prefix (تَسَمَّعَ) -- see -- |مدغم= on {{ar-conj}}. Not every root with an assimilable first radical is -- necessarily attested with the assimilated form, so this isn't inferred automatically -- from the root; it must be requested. local function construct_verb_spec(root, pattern, force_full_passive, reduced) if not root or not pattern then return nil end local normalized_root = normalize_root(root) local form_code = MORPHOLOGICAL_PATTERN_TO_FORM[pattern] if not form_code then error("Unknown morphological pattern (وزن صرفي): " .. pattern) end if force_full_passive then form_code = form_code .. ".pass" end if reduced then form_code = form_code .. ".reduced" end return normalized_root .. "<" .. form_code .. ">" end -- Wrapper function that accepts جذر (root) and وزن (pattern) as parameters -- Returns: verb_type (e.g., "فعل ثلاثي مُجرَّد صحيح سالم") -- Example: export.get_verb_type({["جذر"] = "كتب", ["وزن"] = "فعَل يفعُل"}) function export.get_verb_type(args) local verb_spec if args["جذر"] and args["وزن"] then verb_spec = construct_verb_spec(args["جذر"], args["وزن"]) elseif args[1] then verb_spec = args[1] else error("Must provide either جذر and وزن, or a verb specification in args[1]") end local alternant_multiword_spec = export.do_generate_forms({[1] = verb_spec}) local _, verb_type = get_verb_info(alternant_multiword_spec) return verb_type end -- Append two lists `l1` and `l2`, removing duplicates. If either is {nil}, just return the other. local function combine_lists(l1, l2) -- combine_footnotes() does exactly what we want. return iut.combine_footnotes(l1, l2) end local function combine_metadata(data) local src1 = data.form1 local src2 = data.form2 local dest = data.dest_form dest.uncertain = src1.uncertain or src2.uncertain if src1.genders and src2.genders and not m_table.deepEquals(src1.genders, src2.genders) then -- do nothing else dest.genders = src1.genders or src2.genders end if src1.pos and src2.pos and src1.pos ~= src2.pos then -- do nothing else dest.pos = src1.pos or src2.pos end -- Don't copy .alt, .gloss, .lit, .id, which describe a single term and don't extend to multiword terms. dest.q = combine_lists(src1.q, src2.q) dest.qq = combine_lists(src1.qq, src2.qq) dest.l = combine_lists(src1.l, src2.l) dest.ll = combine_lists(src1.ll, src2.ll) end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, source_template, headword_head) local PAGENAME = mw.loadData("Module:headword/data").pagename local function in_template_space() local nsText = mw.title.getCurrentTitle().nsText return nsText == "Template" or nsText == "قالب" end -- Determine the verb spec we're being asked to generate the conjugation of. This may be taken from the current page -- title or the value of |pagename=; but not when called from {{ar-verb form}}, where the page title is a -- non-lemma form. Note that the verb spec may omit the lemma; e.g. it may be "<II>". For this reason, we use the -- value of `pagename` computed here down below, when calling normalize_all_lemmas(). local pagename = source_template ~= "ar-verb form" and args.pagename or PAGENAME local head = headword_head or pagename --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local arg1 = args[1] if not arg1 then if (pagename == "ar-conj" or pagename == "ar-verb" or pagename == "ar-verb form" or pagename == "تصريف") and in_template_space() then arg1 = "كتب<I/a~u.pass>" else arg1 = "<>" end end -- When called from {{ar-verb form}}, determine the non-lemma form whose inflections we're being asked to -- determine. This normally comes from the page title or the value of |pagename=. local verb_form_of_form if source_template == "ar-verb form" then verb_form_of_form = args.pagename if not verb_form_of_form then if PAGENAME == "ar-verb form" and in_template_space() then verb_form_of_form = "كتبت" else verb_form_of_form = PAGENAME end end end local incorporated_headword_head_into_lemma = false if arg1:find("^<.*>$") then -- missing lemma if head:find(" ") then -- If multiword lemma, try to add arg spec after the first word. -- Try to preserve the brackets in the part after the verb, but don't do it -- if there aren't the same number of left and right brackets in the verb -- (which means the verb was linked as part of a larger expression). local first_word, post = rmatch(head, "^(.-)( .*)$") local left_brackets = rsub(first_word, "[^%[]", "") local right_brackets = rsub(first_word, "[^%]]", "") if #left_brackets == #right_brackets then arg1 = iut.remove_redundant_links(first_word) .. arg1 .. post incorporated_headword_head_into_lemma = true else -- Try again using the form without links. local linkless_head = m_links.remove_links(head) if linkless_head:find(" ") then first_word, post = rmatch(linkless_head, "^(.-)( .*)$") arg1 = first_word .. arg1 .. post else error("Unable to incorporate <...> spec into explicit head due to a multiword linked verb or " .. "unbalanced brackets; please include <> explicitly: " .. arg1) end end else -- Will be incorporated through `head` below in the call to normalize_all_lemmas(). incorporated_headword_head_into_lemma = true end end local parse_props = { parse_indicator_spec = parse_indicator_spec, angle_brackets_omittable = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template alternant_multiword_spec.verb_form_of_form = verb_form_of_form alternant_multiword_spec.incorporated_headword_head_into_lemma = incorporated_headword_head_into_lemma normalize_all_lemmas(alternant_multiword_spec, head) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { lang = lang, slot_list = alternant_multiword_spec.verb_slots, inflect_word_spec = conjugate_verb, combine_metadata = combine_metadata, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) if debug_translit then for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do if form.translit then local full_form_translit = (lang:transliterate(m_links.remove_links(form.form))) if full_form_translit ~= form.translit then error(("Internal error: For slot '%s', form '%s' incremental translit '%s' not same as full translit '%s'"): format(slot, form.form, form.translit, full_form_translit)) end end form.form = iut.remove_redundant_links(form.form) end end end -- Remove redundant brackets around entire forms. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = iut.remove_redundant_links(form.form) end end -- Apply NFC-style normalization: reorder shadda+vowel to vowel+shadda -- to match MediaWiki's automatic NFC normalization (which is applied on enwiktionary -- but not in local Lua environments). This reverses the postprocessing step. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = apply_nfc_shadda(form.form) end end determine_slot_uncertainty_from_forms(alternant_multiword_spec) determine_verb_properties_from_forms(alternant_multiword_spec) compute_categories_and_annotation(alternant_multiword_spec) if args.json and source_template == "ar-conj" then -- There is a circular reference in `base.alternant_multiword_spec`, which points back to top level. iut.map_word_specs(alternant_multiword_spec, function(base) base.alternant_multiword_spec = nil end) return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{ar-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent() and frame:getParent().args or frame.args --W local params = { [1] = {}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["t"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["id"] = {}, -- for use by {{ar-verb form}}; otherwise ignored ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use --W: additional parameters for ar.wiktionary.org ["جذر"] = {type = "string"}, --W: الجذر اللغوي, root ["وزن"] = {type = "string"}, --W: الوزن الصرفي, morphological pattern ["مبني للمجهول"] = {type = "boolean"}, --W: force a full personal passive paradigm, -- overriding the default impersonal-passive guess for vforms like I (past vowel -- i), V, VI, X and IIq ["مدغم"] = {type = "boolean"}, --W: for forms V/VI, assimilate the تاء التفعّل prefix -- into the first radical (اِسَّمَّعَ instead of تَسَمَّعَ) ["كامل"] = {type = "boolean"}, --W: show full table (default is simplified table) ["بؤرة"] = {type = "string"}, --W: highlight the cells holding this form ["موسع"] = {type = "boolean"}, --W: show the table expanded (default: collapsed) } local args = require("Module:parameters").process(parent_args, params) --W: If both root (جذر) and morphological pattern (وزن) are provided, construct [1] if args["جذر"] and args["جذر"] ~= "" and args["وزن"] and args["وزن"] ~= "" then local constructed = construct_verb_spec(args["جذر"], args["وزن"], args["مبني للمجهول"], args["مدغم"]) if constructed and constructed ~= "" then args[1] = constructed end end local alternant_multiword_spec = export.do_generate_forms(args, "ar-conj") if type(alternant_multiword_spec) == "string" then -- JSON return value return alternant_multiword_spec end --W: |بؤرة= marks the cells holding a given form, so that a conjugated-form -- page ([[Module:ar-verb-form]]) can show the reader where in the paradigm -- the word they looked up actually sits. The slots have to be found before -- show_forms(), which replaces each form list with rendered wikitext. alternant_multiword_spec.focus_slots = find_focus_slots(alternant_multiword_spec, args["بؤرة"]) --W: A table whose one relevant cell is highlighted is no use folded away, so -- [[Module:ar-verb-form]] asks for it open. Lemma pages keep it collapsed. alternant_multiword_spec.expanded = args["موسع"] or false show_forms(alternant_multiword_spec) --W: Choose table type: simplified (default) or full (comprehensive) local table_html if args["كامل"] then table_html = make_table(alternant_multiword_spec) else table_html = make_table_ar(alternant_multiword_spec) end --W: don't add categories --W: TODO: all lines with insert_cat() are to be removed. -- return table_html .. -- require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang, nil, nil, force_cat) return table_html end function export.verb_forms(frame) local parargs = frame:getParent().args local params = { [1] = {}, [2] = {}, [3] = {}, [4] = {}, [5] = {}, pagename = {}, } for _, form in ipairs(allowed_vforms) do -- FIXME: We go up to 5 here. The code supports unlimited variants but it's unlikely we will ever see more than -- 2. for index = 1, 5 do local prefix = index == 1 and form or form .. index params[prefix .. "-pv"] = {} for _, extn in ipairs { "", "-vn", "-ap", "-pp" } do params[prefix .. extn] = {} params[prefix .. extn .. "-head"] = {} -- FIXME: No -tr? params[prefix .. extn .. "-gloss"] = {} end end end local args = require("Module:parameters").process(parargs, params) local i = 1 local past_vowel_re = "^[aui,]*$" local combined_root = nil if not args[i] or rfind(args[i], past_vowel_re) then combined_root = args.pagename or mw.loadData("Module:headword/data").pagename if not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ])$") and not rfind(combined_root, "^([^ ]) ([^ ]) ([^ ]) ([^ ])$") then error("When inferring roots from page title, need three or four space-separated radicals: " .. combined_root) end elseif rfind(args[i], " ") then combined_root = args[i] i = i + 1 else local separate_roots = {} while args[i] and not rfind(args[i], past_vowel_re) do table.insert(separate_roots, args[i]) i = i + 1 end combined_root = table.concat(separate_roots, " ") end local past_vowel = args[i] i = i + 1 if past_vowel and not rfind(past_vowel, past_vowel_re) then error("Unrecognized past vowel, should be 'a', 'i', 'u', 'a,u', etc. or empty: " .. past_vowel) end -- Spaces interfere with parsing as a unit in [[Module:inflection utilities]], so replace with underscore. combined_root = combined_root:gsub(" ", "_") local split_root = rsplit(combined_root, "_") -- Map from verb forms (I, II, etc.) to a table of verb properties, -- which has entries e.g. for "verb" (either true to autogenerate the verb -- head, or an explicitly specified verb head using e.g. argument "I-head"), -- and for "verb-gloss" (which comes from e.g. the argument "I" or "I-gloss"), -- and for "vn" and "vn-gloss", "ap" and "ap-gloss", "pp" and "pp-gloss". local verb_properties = {} for _, form in ipairs(allowed_vforms) do local formpropslist = {} local derivs = {{"verb", ""}, {"vn", "-vn"}, {"ap", "-ap"}, {"pp", "-pp"}} local index = 1 while true do local formprops = {} local prefix = index == 1 and form or form .. index if prefix == "I" then formprops.pv = past_vowel end if args[prefix .. "-pv"] then formprops.pv = args[prefix .. "-pv"] end for _, deriv in ipairs(derivs) do local prop = deriv[1] local extn = deriv[2] if args[prefix .. extn] == "+" then formprops[prop] = true elseif args[prefix .. extn] == "-" then formprops[prop] = false elseif args[prefix .. extn] then formprops[prop] = true formprops[prop .. "-gloss"] = args[prefix .. extn] end if args[prefix .. extn .. "-head"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop] = args[prefix .. extn .. "-head"] end if args[prefix .. extn .. "-gloss"] then if formprops[prop] == nil then formprops[prop] = true end formprops[prop .. "-gloss"] = args[prefix .. extn .. "-gloss"] end end if formprops.verb then -- If a verb form specified, also turn on vn (unless form I, with -- unpredictable vn) and ap, and maybe pp, according to form, -- weakness and past vowel. But don't turn these on if there's -- an explicit on/off specification for them (e.g. I-pp=-). if form ~= "I" and formprops.vn == nil then formprops.vn = true end if formprops.ap == nil then formprops.ap = true end local weakness = weakness_from_radicals(form, split_root[1], split_root[2], split_root[3], split_root[4]) if formprops.pp == nil and not vform_probably_no_passive(form, weakness, rsplit(formprops.pv or "", ","), {}) then formprops.pp = true end if formprops.verb == true or formprops.vn == true or formprops.ap == true or formprops.pp == true then formprops.need_autogen = true end table.insert(formpropslist, formprops) index = index + 1 else break end end table.insert(verb_properties, {form, formpropslist}) end -- Go through and create the verb form derivations as necessary, when they haven't been explicitly given. for _, vplist in ipairs(verb_properties) do local vform = vplist[1] for _, props in ipairs(vplist[2]) do if props.need_autogen then local form_with_vowels if vform == "I" then local pv = props.pv if not pv then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak form_with_vowels = "I/a~u" elseif split_root[3] == Y then form_with_vowels = "I/a~i" elseif split_root[2] == W then --hollow form_with_vowels = "I/u~u" elseif split_root[2] == Y then form_with_vowels = "I/i~i" else -- most common; doesn't matter so much since we're not displaying the non-past form_with_vowels = "I/a~u" end else local pvs = rsplit(pv, ",") local vowel_sufs = {} for _, pv in ipairs(pvs) do local vowel_spec if pv == "a" then -- Make up likely past vowels based on weakness and actual radical. if split_root[3] == W then -- final-weak vowel_spec = "a~u" elseif split_root[3] == Y then vowel_spec = "a~i" elseif split_root[2] == W then --hollow vowel_spec = "a~u" elseif split_root[2] == Y then vowel_spec = "a~i" else -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "a~u" end elseif pv == "i" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "i~a" elseif pv == "u" then -- most common; doesn't matter so much since we're not displaying the non-past vowel_spec = "u~u" else error(("Internal error: Bad past vowel '%s' in {{ar-verb forms}}"):format(pv)) end table.insert(vowel_sufs, vowel_spec) end form_with_vowels = "I/" .. table.concat(vowel_sufs, "/") end else form_with_vowels = vform end local angle_bracket_spec = ("%s<%s.pass>"):format(combined_root, form_with_vowels) local alternant_multiword_spec = export.do_generate_forms({angle_bracket_spec}, "ar-verb forms") local function format_forms(forms) if not forms then return "-" -- FIXME: Throw an error? end local formatted = {} for _, form in ipairs(forms) do if form.translit then table.insert(formatted, ("%s//%s"):format(form.form, form.translit)) else table.insert(formatted, form.form) end end return table.concat(formatted, "،") end if props.verb == true then props.verb = format_forms(alternant_multiword_spec.forms.past_3ms) end for _, deriv in ipairs({"vn", "ap", "pp"}) do if props[deriv] == true then props[deriv] = format_forms(alternant_multiword_spec.forms[deriv]) end end end end end -- Go through and output the result local formtextarr = {} for _, vplist in ipairs(verb_properties) do local form = vplist[1] for _, props in ipairs(vplist[2]) do local textarr = {} if props.verb then local text = "* '''[[Appendix:Arabic verbs#Form " .. form .. "|Form " .. form .. "]]''': " local linktext = {} local splitheads = rsplit(props.verb, "[,،]") for _, head in ipairs(splitheads) do table.insert(linktext, m_links.full_link({lang = lang, term = head, gloss = props["verb-gloss"]})) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) for _, derivengl in ipairs({{"vn", "Verbal noun"}, {"ap", "Active participle"}, {"pp", "Passive participle"}}) do local deriv = derivengl[1] local engl = derivengl[2] if props[deriv] then local text = "** " .. engl .. ": " local linktext = {} local splitheads = rsplit(props[deriv], "[,،]") for _, head in ipairs(splitheads) do local ar, translit = head:match("^(.*)//(.-)$") if not ar then ar = head end table.insert(linktext, m_links.full_link {lang = lang, term = ar, tr = translit, gloss = props[deriv .. "-gloss"]} ) end text = text .. table.concat(linktext, "، ") table.insert(textarr, text) end end table.insert(formtextarr, table.concat(textarr, "\n")) end end end return table.concat(formtextarr, "\n") end -- Infer radicals from lemma headword (i.e. 3rd masculine singular past) and verb form (I, II, etc.). Throw an error if -- headword is malformed. A given returned radical may be actually be a list of possible radicals, where the first one -- should be used if the user didn't explicitly give the radical. If the list contains a field `ambig = true`, the -- radical is considered ambiguous and should not be categorized. `is_reduced` indicates that the user specified -- `.reduced` to indicate that the verb form is reduced by assimilation and/or haplology (typically archaic Koranic -- forms such as اِدَّارَأَ instead of تَدَارَأَ; or اِسْطَاعَ instead of اِسْتِطَاعَ; etc. function export.infer_radicals(data) local headword, vform, passive, past_vowel, nonpast_vowel, is_reduced = data.headword, data.vform, data.passive, data.past_vowel, data.nonpast_vowel, data.is_reduced past_vowel = past_vowel or "-" nonpast_vowel = nonpast_vowel or "-" local function verify_vowel(vowel, param) --W: A past/non-past vowel may legitimately be a form object {form=..., footnotes=...} -- when the user attaches a footnote, e.g. <I/a[نادر]~u>, so compare the formval. -- Comparing the raw value crashed on Lua 5.1 ("bad argument #2 to 'format'"). local formval = rget(vowel) if formval ~= A and formval ~= I and formval ~= U and formval ~= "-" then error(("Internal error: Bad value for %s: %s (should be Arabic diacritic vowel or '-')"):format( param, dump(vowel))) end end verify_vowel(past_vowel, "past_vowel") verify_vowel(nonpast_vowel, "nonpast_vowel") local ch = {} local form_viii_assim, variant -- sub out alif-madda for easier processing headword = rsub(headword, AMAD, HAMZA .. ALIF) local function infer_err(msg, noann) local anns = {} local nohead, novform if noann == "nohead" then nohead = true elseif noann == "novform" then novform = true elseif noann == "nohead-vform" then nohead = true novform = true elseif noann then error(("Internal error: Unrecognized value for 'noann': %s"):format(dump(noann))) end if not nohead then table.insert(anns, ("headword=%s"):format(data.headword)) end if not novform then table.insert(anns, ("verb form=%s"):format(data.vform)) end anns = table.concat(anns, "، ") if anns ~= "" then anns = ": " .. anns end error(msg .. anns) end local len = ulen(headword) local expected_length -- extract the headword letters into an array for i = 1, len do table.insert(ch, usub(headword, i, i)) end -- check that the letter at the given index is the given string, or -- is one of the members of the given array local function check(index, must) local letter = ch[index] if type(must) == "string" then if not letter then infer_err("Letter " .. index .. " is nil") end if letter ~= must then infer_err(("For verb form %s, letter %s must be %s, not %s"):format(vform, index, must, letter), "novform") end elseif not m_table.contains(must, letter) then infer_err("For verb form " .. vform .. ", radical " .. index .. " must be one of " .. table.concat(must, " ") .. ", not " .. letter, "novform") end end -- Check that length of headword is within [min, max] local function check_len(min, max) if min and len < min then infer_err(("Not enough letters for verb form %s, expected at least %s"):format(vform, min), "novform") end if max and len > max then infer_err(("Too many letters for verb form %s, expected at most %s"):format(vform, max), "novform") end end -- A form I verb beginning with w- keeps the w in the non-past unless the non-past vowel is a kasra or a -- lowered kasra; see form_i_w_assimilated(), which the radicals path uses too. This used to be spelt out -- here as "i~a or u~u", which missed a~u (وَجَلَ يَوْجُلُ). local function form_I_w_non_assimilated() return not form_i_w_assimilated(past_vowel, nonpast_vowel) end -- Convert radicals to canonical form (handle various hamza varieties and check for misplaced alif or alif maqṣūra; -- legitimate cases of these letters are handled above). local function convert(rad, index) if type(rad) == "table" then for i, r in ipairs(rad) do rad[i] = convert(r, index) end return rad elseif rad == HAMZA_ON_ALIF or rad == HAMZA_UNDER_ALIF or rad == HAMZA_ON_W or rad == HAMZA_ON_Y then return HAMZA elseif rad == AMAQ then infer_err("Radical " .. index .. " must not be alif maqṣūra") elseif rad == ALIF then infer_err("Radical " .. index .. " must not be alif") else return rad end end local quadlit = vform:find("q$") -- find first radical, start of second/third radicals, check for -- required letters local radstart, rad1, rad2, rad3, rad4 local weakness if vform == "I" or vform == "II" then rad1 = ch[1] radstart = 2 elseif vform == "III" then rad1 = ch[1] check(2, {ALIF, W}) -- W occurs in passive-only verbs radstart = 3 elseif vform == "IV" then -- this would be alif-madda but we replaced it with hamza-alif above. if ch[1] == HAMZA and ch[2] == ALIF then rad1 = HAMZA else check(1, HAMZA_ON_ALIF) rad1 = ch[2] end radstart = 3 elseif vform == "V" then check(1, is_reduced and ALIF or T) rad1 = ch[2] radstart = 3 elseif vform == "VI" then check(1, is_reduced and ALIF or T) if ch[2] == AMAD then rad1 = HAMZA radstart = 3 else rad1 = ch[2] check(3, {ALIF, W}) -- W occurs in passive-only verbs radstart = 4 end elseif vform == "VII" then check(1, ALIF) if is_reduced then check(2, M) rad1 = M radstart = 3 else check(2, N) rad1 = ch[3] radstart = 4 end elseif vform == "VIII" then check(1, ALIF) rad1 = ch[2] if rad1 == "د" then rad1 = {"د", "ذ"} -- not considered ambiguous since it's usually د radstart = 3 form_viii_assim = "دّ" elseif rad1 == "ظ" and ch[3] == "ط" and len >= 5 then -- [[اظطلم]], variant of [[اظلم]] radstart = 4 form_viii_assim = "ظْط" elseif rad1 == "ذ" and ch[3] == "د" and len >= 5 then -- [[اذدكر]], variant of [[اذكر]] radstart = 4 form_viii_assim = "ذْد" elseif rad1 == T or rad1 == "ث" or rad1 == "ذ" or rad1 == "ط" or rad1 == "ظ" then radstart = 3 form_viii_assim = rad1 .. SH elseif rad1 == "ز" then check(3, "د") radstart = 4 form_viii_assim = "زْد" elseif rad1 == "ص" or rad1 == "ض" then check(3, "ط") radstart = 4 form_viii_assim = rad1 .. SK .. "ط" else check(3, T) radstart = 4 rad1 = convert(rad1, 1) form_viii_assim = rad1 .. SK .. "ت" end if rad1 == T then -- Radical is ambiguous, might be ت or و or ي but doesn't affect conjugation. Note that there are no -- form-VIII verbs with initial radical ي given in Hans Wehr but Lane mentions at least: -- - (page 2973) اِتَّأَسَ, with assimilation of the ي to ت, from root ي ء س; -- - (page 2975) اِتَّبَسَ non-past يَتَّبِسُ and alternative اِيتَبَسَ non-past يَاتَبِسُ from the root ي ب س; -- - (page 2976) اِتَّسَرَ non-past يَتَّسِرُ or alternatively يَأْتَسِرُ with hamza preserved from the root ي س ر. -- These alternative forms seem very rare and probably not worth worrying about, but if we want to handle -- them, we can do it when the time comes. rad1 = {T, W, Y, ambig = true} -- اِتَّخَذَ irregularly has hamza as the radical but assimilates like و if ch[3] == "خ" and ch[4] == "ذ" then rad1[4] = HAMZA end end elseif vform == "IX" then check(1, ALIF) rad1 = ch[2] radstart = 3 elseif vform == "X" then check(1, ALIF) check(2, S) if is_reduced then rad1 = ch[3] radstart = 4 else check(3, T) rad1 = ch[4] radstart = 5 end elseif vform == "Iq" then rad1 = ch[1] rad2 = ch[2] radstart = 3 elseif vform == "IIq" then check(1, T) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "IIIq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) radstart = 5 elseif vform == "IVq" then check(1, ALIF) rad1 = ch[2] rad2 = ch[3] radstart = 4 elseif vform == "XI" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, ALIF) rad3 = ch[5] weakness = "sound" elseif vform == "XII" then check(1, ALIF) rad1 = ch[2] if ch[3] ~= ch[5] then infer_err("For verb form XII, letters 3 and 5 should be the same", "novform") end check(4, W) radstart = 5 elseif vform == "XIII" then check_len(5, 5) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, W) rad3 = ch[5] if rad3 == AMAQ then weakness = "final-weak" else weakness = "sound" end elseif vform == "XIV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if ch[6] == AMAQ then check_waw_ya(rad3) weakness = "final-weak" else if ch[5] ~= ch[6] then infer_err("For verb form XIV, letters 5 and 6 should be the same", "novform") end weakness = "sound" end elseif vform == "XV" then check_len(6, 6) check(1, ALIF) rad1 = ch[2] rad2 = ch[3] check(4, N) rad3 = ch[5] if rad3 == Y then check(6, ALIF) else check(6, AMAQ) end weakness = "sound" else error("Internal error: Unrecognized verb form " .. vform) end -- Process the last two radicals. RADSTART is the index of the first of the two. If it's nil then all radicals have -- already been processed above, and we don't do anything. if radstart then -- There must (normally) be one or two letters left. if len == radstart then if vform == "I" and ch[len] == Y then -- short form حَيَّ weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" elseif vform == "IV" and rad1 == "ر" and ch[len] == AMAQ then -- irregular verb أَرَى weakness = "final-weak" rad2 = HAMZA rad3 = Y elseif vform == "X" and rad1 == "ح" and ch[len] == AMAQ then -- irregular verb اِسْتَحَى weakness = "final-weak" rad2 = Y rad3 = Y variant = "short" else -- If one letter left, then it's a geminate verb. If the letter is alif or alif maqṣūra, it will trigger -- an error down the line. if vform_supports_geminate(vform) then weakness = "geminate" rad2 = ch[len] rad3 = ch[len] if vform == "III" or vform == "VI" then variant = "short" end else infer_err("Apparent geminate verb, but geminate verbs not allowed for this verb form") end end elseif quadlit then -- Process last two radicals of a quadriliteral verb form. rad3 = ch[radstart] rad4 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if rad4 == AMAQ or rad4 == ALIF and rad3 == Y or rad4 == Y then -- rad4 can be Y in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws in a row); it could be wāw or -- yāʾ, but doesn't affect the conjugation. rad4 = rad3 == W and {Y, W, ambig = true} or {W, Y, ambig = true} else infer_err("Last radical is " .. rad4 .. " but verb form " .. vform .. " doesn't support final-weak verbs", "novform") end else weakness = "sound" end else -- Process last two radicals of a triliteral verb form. rad2 = ch[radstart] rad3 = ch[radstart + 1] expected_length = radstart + 1 check_len(expected_length) if vform == "I" and (is_waw_ya(rad3) or rad3 == ALIF or rad3 == AMAQ) then local inferred_past_vowel, inferred_nonpast_vowel -- Check for final-weak form I verb. It can end in tall alif (rad3 = wāw) or alif maqṣūra (rad3 = yāʾ) -- or a wāw or yāʾ (with a past vowel of i or u, e.g. nasiya/yansā "forget" or with a passive-only -- verb). if rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated+final-weak" else weakness = "final-weak" end if rad3 == ALIF then rad3 = W inferred_past_vowel = A inferred_nonpast_vowel = U if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not tall alif (ا)", "novform") end elseif rad3 == AMAQ then rad3 = Y inferred_past_vowel = A inferred_nonpast_vowel = I if is_passive_only(passive) then infer_err("Final-weak form-I passive verbs should end in yāʔ (ي), not alif maqṣūra (ى)", "novform") end elseif rad1 == "ح" and rad2 == Y and rad3 == Y then -- Long variant حَيِيَ. inferred_past_vowel = I inferred_nonpast_vowel = A variant = "long" else if not is_passive_only(passive) then -- does a non-passive final-weak verb in -uwa ever happen? (YES: e.g. [[رجو]] "to be slack") inferred_past_vowel = rad3 == Y and I or U inferred_nonpast_vowel = A end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} -- ambiguous end if inferred_past_vowel then local raw_past_vowel = rget(past_vowel) local raw_nonpast_vowel = rget(nonpast_vowel) if raw_past_vowel ~= "-" then if raw_past_vowel ~= inferred_past_vowel then infer_err(("Final-weak form-I verb inferred past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_past_vowel], undia[raw_past_vowel]), "novform") else -- in case of footnote in past_vowel inferred_past_vowel = past_vowel end end if raw_nonpast_vowel ~= "-" and raw_nonpast_vowel ~= A and inferred_nonpast_vowel == U then -- if inferred as I or A, the reality can be the reverse; form-I final-weak verbs with a~a and -- i~i exist, e.g. سَعَى/يَسْعَى, وَلِيَ/يَلِي. Weird verb [[صها]] (also written [[صهى]]) has non-past -- يصهى so we can't throw an error in this situation. if raw_nonpast_vowel ~= inferred_nonpast_vowel then infer_err(("Final-weak form-I verb inferred non-past vowel %s, which disagrees with " .. "explicitly specified %s"):format(undia[inferred_nonpast_vowel], undia[raw_nonpast_vowel]), "novform") else -- in case of footnote in nonpast_vowel inferred_nonpast_vowel = nonpast_vowel end end end if not is_passive_only(passive) then if rget(past_vowel) == "-" then past_vowel = inferred_past_vowel end if rget(nonpast_vowel) == "-" then nonpast_vowel = inferred_nonpast_vowel end end elseif vform == "IX" and is_waw_ya(rad3) and len == radstart + 2 and ch[len] == AMAQ then -- Final-weak form IX verbs like اِرْعَوَى "to desist, to repent, to see the light". weakness = "final-weak" expected_length = radstart + 2 elseif vform == "X" and rad1 == "ح" and rad2 == Y and rad3 == ALIF then -- Long variant اِسْتَحْيَا. weakness = "final-weak" rad3 = Y variant = "long" elseif rad3 == AMAQ or rad2 == Y and rad3 == ALIF or rad3 == Y then -- rad3 == Y happens in passive-only verbs. if vform_supports_final_weak(vform) then weakness = "final-weak" else infer_err("Last radical is " .. rad3 .. " but verb form doesn't support final-weak verbs") end -- Ambiguous radical; randomly pick wāw as radical (but avoid two wāws); it could be wāw or yāʾ, but -- doesn't affect the conjugation. rad3 = (rad1 == W or rad2 == W) and {Y, W, ambig = true} or {W, Y, ambig = true} elseif rad2 == ALIF then if vform_supports_hollow(vform) then weakness = "hollow" local function set_past_to_a() if req(past_vowel, A) then -- already set elseif req(past_vowel, "-") or req(past_vowel, rget(nonpast_vowel)) then past_vowel = A else infer_err(("Form I hollow verb with nonpast vowel set to '%s' must have past vowel set to 'a' or the same value, not %s"): format(undia[rget(nonpast_vowel)], undia[rget(past_vowel)]), "novform") end end if vform == "I" and req(nonpast_vowel, U) then rad2 = W set_past_to_a() elseif vform == "I" and req(nonpast_vowel, I) then rad2 = Y set_past_to_a() else if req(nonpast_vowel, A) and not req(past_vowel, I) then infer_err(("Form I hollow verb with nonpast vowel set to 'a' must have past vowel set to 'i', not %s"): format(undia[rget(past_vowel)]), "novform") end -- Ambiguous radical; could be wāw or yāʾ; if verb form I, it's critical to get this right, and -- the caller checks for this situation and throws an error if non-past vowel is "a" and second -- radical isn't explicitly given. rad2 = {W, Y, ambig = true, need_radical = true} end else infer_err("Second radical is alif but verb form doesn't support hollow verbs") end elseif vform == "I" and rad1 == W and not form_I_w_non_assimilated() then weakness = "assimilated" elseif rad2 == rad3 and (vform == "III" or vform == "VI") then weakness = "geminate" variant = "long" else weakness = "sound" end end if expected_length then check_len(expected_length, expected_length) end end rad1 = convert(rad1, 1) rad2 = convert(rad2, 2) rad3 = convert(rad3, 3) rad4 = convert(rad4, 4) if not weakness then error("Internal error: Returned weakness from infer_radicals() is nil") end return { weakness = weakness, rad1 = rad1, rad2 = rad2, rad3 = rad3, rad4 = rad4, past_vowel = past_vowel, nonpast_vowel = nonpast_vowel, form_viii_assim = form_viii_assim, variant = variant, } end -- bot interface to infer_radicals() function export.infer_radicals_json(frame) local iparams = { headword = {}, vform = {}, passive = {}, past_vowel = {}, nonpast_vowel = {}, is_reduced = {type = "boolean"}, } local iargs = require("Module:parameters").process(frame.args, iparams) return require("Module:JSON").toJSON(export.infer_radicals(iargs)) end -- Infer vocalization from participle headword (active or passive), verb form (I, II, etc.) and whether the headword is -- active or passive. Throw an error if headword is malformed. Returned radicals may contain Latin letters "t", "w" or "y" -- indicating ambiguous radicals guessed to be tāʾ, wāw or yāʾ respectively. function export.infer_participle_vocalization(headword, vform, weakness, is_active) local chars = {} local orig_headword = headword -- Sub out alif-madda for easier processing. headword = rsub(headword, AMAD, HAMZA .. ALIF) local len = ulen(headword) -- Extract the headword letters into an array. for i = 1, len do table.insert(chars, usub(headword, i, i)) end local function form_intro_error_msg() return ("For verb form %s %s%s participle %s, "):format(vform, orig_headword ~= headword and "normalized " or "", is_active and "active" or "passive", headword) end local function err(msg) error(form_intro_error_msg() .. msg, 1) end -- Check that length of headword is within [min, max]. local function check_len(min, max) if min and len < min then err(("expected at least %s letters but saw %s"):format(min, len)) elseif max and len > max then err(("expected at most %s letters but saw %s"):format(max, len)) end end -- Get the character at `ind`, making sure it exists. local function c(ind) check_len(ind) return chars[ind] end -- Check that the letter at the given index is the given string, or is one of the members of the given array local function check(index, must) local letter = chars[index] local function make_possible_values() if type(must) == "string" then return must else return list_to_text(must, nil, " or ") end end if not letter then err(("expected a letter (specifically %s) at position %s, but participle is too short"):format( make_possible_values(), index)) end local matches if type(must) == "string" then matches = letter == must else matches = m_table.contains(must, letter) end if not matches then err(("letter %s at index %s must be %s"):format(letter, index, make_possible_values())) end end local function check_weakness(values, allow_missing, invert_condition) local function make_possible_weaknesses() for i, val in ipairs(values) do values[i] = "'" .. val .. "'" end return list_to_text(values, nil, " or ") end if allow_missing and invert_condition then error("Internal error: Can't specify both allow_missing and invert_condition") end if not weakness then if allow_missing or invert_condition then return else err(("weakness is unspecified but must be %s"):format(make_possible_weaknesses())) end else local matches = m_table.contains(values, weakness) if invert_condition and matches then err(("weakness '%s' must not be %s"):format(weakness, make_possible_weaknesses())) elseif not invert_condition and not matches then err(("weakness '%s' must be %s"):format(weakness, make_possible_weaknesses())) end end end local vocalized local function handle_possibly_final_weak(sound_prefix, expected_length) check_len(expected_length, expected_length) if c(expected_length) == AMAQ then -- passive final-weak if is_active then err("participle in -ِى only allowed for passive participles") end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. AN .. AMAQ else -- all others behave as if sound check_weakness({"final-weak", "assimilated+final-weak"}, nil, "invert condition") vocalized = sound_prefix .. (is_active and I or A) .. c(expected_length) end end if not (vform == "I" and is_active) then -- all participles except verb form I active begin in م-. check(1, M) end if vform == "I" then if is_active then check(2, ALIF) local sound_prefix = c(1) .. AA .. c(3) if len == 3 then if c(3) == HAMZA then -- Either hollow with hamzated third radical, e.g. [[شاء]] active participle 'شَاءٍ', or final-weak -- with hamzated second radical, e.g. [[رأى]] active participle 'رَاءٍ'. Theoretically (?), also -- geminate with hamzated second/third radical, but I don't know if any such verbs exist. if weakness == "geminate" then vocalized = sound_prefix .. SH else check_weakness({"hollow", "final-weak"}, "allow missing") vocalized = sound_prefix .. IN end else check_weakness({"final-weak", "geminate"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end end else check_len(4, 4) -- we will convert back to alif maqṣūra below as needed vocalized = sound_prefix .. I .. c(4) end else -- assimilated verbs: regular, e.g. مَوْزُون "weighed" -- geminate verbs: regular, e.g. مَبْلُول "moistened" -- third-hamzated verbs: مَبْرُوء -- hollow verbs: مَقُود "led, driven"; مَزِيد "added, increased" -- hollow first-hamzated verbs: مَئِيض "returned, reverted"; مَأْيُوس "despaired" (NOTE: formation is sound); -- مَأُود or مَؤُود "bent; depleted" -- hollow third-hamzated verbs: مَشِيء "willed, intended", مَضُوء "glittered?" -- final-weak: مَلْقِيّ "found, encountered"; مَصْغُوّ "inclined" -- hollow + final-weak: مَشْوِيّ "fried, grilled", مَهْوِيّ "loved" -- first-hamzated + hollow + final-weak: مَأْوِيّ "received hospitably" local sound_prefix = MA .. c(2) .. SK .. c(3) if len == 5 then -- sound, assimilated or geminate check(4, W) vocalized = sound_prefix .. UU .. c(5) else check_len(4, 4) if c(4) == W then -- final-weak third-wāw vocalized = sound_prefix .. U .. W .. SH elseif c(4) == Y then -- final-weak third-yāʾ vocalized = sound_prefix .. I .. Y .. SH else -- hollow check(3, {W, Y}) if c(3) == W then vocalized = MA .. c(2) .. UU .. c(4) else vocalized = MA .. c(2) .. II .. c(4) end end end end elseif vform == "II" or vform == "V" or vform == "XII" or vform == "XIII" or vform == "Iq" or vform == "IIq" or vform == "IIIq" then local sound_prefix, expected_length if vform == "II" then sound_prefix = MU .. c(2) .. A .. c(3) .. SH expected_length = 4 elseif vform == "V" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SH expected_length = 5 elseif vform == "XII" then -- e.g. [[احدودب]] "to be or become convex or humpbacked", مُحْدَوْدِب (active); -- [[اثنونى]] "to be bent; to be doubled up", مُثْنَوْنٍ (active) check(4, W) if c(3) ~= c(5) then err(("third letter %s should be the same as the fifth letter %s"):format(c(3), c(5))) end sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SK .. c(5) expected_length = 6 elseif vform == "XIII" then -- e.g. [[اخروط]] "to get entangled; to extend", مُخْرَوِّط (active), مُخْرَوَّط (passive) check(4, W) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. W .. SH expected_length = 5 elseif vform == "Iq" then sound_prefix = MU .. c(2) .. A .. c(3) .. SK .. c(4) expected_length = 5 elseif vform == "IIq" then check(2, T) sound_prefix = MU .. T .. A .. c(3) .. A .. c(4) .. SK .. c(5) expected_length = 6 elseif vform == "IIIq" then -- e.g. [[اخرنطم]] "to be proud and angry" check(4, T) sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. N .. SK .. c(5) expected_length = 6 else error("Internal error: Unhandled verb form " .. vform) end if len == expected_length - 1 then -- active final-weak if not is_active then err(("length-%s participle only allowed for active participles"):format(len)) end check_weakness({"final-weak", "assimilated+final-weak"}, "allow missing") vocalized = sound_prefix .. IN else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "III" or vform == "VI" then local sound_prefix, expected_length if vform == "VI" then check(2, T) check(4, ALIF) sound_prefix = MU .. T .. A .. c(3) .. AA .. c(5) expected_length = 6 else sound_prefix = MU .. c(2) .. AA .. c(4) expected_length = 5 end if len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. SH else vocalized = sound_prefix .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. SH end else handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "IV" or vform == "X" then -- form IV: -- sound: مُرْسِخ (active, "entrenching"), مُرْسَخ (passive, "entrenched") -- first-hamzated (like sound): مُؤْيِس (active, "causing to despair"), مُؤْيَس (passive, "caused to despair") -- final-weak: مُكْرٍ (active, "renting out"), مُكْرًى (passive, "rented out") -- assimilated: مُورِد (active, "transferring"), مُورَد (passive, "transferred"); same when first-Y, e.g. -- أَيْقَنَ "to be certain of": مُوقِن (active), مُوقَن (passive) -- assimilated + final-weak: مُورٍ (active, "setting fire, kindling"), مُورًى (passive, "set fire, kindled") -- geminate: مُمِدّ (active, "granting, helping"), مُمَدّ (passive, "granted, helped") -- hollow: مُزِيل (active, "eliminating"), مُزَال (passive, "eliminated") -- hollow + final-weak: مُعْيٍ (active, "tiring"), مُعْيًى (passive, "tired") local sound_prefix, expected_length if vform == "X" then check(2, S) check(3, T) sound_prefix = MU .. S .. SK .. T .. A .. c(4) expected_length = 6 else sound_prefix = MU .. c(2) expected_length = 4 end if len == expected_length and c(len - 1) == Y and c(len) ~= AMAQ then -- active hollow if not is_active then err("this shape only allowed for active participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. II .. c(len) elseif len == expected_length and c(len - 1) == ALIF then -- passive hollow if is_active then err("this shape only allowed for passive participles") end check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(len) elseif len == expected_length - 1 then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. I .. c(len) .. SH elseif vform == "IV" and c(2) == W then -- assimilated final-weak vocalized = sound_prefix .. c(len) .. IN else vocalized = sound_prefix .. SK .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else if vform == "IV" and c(2) == W then -- assimilated, possibly final-weak sound_prefix = sound_prefix .. c(expected_length - 1) else sound_prefix = sound_prefix .. SK .. c(expected_length - 1) end handle_possibly_final_weak(sound_prefix, expected_length) end elseif vform == "VII" or vform == "VIII" then -- form VII (passive participles are fairly rare but do exist): -- sound: مُنْكَتِب (active "subscribing"), مُنْكَتَب (passive "subscribed") -- geminate: مُنْضَمّ (both active "joining, containing" and passive "joined, contained") -- final-weak: مُنْطَلٍ (active "fooling (someone)"), مُنْطَلًى (passive "fooled") -- final-weak with medial wāw: مُنْطَوٍ (active "involving"), مُنْطَوًى (passive "involved") -- hollow: مُنْقَاد (both active "complying with" and passive "complied with") -- -- for form VIII, the same variants exist but things are complicated by assimilations involving the template T. -- sound third-hamzated no assimilation: مُبْتَدِئ (active "beginning"), مُبْتَدَأ (passive "begun") -- geminate no assimilation: مُبْتَزّ (both active "robbing" and passive "robbed") -- final-weak no assimilation: مُبْتَنٍ (active "building"), مُبْتَنًى (passive "built") -- final-weak with medial wāw no assimilation: مُحْتَوٍ (active "containing"), مُحْتَوًى (passive "contained") -- hollow no assimilation: مُخْتَار (both active "choosing" and passive "chosen") -- -- sound with total assimilation: مُتَّبِع (active "following"), مُتَّبَع (passive "followed") -- sound with total assimilation, assimilating wāw: مُتَّعِد (active "threatening"), مُتَّعَد (passive "threatened") -- sound with total assimilation, irregularly assimilating hamza: مُتَّخِذ (active "taking"), مُتَّخَذ (passive "taken") -- sound with total assimilation (to ḏāl, producing dāl): مُدَّخِر (active "reserving"), مُدَّخَر (passive "reserved") -- sound with total assimilation (to ḏāl): مُذَّكِر (active "remembering"), مُذَّكَر (passive "remembered") -- sound with total assimilation (to ṭāʔ): مُطَّرِح (active "discarding"), مُطَّرَح (passive "discarded") -- sound with total assimilation (to ẓāʔ): مُظَّلِم (active "tolerating"), مُظَّلَم (passive "tolerated") -- final-weak with total assimilation, assimilating wāw: مُتَّقٍ (active "guarding against"), مُتَّقًى (passive "guarded against") -- final-weak with total assimilation (to ṯāʔ): مُثَّنٍ (active "undulating"), مُثَّنًى (passive "undulated") -- final-weak with total assimilation (to dāl): مُدَّعٍ (active "claiming"), مُدَّعًى (passive "claimed") -- sound with partial assimilation (to zayn): مُزْدَهِر (active "thriving"), مُزْدَهَر (passive "thrived") -- sound with medial wāw with partial assimilation (to zayn): مُزْدَوِج (active "appearing twice") -- sound with partial assimilation (to ṣād): مُصْطَبِح (active "illuminating"), مُصْطَبَح (passive, "illuminated") -- sound with partial assimilation (to ḍād): مُضْطَرِب (active "to be disturbed"; no passive) -- geminate with partial assimilation (to ṣād): مُصْطَبّ (both active "effusing" and passive "effused") -- geminate with partial assimilation (to ḍād): مُضْطَرّ (both active "forcing" and passive "forced") -- final-weak with partial assimilation (to ṣād): مُصْطَلٍ (active "warming"), مُصْطَلًى (passive "warmed") -- hollow with partial assimilation (to zayn): مُزْدَاد (both active "increasing" and passive "increased") -- hollow with partial assimilation (to ṣad): مُصْطَاد (both active "hunting" and passive "hunted") local sound_prefix, sufind if vform == "VII" then check(2, N) sound_prefix = MU .. N .. SK .. c(3) sufind = 4 else local c2 = c(2) if c2 == T or c2 == "د" or c2 == "ث" or c2 == "ذ" or c2 == "ط" or c2 == "ظ" then -- full assimilation sound_prefix = MU .. c2 .. SH sufind = 3 else -- partial or no assimilation if c2 == "ز" then check(3, "د") elseif c2 == "ص" or c2 == "ض" then check(3, "ط") else check(3, T) end sound_prefix = MU .. c2 .. SK .. c(3) sufind = 4 end end if c(sufind) == ALIF then -- hollow, active or passive check_len(sufind + 1, sufind + 1) check_weakness({"hollow"}, "allow missing") vocalized = sound_prefix .. AA .. c(sufind + 1) elseif len == sufind then -- active final-weak or active or passive geminate if is_active then check_weakness({"geminate", "final-weak", "assimilated+final-weak"}) if weakness == "geminate" then vocalized = sound_prefix .. A .. c(len) .. SH else vocalized = sound_prefix .. A .. c(len) .. IN end else check_weakness({"geminate"}, "allow missing") vocalized = sound_prefix .. A .. c(len) .. SH end else sound_prefix = sound_prefix .. A .. c(sufind) handle_possibly_final_weak(sound_prefix, sufind + 1) end elseif vform == "IX" then check_len(4, 4) vocalized = MU .. c(2) .. SK .. c(3) .. A .. c(4) .. SH elseif vform == "IVq" then -- e.g. [[اذلعب]] "to scamper away", مُذْلَعِبّ (active), مُذْلَعَبّ (passive); -- [[اطمأن]] "to remain quietly; to be certain", مُطْمَئِنّ (active), مُطْمَأَنّ (passive) check_len(5, 5) local sound_prefix = MU .. c(2) .. SK .. c(3) .. A .. c(4) if is_active then vocalized = sound_prefix .. I .. c(5) .. SH else vocalized = sound_prefix .. A .. c(5) .. SH end elseif vform == "XI" then check_len(5, 5) check(4, ALIF) vocalized = MU .. c(2) .. SK .. c(3) .. AA .. c(5) .. SH -- e.g. [[احمار]] "to turn red, to blush", مُحْمَارّ (active) elseif vform == "XIV" or vform == "XV" then -- FIXME: Implement. No examples in Wiktionary currently; need to look up in a grammar. error("Support for verb form " .. vform .. " not implemented yet") else error("Don't recognize verb form " .. vform) end vocalized = rsub(vocalized, HAMZA .. AA, AMAD) local reconstructed_headword = lang:makeEntryName(vocalized) if reconstructed_headword ~= orig_headword then error(("Internal error: Vocalized participle %s doesn't match original participle %s"):format( vocalized, orig_headword)) end -- Apply NFC-style normalization to match MediaWiki's automatic normalization return apply_nfc_shadda(vocalized) end function export.infer_participle_vocalization_json(frame) local iparams = { [1] = {required = true}, [2] = {required = true}, ["weakness"] = {}, ["passive"] = {type = "boolean"} } local iargs = require("Module:parameters").process(frame.args, iparams) return export.infer_participle_vocalization(iargs[1], iargs[2], iargs.weakness, not iargs.passive) end return export o9b7xsnls7f2q34tjo6i65x05p65ddr مستخدم:أبو هشام/مسودة 2 209833 1099144 1099104 2026-08-22T13:17:53Z أبو هشام 20788 حفظ 1099144 wikitext text/x-wiki * [[:1990 Iraqi coup attempt]] * [[:Samantha Kane]] * [[:Kanisurra]] * [[:Karkar (ancient city)]] * [[:Kumme]] * [[:Kusibanda]] * [[:Lammašaga]] * [[:Laṣ]] * [[:Latarak]] * [[:Lisin]] * [[:Mār-bīti]] * [[:Mart Meskinta Chaldean Church]] * [[:Meskilak]] * [[:Neo-Mandaic]] * [[:Nin-MAR.KI]] * [[:Ninegal]] * [[:Ninĝidru]] * [[:Ningublaga]] * [[:Ninnibru]] * [[:Saggar (god)]] * [[:Saĝkud]] * [[:Šeri and Ḫurri]] * [[:Seventy-second firman of the Yazidis]] * [[:Šimige]] * [[:SIPRI Arms Transfers Database, Iraq 1973–1990]] * [[:447th Air Expeditionary Group]] * [[:2015 Hawija prison raid]] * [[:Ahai of Shabha]] * [[:Murder of Noor Almaleki]] * [[:Amram ben Sheshna]] * [[:Anubanini]] * [[:Apladad]] * [[:Ardat-lilî]] * [[:Aruru (goddess)]] * [[:Ashnan]] * [[:Ašratum]] * [[:Belet-Šuḫnir and Belet-Terraban]] * [[:Belili]] * [[:Bilulu]] * [[:Casualties of the 2026 Iran war]] * [[:Ebiḫ]] * [[:Enegi]] * [[:Grazers (Christianity)]] * [[:Ḫabūrītum]] * [[:Hai ben Sherira]] * [[:Hendursaga]] * [[:Ulmašītum]] * [[:Ushrusaniyya]] * [[:Weidner god list]] * [[:Wer (god)]] * [[:Bob Woodruff]] * [[:Elliott Yamin]] * [[:Zuṭṭ]] * [[:2005 Royal Air Force Hercules shootdown]] * [[:2026 Green Zone raid]] * [[:2026 United States-led conflict with pro-Iranian Iraqi militias]] * [[:Adadnadinakhe bricks]] * [[:Abbas Aghazamani]] * [[:Death of Rasha al-Hassan]] * [[:Al-Shahristani family]] * [[:Ara (goddess)]] * [[:Aramaic New Testament hypotheses]] * [[:Aramaization of Assyria]] * [[:Attambelos VI]] * [[:Audie Attar]] * [[:Sarbast Babiri]] * [[:Basra Region]] * [[:Battle of Mosul (2016–2017) order of battle]] * [[:Scott Thomas Beauchamp controversy]] * [[:Bēltu-ša-Rēš]] * [[:Pir Budaq]] * [[:Danella Butrus]] * [[:Dené–Caucasian languages]] * [[:Adoption of Ala'a Eddeen]] * [[:Erragal]] * [[:Fatat Al-Basra SC]] * [[:Flag of the Islamic State]] * [[:Gazbaba]] * [[:Grai Resh]] * [[:Ishmekarab]] * [[:Islamic State Hacking Division]] * [[:Jacqueline S. Ismael]] * [[:Murad Ismael]] * [[:Kismet (musical)]] * [[:Kurds in World War II]] * [[:Lumma]] * [[:March 2016 Turkish incursion into northern Iraq]] * [[:Martyrs' Cemetery]] * [[:Athanase Matti Shaba Matoka]] * [[:Murder of Falah Zaggam]] * [[:Milku]] * [[:Tomasa Pérez Molleja]] * [[:Killing of Salwan Momika]] * [[:Mustarjil]] * [[:Nebuchadnezzar II's Prism]] * [[:Negm bar Zahroon]] * [[:Operation Gallant Phoenix]] * [[:Oudh Bequest]] * [[:Progressive Socialist Organizations of the Mediterranean]] * [[:Ptahil]] * [[:Qurnah disaster]] * [[:Rādhān]] * [[:Ibrahim Rashid]] * [[:Šassūrātu]] * [[:Glenn M. Schwartz]] * [[:Second Battle of Habbaniyah]] * [[:Šerua]] * [[:Sherwan Sherwani]] * [[:Qasim Shesho]] * [[:Siege of Baghdad (1625–1626)]] * [[:Song of the hoe]] * [[:Special Program for Embassy Augmentation and Response]] * [[:Sutītu]] * [[:Juliana Taimoorazy]] * [[:Territory of Al-Qaeda in Iraq]] * [[:Territory of Jama'at al-Tawhid wal-Jihad]] * [[:Territory of the Islamic State of Iraq]] * [[:Wahhabi raids on Najaf]] hxume8rr2fp6n4en9m27ntom2lkruy9 ويكاموس:الميدان/أرشيف/2026 4 237535 1099187 1097978 2026-08-22T19:03:34Z Najem Ajem 20465 + بخصوص ويكيبيديا المجردة 1099187 wikitext text/x-wiki {{أرشيف صفحة رئيسية|ويكاموس:الميدان}} == Thank You for Last Year – Join Wiki Loves Ramadan 2026 == Dear Wikimedia communities, We hope you are doing well, and we wish you a happy New Year. ''Last year, we captured light. This year, we’ll capture legacy.'' In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects. We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community. 📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]] If you have questions about the project, please refer to the FAQs: * [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]] * [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]] ''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]''''' ''Stay connected and receive updates:'' * [https://t.me/WikiLovesRamadan Telegram channel] * [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list] We look forward to collaborating with you and your community. '''The Wiki Loves Ramadan 2026 Organizing Team''' 19:45، 16 يناير 2026 (ت ع م) <!-- الرسالة التي أرسلها User:ZI Jony@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 --> == <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]]. The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]]. Please share this information with other members in your community wherever else might be appropriate. -- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> </div> 21:02، 19 يناير 2026 (ت ع م) <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 --> == قوالب جديدة + إنشاء صفحات الأفعال == في إطار إثراء ويكاموس، أنشأنا في الفترة الأخيرة وحدات وقوالب جديدة، من أهمها [[قالب:تصريف]]، الذي صار واسع الاستعمال بفضل تدريبات ومسابقة [[ويكاموس:مشروع إحياء ويكاموس العربي 2025|مشروع إحياء ويكاموس العربي 2025]] (الشكر مرة أخرى للزملاء القائمين على المشروع). ثم عملنا على الربط بين ويكي بيانات وويكاموس. سبقني الزميل {{مس|Mr. Ibrahem}}، مشكورا، بإنشاء آلاف الجذور والأفعال والأسماء في ويكي بيانات. ثم أضفت جذورا وأفعالا أخرى، مع أوزانها الصرفية وخاصية اللزوم والتعدية. يُمَكِّن [[قالب:صندوق معلومات فعل]] من استيراد خاصيات الأفعال من ويكي بيانات، ثم إظهارها مع معلومات أخرى (المصدر، اسم الفاعل، اسم المفعول) في صندوق معلومات داخل صفحات ويكاموس. كذلك أنشأنا [[قالب:معجمية]] الذي يستورد معاني الكلمات، مع مراجعها وأمثلة استخدامها، من ويكي بيانات إلى ويكاموس. عددتُ في صفحة [[ويكاموس:ويكي بيانات]] امتيازات الاعتماد على ويكي بيانات، وطبيعة الربط بين المشروعين، وطرق المُساهمة. المراحل القادمة: * إنشاء صفحات الأفعال غير الموجودة في ويكاموس، بالصيغة التالية: ** <syntaxhighlight lang="wikitext" dir="rtl"> == {{اللغة|عربية}} == {{صندوق معلومات فعل|L12345}} <!-- جديد --> === المعاني === '''فَعَلَ''' {{نصر}}. {{معجمية|L12345|معاني}} <!-- جديد --> === النطق === * {{أصد-عر|فَعَلَ}} === التصريفات === {{تصريف|جذر=فعل|وزن=فعَل يفعُل}} === المراجع === {{مراجع}} </syntaxhighlight> ** مثال لصفحات تستورد المعاني في ويكي بيانات: [[أَدْرَجَ]]، [[أَبْحَرَ]]. ** مثال لصفحات تستعمل [[قالب:معجمية]]، لكن ليس لها معاني في ويكي بيانات (في تاريخ كتابة هذه السطور): [[اِسْتَبْحَرَ]]، [[تَأَبَّتَ]]. وهكذا سيكون حال أغلب الصفحات التي ستُنشأ. * في مرحلة ثانية، إضافة المعاني إلى ويكي بيانات، وهي عملية ستستغرق وقتا طويلا، إذ تتطلّب تفكيرا معمّقا في المنهجية، وتحضير أدوات للبحث في المعاجم، إضافة إلى مراجعة يدوية للمعاني قبل إدخالها. وقد بدأنا بالفعل التفكير في آلية العمل، بالتعاون مع زملاء آخرين. هل من ملاحظات أو اقتراحات أو اعتراضات أو أفكار ؟ [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:30، 17 يناير 2026 (ت ع م) :إشارة إلى الناشطين في المشروع @[[مستخدم:حبيشان|حبيشان]] @[[مستخدم:Najem Ajem|Najem Ajem]] @[[مستخدم:Nehaoua|Nehaoua]] @[[مستخدم:Avicenno|Avicenno]] @[[مستخدم:أبو هشام|أبو هشام]] @[[مستخدم:القلموني|القلموني]] @[[مستخدم:RASHEEDYE|RASHEEDYE]] @[[مستخدم:كريم أحمد|كريم أحمد]] [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:44، 20 يناير 2026 (ت ع م) :أشكرك @[[مستخدم:ForzaGreen|ForzaGreen]] على هذه المساهمات الرائعة، أرجو عدم حذف المحتوى الحالي وإحلال قوالب ويكي بيانات مكانه، التعديل المباشر في ويكاموس أسهل لأكثر مستخدمين من ويكي بيانات، والمشاركات في المشروع ضعيفة لذا نريد التشجيع للمساهمة من أي طريق سواء عبر ويكاموس مباشرة أو عبر ويكي بيانات كلا بما يحسنه. :هناك ملاحظات تقنية سيكون مكانها نقاش الوحدة. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 13:00، الأربعاء 2 شعبان 1447هـ (+3) 10:00، 21 يناير 2026 (ت ع م) ::شكرا @[[مستخدم:حبيشان|حبيشان]] على الملاحظة. طبعا لن يُحذف المحتوى الحالي. سيُستعمل [[قالب:معجمية]] فقط في الصفحات الجديدة. غيرت صفحة [[أَدْرَجَ]] فقط كمثال. في الصفحات الموجودة سيُضاف [[قالب:صندوق معلومات فعل]] وسيُعتمد [[قالب:تصريف]] بدل القالب القديم، أما المعاني فستبقى كما هي. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:49، 21 يناير 2026 (ت ع م) :شكرا لك {{ر|ForzaGreen|س=وائل}} ولباقي الزملاء على الاهتمام بربط ويكاموس مع ويكي بيانات. هذا عمل رائع، وأنا متوافق مع خطة عملكم. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 14:12، 22 يناير 2026 (ت ع م) ::شكرا للإشارة، {{أتفق}} فالفكرة رائعة وستثري المشروع، ولدي سؤال هل يمكن الربط بين المشروعين من ويكي بيانات؟ شكرا. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:16، 2 فبراير 2026 (ت ع م) :::شكرا @[[مستخدم:أبو هشام|أبو هشام]] على أسئلتك في [https://ar.wiktionary.org/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%B7%D9%84%D8%A8_%D8%B5%D9%84%D8%A7%D8%AD%D9%8A%D8%A9_%D8%A8%D9%88%D8%AA#c-%D8%A3%D8%A8%D9%88_%D9%87%D8%B4%D8%A7%D9%85-20260202102100-ForzaGreen-20260201235800 صفحة طلب صلاحية البوت]. :::- عن سؤالك: ''هل يمكن الربط بين المشروعين من ويكي بيانات وليس من ويكاموس؟'' -> لا يمكن. ميزة ويكي بيانات أنها قاعدة بيانات، نستغلها لتخزين بيانات مُهيكَلة ومُرتبة. وبالتالي يسهل استيراد هذه البيانات برمجيا في ويكاموس. :::- عن اقتراحك ''فصل التعريف بالمفردة عن المعاني وإضافة مصدر للتعريف إن أمكن''. -> لم أفهم. على كل حال، استعمال قالب {{قا|معجمية}} يبقى مسألة اختيارية لمن أراد أن يسحب المعلومات من معجميات ويكي بيانات. :::- ''هل ستُزال جملة (هذه الكلمة لا تحتوي على معانٍ....إلخ) تلقائيا عند تطوير المفردة وإضافة المعاني في ويكاموس؟'' -> نعم، الجملة تُزال تلقائيا عند إضافة المعاني في ويكي بيانات، وليس في ويكاموس. وهذه أهم ميزات القالب. خذ مثلا مثال صفحة [[حَارَبَ]] (ليس لها معاني في حين كتابة هذه السطور). أضف لها معاني في ويكي بيانات، فستظهر لك في ويكاموس. انظر فقرة [[ويكاموس:ويكي بيانات#استيراد المعاني|ويكاموس:ويكي بيانات#استيراد المعاني]] لكيفية إضافة المعاني في ويكي بيانات. :::- ''* من أين جاءت هذه الجملة (جريمة قتل على ويكيبيديا) في هذه المفردة ([[أَدْرَجَ]])؟'' -> جاءت من ويكي بيانات، من خاصية ([[wikidata:P:P9970|مُسند إلى]]). تُستعمل الخاصية لربط المعنى مع عنصر (وليس وحدة معجمية) في ويكي بيانات. إن كان للعنصر مقالة في ويكيبيديا، فستظهر في ويكاموس. شرحت هذا كذلك في صفحة [[ويكاموس:ويكي بيانات]]. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 21:57، 2 فبراير 2026 (ت ع م) هذا مثال لما أقصده، قد تحتاج إلى إنشاء قالب للتعريف بالمفردة وإزالة التعريف من قالب معجمية أو إنشاء قالب للمعاني وظيفته استيراد المعاني: * <syntaxhighlight lang="wikitext" dir="rtl"> == {{اللغة|عربية}} == {{صندوق معلومات فعل}} === التعريف === هنا يكون التعريف بالمفردة باستخدام قالب للتعريف فقط.(مرجع) === المعاني === هنا تذكر المعاني باستخدام قالب وظيفته استيراد المعاني فقط أو يضيفها المحررون. === النطق === * {{أصد-عر|فَعَلَ}} === التصريفات === {{تصريف|جذر=فعل|وزن=فعَل يفعُل}} === المراجع === {{مراجع}} </syntaxhighlight> :هذا مجرد اقتراح، ويمكن الاستغناء عن قسم التعريف (=== التعريف ===) وذكره بعد صندوق المعلومات مباشرة. * <syntaxhighlight lang="wikitext" dir="rtl"> == {{اللغة|عربية}} == {{صندوق معلومات فعل}} هنا يكون التعريف بالمفردة باستخدام قالب للتعريف فقط.(مرجع) === المعاني === هنا تذكر المعاني باستخدام قالب وظيفته استيراد المعاني فقط أو يضيفها المحررون. === النطق === * {{أصد-عر|فَعَلَ}} === التصريفات === {{تصريف|جذر=فعل|وزن=فعَل يفعُل}} === المراجع === {{مراجع}} </syntaxhighlight> :اقتراحي الآخر هو إنشاء صفحات للمفردات التي لها معان في ويكي بيانات فقط لأن الصفحات التي تقتصر على القوالب فقط ستكون فارغة أو شبه فارغة، شكرا لجهودكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 13:00، 3 فبراير 2026 (ت ع م) ::{{ر|ForzaGreen}} أرى أن التنسيق الذي اقترحتَه جيد، إذ يضاف صندوق المعلومات وقالب {{قا|معجمية}} بدون الحاجة لإضافة أي قسم جديد. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:48، 5 فبراير 2026 (ت ع م) ::{{ر|أبو هشام}} صفحات الأفعال المضافة ستتضمن معلومات منظمة عن النطق والصرف والنحو، <s>أما قسم المعاني الذي سيكون شبه فارغ فهو سيدفع المحررين إلى شيء من الحماس ويجعلهم يفكرون بإضافة المعاني سواء في المحرر أو في ويكي بيانات، إذ لا بأس بهذا.</s> والعديد من الويكاموسات الأجنبية فيها صفحات "شبه فارغة" كثيرة. [[مستخدم:Najem Ajem|'''<span style="color:#00008B">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#00008B">''❄''</span>''']] 12:48، 5 فبراير 2026 (ت ع م) :::فعلا الصفحات المُقترحة تتضمن عدة معلومات (الجذر، الأوزان الصرفية، التعدية، المصادر، اسما الفاعل والمفعول، التصريف، النطق..)، لكن أتَفَهَّم كذلك رأي الزملاء بأن المعاني هي الركن الأساسي في المعجم. حاليا لن أُنشئ صفحات الأفعال الأساسية. قد أُعدِّل صفحات الأفعال الموجودة لإضافة {{قا|صندوق معلومات فعل}} و{{قا|تصريف}}. كذلك قد أُنشئ الصفحات الثانوية، من قبيل [[أَكْتُبُ]]، [[نَكْتُبُ]]، [[اُكْتُبْ]]... [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 08:56، 6 فبراير 2026 (ت ع م) == Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) == <div lang="en" dir="ltr" class="mw-content-ltr"> Hello everyone, This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>). '''The Change:'''<br /> Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]]. We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''. '''What You Need To Do:'''<br /> To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search. '''Deadline:'''<br /> We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles. Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[مستخدم:MediaWiki message delivery|MediaWiki message delivery]] ([[نقاش المستخدم:MediaWiki message delivery|نقاش]]) 17:12، 3 أبريل 2026 (ت ع م) </div><!-- الرسالة التي أرسلها User:ZI Jony@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 --> == Request for comment (global AI policy) == <div lang="en" dir="ltr" class="mw-content-ltr"> Apologies for writing in English. {{int:Please-translate}}<br /> A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}} [[مستخدم:MediaWiki message delivery|MediaWiki message delivery]] ([[نقاش المستخدم:MediaWiki message delivery|نقاش]]) 00:58، 26 أبريل 2026 (ت ع م) </div><!-- الرسالة التي أرسلها User:Codename Noreste@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 --> == تجربة إضافة الاستشهاد الآلي بويكي بيانات، مع طلب جعلها افتراضية == بفضل الله طورت إضافة الاستشهاد الآلي بالشاملة لتشمل المواقع والمعرفات التالية: {{top3}} * موقع أرشيف Archive - مع الجزء والصفحة * موقع تراث app.turath.io - مع الجزء والصفحة * معرف ردمك isbn * معرف دوي DOI * arXiv * bibcode * biorxiv * zbMATH {{mid3}} * jstor * Academia * mandumah * eMarefa * mathscinet * oclc * openlibrary * osti {{mid3}} * PMC * PubMed * rfc * ssrn * s2pid * Google Books - مع الجزء * ResearchGate * أي موقع آخر إذا وضع في خاصية {{P|953}} {{bottom}} معرفات ردمك ودوي وعزو برنامج وموقع الشاملة وتراث يمكن وضعه بدون مباشرة، لكن بقية المعرفات الأخرى لا بد أن يكون هناك رابط من موقع المعرف. يشترط أن يكون المرجع موجودًا في ويكي بيانات أنه معرف بذلك المعرف. يمكن الإضافة على هذه المعرفات إذا كان لها استخدام واسع. لتجربة الإضافة اضغط على هذا الرابط: {{تفعيل إضافة|auto-cite-wikidata-loader|block=1}} مع التأكد من إلغاء تفعيل إضافة (الاستشهاد الآلي بالشاملة) ويكن ذلك عبر الرابط التالي: {{تفعيل إضافة|auto-cite-shamela-loader|block=1|تعطيل=1}} بعد تجربة الإضافة ستستبدل بإضافة الاستشهاد بالشاملة، وكذلك أطلب جعلها إضافة افتراضية لتسهيل الاستشهاد على المبتدئين. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 18:44، الثلاثاء 11 ذو القعدة 1447هـ (+3) 15:44، 28 أبريل 2026 (ت ع م) :{{مع}} جعل الإضافة افتراضية. شكرا لك. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 13:53، 29 أبريل 2026 (ت ع م) :{{تم}}، لعدم الاعتراض. [[مستخدم:حبيشان|حبيشان]]<sup>('''[[نقاش المستخدم:حبيشان|ن]]''')</sup> 22:16، الثلاثاء 25 ذو القعدة 1447هـ (+3) 19:16، 12 مايو 2026 (ت ع م) == دعوة للمشاركة في ندوة تعريفية بأداة إثراء ويكاموس == السلام عليكم ورحمة الله، [[ملف:ArabicWiktionary-WMISLM-Poster.png|تصغير|يسار|ملصق إعلاني للندوة]] يسعدنا في مجموعة الحضارة الإسلامية دعوتكم لحضور ندوة حول أداة إثراء مشروع ويكاموس، للتعرف على هذا المشروع وآلية العمل عليه وتطويره عبر أداة تقنية متطورة. لمزيد من المعلومات والتسجيل: [[w:ar:فعالية:جلسة تعريفية بأداة إثراء ويكاموس|جلسة تعريفية بأداة إثراء ويكاموس]] والسلام خير الختام [[مستخدم:SanBonne|SanBonne]] ([[نقاش المستخدم:SanBonne|نقاش]]) 09:01، 25 مايو 2026 (ت ع م) == مشكلة تقنية == مرحبًا، عند الضغط على مساهمات المستخدم واختبار حسابات الدخول الموحد يظهر رابط بخطأ الرابط والمفروض أنه يفتح [[خاص:تحقق مركزي]]. إشارة @[[مستخدم:Najem Ajem|Najem Ajem]] @[[مستخدم:حبيشان|حبيشان]] [[مستخدم:كريم أحمد|كريم أحمد]] ([[نقاش المستخدم:كريم أحمد|نقاش]]) 12:22، 26 مايو 2026 (ت ع م) :لو جعلت الخيارات أسفل [[خاص:مساهمات]] مثل ما هي في ويكاموس الإنجليزي فسيكون الوضع أفضل بكثير. [[مستخدم:كريم أحمد|كريم أحمد]] ([[نقاش المستخدم:كريم أحمد|نقاش]]) 12:28، 26 مايو 2026 (ت ع م) ::مرحبا {{ر|كريم أحمد}}، عيد مبارك سعيد. الوصلات الموجودة في الشريط السفلي ل[[خاص:مساهمات]] مطابقة لما هو الوضع عليه في باقي المشاريع، آخر ثلاث وصلات: :#المساهمات العالمية (Global contributions): وهي وصلة لأداة guc في toolforge. :#الحسابات (accounts): وهذه هي الوصلة التي تؤدي إلى [[خاص:تحقق مركزي]]. :#المساهمات (edits): وهذه وصلة إلى المساهمات العالمية كأداة guc، لكن معروضة مباشرة على موقع ميتاويكي. ::وبالتالي لا أرى أي مشكلة في هذا. إلا إذا شرحتَ باستفاضة الإشكال الذي تجده، تحياتي [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 21:19، 26 مايو 2026 (ت ع م) ::كتبت ردِي بعد مقارنة الواجهة في ويكاموس العربي والإنجليزي، لكن راجعتُ الآن أحدث التغييرات، وأرى أن {{ر|حبيشان}} -مشكورا- حل الإشكال و[[خاص:فرق/1090226|عدل الشريط السفلي]] للمساهمات مسبقا قبل ردِي، لذلك لم أجد أي اختلاف. [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 21:37، 26 مايو 2026 (ت ع م) :::جزيل الشكر @[[مستخدم:Najem Ajem|Najem Ajem]] على الشرح و@[[مستخدم:حبيشان|حبيشان]] على التحديث. هل يمكن إضافة خانة المدخلات المنشئة كما في الإنجليزي؟ وعيد مبارك عليكما. [[مستخدم:كريم أحمد|كريم أحمد]] ([[نقاش المستخدم:كريم أحمد|نقاش]]) 22:34، 26 مايو 2026 (ت ع م) ::::{{تم}} [[مستخدم:Najem Ajem|'''<span style="color:#3B82F6">--الناجم العاجم</span>''']] [[نقاش المستخدم:Najem Ajem|'''<span style="color:#3B82F6">''❄''</span>''']] 19:21، 29 مايو 2026 (ت ع م) :::::@[[مستخدم:Najem Ajem|Najem Ajem]] صارت أحسن، جزيل الشكر. [[مستخدم:كريم أحمد|كريم أحمد]] ([[نقاش المستخدم:كريم أحمد|نقاش]]) 20:02، 29 مايو 2026 (ت ع م) == صوت الآن لانتخابات أعضاء لجنة التنسيق لمدونة السلوك العالمية 2026 == <section begin="announcement-content" /> يُدعى المصوتون المؤهلون للمشاركة في انتخابات [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|اللجنة التنسيقية لمدونة قواعد السلوك العالمية]] لعام 2026. وتتوفر معلومات إضافية — بما في ذلك التحقق من أهلية التصويت، وتفاصيل آلية الاقتراع، ومعلومات المرشحين، ورابط التصويت — على منصة ميتـا عبر [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|صفحة معلومات انتخابات 2026]]. علماً بأن باب التصويت سيُغلق في 2 يونيو 2026 عند الساعة [https://zonestamp.toolforge.org/1780358400 00:00 بالتوقيت العالمي المنسق]. من فضلك صوت إذا كان حسابك مؤهلاً وستتاح النتائج بحلول 14 يونيو 2026. -- بالتعاون مع لجنة تنسيق مدونة السلوك العالمية،<section end="announcement-content" /> [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15، 27 مايو 2026 (ت ع م) <!-- الرسالة التي أرسلها User:Keegan (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 --> == RFC about AI-generated content in Wikimedia Commons == <bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|نقاش]])</bdi> 17:12، 23 يونيو 2026 (ت ع م) <!-- الرسالة التي أرسلها User:Codename Noreste@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 --> == نشر رابط جهات الاتصال القانونية والسلامة في تذييل الويكي الخاص بكم == <section begin="Message"/> '''جهات الاتصال القانونية والأمنية''' مرحبًا بالمجتمع، وفّرت مؤسسة ويكيميديا [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|صفحة موحّدة لجهات الاتصال القانونية والأمنية]] ليُربط بها في تذييل الويكي الخاص بكم، لضمان الوصول إلى معلومات قانونية دقيقة. يُعدّ ذلك متطلبًا تنظيميًا. لقد نشرنا بالفعل روابط في ويكيبيديا الإنجليزية والألمانية والإيطالية والإسبانية وغيرها من الويكيات، وسننشرها في الويكي الخاص بكم قريبًا. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|يرجى قراءة المزيد في صفحة المشروع]] وترك أي تعليقات في هذا القسم أو في [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|صفحة النقاش]]. <section end="Message"/> -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31، 25 يونيو 2026 (ت ع م) <!-- الرسالة التي أرسلها User:Sannita (WMF)@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 --> == Request for comment (the future of Abstract Wikipedia) == <bdi lang="en" dir="ltr" class="mw-content-ltr"> Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}} You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}} [[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25، 24 يوليو 2026 (ت ع م) </bdi> <!-- الرسالة التي أرسلها User:DreamRimmer@metawiki باستخدام القائمة في https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 --> {{نهاية صفحة أرشيف}} brimdaxk80yqps8uu6q9gdx6pyb22os نقاش ويكاموس:ويكي بيانات 5 240649 1099175 1099135 2026-08-22T16:36:23Z أبو هشام 20788 /* بلاغ من أداة مراجعة المعاني: تَخَارَقَ (L1534942) */ قسم جديد 1099175 wikitext text/x-wiki {{رأس صفحة نقاش}} == بلاغ من أداة مراجعة المعاني: حَلَّى (L1534604) == '''حَلَّى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534604|18بك|ويكي بيانات: L1534604]] [[ملف:Wiktionary-logo.svg|وصلة=حَلَّى|18بك|صفحة ويكاموس]] · الجذر: حلو · ([[toolforge:ar-senses/review/L1534604|رابط المُفردة في الأداة]]) إبلاغ من الزميل {{مس|رِفْد}}: ''لا يمكن نشرها في ويكاموس عند الضغط على زر النشر يظهر: "خطأ: الصفحة موجودة بالفعل".'' --[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:27، 27 يوليو 2026 (ت ع م) :شكرا لك @[[مستخدم:رِفْد|رِفْد]] على الإبلاغ. المشكلة في الفعل حَلَّى (وأفعال آخرين) أَنَّه يُوَلَّدُ من جذرين: ح-ل-ي و ح-ل-و. في ويكي بيانات توجد وحدتان معجميتان، واحدة لكل فعل، لكن في ويكاموس لا يُمكن إنشاء صفحتين بنفس الاسم. سأفكر في حل لهذه المشكلة وأوافيك بالجديد. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:28، 27 يوليو 2026 (ت ع م) ::حالة أخرى حيث يشترك جذران في نفس صيغة الفعل: ::* جذر ت-ل-و على وزن تفعّل => [[تَتَلَّى]] ([https://ar-senses.toolforge.org/review/L1533461 رابط المُفردة في الأداة]). ::* جذر ت-ل-ي على وزن تفعّل => [[تَتَلَّى]] ::[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:42، 27 يوليو 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَجَاشَ (L1534157) == '''اِسْتَجَاشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534157|18بك|ويكي بيانات: L1534157]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَجَاشَ|18بك|صفحة ويكاموس]] · الجذر: جيش · ([[toolforge:ar-senses/review/L1534157|رابط المُفردة في الأداة]]) المعنى الثاني غير موجود في المصدر في صفحة المفردة (ص=603) والحديث الموجود في صفحة 115 غير مفسر بهذا المعنى أيضا. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:40، 27 يوليو 2026 (ت ع م) <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> :{{ر|أبو هشام}} بخصوص المعنى الثاني، رجعتُ إلى ص=603 ووجدتُ المعنى حسب الوارد في الأداة: {{اقتباس مضمن|استجاش الأمير من مكان كذا: طلب جيشًا وجمعه. '''و- ت القدر: غلت.'''}} :{{ر|Michel Bakni}} بخصوص المعنى الثالث (ص=115)، يبدو المعنى صحيحًا لكن الأداة استَنْبَطَتْهُ من مثال وارد في المعجم لا من تعريف للكلمة، ما رأيك؟ :*الاقتباس من المصدر: {{اقتباس مضمن|فَمَرَّ الْجَيْشُ عَلَى غَطَفَانَ '''فَاسْتَجَاشُوهُمْ''' عَلَى بَنِي سُليم، فَهَزَمَتْ بَنُو سُلَيم جيشَ النُّعْمَانِ}} :*تعريف المعنى كما استخرجَتْهُ الأداة من النص السابق: {{اقتباس مضمن|اِسْتَجَاشَ القومَ على فلان: استنفرهم وحرّضهم عليه}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:23، 6 أغسطس 2026 (ت ع م). ::نعم أتفق مع هذا الطرح. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 14:25، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: جَوَّهَ (L1534145) == '''جَوَّهَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534145|18بك|ويكي بيانات: L1534145]] [[ملف:Wiktionary-logo.svg|وصلة=جَوَّهَ|18بك|صفحة ويكاموس]] · الجذر: جوه · ([[toolforge:ar-senses/review/L1534145|رابط المُفردة في الأداة]]) المعنى بهذا التصريف خطأ، لم أعثر على جوّه فلانا أي جعله وجيها، ولم أجد جوّه السقاء أي رقعه بل وجدت جواه في معجم متن اللغة. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:48، 27 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك، المشكلة هي أن الأداة أخذت الجذر (جَوَهَ) وألحقت به معنى الفرع (وجَّهَ أو أَوْجَهَ، كحال: أَوْجَهْتُهُ أنا ووَجَّهْتُهُ)، سوف نعمل على إصلاحها. :{{ر|ForzaGreen}} خطوات قادمة: :#يجب أن نتوثَّق من أن الأداة تُميِّزُ الجذر عن الفرع. في هذه الحالة، أخذت الأداة الجذر ('''جَوَهَ''') وشكَّلتهُ ('''جَوَّهَ''')، ثم ألحقَتْ به معنى خاطئًا للمشتق. :#بناءً على ما نراهُ هنا وقي حالات أخرى، نحتاج إلى '''خيار للمراجع لتعديل عنوان الصفحة'''، فلو أمكنهُ تبديل العنوان في هذه الحالة إلى '''وجَّهَ''' أو '''أَوْجَهَ''' لكان صحيحًا. :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 13:54، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: سَدَسَ (L1547049) == '''سَدَسَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1547049|18بك|ويكي بيانات: L1547049]] [[ملف:Wiktionary-logo.svg|وصلة=سَدَسَ|18بك|صفحة ويكاموس]] · الجذر: سدس · ([[toolforge:ar-senses/review/L1547049|رابط المُفردة في الأداة]]) المعنى الثاني مكرر، استبدلته وأضفت مصادر. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:04، 28 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك ونعمل على التوثّق من مسألة تكرار المعاني --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 13:58، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: تَسَدَّى (L1536864) == '''تَسَدَّى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1536864|18بك|ويكي بيانات: L1536864]] [[ملف:Wiktionary-logo.svg|وصلة=تَسَدَّى|18بك|صفحة ويكاموس]] · الجذر: سدي · ([[toolforge:ar-senses/review/L1536864|رابط المُفردة في الأداة]]) خلل في رقم صفحة القاموس المحيط، ولا توجد شواهد قوية على المعنى الأول، أظن أن المفردة بحاجة لمراجعة وإعادة ترتيب المعاني.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:44، 29 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} متفّق، {{اقتباس مضمن|والحائكُ يُسَدِّي الثَّوْبَ ويَتَسَدّاه}} أي يحيكه لنفسه. :{{ر|ForzaGreen}} يبدو أن النموذج اختلَطَ عليه الأمر أثناء دمج المعاني، ربما خصوصًا من لسان العرب ({{اقتباس مضمن|والحائكُ يُسَدِّي الثَّوْبَ ويَتَسَدّاه}})، فخرجَ بالمعنى المبتدع: {{اقتباس مضمن|تَسَدَّى الثوبَ: أقام سَداه لنفسه}}، وليس له مثيل في المصادر. :'''الخطوات القادمة المقترحة''': أشتَبِهُ في أن النموذج يفقد موثوقيته حين دَمْجَ المعاني من عددٍ كبير من المصادر (5 مصادر في هذه الحالة)، '''أقترح وَضْعَ حدّ أعلى للمصادر التي نستخدمها في استخراج المعنى، ربما 3 للوقت الحاضر'''. :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:10، 6 أغسطس 2026 (ت ع م). ::وضع حد للمصادر آليا قد يحرم المفردة من المصدر الأقوى والأدق. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:30، 6 أغسطس 2026 (ت ع م) :{{أصلح}} الخلل في رقم صفحة القاموس المحيط، لهذه المُفردة ولمفردات أخرى. يبدو أن المشكل كان سببه عشوائية النموذج اللغوي، إذ كان يُغيِّر رقم الصفحة في أقل من 1% من الحالات. عدّلتُ أداة توليد المعاني حتى لا يتكرر الخطأ. :بالنسبة للمصادر، أُفضل الإبقاء عليها جميعا. سنُجرب مع {{مس|عباد ديرانية}} تعديل تعليمات النموذج لتحسين المُخْرَجات ولإصلاح مشاكل أخرى، لا سيما المعاني المُكررة. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 23:47، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَسَافَدَ (L1497488) == '''تَسَافَدَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1497488|18بك|ويكي بيانات: L1497488]] [[ملف:Wiktionary-logo.svg|وصلة=تَسَافَدَ|18بك|صفحة ويكاموس]] · الجذر: سفد · ([[toolforge:ar-senses/review/L1497488|رابط المُفردة في الأداة]]) اكتفيت بالمعنى الأول بسبب التكرار.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 11:51، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} ملاحظة للعمل على تكرار المعاني، المعنى 1 و2 متماثلان والثاني هو الأوضح للمستخدم المعاصر --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:13، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: سَافَحَ (L1487289) == '''سَافَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487289|18بك|ويكي بيانات: L1487289]] [[ملف:Wiktionary-logo.svg|وصلة=سَافَحَ|18بك|صفحة ويكاموس]] · الجذر: سفح · ([[toolforge:ar-senses/review/L1487289|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:42، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} حالة تكرار أخرى مؤكدة في المعنى 1 والمعنى 2 --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:14، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: تَرَأَّمَ (L1535813) == '''تَرَأَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1535813|18بك|ويكي بيانات: L1535813]] [[ملف:Wiktionary-logo.svg|وصلة=تَرَأَّمَ|18بك|صفحة ويكاموس]] · الجذر: رأم · ([[toolforge:ar-senses/review/L1535813|رابط المُفردة في الأداة]]) دمجت المعنيين وصححت رقم الجزء والصفحة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:58، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} حالة تكرار مؤكّدة بين المعنى 1 و2، كما يأتي: :#{{اقتباس مضمن|تَرَأَّمَ الشيءَ: أحبَّه وألِفَه وعطف عليه وترحم عليه}} :#{{اقتباس مضمن|تَرَأَّمَ الصبيَّ: ترحَّم عليه}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:26، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: جَاوَى (L1534151) == '''جَاوَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534151|18بك|ويكي بيانات: L1534151]] [[ملف:Wiktionary-logo.svg|وصلة=جَاوَى|18بك|صفحة ويكاموس]] · الجذر: جوي · ([[toolforge:ar-senses/review/L1534151|رابط المُفردة في الأداة]]) خطأ: الصفحة 'جَاوَى' موجودة بالفعل <!-- يظهر هكذا: خطأ: الصفحة 'جَاوَى' موجودة بالفعل. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:15، 30 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} أتقصد أنكَ أنشأتَ الصفحة سابقًا عبر الأداة ثم ظهرت لك مرة أخرى في أداة مراجعة المعاني؟ --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:27، 6 أغسطس 2026 (ت ع م). ::مرحبا {{ر|عباد ديرانية}} أعتقد أن الخلل هو وجود صفحة مكررة في ويكي بيانات يلزم دمجها، تحياتي لك. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:59، 6 أغسطس 2026 (ت ع م) :::+أضيفُ الاقتراح الممتاز '''إضافة تنبيهٍ بالخط الأحمر إلى الأداة في حال لو أن الصفحة أُنْشِأَتْ وحُذِفَتْ سابقًا''' تنبيهًا للمستخدم --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 16:07، 6 أغسطس 2026 (ت ع م). ::::هذا المشكل تكرر مرات عديدة (انظر النقاش أعلاه عن الفعل '''حَلَّى''') والسبب هو المُفردات التي تشترك في نفس الجذر. حاليا لا يوجد حل تقني للمسألة، لكنها في بالي وسأفكر في حل. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:48، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَجَاذَى (L1533824) == '''تَجَاذَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533824|18بك|ويكي بيانات: L1533824]] [[ملف:Wiktionary-logo.svg|وصلة=تَجَاذَى|18بك|صفحة ويكاموس]] · الجذر: جذي · ([[toolforge:ar-senses/review/L1533824|رابط المُفردة في الأداة]]) خطأ: الصفحة 'تَجَاذَى' موجودة بالفعل <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:19، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} هذه ملاحظة متكرّرة من المستخدمين، يظهر أننا نحتاجُ إلى '''تحديث الأداة بوتيرة يومية لإزالة الصفحات المنشأة سابقًا'''، إلا لو كان هذا خطأً تقنيًا مختلفًا يُسبِّبُ التكرار --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:48، 6 أغسطس 2026 (ت ع م). ::كنت أصلحت هذه الكلمة مع كلمات أخرى لكن لم أصلح بعد مصدر الخطأ، وهو الأفعال التي لها جذور مختلفة لكنها تشترك في نفس الصيغة. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 17:51، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَجْذَى (L1533823) == '''أَجْذَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533823|18بك|ويكي بيانات: L1533823]] [[ملف:Wiktionary-logo.svg|وصلة=أَجْذَى|18بك|صفحة ويكاموس]] · الجذر: جذي · ([[toolforge:ar-senses/review/L1533823|رابط المُفردة في الأداة]]) خطأ: الصفحة 'أَجْذَى' موجودة بالفعل <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:20، 30 يوليو 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: زَأْزَأَ (L1536388) == '''زَأْزَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1536388|18بك|ويكي بيانات: L1536388]] [[ملف:Wiktionary-logo.svg|وصلة=زَأْزَأَ|18بك|صفحة ويكاموس]] · الجذر: زأزأ · ([[toolforge:ar-senses/review/L1536388|رابط المُفردة في الأداة]]) حذفت المعنى الخامس لأنه مزيد بتاء في المراجع.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:35، 4 أغسطس 2026 (ت ع م) :{{ر|Michel Bakni}} المعنى الخامس مزيدٌ بتاء التأنيث، فهل نُنْشِئُ له صفحةً منفصلةً برأيك أم نضيفه إلى ذات الصفحة مع تحويلة؟ :شرح المعنى الخامس: {{اقتباس مضمن|زَأْزَأَتِ المرأةُ: مشت وحرّكت أعطافها كمشية القِصار}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:33، 6 أغسطس 2026 (ت ع م). ::نعم، يلزم إنشاء صفحة لكل فعل بكل تصريف، هذا التصريف: المؤنث المفرد الغائب. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 14:36، 6 أغسطس 2026 (ت ع م) :::{{ر|ForzaGreen}} إذًا يلزمنا التوثّق من تمييز النموذج للمؤنّث وتخصيصه صفحة مستقلّة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:54، 6 أغسطس 2026 (ت ع م). ::::أنا رأيي كل المعاني والأمثلة تبقى في صفحة الفعل الرئيسية، والصيغ المُصرفة تحيل إلى الصفحة الرئيسية. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 15:06، 6 أغسطس 2026 (ت ع م) ::::متّفق مع وائل هنا بالواقع، الأفضل هو تخفيف الإحالات إن أمكن وجَمْع تصريفات المذكر والمؤنث والعدد بصفحة واحدة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:52، 6 أغسطس 2026 (ت ع م). :::::لكن الذي يراجع القوالب يفهم أن لكل تصريف صفحة خاصة به لذلك أنا أتفق مع الزميل ميشيل على إنشاء صفحة لكل تصريف، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:10، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَزْعَلَ (L1476504) == '''أَزْعَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1476504|18بك|ويكي بيانات: L1476504]] [[ملف:Wiktionary-logo.svg|وصلة=أَزْعَلَ|18بك|صفحة ويكاموس]] · الجذر: زعل · ([[toolforge:ar-senses/review/L1476504|رابط المُفردة في الأداة]]) دمجت المعنى الأول والثالث لأن المعنى الثالث مكرر عن الأول.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 10:04، 4 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك ونعمل على معالجة مسألة المعاني المُكرَّرة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:34، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: زَعِلَ (L1487695) == '''زَعِلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487695|18بك|ويكي بيانات: L1487695]] [[ملف:Wiktionary-logo.svg|وصلة=زَعِلَ|18بك|صفحة ويكاموس]] · الجذر: زعل · ([[toolforge:ar-senses/review/L1487695|رابط المُفردة في الأداة]]) المعنى الأول (مرح) غير موجود في المراجع، والمعنى الثالث بحاجة إلى تدقيق، تحتاج المفردة إلى مراجعة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 10:41، 4 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} من معجم العين: {{اقتباس مضمن|الزَّعِل: النشيط '''الأشر'''. زَعِلَ يَزْعَلُ زَعَلًا.}}، الأشر هنا بمعنى المرح (مصدر [https://www.islamweb.net/ar/library/content/122/137/%D8%A3%D8%B4%D8%B1 من لسان العرب]). :{{ر|ForzaGreen}} المعنى الثالث فيه اختلاطٌ بين معانٍ عِدّة، مثل: {{اقتباس مضمن|والزعل: '''المتضور جوعا'''}} (الجوهري) و{{اقتباس مضمن|الزَّعَلُ '''كالعَلَزِ مِنَ المَرَض'''}} (لسان العرب)، والمعنى في الأداة جاءَ: {{اقتباس مضمن|زَعِلَ من المرض أو الجوع: تضوّر وتلوّى وقلِق فلم يستقر}}. :'''الخطوات القادمة المقترحة''': أشتبه أن النموذج اختلط عليه دمج المعنى عبر 5 مصادر، والأفضل والأسهل للمراجع (فمن الصعب جدًا تقصّي 5 مراجع مختلفة) أن '''نضعَ حدًا بين مصدرَيْن إلى ثلاثة مصادر للمعنى الواحد''' --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:48، 6 أغسطس 2026 (ت ع م). ::نعم، في الحقيقة تحتوي بعض المفردات على مراجع كثيرة وأتفق معك على الاستشهاد بمرجعين أو ثلاث بأقصى حد لكن لو يكون انتقاء المراجع يدويا أفضل لاختيار الأنسب والأقرب إلا إذا كان الاختيار الآلي قادرا على انتقاء المرجع الأنسب أو الأقرب أو الأدق. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:21، 6 أغسطس 2026 (ت ع م) :::إشارة {{ر|عباد ديرانية}} أرجو مراجعة تقليل المراجع آليا فقد تحرم الأداةُ المفردةَ من المراجع الأدق وتضع المراجع الأبعد. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:23، 6 أغسطس 2026 (ت ع م) ::::{{ر|أبو هشام}} لا بأس بذلك، لكن إن تركنا للمُرَاجِعِ اختيار المصادر الأدق فهذا يعني أن عليهم مراجعة 5 - 6 مصادر في بعض الحالات، فما هو الأفضل بالنسبة لك بين هذه الخيارات؟ أهو انتقاء المصادر الأفضل يدويًا أم تقليل عدد المصادر التي وجبت مراجعتها؟ --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:51، 6 أغسطس 2026 (ت ع م). :::::{{ر|عباد ديرانية}} أميل إلى الانتقاء اليدوي أو البشري دون تقليل للمصادر فالمراجِع قادر على انتقاء المصدر الأنسب للمفردة، وإن كان للزملاء رأي آخر فلا أعترض، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:15، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَلَكَ (L1502490) == '''أَلَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1502490|18بك|ويكي بيانات: L1502490]] [[ملف:Wiktionary-logo.svg|وصلة=أَلَكَ|18بك|صفحة ويكاموس]] · الجذر: ألك · ([[toolforge:ar-senses/review/L1502490|رابط المُفردة في الأداة]]) حذفت المرجع الأخير من المعنى الثاني لأن فيه خطأ فقد استُشهد بصفحة 132 من معجم متن اللغة وفيها (أَلَكَ لَجَأٌ يَا فلَان) وهو استشهاد خاطئ لأن (ألك) هنا استفهام وليست فعل.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:33، 5 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك وسوف نعمل على زيادة دقة ضبط المعاني المتقاربة بالأداة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:49، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: اِبْتَسَطَ (L1533014) == '''اِبْتَسَطَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533014|18بك|ويكي بيانات: L1533014]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَسَطَ|18بك|صفحة ويكاموس]] · الجذر: بسط · ([[toolforge:ar-senses/review/L1533014|رابط المُفردة في الأداة]]) غير موثقة، لا يوجد فيها مصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:04، 5 أغسطس 2026 (ت ع م) :{{ر|ForzaGreen}} حالة غريبةٌ ليس فيه أي مصدر للمعنى المستخرج! --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:49، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: أَبْشَكَ (L1533037) == '''أَبْشَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533037|18بك|ويكي بيانات: L1533037]] [[ملف:Wiktionary-logo.svg|وصلة=أَبْشَكَ|18بك|صفحة ويكاموس]] · الجذر: بشك · ([[toolforge:ar-senses/review/L1533037|رابط المُفردة في الأداة]]) هذه اللفظة بحاجة لمراجعة فلها عدة معان.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:50، 6 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} هل لكَ أن تُوضِحَ المقصود؟ لم أجد كلمة أبشك في المرجع أصلًا للأسف --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:52، 6 أغسطس 2026 (ت ع م). ::{{ر|عباد ديرانية}} وجدت هذا ('''أبشك''' الكلام: كذب فيه: تخرص فيه كاذبًا.) في معجم متن اللغة ج=1 ص=299، وهذا أيضا (وبَشَكَ الْكَلَامَ يَبْشُكه بَشْكًا و'''أبشَكه''': تَخَرَّصهُ كَاذِبًا،) في لسان العرب ج=10 ص=400، ولم أجد أن معناها '''أسرع'''، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:43، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَاطَأَ (L1496404) == '''بَاطَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1496404|18بك|ويكي بيانات: L1496404]] [[ملف:Wiktionary-logo.svg|وصلة=بَاطَأَ|18بك|صفحة ويكاموس]] · الجذر: بطأ · ([[toolforge:ar-senses/review/L1496404|رابط المُفردة في الأداة]]) لا يوجد التصريف في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:43، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَبْطَحَ (L1533063) == '''أَبْطَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533063|18بك|ويكي بيانات: L1533063]] [[ملف:Wiktionary-logo.svg|وصلة=أَبْطَحَ|18بك|صفحة ويكاموس]] · الجذر: بطح · ([[toolforge:ar-senses/review/L1533063|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:47، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَطَّحَ (L1533066) == '''بَطَّحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533066|18بك|ويكي بيانات: L1533066]] [[ملف:Wiktionary-logo.svg|وصلة=بَطَّحَ|18بك|صفحة ويكاموس]] · الجذر: بطح · ([[toolforge:ar-senses/review/L1533066|رابط المُفردة في الأداة]]) هل هي بطَح أم بطّح؟<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:48، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَطْرَقَ (L1533070) == '''تَبَطْرَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533070|18بك|ويكي بيانات: L1533070]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَطْرَقَ|18بك|صفحة ويكاموس]] · الجذر: بطرق · ([[toolforge:ar-senses/review/L1533070|رابط المُفردة في الأداة]]) هذا الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:58، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَهُؤَ (L1545462) == '''بَهُؤَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1545462|18بك|ويكي بيانات: L1545462]] [[ملف:Wiktionary-logo.svg|وصلة=بَهُؤَ|18بك|صفحة ويكاموس]] · الجذر: بهأ · ([[toolforge:ar-senses/review/L1545462|رابط المُفردة في الأداة]]) معناها (أنس) كما في لسان العرب ج=1 ص=35 ومعجم متن اللغة ج=1 ص=353.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:29، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَاهَتَ (L1533268) == '''تَبَاهَتَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533268|18بك|ويكي بيانات: L1533268]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَاهَتَ|18بك|صفحة ويكاموس]] · الجذر: بهت · ([[toolforge:ar-senses/review/L1533268|رابط المُفردة في الأداة]]) حسنتُ المعنى وأضفت مصدرين.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:01، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَعِرَ (L1544067) == '''بَعِرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1544067|18بك|ويكي بيانات: L1544067]] [[ملف:Wiktionary-logo.svg|وصلة=بَعِرَ|18بك|صفحة ويكاموس]] · الجذر: بعر · ([[toolforge:ar-senses/review/L1544067|رابط المُفردة في الأداة]]) '''[[بَعِرَ]]''' الجمل بالكسر صار بعيرا كما في القاموس المحيط ص=352. المفردة (بَعَرَ) وهي موجودة في المشروع '''[[بَعَرَ]]''' فيلزم تحديثها أو حذفها لأنها خاطئة انظر القاموس المحيط ص=694 وإنشاء صفحة جديدة ببيانات صحيحة هي البيانات الموجودة في الأداة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:31، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَعَّقَ (L1533113) == '''بَعَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533113|18بك|ويكي بيانات: L1533113]] [[ملف:Wiktionary-logo.svg|وصلة=بَعَّقَ|18بك|صفحة ويكاموس]] · الجذر: بعق · ([[toolforge:ar-senses/review/L1533113|رابط المُفردة في الأداة]]) هل هي بَعَّقَ بالتشديد أم بَعَقَ بالتخفيف؟<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:02، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَغْزَلَ (L1533126) == '''تَبَغْزَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533126|18بك|ويكي بيانات: L1533126]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَغْزَلَ|18بك|صفحة ويكاموس]] · الجذر: بغزل · ([[toolforge:ar-senses/review/L1533126|رابط المُفردة في الأداة]]) المعنى الصحيح '''تبختر''' وله شواهد في أربعة معاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:13، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَقَّمَ (L1533154) == '''بَقَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533154|18بك|ويكي بيانات: L1533154]] [[ملف:Wiktionary-logo.svg|وصلة=بَقَّمَ|18بك|صفحة ويكاموس]] · الجذر: بقم · ([[toolforge:ar-senses/review/L1533154|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:44، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَقَّمَ (L1533153) == '''تَبَقَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533153|18بك|ويكي بيانات: L1533153]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَقَّمَ|18بك|صفحة ويكاموس]] · الجذر: بقم · ([[toolforge:ar-senses/review/L1533153|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:50، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَكِئَ (L1543356) == '''بَكِئَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543356|18بك|ويكي بيانات: L1543356]] [[ملف:Wiktionary-logo.svg|وصلة=بَكِئَ|18بك|صفحة ويكاموس]] · الجذر: بكأ · ([[toolforge:ar-senses/review/L1543356|رابط المُفردة في الأداة]]) حذفت المعنى الأول لأنه غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:13، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْتَلَتَ (L1533174) == '''اِبْتَلَتَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533174|18بك|ويكي بيانات: L1533174]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَلَتَ|18بك|صفحة ويكاموس]] · الجذر: بلت · ([[toolforge:ar-senses/review/L1533174|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:35، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَلْدَحَ (L1533193) == '''تَبَلْدَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533193|18بك|ويكي بيانات: L1533193]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَلْدَحَ|18بك|صفحة ويكاموس]] · الجذر: بلدح · ([[toolforge:ar-senses/review/L1533193|رابط المُفردة في الأداة]]) أضفت المعنى الثاني، لم تستخرجه الأداة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:54، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْلَنْدَكَ (L1533194) == '''اِبْلَنْدَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533194|18بك|ويكي بيانات: L1533194]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْلَنْدَكَ|18بك|صفحة ويكاموس]] · الجذر: بلدك · ([[toolforge:ar-senses/review/L1533194|رابط المُفردة في الأداة]]) المعنى خاطئ، والمفردة غير موجودة في المصدر. :المعنى الصحيح ('''اتسع''') موجود في أربعة معاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:00، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَلَّرَ (L1533196) == '''تَبَلَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533196|18بك|ويكي بيانات: L1533196]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَلَّرَ|18بك|صفحة ويكاموس]] · الجذر: بلر · ([[toolforge:ar-senses/review/L1533196|رابط المُفردة في الأداة]]) إملاء المفردة خاطئ، والصحيح ('''تَرَبَّل''') كما في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:08، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَبَاضَ (L1533353) == '''اِسْتَبَاضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533353|18بك|ويكي بيانات: L1533353]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَبَاضَ|18بك|صفحة ويكاموس]] · الجذر: بيض · ([[toolforge:ar-senses/review/L1533353|رابط المُفردة في الأداة]]) الفعل في المرجع استبيض وليس استباض --[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:36، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَقَّعَ (L1533145) == '''بَقَّعَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533145|18بك|ويكي بيانات: L1533145]] [[ملف:Wiktionary-logo.svg|وصلة=بَقَّعَ|18بك|صفحة ويكاموس]] · الجذر: بقع · ([[toolforge:ar-senses/review/L1533145|رابط المُفردة في الأداة]]) حذفت المعنى الرابع لأنه ورد بالتخفيف.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:18، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِنْبَقَّ (L1533147) == '''اِنْبَقَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533147|18بك|ويكي بيانات: L1533147]] [[ملف:Wiktionary-logo.svg|وصلة=اِنْبَقَّ|18بك|صفحة ويكاموس]] · الجذر: بقق · ([[toolforge:ar-senses/review/L1533147|رابط المُفردة في الأداة]]) المعنى خاطئ ولا شواهد عليه في المعاجم والمفردة الموجودة ('''انبعق''') وليس انبق.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:38، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَلَعَ (L1480240) == '''بَلَعَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1480240|18بك|ويكي بيانات: L1480240]] [[ملف:Wiktionary-logo.svg|وصلة=بَلَعَ|18بك|صفحة ويكاموس]] · الجذر: بلع · ([[toolforge:ar-senses/review/L1480240|رابط المُفردة في الأداة]]) خطأ في التشكيل فالفعل بَلِعَ وليس بَلَعَ كما في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:34، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْتَلَقَ (L1533220) == '''اِبْتَلَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533220|18بك|ويكي بيانات: L1533220]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَلَقَ|18بك|صفحة ويكاموس]] · الجذر: بلق · ([[toolforge:ar-senses/review/L1533220|رابط المُفردة في الأداة]]) لم أجد المفردة في المعاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:06، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَلُقَ (L1543358) == '''بَلُقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543358|18بك|ويكي بيانات: L1543358]] [[ملف:Wiktionary-logo.svg|وصلة=بَلُقَ|18بك|صفحة ويكاموس]] · الجذر: بلق · ([[toolforge:ar-senses/review/L1543358|رابط المُفردة في الأداة]]) المفردة بالكسر وليس بالضم، انظر '''[[بَلِقَ]]'''.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:52، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْذَارَّ (L1534290) == '''اِحْذَارَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534290|18بك|ويكي بيانات: L1534290]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْذَارَّ|18بك|صفحة ويكاموس]] · الجذر: حذر · ([[toolforge:ar-senses/review/L1534290|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:49، 9 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاتَنَ (L1534214) == '''تَحَاتَنَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534214|18بك|ويكي بيانات: L1534214]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاتَنَ|18بك|صفحة ويكاموس]] · الجذر: حتن · ([[toolforge:ar-senses/review/L1534214|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:31، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَتَنَ (L1534213) == '''اِحْتَتَنَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534213|18بك|ويكي بيانات: L1534213]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَتَنَ|18بك|صفحة ويكاموس]] · الجذر: حتن · ([[toolforge:ar-senses/review/L1534213|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:37، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاتَّ (L1496477) == '''تَحَاتَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1496477|18بك|ويكي بيانات: L1496477]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاتَّ|18بك|صفحة ويكاموس]] · الجذر: حتت · ([[toolforge:ar-senses/review/L1496477|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:36، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْزَوْزَى (L1534387) == '''اِحْزَوْزَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534387|18بك|ويكي بيانات: L1534387]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْزَوْزَى|18بك|صفحة ويكاموس]] · الجذر: حزو · ([[toolforge:ar-senses/review/L1534387|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصدر ولها أكثر من معنى في المصادر الأخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:02، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَذَّقَ (L1484084) == '''تَحَذَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1484084|18بك|ويكي بيانات: L1484084]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَذَّقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1484084|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصادر الموجودة، استبدلتها بمصادر أخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:02، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَذَّقَ (L1534295) == '''حَذَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534295|18بك|ويكي بيانات: L1534295]] [[ملف:Wiktionary-logo.svg|وصلة=حَذَّقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1534295|رابط المُفردة في الأداة]]) لم أجد الفعل المتعدي في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:14، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَذِقَ (L1546050) == '''حَذِقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1546050|18بك|ويكي بيانات: L1546050]] [[ملف:Wiktionary-logo.svg|وصلة=حَذِقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1546050|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه تفسير لمفردة فرس وهو مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:56، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَحْزَرَ (L1534363) == '''أَحْزَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534363|18بك|ويكي بيانات: L1534363]] [[ملف:Wiktionary-logo.svg|وصلة=أَحْزَرَ|18بك|صفحة ويكاموس]] · الجذر: حزر · ([[toolforge:ar-senses/review/L1534363|رابط المُفردة في الأداة]]) حذفت المعنى الأول لأنه خاطئ وغير مرتبط بالمفردة بل يرتبط بـ (أحزّ).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:06، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَزَّ (L1534366) == '''اِحْتَزَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534366|18بك|ويكي بيانات: L1534366]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَزَّ|18بك|صفحة ويكاموس]] · الجذر: حزز · ([[toolforge:ar-senses/review/L1534366|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:12، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَزْمَرَ (L1534382) == '''حَزْمَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534382|18بك|ويكي بيانات: L1534382]] [[ملف:Wiktionary-logo.svg|وصلة=حَزْمَرَ|18بك|صفحة ويكاموس]] · الجذر: حزمر · ([[toolforge:ar-senses/review/L1534382|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لارتباطه بـ ([[حَزْفَرَ]]).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:56، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاسَى (L1534416) == '''تَحَاسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534416|18بك|ويكي بيانات: L1534416]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاسَى|18بك|صفحة ويكاموس]] · الجذر: حسو · ([[toolforge:ar-senses/review/L1534416|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 22:10، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَاسَى (L1534418) == '''حَاسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534418|18بك|ويكي بيانات: L1534418]] [[ملف:Wiktionary-logo.svg|وصلة=حَاسَى|18بك|صفحة ويكاموس]] · الجذر: حسو · ([[toolforge:ar-senses/review/L1534418|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 22:16، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَاقَ (L1534738) == '''اِحْتَاقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534738|18بك|ويكي بيانات: L1534738]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَاقَ|18بك|صفحة ويكاموس]] · الجذر: حيق · ([[toolforge:ar-senses/review/L1534738|رابط المُفردة في الأداة]]) دمجت المعنيين لأنها مكرران.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 04:15، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَفَظَ (L1485699) == '''اِحْتَفَظَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1485699|18بك|ويكي بيانات: L1485699]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَفَظَ|18بك|صفحة ويكاموس]] · الجذر: حفظ · ([[toolforge:ar-senses/review/L1485699|رابط المُفردة في الأداة]]) لم تضع الأداة بعض أرقام الصفحات والأجزاء.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:19، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَمْحَمَ (L1476725) == '''حَمْحَمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1476725|18بك|ويكي بيانات: L1476725]] [[ملف:Wiktionary-logo.svg|وصلة=حَمْحَمَ|18بك|صفحة ويكاموس]] · الجذر: حمحم · ([[toolforge:ar-senses/review/L1476725|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 17:11، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَيَّفَ (L1534760) == '''تَحَيَّفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534760|18بك|ويكي بيانات: L1534760]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَيَّفَ|18بك|صفحة ويكاموس]] · الجذر: حيف · ([[toolforge:ar-senses/review/L1534760|رابط المُفردة في الأداة]]) دمجت المعنيين.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:38، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَشَّكَ (L1534439) == '''تَحَشَّكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534439|18بك|ويكي بيانات: L1534439]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَشَّكَ|18بك|صفحة ويكاموس]] · الجذر: حشك · ([[toolforge:ar-senses/review/L1534439|رابط المُفردة في الأداة]]) حرف الشين مشدد.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:12، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْوَالَّ (L1534743) == '''اِحْوَالَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534743|18بك|ويكي بيانات: L1534743]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْوَالَّ|18بك|صفحة ويكاموس]] · الجذر: حول · ([[toolforge:ar-senses/review/L1534743|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:59، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَحَاضَ (L1534730) == '''اِسْتَحَاضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534730|18بك|ويكي بيانات: L1534730]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَحَاضَ|18بك|صفحة ويكاموس]] · الجذر: حوض · ([[toolforge:ar-senses/review/L1534730|رابط المُفردة في الأداة]]) الموجود في المصادر استحوض وليس استحاض.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 17:05، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَاشَ (L1534721) == '''اِحْتَاشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534721|18بك|ويكي بيانات: L1534721]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَاشَ|18بك|صفحة ويكاموس]] · الجذر: حوش · ([[toolforge:ar-senses/review/L1534721|رابط المُفردة في الأداة]]) التصريف الموجود في المصادر (احتوش) وليس احتاش.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:34، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَحَاسَ (L1534716) == '''اِسْتَحَاسَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534716|18بك|ويكي بيانات: L1534716]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَحَاسَ|18بك|صفحة ويكاموس]] · الجذر: حوس · ([[toolforge:ar-senses/review/L1534716|رابط المُفردة في الأداة]]) استحوس وليس استحاس كما في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:51، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَزْأَلَ (L1534358) == '''حَزْأَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534358|18بك|ويكي بيانات: L1534358]] [[ملف:Wiktionary-logo.svg|وصلة=حَزْأَلَ|18بك|صفحة ويكاموس]] · الجذر: حزأل · ([[toolforge:ar-senses/review/L1534358|رابط المُفردة في الأداة]]) مفردة خاطئة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:52، 14 أغسطس 2026 (ت ع م) :فعلا، يبدو أن المُفردة حَزْأَلَ لا توجد. في جدول الأفعال، عندنا فعل واحد من الجذر "ح ز أ ل"، وهو على وزن '''فعلل'''، أي حَزْأَلَ. لكن يبدو أن هذا خاطئ، و أن الوزن الصحيح هو افعللّ، أي احْزَأَلَّ، وهو الذي ذُكِر في معجم [https://app.turath.io/book/7030?page=14881 تاج العروس]. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 21:19، 14 أغسطس 2026 (ت ع م) :ورد في اللسان أيضًا احزألَّ بمعنى ارتفع وبمعنى اجتمع. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 21:50، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَنَّشَ (L1534669) == '''حَنَّشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534669|18بك|ويكي بيانات: L1534669]] [[ملف:Wiktionary-logo.svg|وصلة=حَنَّشَ|18بك|صفحة ويكاموس]] · الجذر: حنش · ([[toolforge:ar-senses/review/L1534669|رابط المُفردة في الأداة]]) هل هي حَنَّشَ أم حَنَشَ؟ وأظن أن لها معان أخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:28، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْخَنَدَّ (L1532850) == '''اِبْخَنَدَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1532850|18بك|ويكي بيانات: L1532850]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْخَنَدَّ|18بك|صفحة ويكاموس]] · الجذر: بخند · ([[toolforge:ar-senses/review/L1532850|رابط المُفردة في الأداة]]) الفعل في المرجع اخْبَنْدَى، لا وجود المفردة اِبْخَنَدَّ--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 18:52، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَمْيَرَ (L1534650) == '''تَحَمْيَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534650|18بك|ويكي بيانات: L1534650]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَمْيَرَ|18بك|صفحة ويكاموس]] · الجذر: حمير · ([[toolforge:ar-senses/review/L1534650|رابط المُفردة في الأداة]]) خطأ في استخراج المعنى، معنى تحمير أي ساء خلقه كما في المصادر أم هذه فيجب أن تكون بغير الياء أي تَحَمَّر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:02، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَبَشَ (L1534178) == '''اِحْتَبَشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534178|18بك|ويكي بيانات: L1534178]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَبَشَ|18بك|صفحة ويكاموس]] · الجذر: حبش · ([[toolforge:ar-senses/review/L1534178|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:38، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَثَّرَ (L1534223) == '''تَحَثَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534223|18بك|ويكي بيانات: L1534223]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَثَّرَ|18بك|صفحة ويكاموس]] · الجذر: حثر · ([[toolforge:ar-senses/review/L1534223|رابط المُفردة في الأداة]]) المعنى لفعل حثر، الرجاء إصلاحه.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:52، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَثْرَفَ (L1534226) == '''حَثْرَفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534226|18بك|ويكي بيانات: L1534226]] [[ملف:Wiktionary-logo.svg|وصلة=حَثْرَفَ|18بك|صفحة ويكاموس]] · الجذر: حثرف · ([[toolforge:ar-senses/review/L1534226|رابط المُفردة في الأداة]]) المعنى الصحيح زعزعه وحركه، انظر تاج العروس جزء 23 صفحة 118.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:09، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَظْرَبَ (L1534501) == '''تَحَظْرَبَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534501|18بك|ويكي بيانات: L1534501]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَظْرَبَ|18بك|صفحة ويكاموس]] · الجذر: حظرب · ([[toolforge:ar-senses/review/L1534501|رابط المُفردة في الأداة]]) دًمج المعنيان ووُضعت أمثلة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:32، 16 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَافَلَ (L1534527) == '''حَافَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534527|18بك|ويكي بيانات: L1534527]] [[ملف:Wiktionary-logo.svg|وصلة=حَافَلَ|18بك|صفحة ويكاموس]] · الجذر: حفل · ([[toolforge:ar-senses/review/L1534527|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر المذكورة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:59، 16 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْقَوْقَفَ (L1489579) == '''اِحْقَوْقَفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1489579|18بك|ويكي بيانات: L1489579]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْقَوْقَفَ|18بك|صفحة ويكاموس]] · الجذر: حقف · ([[toolforge:ar-senses/review/L1489579|رابط المُفردة في الأداة]]) المعاني الأربعة مكررة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:52، 17 أغسطس 2026 (ت ع م) == معجم مقاييس اللغة == مرحبا بالزملاء، روابط الكتاب الموجودة في الأداة غير دقيقة وقد كنت أظن أن الاختلاف في مفردة أو اثنتين لكن تبين لي أنها غير دقيقة في جميع المفردات، رقم الصفة صحيح ولكن الرابط بعيد عن الصفحة، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:56، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَكَرَ (L1478743) == '''اِحْتَكَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1478743|18بك|ويكي بيانات: L1478743]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَكَرَ|18بك|صفحة ويكاموس]] · الجذر: حكر · ([[toolforge:ar-senses/review/L1478743|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:42، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَكَّرَ (L1534555) == '''حَكَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534555|18بك|ويكي بيانات: L1534555]] [[ملف:Wiktionary-logo.svg|وصلة=حَكَّرَ|18بك|صفحة ويكاموس]] · الجذر: حكر · ([[toolforge:ar-senses/review/L1534555|رابط المُفردة في الأداة]]) أشك بوجود المفردة المشكلة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:56، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَمِضَ (L1543549) == '''حَمِضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543549|18بك|ويكي بيانات: L1543549]] [[ملف:Wiktionary-logo.svg|وصلة=حَمِضَ|18بك|صفحة ويكاموس]] · الجذر: حمض · ([[toolforge:ar-senses/review/L1543549|رابط المُفردة في الأداة]]) المعاني مختلطة لعدم وضوح حركة الميم في الفعل.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:57، 19 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَسَى (L1486741) == '''أَسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1486741|18بك|ويكي بيانات: L1486741]] [[ملف:Wiktionary-logo.svg|وصلة=أَسَى|18بك|صفحة ويكاموس]] · الجذر: أسي · ([[toolforge:ar-senses/review/L1486741|رابط المُفردة في الأداة]]) الفعل في المراجع أسا من الجذر أسو.--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:03، 20 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِخْتَبَلَ (L1534805) == '''اِخْتَبَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534805|18بك|ويكي بيانات: L1534805]] [[ملف:Wiktionary-logo.svg|وصلة=اِخْتَبَلَ|18بك|صفحة ويكاموس]] · الجذر: خبل · ([[toolforge:ar-senses/review/L1534805|رابط المُفردة في الأداة]]) المعنى الثاني مكرر، حذفته.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:03، 21 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَاتَلَ (L1487389) == '''تَخَاتَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487389|18بك|ويكي بيانات: L1487389]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَاتَلَ|18بك|صفحة ويكاموس]] · الجذر: ختل · ([[toolforge:ar-senses/review/L1487389|رابط المُفردة في الأداة]]) دُمِج المعنيان.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:09، 21 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَاجَأَ (L1534840) == '''تَخَاجَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534840|18بك|ويكي بيانات: L1534840]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَاجَأَ|18بك|صفحة ويكاموس]] · الجذر: خجأ · ([[toolforge:ar-senses/review/L1534840|رابط المُفردة في الأداة]]) لاحظت التباسا أو خلطا بين (تخاجأ وتخاجى وتخاجا).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:22، 22 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَارَقَ (L1534942) == '''تَخَارَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534942|18بك|ويكي بيانات: L1534942]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَارَقَ|18بك|صفحة ويكاموس]] · الجذر: خرق · ([[toolforge:ar-senses/review/L1534942|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:36، 22 أغسطس 2026 (ت ع م) mddp80k6qwdeqm57a8i1030ssds94o7 1099179 1099175 2026-08-22T16:47:08Z أبو هشام 20788 /* بلاغ من أداة مراجعة المعاني: دَآ (L1545136) */ قسم جديد 1099179 wikitext text/x-wiki {{رأس صفحة نقاش}} == بلاغ من أداة مراجعة المعاني: حَلَّى (L1534604) == '''حَلَّى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534604|18بك|ويكي بيانات: L1534604]] [[ملف:Wiktionary-logo.svg|وصلة=حَلَّى|18بك|صفحة ويكاموس]] · الجذر: حلو · ([[toolforge:ar-senses/review/L1534604|رابط المُفردة في الأداة]]) إبلاغ من الزميل {{مس|رِفْد}}: ''لا يمكن نشرها في ويكاموس عند الضغط على زر النشر يظهر: "خطأ: الصفحة موجودة بالفعل".'' --[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:27، 27 يوليو 2026 (ت ع م) :شكرا لك @[[مستخدم:رِفْد|رِفْد]] على الإبلاغ. المشكلة في الفعل حَلَّى (وأفعال آخرين) أَنَّه يُوَلَّدُ من جذرين: ح-ل-ي و ح-ل-و. في ويكي بيانات توجد وحدتان معجميتان، واحدة لكل فعل، لكن في ويكاموس لا يُمكن إنشاء صفحتين بنفس الاسم. سأفكر في حل لهذه المشكلة وأوافيك بالجديد. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:28، 27 يوليو 2026 (ت ع م) ::حالة أخرى حيث يشترك جذران في نفس صيغة الفعل: ::* جذر ت-ل-و على وزن تفعّل => [[تَتَلَّى]] ([https://ar-senses.toolforge.org/review/L1533461 رابط المُفردة في الأداة]). ::* جذر ت-ل-ي على وزن تفعّل => [[تَتَلَّى]] ::[[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 11:42، 27 يوليو 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَجَاشَ (L1534157) == '''اِسْتَجَاشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534157|18بك|ويكي بيانات: L1534157]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَجَاشَ|18بك|صفحة ويكاموس]] · الجذر: جيش · ([[toolforge:ar-senses/review/L1534157|رابط المُفردة في الأداة]]) المعنى الثاني غير موجود في المصدر في صفحة المفردة (ص=603) والحديث الموجود في صفحة 115 غير مفسر بهذا المعنى أيضا. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:40، 27 يوليو 2026 (ت ع م) <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> :{{ر|أبو هشام}} بخصوص المعنى الثاني، رجعتُ إلى ص=603 ووجدتُ المعنى حسب الوارد في الأداة: {{اقتباس مضمن|استجاش الأمير من مكان كذا: طلب جيشًا وجمعه. '''و- ت القدر: غلت.'''}} :{{ر|Michel Bakni}} بخصوص المعنى الثالث (ص=115)، يبدو المعنى صحيحًا لكن الأداة استَنْبَطَتْهُ من مثال وارد في المعجم لا من تعريف للكلمة، ما رأيك؟ :*الاقتباس من المصدر: {{اقتباس مضمن|فَمَرَّ الْجَيْشُ عَلَى غَطَفَانَ '''فَاسْتَجَاشُوهُمْ''' عَلَى بَنِي سُليم، فَهَزَمَتْ بَنُو سُلَيم جيشَ النُّعْمَانِ}} :*تعريف المعنى كما استخرجَتْهُ الأداة من النص السابق: {{اقتباس مضمن|اِسْتَجَاشَ القومَ على فلان: استنفرهم وحرّضهم عليه}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:23، 6 أغسطس 2026 (ت ع م). ::نعم أتفق مع هذا الطرح. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 14:25، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: جَوَّهَ (L1534145) == '''جَوَّهَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534145|18بك|ويكي بيانات: L1534145]] [[ملف:Wiktionary-logo.svg|وصلة=جَوَّهَ|18بك|صفحة ويكاموس]] · الجذر: جوه · ([[toolforge:ar-senses/review/L1534145|رابط المُفردة في الأداة]]) المعنى بهذا التصريف خطأ، لم أعثر على جوّه فلانا أي جعله وجيها، ولم أجد جوّه السقاء أي رقعه بل وجدت جواه في معجم متن اللغة. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:48، 27 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك، المشكلة هي أن الأداة أخذت الجذر (جَوَهَ) وألحقت به معنى الفرع (وجَّهَ أو أَوْجَهَ، كحال: أَوْجَهْتُهُ أنا ووَجَّهْتُهُ)، سوف نعمل على إصلاحها. :{{ر|ForzaGreen}} خطوات قادمة: :#يجب أن نتوثَّق من أن الأداة تُميِّزُ الجذر عن الفرع. في هذه الحالة، أخذت الأداة الجذر ('''جَوَهَ''') وشكَّلتهُ ('''جَوَّهَ''')، ثم ألحقَتْ به معنى خاطئًا للمشتق. :#بناءً على ما نراهُ هنا وقي حالات أخرى، نحتاج إلى '''خيار للمراجع لتعديل عنوان الصفحة'''، فلو أمكنهُ تبديل العنوان في هذه الحالة إلى '''وجَّهَ''' أو '''أَوْجَهَ''' لكان صحيحًا. :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 13:54، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: سَدَسَ (L1547049) == '''سَدَسَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1547049|18بك|ويكي بيانات: L1547049]] [[ملف:Wiktionary-logo.svg|وصلة=سَدَسَ|18بك|صفحة ويكاموس]] · الجذر: سدس · ([[toolforge:ar-senses/review/L1547049|رابط المُفردة في الأداة]]) المعنى الثاني مكرر، استبدلته وأضفت مصادر. --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:04، 28 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك ونعمل على التوثّق من مسألة تكرار المعاني --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 13:58، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: تَسَدَّى (L1536864) == '''تَسَدَّى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1536864|18بك|ويكي بيانات: L1536864]] [[ملف:Wiktionary-logo.svg|وصلة=تَسَدَّى|18بك|صفحة ويكاموس]] · الجذر: سدي · ([[toolforge:ar-senses/review/L1536864|رابط المُفردة في الأداة]]) خلل في رقم صفحة القاموس المحيط، ولا توجد شواهد قوية على المعنى الأول، أظن أن المفردة بحاجة لمراجعة وإعادة ترتيب المعاني.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:44، 29 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} متفّق، {{اقتباس مضمن|والحائكُ يُسَدِّي الثَّوْبَ ويَتَسَدّاه}} أي يحيكه لنفسه. :{{ر|ForzaGreen}} يبدو أن النموذج اختلَطَ عليه الأمر أثناء دمج المعاني، ربما خصوصًا من لسان العرب ({{اقتباس مضمن|والحائكُ يُسَدِّي الثَّوْبَ ويَتَسَدّاه}})، فخرجَ بالمعنى المبتدع: {{اقتباس مضمن|تَسَدَّى الثوبَ: أقام سَداه لنفسه}}، وليس له مثيل في المصادر. :'''الخطوات القادمة المقترحة''': أشتَبِهُ في أن النموذج يفقد موثوقيته حين دَمْجَ المعاني من عددٍ كبير من المصادر (5 مصادر في هذه الحالة)، '''أقترح وَضْعَ حدّ أعلى للمصادر التي نستخدمها في استخراج المعنى، ربما 3 للوقت الحاضر'''. :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:10، 6 أغسطس 2026 (ت ع م). ::وضع حد للمصادر آليا قد يحرم المفردة من المصدر الأقوى والأدق. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:30، 6 أغسطس 2026 (ت ع م) :{{أصلح}} الخلل في رقم صفحة القاموس المحيط، لهذه المُفردة ولمفردات أخرى. يبدو أن المشكل كان سببه عشوائية النموذج اللغوي، إذ كان يُغيِّر رقم الصفحة في أقل من 1% من الحالات. عدّلتُ أداة توليد المعاني حتى لا يتكرر الخطأ. :بالنسبة للمصادر، أُفضل الإبقاء عليها جميعا. سنُجرب مع {{مس|عباد ديرانية}} تعديل تعليمات النموذج لتحسين المُخْرَجات ولإصلاح مشاكل أخرى، لا سيما المعاني المُكررة. -- [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 23:47، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَسَافَدَ (L1497488) == '''تَسَافَدَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1497488|18بك|ويكي بيانات: L1497488]] [[ملف:Wiktionary-logo.svg|وصلة=تَسَافَدَ|18بك|صفحة ويكاموس]] · الجذر: سفد · ([[toolforge:ar-senses/review/L1497488|رابط المُفردة في الأداة]]) اكتفيت بالمعنى الأول بسبب التكرار.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 11:51، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} ملاحظة للعمل على تكرار المعاني، المعنى 1 و2 متماثلان والثاني هو الأوضح للمستخدم المعاصر --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:13، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: سَافَحَ (L1487289) == '''سَافَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487289|18بك|ويكي بيانات: L1487289]] [[ملف:Wiktionary-logo.svg|وصلة=سَافَحَ|18بك|صفحة ويكاموس]] · الجذر: سفح · ([[toolforge:ar-senses/review/L1487289|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:42، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} حالة تكرار أخرى مؤكدة في المعنى 1 والمعنى 2 --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:14، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: تَرَأَّمَ (L1535813) == '''تَرَأَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1535813|18بك|ويكي بيانات: L1535813]] [[ملف:Wiktionary-logo.svg|وصلة=تَرَأَّمَ|18بك|صفحة ويكاموس]] · الجذر: رأم · ([[toolforge:ar-senses/review/L1535813|رابط المُفردة في الأداة]]) دمجت المعنيين وصححت رقم الجزء والصفحة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:58، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} حالة تكرار مؤكّدة بين المعنى 1 و2، كما يأتي: :#{{اقتباس مضمن|تَرَأَّمَ الشيءَ: أحبَّه وألِفَه وعطف عليه وترحم عليه}} :#{{اقتباس مضمن|تَرَأَّمَ الصبيَّ: ترحَّم عليه}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:26، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: جَاوَى (L1534151) == '''جَاوَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534151|18بك|ويكي بيانات: L1534151]] [[ملف:Wiktionary-logo.svg|وصلة=جَاوَى|18بك|صفحة ويكاموس]] · الجذر: جوي · ([[toolforge:ar-senses/review/L1534151|رابط المُفردة في الأداة]]) خطأ: الصفحة 'جَاوَى' موجودة بالفعل <!-- يظهر هكذا: خطأ: الصفحة 'جَاوَى' موجودة بالفعل. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:15، 30 يوليو 2026 (ت ع م) :{{ر|أبو هشام}} أتقصد أنكَ أنشأتَ الصفحة سابقًا عبر الأداة ثم ظهرت لك مرة أخرى في أداة مراجعة المعاني؟ --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:27، 6 أغسطس 2026 (ت ع م). ::مرحبا {{ر|عباد ديرانية}} أعتقد أن الخلل هو وجود صفحة مكررة في ويكي بيانات يلزم دمجها، تحياتي لك. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:59، 6 أغسطس 2026 (ت ع م) :::+أضيفُ الاقتراح الممتاز '''إضافة تنبيهٍ بالخط الأحمر إلى الأداة في حال لو أن الصفحة أُنْشِأَتْ وحُذِفَتْ سابقًا''' تنبيهًا للمستخدم --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 16:07، 6 أغسطس 2026 (ت ع م). ::::هذا المشكل تكرر مرات عديدة (انظر النقاش أعلاه عن الفعل '''حَلَّى''') والسبب هو المُفردات التي تشترك في نفس الجذر. حاليا لا يوجد حل تقني للمسألة، لكنها في بالي وسأفكر في حل. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 22:48، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَجَاذَى (L1533824) == '''تَجَاذَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533824|18بك|ويكي بيانات: L1533824]] [[ملف:Wiktionary-logo.svg|وصلة=تَجَاذَى|18بك|صفحة ويكاموس]] · الجذر: جذي · ([[toolforge:ar-senses/review/L1533824|رابط المُفردة في الأداة]]) خطأ: الصفحة 'تَجَاذَى' موجودة بالفعل <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:19، 30 يوليو 2026 (ت ع م) :{{ر|ForzaGreen}} هذه ملاحظة متكرّرة من المستخدمين، يظهر أننا نحتاجُ إلى '''تحديث الأداة بوتيرة يومية لإزالة الصفحات المنشأة سابقًا'''، إلا لو كان هذا خطأً تقنيًا مختلفًا يُسبِّبُ التكرار --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:48، 6 أغسطس 2026 (ت ع م). ::كنت أصلحت هذه الكلمة مع كلمات أخرى لكن لم أصلح بعد مصدر الخطأ، وهو الأفعال التي لها جذور مختلفة لكنها تشترك في نفس الصيغة. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 17:51، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَجْذَى (L1533823) == '''أَجْذَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533823|18بك|ويكي بيانات: L1533823]] [[ملف:Wiktionary-logo.svg|وصلة=أَجْذَى|18بك|صفحة ويكاموس]] · الجذر: جذي · ([[toolforge:ar-senses/review/L1533823|رابط المُفردة في الأداة]]) خطأ: الصفحة 'أَجْذَى' موجودة بالفعل <!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:رِفْد|رِفْد]] ([[نقاش المستخدم:رِفْد|نقاش]]) 22:20، 30 يوليو 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: زَأْزَأَ (L1536388) == '''زَأْزَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1536388|18بك|ويكي بيانات: L1536388]] [[ملف:Wiktionary-logo.svg|وصلة=زَأْزَأَ|18بك|صفحة ويكاموس]] · الجذر: زأزأ · ([[toolforge:ar-senses/review/L1536388|رابط المُفردة في الأداة]]) حذفت المعنى الخامس لأنه مزيد بتاء في المراجع.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:35، 4 أغسطس 2026 (ت ع م) :{{ر|Michel Bakni}} المعنى الخامس مزيدٌ بتاء التأنيث، فهل نُنْشِئُ له صفحةً منفصلةً برأيك أم نضيفه إلى ذات الصفحة مع تحويلة؟ :شرح المعنى الخامس: {{اقتباس مضمن|زَأْزَأَتِ المرأةُ: مشت وحرّكت أعطافها كمشية القِصار}} :--[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:33، 6 أغسطس 2026 (ت ع م). ::نعم، يلزم إنشاء صفحة لكل فعل بكل تصريف، هذا التصريف: المؤنث المفرد الغائب. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 14:36، 6 أغسطس 2026 (ت ع م) :::{{ر|ForzaGreen}} إذًا يلزمنا التوثّق من تمييز النموذج للمؤنّث وتخصيصه صفحة مستقلّة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:54، 6 أغسطس 2026 (ت ع م). ::::أنا رأيي كل المعاني والأمثلة تبقى في صفحة الفعل الرئيسية، والصيغ المُصرفة تحيل إلى الصفحة الرئيسية. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 15:06، 6 أغسطس 2026 (ت ع م) ::::متّفق مع وائل هنا بالواقع، الأفضل هو تخفيف الإحالات إن أمكن وجَمْع تصريفات المذكر والمؤنث والعدد بصفحة واحدة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:52، 6 أغسطس 2026 (ت ع م). :::::لكن الذي يراجع القوالب يفهم أن لكل تصريف صفحة خاصة به لذلك أنا أتفق مع الزميل ميشيل على إنشاء صفحة لكل تصريف، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:10، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَزْعَلَ (L1476504) == '''أَزْعَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1476504|18بك|ويكي بيانات: L1476504]] [[ملف:Wiktionary-logo.svg|وصلة=أَزْعَلَ|18بك|صفحة ويكاموس]] · الجذر: زعل · ([[toolforge:ar-senses/review/L1476504|رابط المُفردة في الأداة]]) دمجت المعنى الأول والثالث لأن المعنى الثالث مكرر عن الأول.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 10:04، 4 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك ونعمل على معالجة مسألة المعاني المُكرَّرة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:34، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: زَعِلَ (L1487695) == '''زَعِلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487695|18بك|ويكي بيانات: L1487695]] [[ملف:Wiktionary-logo.svg|وصلة=زَعِلَ|18بك|صفحة ويكاموس]] · الجذر: زعل · ([[toolforge:ar-senses/review/L1487695|رابط المُفردة في الأداة]]) المعنى الأول (مرح) غير موجود في المراجع، والمعنى الثالث بحاجة إلى تدقيق، تحتاج المفردة إلى مراجعة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 10:41، 4 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} من معجم العين: {{اقتباس مضمن|الزَّعِل: النشيط '''الأشر'''. زَعِلَ يَزْعَلُ زَعَلًا.}}، الأشر هنا بمعنى المرح (مصدر [https://www.islamweb.net/ar/library/content/122/137/%D8%A3%D8%B4%D8%B1 من لسان العرب]). :{{ر|ForzaGreen}} المعنى الثالث فيه اختلاطٌ بين معانٍ عِدّة، مثل: {{اقتباس مضمن|والزعل: '''المتضور جوعا'''}} (الجوهري) و{{اقتباس مضمن|الزَّعَلُ '''كالعَلَزِ مِنَ المَرَض'''}} (لسان العرب)، والمعنى في الأداة جاءَ: {{اقتباس مضمن|زَعِلَ من المرض أو الجوع: تضوّر وتلوّى وقلِق فلم يستقر}}. :'''الخطوات القادمة المقترحة''': أشتبه أن النموذج اختلط عليه دمج المعنى عبر 5 مصادر، والأفضل والأسهل للمراجع (فمن الصعب جدًا تقصّي 5 مراجع مختلفة) أن '''نضعَ حدًا بين مصدرَيْن إلى ثلاثة مصادر للمعنى الواحد''' --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:48، 6 أغسطس 2026 (ت ع م). ::نعم، في الحقيقة تحتوي بعض المفردات على مراجع كثيرة وأتفق معك على الاستشهاد بمرجعين أو ثلاث بأقصى حد لكن لو يكون انتقاء المراجع يدويا أفضل لاختيار الأنسب والأقرب إلا إذا كان الاختيار الآلي قادرا على انتقاء المرجع الأنسب أو الأقرب أو الأدق. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:21، 6 أغسطس 2026 (ت ع م) :::إشارة {{ر|عباد ديرانية}} أرجو مراجعة تقليل المراجع آليا فقد تحرم الأداةُ المفردةَ من المراجع الأدق وتضع المراجع الأبعد. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:23، 6 أغسطس 2026 (ت ع م) ::::{{ر|أبو هشام}} لا بأس بذلك، لكن إن تركنا للمُرَاجِعِ اختيار المصادر الأدق فهذا يعني أن عليهم مراجعة 5 - 6 مصادر في بعض الحالات، فما هو الأفضل بالنسبة لك بين هذه الخيارات؟ أهو انتقاء المصادر الأفضل يدويًا أم تقليل عدد المصادر التي وجبت مراجعتها؟ --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 15:51، 6 أغسطس 2026 (ت ع م). :::::{{ر|عباد ديرانية}} أميل إلى الانتقاء اليدوي أو البشري دون تقليل للمصادر فالمراجِع قادر على انتقاء المصدر الأنسب للمفردة، وإن كان للزملاء رأي آخر فلا أعترض، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:15، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَلَكَ (L1502490) == '''أَلَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1502490|18بك|ويكي بيانات: L1502490]] [[ملف:Wiktionary-logo.svg|وصلة=أَلَكَ|18بك|صفحة ويكاموس]] · الجذر: ألك · ([[toolforge:ar-senses/review/L1502490|رابط المُفردة في الأداة]]) حذفت المرجع الأخير من المعنى الثاني لأن فيه خطأ فقد استُشهد بصفحة 132 من معجم متن اللغة وفيها (أَلَكَ لَجَأٌ يَا فلَان) وهو استشهاد خاطئ لأن (ألك) هنا استفهام وليست فعل.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:33، 5 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} شكرًا لك وسوف نعمل على زيادة دقة ضبط المعاني المتقاربة بالأداة --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:49، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: اِبْتَسَطَ (L1533014) == '''اِبْتَسَطَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533014|18بك|ويكي بيانات: L1533014]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَسَطَ|18بك|صفحة ويكاموس]] · الجذر: بسط · ([[toolforge:ar-senses/review/L1533014|رابط المُفردة في الأداة]]) غير موثقة، لا يوجد فيها مصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:04، 5 أغسطس 2026 (ت ع م) :{{ر|ForzaGreen}} حالة غريبةٌ ليس فيه أي مصدر للمعنى المستخرج! --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:49، 6 أغسطس 2026 (ت ع م). == بلاغ من أداة مراجعة المعاني: أَبْشَكَ (L1533037) == '''أَبْشَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533037|18بك|ويكي بيانات: L1533037]] [[ملف:Wiktionary-logo.svg|وصلة=أَبْشَكَ|18بك|صفحة ويكاموس]] · الجذر: بشك · ([[toolforge:ar-senses/review/L1533037|رابط المُفردة في الأداة]]) هذه اللفظة بحاجة لمراجعة فلها عدة معان.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:50، 6 أغسطس 2026 (ت ع م) :{{ر|أبو هشام}} هل لكَ أن تُوضِحَ المقصود؟ لم أجد كلمة أبشك في المرجع أصلًا للأسف --[[مستخدم:عباد ديرانية|عباد ديرانية]] ([[نقاش المستخدم:عباد ديرانية|نقاش]]) 14:52، 6 أغسطس 2026 (ت ع م). ::{{ر|عباد ديرانية}} وجدت هذا ('''أبشك''' الكلام: كذب فيه: تخرص فيه كاذبًا.) في معجم متن اللغة ج=1 ص=299، وهذا أيضا (وبَشَكَ الْكَلَامَ يَبْشُكه بَشْكًا و'''أبشَكه''': تَخَرَّصهُ كَاذِبًا،) في لسان العرب ج=10 ص=400، ولم أجد أن معناها '''أسرع'''، تحياتي. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:43، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَاطَأَ (L1496404) == '''بَاطَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1496404|18بك|ويكي بيانات: L1496404]] [[ملف:Wiktionary-logo.svg|وصلة=بَاطَأَ|18بك|صفحة ويكاموس]] · الجذر: بطأ · ([[toolforge:ar-senses/review/L1496404|رابط المُفردة في الأداة]]) لا يوجد التصريف في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:43، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَبْطَحَ (L1533063) == '''أَبْطَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533063|18بك|ويكي بيانات: L1533063]] [[ملف:Wiktionary-logo.svg|وصلة=أَبْطَحَ|18بك|صفحة ويكاموس]] · الجذر: بطح · ([[toolforge:ar-senses/review/L1533063|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:47، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَطَّحَ (L1533066) == '''بَطَّحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533066|18بك|ويكي بيانات: L1533066]] [[ملف:Wiktionary-logo.svg|وصلة=بَطَّحَ|18بك|صفحة ويكاموس]] · الجذر: بطح · ([[toolforge:ar-senses/review/L1533066|رابط المُفردة في الأداة]]) هل هي بطَح أم بطّح؟<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:48، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَطْرَقَ (L1533070) == '''تَبَطْرَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533070|18بك|ويكي بيانات: L1533070]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَطْرَقَ|18بك|صفحة ويكاموس]] · الجذر: بطرق · ([[toolforge:ar-senses/review/L1533070|رابط المُفردة في الأداة]]) هذا الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:58، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَهُؤَ (L1545462) == '''بَهُؤَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1545462|18بك|ويكي بيانات: L1545462]] [[ملف:Wiktionary-logo.svg|وصلة=بَهُؤَ|18بك|صفحة ويكاموس]] · الجذر: بهأ · ([[toolforge:ar-senses/review/L1545462|رابط المُفردة في الأداة]]) معناها (أنس) كما في لسان العرب ج=1 ص=35 ومعجم متن اللغة ج=1 ص=353.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:29، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَاهَتَ (L1533268) == '''تَبَاهَتَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533268|18بك|ويكي بيانات: L1533268]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَاهَتَ|18بك|صفحة ويكاموس]] · الجذر: بهت · ([[toolforge:ar-senses/review/L1533268|رابط المُفردة في الأداة]]) حسنتُ المعنى وأضفت مصدرين.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:01، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَعِرَ (L1544067) == '''بَعِرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1544067|18بك|ويكي بيانات: L1544067]] [[ملف:Wiktionary-logo.svg|وصلة=بَعِرَ|18بك|صفحة ويكاموس]] · الجذر: بعر · ([[toolforge:ar-senses/review/L1544067|رابط المُفردة في الأداة]]) '''[[بَعِرَ]]''' الجمل بالكسر صار بعيرا كما في القاموس المحيط ص=352. المفردة (بَعَرَ) وهي موجودة في المشروع '''[[بَعَرَ]]''' فيلزم تحديثها أو حذفها لأنها خاطئة انظر القاموس المحيط ص=694 وإنشاء صفحة جديدة ببيانات صحيحة هي البيانات الموجودة في الأداة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:31، 6 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَعَّقَ (L1533113) == '''بَعَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533113|18بك|ويكي بيانات: L1533113]] [[ملف:Wiktionary-logo.svg|وصلة=بَعَّقَ|18بك|صفحة ويكاموس]] · الجذر: بعق · ([[toolforge:ar-senses/review/L1533113|رابط المُفردة في الأداة]]) هل هي بَعَّقَ بالتشديد أم بَعَقَ بالتخفيف؟<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:02، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَغْزَلَ (L1533126) == '''تَبَغْزَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533126|18بك|ويكي بيانات: L1533126]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَغْزَلَ|18بك|صفحة ويكاموس]] · الجذر: بغزل · ([[toolforge:ar-senses/review/L1533126|رابط المُفردة في الأداة]]) المعنى الصحيح '''تبختر''' وله شواهد في أربعة معاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:13، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَقَّمَ (L1533154) == '''بَقَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533154|18بك|ويكي بيانات: L1533154]] [[ملف:Wiktionary-logo.svg|وصلة=بَقَّمَ|18بك|صفحة ويكاموس]] · الجذر: بقم · ([[toolforge:ar-senses/review/L1533154|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:44، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَقَّمَ (L1533153) == '''تَبَقَّمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533153|18بك|ويكي بيانات: L1533153]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَقَّمَ|18بك|صفحة ويكاموس]] · الجذر: بقم · ([[toolforge:ar-senses/review/L1533153|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:50، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَكِئَ (L1543356) == '''بَكِئَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543356|18بك|ويكي بيانات: L1543356]] [[ملف:Wiktionary-logo.svg|وصلة=بَكِئَ|18بك|صفحة ويكاموس]] · الجذر: بكأ · ([[toolforge:ar-senses/review/L1543356|رابط المُفردة في الأداة]]) حذفت المعنى الأول لأنه غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:13، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْتَلَتَ (L1533174) == '''اِبْتَلَتَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533174|18بك|ويكي بيانات: L1533174]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَلَتَ|18بك|صفحة ويكاموس]] · الجذر: بلت · ([[toolforge:ar-senses/review/L1533174|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:35، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَلْدَحَ (L1533193) == '''تَبَلْدَحَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533193|18بك|ويكي بيانات: L1533193]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَلْدَحَ|18بك|صفحة ويكاموس]] · الجذر: بلدح · ([[toolforge:ar-senses/review/L1533193|رابط المُفردة في الأداة]]) أضفت المعنى الثاني، لم تستخرجه الأداة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 19:54، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْلَنْدَكَ (L1533194) == '''اِبْلَنْدَكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533194|18بك|ويكي بيانات: L1533194]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْلَنْدَكَ|18بك|صفحة ويكاموس]] · الجذر: بلدك · ([[toolforge:ar-senses/review/L1533194|رابط المُفردة في الأداة]]) المعنى خاطئ، والمفردة غير موجودة في المصدر. :المعنى الصحيح ('''اتسع''') موجود في أربعة معاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:00، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَبَلَّرَ (L1533196) == '''تَبَلَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533196|18بك|ويكي بيانات: L1533196]] [[ملف:Wiktionary-logo.svg|وصلة=تَبَلَّرَ|18بك|صفحة ويكاموس]] · الجذر: بلر · ([[toolforge:ar-senses/review/L1533196|رابط المُفردة في الأداة]]) إملاء المفردة خاطئ، والصحيح ('''تَرَبَّل''') كما في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:08، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَبَاضَ (L1533353) == '''اِسْتَبَاضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533353|18بك|ويكي بيانات: L1533353]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَبَاضَ|18بك|صفحة ويكاموس]] · الجذر: بيض · ([[toolforge:ar-senses/review/L1533353|رابط المُفردة في الأداة]]) الفعل في المرجع استبيض وليس استباض --[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:36، 7 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَقَّعَ (L1533145) == '''بَقَّعَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533145|18بك|ويكي بيانات: L1533145]] [[ملف:Wiktionary-logo.svg|وصلة=بَقَّعَ|18بك|صفحة ويكاموس]] · الجذر: بقع · ([[toolforge:ar-senses/review/L1533145|رابط المُفردة في الأداة]]) حذفت المعنى الرابع لأنه ورد بالتخفيف.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:18، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِنْبَقَّ (L1533147) == '''اِنْبَقَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533147|18بك|ويكي بيانات: L1533147]] [[ملف:Wiktionary-logo.svg|وصلة=اِنْبَقَّ|18بك|صفحة ويكاموس]] · الجذر: بقق · ([[toolforge:ar-senses/review/L1533147|رابط المُفردة في الأداة]]) المعنى خاطئ ولا شواهد عليه في المعاجم والمفردة الموجودة ('''انبعق''') وليس انبق.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:38، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَلَعَ (L1480240) == '''بَلَعَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1480240|18بك|ويكي بيانات: L1480240]] [[ملف:Wiktionary-logo.svg|وصلة=بَلَعَ|18بك|صفحة ويكاموس]] · الجذر: بلع · ([[toolforge:ar-senses/review/L1480240|رابط المُفردة في الأداة]]) خطأ في التشكيل فالفعل بَلِعَ وليس بَلَعَ كما في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:34، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْتَلَقَ (L1533220) == '''اِبْتَلَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1533220|18بك|ويكي بيانات: L1533220]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْتَلَقَ|18بك|صفحة ويكاموس]] · الجذر: بلق · ([[toolforge:ar-senses/review/L1533220|رابط المُفردة في الأداة]]) لم أجد المفردة في المعاجم.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:06، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: بَلُقَ (L1543358) == '''بَلُقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543358|18بك|ويكي بيانات: L1543358]] [[ملف:Wiktionary-logo.svg|وصلة=بَلُقَ|18بك|صفحة ويكاموس]] · الجذر: بلق · ([[toolforge:ar-senses/review/L1543358|رابط المُفردة في الأداة]]) المفردة بالكسر وليس بالضم، انظر '''[[بَلِقَ]]'''.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:52، 8 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْذَارَّ (L1534290) == '''اِحْذَارَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534290|18بك|ويكي بيانات: L1534290]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْذَارَّ|18بك|صفحة ويكاموس]] · الجذر: حذر · ([[toolforge:ar-senses/review/L1534290|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:49، 9 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاتَنَ (L1534214) == '''تَحَاتَنَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534214|18بك|ويكي بيانات: L1534214]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاتَنَ|18بك|صفحة ويكاموس]] · الجذر: حتن · ([[toolforge:ar-senses/review/L1534214|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:31، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَتَنَ (L1534213) == '''اِحْتَتَنَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534213|18بك|ويكي بيانات: L1534213]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَتَنَ|18بك|صفحة ويكاموس]] · الجذر: حتن · ([[toolforge:ar-senses/review/L1534213|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:37، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاتَّ (L1496477) == '''تَحَاتَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1496477|18بك|ويكي بيانات: L1496477]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاتَّ|18بك|صفحة ويكاموس]] · الجذر: حتت · ([[toolforge:ar-senses/review/L1496477|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:36، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْزَوْزَى (L1534387) == '''اِحْزَوْزَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534387|18بك|ويكي بيانات: L1534387]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْزَوْزَى|18بك|صفحة ويكاموس]] · الجذر: حزو · ([[toolforge:ar-senses/review/L1534387|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصدر ولها أكثر من معنى في المصادر الأخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:02، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَذَّقَ (L1484084) == '''تَحَذَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1484084|18بك|ويكي بيانات: L1484084]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَذَّقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1484084|رابط المُفردة في الأداة]]) المفردة غير موجودة في المصادر الموجودة، استبدلتها بمصادر أخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:02، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَذَّقَ (L1534295) == '''حَذَّقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534295|18بك|ويكي بيانات: L1534295]] [[ملف:Wiktionary-logo.svg|وصلة=حَذَّقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1534295|رابط المُفردة في الأداة]]) لم أجد الفعل المتعدي في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:14، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَذِقَ (L1546050) == '''حَذِقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1546050|18بك|ويكي بيانات: L1546050]] [[ملف:Wiktionary-logo.svg|وصلة=حَذِقَ|18بك|صفحة ويكاموس]] · الجذر: حذق · ([[toolforge:ar-senses/review/L1546050|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لأنه تفسير لمفردة فرس وهو مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:56، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَحْزَرَ (L1534363) == '''أَحْزَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534363|18بك|ويكي بيانات: L1534363]] [[ملف:Wiktionary-logo.svg|وصلة=أَحْزَرَ|18بك|صفحة ويكاموس]] · الجذر: حزر · ([[toolforge:ar-senses/review/L1534363|رابط المُفردة في الأداة]]) حذفت المعنى الأول لأنه خاطئ وغير مرتبط بالمفردة بل يرتبط بـ (أحزّ).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:06، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَزَّ (L1534366) == '''اِحْتَزَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534366|18بك|ويكي بيانات: L1534366]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَزَّ|18بك|صفحة ويكاموس]] · الجذر: حزز · ([[toolforge:ar-senses/review/L1534366|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:12، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَزْمَرَ (L1534382) == '''حَزْمَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534382|18بك|ويكي بيانات: L1534382]] [[ملف:Wiktionary-logo.svg|وصلة=حَزْمَرَ|18بك|صفحة ويكاموس]] · الجذر: حزمر · ([[toolforge:ar-senses/review/L1534382|رابط المُفردة في الأداة]]) حذفت المعنى الثاني لارتباطه بـ ([[حَزْفَرَ]]).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 21:56، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَاسَى (L1534416) == '''تَحَاسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534416|18بك|ويكي بيانات: L1534416]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَاسَى|18بك|صفحة ويكاموس]] · الجذر: حسو · ([[toolforge:ar-senses/review/L1534416|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 22:10، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَاسَى (L1534418) == '''حَاسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534418|18بك|ويكي بيانات: L1534418]] [[ملف:Wiktionary-logo.svg|وصلة=حَاسَى|18بك|صفحة ويكاموس]] · الجذر: حسو · ([[toolforge:ar-senses/review/L1534418|رابط المُفردة في الأداة]]) غير موجودة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 22:16، 11 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَاقَ (L1534738) == '''اِحْتَاقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534738|18بك|ويكي بيانات: L1534738]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَاقَ|18بك|صفحة ويكاموس]] · الجذر: حيق · ([[toolforge:ar-senses/review/L1534738|رابط المُفردة في الأداة]]) دمجت المعنيين لأنها مكرران.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 04:15، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَفَظَ (L1485699) == '''اِحْتَفَظَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1485699|18بك|ويكي بيانات: L1485699]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَفَظَ|18بك|صفحة ويكاموس]] · الجذر: حفظ · ([[toolforge:ar-senses/review/L1485699|رابط المُفردة في الأداة]]) لم تضع الأداة بعض أرقام الصفحات والأجزاء.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:19، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَمْحَمَ (L1476725) == '''حَمْحَمَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1476725|18بك|ويكي بيانات: L1476725]] [[ملف:Wiktionary-logo.svg|وصلة=حَمْحَمَ|18بك|صفحة ويكاموس]] · الجذر: حمحم · ([[toolforge:ar-senses/review/L1476725|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 17:11، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَيَّفَ (L1534760) == '''تَحَيَّفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534760|18بك|ويكي بيانات: L1534760]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَيَّفَ|18بك|صفحة ويكاموس]] · الجذر: حيف · ([[toolforge:ar-senses/review/L1534760|رابط المُفردة في الأداة]]) دمجت المعنيين.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 18:38، 12 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَشَّكَ (L1534439) == '''تَحَشَّكَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534439|18بك|ويكي بيانات: L1534439]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَشَّكَ|18بك|صفحة ويكاموس]] · الجذر: حشك · ([[toolforge:ar-senses/review/L1534439|رابط المُفردة في الأداة]]) حرف الشين مشدد.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:12، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْوَالَّ (L1534743) == '''اِحْوَالَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534743|18بك|ويكي بيانات: L1534743]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْوَالَّ|18بك|صفحة ويكاموس]] · الجذر: حول · ([[toolforge:ar-senses/review/L1534743|رابط المُفردة في الأداة]]) خلل في صندوق المعلومات.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:59، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَحَاضَ (L1534730) == '''اِسْتَحَاضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534730|18بك|ويكي بيانات: L1534730]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَحَاضَ|18بك|صفحة ويكاموس]] · الجذر: حوض · ([[toolforge:ar-senses/review/L1534730|رابط المُفردة في الأداة]]) الموجود في المصادر استحوض وليس استحاض.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 17:05، 13 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَاشَ (L1534721) == '''اِحْتَاشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534721|18بك|ويكي بيانات: L1534721]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَاشَ|18بك|صفحة ويكاموس]] · الجذر: حوش · ([[toolforge:ar-senses/review/L1534721|رابط المُفردة في الأداة]]) التصريف الموجود في المصادر (احتوش) وليس احتاش.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:34، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِسْتَحَاسَ (L1534716) == '''اِسْتَحَاسَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534716|18بك|ويكي بيانات: L1534716]] [[ملف:Wiktionary-logo.svg|وصلة=اِسْتَحَاسَ|18بك|صفحة ويكاموس]] · الجذر: حوس · ([[toolforge:ar-senses/review/L1534716|رابط المُفردة في الأداة]]) استحوس وليس استحاس كما في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:51، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَزْأَلَ (L1534358) == '''حَزْأَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534358|18بك|ويكي بيانات: L1534358]] [[ملف:Wiktionary-logo.svg|وصلة=حَزْأَلَ|18بك|صفحة ويكاموس]] · الجذر: حزأل · ([[toolforge:ar-senses/review/L1534358|رابط المُفردة في الأداة]]) مفردة خاطئة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 12:52، 14 أغسطس 2026 (ت ع م) :فعلا، يبدو أن المُفردة حَزْأَلَ لا توجد. في جدول الأفعال، عندنا فعل واحد من الجذر "ح ز أ ل"، وهو على وزن '''فعلل'''، أي حَزْأَلَ. لكن يبدو أن هذا خاطئ، و أن الوزن الصحيح هو افعللّ، أي احْزَأَلَّ، وهو الذي ذُكِر في معجم [https://app.turath.io/book/7030?page=14881 تاج العروس]. [[مستخدم:ForzaGreen|وائل]] ([[نقاش المستخدم:ForzaGreen|نقاش]]) 21:19، 14 أغسطس 2026 (ت ع م) :ورد في اللسان أيضًا احزألَّ بمعنى ارتفع وبمعنى اجتمع. [[مستخدم:Michel Bakni|Michel Bakni]] ([[نقاش المستخدم:Michel Bakni|نقاش]]) 21:50، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَنَّشَ (L1534669) == '''حَنَّشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534669|18بك|ويكي بيانات: L1534669]] [[ملف:Wiktionary-logo.svg|وصلة=حَنَّشَ|18بك|صفحة ويكاموس]] · الجذر: حنش · ([[toolforge:ar-senses/review/L1534669|رابط المُفردة في الأداة]]) هل هي حَنَّشَ أم حَنَشَ؟ وأظن أن لها معان أخرى.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:28، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِبْخَنَدَّ (L1532850) == '''اِبْخَنَدَّ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1532850|18بك|ويكي بيانات: L1532850]] [[ملف:Wiktionary-logo.svg|وصلة=اِبْخَنَدَّ|18بك|صفحة ويكاموس]] · الجذر: بخند · ([[toolforge:ar-senses/review/L1532850|رابط المُفردة في الأداة]]) الفعل في المرجع اخْبَنْدَى، لا وجود المفردة اِبْخَنَدَّ--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 18:52، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَمْيَرَ (L1534650) == '''تَحَمْيَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534650|18بك|ويكي بيانات: L1534650]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَمْيَرَ|18بك|صفحة ويكاموس]] · الجذر: حمير · ([[toolforge:ar-senses/review/L1534650|رابط المُفردة في الأداة]]) خطأ في استخراج المعنى، معنى تحمير أي ساء خلقه كما في المصادر أم هذه فيجب أن تكون بغير الياء أي تَحَمَّر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:02، 14 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَبَشَ (L1534178) == '''اِحْتَبَشَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534178|18بك|ويكي بيانات: L1534178]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَبَشَ|18بك|صفحة ويكاموس]] · الجذر: حبش · ([[toolforge:ar-senses/review/L1534178|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:38، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَثَّرَ (L1534223) == '''تَحَثَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534223|18بك|ويكي بيانات: L1534223]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَثَّرَ|18بك|صفحة ويكاموس]] · الجذر: حثر · ([[toolforge:ar-senses/review/L1534223|رابط المُفردة في الأداة]]) المعنى لفعل حثر، الرجاء إصلاحه.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:52، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَثْرَفَ (L1534226) == '''حَثْرَفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534226|18بك|ويكي بيانات: L1534226]] [[ملف:Wiktionary-logo.svg|وصلة=حَثْرَفَ|18بك|صفحة ويكاموس]] · الجذر: حثرف · ([[toolforge:ar-senses/review/L1534226|رابط المُفردة في الأداة]]) المعنى الصحيح زعزعه وحركه، انظر تاج العروس جزء 23 صفحة 118.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:09، 15 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَحَظْرَبَ (L1534501) == '''تَحَظْرَبَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534501|18بك|ويكي بيانات: L1534501]] [[ملف:Wiktionary-logo.svg|وصلة=تَحَظْرَبَ|18بك|صفحة ويكاموس]] · الجذر: حظرب · ([[toolforge:ar-senses/review/L1534501|رابط المُفردة في الأداة]]) دًمج المعنيان ووُضعت أمثلة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 15:32، 16 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَافَلَ (L1534527) == '''حَافَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534527|18بك|ويكي بيانات: L1534527]] [[ملف:Wiktionary-logo.svg|وصلة=حَافَلَ|18بك|صفحة ويكاموس]] · الجذر: حفل · ([[toolforge:ar-senses/review/L1534527|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر المذكورة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:59، 16 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْقَوْقَفَ (L1489579) == '''اِحْقَوْقَفَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1489579|18بك|ويكي بيانات: L1489579]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْقَوْقَفَ|18بك|صفحة ويكاموس]] · الجذر: حقف · ([[toolforge:ar-senses/review/L1489579|رابط المُفردة في الأداة]]) المعاني الأربعة مكررة.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:52، 17 أغسطس 2026 (ت ع م) == معجم مقاييس اللغة == مرحبا بالزملاء، روابط الكتاب الموجودة في الأداة غير دقيقة وقد كنت أظن أن الاختلاف في مفردة أو اثنتين لكن تبين لي أنها غير دقيقة في جميع المفردات، رقم الصفة صحيح ولكن الرابط بعيد عن الصفحة، تحياتي لكم. [[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 07:56، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِحْتَكَرَ (L1478743) == '''اِحْتَكَرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1478743|18بك|ويكي بيانات: L1478743]] [[ملف:Wiktionary-logo.svg|وصلة=اِحْتَكَرَ|18بك|صفحة ويكاموس]] · الجذر: حكر · ([[toolforge:ar-senses/review/L1478743|رابط المُفردة في الأداة]]) المعنى الثاني مكرر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:42، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَكَّرَ (L1534555) == '''حَكَّرَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534555|18بك|ويكي بيانات: L1534555]] [[ملف:Wiktionary-logo.svg|وصلة=حَكَّرَ|18بك|صفحة ويكاموس]] · الجذر: حكر · ([[toolforge:ar-senses/review/L1534555|رابط المُفردة في الأداة]]) أشك بوجود المفردة المشكلة في المصدر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 20:56، 17 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: حَمِضَ (L1543549) == '''حَمِضَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1543549|18بك|ويكي بيانات: L1543549]] [[ملف:Wiktionary-logo.svg|وصلة=حَمِضَ|18بك|صفحة ويكاموس]] · الجذر: حمض · ([[toolforge:ar-senses/review/L1543549|رابط المُفردة في الأداة]]) المعاني مختلطة لعدم وضوح حركة الميم في الفعل.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 14:57، 19 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: أَسَى (L1486741) == '''أَسَى''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1486741|18بك|ويكي بيانات: L1486741]] [[ملف:Wiktionary-logo.svg|وصلة=أَسَى|18بك|صفحة ويكاموس]] · الجذر: أسي · ([[toolforge:ar-senses/review/L1486741|رابط المُفردة في الأداة]]) الفعل في المراجع أسا من الجذر أسو.--[[مستخدم:إسلام|إسلام]] ([[نقاش المستخدم:إسلام|نقاش]]) 20:03، 20 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: اِخْتَبَلَ (L1534805) == '''اِخْتَبَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534805|18بك|ويكي بيانات: L1534805]] [[ملف:Wiktionary-logo.svg|وصلة=اِخْتَبَلَ|18بك|صفحة ويكاموس]] · الجذر: خبل · ([[toolforge:ar-senses/review/L1534805|رابط المُفردة في الأداة]]) المعنى الثاني مكرر، حذفته.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:03، 21 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَاتَلَ (L1487389) == '''تَخَاتَلَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1487389|18بك|ويكي بيانات: L1487389]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَاتَلَ|18بك|صفحة ويكاموس]] · الجذر: ختل · ([[toolforge:ar-senses/review/L1487389|رابط المُفردة في الأداة]]) دُمِج المعنيان.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 09:09، 21 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَاجَأَ (L1534840) == '''تَخَاجَأَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534840|18بك|ويكي بيانات: L1534840]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَاجَأَ|18بك|صفحة ويكاموس]] · الجذر: خجأ · ([[toolforge:ar-senses/review/L1534840|رابط المُفردة في الأداة]]) لاحظت التباسا أو خلطا بين (تخاجأ وتخاجى وتخاجا).<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 08:22، 22 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: تَخَارَقَ (L1534942) == '''تَخَارَقَ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1534942|18بك|ويكي بيانات: L1534942]] [[ملف:Wiktionary-logo.svg|وصلة=تَخَارَقَ|18بك|صفحة ويكاموس]] · الجذر: خرق · ([[toolforge:ar-senses/review/L1534942|رابط المُفردة في الأداة]]) الفعل غير موجود في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:36، 22 أغسطس 2026 (ت ع م) == بلاغ من أداة مراجعة المعاني: دَآ (L1545136) == '''دَآ''' [[ملف:Wikidata Favicon color.svg|وصلة=d:Lexeme:L1545136|18بك|ويكي بيانات: L1545136]] [[ملف:Wiktionary-logo.svg|وصلة=دَآ|18بك|صفحة ويكاموس]] · الجذر: دأو · ([[toolforge:ar-senses/review/L1545136|رابط المُفردة في الأداة]]) الفعل الصحيح (دَأَى) كما في المصادر.<!-- اكتب وصف المشكلة هنا، قبل التوقيع. رجاءً لا تغيّر عنوان الموضوع ولا السطر الذي فوق هذا التعليق، فالأداة تعتمد عليهما في ربط النقاش بالمفردة. --> --[[مستخدم:أبو هشام|أبو هشام]] <sup>[[نقاش المستخدم:أبو هشام|«نقاش»]]</sup> 16:47، 22 أغسطس 2026 (ت ع م) glh9gylvvo6qmmm6t3xympjah19izhf تَخَذْرَفَ 0 241753 1099145 2026-08-22T13:25:05Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099145 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534873}} === المعاني === '''تَخَذْرَفَ''' {{تفعلل}} {{معجمية|L1534873|معاني}} === النطق === * {{أصد-عر|تَخَذْرَفَ}} {{-}} === التصريفات === {{تصريف|جذر=خذرف|وزن=تفعلل}} === المراجع === {{مراجع}} 9n8u4jdvnpr9em2xls12jfas3cciufv خَذْعَبَ 0 241754 1099146 2026-08-22T13:27:10Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099146 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534877}} === المعاني === '''خَذْعَبَ''' {{فعلل}} {{معجمية|L1534877|معاني}} === النطق === * {{أصد-عر|خَذْعَبَ}} {{-}} === التصريفات === {{تصريف|جذر=خذعب|وزن=فعلل}} === المراجع === {{مراجع}} 5t1qe3t4jmlrkldts90m08i099p81qz اِسْتَخْذَى 0 241755 1099147 2026-08-22T13:34:45Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099147 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534891}} === المعاني === '''اِسْتَخْذَى''' {{استفعل}} {{معجمية|L1534891|معاني}} === النطق === * {{أصد-عر|اِسْتَخْذَى}} {{-}} === التصريفات === {{تصريف|جذر=خذي|وزن=استفعل}} === المراجع === {{مراجع}} o82qvnjiujpuki2r2ku67188afgisqw خَرْبَشَ 0 241756 1099148 2026-08-22T13:42:19Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099148 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1484012}} === المعاني === '''خَرْبَشَ''' {{فعلل}} {{معجمية|L1484012|معاني}} === النطق === * {{أصد-عر|خَرْبَشَ}} {{-}} === التصريفات === {{تصريف|جذر=خربش|وزن=فعلل}} === المراجع === {{مراجع}} aeqcrafe0xmhpij1j48osv4eoelopuw خَرْبَصَ 0 241757 1099149 2026-08-22T13:46:26Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099149 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534896}} === المعاني === '''خَرْبَصَ''' {{فعلل}} {{معجمية|L1534896|معاني}} === النطق === * {{أصد-عر|خَرْبَصَ}} {{-}} === التصريفات === {{تصريف|جذر=خربص|وزن=فعلل}} === المراجع === {{مراجع}} kze1ze28x4rzs7pzxg31didtlapijg5 خَرْخَرَ 0 241758 1099150 2026-08-22T14:00:10Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099150 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1491976}} === المعاني === '''خَرْخَرَ''' {{فعلل}} {{معجمية|L1491976|معاني}} === النطق === * {{أصد-عر|خَرْخَرَ}} {{-}} === التصريفات === {{تصريف|جذر=خرخر|وزن=فعلل}} === المراجع === {{مراجع}} aie1c01dt4mm11k76fy08taqsilt32j خَارَشَ 0 241759 1099151 2026-08-22T14:06:10Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099151 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534917}} === المعاني === '''خَارَشَ''' {{فاعل}} {{معجمية|L1534917|معاني}} === النطق === * {{أصد-عر|خَارَشَ}} {{-}} === التصريفات === {{تصريف|جذر=خرش|وزن=فاعل}} === المراجع === {{مراجع}} 2rmodg3c5hryyrir5p5y5fugclteqsk خَرْشَفَ 0 241760 1099152 2026-08-22T14:08:34Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099152 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1492059}} === المعاني === '''خَرْشَفَ''' {{فعلل}} {{معجمية|L1492059|معاني}} === النطق === * {{أصد-عر|خَرْشَفَ}} {{-}} === التصريفات === {{تصريف|جذر=خرشف|وزن=فعلل}} === المراجع === {{مراجع}} knufangpuwppf7q0zlcrrs17oako85p خَرْشَمَ 0 241761 1099153 2026-08-22T14:12:21Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099153 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534920}} === المعاني === '''خَرْشَمَ''' {{فعلل}} {{معجمية|L1534920|معاني}} === النطق === * {{أصد-عر|خَرْشَمَ}} {{-}} === التصريفات === {{تصريف|جذر=خرشم|وزن=فعلل}} === المراجع === {{مراجع}} jonw5wn03zfgw3vzcj1d2mw34itxzb1 خَرْدَلَ 0 241762 1099154 2026-08-22T14:23:47Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099154 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1497968}} === المعاني === '''خَرْدَلَ''' {{فعلل}} {{معجمية|L1497968|معاني}} === النطق === * {{أصد-عر|خَرْدَلَ}} {{-}} === التصريفات === {{تصريف|جذر=خردل|وزن=فعلل}} === المراجع === {{مراجع}} 9eo4oc3s1898j45j4izmcyelk6b5ptw اِخْتَرَطَ 0 241763 1099155 2026-08-22T14:33:23Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099155 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1485882}} === المعاني === '''اِخْتَرَطَ''' {{افتعل}} {{معجمية|L1485882|معاني}} === النطق === * {{أصد-عر|اِخْتَرَطَ}} {{-}} === التصريفات === {{تصريف|جذر=خرط|وزن=افتعل}} === المراجع === {{مراجع}} cgq2dva5kd1dz5x2ji8trhm48gfgeu0 اِخْرَوَّطَ 0 241764 1099156 2026-08-22T14:40:46Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099156 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1485957}} === المعاني === '''اِخْرَوَّطَ''' {{افعوّل}} {{معجمية|L1485957|معاني}} === النطق === * {{أصد-عر|اِخْرَوَّطَ}} {{-}} === التصريفات === {{تصريف|جذر=خرط|وزن=افعوّل}} === المراجع === {{مراجع}} icyrbf7fqs0kx6j5f647a3cwhep6276 اِسْتَخْرَطَ 0 241765 1099157 2026-08-22T14:46:00Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099157 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534927}} === المعاني === '''اِسْتَخْرَطَ''' {{استفعل}} {{معجمية|L1534927|معاني}} === النطق === * {{أصد-عر|اِسْتَخْرَطَ}} {{-}} === التصريفات === {{تصريف|جذر=خرط|وزن=استفعل}} === المراجع === {{مراجع}} 3bqudm3c9xbtzn1c1g5zxznzada0rpk تَخَرَّطَ 0 241766 1099158 2026-08-22T14:51:28Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099158 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534928}} === المعاني === '''تَخَرَّطَ''' {{تفعّل}} {{معجمية|L1534928|معاني}} === النطق === * {{أصد-عر|تَخَرَّطَ}} {{-}} === التصريفات === {{تصريف|جذر=خرط|وزن=تفعّل}} === المراجع === {{مراجع}} 10mwyc7a41tcbwmz7lzpqxsc6z12g28 اِخْتَرَعَ 0 241767 1099160 2026-08-22T15:20:26Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099160 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1477268}} === المعاني === '''اِخْتَرَعَ''' {{افتعل}} {{معجمية|L1477268|معاني}} === النطق === * {{أصد-عر|اِخْتَرَعَ}} {{-}} === التصريفات === {{تصريف|جذر=خرع|وزن=افتعل}} === المراجع === {{مراجع}} isg6da9qunx1y8adoo79j2gtgcvge6u اِخْتَرَفَ 0 241768 1099161 2026-08-22T15:31:53Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099161 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534933}} === المعاني === '''اِخْتَرَفَ''' {{افتعل}} {{معجمية|L1534933|معاني}} === النطق === * {{أصد-عر|اِخْتَرَفَ}} {{-}} === التصريفات === {{تصريف|جذر=خرف|وزن=افتعل}} === المراجع === {{مراجع}} 0apxi26g2vkqt49mk185v8tpopwr1oc خَارَفَ 0 241769 1099162 2026-08-22T15:35:12Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099162 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534934}} === المعاني === '''خَارَفَ''' {{فاعل}} {{معجمية|L1534934|معاني}} === النطق === * {{أصد-عر|خَارَفَ}} {{-}} === التصريفات === {{تصريف|جذر=خرف|وزن=فاعل}} === المراجع === {{مراجع}} ngm6zuogt6qj5re00x5il730pnhitzj خَرْفَجَ 0 241770 1099163 2026-08-22T15:43:59Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099163 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534935}} === المعاني === '''خَرْفَجَ''' {{فعلل}} {{معجمية|L1534935|معاني}} === النطق === * {{أصد-عر|خَرْفَجَ}} {{-}} === التصريفات === {{تصريف|جذر=خرفج|وزن=فعلل}} === المراجع === {{مراجع}} sbwqdjo84x23subua72wnyo41syhr9c اِخْرَنْفَقَ 0 241771 1099164 2026-08-22T15:46:36Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099164 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534939}} === المعاني === '''اِخْرَنْفَقَ''' {{افعنلل}} {{معجمية|L1534939|معاني}} === النطق === * {{أصد-عر|اِخْرَنْفَقَ}} {{-}} === التصريفات === {{تصريف|جذر=خرفق|وزن=افعنلل}} === المراجع === {{مراجع}} 6hhqr4icso6v2o59wlkbwc50y7ub1cc أَسَاحَ 0 241772 1099165 2026-08-22T16:18:52Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099165 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1537188}} === المعاني === '''أَسَاحَ''' {{أفعل}} {{معجمية|L1537188|معاني}} === النطق === * {{أصد-عر|أَسَاحَ}} {{-}} === التصريفات === {{تصريف|جذر=سيح|وزن=أفعل}} === المراجع === {{مراجع}} h5m4rf8q5nhvobjzpuiv279h9f9tut5 اِسْتَرْطَلَ 0 241773 1099166 2026-08-22T16:20:00Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099166 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1536072}} === المعاني === '''اِسْتَرْطَلَ''' {{استفعل}} {{معجمية|L1536072|معاني}} === النطق === * {{أصد-عر|اِسْتَرْطَلَ}} {{-}} === التصريفات === {{تصريف|جذر=رطل|وزن=استفعل}} === المراجع === {{مراجع}} oixa40wmqj4q731iibpjn57gtfda31b تَشَدَّخَ 0 241774 1099167 2026-08-22T16:21:12Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099167 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1537290}} === المعاني === '''تَشَدَّخَ''' {{تفعّل}} {{معجمية|L1537290|معاني}} === النطق === * {{أصد-عر|تَشَدَّخَ}} {{-}} === التصريفات === {{تصريف|جذر=شدخ|وزن=تفعّل}} === المراجع === {{مراجع}} mpeepnrgthkkyqxzw5senvnz48xoovt تَرَاغَبَ 0 241775 1099168 2026-08-22T16:21:59Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099168 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1497628}} === المعاني === '''تَرَاغَبَ''' {{تفاعل}} {{معجمية|L1497628|معاني}} === النطق === * {{أصد-عر|تَرَاغَبَ}} {{-}} === التصريفات === {{تصريف|جذر=رغب|وزن=تفاعل}} === المراجع === {{مراجع}} jq2wl4yvfc6aed0o6rh9938w1taeno4 اِخْرَوْرَقَ 0 241776 1099169 2026-08-22T16:23:18Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099169 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1534941}} === المعاني === '''اِخْرَوْرَقَ''' {{افعوعل}} {{معجمية|L1534941|معاني}} === النطق === * {{أصد-عر|اِخْرَوْرَقَ}} {{-}} === التصريفات === {{تصريف|جذر=خرق|وزن=افعوعل}} === المراجع === {{مراجع}} 6c4wfzzjx9sb5erftucibzhn67pkdf0 اِسْتَرْضَى 0 241777 1099170 2026-08-22T16:23:39Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099170 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1485391}} === المعاني === '''اِسْتَرْضَى''' {{استفعل}} {{معجمية|L1485391|معاني}} === النطق === * {{أصد-عر|اِسْتَرْضَى}} {{-}} === التصريفات === {{تصريف|جذر=رضو|وزن=استفعل}} === المراجع === {{مراجع}} alh2sp7ea39o2eymi0nbnn3vhbx1d5r اِشْتَرَعَ 0 241778 1099171 2026-08-22T16:24:34Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099171 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1476080}} === المعاني === '''اِشْتَرَعَ''' {{افتعل}} {{معجمية|L1476080|معاني}} === النطق === * {{أصد-عر|اِشْتَرَعَ}} {{-}} === التصريفات === {{تصريف|جذر=شرع|وزن=افتعل}} === المراجع === {{مراجع}} mgjy5f2hgnl2vwc5h0t7ng8lzic94lk زَاهَمَ 0 241779 1099172 2026-08-22T16:26:28Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099172 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1536671}} === المعاني === '''زَاهَمَ''' {{فاعل}} {{معجمية|L1536671|معاني}} === النطق === * {{أصد-عر|زَاهَمَ}} {{-}} === التصريفات === {{تصريف|جذر=زهم|وزن=فاعل}} === المراجع === {{مراجع}} rv6ks6hhrm6ca0nknnpg7vynex5uahf اِرْتَجَى 0 241780 1099173 2026-08-22T16:32:20Z نور إسماعيل 37425 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099173 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1487105}} === المعاني === '''اِرْتَجَى''' {{افتعل}} {{معجمية|L1487105|معاني}} === النطق === * {{أصد-عر|اِرْتَجَى}} {{-}} === التصريفات === {{تصريف|جذر=رجو|وزن=افتعل}} === المراجع === {{مراجع}} t655n05y91379zmpz0w3bwyp0l3u355 اِنْخَرَقَ 0 241781 1099174 2026-08-22T16:32:22Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099174 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1485001}} === المعاني === '''اِنْخَرَقَ''' {{انفعل}} {{معجمية|L1485001|معاني}} === النطق === * {{أصد-عر|اِنْخَرَقَ}} {{-}} === التصريفات === {{تصريف|جذر=خرق|وزن=انفعل}} === المراجع === {{مراجع}} 1u7hp35k3lmscs551t77cxppqd3j92v دَأَكَ 0 241782 1099176 2026-08-22T16:38:40Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099176 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1543555}} === المعاني === '''دَأَكَ''' {{فتح}} {{معجمية|L1543555|معاني}} === النطق === * {{أصد-عر|دَأَكَ}} {{-}} === التصريفات === {{تصريف|جذر=دأك|وزن=فعَل يفعَل}} === المراجع === {{مراجع}} 56ca5852ihfirpjvkyij0cadzurxizm تَدَأَّمَ 0 241783 1099177 2026-08-22T16:41:37Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099177 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535263}} === المعاني === '''تَدَأَّمَ''' {{تفعّل}} {{معجمية|L1535263|معاني}} === النطق === * {{أصد-عر|تَدَأَّمَ}} {{-}} === التصريفات === {{تصريف|جذر=دأم|وزن=تفعّل}} === المراجع === {{مراجع}} azg6zsm67jpk0i4pui5je1e0ghu5zjy تَدَاءَمَ 0 241784 1099178 2026-08-22T16:43:13Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099178 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535262}} === المعاني === '''تَدَاءَمَ''' {{تفاعل}} {{معجمية|L1535262|معاني}} === النطق === * {{أصد-عر|تَدَاءَمَ}} {{-}} === التصريفات === {{تصريف|جذر=دأم|وزن=تفاعل}} === المراجع === {{مراجع}} mgdrwdmrdgcuq5gr3cyc5qb3tsswa95 دَأَى 0 241785 1099180 2026-08-22T16:57:05Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099180 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1544807}} === المعاني === '''دَأَى''' {{فتح}} {{معجمية|L1544807|معاني}} === النطق === * {{أصد-عر|دَأَى}} {{-}} === التصريفات === {{تصريف|جذر=دأي|وزن=فعَل يفعَل}} === المراجع === {{مراجع}} 0h1cjbi07gk6f7x57a3jcz69ko8l1zw دَبْدَبَ 0 241786 1099181 2026-08-22T17:15:59Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099181 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1492076}} === المعاني === '''دَبْدَبَ''' {{فعلل}} {{معجمية|L1492076|معاني}} === النطق === * {{أصد-عر|دَبْدَبَ}} {{-}} === التصريفات === {{تصريف|جذر=دبدب|وزن=فعلل}} === المراجع === {{مراجع}} mw97cgbya1ceem7y6v5buk59qhjibbq اِدْبَاسَّ 0 241787 1099182 2026-08-22T17:20:34Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099182 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535271}} === المعاني === '''اِدْبَاسَّ''' {{افعالّ}} {{معجمية|L1535271|معاني}} === النطق === * {{أصد-عر|اِدْبَاسَّ}} {{-}} === التصريفات === {{تصريف|جذر=دبس|وزن=افعالّ}} === المراجع === {{مراجع}} 4ir5bzyctzhdyhg8tgxm9z4ovkkjw5w وحدة:ar-verb/testcases/بيانات/1 828 241788 1099190 2026-08-22T21:18:21Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099190 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 1 من 4. return { { label = "فَعَلَ ـُ (p.125, abstract paradigm)", root = "فعل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُفْعُلَا"}, {"imp_2fp", "اُفْعُلْنَ"}, {"imp_2fs", "اُفْعُلِي"}, {"imp_2mp", "اُفْعُلُوا"}, {"imp_2ms", "اُفْعُلْ"}, {"ind_1p", "نَفْعُلُ"}, {"ind_1s", "أَفْعُلُ"}, {"ind_2d", "تَفْعُلَانِ"}, {"ind_2fp", "تَفْعُلْنَ"}, {"ind_2fs", "تَفْعُلِينَ"}, {"ind_2mp", "تَفْعُلُونَ"}, {"ind_2ms", "تَفْعُلُ"}, {"ind_3fd", "تَفْعُلَانِ"}, {"ind_3fp", "يَفْعُلْنَ"}, {"ind_3fs", "تَفْعُلُ"}, {"ind_3md", "يَفْعُلَانِ"}, {"ind_3mp", "يَفْعُلُونَ"}, {"ind_3ms", "يَفْعُلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "فَعَلْنَا"}, {"past_1s", "فَعَلْتُ"}, {"past_2d", "فَعَلْتُمَا"}, {"past_2fp", "فَعَلْتُنَّ"}, {"past_2fs", "فَعَلْتِ"}, {"past_2mp", "فَعَلْتُمْ"}, {"past_2ms", "فَعَلْتَ"}, {"past_3fd", "فَعَلَتَا"}, {"past_3fp", "فَعَلْنَ"}, {"past_3fs", "فَعَلَتْ"}, {"past_3md", "فَعَلَا"}, {"past_3mp", "فَعَلُوا"}, {"past_3ms", "فَعَلَ"}, {"past_pass_1p", "فُعِلْنَا"}, {"past_pass_1s", "فُعِلْتُ"}, {"past_pass_2d", "فُعِلْتُمَا"}, {"past_pass_2fp", "فُعِلْتُنَّ"}, {"past_pass_2fs", "فُعِلْتِ"}, {"past_pass_2mp", "فُعِلْتُمْ"}, {"past_pass_2ms", "فُعِلْتَ"}, {"past_pass_3fd", "فُعِلَتَا"}, {"past_pass_3fp", "فُعِلْنَ"}, {"past_pass_3fs", "فُعِلَتْ"}, {"past_pass_3md", "فُعِلَا"}, {"past_pass_3mp", "فُعِلُوا"}, {"past_pass_3ms", "فُعِلَ"}, }, }, { label = "رَؤُفَ (p.198)", root = "رأف", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُرْؤُفَا"}, {"imp_2fp", "اُرْؤُفْنَ"}, {"imp_2fs", "اُرْؤُفِي"}, {"imp_2mp", "اُرْؤُفُوا"}, {"imp_2ms", "اُرْؤُفْ"}, {"ind_1p", "نَرْؤُفُ"}, {"ind_1s", "أَرْؤُفُ"}, {"ind_2d", "تَرْؤُفَانِ"}, {"ind_2fp", "تَرْؤُفْنَ"}, {"ind_2fs", "تَرْؤُفِينَ"}, {"ind_2mp", "تَرْؤُفُونَ"}, {"ind_2ms", "تَرْؤُفُ"}, {"ind_3fd", "تَرْؤُفَانِ"}, {"ind_3fp", "يَرْؤُفْنَ"}, {"ind_3fs", "تَرْؤُفُ"}, {"ind_3md", "يَرْؤُفَانِ"}, {"ind_3mp", "يَرْؤُفُونَ"}, {"ind_3ms", "يَرْؤُفُ"}, {"past_1p", "رَؤُفْنَا"}, {"past_1s", "رَؤُفْتُ"}, {"past_2d", "رَؤُفْتُمَا"}, {"past_2fp", "رَؤُفْتُنَّ"}, {"past_2fs", "رَؤُفْتِ"}, {"past_2mp", "رَؤُفْتُمْ"}, {"past_2ms", "رَؤُفْتَ"}, {"past_3fd", "رَؤُفَتَا"}, {"past_3fp", "رَؤُفْنَ"}, {"past_3fs", "رَؤُفَتْ"}, {"past_3md", "رَؤُفَا"}, {"past_3mp", "رَؤُفُوا"}, {"past_3ms", "رَؤُفَ"}, }, }, { label = "ضَؤُلَ (p.198)", root = "ضأل", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُضْؤُلَا"}, {"imp_2fp", "اُضْؤُلْنَ"}, {"imp_2fs", "اُضْؤُلِي"}, {"imp_2mp", "اُضْؤُلُوا"}, {"imp_2ms", "اُضْؤُلْ"}, {"ind_1p", "نَضْؤُلُ"}, {"ind_1s", "أَضْؤُلُ"}, {"ind_2d", "تَضْؤُلَانِ"}, {"ind_2fp", "تَضْؤُلْنَ"}, {"ind_2fs", "تَضْؤُلِينَ"}, {"ind_2mp", "تَضْؤُلُونَ"}, {"ind_2ms", "تَضْؤُلُ"}, {"ind_3fd", "تَضْؤُلَانِ"}, {"ind_3fp", "يَضْؤُلْنَ"}, {"ind_3fs", "تَضْؤُلُ"}, {"ind_3md", "يَضْؤُلَانِ"}, {"ind_3mp", "يَضْؤُلُونَ"}, {"ind_3ms", "يَضْؤُلُ"}, {"past_1p", "ضَؤُلْنَا"}, {"past_1s", "ضَؤُلْتُ"}, {"past_2d", "ضَؤُلْتُمَا"}, {"past_2fp", "ضَؤُلْتُنَّ"}, {"past_2fs", "ضَؤُلْتِ"}, {"past_2mp", "ضَؤُلْتُمْ"}, {"past_2ms", "ضَؤُلْتَ"}, {"past_3fd", "ضَؤُلَتَا"}, {"past_3fp", "ضَؤُلْنَ"}, {"past_3fs", "ضَؤُلَتْ"}, {"past_3md", "ضَؤُلَا"}, {"past_3mp", "ضَؤُلُوا"}, {"past_3ms", "ضَؤُلَ"}, }, }, { label = "آخَذَ (p.260)", root = "أخذ", wazn = "فاعل", forms = { {"imp_2d", "آخِذَا"}, {"imp_2fp", "آخِذْنَ"}, {"imp_2fs", "آخِذِي"}, {"imp_2mp", "آخِذُوا"}, {"imp_2ms", "آخِذْ"}, {"ind_1p", "نُؤَاخِذُ"}, {"ind_1s", "أُؤَاخِذُ"}, {"ind_2d", "تُؤَاخِذَانِ"}, {"ind_2fp", "تُؤَاخِذْنَ"}, {"ind_2fs", "تُؤَاخِذِينَ"}, {"ind_2mp", "تُؤَاخِذُونَ"}, {"ind_2ms", "تُؤَاخِذُ"}, {"ind_3fd", "تُؤَاخِذَانِ"}, {"ind_3fp", "يُؤَاخِذْنَ"}, {"ind_3fs", "تُؤَاخِذُ"}, {"ind_3md", "يُؤَاخِذَانِ"}, {"ind_3mp", "يُؤَاخِذُونَ"}, {"ind_3ms", "يُؤَاخِذُ"}, {"past_1p", "آخَذْنَا"}, {"past_1s", "آخَذْتُ"}, {"past_2d", "آخَذْتُمَا"}, {"past_2fp", "آخَذْتُنَّ"}, {"past_2fs", "آخَذْتِ"}, {"past_2mp", "آخَذْتُمْ"}, {"past_2ms", "آخَذْتَ"}, {"past_3fd", "آخَذَتَا"}, {"past_3fp", "آخَذْنَ"}, {"past_3fs", "آخَذَتْ"}, {"past_3md", "آخَذَا"}, {"past_3mp", "آخَذُوا"}, {"past_3ms", "آخَذَ"}, }, }, { label = "اِدَّعَمَ (p.334)", root = "دعم", wazn = "افتعل", forms = { {"imp_2d", "اِدَّعِمَا"}, {"imp_2fp", "اِدَّعِمْنَ"}, {"imp_2fs", "اِدَّعِمِي"}, {"imp_2mp", "اِدَّعِمُوا"}, {"imp_2ms", "اِدَّعِمْ"}, {"ind_1p", "نَدَّعِمُ"}, {"ind_1s", "أَدَّعِمُ"}, {"ind_2d", "تَدَّعِمَانِ"}, {"ind_2fp", "تَدَّعِمْنَ"}, {"ind_2fs", "تَدَّعِمِينَ"}, {"ind_2mp", "تَدَّعِمُونَ"}, {"ind_2ms", "تَدَّعِمُ"}, {"ind_3fd", "تَدَّعِمَانِ"}, {"ind_3fp", "يَدَّعِمْنَ"}, {"ind_3fs", "تَدَّعِمُ"}, {"ind_3md", "يَدَّعِمَانِ"}, {"ind_3mp", "يَدَّعِمُونَ"}, {"ind_3ms", "يَدَّعِمُ"}, {"past_1p", "اِدَّعَمْنَا"}, {"past_1s", "اِدَّعَمْتُ"}, {"past_2d", "اِدَّعَمْتُمَا"}, {"past_2fp", "اِدَّعَمْتُنَّ"}, {"past_2fs", "اِدَّعَمْتِ"}, {"past_2mp", "اِدَّعَمْتُمْ"}, {"past_2ms", "اِدَّعَمْتَ"}, {"past_3fd", "اِدَّعَمَتَا"}, {"past_3fp", "اِدَّعَمْنَ"}, {"past_3fs", "اِدَّعَمَتْ"}, {"past_3md", "اِدَّعَمَا"}, {"past_3mp", "اِدَّعَمُوا"}, {"past_3ms", "اِدَّعَمَ"}, }, }, { label = "هَنَأَ ـُ (p.135، مهموز اللام)", root = "هنأ", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُهْنُؤَا"}, {"imp_2fp", "اُهْنُؤْنَ"}, {"imp_2fs", "اُهْنُئِي"}, {"imp_2mp", "اُهْنُؤُوا"}, {"imp_2ms", "اُهْنُؤْ"}, {"ind_1p", "نَهْنُؤُ"}, {"ind_1s", "أَهْنُؤُ"}, {"ind_2d", "تَهْنُؤَانِ"}, {"ind_2fp", "تَهْنُؤْنَ"}, {"ind_2fs", "تَهْنُئِينَ"}, {"ind_2mp", "تَهْنُؤُونَ"}, {"ind_2ms", "تَهْنُؤُ"}, {"ind_3fd", "تَهْنُؤَانِ"}, {"ind_3fp", "يَهْنُؤْنَ"}, {"ind_3fs", "تَهْنُؤُ"}, {"ind_3md", "يَهْنُؤَانِ"}, {"ind_3mp", "يَهْنُؤُونَ"}, {"ind_3ms", "يَهْنُؤُ"}, {"ind_pass_1p", "نُهْنَأُ"}, {"ind_pass_1s", "أُهْنَأُ"}, {"ind_pass_2d", "تُهْنَآنِ"}, {"ind_pass_2fp", "تُهْنَأْنَ"}, {"ind_pass_2fs", "تُهْنَئِينَ"}, {"ind_pass_2mp", "تُهْنَؤُونَ"}, {"ind_pass_2ms", "تُهْنَأُ"}, {"ind_pass_3fd", "تُهْنَآنِ"}, {"ind_pass_3fp", "يُهْنَأْنَ"}, {"ind_pass_3fs", "تُهْنَأُ"}, {"ind_pass_3md", "يُهْنَآنِ"}, {"ind_pass_3mp", "يُهْنَؤُونَ"}, {"ind_pass_3ms", "يُهْنَأُ"}, {"past_1p", "هَنَأْنَا"}, {"past_1s", "هَنَأْتُ"}, {"past_2d", "هَنَأْتُمَا"}, {"past_2fp", "هَنَأْتُنَّ"}, {"past_2fs", "هَنَأْتِ"}, {"past_2mp", "هَنَأْتُمْ"}, {"past_2ms", "هَنَأْتَ"}, {"past_3fd", "هَنَأَتَا"}, {"past_3fp", "هَنَأْنَ"}, {"past_3fs", "هَنَأَتْ"}, {"past_3md", "هَنَآ"}, {"past_3mp", "هَنَؤُوا"}, {"past_3ms", "هَنَأَ"}, {"past_pass_1p", "هُنِئْنَا"}, {"past_pass_1s", "هُنِئْتُ"}, {"past_pass_2d", "هُنِئْتُمَا"}, {"past_pass_2fp", "هُنِئْتُنَّ"}, {"past_pass_2fs", "هُنِئْتِ"}, {"past_pass_2mp", "هُنِئْتُمْ"}, {"past_pass_2ms", "هُنِئْتَ"}, {"past_pass_3fd", "هُنِئَتَا"}, {"past_pass_3fp", "هُنِئْنَ"}, {"past_pass_3fs", "هُنِئَتْ"}, {"past_pass_3md", "هُنِئَا"}, {"past_pass_3mp", "هُنِئُوا"}, {"past_pass_3ms", "هُنِئَ"}, }, }, { label = "دَعا ـُ (p.141، ناقص واوي)", root = "دعو", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُدْعُوَا"}, {"imp_2fp", "اُدْعُونَ"}, {"imp_2fs", "اِدْعِي"}, {"imp_2mp", "اُدْعُوا"}, {"imp_2ms", "اُدْعُ"}, {"ind_1p", "نَدْعُو"}, {"ind_1s", "أَدْعُو"}, {"ind_2d", "تَدْعُوَانِ"}, {"ind_2fp", "تَدْعُونَ"}, {"ind_2fs", "تَدْعِينَ"}, {"ind_2mp", "تَدْعُونَ"}, {"ind_2ms", "تَدْعُو"}, {"ind_3fd", "تَدْعُوَانِ"}, {"ind_3fp", "يَدْعُونَ"}, {"ind_3fs", "تَدْعُو"}, {"ind_3md", "يَدْعُوَانِ"}, {"ind_3mp", "يَدْعُونَ"}, {"ind_3ms", "يَدْعُو"}, {"ind_pass_1p", "نُدْعَى"}, {"ind_pass_1s", "أُدْعَى"}, {"ind_pass_2d", "تُدْعَيَانِ"}, {"ind_pass_2fp", "تُدْعَيْنَ"}, {"ind_pass_2fs", "تُدْعَيْنَ"}, {"ind_pass_2mp", "تُدْعَوْنَ"}, {"ind_pass_2ms", "تُدْعَى"}, {"ind_pass_3fd", "تُدْعَيَانِ"}, {"ind_pass_3fp", "يُدْعَيْنَ"}, {"ind_pass_3fs", "تُدْعَى"}, {"ind_pass_3md", "يُدْعَيَانِ"}, {"ind_pass_3mp", "يُدْعَوْنَ"}, {"ind_pass_3ms", "يُدْعَى"}, {"past_1p", "دَعَوْنَا"}, {"past_1s", "دَعَوْتُ"}, {"past_2d", "دَعَوْتُمَا"}, {"past_2fp", "دَعَوْتُنَّ"}, {"past_2fs", "دَعَوْتِ"}, {"past_2mp", "دَعَوْتُمْ"}, {"past_2ms", "دَعَوْتَ"}, {"past_3fd", "دَعَتَا"}, {"past_3fp", "دَعَوْنَ"}, {"past_3fs", "دَعَتْ"}, {"past_3md", "دَعَوَا"}, {"past_3mp", "دَعَوْا"}, {"past_3ms", "دَعَا"}, {"past_pass_1p", "دُعِينَا"}, {"past_pass_1s", "دُعِيتُ"}, {"past_pass_2d", "دُعِيتُمَا"}, {"past_pass_2fp", "دُعِيتُنَّ"}, {"past_pass_2fs", "دُعِيتِ"}, {"past_pass_2mp", "دُعِيتُمْ"}, {"past_pass_2ms", "دُعِيتَ"}, {"past_pass_3fd", "دُعِيَتَا"}, {"past_pass_3fp", "دُعِينَ"}, {"past_pass_3fs", "دُعِيَتْ"}, {"past_pass_3md", "دُعِيَا"}, {"past_pass_3mp", "دُعُوا"}, {"past_pass_3ms", "دُعِيَ"}, }, }, { label = "هَيُؤَ ـُ (p.203، أجوف على فعُل)", root = "هيأ", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُهْيُؤَا"}, {"imp_2fp", "اُهْيُؤْنَ"}, {"imp_2fs", "اُهْيُئِي"}, {"imp_2mp", "اُهْيُؤُوا"}, {"imp_2ms", "اُهْيُؤْ"}, {"ind_1p", "نَهْيُؤُ"}, {"ind_1s", "أَهْيُؤُ"}, {"ind_2d", "تَهْيُؤَانِ"}, {"ind_2fp", "تَهْيُؤْنَ"}, {"ind_2fs", "تَهْيُئِينَ"}, {"ind_2mp", "تَهْيُؤُونَ"}, {"ind_2ms", "تَهْيُؤُ"}, {"ind_3fd", "تَهْيُؤَانِ"}, {"ind_3fp", "يَهْيُؤْنَ"}, {"ind_3fs", "تَهْيُؤُ"}, {"ind_3md", "يَهْيُؤَانِ"}, {"ind_3mp", "يَهْيُؤُونَ"}, {"ind_3ms", "يَهْيُؤُ"}, {"past_1p", "هَيُؤْنَا"}, {"past_1s", "هَيُؤْتُ"}, {"past_2d", "هَيُؤْتُمَا"}, {"past_2fp", "هَيُؤْتُنَّ"}, {"past_2fs", "هَيُؤْتِ"}, {"past_2mp", "هَيُؤْتُمْ"}, {"past_2ms", "هَيُؤْتَ"}, {"past_3fd", "هَيُؤَتَا"}, {"past_3fp", "هَيُؤْنَ"}, {"past_3fs", "هَيُؤَتْ"}, {"past_3md", "هَيُؤَا"}, {"past_3mp", "هَيُؤُوا"}, {"past_3ms", "هَيُؤَ"}, }, }, { label = "وَفَى ـِ (p.164، لفيف مفروق)", root = "وفي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "فِيَا"}, {"imp_2fp", "فِينَ"}, {"imp_2fs", "فِي"}, {"imp_2mp", "فُوا"}, {"imp_2ms", "فِ"}, {"ind_1p", "نَفِي"}, {"ind_1s", "أَفِي"}, {"ind_2d", "تَفِيَانِ"}, {"ind_2fp", "تَفِينَ"}, {"ind_2fs", "تَفِينَ"}, {"ind_2mp", "تَفُونَ"}, {"ind_2ms", "تَفِي"}, {"ind_3fd", "تَفِيَانِ"}, {"ind_3fp", "يَفِينَ"}, {"ind_3fs", "تَفِي"}, {"ind_3md", "يَفِيَانِ"}, {"ind_3mp", "يَفُونَ"}, {"ind_3ms", "يَفِي"}, {"ind_pass_1p", "نُوفَى"}, {"ind_pass_1s", "أُوفَى"}, {"ind_pass_2d", "تُوفَيَانِ"}, {"ind_pass_2fp", "تُوفَيْنَ"}, {"ind_pass_2fs", "تُوفَيْنَ"}, {"ind_pass_2mp", "تُوفَوْنَ"}, {"ind_pass_2ms", "تُوفَى"}, {"ind_pass_3fd", "تُوفَيَانِ"}, {"ind_pass_3fp", "يُوفَيْنَ"}, {"ind_pass_3fs", "تُوفَى"}, {"ind_pass_3md", "يُوفَيَانِ"}, {"ind_pass_3mp", "يُوفَوْنَ"}, {"ind_pass_3ms", "يُوفَى"}, {"past_1p", "وَفَيْنَا"}, {"past_1s", "وَفَيْتُ"}, {"past_2d", "وَفَيْتُمَا"}, {"past_2fp", "وَفَيْتُنَّ"}, {"past_2fs", "وَفَيْتِ"}, {"past_2mp", "وَفَيْتُمْ"}, {"past_2ms", "وَفَيْتَ"}, {"past_3fd", "وَفَتَا"}, {"past_3fp", "وَفَيْنَ"}, {"past_3fs", "وَفَتْ"}, {"past_3md", "وَفَيَا"}, {"past_3mp", "وَفَوْا"}, {"past_3ms", "وَفَى"}, {"past_pass_1p", "وُفِينَا"}, {"past_pass_1s", "وُفِيتُ"}, {"past_pass_2d", "وُفِيتُمَا"}, {"past_pass_2fp", "وُفِيتُنَّ"}, {"past_pass_2fs", "وُفِيتِ"}, {"past_pass_2mp", "وُفِيتُمْ"}, {"past_pass_2ms", "وُفِيتَ"}, {"past_pass_3fd", "وُفِيَتَا"}, {"past_pass_3fp", "وُفِينَ"}, {"past_pass_3fs", "وُفِيَتْ"}, {"past_pass_3md", "وُفِيَا"}, {"past_pass_3mp", "وُفُوا"}, {"past_pass_3ms", "وُفِيَ"}, }, }, { label = "وَلِيَ ـِ (p.238، لفيف مفروق)", root = "ولي", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "لِيَا"}, {"imp_2fp", "لِينَ"}, {"imp_2fs", "لِي"}, {"imp_2mp", "لُوا"}, {"imp_2ms", "لِ"}, {"ind_1p", "نَلِي"}, {"ind_1s", "أَلِي"}, {"ind_2d", "تَلِيَانِ"}, {"ind_2fp", "تَلِينَ"}, {"ind_2fs", "تَلِينَ"}, {"ind_2mp", "تَلُونَ"}, {"ind_2ms", "تَلِي"}, {"ind_3fd", "تَلِيَانِ"}, {"ind_3fp", "يَلِينَ"}, {"ind_3fs", "تَلِي"}, {"ind_3md", "يَلِيَانِ"}, {"ind_3mp", "يَلُونَ"}, {"ind_3ms", "يَلِي"}, {"ind_pass_1p", "نُولَى"}, {"ind_pass_1s", "أُولَى"}, {"ind_pass_2d", "تُولَيَانِ"}, {"ind_pass_2fp", "تُولَيْنَ"}, {"ind_pass_2fs", "تُولَيْنَ"}, {"ind_pass_2mp", "تُولَوْنَ"}, {"ind_pass_2ms", "تُولَى"}, {"ind_pass_3fd", "تُولَيَانِ"}, {"ind_pass_3fp", "يُولَيْنَ"}, {"ind_pass_3fs", "تُولَى"}, {"ind_pass_3md", "يُولَيَانِ"}, {"ind_pass_3mp", "يُولَوْنَ"}, {"ind_pass_3ms", "يُولَى"}, {"past_1p", "وَلِينَا"}, {"past_1s", "وَلِيتُ"}, {"past_2d", "وَلِيتُمَا"}, {"past_2fp", "وَلِيتُنَّ"}, {"past_2fs", "وَلِيتِ"}, {"past_2mp", "وَلِيتُمْ"}, {"past_2ms", "وَلِيتَ"}, {"past_3fd", "وَلِيَتَا"}, {"past_3fp", "وَلِينَ"}, {"past_3fs", "وَلِيَتْ"}, {"past_3md", "وَلِيَا"}, {"past_3mp", "وَلُوا"}, {"past_3ms", "وَلِيَ"}, {"past_pass_1p", "وُلِينَا"}, {"past_pass_1s", "وُلِيتُ"}, {"past_pass_2d", "وُلِيتُمَا"}, {"past_pass_2fp", "وُلِيتُنَّ"}, {"past_pass_2fs", "وُلِيتِ"}, {"past_pass_2mp", "وُلِيتُمْ"}, {"past_pass_2ms", "وُلِيتَ"}, {"past_pass_3fd", "وُلِيَتَا"}, {"past_pass_3fp", "وُلِينَ"}, {"past_pass_3fs", "وُلِيَتْ"}, {"past_pass_3md", "وُلِيَا"}, {"past_pass_3mp", "وُلُوا"}, {"past_pass_3ms", "وُلِيَ"}, }, }, { label = "تَفاعَلَ (p.302، الوزن السادس)", root = "فعل", wazn = "تفاعل", pass = true, forms = { {"imp_2d", "تَفَاعَلَا"}, {"imp_2fp", "تَفَاعَلْنَ"}, {"imp_2fs", "تَفَاعَلِي"}, {"imp_2mp", "تَفَاعَلُوا"}, {"imp_2ms", "تَفَاعَلْ"}, {"ind_1p", "نَتَفَاعَلُ"}, {"ind_1s", "أَتَفَاعَلُ"}, {"ind_2d", "تَتَفَاعَلَانِ"}, {"ind_2fp", "تَتَفَاعَلْنَ"}, {"ind_2fs", "تَتَفَاعَلِينَ"}, {"ind_2mp", "تَتَفَاعَلُونَ"}, {"ind_2ms", "تَتَفَاعَلُ"}, {"ind_3fd", "تَتَفَاعَلَانِ"}, {"ind_3fp", "يَتَفَاعَلْنَ"}, {"ind_3fs", "تَتَفَاعَلُ"}, {"ind_3md", "يَتَفَاعَلَانِ"}, {"ind_3mp", "يَتَفَاعَلُونَ"}, {"ind_3ms", "يَتَفَاعَلُ"}, {"ind_pass_1p", "نُتَفَاعَلُ"}, {"ind_pass_1s", "أُتَفَاعَلُ"}, {"ind_pass_2d", "تُتَفَاعَلَانِ"}, {"ind_pass_2fp", "تُتَفَاعَلْنَ"}, {"ind_pass_2fs", "تُتَفَاعَلِينَ"}, {"ind_pass_2mp", "تُتَفَاعَلُونَ"}, {"ind_pass_2ms", "تُتَفَاعَلُ"}, {"ind_pass_3fd", "تُتَفَاعَلَانِ"}, {"ind_pass_3fp", "يُتَفَاعَلْنَ"}, {"ind_pass_3fs", "تُتَفَاعَلُ"}, {"ind_pass_3md", "يُتَفَاعَلَانِ"}, {"ind_pass_3mp", "يُتَفَاعَلُونَ"}, {"ind_pass_3ms", "يُتَفَاعَلُ"}, {"past_1p", "تَفَاعَلْنَا"}, {"past_1s", "تَفَاعَلْتُ"}, {"past_2d", "تَفَاعَلْتُمَا"}, {"past_2fp", "تَفَاعَلْتُنَّ"}, {"past_2fs", "تَفَاعَلْتِ"}, {"past_2mp", "تَفَاعَلْتُمْ"}, {"past_2ms", "تَفَاعَلْتَ"}, {"past_3fd", "تَفَاعَلَتَا"}, {"past_3fp", "تَفَاعَلْنَ"}, {"past_3fs", "تَفَاعَلَتْ"}, {"past_3md", "تَفَاعَلَا"}, {"past_3mp", "تَفَاعَلُوا"}, {"past_3ms", "تَفَاعَلَ"}, {"past_pass_1p", "تُفُوعِلْنَا"}, {"past_pass_1s", "تُفُوعِلْتُ"}, {"past_pass_2d", "تُفُوعِلْتُمَا"}, {"past_pass_2fp", "تُفُوعِلْتُنَّ"}, {"past_pass_2fs", "تُفُوعِلْتِ"}, {"past_pass_2mp", "تُفُوعِلْتُمْ"}, {"past_pass_2ms", "تُفُوعِلْتَ"}, {"past_pass_3fd", "تُفُوعِلَتَا"}, {"past_pass_3fp", "تُفُوعِلْنَ"}, {"past_pass_3fs", "تُفُوعِلَتْ"}, {"past_pass_3md", "تُفُوعِلَا"}, {"past_pass_3mp", "تُفُوعِلُوا"}, {"past_pass_3ms", "تُفُوعِلَ"}, }, }, { label = "فَرَّ ـِ (p.147، مضاعف)", root = "فرر", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "فِرَّا"}, {"imp_2fp", "اِفْرِرْنَ"}, {"imp_2fs", "فِرِّي"}, {"imp_2mp", "فِرُّوا"}, {"imp_2ms", "فِرَّ"}, {"ind_1p", "نَفِرُّ"}, {"ind_1s", "أَفِرُّ"}, {"ind_2d", "تَفِرَّانِ"}, {"ind_2fp", "تَفْرِرْنَ"}, {"ind_2fs", "تَفِرِّينَ"}, {"ind_2mp", "تَفِرُّونَ"}, {"ind_2ms", "تَفِرُّ"}, {"ind_3fd", "تَفِرَّانِ"}, {"ind_3fp", "يَفْرِرْنَ"}, {"ind_3fs", "تَفِرُّ"}, {"ind_3md", "يَفِرَّانِ"}, {"ind_3mp", "يَفِرُّونَ"}, {"ind_3ms", "يَفِرُّ"}, {"ind_pass_1p", "نُفَرُّ"}, {"ind_pass_1s", "أُفَرُّ"}, {"ind_pass_2d", "تُفَرَّانِ"}, {"ind_pass_2fp", "تُفْرَرْنَ"}, {"ind_pass_2fs", "تُفَرِّينَ"}, {"ind_pass_2mp", "تُفَرُّونَ"}, {"ind_pass_2ms", "تُفَرُّ"}, {"ind_pass_3fd", "تُفَرَّانِ"}, {"ind_pass_3fp", "يُفْرَرْنَ"}, {"ind_pass_3fs", "تُفَرُّ"}, {"ind_pass_3md", "يُفَرَّانِ"}, {"ind_pass_3mp", "يُفَرُّونَ"}, {"ind_pass_3ms", "يُفَرُّ"}, {"past_1p", "فَرَرْنَا"}, {"past_1s", "فَرَرْتُ"}, {"past_2d", "فَرَرْتُمَا"}, {"past_2fp", "فَرَرْتُنَّ"}, {"past_2fs", "فَرَرْتِ"}, {"past_2mp", "فَرَرْتُمْ"}, {"past_2ms", "فَرَرْتَ"}, {"past_3fd", "فَرَّتَا"}, {"past_3fp", "فَرَرْنَ"}, {"past_3fs", "فَرَّتْ"}, {"past_3md", "فَرَّا"}, {"past_3mp", "فَرُّوا"}, {"past_3ms", "فَرَّ"}, {"past_pass_1p", "فُرِرْنَا"}, {"past_pass_1s", "فُرِرْتُ"}, {"past_pass_2d", "فُرِرْتُمَا"}, {"past_pass_2fp", "فُرِرْتُنَّ"}, {"past_pass_2fs", "فُرِرْتِ"}, {"past_pass_2mp", "فُرِرْتُمْ"}, {"past_pass_2ms", "فُرِرْتَ"}, {"past_pass_3fd", "فُرَّتَا"}, {"past_pass_3fp", "فُرِرْنَ"}, {"past_pass_3fs", "فُرَّتْ"}, {"past_pass_3md", "فُرَّا"}, {"past_pass_3mp", "فُرُّوا"}, {"past_pass_3ms", "فُرَّ"}, }, }, { label = "خافَ ـَ (p.222، أجوف واوي)", root = "خوف", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "خَافَا"}, {"imp_2fp", "خَفْنَ"}, {"imp_2fs", "خَافِي"}, {"imp_2mp", "خَافُوا"}, {"imp_2ms", "خَفْ"}, {"ind_1p", "نَخَافُ"}, {"ind_1s", "أَخَافُ"}, {"ind_2d", "تَخَافَانِ"}, {"ind_2fp", "تَخَفْنَ"}, {"ind_2fs", "تَخَافِينَ"}, {"ind_2mp", "تَخَافُونَ"}, {"ind_2ms", "تَخَافُ"}, {"ind_3fd", "تَخَافَانِ"}, {"ind_3fp", "يَخَفْنَ"}, {"ind_3fs", "تَخَافُ"}, {"ind_3md", "يَخَافَانِ"}, {"ind_3mp", "يَخَافُونَ"}, {"ind_3ms", "يَخَافُ"}, {"ind_pass_1p", "نُخَافُ"}, {"ind_pass_1s", "أُخَافُ"}, {"ind_pass_2d", "تُخَافَانِ"}, {"ind_pass_2fp", "تُخَفْنَ"}, {"ind_pass_2fs", "تُخَافِينَ"}, {"ind_pass_2mp", "تُخَافُونَ"}, {"ind_pass_2ms", "تُخَافُ"}, {"ind_pass_3fd", "تُخَافَانِ"}, {"ind_pass_3fp", "يُخَفْنَ"}, {"ind_pass_3fs", "تُخَافُ"}, {"ind_pass_3md", "يُخَافَانِ"}, {"ind_pass_3mp", "يُخَافُونَ"}, {"ind_pass_3ms", "يُخَافُ"}, {"past_1p", "خِفْنَا"}, {"past_1s", "خِفْتُ"}, {"past_2d", "خِفْتُمَا"}, {"past_2fp", "خِفْتُنَّ"}, {"past_2fs", "خِفْتِ"}, {"past_2mp", "خِفْتُمْ"}, {"past_2ms", "خِفْتَ"}, {"past_3fd", "خَافَتَا"}, {"past_3fp", "خِفْنَ"}, {"past_3fs", "خَافَتْ"}, {"past_3md", "خَافَا"}, {"past_3mp", "خَافُوا"}, {"past_3ms", "خَافَ"}, {"past_pass_1p", "خُفْنَا"}, {"past_pass_1s", "خُفْتُ"}, {"past_pass_2d", "خُفْتُمَا"}, {"past_pass_2fp", "خُفْتُنَّ"}, {"past_pass_2fs", "خُفْتِ"}, {"past_pass_2mp", "خُفْتُمْ"}, {"past_pass_2ms", "خُفْتَ"}, {"past_pass_3fd", "خِيفَتَا"}, {"past_pass_3fp", "خُفْنَ"}, {"past_pass_3fs", "خِيفَتْ"}, {"past_pass_3md", "خِيفَا"}, {"past_pass_3mp", "خِيفُوا"}, {"past_pass_3ms", "خِيفَ"}, }, }, { label = "فَعْلَلَ (p.385، رباعي مجرد)", root = "فعلل", wazn = "فعلل", pass = true, forms = { {"imp_2d", "فَعْلِلَا"}, {"imp_2fp", "فَعْلِلْنَ"}, {"imp_2fs", "فَعْلِلِي"}, {"imp_2mp", "فَعْلِلُوا"}, {"imp_2ms", "فَعْلِلْ"}, {"ind_1p", "نُفَعْلِلُ"}, {"ind_1s", "أُفَعْلِلُ"}, {"ind_2d", "تُفَعْلِلَانِ"}, {"ind_2fp", "تُفَعْلِلْنَ"}, {"ind_2fs", "تُفَعْلِلِينَ"}, {"ind_2mp", "تُفَعْلِلُونَ"}, {"ind_2ms", "تُفَعْلِلُ"}, {"ind_3fd", "تُفَعْلِلَانِ"}, {"ind_3fp", "يُفَعْلِلْنَ"}, {"ind_3fs", "تُفَعْلِلُ"}, {"ind_3md", "يُفَعْلِلَانِ"}, {"ind_3mp", "يُفَعْلِلُونَ"}, {"ind_3ms", "يُفَعْلِلُ"}, {"ind_pass_1p", "نُفَعْلَلُ"}, {"ind_pass_1s", "أُفَعْلَلُ"}, {"ind_pass_2d", "تُفَعْلَلَانِ"}, {"ind_pass_2fp", "تُفَعْلَلْنَ"}, {"ind_pass_2fs", "تُفَعْلَلِينَ"}, {"ind_pass_2mp", "تُفَعْلَلُونَ"}, {"ind_pass_2ms", "تُفَعْلَلُ"}, {"ind_pass_3fd", "تُفَعْلَلَانِ"}, {"ind_pass_3fp", "يُفَعْلَلْنَ"}, {"ind_pass_3fs", "تُفَعْلَلُ"}, {"ind_pass_3md", "يُفَعْلَلَانِ"}, {"ind_pass_3mp", "يُفَعْلَلُونَ"}, {"ind_pass_3ms", "يُفَعْلَلُ"}, {"past_1p", "فَعْلَلْنَا"}, {"past_1s", "فَعْلَلْتُ"}, {"past_2d", "فَعْلَلْتُمَا"}, {"past_2fp", "فَعْلَلْتُنَّ"}, {"past_2fs", "فَعْلَلْتِ"}, {"past_2mp", "فَعْلَلْتُمْ"}, {"past_2ms", "فَعْلَلْتَ"}, {"past_3fd", "فَعْلَلَتَا"}, {"past_3fp", "فَعْلَلْنَ"}, {"past_3fs", "فَعْلَلَتْ"}, {"past_3md", "فَعْلَلَا"}, {"past_3mp", "فَعْلَلُوا"}, {"past_3ms", "فَعْلَلَ"}, {"past_pass_1p", "فُعْلِلْنَا"}, {"past_pass_1s", "فُعْلِلْتُ"}, {"past_pass_2d", "فُعْلِلْتُمَا"}, {"past_pass_2fp", "فُعْلِلْتُنَّ"}, {"past_pass_2fs", "فُعْلِلْتِ"}, {"past_pass_2mp", "فُعْلِلْتُمْ"}, {"past_pass_2ms", "فُعْلِلْتَ"}, {"past_pass_3fd", "فُعْلِلَتَا"}, {"past_pass_3fp", "فُعْلِلْنَ"}, {"past_pass_3fs", "فُعْلِلَتْ"}, {"past_pass_3md", "فُعْلِلَا"}, {"past_pass_3mp", "فُعْلِلُوا"}, {"past_pass_3ms", "فُعْلِلَ"}, }, }, { label = "اِسَّمَّعَ (p.287، تفعّل مدغم)", root = "سمع", wazn = "تفعّل", reduced = true, forms = { {"imp_2d", "اِسَّمَّعَا"}, {"imp_2fp", "اِسَّمَّعْنَ"}, {"imp_2fs", "اِسَّمَّعِي"}, {"imp_2mp", "اِسَّمَّعُوا"}, {"imp_2ms", "اِسَّمَّعْ"}, {"ind_1p", "نَسَّمَّعُ"}, {"ind_1s", "أَسَّمَّعُ"}, {"ind_2d", "تَسَّمَّعَانِ"}, {"ind_2fp", "تَسَّمَّعْنَ"}, {"ind_2fs", "تَسَّمَّعِينَ"}, {"ind_2mp", "تَسَّمَّعُونَ"}, {"ind_2ms", "تَسَّمَّعُ"}, {"ind_3fd", "تَسَّمَّعَانِ"}, {"ind_3fp", "يَسَّمَّعْنَ"}, {"ind_3fs", "تَسَّمَّعُ"}, {"ind_3md", "يَسَّمَّعَانِ"}, {"ind_3mp", "يَسَّمَّعُونَ"}, {"ind_3ms", "يَسَّمَّعُ"}, {"past_1p", "اِسَّمَّعْنَا"}, {"past_1s", "اِسَّمَّعْتُ"}, {"past_2d", "اِسَّمَّعْتُمَا"}, {"past_2fp", "اِسَّمَّعْتُنَّ"}, {"past_2fs", "اِسَّمَّعْتِ"}, {"past_2mp", "اِسَّمَّعْتُمْ"}, {"past_2ms", "اِسَّمَّعْتَ"}, {"past_3fd", "اِسَّمَّعَتَا"}, {"past_3fp", "اِسَّمَّعْنَ"}, {"past_3fs", "اِسَّمَّعَتْ"}, {"past_3md", "اِسَّمَّعَا"}, {"past_3mp", "اِسَّمَّعُوا"}, {"past_3ms", "اِسَّمَّعَ"}, }, }, } 5bh4qwzvnb7tgt5bl6nu94ws32m7yx9 1099199 1099190 2026-08-22T21:44:40Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099199 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 1 من 5. return { { label = "فَعَلَ ـُ (p.125, abstract paradigm)", root = "فعل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُفْعُلَا"}, {"imp_2fp", "اُفْعُلْنَ"}, {"imp_2fs", "اُفْعُلِي"}, {"imp_2mp", "اُفْعُلُوا"}, {"imp_2ms", "اُفْعُلْ"}, {"ind_1p", "نَفْعُلُ"}, {"ind_1s", "أَفْعُلُ"}, {"ind_2d", "تَفْعُلَانِ"}, {"ind_2fp", "تَفْعُلْنَ"}, {"ind_2fs", "تَفْعُلِينَ"}, {"ind_2mp", "تَفْعُلُونَ"}, {"ind_2ms", "تَفْعُلُ"}, {"ind_3fd", "تَفْعُلَانِ"}, {"ind_3fp", "يَفْعُلْنَ"}, {"ind_3fs", "تَفْعُلُ"}, {"ind_3md", "يَفْعُلَانِ"}, {"ind_3mp", "يَفْعُلُونَ"}, {"ind_3ms", "يَفْعُلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "فَعَلْنَا"}, {"past_1s", "فَعَلْتُ"}, {"past_2d", "فَعَلْتُمَا"}, {"past_2fp", "فَعَلْتُنَّ"}, {"past_2fs", "فَعَلْتِ"}, {"past_2mp", "فَعَلْتُمْ"}, {"past_2ms", "فَعَلْتَ"}, {"past_3fd", "فَعَلَتَا"}, {"past_3fp", "فَعَلْنَ"}, {"past_3fs", "فَعَلَتْ"}, {"past_3md", "فَعَلَا"}, {"past_3mp", "فَعَلُوا"}, {"past_3ms", "فَعَلَ"}, {"past_pass_1p", "فُعِلْنَا"}, {"past_pass_1s", "فُعِلْتُ"}, {"past_pass_2d", "فُعِلْتُمَا"}, {"past_pass_2fp", "فُعِلْتُنَّ"}, {"past_pass_2fs", "فُعِلْتِ"}, {"past_pass_2mp", "فُعِلْتُمْ"}, {"past_pass_2ms", "فُعِلْتَ"}, {"past_pass_3fd", "فُعِلَتَا"}, {"past_pass_3fp", "فُعِلْنَ"}, {"past_pass_3fs", "فُعِلَتْ"}, {"past_pass_3md", "فُعِلَا"}, {"past_pass_3mp", "فُعِلُوا"}, {"past_pass_3ms", "فُعِلَ"}, }, }, { label = "رَؤُفَ (p.198)", root = "رأف", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُرْؤُفَا"}, {"imp_2fp", "اُرْؤُفْنَ"}, {"imp_2fs", "اُرْؤُفِي"}, {"imp_2mp", "اُرْؤُفُوا"}, {"imp_2ms", "اُرْؤُفْ"}, {"ind_1p", "نَرْؤُفُ"}, {"ind_1s", "أَرْؤُفُ"}, {"ind_2d", "تَرْؤُفَانِ"}, {"ind_2fp", "تَرْؤُفْنَ"}, {"ind_2fs", "تَرْؤُفِينَ"}, {"ind_2mp", "تَرْؤُفُونَ"}, {"ind_2ms", "تَرْؤُفُ"}, {"ind_3fd", "تَرْؤُفَانِ"}, {"ind_3fp", "يَرْؤُفْنَ"}, {"ind_3fs", "تَرْؤُفُ"}, {"ind_3md", "يَرْؤُفَانِ"}, {"ind_3mp", "يَرْؤُفُونَ"}, {"ind_3ms", "يَرْؤُفُ"}, {"past_1p", "رَؤُفْنَا"}, {"past_1s", "رَؤُفْتُ"}, {"past_2d", "رَؤُفْتُمَا"}, {"past_2fp", "رَؤُفْتُنَّ"}, {"past_2fs", "رَؤُفْتِ"}, {"past_2mp", "رَؤُفْتُمْ"}, {"past_2ms", "رَؤُفْتَ"}, {"past_3fd", "رَؤُفَتَا"}, {"past_3fp", "رَؤُفْنَ"}, {"past_3fs", "رَؤُفَتْ"}, {"past_3md", "رَؤُفَا"}, {"past_3mp", "رَؤُفُوا"}, {"past_3ms", "رَؤُفَ"}, }, }, { label = "ضَؤُلَ (p.198)", root = "ضأل", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُضْؤُلَا"}, {"imp_2fp", "اُضْؤُلْنَ"}, {"imp_2fs", "اُضْؤُلِي"}, {"imp_2mp", "اُضْؤُلُوا"}, {"imp_2ms", "اُضْؤُلْ"}, {"ind_1p", "نَضْؤُلُ"}, {"ind_1s", "أَضْؤُلُ"}, {"ind_2d", "تَضْؤُلَانِ"}, {"ind_2fp", "تَضْؤُلْنَ"}, {"ind_2fs", "تَضْؤُلِينَ"}, {"ind_2mp", "تَضْؤُلُونَ"}, {"ind_2ms", "تَضْؤُلُ"}, {"ind_3fd", "تَضْؤُلَانِ"}, {"ind_3fp", "يَضْؤُلْنَ"}, {"ind_3fs", "تَضْؤُلُ"}, {"ind_3md", "يَضْؤُلَانِ"}, {"ind_3mp", "يَضْؤُلُونَ"}, {"ind_3ms", "يَضْؤُلُ"}, {"past_1p", "ضَؤُلْنَا"}, {"past_1s", "ضَؤُلْتُ"}, {"past_2d", "ضَؤُلْتُمَا"}, {"past_2fp", "ضَؤُلْتُنَّ"}, {"past_2fs", "ضَؤُلْتِ"}, {"past_2mp", "ضَؤُلْتُمْ"}, {"past_2ms", "ضَؤُلْتَ"}, {"past_3fd", "ضَؤُلَتَا"}, {"past_3fp", "ضَؤُلْنَ"}, {"past_3fs", "ضَؤُلَتْ"}, {"past_3md", "ضَؤُلَا"}, {"past_3mp", "ضَؤُلُوا"}, {"past_3ms", "ضَؤُلَ"}, }, }, { label = "آخَذَ (p.260)", root = "أخذ", wazn = "فاعل", forms = { {"imp_2d", "آخِذَا"}, {"imp_2fp", "آخِذْنَ"}, {"imp_2fs", "آخِذِي"}, {"imp_2mp", "آخِذُوا"}, {"imp_2ms", "آخِذْ"}, {"ind_1p", "نُؤَاخِذُ"}, {"ind_1s", "أُؤَاخِذُ"}, {"ind_2d", "تُؤَاخِذَانِ"}, {"ind_2fp", "تُؤَاخِذْنَ"}, {"ind_2fs", "تُؤَاخِذِينَ"}, {"ind_2mp", "تُؤَاخِذُونَ"}, {"ind_2ms", "تُؤَاخِذُ"}, {"ind_3fd", "تُؤَاخِذَانِ"}, {"ind_3fp", "يُؤَاخِذْنَ"}, {"ind_3fs", "تُؤَاخِذُ"}, {"ind_3md", "يُؤَاخِذَانِ"}, {"ind_3mp", "يُؤَاخِذُونَ"}, {"ind_3ms", "يُؤَاخِذُ"}, {"past_1p", "آخَذْنَا"}, {"past_1s", "آخَذْتُ"}, {"past_2d", "آخَذْتُمَا"}, {"past_2fp", "آخَذْتُنَّ"}, {"past_2fs", "آخَذْتِ"}, {"past_2mp", "آخَذْتُمْ"}, {"past_2ms", "آخَذْتَ"}, {"past_3fd", "آخَذَتَا"}, {"past_3fp", "آخَذْنَ"}, {"past_3fs", "آخَذَتْ"}, {"past_3md", "آخَذَا"}, {"past_3mp", "آخَذُوا"}, {"past_3ms", "آخَذَ"}, }, }, { label = "اِدَّعَمَ (p.334)", root = "دعم", wazn = "افتعل", forms = { {"imp_2d", "اِدَّعِمَا"}, {"imp_2fp", "اِدَّعِمْنَ"}, {"imp_2fs", "اِدَّعِمِي"}, {"imp_2mp", "اِدَّعِمُوا"}, {"imp_2ms", "اِدَّعِمْ"}, {"ind_1p", "نَدَّعِمُ"}, {"ind_1s", "أَدَّعِمُ"}, {"ind_2d", "تَدَّعِمَانِ"}, {"ind_2fp", "تَدَّعِمْنَ"}, {"ind_2fs", "تَدَّعِمِينَ"}, {"ind_2mp", "تَدَّعِمُونَ"}, {"ind_2ms", "تَدَّعِمُ"}, {"ind_3fd", "تَدَّعِمَانِ"}, {"ind_3fp", "يَدَّعِمْنَ"}, {"ind_3fs", "تَدَّعِمُ"}, {"ind_3md", "يَدَّعِمَانِ"}, {"ind_3mp", "يَدَّعِمُونَ"}, {"ind_3ms", "يَدَّعِمُ"}, {"past_1p", "اِدَّعَمْنَا"}, {"past_1s", "اِدَّعَمْتُ"}, {"past_2d", "اِدَّعَمْتُمَا"}, {"past_2fp", "اِدَّعَمْتُنَّ"}, {"past_2fs", "اِدَّعَمْتِ"}, {"past_2mp", "اِدَّعَمْتُمْ"}, {"past_2ms", "اِدَّعَمْتَ"}, {"past_3fd", "اِدَّعَمَتَا"}, {"past_3fp", "اِدَّعَمْنَ"}, {"past_3fs", "اِدَّعَمَتْ"}, {"past_3md", "اِدَّعَمَا"}, {"past_3mp", "اِدَّعَمُوا"}, {"past_3ms", "اِدَّعَمَ"}, }, }, { label = "هَنَأَ ـُ (p.135، مهموز اللام)", root = "هنأ", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُهْنُؤَا"}, {"imp_2fp", "اُهْنُؤْنَ"}, {"imp_2fs", "اُهْنُئِي"}, {"imp_2mp", "اُهْنُؤُوا"}, {"imp_2ms", "اُهْنُؤْ"}, {"ind_1p", "نَهْنُؤُ"}, {"ind_1s", "أَهْنُؤُ"}, {"ind_2d", "تَهْنُؤَانِ"}, {"ind_2fp", "تَهْنُؤْنَ"}, {"ind_2fs", "تَهْنُئِينَ"}, {"ind_2mp", "تَهْنُؤُونَ"}, {"ind_2ms", "تَهْنُؤُ"}, {"ind_3fd", "تَهْنُؤَانِ"}, {"ind_3fp", "يَهْنُؤْنَ"}, {"ind_3fs", "تَهْنُؤُ"}, {"ind_3md", "يَهْنُؤَانِ"}, {"ind_3mp", "يَهْنُؤُونَ"}, {"ind_3ms", "يَهْنُؤُ"}, {"ind_pass_1p", "نُهْنَأُ"}, {"ind_pass_1s", "أُهْنَأُ"}, {"ind_pass_2d", "تُهْنَآنِ"}, {"ind_pass_2fp", "تُهْنَأْنَ"}, {"ind_pass_2fs", "تُهْنَئِينَ"}, {"ind_pass_2mp", "تُهْنَؤُونَ"}, {"ind_pass_2ms", "تُهْنَأُ"}, {"ind_pass_3fd", "تُهْنَآنِ"}, {"ind_pass_3fp", "يُهْنَأْنَ"}, {"ind_pass_3fs", "تُهْنَأُ"}, {"ind_pass_3md", "يُهْنَآنِ"}, {"ind_pass_3mp", "يُهْنَؤُونَ"}, {"ind_pass_3ms", "يُهْنَأُ"}, {"past_1p", "هَنَأْنَا"}, {"past_1s", "هَنَأْتُ"}, {"past_2d", "هَنَأْتُمَا"}, {"past_2fp", "هَنَأْتُنَّ"}, {"past_2fs", "هَنَأْتِ"}, {"past_2mp", "هَنَأْتُمْ"}, {"past_2ms", "هَنَأْتَ"}, {"past_3fd", "هَنَأَتَا"}, {"past_3fp", "هَنَأْنَ"}, {"past_3fs", "هَنَأَتْ"}, {"past_3md", "هَنَآ"}, {"past_3mp", "هَنَؤُوا"}, {"past_3ms", "هَنَأَ"}, {"past_pass_1p", "هُنِئْنَا"}, {"past_pass_1s", "هُنِئْتُ"}, {"past_pass_2d", "هُنِئْتُمَا"}, {"past_pass_2fp", "هُنِئْتُنَّ"}, {"past_pass_2fs", "هُنِئْتِ"}, {"past_pass_2mp", "هُنِئْتُمْ"}, {"past_pass_2ms", "هُنِئْتَ"}, {"past_pass_3fd", "هُنِئَتَا"}, {"past_pass_3fp", "هُنِئْنَ"}, {"past_pass_3fs", "هُنِئَتْ"}, {"past_pass_3md", "هُنِئَا"}, {"past_pass_3mp", "هُنِئُوا"}, {"past_pass_3ms", "هُنِئَ"}, }, }, { label = "دَعا ـُ (p.141، ناقص واوي)", root = "دعو", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُدْعُوَا"}, {"imp_2fp", "اُدْعُونَ"}, {"imp_2fs", "اِدْعِي"}, {"imp_2mp", "اُدْعُوا"}, {"imp_2ms", "اُدْعُ"}, {"ind_1p", "نَدْعُو"}, {"ind_1s", "أَدْعُو"}, {"ind_2d", "تَدْعُوَانِ"}, {"ind_2fp", "تَدْعُونَ"}, {"ind_2fs", "تَدْعِينَ"}, {"ind_2mp", "تَدْعُونَ"}, {"ind_2ms", "تَدْعُو"}, {"ind_3fd", "تَدْعُوَانِ"}, {"ind_3fp", "يَدْعُونَ"}, {"ind_3fs", "تَدْعُو"}, {"ind_3md", "يَدْعُوَانِ"}, {"ind_3mp", "يَدْعُونَ"}, {"ind_3ms", "يَدْعُو"}, {"ind_pass_1p", "نُدْعَى"}, {"ind_pass_1s", "أُدْعَى"}, {"ind_pass_2d", "تُدْعَيَانِ"}, {"ind_pass_2fp", "تُدْعَيْنَ"}, {"ind_pass_2fs", "تُدْعَيْنَ"}, {"ind_pass_2mp", "تُدْعَوْنَ"}, {"ind_pass_2ms", "تُدْعَى"}, {"ind_pass_3fd", "تُدْعَيَانِ"}, {"ind_pass_3fp", "يُدْعَيْنَ"}, {"ind_pass_3fs", "تُدْعَى"}, {"ind_pass_3md", "يُدْعَيَانِ"}, {"ind_pass_3mp", "يُدْعَوْنَ"}, {"ind_pass_3ms", "يُدْعَى"}, {"past_1p", "دَعَوْنَا"}, {"past_1s", "دَعَوْتُ"}, {"past_2d", "دَعَوْتُمَا"}, {"past_2fp", "دَعَوْتُنَّ"}, {"past_2fs", "دَعَوْتِ"}, {"past_2mp", "دَعَوْتُمْ"}, {"past_2ms", "دَعَوْتَ"}, {"past_3fd", "دَعَتَا"}, {"past_3fp", "دَعَوْنَ"}, {"past_3fs", "دَعَتْ"}, {"past_3md", "دَعَوَا"}, {"past_3mp", "دَعَوْا"}, {"past_3ms", "دَعَا"}, {"past_pass_1p", "دُعِينَا"}, {"past_pass_1s", "دُعِيتُ"}, {"past_pass_2d", "دُعِيتُمَا"}, {"past_pass_2fp", "دُعِيتُنَّ"}, {"past_pass_2fs", "دُعِيتِ"}, {"past_pass_2mp", "دُعِيتُمْ"}, {"past_pass_2ms", "دُعِيتَ"}, {"past_pass_3fd", "دُعِيَتَا"}, {"past_pass_3fp", "دُعِينَ"}, {"past_pass_3fs", "دُعِيَتْ"}, {"past_pass_3md", "دُعِيَا"}, {"past_pass_3mp", "دُعُوا"}, {"past_pass_3ms", "دُعِيَ"}, }, }, { label = "هَيُؤَ ـُ (p.203، أجوف على فعُل)", root = "هيأ", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُهْيُؤَا"}, {"imp_2fp", "اُهْيُؤْنَ"}, {"imp_2fs", "اُهْيُئِي"}, {"imp_2mp", "اُهْيُؤُوا"}, {"imp_2ms", "اُهْيُؤْ"}, {"ind_1p", "نَهْيُؤُ"}, {"ind_1s", "أَهْيُؤُ"}, {"ind_2d", "تَهْيُؤَانِ"}, {"ind_2fp", "تَهْيُؤْنَ"}, {"ind_2fs", "تَهْيُئِينَ"}, {"ind_2mp", "تَهْيُؤُونَ"}, {"ind_2ms", "تَهْيُؤُ"}, {"ind_3fd", "تَهْيُؤَانِ"}, {"ind_3fp", "يَهْيُؤْنَ"}, {"ind_3fs", "تَهْيُؤُ"}, {"ind_3md", "يَهْيُؤَانِ"}, {"ind_3mp", "يَهْيُؤُونَ"}, {"ind_3ms", "يَهْيُؤُ"}, {"past_1p", "هَيُؤْنَا"}, {"past_1s", "هَيُؤْتُ"}, {"past_2d", "هَيُؤْتُمَا"}, {"past_2fp", "هَيُؤْتُنَّ"}, {"past_2fs", "هَيُؤْتِ"}, {"past_2mp", "هَيُؤْتُمْ"}, {"past_2ms", "هَيُؤْتَ"}, {"past_3fd", "هَيُؤَتَا"}, {"past_3fp", "هَيُؤْنَ"}, {"past_3fs", "هَيُؤَتْ"}, {"past_3md", "هَيُؤَا"}, {"past_3mp", "هَيُؤُوا"}, {"past_3ms", "هَيُؤَ"}, }, }, { label = "وَفَى ـِ (p.164، لفيف مفروق)", root = "وفي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "فِيَا"}, {"imp_2fp", "فِينَ"}, {"imp_2fs", "فِي"}, {"imp_2mp", "فُوا"}, {"imp_2ms", "فِ"}, {"ind_1p", "نَفِي"}, {"ind_1s", "أَفِي"}, {"ind_2d", "تَفِيَانِ"}, {"ind_2fp", "تَفِينَ"}, {"ind_2fs", "تَفِينَ"}, {"ind_2mp", "تَفُونَ"}, {"ind_2ms", "تَفِي"}, {"ind_3fd", "تَفِيَانِ"}, {"ind_3fp", "يَفِينَ"}, {"ind_3fs", "تَفِي"}, {"ind_3md", "يَفِيَانِ"}, {"ind_3mp", "يَفُونَ"}, {"ind_3ms", "يَفِي"}, {"ind_pass_1p", "نُوفَى"}, {"ind_pass_1s", "أُوفَى"}, {"ind_pass_2d", "تُوفَيَانِ"}, {"ind_pass_2fp", "تُوفَيْنَ"}, {"ind_pass_2fs", "تُوفَيْنَ"}, {"ind_pass_2mp", "تُوفَوْنَ"}, {"ind_pass_2ms", "تُوفَى"}, {"ind_pass_3fd", "تُوفَيَانِ"}, {"ind_pass_3fp", "يُوفَيْنَ"}, {"ind_pass_3fs", "تُوفَى"}, {"ind_pass_3md", "يُوفَيَانِ"}, {"ind_pass_3mp", "يُوفَوْنَ"}, {"ind_pass_3ms", "يُوفَى"}, {"past_1p", "وَفَيْنَا"}, {"past_1s", "وَفَيْتُ"}, {"past_2d", "وَفَيْتُمَا"}, {"past_2fp", "وَفَيْتُنَّ"}, {"past_2fs", "وَفَيْتِ"}, {"past_2mp", "وَفَيْتُمْ"}, {"past_2ms", "وَفَيْتَ"}, {"past_3fd", "وَفَتَا"}, {"past_3fp", "وَفَيْنَ"}, {"past_3fs", "وَفَتْ"}, {"past_3md", "وَفَيَا"}, {"past_3mp", "وَفَوْا"}, {"past_3ms", "وَفَى"}, {"past_pass_1p", "وُفِينَا"}, {"past_pass_1s", "وُفِيتُ"}, {"past_pass_2d", "وُفِيتُمَا"}, {"past_pass_2fp", "وُفِيتُنَّ"}, {"past_pass_2fs", "وُفِيتِ"}, {"past_pass_2mp", "وُفِيتُمْ"}, {"past_pass_2ms", "وُفِيتَ"}, {"past_pass_3fd", "وُفِيَتَا"}, {"past_pass_3fp", "وُفِينَ"}, {"past_pass_3fs", "وُفِيَتْ"}, {"past_pass_3md", "وُفِيَا"}, {"past_pass_3mp", "وُفُوا"}, {"past_pass_3ms", "وُفِيَ"}, }, }, { label = "وَلِيَ ـِ (p.238، لفيف مفروق)", root = "ولي", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "لِيَا"}, {"imp_2fp", "لِينَ"}, {"imp_2fs", "لِي"}, {"imp_2mp", "لُوا"}, {"imp_2ms", "لِ"}, {"ind_1p", "نَلِي"}, {"ind_1s", "أَلِي"}, {"ind_2d", "تَلِيَانِ"}, {"ind_2fp", "تَلِينَ"}, {"ind_2fs", "تَلِينَ"}, {"ind_2mp", "تَلُونَ"}, {"ind_2ms", "تَلِي"}, {"ind_3fd", "تَلِيَانِ"}, {"ind_3fp", "يَلِينَ"}, {"ind_3fs", "تَلِي"}, {"ind_3md", "يَلِيَانِ"}, {"ind_3mp", "يَلُونَ"}, {"ind_3ms", "يَلِي"}, {"ind_pass_1p", "نُولَى"}, {"ind_pass_1s", "أُولَى"}, {"ind_pass_2d", "تُولَيَانِ"}, {"ind_pass_2fp", "تُولَيْنَ"}, {"ind_pass_2fs", "تُولَيْنَ"}, {"ind_pass_2mp", "تُولَوْنَ"}, {"ind_pass_2ms", "تُولَى"}, {"ind_pass_3fd", "تُولَيَانِ"}, {"ind_pass_3fp", "يُولَيْنَ"}, {"ind_pass_3fs", "تُولَى"}, {"ind_pass_3md", "يُولَيَانِ"}, {"ind_pass_3mp", "يُولَوْنَ"}, {"ind_pass_3ms", "يُولَى"}, {"past_1p", "وَلِينَا"}, {"past_1s", "وَلِيتُ"}, {"past_2d", "وَلِيتُمَا"}, {"past_2fp", "وَلِيتُنَّ"}, {"past_2fs", "وَلِيتِ"}, {"past_2mp", "وَلِيتُمْ"}, {"past_2ms", "وَلِيتَ"}, {"past_3fd", "وَلِيَتَا"}, {"past_3fp", "وَلِينَ"}, {"past_3fs", "وَلِيَتْ"}, {"past_3md", "وَلِيَا"}, {"past_3mp", "وَلُوا"}, {"past_3ms", "وَلِيَ"}, {"past_pass_1p", "وُلِينَا"}, {"past_pass_1s", "وُلِيتُ"}, {"past_pass_2d", "وُلِيتُمَا"}, {"past_pass_2fp", "وُلِيتُنَّ"}, {"past_pass_2fs", "وُلِيتِ"}, {"past_pass_2mp", "وُلِيتُمْ"}, {"past_pass_2ms", "وُلِيتَ"}, {"past_pass_3fd", "وُلِيَتَا"}, {"past_pass_3fp", "وُلِينَ"}, {"past_pass_3fs", "وُلِيَتْ"}, {"past_pass_3md", "وُلِيَا"}, {"past_pass_3mp", "وُلُوا"}, {"past_pass_3ms", "وُلِيَ"}, }, }, { label = "تَفاعَلَ (p.302، الوزن السادس)", root = "فعل", wazn = "تفاعل", pass = true, forms = { {"imp_2d", "تَفَاعَلَا"}, {"imp_2fp", "تَفَاعَلْنَ"}, {"imp_2fs", "تَفَاعَلِي"}, {"imp_2mp", "تَفَاعَلُوا"}, {"imp_2ms", "تَفَاعَلْ"}, {"ind_1p", "نَتَفَاعَلُ"}, {"ind_1s", "أَتَفَاعَلُ"}, {"ind_2d", "تَتَفَاعَلَانِ"}, {"ind_2fp", "تَتَفَاعَلْنَ"}, {"ind_2fs", "تَتَفَاعَلِينَ"}, {"ind_2mp", "تَتَفَاعَلُونَ"}, {"ind_2ms", "تَتَفَاعَلُ"}, {"ind_3fd", "تَتَفَاعَلَانِ"}, {"ind_3fp", "يَتَفَاعَلْنَ"}, {"ind_3fs", "تَتَفَاعَلُ"}, {"ind_3md", "يَتَفَاعَلَانِ"}, {"ind_3mp", "يَتَفَاعَلُونَ"}, {"ind_3ms", "يَتَفَاعَلُ"}, {"ind_pass_1p", "نُتَفَاعَلُ"}, {"ind_pass_1s", "أُتَفَاعَلُ"}, {"ind_pass_2d", "تُتَفَاعَلَانِ"}, {"ind_pass_2fp", "تُتَفَاعَلْنَ"}, {"ind_pass_2fs", "تُتَفَاعَلِينَ"}, {"ind_pass_2mp", "تُتَفَاعَلُونَ"}, {"ind_pass_2ms", "تُتَفَاعَلُ"}, {"ind_pass_3fd", "تُتَفَاعَلَانِ"}, {"ind_pass_3fp", "يُتَفَاعَلْنَ"}, {"ind_pass_3fs", "تُتَفَاعَلُ"}, {"ind_pass_3md", "يُتَفَاعَلَانِ"}, {"ind_pass_3mp", "يُتَفَاعَلُونَ"}, {"ind_pass_3ms", "يُتَفَاعَلُ"}, {"past_1p", "تَفَاعَلْنَا"}, {"past_1s", "تَفَاعَلْتُ"}, {"past_2d", "تَفَاعَلْتُمَا"}, {"past_2fp", "تَفَاعَلْتُنَّ"}, {"past_2fs", "تَفَاعَلْتِ"}, {"past_2mp", "تَفَاعَلْتُمْ"}, {"past_2ms", "تَفَاعَلْتَ"}, {"past_3fd", "تَفَاعَلَتَا"}, {"past_3fp", "تَفَاعَلْنَ"}, {"past_3fs", "تَفَاعَلَتْ"}, {"past_3md", "تَفَاعَلَا"}, {"past_3mp", "تَفَاعَلُوا"}, {"past_3ms", "تَفَاعَلَ"}, {"past_pass_1p", "تُفُوعِلْنَا"}, {"past_pass_1s", "تُفُوعِلْتُ"}, {"past_pass_2d", "تُفُوعِلْتُمَا"}, {"past_pass_2fp", "تُفُوعِلْتُنَّ"}, {"past_pass_2fs", "تُفُوعِلْتِ"}, {"past_pass_2mp", "تُفُوعِلْتُمْ"}, {"past_pass_2ms", "تُفُوعِلْتَ"}, {"past_pass_3fd", "تُفُوعِلَتَا"}, {"past_pass_3fp", "تُفُوعِلْنَ"}, {"past_pass_3fs", "تُفُوعِلَتْ"}, {"past_pass_3md", "تُفُوعِلَا"}, {"past_pass_3mp", "تُفُوعِلُوا"}, {"past_pass_3ms", "تُفُوعِلَ"}, }, }, { label = "فَرَّ ـِ (p.147، مضاعف)", root = "فرر", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "فِرَّا"}, {"imp_2fp", "اِفْرِرْنَ"}, {"imp_2fs", "فِرِّي"}, {"imp_2mp", "فِرُّوا"}, {"imp_2ms", "فِرَّ"}, {"ind_1p", "نَفِرُّ"}, {"ind_1s", "أَفِرُّ"}, {"ind_2d", "تَفِرَّانِ"}, {"ind_2fp", "تَفْرِرْنَ"}, {"ind_2fs", "تَفِرِّينَ"}, {"ind_2mp", "تَفِرُّونَ"}, {"ind_2ms", "تَفِرُّ"}, {"ind_3fd", "تَفِرَّانِ"}, {"ind_3fp", "يَفْرِرْنَ"}, {"ind_3fs", "تَفِرُّ"}, {"ind_3md", "يَفِرَّانِ"}, {"ind_3mp", "يَفِرُّونَ"}, {"ind_3ms", "يَفِرُّ"}, {"ind_pass_1p", "نُفَرُّ"}, {"ind_pass_1s", "أُفَرُّ"}, {"ind_pass_2d", "تُفَرَّانِ"}, {"ind_pass_2fp", "تُفْرَرْنَ"}, {"ind_pass_2fs", "تُفَرِّينَ"}, {"ind_pass_2mp", "تُفَرُّونَ"}, {"ind_pass_2ms", "تُفَرُّ"}, {"ind_pass_3fd", "تُفَرَّانِ"}, {"ind_pass_3fp", "يُفْرَرْنَ"}, {"ind_pass_3fs", "تُفَرُّ"}, {"ind_pass_3md", "يُفَرَّانِ"}, {"ind_pass_3mp", "يُفَرُّونَ"}, {"ind_pass_3ms", "يُفَرُّ"}, {"past_1p", "فَرَرْنَا"}, {"past_1s", "فَرَرْتُ"}, {"past_2d", "فَرَرْتُمَا"}, {"past_2fp", "فَرَرْتُنَّ"}, {"past_2fs", "فَرَرْتِ"}, {"past_2mp", "فَرَرْتُمْ"}, {"past_2ms", "فَرَرْتَ"}, {"past_3fd", "فَرَّتَا"}, {"past_3fp", "فَرَرْنَ"}, {"past_3fs", "فَرَّتْ"}, {"past_3md", "فَرَّا"}, {"past_3mp", "فَرُّوا"}, {"past_3ms", "فَرَّ"}, {"past_pass_1p", "فُرِرْنَا"}, {"past_pass_1s", "فُرِرْتُ"}, {"past_pass_2d", "فُرِرْتُمَا"}, {"past_pass_2fp", "فُرِرْتُنَّ"}, {"past_pass_2fs", "فُرِرْتِ"}, {"past_pass_2mp", "فُرِرْتُمْ"}, {"past_pass_2ms", "فُرِرْتَ"}, {"past_pass_3fd", "فُرَّتَا"}, {"past_pass_3fp", "فُرِرْنَ"}, {"past_pass_3fs", "فُرَّتْ"}, {"past_pass_3md", "فُرَّا"}, {"past_pass_3mp", "فُرُّوا"}, {"past_pass_3ms", "فُرَّ"}, }, }, { label = "خافَ ـَ (p.222، أجوف واوي)", root = "خوف", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "خَافَا"}, {"imp_2fp", "خَفْنَ"}, {"imp_2fs", "خَافِي"}, {"imp_2mp", "خَافُوا"}, {"imp_2ms", "خَفْ"}, {"ind_1p", "نَخَافُ"}, {"ind_1s", "أَخَافُ"}, {"ind_2d", "تَخَافَانِ"}, {"ind_2fp", "تَخَفْنَ"}, {"ind_2fs", "تَخَافِينَ"}, {"ind_2mp", "تَخَافُونَ"}, {"ind_2ms", "تَخَافُ"}, {"ind_3fd", "تَخَافَانِ"}, {"ind_3fp", "يَخَفْنَ"}, {"ind_3fs", "تَخَافُ"}, {"ind_3md", "يَخَافَانِ"}, {"ind_3mp", "يَخَافُونَ"}, {"ind_3ms", "يَخَافُ"}, {"ind_pass_1p", "نُخَافُ"}, {"ind_pass_1s", "أُخَافُ"}, {"ind_pass_2d", "تُخَافَانِ"}, {"ind_pass_2fp", "تُخَفْنَ"}, {"ind_pass_2fs", "تُخَافِينَ"}, {"ind_pass_2mp", "تُخَافُونَ"}, {"ind_pass_2ms", "تُخَافُ"}, {"ind_pass_3fd", "تُخَافَانِ"}, {"ind_pass_3fp", "يُخَفْنَ"}, {"ind_pass_3fs", "تُخَافُ"}, {"ind_pass_3md", "يُخَافَانِ"}, {"ind_pass_3mp", "يُخَافُونَ"}, {"ind_pass_3ms", "يُخَافُ"}, {"past_1p", "خِفْنَا"}, {"past_1s", "خِفْتُ"}, {"past_2d", "خِفْتُمَا"}, {"past_2fp", "خِفْتُنَّ"}, {"past_2fs", "خِفْتِ"}, {"past_2mp", "خِفْتُمْ"}, {"past_2ms", "خِفْتَ"}, {"past_3fd", "خَافَتَا"}, {"past_3fp", "خِفْنَ"}, {"past_3fs", "خَافَتْ"}, {"past_3md", "خَافَا"}, {"past_3mp", "خَافُوا"}, {"past_3ms", "خَافَ"}, {"past_pass_1p", "خُفْنَا"}, {"past_pass_1s", "خُفْتُ"}, {"past_pass_2d", "خُفْتُمَا"}, {"past_pass_2fp", "خُفْتُنَّ"}, {"past_pass_2fs", "خُفْتِ"}, {"past_pass_2mp", "خُفْتُمْ"}, {"past_pass_2ms", "خُفْتَ"}, {"past_pass_3fd", "خِيفَتَا"}, {"past_pass_3fp", "خُفْنَ"}, {"past_pass_3fs", "خِيفَتْ"}, {"past_pass_3md", "خِيفَا"}, {"past_pass_3mp", "خِيفُوا"}, {"past_pass_3ms", "خِيفَ"}, }, }, { label = "فَعْلَلَ (p.385، رباعي مجرد)", root = "فعلل", wazn = "فعلل", pass = true, forms = { {"imp_2d", "فَعْلِلَا"}, {"imp_2fp", "فَعْلِلْنَ"}, {"imp_2fs", "فَعْلِلِي"}, {"imp_2mp", "فَعْلِلُوا"}, {"imp_2ms", "فَعْلِلْ"}, {"ind_1p", "نُفَعْلِلُ"}, {"ind_1s", "أُفَعْلِلُ"}, {"ind_2d", "تُفَعْلِلَانِ"}, {"ind_2fp", "تُفَعْلِلْنَ"}, {"ind_2fs", "تُفَعْلِلِينَ"}, {"ind_2mp", "تُفَعْلِلُونَ"}, {"ind_2ms", "تُفَعْلِلُ"}, {"ind_3fd", "تُفَعْلِلَانِ"}, {"ind_3fp", "يُفَعْلِلْنَ"}, {"ind_3fs", "تُفَعْلِلُ"}, {"ind_3md", "يُفَعْلِلَانِ"}, {"ind_3mp", "يُفَعْلِلُونَ"}, {"ind_3ms", "يُفَعْلِلُ"}, {"ind_pass_1p", "نُفَعْلَلُ"}, {"ind_pass_1s", "أُفَعْلَلُ"}, {"ind_pass_2d", "تُفَعْلَلَانِ"}, {"ind_pass_2fp", "تُفَعْلَلْنَ"}, {"ind_pass_2fs", "تُفَعْلَلِينَ"}, {"ind_pass_2mp", "تُفَعْلَلُونَ"}, {"ind_pass_2ms", "تُفَعْلَلُ"}, {"ind_pass_3fd", "تُفَعْلَلَانِ"}, {"ind_pass_3fp", "يُفَعْلَلْنَ"}, {"ind_pass_3fs", "تُفَعْلَلُ"}, {"ind_pass_3md", "يُفَعْلَلَانِ"}, {"ind_pass_3mp", "يُفَعْلَلُونَ"}, {"ind_pass_3ms", "يُفَعْلَلُ"}, {"past_1p", "فَعْلَلْنَا"}, {"past_1s", "فَعْلَلْتُ"}, {"past_2d", "فَعْلَلْتُمَا"}, {"past_2fp", "فَعْلَلْتُنَّ"}, {"past_2fs", "فَعْلَلْتِ"}, {"past_2mp", "فَعْلَلْتُمْ"}, {"past_2ms", "فَعْلَلْتَ"}, {"past_3fd", "فَعْلَلَتَا"}, {"past_3fp", "فَعْلَلْنَ"}, {"past_3fs", "فَعْلَلَتْ"}, {"past_3md", "فَعْلَلَا"}, {"past_3mp", "فَعْلَلُوا"}, {"past_3ms", "فَعْلَلَ"}, {"past_pass_1p", "فُعْلِلْنَا"}, {"past_pass_1s", "فُعْلِلْتُ"}, {"past_pass_2d", "فُعْلِلْتُمَا"}, {"past_pass_2fp", "فُعْلِلْتُنَّ"}, {"past_pass_2fs", "فُعْلِلْتِ"}, {"past_pass_2mp", "فُعْلِلْتُمْ"}, {"past_pass_2ms", "فُعْلِلْتَ"}, {"past_pass_3fd", "فُعْلِلَتَا"}, {"past_pass_3fp", "فُعْلِلْنَ"}, {"past_pass_3fs", "فُعْلِلَتْ"}, {"past_pass_3md", "فُعْلِلَا"}, {"past_pass_3mp", "فُعْلِلُوا"}, {"past_pass_3ms", "فُعْلِلَ"}, }, }, { label = "اِسَّمَّعَ (p.287، تفعّل مدغم)", root = "سمع", wazn = "تفعّل", reduced = true, forms = { {"imp_2d", "اِسَّمَّعَا"}, {"imp_2fp", "اِسَّمَّعْنَ"}, {"imp_2fs", "اِسَّمَّعِي"}, {"imp_2mp", "اِسَّمَّعُوا"}, {"imp_2ms", "اِسَّمَّعْ"}, {"ind_1p", "نَسَّمَّعُ"}, {"ind_1s", "أَسَّمَّعُ"}, {"ind_2d", "تَسَّمَّعَانِ"}, {"ind_2fp", "تَسَّمَّعْنَ"}, {"ind_2fs", "تَسَّمَّعِينَ"}, {"ind_2mp", "تَسَّمَّعُونَ"}, {"ind_2ms", "تَسَّمَّعُ"}, {"ind_3fd", "تَسَّمَّعَانِ"}, {"ind_3fp", "يَسَّمَّعْنَ"}, {"ind_3fs", "تَسَّمَّعُ"}, {"ind_3md", "يَسَّمَّعَانِ"}, {"ind_3mp", "يَسَّمَّعُونَ"}, {"ind_3ms", "يَسَّمَّعُ"}, {"past_1p", "اِسَّمَّعْنَا"}, {"past_1s", "اِسَّمَّعْتُ"}, {"past_2d", "اِسَّمَّعْتُمَا"}, {"past_2fp", "اِسَّمَّعْتُنَّ"}, {"past_2fs", "اِسَّمَّعْتِ"}, {"past_2mp", "اِسَّمَّعْتُمْ"}, {"past_2ms", "اِسَّمَّعْتَ"}, {"past_3fd", "اِسَّمَّعَتَا"}, {"past_3fp", "اِسَّمَّعْنَ"}, {"past_3fs", "اِسَّمَّعَتْ"}, {"past_3md", "اِسَّمَّعَا"}, {"past_3mp", "اِسَّمَّعُوا"}, {"past_3ms", "اِسَّمَّعَ"}, }, }, } s2xjlo2n8frkjagw1po50o902srdy09 وحدة:ar-verb/testcases/1 828 241789 1099191 2026-08-22T21:18:22Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099191 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 1 من 4. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/1") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_1() for _, entry in ipairs(data) do check(self, entry) end end return tests 2xq1cczffapo65htygcxsbttranfe79 1099200 1099191 2026-08-22T21:44:41Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099200 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 1 من 5. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/1") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_1() for _, entry in ipairs(data) do check(self, entry) end end return tests 0tueknfe0u1dk16smuepwlog55dd5fd وحدة:ar-verb/testcases/بيانات/2 828 241790 1099192 2026-08-22T21:18:23Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099192 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 2 من 4. return { { label = "فَعَّلَ (p.241، الوزن الثاني)", root = "فعل", wazn = "فعّل", pass = true, forms = { {"imp_2d", "فَعِّلَا"}, {"imp_2fp", "فَعِّلْنَ"}, {"imp_2fs", "فَعِّلِي"}, {"imp_2mp", "فَعِّلُوا"}, {"imp_2ms", "فَعِّلْ"}, {"ind_1p", "نُفَعِّلُ"}, {"ind_1s", "أُفَعِّلُ"}, {"ind_2d", "تُفَعِّلَانِ"}, {"ind_2fp", "تُفَعِّلْنَ"}, {"ind_2fs", "تُفَعِّلِينَ"}, {"ind_2mp", "تُفَعِّلُونَ"}, {"ind_2ms", "تُفَعِّلُ"}, {"ind_3fd", "تُفَعِّلَانِ"}, {"ind_3fp", "يُفَعِّلْنَ"}, {"ind_3fs", "تُفَعِّلُ"}, {"ind_3md", "يُفَعِّلَانِ"}, {"ind_3mp", "يُفَعِّلُونَ"}, {"ind_3ms", "يُفَعِّلُ"}, {"ind_pass_1p", "نُفَعَّلُ"}, {"ind_pass_1s", "أُفَعَّلُ"}, {"ind_pass_2d", "تُفَعَّلَانِ"}, {"ind_pass_2fp", "تُفَعَّلْنَ"}, {"ind_pass_2fs", "تُفَعَّلِينَ"}, {"ind_pass_2mp", "تُفَعَّلُونَ"}, {"ind_pass_2ms", "تُفَعَّلُ"}, {"ind_pass_3fd", "تُفَعَّلَانِ"}, {"ind_pass_3fp", "يُفَعَّلْنَ"}, {"ind_pass_3fs", "تُفَعَّلُ"}, {"ind_pass_3md", "يُفَعَّلَانِ"}, {"ind_pass_3mp", "يُفَعَّلُونَ"}, {"ind_pass_3ms", "يُفَعَّلُ"}, {"past_1p", "فَعَّلْنَا"}, {"past_1s", "فَعَّلْتُ"}, {"past_2d", "فَعَّلْتُمَا"}, {"past_2fp", "فَعَّلْتُنَّ"}, {"past_2fs", "فَعَّلْتِ"}, {"past_2mp", "فَعَّلْتُمْ"}, {"past_2ms", "فَعَّلْتَ"}, {"past_3fd", "فَعَّلَتَا"}, {"past_3fp", "فَعَّلْنَ"}, {"past_3fs", "فَعَّلَتْ"}, {"past_3md", "فَعَّلَا"}, {"past_3mp", "فَعَّلُوا"}, {"past_3ms", "فَعَّلَ"}, {"past_pass_1p", "فُعِّلْنَا"}, {"past_pass_1s", "فُعِّلْتُ"}, {"past_pass_2d", "فُعِّلْتُمَا"}, {"past_pass_2fp", "فُعِّلْتُنَّ"}, {"past_pass_2fs", "فُعِّلْتِ"}, {"past_pass_2mp", "فُعِّلْتُمْ"}, {"past_pass_2ms", "فُعِّلْتَ"}, {"past_pass_3fd", "فُعِّلَتَا"}, {"past_pass_3fp", "فُعِّلْنَ"}, {"past_pass_3fs", "فُعِّلَتْ"}, {"past_pass_3md", "فُعِّلَا"}, {"past_pass_3mp", "فُعِّلُوا"}, {"past_pass_3ms", "فُعِّلَ"}, }, }, { label = "حَيِيَ ـَ (p.229، لفيف مقرون)", root = "حيي", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِحْيَيَا"}, {"imp_2fp", "اِحْيَيْنَ"}, {"imp_2fs", "اِحْيَيْ"}, {"imp_2mp", "اِحْيَوْا"}, {"imp_2ms", "اِحْيَ"}, {"ind_1p", "نَحْيَا"}, {"ind_1s", "أَحْيَا"}, {"ind_2d", "تَحْيَيَانِ"}, {"ind_2fp", "تَحْيَيْنَ"}, {"ind_2fs", "تَحْيَيْنَ"}, {"ind_2mp", "تَحْيَوْنَ"}, {"ind_2ms", "تَحْيَا"}, {"ind_3fd", "تَحْيَيَانِ"}, {"ind_3fp", "يَحْيَيْنَ"}, {"ind_3fs", "تَحْيَا"}, {"ind_3md", "يَحْيَيَانِ"}, {"ind_3mp", "يَحْيَوْنَ"}, {"ind_3ms", "يَحْيَا"}, {"ind_pass_1p", "نُحْيَا"}, {"ind_pass_1s", "أُحْيَا"}, {"ind_pass_2d", "تُحْيَيَانِ"}, {"ind_pass_2fp", "تُحْيَيْنَ"}, {"ind_pass_2fs", "تُحْيَيْنَ"}, {"ind_pass_2mp", "تُحْيَوْنَ"}, {"ind_pass_2ms", "تُحْيَا"}, {"ind_pass_3fd", "تُحْيَيَانِ"}, {"ind_pass_3fp", "يُحْيَيْنَ"}, {"ind_pass_3fs", "تُحْيَا"}, {"ind_pass_3md", "يُحْيَيَانِ"}, {"ind_pass_3mp", "يُحْيَوْنَ"}, {"ind_pass_3ms", "يُحْيَا"}, {"past_1p", "حَيِينَا"}, {"past_1s", "حَيِيتُ"}, {"past_2d", "حَيِيتُمَا"}, {"past_2fp", "حَيِيتُنَّ"}, {"past_2fs", "حَيِيتِ"}, {"past_2mp", "حَيِيتُمْ"}, {"past_2ms", "حَيِيتَ"}, {"past_3fd", "حَيِيَتَا"}, {"past_3fp", "حَيِينَ"}, {"past_3fs", "حَيِيَتْ"}, {"past_3md", "حَيِيَا"}, {"past_3mp", "حَيُوا"}, {"past_3ms", "حَيِيَ"}, {"past_pass_1p", "حُيِينَا"}, {"past_pass_1s", "حُيِيتُ"}, {"past_pass_2d", "حُيِيتُمَا"}, {"past_pass_2fp", "حُيِيتُنَّ"}, {"past_pass_2fs", "حُيِيتِ"}, {"past_pass_2mp", "حُيِيتُمْ"}, {"past_pass_2ms", "حُيِيتَ"}, {"past_pass_3fd", "حُيِيَتَا"}, {"past_pass_3fp", "حُيِينَ"}, {"past_pass_3fs", "حُيِيَتْ"}, {"past_pass_3md", "حُيِيَا"}, {"past_pass_3mp", "حُيُوا"}, {"past_pass_3ms", "حُيِيَ"}, }, }, { label = "اِحْوَنْصَلَ (p.412، افعنلل)", root = "حوصل", wazn = "افعنلل", forms = { {"imp_2d", "اِحْوَنْصِلَا"}, {"imp_2fp", "اِحْوَنْصِلْنَ"}, {"imp_2fs", "اِحْوَنْصِلِي"}, {"imp_2mp", "اِحْوَنْصِلُوا"}, {"imp_2ms", "اِحْوَنْصِلْ"}, {"ind_1p", "نَحْوَنْصِلُ"}, {"ind_1s", "أَحْوَنْصِلُ"}, {"ind_2d", "تَحْوَنْصِلَانِ"}, {"ind_2fp", "تَحْوَنْصِلْنَ"}, {"ind_2fs", "تَحْوَنْصِلِينَ"}, {"ind_2mp", "تَحْوَنْصِلُونَ"}, {"ind_2ms", "تَحْوَنْصِلُ"}, {"ind_3fd", "تَحْوَنْصِلَانِ"}, {"ind_3fp", "يَحْوَنْصِلْنَ"}, {"ind_3fs", "تَحْوَنْصِلُ"}, {"ind_3md", "يَحْوَنْصِلَانِ"}, {"ind_3mp", "يَحْوَنْصِلُونَ"}, {"ind_3ms", "يَحْوَنْصِلُ"}, {"past_1p", "اِحْوَنْصَلْنَا"}, {"past_1s", "اِحْوَنْصَلْتُ"}, {"past_2d", "اِحْوَنْصَلْتُمَا"}, {"past_2fp", "اِحْوَنْصَلْتُنَّ"}, {"past_2fs", "اِحْوَنْصَلْتِ"}, {"past_2mp", "اِحْوَنْصَلْتُمْ"}, {"past_2ms", "اِحْوَنْصَلْتَ"}, {"past_3fd", "اِحْوَنْصَلَتَا"}, {"past_3fp", "اِحْوَنْصَلْنَ"}, {"past_3fs", "اِحْوَنْصَلَتْ"}, {"past_3md", "اِحْوَنْصَلَا"}, {"past_3mp", "اِحْوَنْصَلُوا"}, {"past_3ms", "اِحْوَنْصَلَ"}, }, }, { label = "اِرْعَوَى (p.357، افعلّ ناقص)", root = "رعو", wazn = "افعلّ", forms = { {"imp_2d", "اِرْعَوِيَا"}, {"imp_2fp", "اِرْعَوِينَ"}, {"imp_2fs", "اِرْعَوِي"}, {"imp_2mp", "اِرْعَوُوا"}, {"imp_2ms", "اِرْعَوِ"}, {"ind_1p", "نَرْعَوِي"}, {"ind_1s", "أَرْعَوِي"}, {"ind_2d", "تَرْعَوِيَانِ"}, {"ind_2fp", "تَرْعَوِينَ"}, {"ind_2fs", "تَرْعَوِينَ"}, {"ind_2mp", "تَرْعَوُونَ"}, {"ind_2ms", "تَرْعَوِي"}, {"ind_3fd", "تَرْعَوِيَانِ"}, {"ind_3fp", "يَرْعَوِينَ"}, {"ind_3fs", "تَرْعَوِي"}, {"ind_3md", "يَرْعَوِيَانِ"}, {"ind_3mp", "يَرْعَوُونَ"}, {"ind_3ms", "يَرْعَوِي"}, {"past_1p", "اِرْعَوَيْنَا"}, {"past_1s", "اِرْعَوَيْتُ"}, {"past_2d", "اِرْعَوَيْتُمَا"}, {"past_2fp", "اِرْعَوَيْتُنَّ"}, {"past_2fs", "اِرْعَوَيْتِ"}, {"past_2mp", "اِرْعَوَيْتُمْ"}, {"past_2ms", "اِرْعَوَيْتَ"}, {"past_3fd", "اِرْعَوَتَا"}, {"past_3fp", "اِرْعَوَيْنَ"}, {"past_3fs", "اِرْعَوَتْ"}, {"past_3md", "اِرْعَوَيَا"}, {"past_3mp", "اِرْعَوَوْا"}, {"past_3ms", "اِرْعَوَى"}, }, }, { label = "تَفَوْعَلَ (p.398، تفعلل)", root = "فوعل", wazn = "تفعلل", pass = true, forms = { {"imp_2d", "تَفَوْعَلَا"}, {"imp_2fp", "تَفَوْعَلْنَ"}, {"imp_2fs", "تَفَوْعَلِي"}, {"imp_2mp", "تَفَوْعَلُوا"}, {"imp_2ms", "تَفَوْعَلْ"}, {"ind_1p", "نَتَفَوْعَلُ"}, {"ind_1s", "أَتَفَوْعَلُ"}, {"ind_2d", "تَتَفَوْعَلَانِ"}, {"ind_2fp", "تَتَفَوْعَلْنَ"}, {"ind_2fs", "تَتَفَوْعَلِينَ"}, {"ind_2mp", "تَتَفَوْعَلُونَ"}, {"ind_2ms", "تَتَفَوْعَلُ"}, {"ind_3fd", "تَتَفَوْعَلَانِ"}, {"ind_3fp", "يَتَفَوْعَلْنَ"}, {"ind_3fs", "تَتَفَوْعَلُ"}, {"ind_3md", "يَتَفَوْعَلَانِ"}, {"ind_3mp", "يَتَفَوْعَلُونَ"}, {"ind_3ms", "يَتَفَوْعَلُ"}, {"ind_pass_1p", "نُتَفَوْعَلُ"}, {"ind_pass_1s", "أُتَفَوْعَلُ"}, {"ind_pass_2d", "تُتَفَوْعَلَانِ"}, {"ind_pass_2fp", "تُتَفَوْعَلْنَ"}, {"ind_pass_2fs", "تُتَفَوْعَلِينَ"}, {"ind_pass_2mp", "تُتَفَوْعَلُونَ"}, {"ind_pass_2ms", "تُتَفَوْعَلُ"}, {"ind_pass_3fd", "تُتَفَوْعَلَانِ"}, {"ind_pass_3fp", "يُتَفَوْعَلْنَ"}, {"ind_pass_3fs", "تُتَفَوْعَلُ"}, {"ind_pass_3md", "يُتَفَوْعَلَانِ"}, {"ind_pass_3mp", "يُتَفَوْعَلُونَ"}, {"ind_pass_3ms", "يُتَفَوْعَلُ"}, {"past_1p", "تَفَوْعَلْنَا"}, {"past_1s", "تَفَوْعَلْتُ"}, {"past_2d", "تَفَوْعَلْتُمَا"}, {"past_2fp", "تَفَوْعَلْتُنَّ"}, {"past_2fs", "تَفَوْعَلْتِ"}, {"past_2mp", "تَفَوْعَلْتُمْ"}, {"past_2ms", "تَفَوْعَلْتَ"}, {"past_3fd", "تَفَوْعَلَتَا"}, {"past_3fp", "تَفَوْعَلْنَ"}, {"past_3fs", "تَفَوْعَلَتْ"}, {"past_3md", "تَفَوْعَلَا"}, {"past_3mp", "تَفَوْعَلُوا"}, {"past_3ms", "تَفَوْعَلَ"}, {"past_pass_1p", "تُفُوعِلْنَا"}, {"past_pass_1s", "تُفُوعِلْتُ"}, {"past_pass_2d", "تُفُوعِلْتُمَا"}, {"past_pass_2fp", "تُفُوعِلْتُنَّ"}, {"past_pass_2fs", "تُفُوعِلْتِ"}, {"past_pass_2mp", "تُفُوعِلْتُمْ"}, {"past_pass_2ms", "تُفُوعِلْتَ"}, {"past_pass_3fd", "تُفُوعِلَتَا"}, {"past_pass_3fp", "تُفُوعِلْنَ"}, {"past_pass_3fs", "تُفُوعِلَتْ"}, {"past_pass_3md", "تُفُوعِلَا"}, {"past_pass_3mp", "تُفُوعِلُوا"}, {"past_pass_3ms", "تُفُوعِلَ"}, }, }, { label = "اِظَّنَّ (p.336، افتعل مدغم مضاعف)", root = "ظنن", wazn = "افتعل", forms = { {"imp_2d", "اِظَّنَّا"}, {"imp_2fs", "اِظَّنِّي"}, {"imp_2mp", "اِظَّنُّوا"}, {"imp_2ms", "اِظَّنَّ"}, {"ind_1p", "نَظَّنُّ"}, {"ind_1s", "أَظَّنُّ"}, {"ind_2d", "تَظَّنَّانِ"}, {"ind_2fs", "تَظَّنِّينَ"}, {"ind_2mp", "تَظَّنُّونَ"}, {"ind_2ms", "تَظَّنُّ"}, {"ind_3fd", "تَظَّنَّانِ"}, {"ind_3fs", "تَظَّنُّ"}, {"ind_3md", "يَظَّنَّانِ"}, {"ind_3mp", "يَظَّنُّونَ"}, {"ind_3ms", "يَظَّنُّ"}, {"past_1p", "اِظَّنَنَّا"}, {"past_1s", "اِظَّنَنْتُ"}, {"past_2d", "اِظَّنَنْتُمَا"}, {"past_2fp", "اِظَّنَنْتُنَّ"}, {"past_2fs", "اِظَّنَنْتِ"}, {"past_2mp", "اِظَّنَنْتُمْ"}, {"past_2ms", "اِظَّنَنْتَ"}, {"past_3fd", "اِظَّنَّتَا"}, {"past_3fs", "اِظَّنَّتْ"}, {"past_3md", "اِظَّنَّا"}, {"past_3mp", "اِظَّنُّوا"}, {"past_3ms", "اِظَّنَّ"}, }, }, { label = "اِصّاعَدَ (p.304، تفاعل مدغم)", root = "صعد", wazn = "تفاعل", reduced = true, forms = { {"imp_2d", "اِصَّاعَدَا"}, {"imp_2fp", "اِصَّاعَدْنَ"}, {"imp_2fs", "اِصَّاعَدِي"}, {"imp_2mp", "اِصَّاعَدُوا"}, {"imp_2ms", "اِصَّاعَدْ"}, {"ind_1p", "نَصَّاعَدُ"}, {"ind_1s", "أَصَّاعَدُ"}, {"ind_2d", "تَصَّاعَدَانِ"}, {"ind_2fp", "تَصَّاعَدْنَ"}, {"ind_2fs", "تَصَّاعَدِينَ"}, {"ind_2mp", "تَصَّاعَدُونَ"}, {"ind_2ms", "تَصَّاعَدُ"}, {"ind_3fd", "تَصَّاعَدَانِ"}, {"ind_3fp", "يَصَّاعَدْنَ"}, {"ind_3fs", "تَصَّاعَدُ"}, {"ind_3md", "يَصَّاعَدَانِ"}, {"ind_3mp", "يَصَّاعَدُونَ"}, {"ind_3ms", "يَصَّاعَدُ"}, {"past_1p", "اِصَّاعَدْنَا"}, {"past_1s", "اِصَّاعَدْتُ"}, {"past_2d", "اِصَّاعَدْتُمَا"}, {"past_2fp", "اِصَّاعَدْتُنَّ"}, {"past_2fs", "اِصَّاعَدْتِ"}, {"past_2mp", "اِصَّاعَدْتُمْ"}, {"past_2ms", "اِصَّاعَدْتَ"}, {"past_3fd", "اِصَّاعَدَتَا"}, {"past_3fp", "اِصَّاعَدْنَ"}, {"past_3fs", "اِصَّاعَدَتْ"}, {"past_3md", "اِصَّاعَدَا"}, {"past_3mp", "اِصَّاعَدُوا"}, {"past_3ms", "اِصَّاعَدَ"}, }, }, { label = "فاعَلَ (p.256، الوزن الثالث)", root = "فعل", wazn = "فاعل", pass = true, forms = { {"imp_2d", "فَاعِلَا"}, {"imp_2fp", "فَاعِلْنَ"}, {"imp_2fs", "فَاعِلِي"}, {"imp_2mp", "فَاعِلُوا"}, {"imp_2ms", "فَاعِلْ"}, {"ind_1p", "نُفَاعِلُ"}, {"ind_1s", "أُفَاعِلُ"}, {"ind_2d", "تُفَاعِلَانِ"}, {"ind_2fp", "تُفَاعِلْنَ"}, {"ind_2fs", "تُفَاعِلِينَ"}, {"ind_2mp", "تُفَاعِلُونَ"}, {"ind_2ms", "تُفَاعِلُ"}, {"ind_3fd", "تُفَاعِلَانِ"}, {"ind_3fp", "يُفَاعِلْنَ"}, {"ind_3fs", "تُفَاعِلُ"}, {"ind_3md", "يُفَاعِلَانِ"}, {"ind_3mp", "يُفَاعِلُونَ"}, {"ind_3ms", "يُفَاعِلُ"}, {"ind_pass_1p", "نُفَاعَلُ"}, {"ind_pass_1s", "أُفَاعَلُ"}, {"ind_pass_2d", "تُفَاعَلَانِ"}, {"ind_pass_2fp", "تُفَاعَلْنَ"}, {"ind_pass_2fs", "تُفَاعَلِينَ"}, {"ind_pass_2mp", "تُفَاعَلُونَ"}, {"ind_pass_2ms", "تُفَاعَلُ"}, {"ind_pass_3fd", "تُفَاعَلَانِ"}, {"ind_pass_3fp", "يُفَاعَلْنَ"}, {"ind_pass_3fs", "تُفَاعَلُ"}, {"ind_pass_3md", "يُفَاعَلَانِ"}, {"ind_pass_3mp", "يُفَاعَلُونَ"}, {"ind_pass_3ms", "يُفَاعَلُ"}, {"past_1p", "فَاعَلْنَا"}, {"past_1s", "فَاعَلْتُ"}, {"past_2d", "فَاعَلْتُمَا"}, {"past_2fp", "فَاعَلْتُنَّ"}, {"past_2fs", "فَاعَلْتِ"}, {"past_2mp", "فَاعَلْتُمْ"}, {"past_2ms", "فَاعَلْتَ"}, {"past_3fd", "فَاعَلَتَا"}, {"past_3fp", "فَاعَلْنَ"}, {"past_3fs", "فَاعَلَتْ"}, {"past_3md", "فَاعَلَا"}, {"past_3mp", "فَاعَلُوا"}, {"past_3ms", "فَاعَلَ"}, {"past_pass_1p", "فُوعِلْنَا"}, {"past_pass_1s", "فُوعِلْتُ"}, {"past_pass_2d", "فُوعِلْتُمَا"}, {"past_pass_2fp", "فُوعِلْتُنَّ"}, {"past_pass_2fs", "فُوعِلْتِ"}, {"past_pass_2mp", "فُوعِلْتُمْ"}, {"past_pass_2ms", "فُوعِلْتَ"}, {"past_pass_3fd", "فُوعِلَتَا"}, {"past_pass_3fp", "فُوعِلْنَ"}, {"past_pass_3fs", "فُوعِلَتْ"}, {"past_pass_3md", "فُوعِلَا"}, {"past_pass_3mp", "فُوعِلُوا"}, {"past_pass_3ms", "فُوعِلَ"}, }, }, { label = "بَقِيَ ـَ (p.225، ناقص يائي)", root = "بقي", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِبْقَيَا"}, {"imp_2fp", "اِبْقَيْنَ"}, {"imp_2fs", "اِبْقَيْ"}, {"imp_2mp", "اِبْقَوْا"}, {"imp_2ms", "اِبْقَ"}, {"ind_1p", "نَبْقَى"}, {"ind_1s", "أَبْقَى"}, {"ind_2d", "تَبْقَيَانِ"}, {"ind_2fp", "تَبْقَيْنَ"}, {"ind_2fs", "تَبْقَيْنَ"}, {"ind_2mp", "تَبْقَوْنَ"}, {"ind_2ms", "تَبْقَى"}, {"ind_3fd", "تَبْقَيَانِ"}, {"ind_3fp", "يَبْقَيْنَ"}, {"ind_3fs", "تَبْقَى"}, {"ind_3md", "يَبْقَيَانِ"}, {"ind_3mp", "يَبْقَوْنَ"}, {"ind_3ms", "يَبْقَى"}, {"past_1p", "بَقِينَا"}, {"past_1s", "بَقِيتُ"}, {"past_2d", "بَقِيتُمَا"}, {"past_2fp", "بَقِيتُنَّ"}, {"past_2fs", "بَقِيتِ"}, {"past_2mp", "بَقِيتُمْ"}, {"past_2ms", "بَقِيتَ"}, {"past_3fd", "بَقِيَتَا"}, {"past_3fp", "بَقِينَ"}, {"past_3fs", "بَقِيَتْ"}, {"past_3md", "بَقِيَا"}, {"past_3mp", "بَقُوا"}, {"past_3ms", "بَقِيَ"}, }, }, { label = "اِنْوَرَبَ (p.325، انفعل معتل الفاء)", root = "ورب", wazn = "انفعل", forms = { {"imp_2d", "اِنْوَرِبَا"}, {"imp_2fp", "اِنْوَرِبْنَ"}, {"imp_2fs", "اِنْوَرِبِي"}, {"imp_2mp", "اِنْوَرِبُوا"}, {"imp_2ms", "اِنْوَرِبْ"}, {"ind_1p", "نَنْوَرِبُ"}, {"ind_1s", "أَنْوَرِبُ"}, {"ind_2d", "تَنْوَرِبَانِ"}, {"ind_2fp", "تَنْوَرِبْنَ"}, {"ind_2fs", "تَنْوَرِبِينَ"}, {"ind_2mp", "تَنْوَرِبُونَ"}, {"ind_2ms", "تَنْوَرِبُ"}, {"ind_3fd", "تَنْوَرِبَانِ"}, {"ind_3fp", "يَنْوَرِبْنَ"}, {"ind_3fs", "تَنْوَرِبُ"}, {"ind_3md", "يَنْوَرِبَانِ"}, {"ind_3mp", "يَنْوَرِبُونَ"}, {"ind_3ms", "يَنْوَرِبُ"}, {"past_1p", "اِنْوَرَبْنَا"}, {"past_1s", "اِنْوَرَبْتُ"}, {"past_2d", "اِنْوَرَبْتُمَا"}, {"past_2fp", "اِنْوَرَبْتُنَّ"}, {"past_2fs", "اِنْوَرَبْتِ"}, {"past_2mp", "اِنْوَرَبْتُمْ"}, {"past_2ms", "اِنْوَرَبْتَ"}, {"past_3fd", "اِنْوَرَبَتَا"}, {"past_3fp", "اِنْوَرَبْنَ"}, {"past_3fs", "اِنْوَرَبَتْ"}, {"past_3md", "اِنْوَرَبَا"}, {"past_3mp", "اِنْوَرَبُوا"}, {"past_3ms", "اِنْوَرَبَ"}, }, }, { label = "مَدَّ ـُ (p.129، مضاعف)", root = "مدد", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "مُدَّا"}, {"imp_2fp", "اُمْدُدْنَ"}, {"imp_2fs", "مُدِّي"}, {"imp_2mp", "مُدُّوا"}, {"imp_2ms", "مُدَّ"}, {"ind_1p", "نَمُدُّ"}, {"ind_1s", "أَمُدُّ"}, {"ind_2d", "تَمُدَّانِ"}, {"ind_2fp", "تَمْدُدْنَ"}, {"ind_2fs", "تَمُدِّينَ"}, {"ind_2mp", "تَمُدُّونَ"}, {"ind_2ms", "تَمُدُّ"}, {"ind_3fd", "تَمُدَّانِ"}, {"ind_3fp", "يَمْدُدْنَ"}, {"ind_3fs", "تَمُدُّ"}, {"ind_3md", "يَمُدَّانِ"}, {"ind_3mp", "يَمُدُّونَ"}, {"ind_3ms", "يَمُدُّ"}, {"ind_pass_1p", "نُمَدُّ"}, {"ind_pass_1s", "أُمَدُّ"}, {"ind_pass_2d", "تُمَدَّانِ"}, {"ind_pass_2fp", "تُمْدَدْنَ"}, {"ind_pass_2fs", "تُمَدِّينَ"}, {"ind_pass_2mp", "تُمَدُّونَ"}, {"ind_pass_2ms", "تُمَدُّ"}, {"ind_pass_3fd", "تُمَدَّانِ"}, {"ind_pass_3fp", "يُمْدَدْنَ"}, {"ind_pass_3fs", "تُمَدُّ"}, {"ind_pass_3md", "يُمَدَّانِ"}, {"ind_pass_3mp", "يُمَدُّونَ"}, {"ind_pass_3ms", "يُمَدُّ"}, {"past_1p", "مَدَدْنَا"}, {"past_1s", "مَدَدْتُ"}, {"past_2d", "مَدَدْتُمَا"}, {"past_2fp", "مَدَدْتُنَّ"}, {"past_2fs", "مَدَدْتِ"}, {"past_2mp", "مَدَدْتُمْ"}, {"past_2ms", "مَدَدْتَ"}, {"past_3fd", "مَدَّتَا"}, {"past_3fp", "مَدَدْنَ"}, {"past_3fs", "مَدَّتْ"}, {"past_3md", "مَدَّا"}, {"past_3mp", "مَدُّوا"}, {"past_3ms", "مَدَّ"}, {"past_pass_1p", "مُدِدْنَا"}, {"past_pass_1s", "مُدِدْتُ"}, {"past_pass_2d", "مُدِدْتُمَا"}, {"past_pass_2fp", "مُدِدْتُنَّ"}, {"past_pass_2fs", "مُدِدْتِ"}, {"past_pass_2mp", "مُدِدْتُمْ"}, {"past_pass_2ms", "مُدِدْتَ"}, {"past_pass_3fd", "مُدَّتَا"}, {"past_pass_3fp", "مُدِدْنَ"}, {"past_pass_3fs", "مُدَّتْ"}, {"past_pass_3md", "مُدَّا"}, {"past_pass_3mp", "مُدُّوا"}, {"past_pass_3ms", "مُدَّ"}, }, }, { label = "أَكَلَ ـُ (p.133، مهموز الفاء)", root = "أكل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "كُلَا"}, {"imp_2fp", "كُلْنَ"}, {"imp_2fs", "كُلِي"}, {"imp_2mp", "كُلُوا"}, {"imp_2ms", "كُلْ"}, {"ind_1p", "نَأْكُلُ"}, {"ind_1s", "آكُلُ"}, {"ind_2d", "تَأْكُلَانِ"}, {"ind_2fp", "تَأْكُلْنَ"}, {"ind_2fs", "تَأْكُلِينَ"}, {"ind_2mp", "تَأْكُلُونَ"}, {"ind_2ms", "تَأْكُلُ"}, {"ind_3fd", "تَأْكُلَانِ"}, {"ind_3fp", "يَأْكُلْنَ"}, {"ind_3fs", "تَأْكُلُ"}, {"ind_3md", "يَأْكُلَانِ"}, {"ind_3mp", "يَأْكُلُونَ"}, {"ind_3ms", "يَأْكُلُ"}, {"ind_pass_1p", "نُؤْكَلُ"}, {"ind_pass_1s", "أُوكَلُ"}, {"ind_pass_2d", "تُؤْكَلَانِ"}, {"ind_pass_2fp", "تُؤْكَلْنَ"}, {"ind_pass_2fs", "تُؤْكَلِينَ"}, {"ind_pass_2mp", "تُؤْكَلُونَ"}, {"ind_pass_2ms", "تُؤْكَلُ"}, {"ind_pass_3fd", "تُؤْكَلَانِ"}, {"ind_pass_3fp", "يُؤْكَلْنَ"}, {"ind_pass_3fs", "تُؤْكَلُ"}, {"ind_pass_3md", "يُؤْكَلَانِ"}, {"ind_pass_3mp", "يُؤْكَلُونَ"}, {"ind_pass_3ms", "يُؤْكَلُ"}, {"past_1p", "أَكَلْنَا"}, {"past_1s", "أَكَلْتُ"}, {"past_2d", "أَكَلْتُمَا"}, {"past_2fp", "أَكَلْتُنَّ"}, {"past_2fs", "أَكَلْتِ"}, {"past_2mp", "أَكَلْتُمْ"}, {"past_2ms", "أَكَلْتَ"}, {"past_3fd", "أَكَلَتَا"}, {"past_3fp", "أَكَلْنَ"}, {"past_3fs", "أَكَلَتْ"}, {"past_3md", "أَكَلَا"}, {"past_3mp", "أَكَلُوا"}, {"past_3ms", "أَكَلَ"}, {"past_pass_1p", "أُكِلْنَا"}, {"past_pass_1s", "أُكِلْتُ"}, {"past_pass_2d", "أُكِلْتُمَا"}, {"past_pass_2fp", "أُكِلْتُنَّ"}, {"past_pass_2fs", "أُكِلْتِ"}, {"past_pass_2mp", "أُكِلْتُمْ"}, {"past_pass_2ms", "أُكِلْتَ"}, {"past_pass_3fd", "أُكِلَتَا"}, {"past_pass_3fp", "أُكِلْنَ"}, {"past_pass_3fs", "أُكِلَتْ"}, {"past_pass_3md", "أُكِلَا"}, {"past_pass_3mp", "أُكِلُوا"}, {"past_pass_3ms", "أُكِلَ"}, }, }, { label = "قالَ ـُ (p.138، أجوف واوي)", root = "قول", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "قُولَا"}, {"imp_2fp", "قُلْنَ"}, {"imp_2fs", "قُولِي"}, {"imp_2mp", "قُولُوا"}, {"imp_2ms", "قُلْ"}, {"ind_1p", "نَقُولُ"}, {"ind_1s", "أَقُولُ"}, {"ind_2d", "تَقُولَانِ"}, {"ind_2fp", "تَقُلْنَ"}, {"ind_2fs", "تَقُولِينَ"}, {"ind_2mp", "تَقُولُونَ"}, {"ind_2ms", "تَقُولُ"}, {"ind_3fd", "تَقُولَانِ"}, {"ind_3fp", "يَقُلْنَ"}, {"ind_3fs", "تَقُولُ"}, {"ind_3md", "يَقُولَانِ"}, {"ind_3mp", "يَقُولُونَ"}, {"ind_3ms", "يَقُولُ"}, {"ind_pass_1p", "نُقَالُ"}, {"ind_pass_1s", "أُقَالُ"}, {"ind_pass_2d", "تُقَالَانِ"}, {"ind_pass_2fp", "تُقَلْنَ"}, {"ind_pass_2fs", "تُقَالِينَ"}, {"ind_pass_2mp", "تُقَالُونَ"}, {"ind_pass_2ms", "تُقَالُ"}, {"ind_pass_3fd", "تُقَالَانِ"}, {"ind_pass_3fp", "يُقَلْنَ"}, {"ind_pass_3fs", "تُقَالُ"}, {"ind_pass_3md", "يُقَالَانِ"}, {"ind_pass_3mp", "يُقَالُونَ"}, {"ind_pass_3ms", "يُقَالُ"}, {"past_1p", "قُلْنَا"}, {"past_1s", "قُلْتُ"}, {"past_2d", "قُلْتُمَا"}, {"past_2fp", "قُلْتُنَّ"}, {"past_2fs", "قُلْتِ"}, {"past_2mp", "قُلْتُمْ"}, {"past_2ms", "قُلْتَ"}, {"past_3fd", "قَالَتَا"}, {"past_3fp", "قُلْنَ"}, {"past_3fs", "قَالَتْ"}, {"past_3md", "قَالَا"}, {"past_3mp", "قَالُوا"}, {"past_3ms", "قَالَ"}, {"past_pass_1p", "قِلْنَا"}, {"past_pass_1s", "قِلْتُ"}, {"past_pass_2d", "قِلْتُمَا"}, {"past_pass_2fp", "قِلْتُنَّ"}, {"past_pass_2fs", "قِلْتِ"}, {"past_pass_2mp", "قِلْتُمْ"}, {"past_pass_2ms", "قِلْتَ"}, {"past_pass_3fd", "قِيلَتَا"}, {"past_pass_3fp", "قِلْنَ"}, {"past_pass_3fs", "قِيلَتْ"}, {"past_pass_3md", "قِيلَا"}, {"past_pass_3mp", "قِيلُوا"}, {"past_pass_3ms", "قِيلَ"}, }, }, { label = "ضَرَبَ ـِ (p.144، صحيح سالم)", root = "ضرب", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِضْرِبَا"}, {"imp_2fp", "اِضْرِبْنَ"}, {"imp_2fs", "اِضْرِبِي"}, {"imp_2mp", "اِضْرِبُوا"}, {"imp_2ms", "اِضْرِبْ"}, {"ind_1p", "نَضْرِبُ"}, {"ind_1s", "أَضْرِبُ"}, {"ind_2d", "تَضْرِبَانِ"}, {"ind_2fp", "تَضْرِبْنَ"}, {"ind_2fs", "تَضْرِبِينَ"}, {"ind_2mp", "تَضْرِبُونَ"}, {"ind_2ms", "تَضْرِبُ"}, {"ind_3fd", "تَضْرِبَانِ"}, {"ind_3fp", "يَضْرِبْنَ"}, {"ind_3fs", "تَضْرِبُ"}, {"ind_3md", "يَضْرِبَانِ"}, {"ind_3mp", "يَضْرِبُونَ"}, {"ind_3ms", "يَضْرِبُ"}, {"ind_pass_1p", "نُضْرَبُ"}, {"ind_pass_1s", "أُضْرَبُ"}, {"ind_pass_2d", "تُضْرَبَانِ"}, {"ind_pass_2fp", "تُضْرَبْنَ"}, {"ind_pass_2fs", "تُضْرَبِينَ"}, {"ind_pass_2mp", "تُضْرَبُونَ"}, {"ind_pass_2ms", "تُضْرَبُ"}, {"ind_pass_3fd", "تُضْرَبَانِ"}, {"ind_pass_3fp", "يُضْرَبْنَ"}, {"ind_pass_3fs", "تُضْرَبُ"}, {"ind_pass_3md", "يُضْرَبَانِ"}, {"ind_pass_3mp", "يُضْرَبُونَ"}, {"ind_pass_3ms", "يُضْرَبُ"}, {"past_1p", "ضَرَبْنَا"}, {"past_1s", "ضَرَبْتُ"}, {"past_2d", "ضَرَبْتُمَا"}, {"past_2fp", "ضَرَبْتُنَّ"}, {"past_2fs", "ضَرَبْتِ"}, {"past_2mp", "ضَرَبْتُمْ"}, {"past_2ms", "ضَرَبْتَ"}, {"past_3fd", "ضَرَبَتَا"}, {"past_3fp", "ضَرَبْنَ"}, {"past_3fs", "ضَرَبَتْ"}, {"past_3md", "ضَرَبَا"}, {"past_3mp", "ضَرَبُوا"}, {"past_3ms", "ضَرَبَ"}, {"past_pass_1p", "ضُرِبْنَا"}, {"past_pass_1s", "ضُرِبْتُ"}, {"past_pass_2d", "ضُرِبْتُمَا"}, {"past_pass_2fp", "ضُرِبْتُنَّ"}, {"past_pass_2fs", "ضُرِبْتِ"}, {"past_pass_2mp", "ضُرِبْتُمْ"}, {"past_pass_2ms", "ضُرِبْتَ"}, {"past_pass_3fd", "ضُرِبَتَا"}, {"past_pass_3fp", "ضُرِبْنَ"}, {"past_pass_3fs", "ضُرِبَتْ"}, {"past_pass_3md", "ضُرِبَا"}, {"past_pass_3mp", "ضُرِبُوا"}, {"past_pass_3ms", "ضُرِبَ"}, }, }, { label = "رَأَسَ ـِ (p.153، مهموز العين)", root = "رأس", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِرْئِسَا"}, {"imp_2fp", "اِرْئِسْنَ"}, {"imp_2fs", "اِرْئِسِي"}, {"imp_2mp", "اِرْئِسُوا"}, {"imp_2ms", "اِرْئِسْ"}, {"ind_1p", "نَرْئِسُ"}, {"ind_1s", "أَرْئِسُ"}, {"ind_2d", "تَرْئِسَانِ"}, {"ind_2fp", "تَرْئِسْنَ"}, {"ind_2fs", "تَرْئِسِينَ"}, {"ind_2mp", "تَرْئِسُونَ"}, {"ind_2ms", "تَرْئِسُ"}, {"ind_3fd", "تَرْئِسَانِ"}, {"ind_3fp", "يَرْئِسْنَ"}, {"ind_3fs", "تَرْئِسُ"}, {"ind_3md", "يَرْئِسَانِ"}, {"ind_3mp", "يَرْئِسُونَ"}, {"ind_3ms", "يَرْئِسُ"}, {"ind_pass_1p", "نُرْأَسُ"}, {"ind_pass_1s", "أُرْأَسُ"}, {"ind_pass_2d", "تُرْأَسَانِ"}, {"ind_pass_2fp", "تُرْأَسْنَ"}, {"ind_pass_2fs", "تُرْأَسِينَ"}, {"ind_pass_2mp", "تُرْأَسُونَ"}, {"ind_pass_2ms", "تُرْأَسُ"}, {"ind_pass_3fd", "تُرْأَسَانِ"}, {"ind_pass_3fp", "يُرْأَسْنَ"}, {"ind_pass_3fs", "تُرْأَسُ"}, {"ind_pass_3md", "يُرْأَسَانِ"}, {"ind_pass_3mp", "يُرْأَسُونَ"}, {"ind_pass_3ms", "يُرْأَسُ"}, {"past_1p", "رَأَسْنَا"}, {"past_1s", "رَأَسْتُ"}, {"past_2d", "رَأَسْتُمَا"}, {"past_2fp", "رَأَسْتُنَّ"}, {"past_2fs", "رَأَسْتِ"}, {"past_2mp", "رَأَسْتُمْ"}, {"past_2ms", "رَأَسْتَ"}, {"past_3fd", "رَأَسَتَا"}, {"past_3fp", "رَأَسْنَ"}, {"past_3fs", "رَأَسَتْ"}, {"past_3md", "رَأَسَا"}, {"past_3mp", "رَأَسُوا"}, {"past_3ms", "رَأَسَ"}, {"past_pass_1p", "رُئِسْنَا"}, {"past_pass_1s", "رُئِسْتُ"}, {"past_pass_2d", "رُئِسْتُمَا"}, {"past_pass_2fp", "رُئِسْتُنَّ"}, {"past_pass_2fs", "رُئِسْتِ"}, {"past_pass_2mp", "رُئِسْتُمْ"}, {"past_pass_2ms", "رُئِسْتَ"}, {"past_pass_3fd", "رُئِسَتَا"}, {"past_pass_3fp", "رُئِسْنَ"}, {"past_pass_3fs", "رُئِسَتْ"}, {"past_pass_3md", "رُئِسَا"}, {"past_pass_3mp", "رُئِسُوا"}, {"past_pass_3ms", "رُئِسَ"}, }, }, } n6a1mvb5t87fp8l6usbm2gy9zb8yqdc 1099201 1099192 2026-08-22T21:44:42Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099201 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 2 من 5. return { { label = "فَعَّلَ (p.241، الوزن الثاني)", root = "فعل", wazn = "فعّل", pass = true, forms = { {"imp_2d", "فَعِّلَا"}, {"imp_2fp", "فَعِّلْنَ"}, {"imp_2fs", "فَعِّلِي"}, {"imp_2mp", "فَعِّلُوا"}, {"imp_2ms", "فَعِّلْ"}, {"ind_1p", "نُفَعِّلُ"}, {"ind_1s", "أُفَعِّلُ"}, {"ind_2d", "تُفَعِّلَانِ"}, {"ind_2fp", "تُفَعِّلْنَ"}, {"ind_2fs", "تُفَعِّلِينَ"}, {"ind_2mp", "تُفَعِّلُونَ"}, {"ind_2ms", "تُفَعِّلُ"}, {"ind_3fd", "تُفَعِّلَانِ"}, {"ind_3fp", "يُفَعِّلْنَ"}, {"ind_3fs", "تُفَعِّلُ"}, {"ind_3md", "يُفَعِّلَانِ"}, {"ind_3mp", "يُفَعِّلُونَ"}, {"ind_3ms", "يُفَعِّلُ"}, {"ind_pass_1p", "نُفَعَّلُ"}, {"ind_pass_1s", "أُفَعَّلُ"}, {"ind_pass_2d", "تُفَعَّلَانِ"}, {"ind_pass_2fp", "تُفَعَّلْنَ"}, {"ind_pass_2fs", "تُفَعَّلِينَ"}, {"ind_pass_2mp", "تُفَعَّلُونَ"}, {"ind_pass_2ms", "تُفَعَّلُ"}, {"ind_pass_3fd", "تُفَعَّلَانِ"}, {"ind_pass_3fp", "يُفَعَّلْنَ"}, {"ind_pass_3fs", "تُفَعَّلُ"}, {"ind_pass_3md", "يُفَعَّلَانِ"}, {"ind_pass_3mp", "يُفَعَّلُونَ"}, {"ind_pass_3ms", "يُفَعَّلُ"}, {"past_1p", "فَعَّلْنَا"}, {"past_1s", "فَعَّلْتُ"}, {"past_2d", "فَعَّلْتُمَا"}, {"past_2fp", "فَعَّلْتُنَّ"}, {"past_2fs", "فَعَّلْتِ"}, {"past_2mp", "فَعَّلْتُمْ"}, {"past_2ms", "فَعَّلْتَ"}, {"past_3fd", "فَعَّلَتَا"}, {"past_3fp", "فَعَّلْنَ"}, {"past_3fs", "فَعَّلَتْ"}, {"past_3md", "فَعَّلَا"}, {"past_3mp", "فَعَّلُوا"}, {"past_3ms", "فَعَّلَ"}, {"past_pass_1p", "فُعِّلْنَا"}, {"past_pass_1s", "فُعِّلْتُ"}, {"past_pass_2d", "فُعِّلْتُمَا"}, {"past_pass_2fp", "فُعِّلْتُنَّ"}, {"past_pass_2fs", "فُعِّلْتِ"}, {"past_pass_2mp", "فُعِّلْتُمْ"}, {"past_pass_2ms", "فُعِّلْتَ"}, {"past_pass_3fd", "فُعِّلَتَا"}, {"past_pass_3fp", "فُعِّلْنَ"}, {"past_pass_3fs", "فُعِّلَتْ"}, {"past_pass_3md", "فُعِّلَا"}, {"past_pass_3mp", "فُعِّلُوا"}, {"past_pass_3ms", "فُعِّلَ"}, }, }, { label = "حَيِيَ ـَ (p.229، لفيف مقرون)", root = "حيي", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِحْيَيَا"}, {"imp_2fp", "اِحْيَيْنَ"}, {"imp_2fs", "اِحْيَيْ"}, {"imp_2mp", "اِحْيَوْا"}, {"imp_2ms", "اِحْيَ"}, {"ind_1p", "نَحْيَا"}, {"ind_1s", "أَحْيَا"}, {"ind_2d", "تَحْيَيَانِ"}, {"ind_2fp", "تَحْيَيْنَ"}, {"ind_2fs", "تَحْيَيْنَ"}, {"ind_2mp", "تَحْيَوْنَ"}, {"ind_2ms", "تَحْيَا"}, {"ind_3fd", "تَحْيَيَانِ"}, {"ind_3fp", "يَحْيَيْنَ"}, {"ind_3fs", "تَحْيَا"}, {"ind_3md", "يَحْيَيَانِ"}, {"ind_3mp", "يَحْيَوْنَ"}, {"ind_3ms", "يَحْيَا"}, {"ind_pass_1p", "نُحْيَا"}, {"ind_pass_1s", "أُحْيَا"}, {"ind_pass_2d", "تُحْيَيَانِ"}, {"ind_pass_2fp", "تُحْيَيْنَ"}, {"ind_pass_2fs", "تُحْيَيْنَ"}, {"ind_pass_2mp", "تُحْيَوْنَ"}, {"ind_pass_2ms", "تُحْيَا"}, {"ind_pass_3fd", "تُحْيَيَانِ"}, {"ind_pass_3fp", "يُحْيَيْنَ"}, {"ind_pass_3fs", "تُحْيَا"}, {"ind_pass_3md", "يُحْيَيَانِ"}, {"ind_pass_3mp", "يُحْيَوْنَ"}, {"ind_pass_3ms", "يُحْيَا"}, {"past_1p", "حَيِينَا"}, {"past_1s", "حَيِيتُ"}, {"past_2d", "حَيِيتُمَا"}, {"past_2fp", "حَيِيتُنَّ"}, {"past_2fs", "حَيِيتِ"}, {"past_2mp", "حَيِيتُمْ"}, {"past_2ms", "حَيِيتَ"}, {"past_3fd", "حَيِيَتَا"}, {"past_3fp", "حَيِينَ"}, {"past_3fs", "حَيِيَتْ"}, {"past_3md", "حَيِيَا"}, {"past_3mp", "حَيُوا"}, {"past_3ms", "حَيِيَ"}, {"past_pass_1p", "حُيِينَا"}, {"past_pass_1s", "حُيِيتُ"}, {"past_pass_2d", "حُيِيتُمَا"}, {"past_pass_2fp", "حُيِيتُنَّ"}, {"past_pass_2fs", "حُيِيتِ"}, {"past_pass_2mp", "حُيِيتُمْ"}, {"past_pass_2ms", "حُيِيتَ"}, {"past_pass_3fd", "حُيِيَتَا"}, {"past_pass_3fp", "حُيِينَ"}, {"past_pass_3fs", "حُيِيَتْ"}, {"past_pass_3md", "حُيِيَا"}, {"past_pass_3mp", "حُيُوا"}, {"past_pass_3ms", "حُيِيَ"}, }, }, { label = "اِحْوَنْصَلَ (p.412، افعنلل)", root = "حوصل", wazn = "افعنلل", forms = { {"imp_2d", "اِحْوَنْصِلَا"}, {"imp_2fp", "اِحْوَنْصِلْنَ"}, {"imp_2fs", "اِحْوَنْصِلِي"}, {"imp_2mp", "اِحْوَنْصِلُوا"}, {"imp_2ms", "اِحْوَنْصِلْ"}, {"ind_1p", "نَحْوَنْصِلُ"}, {"ind_1s", "أَحْوَنْصِلُ"}, {"ind_2d", "تَحْوَنْصِلَانِ"}, {"ind_2fp", "تَحْوَنْصِلْنَ"}, {"ind_2fs", "تَحْوَنْصِلِينَ"}, {"ind_2mp", "تَحْوَنْصِلُونَ"}, {"ind_2ms", "تَحْوَنْصِلُ"}, {"ind_3fd", "تَحْوَنْصِلَانِ"}, {"ind_3fp", "يَحْوَنْصِلْنَ"}, {"ind_3fs", "تَحْوَنْصِلُ"}, {"ind_3md", "يَحْوَنْصِلَانِ"}, {"ind_3mp", "يَحْوَنْصِلُونَ"}, {"ind_3ms", "يَحْوَنْصِلُ"}, {"past_1p", "اِحْوَنْصَلْنَا"}, {"past_1s", "اِحْوَنْصَلْتُ"}, {"past_2d", "اِحْوَنْصَلْتُمَا"}, {"past_2fp", "اِحْوَنْصَلْتُنَّ"}, {"past_2fs", "اِحْوَنْصَلْتِ"}, {"past_2mp", "اِحْوَنْصَلْتُمْ"}, {"past_2ms", "اِحْوَنْصَلْتَ"}, {"past_3fd", "اِحْوَنْصَلَتَا"}, {"past_3fp", "اِحْوَنْصَلْنَ"}, {"past_3fs", "اِحْوَنْصَلَتْ"}, {"past_3md", "اِحْوَنْصَلَا"}, {"past_3mp", "اِحْوَنْصَلُوا"}, {"past_3ms", "اِحْوَنْصَلَ"}, }, }, { label = "اِرْعَوَى (p.357، افعلّ ناقص)", root = "رعو", wazn = "افعلّ", forms = { {"imp_2d", "اِرْعَوِيَا"}, {"imp_2fp", "اِرْعَوِينَ"}, {"imp_2fs", "اِرْعَوِي"}, {"imp_2mp", "اِرْعَوُوا"}, {"imp_2ms", "اِرْعَوِ"}, {"ind_1p", "نَرْعَوِي"}, {"ind_1s", "أَرْعَوِي"}, {"ind_2d", "تَرْعَوِيَانِ"}, {"ind_2fp", "تَرْعَوِينَ"}, {"ind_2fs", "تَرْعَوِينَ"}, {"ind_2mp", "تَرْعَوُونَ"}, {"ind_2ms", "تَرْعَوِي"}, {"ind_3fd", "تَرْعَوِيَانِ"}, {"ind_3fp", "يَرْعَوِينَ"}, {"ind_3fs", "تَرْعَوِي"}, {"ind_3md", "يَرْعَوِيَانِ"}, {"ind_3mp", "يَرْعَوُونَ"}, {"ind_3ms", "يَرْعَوِي"}, {"past_1p", "اِرْعَوَيْنَا"}, {"past_1s", "اِرْعَوَيْتُ"}, {"past_2d", "اِرْعَوَيْتُمَا"}, {"past_2fp", "اِرْعَوَيْتُنَّ"}, {"past_2fs", "اِرْعَوَيْتِ"}, {"past_2mp", "اِرْعَوَيْتُمْ"}, {"past_2ms", "اِرْعَوَيْتَ"}, {"past_3fd", "اِرْعَوَتَا"}, {"past_3fp", "اِرْعَوَيْنَ"}, {"past_3fs", "اِرْعَوَتْ"}, {"past_3md", "اِرْعَوَيَا"}, {"past_3mp", "اِرْعَوَوْا"}, {"past_3ms", "اِرْعَوَى"}, }, }, { label = "تَفَوْعَلَ (p.398، تفعلل)", root = "فوعل", wazn = "تفعلل", pass = true, forms = { {"imp_2d", "تَفَوْعَلَا"}, {"imp_2fp", "تَفَوْعَلْنَ"}, {"imp_2fs", "تَفَوْعَلِي"}, {"imp_2mp", "تَفَوْعَلُوا"}, {"imp_2ms", "تَفَوْعَلْ"}, {"ind_1p", "نَتَفَوْعَلُ"}, {"ind_1s", "أَتَفَوْعَلُ"}, {"ind_2d", "تَتَفَوْعَلَانِ"}, {"ind_2fp", "تَتَفَوْعَلْنَ"}, {"ind_2fs", "تَتَفَوْعَلِينَ"}, {"ind_2mp", "تَتَفَوْعَلُونَ"}, {"ind_2ms", "تَتَفَوْعَلُ"}, {"ind_3fd", "تَتَفَوْعَلَانِ"}, {"ind_3fp", "يَتَفَوْعَلْنَ"}, {"ind_3fs", "تَتَفَوْعَلُ"}, {"ind_3md", "يَتَفَوْعَلَانِ"}, {"ind_3mp", "يَتَفَوْعَلُونَ"}, {"ind_3ms", "يَتَفَوْعَلُ"}, {"ind_pass_1p", "نُتَفَوْعَلُ"}, {"ind_pass_1s", "أُتَفَوْعَلُ"}, {"ind_pass_2d", "تُتَفَوْعَلَانِ"}, {"ind_pass_2fp", "تُتَفَوْعَلْنَ"}, {"ind_pass_2fs", "تُتَفَوْعَلِينَ"}, {"ind_pass_2mp", "تُتَفَوْعَلُونَ"}, {"ind_pass_2ms", "تُتَفَوْعَلُ"}, {"ind_pass_3fd", "تُتَفَوْعَلَانِ"}, {"ind_pass_3fp", "يُتَفَوْعَلْنَ"}, {"ind_pass_3fs", "تُتَفَوْعَلُ"}, {"ind_pass_3md", "يُتَفَوْعَلَانِ"}, {"ind_pass_3mp", "يُتَفَوْعَلُونَ"}, {"ind_pass_3ms", "يُتَفَوْعَلُ"}, {"past_1p", "تَفَوْعَلْنَا"}, {"past_1s", "تَفَوْعَلْتُ"}, {"past_2d", "تَفَوْعَلْتُمَا"}, {"past_2fp", "تَفَوْعَلْتُنَّ"}, {"past_2fs", "تَفَوْعَلْتِ"}, {"past_2mp", "تَفَوْعَلْتُمْ"}, {"past_2ms", "تَفَوْعَلْتَ"}, {"past_3fd", "تَفَوْعَلَتَا"}, {"past_3fp", "تَفَوْعَلْنَ"}, {"past_3fs", "تَفَوْعَلَتْ"}, {"past_3md", "تَفَوْعَلَا"}, {"past_3mp", "تَفَوْعَلُوا"}, {"past_3ms", "تَفَوْعَلَ"}, {"past_pass_1p", "تُفُوعِلْنَا"}, {"past_pass_1s", "تُفُوعِلْتُ"}, {"past_pass_2d", "تُفُوعِلْتُمَا"}, {"past_pass_2fp", "تُفُوعِلْتُنَّ"}, {"past_pass_2fs", "تُفُوعِلْتِ"}, {"past_pass_2mp", "تُفُوعِلْتُمْ"}, {"past_pass_2ms", "تُفُوعِلْتَ"}, {"past_pass_3fd", "تُفُوعِلَتَا"}, {"past_pass_3fp", "تُفُوعِلْنَ"}, {"past_pass_3fs", "تُفُوعِلَتْ"}, {"past_pass_3md", "تُفُوعِلَا"}, {"past_pass_3mp", "تُفُوعِلُوا"}, {"past_pass_3ms", "تُفُوعِلَ"}, }, }, { label = "اِظَّنَّ (p.336، افتعل مدغم مضاعف)", root = "ظنن", wazn = "افتعل", forms = { {"imp_2d", "اِظَّنَّا"}, {"imp_2fs", "اِظَّنِّي"}, {"imp_2mp", "اِظَّنُّوا"}, {"imp_2ms", "اِظَّنَّ"}, {"ind_1p", "نَظَّنُّ"}, {"ind_1s", "أَظَّنُّ"}, {"ind_2d", "تَظَّنَّانِ"}, {"ind_2fs", "تَظَّنِّينَ"}, {"ind_2mp", "تَظَّنُّونَ"}, {"ind_2ms", "تَظَّنُّ"}, {"ind_3fd", "تَظَّنَّانِ"}, {"ind_3fs", "تَظَّنُّ"}, {"ind_3md", "يَظَّنَّانِ"}, {"ind_3mp", "يَظَّنُّونَ"}, {"ind_3ms", "يَظَّنُّ"}, {"past_1p", "اِظَّنَنَّا"}, {"past_1s", "اِظَّنَنْتُ"}, {"past_2d", "اِظَّنَنْتُمَا"}, {"past_2fp", "اِظَّنَنْتُنَّ"}, {"past_2fs", "اِظَّنَنْتِ"}, {"past_2mp", "اِظَّنَنْتُمْ"}, {"past_2ms", "اِظَّنَنْتَ"}, {"past_3fd", "اِظَّنَّتَا"}, {"past_3fs", "اِظَّنَّتْ"}, {"past_3md", "اِظَّنَّا"}, {"past_3mp", "اِظَّنُّوا"}, {"past_3ms", "اِظَّنَّ"}, }, }, { label = "اِصّاعَدَ (p.304، تفاعل مدغم)", root = "صعد", wazn = "تفاعل", reduced = true, forms = { {"imp_2d", "اِصَّاعَدَا"}, {"imp_2fp", "اِصَّاعَدْنَ"}, {"imp_2fs", "اِصَّاعَدِي"}, {"imp_2mp", "اِصَّاعَدُوا"}, {"imp_2ms", "اِصَّاعَدْ"}, {"ind_1p", "نَصَّاعَدُ"}, {"ind_1s", "أَصَّاعَدُ"}, {"ind_2d", "تَصَّاعَدَانِ"}, {"ind_2fp", "تَصَّاعَدْنَ"}, {"ind_2fs", "تَصَّاعَدِينَ"}, {"ind_2mp", "تَصَّاعَدُونَ"}, {"ind_2ms", "تَصَّاعَدُ"}, {"ind_3fd", "تَصَّاعَدَانِ"}, {"ind_3fp", "يَصَّاعَدْنَ"}, {"ind_3fs", "تَصَّاعَدُ"}, {"ind_3md", "يَصَّاعَدَانِ"}, {"ind_3mp", "يَصَّاعَدُونَ"}, {"ind_3ms", "يَصَّاعَدُ"}, {"past_1p", "اِصَّاعَدْنَا"}, {"past_1s", "اِصَّاعَدْتُ"}, {"past_2d", "اِصَّاعَدْتُمَا"}, {"past_2fp", "اِصَّاعَدْتُنَّ"}, {"past_2fs", "اِصَّاعَدْتِ"}, {"past_2mp", "اِصَّاعَدْتُمْ"}, {"past_2ms", "اِصَّاعَدْتَ"}, {"past_3fd", "اِصَّاعَدَتَا"}, {"past_3fp", "اِصَّاعَدْنَ"}, {"past_3fs", "اِصَّاعَدَتْ"}, {"past_3md", "اِصَّاعَدَا"}, {"past_3mp", "اِصَّاعَدُوا"}, {"past_3ms", "اِصَّاعَدَ"}, }, }, { label = "فاعَلَ (p.256، الوزن الثالث)", root = "فعل", wazn = "فاعل", pass = true, forms = { {"imp_2d", "فَاعِلَا"}, {"imp_2fp", "فَاعِلْنَ"}, {"imp_2fs", "فَاعِلِي"}, {"imp_2mp", "فَاعِلُوا"}, {"imp_2ms", "فَاعِلْ"}, {"ind_1p", "نُفَاعِلُ"}, {"ind_1s", "أُفَاعِلُ"}, {"ind_2d", "تُفَاعِلَانِ"}, {"ind_2fp", "تُفَاعِلْنَ"}, {"ind_2fs", "تُفَاعِلِينَ"}, {"ind_2mp", "تُفَاعِلُونَ"}, {"ind_2ms", "تُفَاعِلُ"}, {"ind_3fd", "تُفَاعِلَانِ"}, {"ind_3fp", "يُفَاعِلْنَ"}, {"ind_3fs", "تُفَاعِلُ"}, {"ind_3md", "يُفَاعِلَانِ"}, {"ind_3mp", "يُفَاعِلُونَ"}, {"ind_3ms", "يُفَاعِلُ"}, {"ind_pass_1p", "نُفَاعَلُ"}, {"ind_pass_1s", "أُفَاعَلُ"}, {"ind_pass_2d", "تُفَاعَلَانِ"}, {"ind_pass_2fp", "تُفَاعَلْنَ"}, {"ind_pass_2fs", "تُفَاعَلِينَ"}, {"ind_pass_2mp", "تُفَاعَلُونَ"}, {"ind_pass_2ms", "تُفَاعَلُ"}, {"ind_pass_3fd", "تُفَاعَلَانِ"}, {"ind_pass_3fp", "يُفَاعَلْنَ"}, {"ind_pass_3fs", "تُفَاعَلُ"}, {"ind_pass_3md", "يُفَاعَلَانِ"}, {"ind_pass_3mp", "يُفَاعَلُونَ"}, {"ind_pass_3ms", "يُفَاعَلُ"}, {"past_1p", "فَاعَلْنَا"}, {"past_1s", "فَاعَلْتُ"}, {"past_2d", "فَاعَلْتُمَا"}, {"past_2fp", "فَاعَلْتُنَّ"}, {"past_2fs", "فَاعَلْتِ"}, {"past_2mp", "فَاعَلْتُمْ"}, {"past_2ms", "فَاعَلْتَ"}, {"past_3fd", "فَاعَلَتَا"}, {"past_3fp", "فَاعَلْنَ"}, {"past_3fs", "فَاعَلَتْ"}, {"past_3md", "فَاعَلَا"}, {"past_3mp", "فَاعَلُوا"}, {"past_3ms", "فَاعَلَ"}, {"past_pass_1p", "فُوعِلْنَا"}, {"past_pass_1s", "فُوعِلْتُ"}, {"past_pass_2d", "فُوعِلْتُمَا"}, {"past_pass_2fp", "فُوعِلْتُنَّ"}, {"past_pass_2fs", "فُوعِلْتِ"}, {"past_pass_2mp", "فُوعِلْتُمْ"}, {"past_pass_2ms", "فُوعِلْتَ"}, {"past_pass_3fd", "فُوعِلَتَا"}, {"past_pass_3fp", "فُوعِلْنَ"}, {"past_pass_3fs", "فُوعِلَتْ"}, {"past_pass_3md", "فُوعِلَا"}, {"past_pass_3mp", "فُوعِلُوا"}, {"past_pass_3ms", "فُوعِلَ"}, }, }, { label = "بَقِيَ ـَ (p.225، ناقص يائي)", root = "بقي", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِبْقَيَا"}, {"imp_2fp", "اِبْقَيْنَ"}, {"imp_2fs", "اِبْقَيْ"}, {"imp_2mp", "اِبْقَوْا"}, {"imp_2ms", "اِبْقَ"}, {"ind_1p", "نَبْقَى"}, {"ind_1s", "أَبْقَى"}, {"ind_2d", "تَبْقَيَانِ"}, {"ind_2fp", "تَبْقَيْنَ"}, {"ind_2fs", "تَبْقَيْنَ"}, {"ind_2mp", "تَبْقَوْنَ"}, {"ind_2ms", "تَبْقَى"}, {"ind_3fd", "تَبْقَيَانِ"}, {"ind_3fp", "يَبْقَيْنَ"}, {"ind_3fs", "تَبْقَى"}, {"ind_3md", "يَبْقَيَانِ"}, {"ind_3mp", "يَبْقَوْنَ"}, {"ind_3ms", "يَبْقَى"}, {"past_1p", "بَقِينَا"}, {"past_1s", "بَقِيتُ"}, {"past_2d", "بَقِيتُمَا"}, {"past_2fp", "بَقِيتُنَّ"}, {"past_2fs", "بَقِيتِ"}, {"past_2mp", "بَقِيتُمْ"}, {"past_2ms", "بَقِيتَ"}, {"past_3fd", "بَقِيَتَا"}, {"past_3fp", "بَقِينَ"}, {"past_3fs", "بَقِيَتْ"}, {"past_3md", "بَقِيَا"}, {"past_3mp", "بَقُوا"}, {"past_3ms", "بَقِيَ"}, }, }, { label = "اِنْوَرَبَ (p.325، انفعل معتل الفاء)", root = "ورب", wazn = "انفعل", forms = { {"imp_2d", "اِنْوَرِبَا"}, {"imp_2fp", "اِنْوَرِبْنَ"}, {"imp_2fs", "اِنْوَرِبِي"}, {"imp_2mp", "اِنْوَرِبُوا"}, {"imp_2ms", "اِنْوَرِبْ"}, {"ind_1p", "نَنْوَرِبُ"}, {"ind_1s", "أَنْوَرِبُ"}, {"ind_2d", "تَنْوَرِبَانِ"}, {"ind_2fp", "تَنْوَرِبْنَ"}, {"ind_2fs", "تَنْوَرِبِينَ"}, {"ind_2mp", "تَنْوَرِبُونَ"}, {"ind_2ms", "تَنْوَرِبُ"}, {"ind_3fd", "تَنْوَرِبَانِ"}, {"ind_3fp", "يَنْوَرِبْنَ"}, {"ind_3fs", "تَنْوَرِبُ"}, {"ind_3md", "يَنْوَرِبَانِ"}, {"ind_3mp", "يَنْوَرِبُونَ"}, {"ind_3ms", "يَنْوَرِبُ"}, {"past_1p", "اِنْوَرَبْنَا"}, {"past_1s", "اِنْوَرَبْتُ"}, {"past_2d", "اِنْوَرَبْتُمَا"}, {"past_2fp", "اِنْوَرَبْتُنَّ"}, {"past_2fs", "اِنْوَرَبْتِ"}, {"past_2mp", "اِنْوَرَبْتُمْ"}, {"past_2ms", "اِنْوَرَبْتَ"}, {"past_3fd", "اِنْوَرَبَتَا"}, {"past_3fp", "اِنْوَرَبْنَ"}, {"past_3fs", "اِنْوَرَبَتْ"}, {"past_3md", "اِنْوَرَبَا"}, {"past_3mp", "اِنْوَرَبُوا"}, {"past_3ms", "اِنْوَرَبَ"}, }, }, { label = "مَدَّ ـُ (p.129، مضاعف)", root = "مدد", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "مُدَّا"}, {"imp_2fp", "اُمْدُدْنَ"}, {"imp_2fs", "مُدِّي"}, {"imp_2mp", "مُدُّوا"}, {"imp_2ms", "مُدَّ"}, {"ind_1p", "نَمُدُّ"}, {"ind_1s", "أَمُدُّ"}, {"ind_2d", "تَمُدَّانِ"}, {"ind_2fp", "تَمْدُدْنَ"}, {"ind_2fs", "تَمُدِّينَ"}, {"ind_2mp", "تَمُدُّونَ"}, {"ind_2ms", "تَمُدُّ"}, {"ind_3fd", "تَمُدَّانِ"}, {"ind_3fp", "يَمْدُدْنَ"}, {"ind_3fs", "تَمُدُّ"}, {"ind_3md", "يَمُدَّانِ"}, {"ind_3mp", "يَمُدُّونَ"}, {"ind_3ms", "يَمُدُّ"}, {"ind_pass_1p", "نُمَدُّ"}, {"ind_pass_1s", "أُمَدُّ"}, {"ind_pass_2d", "تُمَدَّانِ"}, {"ind_pass_2fp", "تُمْدَدْنَ"}, {"ind_pass_2fs", "تُمَدِّينَ"}, {"ind_pass_2mp", "تُمَدُّونَ"}, {"ind_pass_2ms", "تُمَدُّ"}, {"ind_pass_3fd", "تُمَدَّانِ"}, {"ind_pass_3fp", "يُمْدَدْنَ"}, {"ind_pass_3fs", "تُمَدُّ"}, {"ind_pass_3md", "يُمَدَّانِ"}, {"ind_pass_3mp", "يُمَدُّونَ"}, {"ind_pass_3ms", "يُمَدُّ"}, {"past_1p", "مَدَدْنَا"}, {"past_1s", "مَدَدْتُ"}, {"past_2d", "مَدَدْتُمَا"}, {"past_2fp", "مَدَدْتُنَّ"}, {"past_2fs", "مَدَدْتِ"}, {"past_2mp", "مَدَدْتُمْ"}, {"past_2ms", "مَدَدْتَ"}, {"past_3fd", "مَدَّتَا"}, {"past_3fp", "مَدَدْنَ"}, {"past_3fs", "مَدَّتْ"}, {"past_3md", "مَدَّا"}, {"past_3mp", "مَدُّوا"}, {"past_3ms", "مَدَّ"}, {"past_pass_1p", "مُدِدْنَا"}, {"past_pass_1s", "مُدِدْتُ"}, {"past_pass_2d", "مُدِدْتُمَا"}, {"past_pass_2fp", "مُدِدْتُنَّ"}, {"past_pass_2fs", "مُدِدْتِ"}, {"past_pass_2mp", "مُدِدْتُمْ"}, {"past_pass_2ms", "مُدِدْتَ"}, {"past_pass_3fd", "مُدَّتَا"}, {"past_pass_3fp", "مُدِدْنَ"}, {"past_pass_3fs", "مُدَّتْ"}, {"past_pass_3md", "مُدَّا"}, {"past_pass_3mp", "مُدُّوا"}, {"past_pass_3ms", "مُدَّ"}, }, }, { label = "أَكَلَ ـُ (p.133، مهموز الفاء)", root = "أكل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "كُلَا"}, {"imp_2fp", "كُلْنَ"}, {"imp_2fs", "كُلِي"}, {"imp_2mp", "كُلُوا"}, {"imp_2ms", "كُلْ"}, {"ind_1p", "نَأْكُلُ"}, {"ind_1s", "آكُلُ"}, {"ind_2d", "تَأْكُلَانِ"}, {"ind_2fp", "تَأْكُلْنَ"}, {"ind_2fs", "تَأْكُلِينَ"}, {"ind_2mp", "تَأْكُلُونَ"}, {"ind_2ms", "تَأْكُلُ"}, {"ind_3fd", "تَأْكُلَانِ"}, {"ind_3fp", "يَأْكُلْنَ"}, {"ind_3fs", "تَأْكُلُ"}, {"ind_3md", "يَأْكُلَانِ"}, {"ind_3mp", "يَأْكُلُونَ"}, {"ind_3ms", "يَأْكُلُ"}, {"ind_pass_1p", "نُؤْكَلُ"}, {"ind_pass_1s", "أُوكَلُ"}, {"ind_pass_2d", "تُؤْكَلَانِ"}, {"ind_pass_2fp", "تُؤْكَلْنَ"}, {"ind_pass_2fs", "تُؤْكَلِينَ"}, {"ind_pass_2mp", "تُؤْكَلُونَ"}, {"ind_pass_2ms", "تُؤْكَلُ"}, {"ind_pass_3fd", "تُؤْكَلَانِ"}, {"ind_pass_3fp", "يُؤْكَلْنَ"}, {"ind_pass_3fs", "تُؤْكَلُ"}, {"ind_pass_3md", "يُؤْكَلَانِ"}, {"ind_pass_3mp", "يُؤْكَلُونَ"}, {"ind_pass_3ms", "يُؤْكَلُ"}, {"past_1p", "أَكَلْنَا"}, {"past_1s", "أَكَلْتُ"}, {"past_2d", "أَكَلْتُمَا"}, {"past_2fp", "أَكَلْتُنَّ"}, {"past_2fs", "أَكَلْتِ"}, {"past_2mp", "أَكَلْتُمْ"}, {"past_2ms", "أَكَلْتَ"}, {"past_3fd", "أَكَلَتَا"}, {"past_3fp", "أَكَلْنَ"}, {"past_3fs", "أَكَلَتْ"}, {"past_3md", "أَكَلَا"}, {"past_3mp", "أَكَلُوا"}, {"past_3ms", "أَكَلَ"}, {"past_pass_1p", "أُكِلْنَا"}, {"past_pass_1s", "أُكِلْتُ"}, {"past_pass_2d", "أُكِلْتُمَا"}, {"past_pass_2fp", "أُكِلْتُنَّ"}, {"past_pass_2fs", "أُكِلْتِ"}, {"past_pass_2mp", "أُكِلْتُمْ"}, {"past_pass_2ms", "أُكِلْتَ"}, {"past_pass_3fd", "أُكِلَتَا"}, {"past_pass_3fp", "أُكِلْنَ"}, {"past_pass_3fs", "أُكِلَتْ"}, {"past_pass_3md", "أُكِلَا"}, {"past_pass_3mp", "أُكِلُوا"}, {"past_pass_3ms", "أُكِلَ"}, }, }, { label = "قالَ ـُ (p.138، أجوف واوي)", root = "قول", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "قُولَا"}, {"imp_2fp", "قُلْنَ"}, {"imp_2fs", "قُولِي"}, {"imp_2mp", "قُولُوا"}, {"imp_2ms", "قُلْ"}, {"ind_1p", "نَقُولُ"}, {"ind_1s", "أَقُولُ"}, {"ind_2d", "تَقُولَانِ"}, {"ind_2fp", "تَقُلْنَ"}, {"ind_2fs", "تَقُولِينَ"}, {"ind_2mp", "تَقُولُونَ"}, {"ind_2ms", "تَقُولُ"}, {"ind_3fd", "تَقُولَانِ"}, {"ind_3fp", "يَقُلْنَ"}, {"ind_3fs", "تَقُولُ"}, {"ind_3md", "يَقُولَانِ"}, {"ind_3mp", "يَقُولُونَ"}, {"ind_3ms", "يَقُولُ"}, {"ind_pass_1p", "نُقَالُ"}, {"ind_pass_1s", "أُقَالُ"}, {"ind_pass_2d", "تُقَالَانِ"}, {"ind_pass_2fp", "تُقَلْنَ"}, {"ind_pass_2fs", "تُقَالِينَ"}, {"ind_pass_2mp", "تُقَالُونَ"}, {"ind_pass_2ms", "تُقَالُ"}, {"ind_pass_3fd", "تُقَالَانِ"}, {"ind_pass_3fp", "يُقَلْنَ"}, {"ind_pass_3fs", "تُقَالُ"}, {"ind_pass_3md", "يُقَالَانِ"}, {"ind_pass_3mp", "يُقَالُونَ"}, {"ind_pass_3ms", "يُقَالُ"}, {"past_1p", "قُلْنَا"}, {"past_1s", "قُلْتُ"}, {"past_2d", "قُلْتُمَا"}, {"past_2fp", "قُلْتُنَّ"}, {"past_2fs", "قُلْتِ"}, {"past_2mp", "قُلْتُمْ"}, {"past_2ms", "قُلْتَ"}, {"past_3fd", "قَالَتَا"}, {"past_3fp", "قُلْنَ"}, {"past_3fs", "قَالَتْ"}, {"past_3md", "قَالَا"}, {"past_3mp", "قَالُوا"}, {"past_3ms", "قَالَ"}, {"past_pass_1p", "قِلْنَا"}, {"past_pass_1s", "قِلْتُ"}, {"past_pass_2d", "قِلْتُمَا"}, {"past_pass_2fp", "قِلْتُنَّ"}, {"past_pass_2fs", "قِلْتِ"}, {"past_pass_2mp", "قِلْتُمْ"}, {"past_pass_2ms", "قِلْتَ"}, {"past_pass_3fd", "قِيلَتَا"}, {"past_pass_3fp", "قِلْنَ"}, {"past_pass_3fs", "قِيلَتْ"}, {"past_pass_3md", "قِيلَا"}, {"past_pass_3mp", "قِيلُوا"}, {"past_pass_3ms", "قِيلَ"}, }, }, { label = "ضَرَبَ ـِ (p.144، صحيح سالم)", root = "ضرب", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِضْرِبَا"}, {"imp_2fp", "اِضْرِبْنَ"}, {"imp_2fs", "اِضْرِبِي"}, {"imp_2mp", "اِضْرِبُوا"}, {"imp_2ms", "اِضْرِبْ"}, {"ind_1p", "نَضْرِبُ"}, {"ind_1s", "أَضْرِبُ"}, {"ind_2d", "تَضْرِبَانِ"}, {"ind_2fp", "تَضْرِبْنَ"}, {"ind_2fs", "تَضْرِبِينَ"}, {"ind_2mp", "تَضْرِبُونَ"}, {"ind_2ms", "تَضْرِبُ"}, {"ind_3fd", "تَضْرِبَانِ"}, {"ind_3fp", "يَضْرِبْنَ"}, {"ind_3fs", "تَضْرِبُ"}, {"ind_3md", "يَضْرِبَانِ"}, {"ind_3mp", "يَضْرِبُونَ"}, {"ind_3ms", "يَضْرِبُ"}, {"ind_pass_1p", "نُضْرَبُ"}, {"ind_pass_1s", "أُضْرَبُ"}, {"ind_pass_2d", "تُضْرَبَانِ"}, {"ind_pass_2fp", "تُضْرَبْنَ"}, {"ind_pass_2fs", "تُضْرَبِينَ"}, {"ind_pass_2mp", "تُضْرَبُونَ"}, {"ind_pass_2ms", "تُضْرَبُ"}, {"ind_pass_3fd", "تُضْرَبَانِ"}, {"ind_pass_3fp", "يُضْرَبْنَ"}, {"ind_pass_3fs", "تُضْرَبُ"}, {"ind_pass_3md", "يُضْرَبَانِ"}, {"ind_pass_3mp", "يُضْرَبُونَ"}, {"ind_pass_3ms", "يُضْرَبُ"}, {"past_1p", "ضَرَبْنَا"}, {"past_1s", "ضَرَبْتُ"}, {"past_2d", "ضَرَبْتُمَا"}, {"past_2fp", "ضَرَبْتُنَّ"}, {"past_2fs", "ضَرَبْتِ"}, {"past_2mp", "ضَرَبْتُمْ"}, {"past_2ms", "ضَرَبْتَ"}, {"past_3fd", "ضَرَبَتَا"}, {"past_3fp", "ضَرَبْنَ"}, {"past_3fs", "ضَرَبَتْ"}, {"past_3md", "ضَرَبَا"}, {"past_3mp", "ضَرَبُوا"}, {"past_3ms", "ضَرَبَ"}, {"past_pass_1p", "ضُرِبْنَا"}, {"past_pass_1s", "ضُرِبْتُ"}, {"past_pass_2d", "ضُرِبْتُمَا"}, {"past_pass_2fp", "ضُرِبْتُنَّ"}, {"past_pass_2fs", "ضُرِبْتِ"}, {"past_pass_2mp", "ضُرِبْتُمْ"}, {"past_pass_2ms", "ضُرِبْتَ"}, {"past_pass_3fd", "ضُرِبَتَا"}, {"past_pass_3fp", "ضُرِبْنَ"}, {"past_pass_3fs", "ضُرِبَتْ"}, {"past_pass_3md", "ضُرِبَا"}, {"past_pass_3mp", "ضُرِبُوا"}, {"past_pass_3ms", "ضُرِبَ"}, }, }, { label = "رَأَسَ ـِ (p.153، مهموز العين)", root = "رأس", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِرْئِسَا"}, {"imp_2fp", "اِرْئِسْنَ"}, {"imp_2fs", "اِرْئِسِي"}, {"imp_2mp", "اِرْئِسُوا"}, {"imp_2ms", "اِرْئِسْ"}, {"ind_1p", "نَرْئِسُ"}, {"ind_1s", "أَرْئِسُ"}, {"ind_2d", "تَرْئِسَانِ"}, {"ind_2fp", "تَرْئِسْنَ"}, {"ind_2fs", "تَرْئِسِينَ"}, {"ind_2mp", "تَرْئِسُونَ"}, {"ind_2ms", "تَرْئِسُ"}, {"ind_3fd", "تَرْئِسَانِ"}, {"ind_3fp", "يَرْئِسْنَ"}, {"ind_3fs", "تَرْئِسُ"}, {"ind_3md", "يَرْئِسَانِ"}, {"ind_3mp", "يَرْئِسُونَ"}, {"ind_3ms", "يَرْئِسُ"}, {"ind_pass_1p", "نُرْأَسُ"}, {"ind_pass_1s", "أُرْأَسُ"}, {"ind_pass_2d", "تُرْأَسَانِ"}, {"ind_pass_2fp", "تُرْأَسْنَ"}, {"ind_pass_2fs", "تُرْأَسِينَ"}, {"ind_pass_2mp", "تُرْأَسُونَ"}, {"ind_pass_2ms", "تُرْأَسُ"}, {"ind_pass_3fd", "تُرْأَسَانِ"}, {"ind_pass_3fp", "يُرْأَسْنَ"}, {"ind_pass_3fs", "تُرْأَسُ"}, {"ind_pass_3md", "يُرْأَسَانِ"}, {"ind_pass_3mp", "يُرْأَسُونَ"}, {"ind_pass_3ms", "يُرْأَسُ"}, {"past_1p", "رَأَسْنَا"}, {"past_1s", "رَأَسْتُ"}, {"past_2d", "رَأَسْتُمَا"}, {"past_2fp", "رَأَسْتُنَّ"}, {"past_2fs", "رَأَسْتِ"}, {"past_2mp", "رَأَسْتُمْ"}, {"past_2ms", "رَأَسْتَ"}, {"past_3fd", "رَأَسَتَا"}, {"past_3fp", "رَأَسْنَ"}, {"past_3fs", "رَأَسَتْ"}, {"past_3md", "رَأَسَا"}, {"past_3mp", "رَأَسُوا"}, {"past_3ms", "رَأَسَ"}, {"past_pass_1p", "رُئِسْنَا"}, {"past_pass_1s", "رُئِسْتُ"}, {"past_pass_2d", "رُئِسْتُمَا"}, {"past_pass_2fp", "رُئِسْتُنَّ"}, {"past_pass_2fs", "رُئِسْتِ"}, {"past_pass_2mp", "رُئِسْتُمْ"}, {"past_pass_2ms", "رُئِسْتَ"}, {"past_pass_3fd", "رُئِسَتَا"}, {"past_pass_3fp", "رُئِسْنَ"}, {"past_pass_3fs", "رُئِسَتْ"}, {"past_pass_3md", "رُئِسَا"}, {"past_pass_3mp", "رُئِسُوا"}, {"past_pass_3ms", "رُئِسَ"}, }, }, } i7l88gxtnqvyctat5nq54f9yt8dfatq وحدة:ar-verb/testcases/2 828 241791 1099193 2026-08-22T21:18:24Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099193 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 2 من 4. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/2") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_2() for _, entry in ipairs(data) do check(self, entry) end end return tests ru4c5vctj6fritmif01l57d6u0xnrh9 1099202 1099193 2026-08-22T21:44:43Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099202 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 2 من 5. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/2") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_2() for _, entry in ipairs(data) do check(self, entry) end end return tests opas1flljgyxwdt9k9ll4wxpvsf10j7 وحدة:ar-verb/testcases/بيانات/3 828 241792 1099194 2026-08-22T21:18:25Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099194 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 3 من 4. return { { label = "وَصَلَ ـِ (p.155، معتل الفاء مثال)", root = "وصل", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "صِلَا"}, {"imp_2fp", "صِلْنَ"}, {"imp_2fs", "صِلِي"}, {"imp_2mp", "صِلُوا"}, {"imp_2ms", "صِلْ"}, {"ind_1p", "نَصِلُ"}, {"ind_1s", "أَصِلُ"}, {"ind_2d", "تَصِلَانِ"}, {"ind_2fp", "تَصِلْنَ"}, {"ind_2fs", "تَصِلِينَ"}, {"ind_2mp", "تَصِلُونَ"}, {"ind_2ms", "تَصِلُ"}, {"ind_3fd", "تَصِلَانِ"}, {"ind_3fp", "يَصِلْنَ"}, {"ind_3fs", "تَصِلُ"}, {"ind_3md", "يَصِلَانِ"}, {"ind_3mp", "يَصِلُونَ"}, {"ind_3ms", "يَصِلُ"}, {"ind_pass_1p", "نُوصَلُ"}, {"ind_pass_1s", "أُوصَلُ"}, {"ind_pass_2d", "تُوصَلَانِ"}, {"ind_pass_2fp", "تُوصَلْنَ"}, {"ind_pass_2fs", "تُوصَلِينَ"}, {"ind_pass_2mp", "تُوصَلُونَ"}, {"ind_pass_2ms", "تُوصَلُ"}, {"ind_pass_3fd", "تُوصَلَانِ"}, {"ind_pass_3fp", "يُوصَلْنَ"}, {"ind_pass_3fs", "تُوصَلُ"}, {"ind_pass_3md", "يُوصَلَانِ"}, {"ind_pass_3mp", "يُوصَلُونَ"}, {"ind_pass_3ms", "يُوصَلُ"}, {"past_1p", "وَصَلْنَا"}, {"past_1s", "وَصَلْتُ"}, {"past_2d", "وَصَلْتُمَا"}, {"past_2fp", "وَصَلْتُنَّ"}, {"past_2fs", "وَصَلْتِ"}, {"past_2mp", "وَصَلْتُمْ"}, {"past_2ms", "وَصَلْتَ"}, {"past_3fd", "وَصَلَتَا"}, {"past_3fp", "وَصَلْنَ"}, {"past_3fs", "وَصَلَتْ"}, {"past_3md", "وَصَلَا"}, {"past_3mp", "وَصَلُوا"}, {"past_3ms", "وَصَلَ"}, {"past_pass_1p", "وُصِلْنَا"}, {"past_pass_1s", "وُصِلْتُ"}, {"past_pass_2d", "وُصِلْتُمَا"}, {"past_pass_2fp", "وُصِلْتُنَّ"}, {"past_pass_2fs", "وُصِلْتِ"}, {"past_pass_2mp", "وُصِلْتُمْ"}, {"past_pass_2ms", "وُصِلْتَ"}, {"past_pass_3fd", "وُصِلَتَا"}, {"past_pass_3fp", "وُصِلْنَ"}, {"past_pass_3fs", "وُصِلَتْ"}, {"past_pass_3md", "وُصِلَا"}, {"past_pass_3mp", "وُصِلُوا"}, {"past_pass_3ms", "وُصِلَ"}, }, }, { label = "رَمَى ـِ (p.161، ناقص يائي)", root = "رمي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِرْمِيَا"}, {"imp_2fp", "اِرْمِينَ"}, {"imp_2fs", "اِرْمِي"}, {"imp_2mp", "اِرْمُوا"}, {"imp_2ms", "اِرْمِ"}, {"ind_1p", "نَرْمِي"}, {"ind_1s", "أَرْمِي"}, {"ind_2d", "تَرْمِيَانِ"}, {"ind_2fp", "تَرْمِينَ"}, {"ind_2fs", "تَرْمِينَ"}, {"ind_2mp", "تَرْمُونَ"}, {"ind_2ms", "تَرْمِي"}, {"ind_3fd", "تَرْمِيَانِ"}, {"ind_3fp", "يَرْمِينَ"}, {"ind_3fs", "تَرْمِي"}, {"ind_3md", "يَرْمِيَانِ"}, {"ind_3mp", "يَرْمُونَ"}, {"ind_3ms", "يَرْمِي"}, {"ind_pass_1p", "نُرْمَى"}, {"ind_pass_1s", "أُرْمَى"}, {"ind_pass_2d", "تُرْمَيَانِ"}, {"ind_pass_2fp", "تُرْمَيْنَ"}, {"ind_pass_2fs", "تُرْمَيْنَ"}, {"ind_pass_2mp", "تُرْمَوْنَ"}, {"ind_pass_2ms", "تُرْمَى"}, {"ind_pass_3fd", "تُرْمَيَانِ"}, {"ind_pass_3fp", "يُرْمَيْنَ"}, {"ind_pass_3fs", "تُرْمَى"}, {"ind_pass_3md", "يُرْمَيَانِ"}, {"ind_pass_3mp", "يُرْمَوْنَ"}, {"ind_pass_3ms", "يُرْمَى"}, {"past_1p", "رَمَيْنَا"}, {"past_1s", "رَمَيْتُ"}, {"past_2d", "رَمَيْتُمَا"}, {"past_2fp", "رَمَيْتُنَّ"}, {"past_2fs", "رَمَيْتِ"}, {"past_2mp", "رَمَيْتُمْ"}, {"past_2ms", "رَمَيْتَ"}, {"past_3fd", "رَمَتَا"}, {"past_3fp", "رَمَيْنَ"}, {"past_3fs", "رَمَتْ"}, {"past_3md", "رَمَيَا"}, {"past_3mp", "رَمَوْا"}, {"past_3ms", "رَمَى"}, {"past_pass_1p", "رُمِينَا"}, {"past_pass_1s", "رُمِيتُ"}, {"past_pass_2d", "رُمِيتُمَا"}, {"past_pass_2fp", "رُمِيتُنَّ"}, {"past_pass_2fs", "رُمِيتِ"}, {"past_pass_2mp", "رُمِيتُمْ"}, {"past_pass_2ms", "رُمِيتَ"}, {"past_pass_3fd", "رُمِيَتَا"}, {"past_pass_3fp", "رُمِينَ"}, {"past_pass_3fs", "رُمِيَتْ"}, {"past_pass_3md", "رُمِيَا"}, {"past_pass_3mp", "رُمُوا"}, {"past_pass_3ms", "رُمِيَ"}, }, }, { label = "فَعَلَ ـَ (p.169، abstract paradigm)", root = "فعل", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِفْعَلَا"}, {"imp_2fp", "اِفْعَلْنَ"}, {"imp_2fs", "اِفْعَلِي"}, {"imp_2mp", "اِفْعَلُوا"}, {"imp_2ms", "اِفْعَلْ"}, {"ind_1p", "نَفْعَلُ"}, {"ind_1s", "أَفْعَلُ"}, {"ind_2d", "تَفْعَلَانِ"}, {"ind_2fp", "تَفْعَلْنَ"}, {"ind_2fs", "تَفْعَلِينَ"}, {"ind_2mp", "تَفْعَلُونَ"}, {"ind_2ms", "تَفْعَلُ"}, {"ind_3fd", "تَفْعَلَانِ"}, {"ind_3fp", "يَفْعَلْنَ"}, {"ind_3fs", "تَفْعَلُ"}, {"ind_3md", "يَفْعَلَانِ"}, {"ind_3mp", "يَفْعَلُونَ"}, {"ind_3ms", "يَفْعَلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "فَعَلْنَا"}, {"past_1s", "فَعَلْتُ"}, {"past_2d", "فَعَلْتُمَا"}, {"past_2fp", "فَعَلْتُنَّ"}, {"past_2fs", "فَعَلْتِ"}, {"past_2mp", "فَعَلْتُمْ"}, {"past_2ms", "فَعَلْتَ"}, {"past_3fd", "فَعَلَتَا"}, {"past_3fp", "فَعَلْنَ"}, {"past_3fs", "فَعَلَتْ"}, {"past_3md", "فَعَلَا"}, {"past_3mp", "فَعَلُوا"}, {"past_3ms", "فَعَلَ"}, {"past_pass_1p", "فُعِلْنَا"}, {"past_pass_1s", "فُعِلْتُ"}, {"past_pass_2d", "فُعِلْتُمَا"}, {"past_pass_2fp", "فُعِلْتُنَّ"}, {"past_pass_2fs", "فُعِلْتِ"}, {"past_pass_2mp", "فُعِلْتُمْ"}, {"past_pass_2ms", "فُعِلْتَ"}, {"past_pass_3fd", "فُعِلَتَا"}, {"past_pass_3fp", "فُعِلْنَ"}, {"past_pass_3fs", "فُعِلَتْ"}, {"past_pass_3md", "فُعِلَا"}, {"past_pass_3mp", "فُعِلُوا"}, {"past_pass_3ms", "فُعِلَ"}, }, }, { label = "عَضَّ ـَ (p.173، مضاعف)", root = "عضض", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "عَضَّا"}, {"imp_2fp", "اِعْضَضْنَ"}, {"imp_2fs", "عَضِّي"}, {"imp_2mp", "عَضُّوا"}, {"imp_2ms", "عَضَّ"}, {"ind_1p", "نَعَضُّ"}, {"ind_1s", "أَعَضُّ"}, {"ind_2d", "تَعَضَّانِ"}, {"ind_2fp", "تَعْضَضْنَ"}, {"ind_2fs", "تَعَضِّينَ"}, {"ind_2mp", "تَعَضُّونَ"}, {"ind_2ms", "تَعَضُّ"}, {"ind_3fd", "تَعَضَّانِ"}, {"ind_3fp", "يَعْضَضْنَ"}, {"ind_3fs", "تَعَضُّ"}, {"ind_3md", "يَعَضَّانِ"}, {"ind_3mp", "يَعَضُّونَ"}, {"ind_3ms", "يَعَضُّ"}, {"ind_pass_1p", "نُعَضُّ"}, {"ind_pass_1s", "أُعَضُّ"}, {"ind_pass_2d", "تُعَضَّانِ"}, {"ind_pass_2fp", "تُعْضَضْنَ"}, {"ind_pass_2fs", "تُعَضِّينَ"}, {"ind_pass_2mp", "تُعَضُّونَ"}, {"ind_pass_2ms", "تُعَضُّ"}, {"ind_pass_3fd", "تُعَضَّانِ"}, {"ind_pass_3fp", "يُعْضَضْنَ"}, {"ind_pass_3fs", "تُعَضُّ"}, {"ind_pass_3md", "يُعَضَّانِ"}, {"ind_pass_3mp", "يُعَضُّونَ"}, {"ind_pass_3ms", "يُعَضُّ"}, {"past_1p", "عَضَضْنَا"}, {"past_1s", "عَضَضْتُ"}, {"past_2d", "عَضَضْتُمَا"}, {"past_2fp", "عَضَضْتُنَّ"}, {"past_2fs", "عَضَضْتِ"}, {"past_2mp", "عَضَضْتُمْ"}, {"past_2ms", "عَضَضْتَ"}, {"past_3fd", "عَضَّتَا"}, {"past_3fp", "عَضَضْنَ"}, {"past_3fs", "عَضَّتْ"}, {"past_3md", "عَضَّا"}, {"past_3mp", "عَضُّوا"}, {"past_3ms", "عَضَّ"}, {"past_pass_1p", "عُضِضْنَا"}, {"past_pass_1s", "عُضِضْتُ"}, {"past_pass_2d", "عُضِضْتُمَا"}, {"past_pass_2fp", "عُضِضْتُنَّ"}, {"past_pass_2fs", "عُضِضْتِ"}, {"past_pass_2mp", "عُضِضْتُمْ"}, {"past_pass_2ms", "عُضِضْتَ"}, {"past_pass_3fd", "عُضَّتَا"}, {"past_pass_3fp", "عُضِضْنَ"}, {"past_pass_3fs", "عُضَّتْ"}, {"past_pass_3md", "عُضَّا"}, {"past_pass_3mp", "عُضُّوا"}, {"past_pass_3ms", "عُضَّ"}, }, }, { label = "أَلَهَ ـَ (p.175، مهموز الفاء)", root = "أله", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِئْلَهَا"}, {"imp_2fp", "اِئْلَهْنَ"}, {"imp_2fs", "اِئْلَهِي"}, {"imp_2mp", "اِئْلَهُوا"}, {"imp_2ms", "اِئْلَهْ"}, {"ind_1p", "نَأْلَهُ"}, {"ind_1s", "آلَهُ"}, {"ind_2d", "تَأْلَهَانِ"}, {"ind_2fp", "تَأْلَهْنَ"}, {"ind_2fs", "تَأْلَهِينَ"}, {"ind_2mp", "تَأْلَهُونَ"}, {"ind_2ms", "تَأْلَهُ"}, {"ind_3fd", "تَأْلَهَانِ"}, {"ind_3fp", "يَأْلَهْنَ"}, {"ind_3fs", "تَأْلَهُ"}, {"ind_3md", "يَأْلَهَانِ"}, {"ind_3mp", "يَأْلَهُونَ"}, {"ind_3ms", "يَأْلَهُ"}, {"ind_pass_1p", "نُؤْلَهُ"}, {"ind_pass_1s", "أُولَهُ"}, {"ind_pass_2d", "تُؤْلَهَانِ"}, {"ind_pass_2fp", "تُؤْلَهْنَ"}, {"ind_pass_2fs", "تُؤْلَهِينَ"}, {"ind_pass_2mp", "تُؤْلَهُونَ"}, {"ind_pass_2ms", "تُؤْلَهُ"}, {"ind_pass_3fd", "تُؤْلَهَانِ"}, {"ind_pass_3fp", "يُؤْلَهْنَ"}, {"ind_pass_3fs", "تُؤْلَهُ"}, {"ind_pass_3md", "يُؤْلَهَانِ"}, {"ind_pass_3mp", "يُؤْلَهُونَ"}, {"ind_pass_3ms", "يُؤْلَهُ"}, {"past_1p", "أَلَهْنَا"}, {"past_1s", "أَلَهْتُ"}, {"past_2d", "أَلَهْتُمَا"}, {"past_2fp", "أَلَهْتُنَّ"}, {"past_2fs", "أَلَهْتِ"}, {"past_2mp", "أَلَهْتُمْ"}, {"past_2ms", "أَلَهْتَ"}, {"past_3fd", "أَلَهَتَا"}, {"past_3fp", "أَلَهْنَ"}, {"past_3fs", "أَلَهَتْ"}, {"past_3md", "أَلَهَا"}, {"past_3mp", "أَلَهُوا"}, {"past_3ms", "أَلَهَ"}, {"past_pass_1p", "أُلِهْنَا"}, {"past_pass_1s", "أُلِهْتُ"}, {"past_pass_2d", "أُلِهْتُمَا"}, {"past_pass_2fp", "أُلِهْتُنَّ"}, {"past_pass_2fs", "أُلِهْتِ"}, {"past_pass_2mp", "أُلِهْتُمْ"}, {"past_pass_2ms", "أُلِهْتَ"}, {"past_pass_3fd", "أُلِهَتَا"}, {"past_pass_3fp", "أُلِهْنَ"}, {"past_pass_3fs", "أُلِهَتْ"}, {"past_pass_3md", "أُلِهَا"}, {"past_pass_3mp", "أُلِهُوا"}, {"past_pass_3ms", "أُلِهَ"}, }, }, { label = "باعَ ـِ (p.158، أجوف يائي)", root = "بيع", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "بِيعَا"}, {"imp_2fp", "بِعْنَ"}, {"imp_2fs", "بِيعِي"}, {"imp_2mp", "بِيعُوا"}, {"imp_2ms", "بِعْ"}, {"ind_1p", "نَبِيعُ"}, {"ind_1s", "أَبِيعُ"}, {"ind_2d", "تَبِيعَانِ"}, {"ind_2fp", "تَبِعْنَ"}, {"ind_2fs", "تَبِيعِينَ"}, {"ind_2mp", "تَبِيعُونَ"}, {"ind_2ms", "تَبِيعُ"}, {"ind_3fd", "تَبِيعَانِ"}, {"ind_3fp", "يَبِعْنَ"}, {"ind_3fs", "تَبِيعُ"}, {"ind_3md", "يَبِيعَانِ"}, {"ind_3mp", "يَبِيعُونَ"}, {"ind_3ms", "يَبِيعُ"}, {"ind_pass_1p", "نُبَاعُ"}, {"ind_pass_1s", "أُبَاعُ"}, {"ind_pass_2d", "تُبَاعَانِ"}, {"ind_pass_2fp", "تُبَعْنَ"}, {"ind_pass_2fs", "تُبَاعِينَ"}, {"ind_pass_2mp", "تُبَاعُونَ"}, {"ind_pass_2ms", "تُبَاعُ"}, {"ind_pass_3fd", "تُبَاعَانِ"}, {"ind_pass_3fp", "يُبَعْنَ"}, {"ind_pass_3fs", "تُبَاعُ"}, {"ind_pass_3md", "يُبَاعَانِ"}, {"ind_pass_3mp", "يُبَاعُونَ"}, {"ind_pass_3ms", "يُبَاعُ"}, {"past_1p", "بِعْنَا"}, {"past_1s", "بِعْتُ"}, {"past_2d", "بِعْتُمَا"}, {"past_2fp", "بِعْتُنَّ"}, {"past_2fs", "بِعْتِ"}, {"past_2mp", "بِعْتُمْ"}, {"past_2ms", "بِعْتَ"}, {"past_3fd", "بَاعَتَا"}, {"past_3fp", "بِعْنَ"}, {"past_3fs", "بَاعَتْ"}, {"past_3md", "بَاعَا"}, {"past_3mp", "بَاعُوا"}, {"past_3ms", "بَاعَ"}, {"past_pass_1p", "بُعْنَا"}, {"past_pass_1s", "بُعْتُ"}, {"past_pass_2d", "بُعْتُمَا"}, {"past_pass_2fp", "بُعْتُنَّ"}, {"past_pass_2fs", "بُعْتِ"}, {"past_pass_2mp", "بُعْتُمْ"}, {"past_pass_2ms", "بُعْتَ"}, {"past_pass_3fd", "بِيعَتَا"}, {"past_pass_3fp", "بُعْنَ"}, {"past_pass_3fs", "بِيعَتْ"}, {"past_pass_3md", "بِيعَا"}, {"past_pass_3mp", "بِيعُوا"}, {"past_pass_3ms", "بِيعَ"}, }, }, { label = "طَوَى ـِ (p.166، لفيف مقرون)", root = "طوي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِطْوِيَا"}, {"imp_2fp", "اِطْوِينَ"}, {"imp_2fs", "اِطْوِي"}, {"imp_2mp", "اِطْوُوا"}, {"imp_2ms", "اِطْوِ"}, {"ind_1p", "نَطْوِي"}, {"ind_1s", "أَطْوِي"}, {"ind_2d", "تَطْوِيَانِ"}, {"ind_2fp", "تَطْوِينَ"}, {"ind_2fs", "تَطْوِينَ"}, {"ind_2mp", "تَطْوُونَ"}, {"ind_2ms", "تَطْوِي"}, {"ind_3fd", "تَطْوِيَانِ"}, {"ind_3fp", "يَطْوِينَ"}, {"ind_3fs", "تَطْوِي"}, {"ind_3md", "يَطْوِيَانِ"}, {"ind_3mp", "يَطْوُونَ"}, {"ind_3ms", "يَطْوِي"}, {"ind_pass_1p", "نُطْوَى"}, {"ind_pass_1s", "أُطْوَى"}, {"ind_pass_2d", "تُطْوَيَانِ"}, {"ind_pass_2fp", "تُطْوَيْنَ"}, {"ind_pass_2fs", "تُطْوَيْنَ"}, {"ind_pass_2mp", "تُطْوَوْنَ"}, {"ind_pass_2ms", "تُطْوَى"}, {"ind_pass_3fd", "تُطْوَيَانِ"}, {"ind_pass_3fp", "يُطْوَيْنَ"}, {"ind_pass_3fs", "تُطْوَى"}, {"ind_pass_3md", "يُطْوَيَانِ"}, {"ind_pass_3mp", "يُطْوَوْنَ"}, {"ind_pass_3ms", "يُطْوَى"}, {"past_1p", "طَوَيْنَا"}, {"past_1s", "طَوَيْتُ"}, {"past_2d", "طَوَيْتُمَا"}, {"past_2fp", "طَوَيْتُنَّ"}, {"past_2fs", "طَوَيْتِ"}, {"past_2mp", "طَوَيْتُمْ"}, {"past_2ms", "طَوَيْتَ"}, {"past_3fd", "طَوَتَا"}, {"past_3fp", "طَوَيْنَ"}, {"past_3fs", "طَوَتْ"}, {"past_3md", "طَوَيَا"}, {"past_3mp", "طَوَوْا"}, {"past_3ms", "طَوَى"}, {"past_pass_1p", "طُوِينَا"}, {"past_pass_1s", "طُوِيتُ"}, {"past_pass_2d", "طُوِيتُمَا"}, {"past_pass_2fp", "طُوِيتُنَّ"}, {"past_pass_2fs", "طُوِيتِ"}, {"past_pass_2mp", "طُوِيتُمْ"}, {"past_pass_2ms", "طُوِيتَ"}, {"past_pass_3fd", "طُوِيَتَا"}, {"past_pass_3fp", "طُوِينَ"}, {"past_pass_3fs", "طُوِيَتْ"}, {"past_pass_3md", "طُوِيَا"}, {"past_pass_3mp", "طُوُوا"}, {"past_pass_3ms", "طُوِيَ"}, }, }, { label = "سَأَلَ ـَ (p.176، مهموز العين)", root = "سأل", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِسْأَلَا"}, {"imp_2fp", "اِسْأَلْنَ"}, {"imp_2fs", "اِسْأَلِي"}, {"imp_2mp", "اِسْأَلُوا"}, {"imp_2ms", "اِسْأَلْ"}, {"ind_1p", "نَسْأَلُ"}, {"ind_1s", "أَسْأَلُ"}, {"ind_2d", "تَسْأَلَانِ"}, {"ind_2fp", "تَسْأَلْنَ"}, {"ind_2fs", "تَسْأَلِينَ"}, {"ind_2mp", "تَسْأَلُونَ"}, {"ind_2ms", "تَسْأَلُ"}, {"ind_3fd", "تَسْأَلَانِ"}, {"ind_3fp", "يَسْأَلْنَ"}, {"ind_3fs", "تَسْأَلُ"}, {"ind_3md", "يَسْأَلَانِ"}, {"ind_3mp", "يَسْأَلُونَ"}, {"ind_3ms", "يَسْأَلُ"}, {"ind_pass_1p", "نُسْأَلُ"}, {"ind_pass_1s", "أُسْأَلُ"}, {"ind_pass_2d", "تُسْأَلَانِ"}, {"ind_pass_2fp", "تُسْأَلْنَ"}, {"ind_pass_2fs", "تُسْأَلِينَ"}, {"ind_pass_2mp", "تُسْأَلُونَ"}, {"ind_pass_2ms", "تُسْأَلُ"}, {"ind_pass_3fd", "تُسْأَلَانِ"}, {"ind_pass_3fp", "يُسْأَلْنَ"}, {"ind_pass_3fs", "تُسْأَلُ"}, {"ind_pass_3md", "يُسْأَلَانِ"}, {"ind_pass_3mp", "يُسْأَلُونَ"}, {"ind_pass_3ms", "يُسْأَلُ"}, {"past_1p", "سَأَلْنَا"}, {"past_1s", "سَأَلْتُ"}, {"past_2d", "سَأَلْتُمَا"}, {"past_2fp", "سَأَلْتُنَّ"}, {"past_2fs", "سَأَلْتِ"}, {"past_2mp", "سَأَلْتُمْ"}, {"past_2ms", "سَأَلْتَ"}, {"past_3fd", "سَأَلَتَا"}, {"past_3fp", "سَأَلْنَ"}, {"past_3fs", "سَأَلَتْ"}, {"past_3md", "سَأَلَا"}, {"past_3mp", "سَأَلُوا"}, {"past_3ms", "سَأَلَ"}, {"past_pass_1p", "سُئِلْنَا"}, {"past_pass_1s", "سُئِلْتُ"}, {"past_pass_2d", "سُئِلْتُمَا"}, {"past_pass_2fp", "سُئِلْتُنَّ"}, {"past_pass_2fs", "سُئِلْتِ"}, {"past_pass_2mp", "سُئِلْتُمْ"}, {"past_pass_2ms", "سُئِلْتَ"}, {"past_pass_3fd", "سُئِلَتَا"}, {"past_pass_3fp", "سُئِلْنَ"}, {"past_pass_3fs", "سُئِلَتْ"}, {"past_pass_3md", "سُئِلَا"}, {"past_pass_3mp", "سُئِلُوا"}, {"past_pass_3ms", "سُئِلَ"}, }, }, { label = "باتَ ـَ (p.183، أجوف يائي)", root = "بيت", wazn = "فعَل يفعَل", forms = { {"imp_2d", "بَاتَا"}, {"imp_2fp", "بَتْنَ"}, {"imp_2fs", "بَاتِي"}, {"imp_2mp", "بَاتُوا"}, {"imp_2ms", "بَتْ"}, {"ind_1p", "نَبَاتُ"}, {"ind_1s", "أَبَاتُ"}, {"ind_2d", "تَبَاتَانِ"}, {"ind_2fp", "تَبَتْنَ"}, {"ind_2fs", "تَبَاتِينَ"}, {"ind_2mp", "تَبَاتُونَ"}, {"ind_2ms", "تَبَاتُ"}, {"ind_3fd", "تَبَاتَانِ"}, {"ind_3fp", "يَبَتْنَ"}, {"ind_3fs", "تَبَاتُ"}, {"ind_3md", "يَبَاتَانِ"}, {"ind_3mp", "يَبَاتُونَ"}, {"ind_3ms", "يَبَاتُ"}, {"past_1p", "بِتْنَا"}, {"past_1s", "بِتُّ"}, {"past_2d", "بِتُّمَا"}, {"past_2fp", "بِتُّنَّ"}, {"past_2fs", "بِتِّ"}, {"past_2mp", "بِتُّمْ"}, {"past_2ms", "بِتَّ"}, {"past_3fd", "بَاتَتَا"}, {"past_3fp", "بِتْنَ"}, {"past_3fs", "بَاتَتْ"}, {"past_3md", "بَاتَا"}, {"past_3mp", "بَاتُوا"}, {"past_3ms", "بَاتَ"}, }, }, { label = "سَعَى ـَ (p.186، ناقص يائي)", root = "سعي", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِسْعَيَا"}, {"imp_2fp", "اِسْعَيْنَ"}, {"imp_2fs", "اِسْعَيْ"}, {"imp_2mp", "اِسْعَوْا"}, {"imp_2ms", "اِسْعَ"}, {"ind_1p", "نَسْعَى"}, {"ind_1s", "أَسْعَى"}, {"ind_2d", "تَسْعَيَانِ"}, {"ind_2fp", "تَسْعَيْنَ"}, {"ind_2fs", "تَسْعَيْنَ"}, {"ind_2mp", "تَسْعَوْنَ"}, {"ind_2ms", "تَسْعَى"}, {"ind_3fd", "تَسْعَيَانِ"}, {"ind_3fp", "يَسْعَيْنَ"}, {"ind_3fs", "تَسْعَى"}, {"ind_3md", "يَسْعَيَانِ"}, {"ind_3mp", "يَسْعَوْنَ"}, {"ind_3ms", "يَسْعَى"}, {"ind_pass_1p", "نُسْعَى"}, {"ind_pass_1s", "أُسْعَى"}, {"ind_pass_2d", "تُسْعَيَانِ"}, {"ind_pass_2fp", "تُسْعَيْنَ"}, {"ind_pass_2fs", "تُسْعَيْنَ"}, {"ind_pass_2mp", "تُسْعَوْنَ"}, {"ind_pass_2ms", "تُسْعَى"}, {"ind_pass_3fd", "تُسْعَيَانِ"}, {"ind_pass_3fp", "يُسْعَيْنَ"}, {"ind_pass_3fs", "تُسْعَى"}, {"ind_pass_3md", "يُسْعَيَانِ"}, {"ind_pass_3mp", "يُسْعَوْنَ"}, {"ind_pass_3ms", "يُسْعَى"}, {"past_1p", "سَعَيْنَا"}, {"past_1s", "سَعَيْتُ"}, {"past_2d", "سَعَيْتُمَا"}, {"past_2fp", "سَعَيْتُنَّ"}, {"past_2fs", "سَعَيْتِ"}, {"past_2mp", "سَعَيْتُمْ"}, {"past_2ms", "سَعَيْتَ"}, {"past_3fd", "سَعَتَا"}, {"past_3fp", "سَعَيْنَ"}, {"past_3fs", "سَعَتْ"}, {"past_3md", "سَعَيَا"}, {"past_3mp", "سَعَوْا"}, {"past_3ms", "سَعَى"}, {"past_pass_1p", "سُعِينَا"}, {"past_pass_1s", "سُعِيتُ"}, {"past_pass_2d", "سُعِيتُمَا"}, {"past_pass_2fp", "سُعِيتُنَّ"}, {"past_pass_2fs", "سُعِيتِ"}, {"past_pass_2mp", "سُعِيتُمْ"}, {"past_pass_2ms", "سُعِيتَ"}, {"past_pass_3fd", "سُعِيَتَا"}, {"past_pass_3fp", "سُعِينَ"}, {"past_pass_3fs", "سُعِيَتْ"}, {"past_pass_3md", "سُعِيَا"}, {"past_pass_3mp", "سُعُوا"}, {"past_pass_3ms", "سُعِيَ"}, }, }, { label = "كَرُمَ ـُ (p.189، صحيح سالم)", root = "كرم", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُكْرُمَا"}, {"imp_2fp", "اُكْرُمْنَ"}, {"imp_2fs", "اُكْرُمِي"}, {"imp_2mp", "اُكْرُمُوا"}, {"imp_2ms", "اُكْرُمْ"}, {"ind_1p", "نَكْرُمُ"}, {"ind_1s", "أَكْرُمُ"}, {"ind_2d", "تَكْرُمَانِ"}, {"ind_2fp", "تَكْرُمْنَ"}, {"ind_2fs", "تَكْرُمِينَ"}, {"ind_2mp", "تَكْرُمُونَ"}, {"ind_2ms", "تَكْرُمُ"}, {"ind_3fd", "تَكْرُمَانِ"}, {"ind_3fp", "يَكْرُمْنَ"}, {"ind_3fs", "تَكْرُمُ"}, {"ind_3md", "يَكْرُمَانِ"}, {"ind_3mp", "يَكْرُمُونَ"}, {"ind_3ms", "يَكْرُمُ"}, {"past_1p", "كَرُمْنَا"}, {"past_1s", "كَرُمْتُ"}, {"past_2d", "كَرُمْتُمَا"}, {"past_2fp", "كَرُمْتُنَّ"}, {"past_2fs", "كَرُمْتِ"}, {"past_2mp", "كَرُمْتُمْ"}, {"past_2ms", "كَرُمْتَ"}, {"past_3fd", "كَرُمَتَا"}, {"past_3fp", "كَرُمْنَ"}, {"past_3fs", "كَرُمَتْ"}, {"past_3md", "كَرُمَا"}, {"past_3mp", "كَرُمُوا"}, {"past_3ms", "كَرُمَ"}, }, }, { label = "هَمَّ ـُ (p.192، مضاعف)", root = "همم", wazn = "فعَل يفعُل", forms = { {"imp_2d", "هُمَّا"}, {"imp_2fp", "اُهْمُمْنَ"}, {"imp_2fs", "هُمِّي"}, {"imp_2mp", "هُمُّوا"}, {"imp_2ms", "هُمَّ"}, {"ind_1p", "نَهُمُّ"}, {"ind_1s", "أَهُمُّ"}, {"ind_2d", "تَهُمَّانِ"}, {"ind_2fp", "تَهْمُمْنَ"}, {"ind_2fs", "تَهُمِّينَ"}, {"ind_2mp", "تَهُمُّونَ"}, {"ind_2ms", "تَهُمُّ"}, {"ind_3fd", "تَهُمَّانِ"}, {"ind_3fp", "يَهْمُمْنَ"}, {"ind_3fs", "تَهُمُّ"}, {"ind_3md", "يَهُمَّانِ"}, {"ind_3mp", "يَهُمُّونَ"}, {"ind_3ms", "يَهُمُّ"}, {"past_1p", "هَمُمْنَا"}, {"past_1s", "هَمُمْتُ"}, {"past_2d", "هَمُمْتُمَا"}, {"past_2fp", "هَمُمْتُنَّ"}, {"past_2fs", "هَمُمْتِ"}, {"past_2mp", "هَمُمْتُمْ"}, {"past_2ms", "هَمُمْتَ"}, {"past_3fd", "هَمَّتَا"}, {"past_3fp", "هَمُمْنَ"}, {"past_3fs", "هَمَّتْ"}, {"past_3md", "هَمَّا"}, {"past_3mp", "هَمُّوا"}, {"past_3ms", "هَمَّ"}, }, }, { label = "أَصُلَ ـُ (p.195، مهموز الفاء)", root = "أصل", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُؤْصُلَا"}, {"imp_2fp", "اُؤْصُلْنَ"}, {"imp_2fs", "اُؤْصُلِي"}, {"imp_2mp", "اُؤْصُلُوا"}, {"imp_2ms", "اُؤْصُلْ"}, {"ind_1p", "نَأْصُلُ"}, {"ind_1s", "آصُلُ"}, {"ind_2d", "تَأْصُلَانِ"}, {"ind_2fp", "تَأْصُلْنَ"}, {"ind_2fs", "تَأْصُلِينَ"}, {"ind_2mp", "تَأْصُلُونَ"}, {"ind_2ms", "تَأْصُلُ"}, {"ind_3fd", "تَأْصُلَانِ"}, {"ind_3fp", "يَأْصُلْنَ"}, {"ind_3fs", "تَأْصُلُ"}, {"ind_3md", "يَأْصُلَانِ"}, {"ind_3mp", "يَأْصُلُونَ"}, {"ind_3ms", "يَأْصُلُ"}, {"past_1p", "أَصُلْنَا"}, {"past_1s", "أَصُلْتُ"}, {"past_2d", "أَصُلْتُمَا"}, {"past_2fp", "أَصُلْتُنَّ"}, {"past_2fs", "أَصُلْتِ"}, {"past_2mp", "أَصُلْتُمْ"}, {"past_2ms", "أَصُلْتَ"}, {"past_3fd", "أَصُلَتَا"}, {"past_3fp", "أَصُلْنَ"}, {"past_3fs", "أَصُلَتْ"}, {"past_3md", "أَصُلَا"}, {"past_3mp", "أَصُلُوا"}, {"past_3ms", "أَصُلَ"}, }, }, { label = "جَرُؤَ ـُ (p.199، مهموز اللام)", root = "جرأ", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُجْرُؤَا"}, {"imp_2fp", "اُجْرُؤْنَ"}, {"imp_2fs", "اُجْرُئِي"}, {"imp_2mp", "اُجْرُؤُوا"}, {"imp_2ms", "اُجْرُؤْ"}, {"ind_1p", "نَجْرُؤُ"}, {"ind_1s", "أَجْرُؤُ"}, {"ind_2d", "تَجْرُؤَانِ"}, {"ind_2fp", "تَجْرُؤْنَ"}, {"ind_2fs", "تَجْرُئِينَ"}, {"ind_2mp", "تَجْرُؤُونَ"}, {"ind_2ms", "تَجْرُؤُ"}, {"ind_3fd", "تَجْرُؤَانِ"}, {"ind_3fp", "يَجْرُؤْنَ"}, {"ind_3fs", "تَجْرُؤُ"}, {"ind_3md", "يَجْرُؤَانِ"}, {"ind_3mp", "يَجْرُؤُونَ"}, {"ind_3ms", "يَجْرُؤُ"}, {"past_1p", "جَرُؤْنَا"}, {"past_1s", "جَرُؤْتُ"}, {"past_2d", "جَرُؤْتُمَا"}, {"past_2fp", "جَرُؤْتُنَّ"}, {"past_2fs", "جَرُؤْتِ"}, {"past_2mp", "جَرُؤْتُمْ"}, {"past_2ms", "جَرُؤْتَ"}, {"past_3fd", "جَرُؤَتَا"}, {"past_3fp", "جَرُؤْنَ"}, {"past_3fs", "جَرُؤَتْ"}, {"past_3md", "جَرُؤَا"}, {"past_3mp", "جَرُؤُوا"}, {"past_3ms", "جَرُؤَ"}, }, }, { label = "يَسُرَ ـُ (p.201، معتل الفاء مثال)", root = "يسر", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُوسُرَا"}, {"imp_2fp", "اُوسُرْنَ"}, {"imp_2fs", "اُوسُرِي"}, {"imp_2mp", "اُوسُرُوا"}, {"imp_2ms", "اُوسُرْ"}, {"ind_1p", "نَيْسُرُ"}, {"ind_1s", "أَيْسُرُ"}, {"ind_2d", "تَيْسُرَانِ"}, {"ind_2fp", "تَيْسُرْنَ"}, {"ind_2fs", "تَيْسُرِينَ"}, {"ind_2mp", "تَيْسُرُونَ"}, {"ind_2ms", "تَيْسُرُ"}, {"ind_3fd", "تَيْسُرَانِ"}, {"ind_3fp", "يَيْسُرْنَ"}, {"ind_3fs", "تَيْسُرُ"}, {"ind_3md", "يَيْسُرَانِ"}, {"ind_3mp", "يَيْسُرُونَ"}, {"ind_3ms", "يَيْسُرُ"}, {"past_1p", "يَسُرْنَا"}, {"past_1s", "يَسُرْتُ"}, {"past_2d", "يَسُرْتُمَا"}, {"past_2fp", "يَسُرْتُنَّ"}, {"past_2fs", "يَسُرْتِ"}, {"past_2mp", "يَسُرْتُمْ"}, {"past_2ms", "يَسُرْتَ"}, {"past_3fd", "يَسُرَتَا"}, {"past_3fp", "يَسُرْنَ"}, {"past_3fs", "يَسُرَتْ"}, {"past_3md", "يَسُرَا"}, {"past_3mp", "يَسُرُوا"}, {"past_3ms", "يَسُرَ"}, }, }, } 6bskia29o7zxgjftcc0oppnes8fuqrg 1099203 1099194 2026-08-22T21:44:44Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099203 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 3 من 5. return { { label = "وَصَلَ ـِ (p.155، معتل الفاء مثال)", root = "وصل", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "صِلَا"}, {"imp_2fp", "صِلْنَ"}, {"imp_2fs", "صِلِي"}, {"imp_2mp", "صِلُوا"}, {"imp_2ms", "صِلْ"}, {"ind_1p", "نَصِلُ"}, {"ind_1s", "أَصِلُ"}, {"ind_2d", "تَصِلَانِ"}, {"ind_2fp", "تَصِلْنَ"}, {"ind_2fs", "تَصِلِينَ"}, {"ind_2mp", "تَصِلُونَ"}, {"ind_2ms", "تَصِلُ"}, {"ind_3fd", "تَصِلَانِ"}, {"ind_3fp", "يَصِلْنَ"}, {"ind_3fs", "تَصِلُ"}, {"ind_3md", "يَصِلَانِ"}, {"ind_3mp", "يَصِلُونَ"}, {"ind_3ms", "يَصِلُ"}, {"ind_pass_1p", "نُوصَلُ"}, {"ind_pass_1s", "أُوصَلُ"}, {"ind_pass_2d", "تُوصَلَانِ"}, {"ind_pass_2fp", "تُوصَلْنَ"}, {"ind_pass_2fs", "تُوصَلِينَ"}, {"ind_pass_2mp", "تُوصَلُونَ"}, {"ind_pass_2ms", "تُوصَلُ"}, {"ind_pass_3fd", "تُوصَلَانِ"}, {"ind_pass_3fp", "يُوصَلْنَ"}, {"ind_pass_3fs", "تُوصَلُ"}, {"ind_pass_3md", "يُوصَلَانِ"}, {"ind_pass_3mp", "يُوصَلُونَ"}, {"ind_pass_3ms", "يُوصَلُ"}, {"past_1p", "وَصَلْنَا"}, {"past_1s", "وَصَلْتُ"}, {"past_2d", "وَصَلْتُمَا"}, {"past_2fp", "وَصَلْتُنَّ"}, {"past_2fs", "وَصَلْتِ"}, {"past_2mp", "وَصَلْتُمْ"}, {"past_2ms", "وَصَلْتَ"}, {"past_3fd", "وَصَلَتَا"}, {"past_3fp", "وَصَلْنَ"}, {"past_3fs", "وَصَلَتْ"}, {"past_3md", "وَصَلَا"}, {"past_3mp", "وَصَلُوا"}, {"past_3ms", "وَصَلَ"}, {"past_pass_1p", "وُصِلْنَا"}, {"past_pass_1s", "وُصِلْتُ"}, {"past_pass_2d", "وُصِلْتُمَا"}, {"past_pass_2fp", "وُصِلْتُنَّ"}, {"past_pass_2fs", "وُصِلْتِ"}, {"past_pass_2mp", "وُصِلْتُمْ"}, {"past_pass_2ms", "وُصِلْتَ"}, {"past_pass_3fd", "وُصِلَتَا"}, {"past_pass_3fp", "وُصِلْنَ"}, {"past_pass_3fs", "وُصِلَتْ"}, {"past_pass_3md", "وُصِلَا"}, {"past_pass_3mp", "وُصِلُوا"}, {"past_pass_3ms", "وُصِلَ"}, }, }, { label = "رَمَى ـِ (p.161، ناقص يائي)", root = "رمي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِرْمِيَا"}, {"imp_2fp", "اِرْمِينَ"}, {"imp_2fs", "اِرْمِي"}, {"imp_2mp", "اِرْمُوا"}, {"imp_2ms", "اِرْمِ"}, {"ind_1p", "نَرْمِي"}, {"ind_1s", "أَرْمِي"}, {"ind_2d", "تَرْمِيَانِ"}, {"ind_2fp", "تَرْمِينَ"}, {"ind_2fs", "تَرْمِينَ"}, {"ind_2mp", "تَرْمُونَ"}, {"ind_2ms", "تَرْمِي"}, {"ind_3fd", "تَرْمِيَانِ"}, {"ind_3fp", "يَرْمِينَ"}, {"ind_3fs", "تَرْمِي"}, {"ind_3md", "يَرْمِيَانِ"}, {"ind_3mp", "يَرْمُونَ"}, {"ind_3ms", "يَرْمِي"}, {"ind_pass_1p", "نُرْمَى"}, {"ind_pass_1s", "أُرْمَى"}, {"ind_pass_2d", "تُرْمَيَانِ"}, {"ind_pass_2fp", "تُرْمَيْنَ"}, {"ind_pass_2fs", "تُرْمَيْنَ"}, {"ind_pass_2mp", "تُرْمَوْنَ"}, {"ind_pass_2ms", "تُرْمَى"}, {"ind_pass_3fd", "تُرْمَيَانِ"}, {"ind_pass_3fp", "يُرْمَيْنَ"}, {"ind_pass_3fs", "تُرْمَى"}, {"ind_pass_3md", "يُرْمَيَانِ"}, {"ind_pass_3mp", "يُرْمَوْنَ"}, {"ind_pass_3ms", "يُرْمَى"}, {"past_1p", "رَمَيْنَا"}, {"past_1s", "رَمَيْتُ"}, {"past_2d", "رَمَيْتُمَا"}, {"past_2fp", "رَمَيْتُنَّ"}, {"past_2fs", "رَمَيْتِ"}, {"past_2mp", "رَمَيْتُمْ"}, {"past_2ms", "رَمَيْتَ"}, {"past_3fd", "رَمَتَا"}, {"past_3fp", "رَمَيْنَ"}, {"past_3fs", "رَمَتْ"}, {"past_3md", "رَمَيَا"}, {"past_3mp", "رَمَوْا"}, {"past_3ms", "رَمَى"}, {"past_pass_1p", "رُمِينَا"}, {"past_pass_1s", "رُمِيتُ"}, {"past_pass_2d", "رُمِيتُمَا"}, {"past_pass_2fp", "رُمِيتُنَّ"}, {"past_pass_2fs", "رُمِيتِ"}, {"past_pass_2mp", "رُمِيتُمْ"}, {"past_pass_2ms", "رُمِيتَ"}, {"past_pass_3fd", "رُمِيَتَا"}, {"past_pass_3fp", "رُمِينَ"}, {"past_pass_3fs", "رُمِيَتْ"}, {"past_pass_3md", "رُمِيَا"}, {"past_pass_3mp", "رُمُوا"}, {"past_pass_3ms", "رُمِيَ"}, }, }, { label = "فَعَلَ ـَ (p.169، abstract paradigm)", root = "فعل", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِفْعَلَا"}, {"imp_2fp", "اِفْعَلْنَ"}, {"imp_2fs", "اِفْعَلِي"}, {"imp_2mp", "اِفْعَلُوا"}, {"imp_2ms", "اِفْعَلْ"}, {"ind_1p", "نَفْعَلُ"}, {"ind_1s", "أَفْعَلُ"}, {"ind_2d", "تَفْعَلَانِ"}, {"ind_2fp", "تَفْعَلْنَ"}, {"ind_2fs", "تَفْعَلِينَ"}, {"ind_2mp", "تَفْعَلُونَ"}, {"ind_2ms", "تَفْعَلُ"}, {"ind_3fd", "تَفْعَلَانِ"}, {"ind_3fp", "يَفْعَلْنَ"}, {"ind_3fs", "تَفْعَلُ"}, {"ind_3md", "يَفْعَلَانِ"}, {"ind_3mp", "يَفْعَلُونَ"}, {"ind_3ms", "يَفْعَلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "فَعَلْنَا"}, {"past_1s", "فَعَلْتُ"}, {"past_2d", "فَعَلْتُمَا"}, {"past_2fp", "فَعَلْتُنَّ"}, {"past_2fs", "فَعَلْتِ"}, {"past_2mp", "فَعَلْتُمْ"}, {"past_2ms", "فَعَلْتَ"}, {"past_3fd", "فَعَلَتَا"}, {"past_3fp", "فَعَلْنَ"}, {"past_3fs", "فَعَلَتْ"}, {"past_3md", "فَعَلَا"}, {"past_3mp", "فَعَلُوا"}, {"past_3ms", "فَعَلَ"}, {"past_pass_1p", "فُعِلْنَا"}, {"past_pass_1s", "فُعِلْتُ"}, {"past_pass_2d", "فُعِلْتُمَا"}, {"past_pass_2fp", "فُعِلْتُنَّ"}, {"past_pass_2fs", "فُعِلْتِ"}, {"past_pass_2mp", "فُعِلْتُمْ"}, {"past_pass_2ms", "فُعِلْتَ"}, {"past_pass_3fd", "فُعِلَتَا"}, {"past_pass_3fp", "فُعِلْنَ"}, {"past_pass_3fs", "فُعِلَتْ"}, {"past_pass_3md", "فُعِلَا"}, {"past_pass_3mp", "فُعِلُوا"}, {"past_pass_3ms", "فُعِلَ"}, }, }, { label = "عَضَّ ـَ (p.173، مضاعف)", root = "عضض", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "عَضَّا"}, {"imp_2fp", "اِعْضَضْنَ"}, {"imp_2fs", "عَضِّي"}, {"imp_2mp", "عَضُّوا"}, {"imp_2ms", "عَضَّ"}, {"ind_1p", "نَعَضُّ"}, {"ind_1s", "أَعَضُّ"}, {"ind_2d", "تَعَضَّانِ"}, {"ind_2fp", "تَعْضَضْنَ"}, {"ind_2fs", "تَعَضِّينَ"}, {"ind_2mp", "تَعَضُّونَ"}, {"ind_2ms", "تَعَضُّ"}, {"ind_3fd", "تَعَضَّانِ"}, {"ind_3fp", "يَعْضَضْنَ"}, {"ind_3fs", "تَعَضُّ"}, {"ind_3md", "يَعَضَّانِ"}, {"ind_3mp", "يَعَضُّونَ"}, {"ind_3ms", "يَعَضُّ"}, {"ind_pass_1p", "نُعَضُّ"}, {"ind_pass_1s", "أُعَضُّ"}, {"ind_pass_2d", "تُعَضَّانِ"}, {"ind_pass_2fp", "تُعْضَضْنَ"}, {"ind_pass_2fs", "تُعَضِّينَ"}, {"ind_pass_2mp", "تُعَضُّونَ"}, {"ind_pass_2ms", "تُعَضُّ"}, {"ind_pass_3fd", "تُعَضَّانِ"}, {"ind_pass_3fp", "يُعْضَضْنَ"}, {"ind_pass_3fs", "تُعَضُّ"}, {"ind_pass_3md", "يُعَضَّانِ"}, {"ind_pass_3mp", "يُعَضُّونَ"}, {"ind_pass_3ms", "يُعَضُّ"}, {"past_1p", "عَضَضْنَا"}, {"past_1s", "عَضَضْتُ"}, {"past_2d", "عَضَضْتُمَا"}, {"past_2fp", "عَضَضْتُنَّ"}, {"past_2fs", "عَضَضْتِ"}, {"past_2mp", "عَضَضْتُمْ"}, {"past_2ms", "عَضَضْتَ"}, {"past_3fd", "عَضَّتَا"}, {"past_3fp", "عَضَضْنَ"}, {"past_3fs", "عَضَّتْ"}, {"past_3md", "عَضَّا"}, {"past_3mp", "عَضُّوا"}, {"past_3ms", "عَضَّ"}, {"past_pass_1p", "عُضِضْنَا"}, {"past_pass_1s", "عُضِضْتُ"}, {"past_pass_2d", "عُضِضْتُمَا"}, {"past_pass_2fp", "عُضِضْتُنَّ"}, {"past_pass_2fs", "عُضِضْتِ"}, {"past_pass_2mp", "عُضِضْتُمْ"}, {"past_pass_2ms", "عُضِضْتَ"}, {"past_pass_3fd", "عُضَّتَا"}, {"past_pass_3fp", "عُضِضْنَ"}, {"past_pass_3fs", "عُضَّتْ"}, {"past_pass_3md", "عُضَّا"}, {"past_pass_3mp", "عُضُّوا"}, {"past_pass_3ms", "عُضَّ"}, }, }, { label = "أَلَهَ ـَ (p.175، مهموز الفاء)", root = "أله", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِئْلَهَا"}, {"imp_2fp", "اِئْلَهْنَ"}, {"imp_2fs", "اِئْلَهِي"}, {"imp_2mp", "اِئْلَهُوا"}, {"imp_2ms", "اِئْلَهْ"}, {"ind_1p", "نَأْلَهُ"}, {"ind_1s", "آلَهُ"}, {"ind_2d", "تَأْلَهَانِ"}, {"ind_2fp", "تَأْلَهْنَ"}, {"ind_2fs", "تَأْلَهِينَ"}, {"ind_2mp", "تَأْلَهُونَ"}, {"ind_2ms", "تَأْلَهُ"}, {"ind_3fd", "تَأْلَهَانِ"}, {"ind_3fp", "يَأْلَهْنَ"}, {"ind_3fs", "تَأْلَهُ"}, {"ind_3md", "يَأْلَهَانِ"}, {"ind_3mp", "يَأْلَهُونَ"}, {"ind_3ms", "يَأْلَهُ"}, {"ind_pass_1p", "نُؤْلَهُ"}, {"ind_pass_1s", "أُولَهُ"}, {"ind_pass_2d", "تُؤْلَهَانِ"}, {"ind_pass_2fp", "تُؤْلَهْنَ"}, {"ind_pass_2fs", "تُؤْلَهِينَ"}, {"ind_pass_2mp", "تُؤْلَهُونَ"}, {"ind_pass_2ms", "تُؤْلَهُ"}, {"ind_pass_3fd", "تُؤْلَهَانِ"}, {"ind_pass_3fp", "يُؤْلَهْنَ"}, {"ind_pass_3fs", "تُؤْلَهُ"}, {"ind_pass_3md", "يُؤْلَهَانِ"}, {"ind_pass_3mp", "يُؤْلَهُونَ"}, {"ind_pass_3ms", "يُؤْلَهُ"}, {"past_1p", "أَلَهْنَا"}, {"past_1s", "أَلَهْتُ"}, {"past_2d", "أَلَهْتُمَا"}, {"past_2fp", "أَلَهْتُنَّ"}, {"past_2fs", "أَلَهْتِ"}, {"past_2mp", "أَلَهْتُمْ"}, {"past_2ms", "أَلَهْتَ"}, {"past_3fd", "أَلَهَتَا"}, {"past_3fp", "أَلَهْنَ"}, {"past_3fs", "أَلَهَتْ"}, {"past_3md", "أَلَهَا"}, {"past_3mp", "أَلَهُوا"}, {"past_3ms", "أَلَهَ"}, {"past_pass_1p", "أُلِهْنَا"}, {"past_pass_1s", "أُلِهْتُ"}, {"past_pass_2d", "أُلِهْتُمَا"}, {"past_pass_2fp", "أُلِهْتُنَّ"}, {"past_pass_2fs", "أُلِهْتِ"}, {"past_pass_2mp", "أُلِهْتُمْ"}, {"past_pass_2ms", "أُلِهْتَ"}, {"past_pass_3fd", "أُلِهَتَا"}, {"past_pass_3fp", "أُلِهْنَ"}, {"past_pass_3fs", "أُلِهَتْ"}, {"past_pass_3md", "أُلِهَا"}, {"past_pass_3mp", "أُلِهُوا"}, {"past_pass_3ms", "أُلِهَ"}, }, }, { label = "باعَ ـِ (p.158، أجوف يائي)", root = "بيع", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "بِيعَا"}, {"imp_2fp", "بِعْنَ"}, {"imp_2fs", "بِيعِي"}, {"imp_2mp", "بِيعُوا"}, {"imp_2ms", "بِعْ"}, {"ind_1p", "نَبِيعُ"}, {"ind_1s", "أَبِيعُ"}, {"ind_2d", "تَبِيعَانِ"}, {"ind_2fp", "تَبِعْنَ"}, {"ind_2fs", "تَبِيعِينَ"}, {"ind_2mp", "تَبِيعُونَ"}, {"ind_2ms", "تَبِيعُ"}, {"ind_3fd", "تَبِيعَانِ"}, {"ind_3fp", "يَبِعْنَ"}, {"ind_3fs", "تَبِيعُ"}, {"ind_3md", "يَبِيعَانِ"}, {"ind_3mp", "يَبِيعُونَ"}, {"ind_3ms", "يَبِيعُ"}, {"ind_pass_1p", "نُبَاعُ"}, {"ind_pass_1s", "أُبَاعُ"}, {"ind_pass_2d", "تُبَاعَانِ"}, {"ind_pass_2fp", "تُبَعْنَ"}, {"ind_pass_2fs", "تُبَاعِينَ"}, {"ind_pass_2mp", "تُبَاعُونَ"}, {"ind_pass_2ms", "تُبَاعُ"}, {"ind_pass_3fd", "تُبَاعَانِ"}, {"ind_pass_3fp", "يُبَعْنَ"}, {"ind_pass_3fs", "تُبَاعُ"}, {"ind_pass_3md", "يُبَاعَانِ"}, {"ind_pass_3mp", "يُبَاعُونَ"}, {"ind_pass_3ms", "يُبَاعُ"}, {"past_1p", "بِعْنَا"}, {"past_1s", "بِعْتُ"}, {"past_2d", "بِعْتُمَا"}, {"past_2fp", "بِعْتُنَّ"}, {"past_2fs", "بِعْتِ"}, {"past_2mp", "بِعْتُمْ"}, {"past_2ms", "بِعْتَ"}, {"past_3fd", "بَاعَتَا"}, {"past_3fp", "بِعْنَ"}, {"past_3fs", "بَاعَتْ"}, {"past_3md", "بَاعَا"}, {"past_3mp", "بَاعُوا"}, {"past_3ms", "بَاعَ"}, {"past_pass_1p", "بُعْنَا"}, {"past_pass_1s", "بُعْتُ"}, {"past_pass_2d", "بُعْتُمَا"}, {"past_pass_2fp", "بُعْتُنَّ"}, {"past_pass_2fs", "بُعْتِ"}, {"past_pass_2mp", "بُعْتُمْ"}, {"past_pass_2ms", "بُعْتَ"}, {"past_pass_3fd", "بِيعَتَا"}, {"past_pass_3fp", "بُعْنَ"}, {"past_pass_3fs", "بِيعَتْ"}, {"past_pass_3md", "بِيعَا"}, {"past_pass_3mp", "بِيعُوا"}, {"past_pass_3ms", "بِيعَ"}, }, }, { label = "طَوَى ـِ (p.166، لفيف مقرون)", root = "طوي", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِطْوِيَا"}, {"imp_2fp", "اِطْوِينَ"}, {"imp_2fs", "اِطْوِي"}, {"imp_2mp", "اِطْوُوا"}, {"imp_2ms", "اِطْوِ"}, {"ind_1p", "نَطْوِي"}, {"ind_1s", "أَطْوِي"}, {"ind_2d", "تَطْوِيَانِ"}, {"ind_2fp", "تَطْوِينَ"}, {"ind_2fs", "تَطْوِينَ"}, {"ind_2mp", "تَطْوُونَ"}, {"ind_2ms", "تَطْوِي"}, {"ind_3fd", "تَطْوِيَانِ"}, {"ind_3fp", "يَطْوِينَ"}, {"ind_3fs", "تَطْوِي"}, {"ind_3md", "يَطْوِيَانِ"}, {"ind_3mp", "يَطْوُونَ"}, {"ind_3ms", "يَطْوِي"}, {"ind_pass_1p", "نُطْوَى"}, {"ind_pass_1s", "أُطْوَى"}, {"ind_pass_2d", "تُطْوَيَانِ"}, {"ind_pass_2fp", "تُطْوَيْنَ"}, {"ind_pass_2fs", "تُطْوَيْنَ"}, {"ind_pass_2mp", "تُطْوَوْنَ"}, {"ind_pass_2ms", "تُطْوَى"}, {"ind_pass_3fd", "تُطْوَيَانِ"}, {"ind_pass_3fp", "يُطْوَيْنَ"}, {"ind_pass_3fs", "تُطْوَى"}, {"ind_pass_3md", "يُطْوَيَانِ"}, {"ind_pass_3mp", "يُطْوَوْنَ"}, {"ind_pass_3ms", "يُطْوَى"}, {"past_1p", "طَوَيْنَا"}, {"past_1s", "طَوَيْتُ"}, {"past_2d", "طَوَيْتُمَا"}, {"past_2fp", "طَوَيْتُنَّ"}, {"past_2fs", "طَوَيْتِ"}, {"past_2mp", "طَوَيْتُمْ"}, {"past_2ms", "طَوَيْتَ"}, {"past_3fd", "طَوَتَا"}, {"past_3fp", "طَوَيْنَ"}, {"past_3fs", "طَوَتْ"}, {"past_3md", "طَوَيَا"}, {"past_3mp", "طَوَوْا"}, {"past_3ms", "طَوَى"}, {"past_pass_1p", "طُوِينَا"}, {"past_pass_1s", "طُوِيتُ"}, {"past_pass_2d", "طُوِيتُمَا"}, {"past_pass_2fp", "طُوِيتُنَّ"}, {"past_pass_2fs", "طُوِيتِ"}, {"past_pass_2mp", "طُوِيتُمْ"}, {"past_pass_2ms", "طُوِيتَ"}, {"past_pass_3fd", "طُوِيَتَا"}, {"past_pass_3fp", "طُوِينَ"}, {"past_pass_3fs", "طُوِيَتْ"}, {"past_pass_3md", "طُوِيَا"}, {"past_pass_3mp", "طُوُوا"}, {"past_pass_3ms", "طُوِيَ"}, }, }, { label = "سَأَلَ ـَ (p.176، مهموز العين)", root = "سأل", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِسْأَلَا"}, {"imp_2fp", "اِسْأَلْنَ"}, {"imp_2fs", "اِسْأَلِي"}, {"imp_2mp", "اِسْأَلُوا"}, {"imp_2ms", "اِسْأَلْ"}, {"ind_1p", "نَسْأَلُ"}, {"ind_1s", "أَسْأَلُ"}, {"ind_2d", "تَسْأَلَانِ"}, {"ind_2fp", "تَسْأَلْنَ"}, {"ind_2fs", "تَسْأَلِينَ"}, {"ind_2mp", "تَسْأَلُونَ"}, {"ind_2ms", "تَسْأَلُ"}, {"ind_3fd", "تَسْأَلَانِ"}, {"ind_3fp", "يَسْأَلْنَ"}, {"ind_3fs", "تَسْأَلُ"}, {"ind_3md", "يَسْأَلَانِ"}, {"ind_3mp", "يَسْأَلُونَ"}, {"ind_3ms", "يَسْأَلُ"}, {"ind_pass_1p", "نُسْأَلُ"}, {"ind_pass_1s", "أُسْأَلُ"}, {"ind_pass_2d", "تُسْأَلَانِ"}, {"ind_pass_2fp", "تُسْأَلْنَ"}, {"ind_pass_2fs", "تُسْأَلِينَ"}, {"ind_pass_2mp", "تُسْأَلُونَ"}, {"ind_pass_2ms", "تُسْأَلُ"}, {"ind_pass_3fd", "تُسْأَلَانِ"}, {"ind_pass_3fp", "يُسْأَلْنَ"}, {"ind_pass_3fs", "تُسْأَلُ"}, {"ind_pass_3md", "يُسْأَلَانِ"}, {"ind_pass_3mp", "يُسْأَلُونَ"}, {"ind_pass_3ms", "يُسْأَلُ"}, {"past_1p", "سَأَلْنَا"}, {"past_1s", "سَأَلْتُ"}, {"past_2d", "سَأَلْتُمَا"}, {"past_2fp", "سَأَلْتُنَّ"}, {"past_2fs", "سَأَلْتِ"}, {"past_2mp", "سَأَلْتُمْ"}, {"past_2ms", "سَأَلْتَ"}, {"past_3fd", "سَأَلَتَا"}, {"past_3fp", "سَأَلْنَ"}, {"past_3fs", "سَأَلَتْ"}, {"past_3md", "سَأَلَا"}, {"past_3mp", "سَأَلُوا"}, {"past_3ms", "سَأَلَ"}, {"past_pass_1p", "سُئِلْنَا"}, {"past_pass_1s", "سُئِلْتُ"}, {"past_pass_2d", "سُئِلْتُمَا"}, {"past_pass_2fp", "سُئِلْتُنَّ"}, {"past_pass_2fs", "سُئِلْتِ"}, {"past_pass_2mp", "سُئِلْتُمْ"}, {"past_pass_2ms", "سُئِلْتَ"}, {"past_pass_3fd", "سُئِلَتَا"}, {"past_pass_3fp", "سُئِلْنَ"}, {"past_pass_3fs", "سُئِلَتْ"}, {"past_pass_3md", "سُئِلَا"}, {"past_pass_3mp", "سُئِلُوا"}, {"past_pass_3ms", "سُئِلَ"}, }, }, { label = "باتَ ـَ (p.183، أجوف يائي)", root = "بيت", wazn = "فعَل يفعَل", forms = { {"imp_2d", "بَاتَا"}, {"imp_2fp", "بَتْنَ"}, {"imp_2fs", "بَاتِي"}, {"imp_2mp", "بَاتُوا"}, {"imp_2ms", "بَتْ"}, {"ind_1p", "نَبَاتُ"}, {"ind_1s", "أَبَاتُ"}, {"ind_2d", "تَبَاتَانِ"}, {"ind_2fp", "تَبَتْنَ"}, {"ind_2fs", "تَبَاتِينَ"}, {"ind_2mp", "تَبَاتُونَ"}, {"ind_2ms", "تَبَاتُ"}, {"ind_3fd", "تَبَاتَانِ"}, {"ind_3fp", "يَبَتْنَ"}, {"ind_3fs", "تَبَاتُ"}, {"ind_3md", "يَبَاتَانِ"}, {"ind_3mp", "يَبَاتُونَ"}, {"ind_3ms", "يَبَاتُ"}, {"past_1p", "بِتْنَا"}, {"past_1s", "بِتُّ"}, {"past_2d", "بِتُّمَا"}, {"past_2fp", "بِتُّنَّ"}, {"past_2fs", "بِتِّ"}, {"past_2mp", "بِتُّمْ"}, {"past_2ms", "بِتَّ"}, {"past_3fd", "بَاتَتَا"}, {"past_3fp", "بِتْنَ"}, {"past_3fs", "بَاتَتْ"}, {"past_3md", "بَاتَا"}, {"past_3mp", "بَاتُوا"}, {"past_3ms", "بَاتَ"}, }, }, { label = "سَعَى ـَ (p.186، ناقص يائي)", root = "سعي", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِسْعَيَا"}, {"imp_2fp", "اِسْعَيْنَ"}, {"imp_2fs", "اِسْعَيْ"}, {"imp_2mp", "اِسْعَوْا"}, {"imp_2ms", "اِسْعَ"}, {"ind_1p", "نَسْعَى"}, {"ind_1s", "أَسْعَى"}, {"ind_2d", "تَسْعَيَانِ"}, {"ind_2fp", "تَسْعَيْنَ"}, {"ind_2fs", "تَسْعَيْنَ"}, {"ind_2mp", "تَسْعَوْنَ"}, {"ind_2ms", "تَسْعَى"}, {"ind_3fd", "تَسْعَيَانِ"}, {"ind_3fp", "يَسْعَيْنَ"}, {"ind_3fs", "تَسْعَى"}, {"ind_3md", "يَسْعَيَانِ"}, {"ind_3mp", "يَسْعَوْنَ"}, {"ind_3ms", "يَسْعَى"}, {"ind_pass_1p", "نُسْعَى"}, {"ind_pass_1s", "أُسْعَى"}, {"ind_pass_2d", "تُسْعَيَانِ"}, {"ind_pass_2fp", "تُسْعَيْنَ"}, {"ind_pass_2fs", "تُسْعَيْنَ"}, {"ind_pass_2mp", "تُسْعَوْنَ"}, {"ind_pass_2ms", "تُسْعَى"}, {"ind_pass_3fd", "تُسْعَيَانِ"}, {"ind_pass_3fp", "يُسْعَيْنَ"}, {"ind_pass_3fs", "تُسْعَى"}, {"ind_pass_3md", "يُسْعَيَانِ"}, {"ind_pass_3mp", "يُسْعَوْنَ"}, {"ind_pass_3ms", "يُسْعَى"}, {"past_1p", "سَعَيْنَا"}, {"past_1s", "سَعَيْتُ"}, {"past_2d", "سَعَيْتُمَا"}, {"past_2fp", "سَعَيْتُنَّ"}, {"past_2fs", "سَعَيْتِ"}, {"past_2mp", "سَعَيْتُمْ"}, {"past_2ms", "سَعَيْتَ"}, {"past_3fd", "سَعَتَا"}, {"past_3fp", "سَعَيْنَ"}, {"past_3fs", "سَعَتْ"}, {"past_3md", "سَعَيَا"}, {"past_3mp", "سَعَوْا"}, {"past_3ms", "سَعَى"}, {"past_pass_1p", "سُعِينَا"}, {"past_pass_1s", "سُعِيتُ"}, {"past_pass_2d", "سُعِيتُمَا"}, {"past_pass_2fp", "سُعِيتُنَّ"}, {"past_pass_2fs", "سُعِيتِ"}, {"past_pass_2mp", "سُعِيتُمْ"}, {"past_pass_2ms", "سُعِيتَ"}, {"past_pass_3fd", "سُعِيَتَا"}, {"past_pass_3fp", "سُعِينَ"}, {"past_pass_3fs", "سُعِيَتْ"}, {"past_pass_3md", "سُعِيَا"}, {"past_pass_3mp", "سُعُوا"}, {"past_pass_3ms", "سُعِيَ"}, }, }, { label = "كَرُمَ ـُ (p.189، صحيح سالم)", root = "كرم", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُكْرُمَا"}, {"imp_2fp", "اُكْرُمْنَ"}, {"imp_2fs", "اُكْرُمِي"}, {"imp_2mp", "اُكْرُمُوا"}, {"imp_2ms", "اُكْرُمْ"}, {"ind_1p", "نَكْرُمُ"}, {"ind_1s", "أَكْرُمُ"}, {"ind_2d", "تَكْرُمَانِ"}, {"ind_2fp", "تَكْرُمْنَ"}, {"ind_2fs", "تَكْرُمِينَ"}, {"ind_2mp", "تَكْرُمُونَ"}, {"ind_2ms", "تَكْرُمُ"}, {"ind_3fd", "تَكْرُمَانِ"}, {"ind_3fp", "يَكْرُمْنَ"}, {"ind_3fs", "تَكْرُمُ"}, {"ind_3md", "يَكْرُمَانِ"}, {"ind_3mp", "يَكْرُمُونَ"}, {"ind_3ms", "يَكْرُمُ"}, {"past_1p", "كَرُمْنَا"}, {"past_1s", "كَرُمْتُ"}, {"past_2d", "كَرُمْتُمَا"}, {"past_2fp", "كَرُمْتُنَّ"}, {"past_2fs", "كَرُمْتِ"}, {"past_2mp", "كَرُمْتُمْ"}, {"past_2ms", "كَرُمْتَ"}, {"past_3fd", "كَرُمَتَا"}, {"past_3fp", "كَرُمْنَ"}, {"past_3fs", "كَرُمَتْ"}, {"past_3md", "كَرُمَا"}, {"past_3mp", "كَرُمُوا"}, {"past_3ms", "كَرُمَ"}, }, }, { label = "هَمَّ ـُ (p.192، مضاعف)", root = "همم", wazn = "فعَل يفعُل", forms = { {"imp_2d", "هُمَّا"}, {"imp_2fp", "اُهْمُمْنَ"}, {"imp_2fs", "هُمِّي"}, {"imp_2mp", "هُمُّوا"}, {"imp_2ms", "هُمَّ"}, {"ind_1p", "نَهُمُّ"}, {"ind_1s", "أَهُمُّ"}, {"ind_2d", "تَهُمَّانِ"}, {"ind_2fp", "تَهْمُمْنَ"}, {"ind_2fs", "تَهُمِّينَ"}, {"ind_2mp", "تَهُمُّونَ"}, {"ind_2ms", "تَهُمُّ"}, {"ind_3fd", "تَهُمَّانِ"}, {"ind_3fp", "يَهْمُمْنَ"}, {"ind_3fs", "تَهُمُّ"}, {"ind_3md", "يَهُمَّانِ"}, {"ind_3mp", "يَهُمُّونَ"}, {"ind_3ms", "يَهُمُّ"}, {"past_1p", "هَمُمْنَا"}, {"past_1s", "هَمُمْتُ"}, {"past_2d", "هَمُمْتُمَا"}, {"past_2fp", "هَمُمْتُنَّ"}, {"past_2fs", "هَمُمْتِ"}, {"past_2mp", "هَمُمْتُمْ"}, {"past_2ms", "هَمُمْتَ"}, {"past_3fd", "هَمَّتَا"}, {"past_3fp", "هَمُمْنَ"}, {"past_3fs", "هَمَّتْ"}, {"past_3md", "هَمَّا"}, {"past_3mp", "هَمُّوا"}, {"past_3ms", "هَمَّ"}, }, }, { label = "أَصُلَ ـُ (p.195، مهموز الفاء)", root = "أصل", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُؤْصُلَا"}, {"imp_2fp", "اُؤْصُلْنَ"}, {"imp_2fs", "اُؤْصُلِي"}, {"imp_2mp", "اُؤْصُلُوا"}, {"imp_2ms", "اُؤْصُلْ"}, {"ind_1p", "نَأْصُلُ"}, {"ind_1s", "آصُلُ"}, {"ind_2d", "تَأْصُلَانِ"}, {"ind_2fp", "تَأْصُلْنَ"}, {"ind_2fs", "تَأْصُلِينَ"}, {"ind_2mp", "تَأْصُلُونَ"}, {"ind_2ms", "تَأْصُلُ"}, {"ind_3fd", "تَأْصُلَانِ"}, {"ind_3fp", "يَأْصُلْنَ"}, {"ind_3fs", "تَأْصُلُ"}, {"ind_3md", "يَأْصُلَانِ"}, {"ind_3mp", "يَأْصُلُونَ"}, {"ind_3ms", "يَأْصُلُ"}, {"past_1p", "أَصُلْنَا"}, {"past_1s", "أَصُلْتُ"}, {"past_2d", "أَصُلْتُمَا"}, {"past_2fp", "أَصُلْتُنَّ"}, {"past_2fs", "أَصُلْتِ"}, {"past_2mp", "أَصُلْتُمْ"}, {"past_2ms", "أَصُلْتَ"}, {"past_3fd", "أَصُلَتَا"}, {"past_3fp", "أَصُلْنَ"}, {"past_3fs", "أَصُلَتْ"}, {"past_3md", "أَصُلَا"}, {"past_3mp", "أَصُلُوا"}, {"past_3ms", "أَصُلَ"}, }, }, { label = "جَرُؤَ ـُ (p.199، مهموز اللام)", root = "جرأ", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُجْرُؤَا"}, {"imp_2fp", "اُجْرُؤْنَ"}, {"imp_2fs", "اُجْرُئِي"}, {"imp_2mp", "اُجْرُؤُوا"}, {"imp_2ms", "اُجْرُؤْ"}, {"ind_1p", "نَجْرُؤُ"}, {"ind_1s", "أَجْرُؤُ"}, {"ind_2d", "تَجْرُؤَانِ"}, {"ind_2fp", "تَجْرُؤْنَ"}, {"ind_2fs", "تَجْرُئِينَ"}, {"ind_2mp", "تَجْرُؤُونَ"}, {"ind_2ms", "تَجْرُؤُ"}, {"ind_3fd", "تَجْرُؤَانِ"}, {"ind_3fp", "يَجْرُؤْنَ"}, {"ind_3fs", "تَجْرُؤُ"}, {"ind_3md", "يَجْرُؤَانِ"}, {"ind_3mp", "يَجْرُؤُونَ"}, {"ind_3ms", "يَجْرُؤُ"}, {"past_1p", "جَرُؤْنَا"}, {"past_1s", "جَرُؤْتُ"}, {"past_2d", "جَرُؤْتُمَا"}, {"past_2fp", "جَرُؤْتُنَّ"}, {"past_2fs", "جَرُؤْتِ"}, {"past_2mp", "جَرُؤْتُمْ"}, {"past_2ms", "جَرُؤْتَ"}, {"past_3fd", "جَرُؤَتَا"}, {"past_3fp", "جَرُؤْنَ"}, {"past_3fs", "جَرُؤَتْ"}, {"past_3md", "جَرُؤَا"}, {"past_3mp", "جَرُؤُوا"}, {"past_3ms", "جَرُؤَ"}, }, }, { label = "يَسُرَ ـُ (p.201، معتل الفاء مثال)", root = "يسر", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُوسُرَا"}, {"imp_2fp", "اُوسُرْنَ"}, {"imp_2fs", "اُوسُرِي"}, {"imp_2mp", "اُوسُرُوا"}, {"imp_2ms", "اُوسُرْ"}, {"ind_1p", "نَيْسُرُ"}, {"ind_1s", "أَيْسُرُ"}, {"ind_2d", "تَيْسُرَانِ"}, {"ind_2fp", "تَيْسُرْنَ"}, {"ind_2fs", "تَيْسُرِينَ"}, {"ind_2mp", "تَيْسُرُونَ"}, {"ind_2ms", "تَيْسُرُ"}, {"ind_3fd", "تَيْسُرَانِ"}, {"ind_3fp", "يَيْسُرْنَ"}, {"ind_3fs", "تَيْسُرُ"}, {"ind_3md", "يَيْسُرَانِ"}, {"ind_3mp", "يَيْسُرُونَ"}, {"ind_3ms", "يَيْسُرُ"}, {"past_1p", "يَسُرْنَا"}, {"past_1s", "يَسُرْتُ"}, {"past_2d", "يَسُرْتُمَا"}, {"past_2fp", "يَسُرْتُنَّ"}, {"past_2fs", "يَسُرْتِ"}, {"past_2mp", "يَسُرْتُمْ"}, {"past_2ms", "يَسُرْتَ"}, {"past_3fd", "يَسُرَتَا"}, {"past_3fp", "يَسُرْنَ"}, {"past_3fs", "يَسُرَتْ"}, {"past_3md", "يَسُرَا"}, {"past_3mp", "يَسُرُوا"}, {"past_3ms", "يَسُرَ"}, }, }, } t2aoviltgjsaq30mx530r7wjjlhkn55 وحدة:ar-verb/testcases/3 828 241793 1099195 2026-08-22T21:18:26Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099195 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 3 من 4. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/3") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_3() for _, entry in ipairs(data) do check(self, entry) end end return tests axifauicbxum78nl27d16r7423laxm5 1099204 1099195 2026-08-22T21:44:45Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099204 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 3 من 5. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/3") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_3() for _, entry in ipairs(data) do check(self, entry) end end return tests gjyfy9jxmb32ncugr8t86kdmvospw23 وحدة:ar-verb/testcases/بيانات/4 828 241794 1099196 2026-08-22T21:18:27Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099196 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 4 من 4. return { { label = "سَهُوَ ـُ (p.204، ناقص واوي)", root = "سهو", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُسْهُوَا"}, {"imp_2fp", "اُسْهُونَ"}, {"imp_2fs", "اُسْهُوِي"}, {"imp_2mp", "اُسْهُوا"}, {"imp_2ms", "اُسْهُ"}, {"ind_1p", "نَسْهُو"}, {"ind_1s", "أَسْهُو"}, {"ind_2d", "تَسْهُوَانِ"}, {"ind_2fp", "تَسْهُونَ"}, {"ind_2fs", "تَسْهُوِينَ"}, {"ind_2mp", "تَسْهُونَ"}, {"ind_2ms", "تَسْهُو"}, {"ind_3fd", "تَسْهُوَانِ"}, {"ind_3fp", "يَسْهُونَ"}, {"ind_3fs", "تَسْهُو"}, {"ind_3md", "يَسْهُوَانِ"}, {"ind_3mp", "يَسْهُونَ"}, {"ind_3ms", "يَسْهُو"}, {"past_1p", "سَهُونَا"}, {"past_1s", "سَهُوتُ"}, {"past_2d", "سَهُوتُمَا"}, {"past_2fp", "سَهُوتُنَّ"}, {"past_2fs", "سَهُوتِ"}, {"past_2mp", "سَهُوتُمْ"}, {"past_2ms", "سَهُوتَ"}, {"past_3fd", "سَهُوَتَا"}, {"past_3fp", "سَهُونَ"}, {"past_3fs", "سَهُوَتْ"}, {"past_3md", "سَهُوَا"}, {"past_3mp", "سَهُوا"}, {"past_3ms", "سَهُوَ"}, }, }, { label = "عَلِمَ ـَ (p.206، صحيح سالم)", root = "علم", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِعْلَمَا"}, {"imp_2fp", "اِعْلَمْنَ"}, {"imp_2fs", "اِعْلَمِي"}, {"imp_2mp", "اِعْلَمُوا"}, {"imp_2ms", "اِعْلَمْ"}, {"ind_1p", "نَعْلَمُ"}, {"ind_1s", "أَعْلَمُ"}, {"ind_2d", "تَعْلَمَانِ"}, {"ind_2fp", "تَعْلَمْنَ"}, {"ind_2fs", "تَعْلَمِينَ"}, {"ind_2mp", "تَعْلَمُونَ"}, {"ind_2ms", "تَعْلَمُ"}, {"ind_3fd", "تَعْلَمَانِ"}, {"ind_3fp", "يَعْلَمْنَ"}, {"ind_3fs", "تَعْلَمُ"}, {"ind_3md", "يَعْلَمَانِ"}, {"ind_3mp", "يَعْلَمُونَ"}, {"ind_3ms", "يَعْلَمُ"}, {"ind_pass_1p", "نُعْلَمُ"}, {"ind_pass_1s", "أُعْلَمُ"}, {"ind_pass_2d", "تُعْلَمَانِ"}, {"ind_pass_2fp", "تُعْلَمْنَ"}, {"ind_pass_2fs", "تُعْلَمِينَ"}, {"ind_pass_2mp", "تُعْلَمُونَ"}, {"ind_pass_2ms", "تُعْلَمُ"}, {"ind_pass_3fd", "تُعْلَمَانِ"}, {"ind_pass_3fp", "يُعْلَمْنَ"}, {"ind_pass_3fs", "تُعْلَمُ"}, {"ind_pass_3md", "يُعْلَمَانِ"}, {"ind_pass_3mp", "يُعْلَمُونَ"}, {"ind_pass_3ms", "يُعْلَمُ"}, {"past_1p", "عَلِمْنَا"}, {"past_1s", "عَلِمْتُ"}, {"past_2d", "عَلِمْتُمَا"}, {"past_2fp", "عَلِمْتُنَّ"}, {"past_2fs", "عَلِمْتِ"}, {"past_2mp", "عَلِمْتُمْ"}, {"past_2ms", "عَلِمْتَ"}, {"past_3fd", "عَلِمَتَا"}, {"past_3fp", "عَلِمْنَ"}, {"past_3fs", "عَلِمَتْ"}, {"past_3md", "عَلِمَا"}, {"past_3mp", "عَلِمُوا"}, {"past_3ms", "عَلِمَ"}, {"past_pass_1p", "عُلِمْنَا"}, {"past_pass_1s", "عُلِمْتُ"}, {"past_pass_2d", "عُلِمْتُمَا"}, {"past_pass_2fp", "عُلِمْتُنَّ"}, {"past_pass_2fs", "عُلِمْتِ"}, {"past_pass_2mp", "عُلِمْتُمْ"}, {"past_pass_2ms", "عُلِمْتَ"}, {"past_pass_3fd", "عُلِمَتَا"}, {"past_pass_3fp", "عُلِمْنَ"}, {"past_pass_3fs", "عُلِمَتْ"}, {"past_pass_3md", "عُلِمَا"}, {"past_pass_3mp", "عُلِمُوا"}, {"past_pass_3ms", "عُلِمَ"}, }, }, { label = "ظَلَّ ـَ (p.210، مضاعف)", root = "ظلل", wazn = "فعِل يفعَل", forms = { {"imp_2d", "ظَلَّا"}, {"imp_2fp", "اِظْلَلْنَ"}, {"imp_2fs", "ظَلِّي"}, {"imp_2mp", "ظَلُّوا"}, {"imp_2ms", "ظَلَّ"}, {"ind_1p", "نَظَلُّ"}, {"ind_1s", "أَظَلُّ"}, {"ind_2d", "تَظَلَّانِ"}, {"ind_2fp", "تَظْلَلْنَ"}, {"ind_2fs", "تَظَلِّينَ"}, {"ind_2mp", "تَظَلُّونَ"}, {"ind_2ms", "تَظَلُّ"}, {"ind_3fd", "تَظَلَّانِ"}, {"ind_3fp", "يَظْلَلْنَ"}, {"ind_3fs", "تَظَلُّ"}, {"ind_3md", "يَظَلَّانِ"}, {"ind_3mp", "يَظَلُّونَ"}, {"ind_3ms", "يَظَلُّ"}, {"past_1p", "ظَلِلْنَا"}, {"past_1s", "ظَلِلْتُ"}, {"past_2d", "ظَلِلْتُمَا"}, {"past_2fp", "ظَلِلْتُنَّ"}, {"past_2fs", "ظَلِلْتِ"}, {"past_2mp", "ظَلِلْتُمْ"}, {"past_2ms", "ظَلِلْتَ"}, {"past_3fd", "ظَلَّتَا"}, {"past_3fp", "ظَلِلْنَ"}, {"past_3fs", "ظَلَّتْ"}, {"past_3md", "ظَلَّا"}, {"past_3mp", "ظَلُّوا"}, {"past_3ms", "ظَلَّ"}, }, }, { label = "أَلِفَ ـَ (p.213، مهموز الفاء)", root = "ألف", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِئْلَفَا"}, {"imp_2fp", "اِئْلَفْنَ"}, {"imp_2fs", "اِئْلَفِي"}, {"imp_2mp", "اِئْلَفُوا"}, {"imp_2ms", "اِئْلَفْ"}, {"ind_1p", "نَأْلَفُ"}, {"ind_1s", "آلَفُ"}, {"ind_2d", "تَأْلَفَانِ"}, {"ind_2fp", "تَأْلَفْنَ"}, {"ind_2fs", "تَأْلَفِينَ"}, {"ind_2mp", "تَأْلَفُونَ"}, {"ind_2ms", "تَأْلَفُ"}, {"ind_3fd", "تَأْلَفَانِ"}, {"ind_3fp", "يَأْلَفْنَ"}, {"ind_3fs", "تَأْلَفُ"}, {"ind_3md", "يَأْلَفَانِ"}, {"ind_3mp", "يَأْلَفُونَ"}, {"ind_3ms", "يَأْلَفُ"}, {"ind_pass_1p", "نُؤْلَفُ"}, {"ind_pass_1s", "أُولَفُ"}, {"ind_pass_2d", "تُؤْلَفَانِ"}, {"ind_pass_2fp", "تُؤْلَفْنَ"}, {"ind_pass_2fs", "تُؤْلَفِينَ"}, {"ind_pass_2mp", "تُؤْلَفُونَ"}, {"ind_pass_2ms", "تُؤْلَفُ"}, {"ind_pass_3fd", "تُؤْلَفَانِ"}, {"ind_pass_3fp", "يُؤْلَفْنَ"}, {"ind_pass_3fs", "تُؤْلَفُ"}, {"ind_pass_3md", "يُؤْلَفَانِ"}, {"ind_pass_3mp", "يُؤْلَفُونَ"}, {"ind_pass_3ms", "يُؤْلَفُ"}, {"past_1p", "أَلِفْنَا"}, {"past_1s", "أَلِفْتُ"}, {"past_2d", "أَلِفْتُمَا"}, {"past_2fp", "أَلِفْتُنَّ"}, {"past_2fs", "أَلِفْتِ"}, {"past_2mp", "أَلِفْتُمْ"}, {"past_2ms", "أَلِفْتَ"}, {"past_3fd", "أَلِفَتَا"}, {"past_3fp", "أَلِفْنَ"}, {"past_3fs", "أَلِفَتْ"}, {"past_3md", "أَلِفَا"}, {"past_3mp", "أَلِفُوا"}, {"past_3ms", "أَلِفَ"}, {"past_pass_1p", "أُلِفْنَا"}, {"past_pass_1s", "أُلِفْتُ"}, {"past_pass_2d", "أُلِفْتُمَا"}, {"past_pass_2fp", "أُلِفْتُنَّ"}, {"past_pass_2fs", "أُلِفْتِ"}, {"past_pass_2mp", "أُلِفْتُمْ"}, {"past_pass_2ms", "أُلِفْتَ"}, {"past_pass_3fd", "أُلِفَتَا"}, {"past_pass_3fp", "أُلِفْنَ"}, {"past_pass_3fs", "أُلِفَتْ"}, {"past_pass_3md", "أُلِفَا"}, {"past_pass_3mp", "أُلِفُوا"}, {"past_pass_3ms", "أُلِفَ"}, }, }, { label = "بَئِسَ ـَ (p.216، مهموز العين)", root = "بأس", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِبْأَسَا"}, {"imp_2fp", "اِبْأَسْنَ"}, {"imp_2fs", "اِبْأَسِي"}, {"imp_2mp", "اِبْأَسُوا"}, {"imp_2ms", "اِبْأَسْ"}, {"ind_1p", "نَبْأَسُ"}, {"ind_1s", "أَبْأَسُ"}, {"ind_2d", "تَبْأَسَانِ"}, {"ind_2fp", "تَبْأَسْنَ"}, {"ind_2fs", "تَبْأَسِينَ"}, {"ind_2mp", "تَبْأَسُونَ"}, {"ind_2ms", "تَبْأَسُ"}, {"ind_3fd", "تَبْأَسَانِ"}, {"ind_3fp", "يَبْأَسْنَ"}, {"ind_3fs", "تَبْأَسُ"}, {"ind_3md", "يَبْأَسَانِ"}, {"ind_3mp", "يَبْأَسُونَ"}, {"ind_3ms", "يَبْأَسُ"}, {"past_1p", "بَئِسْنَا"}, {"past_1s", "بَئِسْتُ"}, {"past_2d", "بَئِسْتُمَا"}, {"past_2fp", "بَئِسْتُنَّ"}, {"past_2fs", "بَئِسْتِ"}, {"past_2mp", "بَئِسْتُمْ"}, {"past_2ms", "بَئِسْتَ"}, {"past_3fd", "بَئِسَتَا"}, {"past_3fp", "بَئِسْنَ"}, {"past_3fs", "بَئِسَتْ"}, {"past_3md", "بَئِسَا"}, {"past_3mp", "بَئِسُوا"}, {"past_3ms", "بَئِسَ"}, }, }, { label = "خَطِئَ ـَ (p.219، مهموز اللام)", root = "خطأ", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِخْطَآ"}, {"imp_2fp", "اِخْطَأْنَ"}, {"imp_2fs", "اِخْطَئِي"}, {"imp_2mp", "اِخْطَؤُوا"}, {"imp_2ms", "اِخْطَأْ"}, {"ind_1p", "نَخْطَأُ"}, {"ind_1s", "أَخْطَأُ"}, {"ind_2d", "تَخْطَآنِ"}, {"ind_2fp", "تَخْطَأْنَ"}, {"ind_2fs", "تَخْطَئِينَ"}, {"ind_2mp", "تَخْطَؤُونَ"}, {"ind_2ms", "تَخْطَأُ"}, {"ind_3fd", "تَخْطَآنِ"}, {"ind_3fp", "يَخْطَأْنَ"}, {"ind_3fs", "تَخْطَأُ"}, {"ind_3md", "يَخْطَآنِ"}, {"ind_3mp", "يَخْطَؤُونَ"}, {"ind_3ms", "يَخْطَأُ"}, {"ind_pass_1p", "نُخْطَأُ"}, {"ind_pass_1s", "أُخْطَأُ"}, {"ind_pass_2d", "تُخْطَآنِ"}, {"ind_pass_2fp", "تُخْطَأْنَ"}, {"ind_pass_2fs", "تُخْطَئِينَ"}, {"ind_pass_2mp", "تُخْطَؤُونَ"}, {"ind_pass_2ms", "تُخْطَأُ"}, {"ind_pass_3fd", "تُخْطَآنِ"}, {"ind_pass_3fp", "يُخْطَأْنَ"}, {"ind_pass_3fs", "تُخْطَأُ"}, {"ind_pass_3md", "يُخْطَآنِ"}, {"ind_pass_3mp", "يُخْطَؤُونَ"}, {"ind_pass_3ms", "يُخْطَأُ"}, {"past_1p", "خَطِئْنَا"}, {"past_1s", "خَطِئْتُ"}, {"past_2d", "خَطِئْتُمَا"}, {"past_2fp", "خَطِئْتُنَّ"}, {"past_2fs", "خَطِئْتِ"}, {"past_2mp", "خَطِئْتُمْ"}, {"past_2ms", "خَطِئْتَ"}, {"past_3fd", "خَطِئَتَا"}, {"past_3fp", "خَطِئْنَ"}, {"past_3fs", "خَطِئَتْ"}, {"past_3md", "خَطِئَا"}, {"past_3mp", "خَطِئُوا"}, {"past_3ms", "خَطِئَ"}, {"past_pass_1p", "خُطِئْنَا"}, {"past_pass_1s", "خُطِئْتُ"}, {"past_pass_2d", "خُطِئْتُمَا"}, {"past_pass_2fp", "خُطِئْتُنَّ"}, {"past_pass_2fs", "خُطِئْتِ"}, {"past_pass_2mp", "خُطِئْتُمْ"}, {"past_pass_2ms", "خُطِئْتَ"}, {"past_pass_3fd", "خُطِئَتَا"}, {"past_pass_3fp", "خُطِئْنَ"}, {"past_pass_3fs", "خُطِئَتْ"}, {"past_pass_3md", "خُطِئَا"}, {"past_pass_3mp", "خُطِئُوا"}, {"past_pass_3ms", "خُطِئَ"}, }, }, { label = "يَقِظَ ـَ (p.222، معتل الفاء مثال)", root = "يقظ", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِيقَظَا"}, {"imp_2fp", "اِيقَظْنَ"}, {"imp_2fs", "اِيقَظِي"}, {"imp_2mp", "اِيقَظُوا"}, {"imp_2ms", "اِيقَظْ"}, {"ind_1p", "نَيْقَظُ"}, {"ind_1s", "أَيْقَظُ"}, {"ind_2d", "تَيْقَظَانِ"}, {"ind_2fp", "تَيْقَظْنَ"}, {"ind_2fs", "تَيْقَظِينَ"}, {"ind_2mp", "تَيْقَظُونَ"}, {"ind_2ms", "تَيْقَظُ"}, {"ind_3fd", "تَيْقَظَانِ"}, {"ind_3fp", "يَيْقَظْنَ"}, {"ind_3fs", "تَيْقَظُ"}, {"ind_3md", "يَيْقَظَانِ"}, {"ind_3mp", "يَيْقَظُونَ"}, {"ind_3ms", "يَيْقَظُ"}, {"past_1p", "يَقِظْنَا"}, {"past_1s", "يَقِظْتُ"}, {"past_2d", "يَقِظْتُمَا"}, {"past_2fp", "يَقِظْتُنَّ"}, {"past_2fs", "يَقِظْتِ"}, {"past_2mp", "يَقِظْتُمْ"}, {"past_2ms", "يَقِظْتَ"}, {"past_3fd", "يَقِظَتَا"}, {"past_3fp", "يَقِظْنَ"}, {"past_3fs", "يَقِظَتْ"}, {"past_3md", "يَقِظَا"}, {"past_3mp", "يَقِظُوا"}, {"past_3ms", "يَقِظَ"}, }, }, { label = "وَنِيَ ـَ (p.230، لفيف مفروق)", root = "وني", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِوْنَيَا"}, {"imp_2fp", "اِوْنَيْنَ"}, {"imp_2fs", "اِوْنَيْ"}, {"imp_2mp", "اِوْنَوْا"}, {"imp_2ms", "اِوْنَ"}, {"ind_1p", "نَوْنَى"}, {"ind_1s", "أَوْنَى"}, {"ind_2d", "تَوْنَيَانِ"}, {"ind_2fp", "تَوْنَيْنَ"}, {"ind_2fs", "تَوْنَيْنَ"}, {"ind_2mp", "تَوْنَوْنَ"}, {"ind_2ms", "تَوْنَى"}, {"ind_3fd", "تَوْنَيَانِ"}, {"ind_3fp", "يَوْنَيْنَ"}, {"ind_3fs", "تَوْنَى"}, {"ind_3md", "يَوْنَيَانِ"}, {"ind_3mp", "يَوْنَوْنَ"}, {"ind_3ms", "يَوْنَى"}, {"ind_pass_1p", "نُونَى"}, {"ind_pass_1s", "أُونَى"}, {"ind_pass_2d", "تُونَيَانِ"}, {"ind_pass_2fp", "تُونَيْنَ"}, {"ind_pass_2fs", "تُونَيْنَ"}, {"ind_pass_2mp", "تُونَوْنَ"}, {"ind_pass_2ms", "تُونَى"}, {"ind_pass_3fd", "تُونَيَانِ"}, {"ind_pass_3fp", "يُونَيْنَ"}, {"ind_pass_3fs", "تُونَى"}, {"ind_pass_3md", "يُونَيَانِ"}, {"ind_pass_3mp", "يُونَوْنَ"}, {"ind_pass_3ms", "يُونَى"}, {"past_1p", "وَنِينَا"}, {"past_1s", "وَنِيتُ"}, {"past_2d", "وَنِيتُمَا"}, {"past_2fp", "وَنِيتُنَّ"}, {"past_2fs", "وَنِيتِ"}, {"past_2mp", "وَنِيتُمْ"}, {"past_2ms", "وَنِيتَ"}, {"past_3fd", "وَنِيَتَا"}, {"past_3fp", "وَنِينَ"}, {"past_3fs", "وَنِيَتْ"}, {"past_3md", "وَنِيَا"}, {"past_3mp", "وَنُوا"}, {"past_3ms", "وَنِيَ"}, {"past_pass_1p", "وُنِينَا"}, {"past_pass_1s", "وُنِيتُ"}, {"past_pass_2d", "وُنِيتُمَا"}, {"past_pass_2fp", "وُنِيتُنَّ"}, {"past_pass_2fs", "وُنِيتِ"}, {"past_pass_2mp", "وُنِيتُمْ"}, {"past_pass_2ms", "وُنِيتَ"}, {"past_pass_3fd", "وُنِيَتَا"}, {"past_pass_3fp", "وُنِينَ"}, {"past_pass_3fs", "وُنِيَتْ"}, {"past_pass_3md", "وُنِيَا"}, {"past_pass_3mp", "وُنُوا"}, {"past_pass_3ms", "وُنِيَ"}, }, }, { label = "وَثِقَ ـِ (p.236، معتل الفاء مثال)", root = "وثق", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "ثِقَا"}, {"imp_2fp", "ثِقْنَ"}, {"imp_2fs", "ثِقِي"}, {"imp_2mp", "ثِقُوا"}, {"imp_2ms", "ثِقْ"}, {"ind_1p", "نَثِقُ"}, {"ind_1s", "أَثِقُ"}, {"ind_2d", "تَثِقَانِ"}, {"ind_2fp", "تَثِقْنَ"}, {"ind_2fs", "تَثِقِينَ"}, {"ind_2mp", "تَثِقُونَ"}, {"ind_2ms", "تَثِقُ"}, {"ind_3fd", "تَثِقَانِ"}, {"ind_3fp", "يَثِقْنَ"}, {"ind_3fs", "تَثِقُ"}, {"ind_3md", "يَثِقَانِ"}, {"ind_3mp", "يَثِقُونَ"}, {"ind_3ms", "يَثِقُ"}, {"ind_pass_1p", "نُوثَقُ"}, {"ind_pass_1s", "أُوثَقُ"}, {"ind_pass_2d", "تُوثَقَانِ"}, {"ind_pass_2fp", "تُوثَقْنَ"}, {"ind_pass_2fs", "تُوثَقِينَ"}, {"ind_pass_2mp", "تُوثَقُونَ"}, {"ind_pass_2ms", "تُوثَقُ"}, {"ind_pass_3fd", "تُوثَقَانِ"}, {"ind_pass_3fp", "يُوثَقْنَ"}, {"ind_pass_3fs", "تُوثَقُ"}, {"ind_pass_3md", "يُوثَقَانِ"}, {"ind_pass_3mp", "يُوثَقُونَ"}, {"ind_pass_3ms", "يُوثَقُ"}, {"past_1p", "وَثِقْنَا"}, {"past_1s", "وَثِقْتُ"}, {"past_2d", "وَثِقْتُمَا"}, {"past_2fp", "وَثِقْتُنَّ"}, {"past_2fs", "وَثِقْتِ"}, {"past_2mp", "وَثِقْتُمْ"}, {"past_2ms", "وَثِقْتَ"}, {"past_3fd", "وَثِقَتَا"}, {"past_3fp", "وَثِقْنَ"}, {"past_3fs", "وَثِقَتْ"}, {"past_3md", "وَثِقَا"}, {"past_3mp", "وَثِقُوا"}, {"past_3ms", "وَثِقَ"}, {"past_pass_1p", "وُثِقْنَا"}, {"past_pass_1s", "وُثِقْتُ"}, {"past_pass_2d", "وُثِقْتُمَا"}, {"past_pass_2fp", "وُثِقْتُنَّ"}, {"past_pass_2fs", "وُثِقْتِ"}, {"past_pass_2mp", "وُثِقْتُمْ"}, {"past_pass_2ms", "وُثِقْتَ"}, {"past_pass_3fd", "وُثِقَتَا"}, {"past_pass_3fp", "وُثِقْنَ"}, {"past_pass_3fs", "وُثِقَتْ"}, {"past_pass_3md", "وُثِقَا"}, {"past_pass_3mp", "وُثِقُوا"}, {"past_pass_3ms", "وُثِقَ"}, }, }, { label = "أَفْعَلَ (p.273، الوزن الرابع)", root = "فعل", wazn = "أفعل", pass = true, forms = { {"imp_2d", "أَفْعِلَا"}, {"imp_2fp", "أَفْعِلْنَ"}, {"imp_2fs", "أَفْعِلِي"}, {"imp_2mp", "أَفْعِلُوا"}, {"imp_2ms", "أَفْعِلْ"}, {"ind_1p", "نُفْعِلُ"}, {"ind_1s", "أُفْعِلُ"}, {"ind_2d", "تُفْعِلَانِ"}, {"ind_2fp", "تُفْعِلْنَ"}, {"ind_2fs", "تُفْعِلِينَ"}, {"ind_2mp", "تُفْعِلُونَ"}, {"ind_2ms", "تُفْعِلُ"}, {"ind_3fd", "تُفْعِلَانِ"}, {"ind_3fp", "يُفْعِلْنَ"}, {"ind_3fs", "تُفْعِلُ"}, {"ind_3md", "يُفْعِلَانِ"}, {"ind_3mp", "يُفْعِلُونَ"}, {"ind_3ms", "يُفْعِلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "أَفْعَلْنَا"}, {"past_1s", "أَفْعَلْتُ"}, {"past_2d", "أَفْعَلْتُمَا"}, {"past_2fp", "أَفْعَلْتُنَّ"}, {"past_2fs", "أَفْعَلْتِ"}, {"past_2mp", "أَفْعَلْتُمْ"}, {"past_2ms", "أَفْعَلْتَ"}, {"past_3fd", "أَفْعَلَتَا"}, {"past_3fp", "أَفْعَلْنَ"}, {"past_3fs", "أَفْعَلَتْ"}, {"past_3md", "أَفْعَلَا"}, {"past_3mp", "أَفْعَلُوا"}, {"past_3ms", "أَفْعَلَ"}, {"past_pass_1p", "أُفْعِلْنَا"}, {"past_pass_1s", "أُفْعِلْتُ"}, {"past_pass_2d", "أُفْعِلْتُمَا"}, {"past_pass_2fp", "أُفْعِلْتُنَّ"}, {"past_pass_2fs", "أُفْعِلْتِ"}, {"past_pass_2mp", "أُفْعِلْتُمْ"}, {"past_pass_2ms", "أُفْعِلْتَ"}, {"past_pass_3fd", "أُفْعِلَتَا"}, {"past_pass_3fp", "أُفْعِلْنَ"}, {"past_pass_3fs", "أُفْعِلَتْ"}, {"past_pass_3md", "أُفْعِلَا"}, {"past_pass_3mp", "أُفْعِلُوا"}, {"past_pass_3ms", "أُفْعِلَ"}, }, }, { label = "وَجَلَ ـُ (p.136، معتل الفاء مثال)", root = "وجل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُوجُلَا"}, {"imp_2fp", "اُوجُلْنَ"}, {"imp_2fs", "اُوجُلِي"}, {"imp_2mp", "اُوجُلُوا"}, {"imp_2ms", "اُوجُلْ"}, {"ind_1p", "نَوْجُلُ"}, {"ind_1s", "أَوْجُلُ"}, {"ind_2d", "تَوْجُلَانِ"}, {"ind_2fp", "تَوْجُلْنَ"}, {"ind_2fs", "تَوْجُلِينَ"}, {"ind_2mp", "تَوْجُلُونَ"}, {"ind_2ms", "تَوْجُلُ"}, {"ind_3fd", "تَوْجُلَانِ"}, {"ind_3fp", "يَوْجُلْنَ"}, {"ind_3fs", "تَوْجُلُ"}, {"ind_3md", "يَوْجُلَانِ"}, {"ind_3mp", "يَوْجُلُونَ"}, {"ind_3ms", "يَوْجُلُ"}, {"ind_pass_1p", "نُوجَلُ"}, {"ind_pass_1s", "أُوجَلُ"}, {"ind_pass_2d", "تُوجَلَانِ"}, {"ind_pass_2fp", "تُوجَلْنَ"}, {"ind_pass_2fs", "تُوجَلِينَ"}, {"ind_pass_2mp", "تُوجَلُونَ"}, {"ind_pass_2ms", "تُوجَلُ"}, {"ind_pass_3fd", "تُوجَلَانِ"}, {"ind_pass_3fp", "يُوجَلْنَ"}, {"ind_pass_3fs", "تُوجَلُ"}, {"ind_pass_3md", "يُوجَلَانِ"}, {"ind_pass_3mp", "يُوجَلُونَ"}, {"ind_pass_3ms", "يُوجَلُ"}, {"past_1p", "وَجَلْنَا"}, {"past_1s", "وَجَلْتُ"}, {"past_2d", "وَجَلْتُمَا"}, {"past_2fp", "وَجَلْتُنَّ"}, {"past_2fs", "وَجَلْتِ"}, {"past_2mp", "وَجَلْتُمْ"}, {"past_2ms", "وَجَلْتَ"}, {"past_3fd", "وَجَلَتَا"}, {"past_3fp", "وَجَلْنَ"}, {"past_3fs", "وَجَلَتْ"}, {"past_3md", "وَجَلَا"}, {"past_3mp", "وَجَلُوا"}, {"past_3ms", "وَجَلَ"}, {"past_pass_1p", "وُجِلْنَا"}, {"past_pass_1s", "وُجِلْتُ"}, {"past_pass_2d", "وُجِلْتُمَا"}, {"past_pass_2fp", "وُجِلْتُنَّ"}, {"past_pass_2fs", "وُجِلْتِ"}, {"past_pass_2mp", "وُجِلْتُمْ"}, {"past_pass_2ms", "وُجِلْتَ"}, {"past_pass_3fd", "وُجِلَتَا"}, {"past_pass_3fp", "وُجِلْنَ"}, {"past_pass_3fs", "وُجِلَتْ"}, {"past_pass_3md", "وُجِلَا"}, {"past_pass_3mp", "وُجِلُوا"}, {"past_pass_3ms", "وُجِلَ"}, }, }, { label = "أَثَرَ ـِ (p.151، صحيح مهموز الفاء)", root = "أثر", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِئْثِرَا"}, {"imp_2fp", "اِئْثِرْنَ"}, {"imp_2fs", "اِئْثِرِي"}, {"imp_2mp", "اِئْثِرُوا"}, {"imp_2ms", "اِئْثِرْ"}, {"ind_1p", "نَأْثِرُ"}, {"ind_1s", "آثِرُ"}, {"ind_2d", "تَأْثِرَانِ"}, {"ind_2fp", "تَأْثِرْنَ"}, {"ind_2fs", "تَأْثِرِينَ"}, {"ind_2mp", "تَأْثِرُونَ"}, {"ind_2ms", "تَأْثِرُ"}, {"ind_3fd", "تَأْثِرَانِ"}, {"ind_3fp", "يَأْثِرْنَ"}, {"ind_3fs", "تَأْثِرُ"}, {"ind_3md", "يَأْثِرَانِ"}, {"ind_3mp", "يَأْثِرُونَ"}, {"ind_3ms", "يَأْثِرُ"}, {"ind_pass_1p", "نُؤْثَرُ"}, {"ind_pass_1s", "أُوثَرُ"}, {"ind_pass_2d", "تُؤْثَرَانِ"}, {"ind_pass_2fp", "تُؤْثَرْنَ"}, {"ind_pass_2fs", "تُؤْثَرِينَ"}, {"ind_pass_2mp", "تُؤْثَرُونَ"}, {"ind_pass_2ms", "تُؤْثَرُ"}, {"ind_pass_3fd", "تُؤْثَرَانِ"}, {"ind_pass_3fp", "يُؤْثَرْنَ"}, {"ind_pass_3fs", "تُؤْثَرُ"}, {"ind_pass_3md", "يُؤْثَرَانِ"}, {"ind_pass_3mp", "يُؤْثَرُونَ"}, {"ind_pass_3ms", "يُؤْثَرُ"}, {"past_1p", "أَثَرْنَا"}, {"past_1s", "أَثَرْتُ"}, {"past_2d", "أَثَرْتُمَا"}, {"past_2fp", "أَثَرْتُنَّ"}, {"past_2fs", "أَثَرْتِ"}, {"past_2mp", "أَثَرْتُمْ"}, {"past_2ms", "أَثَرْتَ"}, {"past_3fd", "أَثَرَتَا"}, {"past_3fp", "أَثَرْنَ"}, {"past_3fs", "أَثَرَتْ"}, {"past_3md", "أَثَرَا"}, {"past_3mp", "أَثَرُوا"}, {"past_3ms", "أَثَرَ"}, {"past_pass_1p", "أُثِرْنَا"}, {"past_pass_1s", "أُثِرْتُ"}, {"past_pass_2d", "أُثِرْتُمَا"}, {"past_pass_2fp", "أُثِرْتُنَّ"}, {"past_pass_2fs", "أُثِرْتِ"}, {"past_pass_2mp", "أُثِرْتُمْ"}, {"past_pass_2ms", "أُثِرْتَ"}, {"past_pass_3fd", "أُثِرَتَا"}, {"past_pass_3fp", "أُثِرْنَ"}, {"past_pass_3fs", "أُثِرَتْ"}, {"past_pass_3md", "أُثِرَا"}, {"past_pass_3mp", "أُثِرُوا"}, {"past_pass_3ms", "أُثِرَ"}, }, }, { label = "بَدَأَ ـَ (p.178، صحيح مهموز اللام)", root = "بدأ", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِبْدَآ"}, {"imp_2fp", "اِبْدَأْنَ"}, {"imp_2fs", "اِبْدَئِي"}, {"imp_2mp", "اِبْدَؤُوا"}, {"imp_2ms", "اِبْدَأْ"}, {"ind_1p", "نَبْدَأُ"}, {"ind_1s", "أَبْدَأُ"}, {"ind_2d", "تَبْدَآنِ"}, {"ind_2fp", "تَبْدَأْنَ"}, {"ind_2fs", "تَبْدَئِينَ"}, {"ind_2mp", "تَبْدَؤُونَ"}, {"ind_2ms", "تَبْدَأُ"}, {"ind_3fd", "تَبْدَآنِ"}, {"ind_3fp", "يَبْدَأْنَ"}, {"ind_3fs", "تَبْدَأُ"}, {"ind_3md", "يَبْدَآنِ"}, {"ind_3mp", "يَبْدَؤُونَ"}, {"ind_3ms", "يَبْدَأُ"}, {"ind_pass_1p", "نُبْدَأُ"}, {"ind_pass_1s", "أُبْدَأُ"}, {"ind_pass_2d", "تُبْدَآنِ"}, {"ind_pass_2fp", "تُبْدَأْنَ"}, {"ind_pass_2fs", "تُبْدَئِينَ"}, {"ind_pass_2mp", "تُبْدَؤُونَ"}, {"ind_pass_2ms", "تُبْدَأُ"}, {"ind_pass_3fd", "تُبْدَآنِ"}, {"ind_pass_3fp", "يُبْدَأْنَ"}, {"ind_pass_3fs", "تُبْدَأُ"}, {"ind_pass_3md", "يُبْدَآنِ"}, {"ind_pass_3mp", "يُبْدَؤُونَ"}, {"ind_pass_3ms", "يُبْدَأُ"}, {"past_1p", "بَدَأْنَا"}, {"past_1s", "بَدَأْتُ"}, {"past_2d", "بَدَأْتُمَا"}, {"past_2fp", "بَدَأْتُنَّ"}, {"past_2fs", "بَدَأْتِ"}, {"past_2mp", "بَدَأْتُمْ"}, {"past_2ms", "بَدَأْتَ"}, {"past_3fd", "بَدَأَتَا"}, {"past_3fp", "بَدَأْنَ"}, {"past_3fs", "بَدَأَتْ"}, {"past_3md", "بَدَآ"}, {"past_3mp", "بَدَؤُوا"}, {"past_3ms", "بَدَأَ"}, {"past_pass_1p", "بُدِئْنَا"}, {"past_pass_1s", "بُدِئْتُ"}, {"past_pass_2d", "بُدِئْتُمَا"}, {"past_pass_2fp", "بُدِئْتُنَّ"}, {"past_pass_2fs", "بُدِئْتِ"}, {"past_pass_2mp", "بُدِئْتُمْ"}, {"past_pass_2ms", "بُدِئْتَ"}, {"past_pass_3fd", "بُدِئَتَا"}, {"past_pass_3fp", "بُدِئْنَ"}, {"past_pass_3fs", "بُدِئَتْ"}, {"past_pass_3md", "بُدِئَا"}, {"past_pass_3mp", "بُدِئُوا"}, {"past_pass_3ms", "بُدِئَ"}, }, }, { label = "حَسِبَ ـِ (p.234، صحيح سالم)", root = "حسب", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "اِحْسِبَا"}, {"imp_2fp", "اِحْسِبْنَ"}, {"imp_2fs", "اِحْسِبِي"}, {"imp_2mp", "اِحْسِبُوا"}, {"imp_2ms", "اِحْسِبْ"}, {"ind_1p", "نَحْسِبُ"}, {"ind_1s", "أَحْسِبُ"}, {"ind_2d", "تَحْسِبَانِ"}, {"ind_2fp", "تَحْسِبْنَ"}, {"ind_2fs", "تَحْسِبِينَ"}, {"ind_2mp", "تَحْسِبُونَ"}, {"ind_2ms", "تَحْسِبُ"}, {"ind_3fd", "تَحْسِبَانِ"}, {"ind_3fp", "يَحْسِبْنَ"}, {"ind_3fs", "تَحْسِبُ"}, {"ind_3md", "يَحْسِبَانِ"}, {"ind_3mp", "يَحْسِبُونَ"}, {"ind_3ms", "يَحْسِبُ"}, {"ind_pass_1p", "نُحْسَبُ"}, {"ind_pass_1s", "أُحْسَبُ"}, {"ind_pass_2d", "تُحْسَبَانِ"}, {"ind_pass_2fp", "تُحْسَبْنَ"}, {"ind_pass_2fs", "تُحْسَبِينَ"}, {"ind_pass_2mp", "تُحْسَبُونَ"}, {"ind_pass_2ms", "تُحْسَبُ"}, {"ind_pass_3fd", "تُحْسَبَانِ"}, {"ind_pass_3fp", "يُحْسَبْنَ"}, {"ind_pass_3fs", "تُحْسَبُ"}, {"ind_pass_3md", "يُحْسَبَانِ"}, {"ind_pass_3mp", "يُحْسَبُونَ"}, {"ind_pass_3ms", "يُحْسَبُ"}, {"past_1p", "حَسِبْنَا"}, {"past_1s", "حَسِبْتُ"}, {"past_2d", "حَسِبْتُمَا"}, {"past_2fp", "حَسِبْتُنَّ"}, {"past_2fs", "حَسِبْتِ"}, {"past_2mp", "حَسِبْتُمْ"}, {"past_2ms", "حَسِبْتَ"}, {"past_3fd", "حَسِبَتَا"}, {"past_3fp", "حَسِبْنَ"}, {"past_3fs", "حَسِبَتْ"}, {"past_3md", "حَسِبَا"}, {"past_3mp", "حَسِبُوا"}, {"past_3ms", "حَسِبَ"}, {"past_pass_1p", "حُسِبْنَا"}, {"past_pass_1s", "حُسِبْتُ"}, {"past_pass_2d", "حُسِبْتُمَا"}, {"past_pass_2fp", "حُسِبْتُنَّ"}, {"past_pass_2fs", "حُسِبْتِ"}, {"past_pass_2mp", "حُسِبْتُمْ"}, {"past_pass_2ms", "حُسِبْتَ"}, {"past_pass_3fd", "حُسِبَتَا"}, {"past_pass_3fp", "حُسِبْنَ"}, {"past_pass_3fs", "حُسِبَتْ"}, {"past_pass_3md", "حُسِبَا"}, {"past_pass_3mp", "حُسِبُوا"}, {"past_pass_3ms", "حُسِبَ"}, }, }, { label = "اِدَّارَأَ (p.312، تفاعل مدغم مهموز اللام)", root = "درأ", wazn = "تفاعل", reduced = true, forms = { {"imp_2d", "اِدَّارَآ"}, {"imp_2fp", "اِدَّارَأْنَ"}, {"imp_2fs", "اِدَّارَئِي"}, {"imp_2mp", "اِدَّارَؤُوا"}, {"imp_2ms", "اِدَّارَأْ"}, {"ind_1p", "نَدَّارَأُ"}, {"ind_1s", "أَدَّارَأُ"}, {"ind_2d", "تَدَّارَآنِ"}, {"ind_2fp", "تَدَّارَأْنَ"}, {"ind_2fs", "تَدَّارَئِينَ"}, {"ind_2mp", "تَدَّارَؤُونَ"}, {"ind_2ms", "تَدَّارَأُ"}, {"ind_3fd", "تَدَّارَآنِ"}, {"ind_3fp", "يَدَّارَأْنَ"}, {"ind_3fs", "تَدَّارَأُ"}, {"ind_3md", "يَدَّارَآنِ"}, {"ind_3mp", "يَدَّارَؤُونَ"}, {"ind_3ms", "يَدَّارَأُ"}, {"past_1p", "اِدَّارَأْنَا"}, {"past_1s", "اِدَّارَأْتُ"}, {"past_2d", "اِدَّارَأْتُمَا"}, {"past_2fp", "اِدَّارَأْتُنَّ"}, {"past_2fs", "اِدَّارَأْتِ"}, {"past_2mp", "اِدَّارَأْتُمْ"}, {"past_2ms", "اِدَّارَأْتَ"}, {"past_3fd", "اِدَّارَأَتَا"}, {"past_3fp", "اِدَّارَأْنَ"}, {"past_3fs", "اِدَّارَأَتْ"}, {"past_3md", "اِدَّارَآ"}, {"past_3mp", "اِدَّارَؤُوا"}, {"past_3ms", "اِدَّارَأَ"}, }, }, } 2mbozp1wzsktwpd39fg3620yjbu4wtf 1099205 1099196 2026-08-22T21:44:46Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099205 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 4 من 5. return { { label = "سَهُوَ ـُ (p.204، ناقص واوي)", root = "سهو", wazn = "فعُل يفعُل", forms = { {"imp_2d", "اُسْهُوَا"}, {"imp_2fp", "اُسْهُونَ"}, {"imp_2fs", "اُسْهُوِي"}, {"imp_2mp", "اُسْهُوا"}, {"imp_2ms", "اُسْهُ"}, {"ind_1p", "نَسْهُو"}, {"ind_1s", "أَسْهُو"}, {"ind_2d", "تَسْهُوَانِ"}, {"ind_2fp", "تَسْهُونَ"}, {"ind_2fs", "تَسْهُوِينَ"}, {"ind_2mp", "تَسْهُونَ"}, {"ind_2ms", "تَسْهُو"}, {"ind_3fd", "تَسْهُوَانِ"}, {"ind_3fp", "يَسْهُونَ"}, {"ind_3fs", "تَسْهُو"}, {"ind_3md", "يَسْهُوَانِ"}, {"ind_3mp", "يَسْهُونَ"}, {"ind_3ms", "يَسْهُو"}, {"past_1p", "سَهُونَا"}, {"past_1s", "سَهُوتُ"}, {"past_2d", "سَهُوتُمَا"}, {"past_2fp", "سَهُوتُنَّ"}, {"past_2fs", "سَهُوتِ"}, {"past_2mp", "سَهُوتُمْ"}, {"past_2ms", "سَهُوتَ"}, {"past_3fd", "سَهُوَتَا"}, {"past_3fp", "سَهُونَ"}, {"past_3fs", "سَهُوَتْ"}, {"past_3md", "سَهُوَا"}, {"past_3mp", "سَهُوا"}, {"past_3ms", "سَهُوَ"}, }, }, { label = "عَلِمَ ـَ (p.206، صحيح سالم)", root = "علم", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِعْلَمَا"}, {"imp_2fp", "اِعْلَمْنَ"}, {"imp_2fs", "اِعْلَمِي"}, {"imp_2mp", "اِعْلَمُوا"}, {"imp_2ms", "اِعْلَمْ"}, {"ind_1p", "نَعْلَمُ"}, {"ind_1s", "أَعْلَمُ"}, {"ind_2d", "تَعْلَمَانِ"}, {"ind_2fp", "تَعْلَمْنَ"}, {"ind_2fs", "تَعْلَمِينَ"}, {"ind_2mp", "تَعْلَمُونَ"}, {"ind_2ms", "تَعْلَمُ"}, {"ind_3fd", "تَعْلَمَانِ"}, {"ind_3fp", "يَعْلَمْنَ"}, {"ind_3fs", "تَعْلَمُ"}, {"ind_3md", "يَعْلَمَانِ"}, {"ind_3mp", "يَعْلَمُونَ"}, {"ind_3ms", "يَعْلَمُ"}, {"ind_pass_1p", "نُعْلَمُ"}, {"ind_pass_1s", "أُعْلَمُ"}, {"ind_pass_2d", "تُعْلَمَانِ"}, {"ind_pass_2fp", "تُعْلَمْنَ"}, {"ind_pass_2fs", "تُعْلَمِينَ"}, {"ind_pass_2mp", "تُعْلَمُونَ"}, {"ind_pass_2ms", "تُعْلَمُ"}, {"ind_pass_3fd", "تُعْلَمَانِ"}, {"ind_pass_3fp", "يُعْلَمْنَ"}, {"ind_pass_3fs", "تُعْلَمُ"}, {"ind_pass_3md", "يُعْلَمَانِ"}, {"ind_pass_3mp", "يُعْلَمُونَ"}, {"ind_pass_3ms", "يُعْلَمُ"}, {"past_1p", "عَلِمْنَا"}, {"past_1s", "عَلِمْتُ"}, {"past_2d", "عَلِمْتُمَا"}, {"past_2fp", "عَلِمْتُنَّ"}, {"past_2fs", "عَلِمْتِ"}, {"past_2mp", "عَلِمْتُمْ"}, {"past_2ms", "عَلِمْتَ"}, {"past_3fd", "عَلِمَتَا"}, {"past_3fp", "عَلِمْنَ"}, {"past_3fs", "عَلِمَتْ"}, {"past_3md", "عَلِمَا"}, {"past_3mp", "عَلِمُوا"}, {"past_3ms", "عَلِمَ"}, {"past_pass_1p", "عُلِمْنَا"}, {"past_pass_1s", "عُلِمْتُ"}, {"past_pass_2d", "عُلِمْتُمَا"}, {"past_pass_2fp", "عُلِمْتُنَّ"}, {"past_pass_2fs", "عُلِمْتِ"}, {"past_pass_2mp", "عُلِمْتُمْ"}, {"past_pass_2ms", "عُلِمْتَ"}, {"past_pass_3fd", "عُلِمَتَا"}, {"past_pass_3fp", "عُلِمْنَ"}, {"past_pass_3fs", "عُلِمَتْ"}, {"past_pass_3md", "عُلِمَا"}, {"past_pass_3mp", "عُلِمُوا"}, {"past_pass_3ms", "عُلِمَ"}, }, }, { label = "ظَلَّ ـَ (p.210، مضاعف)", root = "ظلل", wazn = "فعِل يفعَل", forms = { {"imp_2d", "ظَلَّا"}, {"imp_2fp", "اِظْلَلْنَ"}, {"imp_2fs", "ظَلِّي"}, {"imp_2mp", "ظَلُّوا"}, {"imp_2ms", "ظَلَّ"}, {"ind_1p", "نَظَلُّ"}, {"ind_1s", "أَظَلُّ"}, {"ind_2d", "تَظَلَّانِ"}, {"ind_2fp", "تَظْلَلْنَ"}, {"ind_2fs", "تَظَلِّينَ"}, {"ind_2mp", "تَظَلُّونَ"}, {"ind_2ms", "تَظَلُّ"}, {"ind_3fd", "تَظَلَّانِ"}, {"ind_3fp", "يَظْلَلْنَ"}, {"ind_3fs", "تَظَلُّ"}, {"ind_3md", "يَظَلَّانِ"}, {"ind_3mp", "يَظَلُّونَ"}, {"ind_3ms", "يَظَلُّ"}, {"past_1p", "ظَلِلْنَا"}, {"past_1s", "ظَلِلْتُ"}, {"past_2d", "ظَلِلْتُمَا"}, {"past_2fp", "ظَلِلْتُنَّ"}, {"past_2fs", "ظَلِلْتِ"}, {"past_2mp", "ظَلِلْتُمْ"}, {"past_2ms", "ظَلِلْتَ"}, {"past_3fd", "ظَلَّتَا"}, {"past_3fp", "ظَلِلْنَ"}, {"past_3fs", "ظَلَّتْ"}, {"past_3md", "ظَلَّا"}, {"past_3mp", "ظَلُّوا"}, {"past_3ms", "ظَلَّ"}, }, }, { label = "أَلِفَ ـَ (p.213، مهموز الفاء)", root = "ألف", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِئْلَفَا"}, {"imp_2fp", "اِئْلَفْنَ"}, {"imp_2fs", "اِئْلَفِي"}, {"imp_2mp", "اِئْلَفُوا"}, {"imp_2ms", "اِئْلَفْ"}, {"ind_1p", "نَأْلَفُ"}, {"ind_1s", "آلَفُ"}, {"ind_2d", "تَأْلَفَانِ"}, {"ind_2fp", "تَأْلَفْنَ"}, {"ind_2fs", "تَأْلَفِينَ"}, {"ind_2mp", "تَأْلَفُونَ"}, {"ind_2ms", "تَأْلَفُ"}, {"ind_3fd", "تَأْلَفَانِ"}, {"ind_3fp", "يَأْلَفْنَ"}, {"ind_3fs", "تَأْلَفُ"}, {"ind_3md", "يَأْلَفَانِ"}, {"ind_3mp", "يَأْلَفُونَ"}, {"ind_3ms", "يَأْلَفُ"}, {"ind_pass_1p", "نُؤْلَفُ"}, {"ind_pass_1s", "أُولَفُ"}, {"ind_pass_2d", "تُؤْلَفَانِ"}, {"ind_pass_2fp", "تُؤْلَفْنَ"}, {"ind_pass_2fs", "تُؤْلَفِينَ"}, {"ind_pass_2mp", "تُؤْلَفُونَ"}, {"ind_pass_2ms", "تُؤْلَفُ"}, {"ind_pass_3fd", "تُؤْلَفَانِ"}, {"ind_pass_3fp", "يُؤْلَفْنَ"}, {"ind_pass_3fs", "تُؤْلَفُ"}, {"ind_pass_3md", "يُؤْلَفَانِ"}, {"ind_pass_3mp", "يُؤْلَفُونَ"}, {"ind_pass_3ms", "يُؤْلَفُ"}, {"past_1p", "أَلِفْنَا"}, {"past_1s", "أَلِفْتُ"}, {"past_2d", "أَلِفْتُمَا"}, {"past_2fp", "أَلِفْتُنَّ"}, {"past_2fs", "أَلِفْتِ"}, {"past_2mp", "أَلِفْتُمْ"}, {"past_2ms", "أَلِفْتَ"}, {"past_3fd", "أَلِفَتَا"}, {"past_3fp", "أَلِفْنَ"}, {"past_3fs", "أَلِفَتْ"}, {"past_3md", "أَلِفَا"}, {"past_3mp", "أَلِفُوا"}, {"past_3ms", "أَلِفَ"}, {"past_pass_1p", "أُلِفْنَا"}, {"past_pass_1s", "أُلِفْتُ"}, {"past_pass_2d", "أُلِفْتُمَا"}, {"past_pass_2fp", "أُلِفْتُنَّ"}, {"past_pass_2fs", "أُلِفْتِ"}, {"past_pass_2mp", "أُلِفْتُمْ"}, {"past_pass_2ms", "أُلِفْتَ"}, {"past_pass_3fd", "أُلِفَتَا"}, {"past_pass_3fp", "أُلِفْنَ"}, {"past_pass_3fs", "أُلِفَتْ"}, {"past_pass_3md", "أُلِفَا"}, {"past_pass_3mp", "أُلِفُوا"}, {"past_pass_3ms", "أُلِفَ"}, }, }, { label = "بَئِسَ ـَ (p.216، مهموز العين)", root = "بأس", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِبْأَسَا"}, {"imp_2fp", "اِبْأَسْنَ"}, {"imp_2fs", "اِبْأَسِي"}, {"imp_2mp", "اِبْأَسُوا"}, {"imp_2ms", "اِبْأَسْ"}, {"ind_1p", "نَبْأَسُ"}, {"ind_1s", "أَبْأَسُ"}, {"ind_2d", "تَبْأَسَانِ"}, {"ind_2fp", "تَبْأَسْنَ"}, {"ind_2fs", "تَبْأَسِينَ"}, {"ind_2mp", "تَبْأَسُونَ"}, {"ind_2ms", "تَبْأَسُ"}, {"ind_3fd", "تَبْأَسَانِ"}, {"ind_3fp", "يَبْأَسْنَ"}, {"ind_3fs", "تَبْأَسُ"}, {"ind_3md", "يَبْأَسَانِ"}, {"ind_3mp", "يَبْأَسُونَ"}, {"ind_3ms", "يَبْأَسُ"}, {"past_1p", "بَئِسْنَا"}, {"past_1s", "بَئِسْتُ"}, {"past_2d", "بَئِسْتُمَا"}, {"past_2fp", "بَئِسْتُنَّ"}, {"past_2fs", "بَئِسْتِ"}, {"past_2mp", "بَئِسْتُمْ"}, {"past_2ms", "بَئِسْتَ"}, {"past_3fd", "بَئِسَتَا"}, {"past_3fp", "بَئِسْنَ"}, {"past_3fs", "بَئِسَتْ"}, {"past_3md", "بَئِسَا"}, {"past_3mp", "بَئِسُوا"}, {"past_3ms", "بَئِسَ"}, }, }, { label = "خَطِئَ ـَ (p.219، مهموز اللام)", root = "خطأ", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِخْطَآ"}, {"imp_2fp", "اِخْطَأْنَ"}, {"imp_2fs", "اِخْطَئِي"}, {"imp_2mp", "اِخْطَؤُوا"}, {"imp_2ms", "اِخْطَأْ"}, {"ind_1p", "نَخْطَأُ"}, {"ind_1s", "أَخْطَأُ"}, {"ind_2d", "تَخْطَآنِ"}, {"ind_2fp", "تَخْطَأْنَ"}, {"ind_2fs", "تَخْطَئِينَ"}, {"ind_2mp", "تَخْطَؤُونَ"}, {"ind_2ms", "تَخْطَأُ"}, {"ind_3fd", "تَخْطَآنِ"}, {"ind_3fp", "يَخْطَأْنَ"}, {"ind_3fs", "تَخْطَأُ"}, {"ind_3md", "يَخْطَآنِ"}, {"ind_3mp", "يَخْطَؤُونَ"}, {"ind_3ms", "يَخْطَأُ"}, {"ind_pass_1p", "نُخْطَأُ"}, {"ind_pass_1s", "أُخْطَأُ"}, {"ind_pass_2d", "تُخْطَآنِ"}, {"ind_pass_2fp", "تُخْطَأْنَ"}, {"ind_pass_2fs", "تُخْطَئِينَ"}, {"ind_pass_2mp", "تُخْطَؤُونَ"}, {"ind_pass_2ms", "تُخْطَأُ"}, {"ind_pass_3fd", "تُخْطَآنِ"}, {"ind_pass_3fp", "يُخْطَأْنَ"}, {"ind_pass_3fs", "تُخْطَأُ"}, {"ind_pass_3md", "يُخْطَآنِ"}, {"ind_pass_3mp", "يُخْطَؤُونَ"}, {"ind_pass_3ms", "يُخْطَأُ"}, {"past_1p", "خَطِئْنَا"}, {"past_1s", "خَطِئْتُ"}, {"past_2d", "خَطِئْتُمَا"}, {"past_2fp", "خَطِئْتُنَّ"}, {"past_2fs", "خَطِئْتِ"}, {"past_2mp", "خَطِئْتُمْ"}, {"past_2ms", "خَطِئْتَ"}, {"past_3fd", "خَطِئَتَا"}, {"past_3fp", "خَطِئْنَ"}, {"past_3fs", "خَطِئَتْ"}, {"past_3md", "خَطِئَا"}, {"past_3mp", "خَطِئُوا"}, {"past_3ms", "خَطِئَ"}, {"past_pass_1p", "خُطِئْنَا"}, {"past_pass_1s", "خُطِئْتُ"}, {"past_pass_2d", "خُطِئْتُمَا"}, {"past_pass_2fp", "خُطِئْتُنَّ"}, {"past_pass_2fs", "خُطِئْتِ"}, {"past_pass_2mp", "خُطِئْتُمْ"}, {"past_pass_2ms", "خُطِئْتَ"}, {"past_pass_3fd", "خُطِئَتَا"}, {"past_pass_3fp", "خُطِئْنَ"}, {"past_pass_3fs", "خُطِئَتْ"}, {"past_pass_3md", "خُطِئَا"}, {"past_pass_3mp", "خُطِئُوا"}, {"past_pass_3ms", "خُطِئَ"}, }, }, { label = "يَقِظَ ـَ (p.222، معتل الفاء مثال)", root = "يقظ", wazn = "فعِل يفعَل", forms = { {"imp_2d", "اِيقَظَا"}, {"imp_2fp", "اِيقَظْنَ"}, {"imp_2fs", "اِيقَظِي"}, {"imp_2mp", "اِيقَظُوا"}, {"imp_2ms", "اِيقَظْ"}, {"ind_1p", "نَيْقَظُ"}, {"ind_1s", "أَيْقَظُ"}, {"ind_2d", "تَيْقَظَانِ"}, {"ind_2fp", "تَيْقَظْنَ"}, {"ind_2fs", "تَيْقَظِينَ"}, {"ind_2mp", "تَيْقَظُونَ"}, {"ind_2ms", "تَيْقَظُ"}, {"ind_3fd", "تَيْقَظَانِ"}, {"ind_3fp", "يَيْقَظْنَ"}, {"ind_3fs", "تَيْقَظُ"}, {"ind_3md", "يَيْقَظَانِ"}, {"ind_3mp", "يَيْقَظُونَ"}, {"ind_3ms", "يَيْقَظُ"}, {"past_1p", "يَقِظْنَا"}, {"past_1s", "يَقِظْتُ"}, {"past_2d", "يَقِظْتُمَا"}, {"past_2fp", "يَقِظْتُنَّ"}, {"past_2fs", "يَقِظْتِ"}, {"past_2mp", "يَقِظْتُمْ"}, {"past_2ms", "يَقِظْتَ"}, {"past_3fd", "يَقِظَتَا"}, {"past_3fp", "يَقِظْنَ"}, {"past_3fs", "يَقِظَتْ"}, {"past_3md", "يَقِظَا"}, {"past_3mp", "يَقِظُوا"}, {"past_3ms", "يَقِظَ"}, }, }, { label = "وَنِيَ ـَ (p.230، لفيف مفروق)", root = "وني", wazn = "فعِل يفعَل", pass = true, forms = { {"imp_2d", "اِوْنَيَا"}, {"imp_2fp", "اِوْنَيْنَ"}, {"imp_2fs", "اِوْنَيْ"}, {"imp_2mp", "اِوْنَوْا"}, {"imp_2ms", "اِوْنَ"}, {"ind_1p", "نَوْنَى"}, {"ind_1s", "أَوْنَى"}, {"ind_2d", "تَوْنَيَانِ"}, {"ind_2fp", "تَوْنَيْنَ"}, {"ind_2fs", "تَوْنَيْنَ"}, {"ind_2mp", "تَوْنَوْنَ"}, {"ind_2ms", "تَوْنَى"}, {"ind_3fd", "تَوْنَيَانِ"}, {"ind_3fp", "يَوْنَيْنَ"}, {"ind_3fs", "تَوْنَى"}, {"ind_3md", "يَوْنَيَانِ"}, {"ind_3mp", "يَوْنَوْنَ"}, {"ind_3ms", "يَوْنَى"}, {"ind_pass_1p", "نُونَى"}, {"ind_pass_1s", "أُونَى"}, {"ind_pass_2d", "تُونَيَانِ"}, {"ind_pass_2fp", "تُونَيْنَ"}, {"ind_pass_2fs", "تُونَيْنَ"}, {"ind_pass_2mp", "تُونَوْنَ"}, {"ind_pass_2ms", "تُونَى"}, {"ind_pass_3fd", "تُونَيَانِ"}, {"ind_pass_3fp", "يُونَيْنَ"}, {"ind_pass_3fs", "تُونَى"}, {"ind_pass_3md", "يُونَيَانِ"}, {"ind_pass_3mp", "يُونَوْنَ"}, {"ind_pass_3ms", "يُونَى"}, {"past_1p", "وَنِينَا"}, {"past_1s", "وَنِيتُ"}, {"past_2d", "وَنِيتُمَا"}, {"past_2fp", "وَنِيتُنَّ"}, {"past_2fs", "وَنِيتِ"}, {"past_2mp", "وَنِيتُمْ"}, {"past_2ms", "وَنِيتَ"}, {"past_3fd", "وَنِيَتَا"}, {"past_3fp", "وَنِينَ"}, {"past_3fs", "وَنِيَتْ"}, {"past_3md", "وَنِيَا"}, {"past_3mp", "وَنُوا"}, {"past_3ms", "وَنِيَ"}, {"past_pass_1p", "وُنِينَا"}, {"past_pass_1s", "وُنِيتُ"}, {"past_pass_2d", "وُنِيتُمَا"}, {"past_pass_2fp", "وُنِيتُنَّ"}, {"past_pass_2fs", "وُنِيتِ"}, {"past_pass_2mp", "وُنِيتُمْ"}, {"past_pass_2ms", "وُنِيتَ"}, {"past_pass_3fd", "وُنِيَتَا"}, {"past_pass_3fp", "وُنِينَ"}, {"past_pass_3fs", "وُنِيَتْ"}, {"past_pass_3md", "وُنِيَا"}, {"past_pass_3mp", "وُنُوا"}, {"past_pass_3ms", "وُنِيَ"}, }, }, { label = "وَثِقَ ـِ (p.236، معتل الفاء مثال)", root = "وثق", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "ثِقَا"}, {"imp_2fp", "ثِقْنَ"}, {"imp_2fs", "ثِقِي"}, {"imp_2mp", "ثِقُوا"}, {"imp_2ms", "ثِقْ"}, {"ind_1p", "نَثِقُ"}, {"ind_1s", "أَثِقُ"}, {"ind_2d", "تَثِقَانِ"}, {"ind_2fp", "تَثِقْنَ"}, {"ind_2fs", "تَثِقِينَ"}, {"ind_2mp", "تَثِقُونَ"}, {"ind_2ms", "تَثِقُ"}, {"ind_3fd", "تَثِقَانِ"}, {"ind_3fp", "يَثِقْنَ"}, {"ind_3fs", "تَثِقُ"}, {"ind_3md", "يَثِقَانِ"}, {"ind_3mp", "يَثِقُونَ"}, {"ind_3ms", "يَثِقُ"}, {"ind_pass_1p", "نُوثَقُ"}, {"ind_pass_1s", "أُوثَقُ"}, {"ind_pass_2d", "تُوثَقَانِ"}, {"ind_pass_2fp", "تُوثَقْنَ"}, {"ind_pass_2fs", "تُوثَقِينَ"}, {"ind_pass_2mp", "تُوثَقُونَ"}, {"ind_pass_2ms", "تُوثَقُ"}, {"ind_pass_3fd", "تُوثَقَانِ"}, {"ind_pass_3fp", "يُوثَقْنَ"}, {"ind_pass_3fs", "تُوثَقُ"}, {"ind_pass_3md", "يُوثَقَانِ"}, {"ind_pass_3mp", "يُوثَقُونَ"}, {"ind_pass_3ms", "يُوثَقُ"}, {"past_1p", "وَثِقْنَا"}, {"past_1s", "وَثِقْتُ"}, {"past_2d", "وَثِقْتُمَا"}, {"past_2fp", "وَثِقْتُنَّ"}, {"past_2fs", "وَثِقْتِ"}, {"past_2mp", "وَثِقْتُمْ"}, {"past_2ms", "وَثِقْتَ"}, {"past_3fd", "وَثِقَتَا"}, {"past_3fp", "وَثِقْنَ"}, {"past_3fs", "وَثِقَتْ"}, {"past_3md", "وَثِقَا"}, {"past_3mp", "وَثِقُوا"}, {"past_3ms", "وَثِقَ"}, {"past_pass_1p", "وُثِقْنَا"}, {"past_pass_1s", "وُثِقْتُ"}, {"past_pass_2d", "وُثِقْتُمَا"}, {"past_pass_2fp", "وُثِقْتُنَّ"}, {"past_pass_2fs", "وُثِقْتِ"}, {"past_pass_2mp", "وُثِقْتُمْ"}, {"past_pass_2ms", "وُثِقْتَ"}, {"past_pass_3fd", "وُثِقَتَا"}, {"past_pass_3fp", "وُثِقْنَ"}, {"past_pass_3fs", "وُثِقَتْ"}, {"past_pass_3md", "وُثِقَا"}, {"past_pass_3mp", "وُثِقُوا"}, {"past_pass_3ms", "وُثِقَ"}, }, }, { label = "أَفْعَلَ (p.273، الوزن الرابع)", root = "فعل", wazn = "أفعل", pass = true, forms = { {"imp_2d", "أَفْعِلَا"}, {"imp_2fp", "أَفْعِلْنَ"}, {"imp_2fs", "أَفْعِلِي"}, {"imp_2mp", "أَفْعِلُوا"}, {"imp_2ms", "أَفْعِلْ"}, {"ind_1p", "نُفْعِلُ"}, {"ind_1s", "أُفْعِلُ"}, {"ind_2d", "تُفْعِلَانِ"}, {"ind_2fp", "تُفْعِلْنَ"}, {"ind_2fs", "تُفْعِلِينَ"}, {"ind_2mp", "تُفْعِلُونَ"}, {"ind_2ms", "تُفْعِلُ"}, {"ind_3fd", "تُفْعِلَانِ"}, {"ind_3fp", "يُفْعِلْنَ"}, {"ind_3fs", "تُفْعِلُ"}, {"ind_3md", "يُفْعِلَانِ"}, {"ind_3mp", "يُفْعِلُونَ"}, {"ind_3ms", "يُفْعِلُ"}, {"ind_pass_1p", "نُفْعَلُ"}, {"ind_pass_1s", "أُفْعَلُ"}, {"ind_pass_2d", "تُفْعَلَانِ"}, {"ind_pass_2fp", "تُفْعَلْنَ"}, {"ind_pass_2fs", "تُفْعَلِينَ"}, {"ind_pass_2mp", "تُفْعَلُونَ"}, {"ind_pass_2ms", "تُفْعَلُ"}, {"ind_pass_3fd", "تُفْعَلَانِ"}, {"ind_pass_3fp", "يُفْعَلْنَ"}, {"ind_pass_3fs", "تُفْعَلُ"}, {"ind_pass_3md", "يُفْعَلَانِ"}, {"ind_pass_3mp", "يُفْعَلُونَ"}, {"ind_pass_3ms", "يُفْعَلُ"}, {"past_1p", "أَفْعَلْنَا"}, {"past_1s", "أَفْعَلْتُ"}, {"past_2d", "أَفْعَلْتُمَا"}, {"past_2fp", "أَفْعَلْتُنَّ"}, {"past_2fs", "أَفْعَلْتِ"}, {"past_2mp", "أَفْعَلْتُمْ"}, {"past_2ms", "أَفْعَلْتَ"}, {"past_3fd", "أَفْعَلَتَا"}, {"past_3fp", "أَفْعَلْنَ"}, {"past_3fs", "أَفْعَلَتْ"}, {"past_3md", "أَفْعَلَا"}, {"past_3mp", "أَفْعَلُوا"}, {"past_3ms", "أَفْعَلَ"}, {"past_pass_1p", "أُفْعِلْنَا"}, {"past_pass_1s", "أُفْعِلْتُ"}, {"past_pass_2d", "أُفْعِلْتُمَا"}, {"past_pass_2fp", "أُفْعِلْتُنَّ"}, {"past_pass_2fs", "أُفْعِلْتِ"}, {"past_pass_2mp", "أُفْعِلْتُمْ"}, {"past_pass_2ms", "أُفْعِلْتَ"}, {"past_pass_3fd", "أُفْعِلَتَا"}, {"past_pass_3fp", "أُفْعِلْنَ"}, {"past_pass_3fs", "أُفْعِلَتْ"}, {"past_pass_3md", "أُفْعِلَا"}, {"past_pass_3mp", "أُفْعِلُوا"}, {"past_pass_3ms", "أُفْعِلَ"}, }, }, { label = "وَجَلَ ـُ (p.136، معتل الفاء مثال)", root = "وجل", wazn = "فعَل يفعُل", pass = true, forms = { {"imp_2d", "اُوجُلَا"}, {"imp_2fp", "اُوجُلْنَ"}, {"imp_2fs", "اُوجُلِي"}, {"imp_2mp", "اُوجُلُوا"}, {"imp_2ms", "اُوجُلْ"}, {"ind_1p", "نَوْجُلُ"}, {"ind_1s", "أَوْجُلُ"}, {"ind_2d", "تَوْجُلَانِ"}, {"ind_2fp", "تَوْجُلْنَ"}, {"ind_2fs", "تَوْجُلِينَ"}, {"ind_2mp", "تَوْجُلُونَ"}, {"ind_2ms", "تَوْجُلُ"}, {"ind_3fd", "تَوْجُلَانِ"}, {"ind_3fp", "يَوْجُلْنَ"}, {"ind_3fs", "تَوْجُلُ"}, {"ind_3md", "يَوْجُلَانِ"}, {"ind_3mp", "يَوْجُلُونَ"}, {"ind_3ms", "يَوْجُلُ"}, {"ind_pass_1p", "نُوجَلُ"}, {"ind_pass_1s", "أُوجَلُ"}, {"ind_pass_2d", "تُوجَلَانِ"}, {"ind_pass_2fp", "تُوجَلْنَ"}, {"ind_pass_2fs", "تُوجَلِينَ"}, {"ind_pass_2mp", "تُوجَلُونَ"}, {"ind_pass_2ms", "تُوجَلُ"}, {"ind_pass_3fd", "تُوجَلَانِ"}, {"ind_pass_3fp", "يُوجَلْنَ"}, {"ind_pass_3fs", "تُوجَلُ"}, {"ind_pass_3md", "يُوجَلَانِ"}, {"ind_pass_3mp", "يُوجَلُونَ"}, {"ind_pass_3ms", "يُوجَلُ"}, {"past_1p", "وَجَلْنَا"}, {"past_1s", "وَجَلْتُ"}, {"past_2d", "وَجَلْتُمَا"}, {"past_2fp", "وَجَلْتُنَّ"}, {"past_2fs", "وَجَلْتِ"}, {"past_2mp", "وَجَلْتُمْ"}, {"past_2ms", "وَجَلْتَ"}, {"past_3fd", "وَجَلَتَا"}, {"past_3fp", "وَجَلْنَ"}, {"past_3fs", "وَجَلَتْ"}, {"past_3md", "وَجَلَا"}, {"past_3mp", "وَجَلُوا"}, {"past_3ms", "وَجَلَ"}, {"past_pass_1p", "وُجِلْنَا"}, {"past_pass_1s", "وُجِلْتُ"}, {"past_pass_2d", "وُجِلْتُمَا"}, {"past_pass_2fp", "وُجِلْتُنَّ"}, {"past_pass_2fs", "وُجِلْتِ"}, {"past_pass_2mp", "وُجِلْتُمْ"}, {"past_pass_2ms", "وُجِلْتَ"}, {"past_pass_3fd", "وُجِلَتَا"}, {"past_pass_3fp", "وُجِلْنَ"}, {"past_pass_3fs", "وُجِلَتْ"}, {"past_pass_3md", "وُجِلَا"}, {"past_pass_3mp", "وُجِلُوا"}, {"past_pass_3ms", "وُجِلَ"}, }, }, { label = "أَثَرَ ـِ (p.151، صحيح مهموز الفاء)", root = "أثر", wazn = "فعَل يفعِل", pass = true, forms = { {"imp_2d", "اِئْثِرَا"}, {"imp_2fp", "اِئْثِرْنَ"}, {"imp_2fs", "اِئْثِرِي"}, {"imp_2mp", "اِئْثِرُوا"}, {"imp_2ms", "اِئْثِرْ"}, {"ind_1p", "نَأْثِرُ"}, {"ind_1s", "آثِرُ"}, {"ind_2d", "تَأْثِرَانِ"}, {"ind_2fp", "تَأْثِرْنَ"}, {"ind_2fs", "تَأْثِرِينَ"}, {"ind_2mp", "تَأْثِرُونَ"}, {"ind_2ms", "تَأْثِرُ"}, {"ind_3fd", "تَأْثِرَانِ"}, {"ind_3fp", "يَأْثِرْنَ"}, {"ind_3fs", "تَأْثِرُ"}, {"ind_3md", "يَأْثِرَانِ"}, {"ind_3mp", "يَأْثِرُونَ"}, {"ind_3ms", "يَأْثِرُ"}, {"ind_pass_1p", "نُؤْثَرُ"}, {"ind_pass_1s", "أُوثَرُ"}, {"ind_pass_2d", "تُؤْثَرَانِ"}, {"ind_pass_2fp", "تُؤْثَرْنَ"}, {"ind_pass_2fs", "تُؤْثَرِينَ"}, {"ind_pass_2mp", "تُؤْثَرُونَ"}, {"ind_pass_2ms", "تُؤْثَرُ"}, {"ind_pass_3fd", "تُؤْثَرَانِ"}, {"ind_pass_3fp", "يُؤْثَرْنَ"}, {"ind_pass_3fs", "تُؤْثَرُ"}, {"ind_pass_3md", "يُؤْثَرَانِ"}, {"ind_pass_3mp", "يُؤْثَرُونَ"}, {"ind_pass_3ms", "يُؤْثَرُ"}, {"past_1p", "أَثَرْنَا"}, {"past_1s", "أَثَرْتُ"}, {"past_2d", "أَثَرْتُمَا"}, {"past_2fp", "أَثَرْتُنَّ"}, {"past_2fs", "أَثَرْتِ"}, {"past_2mp", "أَثَرْتُمْ"}, {"past_2ms", "أَثَرْتَ"}, {"past_3fd", "أَثَرَتَا"}, {"past_3fp", "أَثَرْنَ"}, {"past_3fs", "أَثَرَتْ"}, {"past_3md", "أَثَرَا"}, {"past_3mp", "أَثَرُوا"}, {"past_3ms", "أَثَرَ"}, {"past_pass_1p", "أُثِرْنَا"}, {"past_pass_1s", "أُثِرْتُ"}, {"past_pass_2d", "أُثِرْتُمَا"}, {"past_pass_2fp", "أُثِرْتُنَّ"}, {"past_pass_2fs", "أُثِرْتِ"}, {"past_pass_2mp", "أُثِرْتُمْ"}, {"past_pass_2ms", "أُثِرْتَ"}, {"past_pass_3fd", "أُثِرَتَا"}, {"past_pass_3fp", "أُثِرْنَ"}, {"past_pass_3fs", "أُثِرَتْ"}, {"past_pass_3md", "أُثِرَا"}, {"past_pass_3mp", "أُثِرُوا"}, {"past_pass_3ms", "أُثِرَ"}, }, }, { label = "بَدَأَ ـَ (p.178، صحيح مهموز اللام)", root = "بدأ", wazn = "فعَل يفعَل", pass = true, forms = { {"imp_2d", "اِبْدَآ"}, {"imp_2fp", "اِبْدَأْنَ"}, {"imp_2fs", "اِبْدَئِي"}, {"imp_2mp", "اِبْدَؤُوا"}, {"imp_2ms", "اِبْدَأْ"}, {"ind_1p", "نَبْدَأُ"}, {"ind_1s", "أَبْدَأُ"}, {"ind_2d", "تَبْدَآنِ"}, {"ind_2fp", "تَبْدَأْنَ"}, {"ind_2fs", "تَبْدَئِينَ"}, {"ind_2mp", "تَبْدَؤُونَ"}, {"ind_2ms", "تَبْدَأُ"}, {"ind_3fd", "تَبْدَآنِ"}, {"ind_3fp", "يَبْدَأْنَ"}, {"ind_3fs", "تَبْدَأُ"}, {"ind_3md", "يَبْدَآنِ"}, {"ind_3mp", "يَبْدَؤُونَ"}, {"ind_3ms", "يَبْدَأُ"}, {"ind_pass_1p", "نُبْدَأُ"}, {"ind_pass_1s", "أُبْدَأُ"}, {"ind_pass_2d", "تُبْدَآنِ"}, {"ind_pass_2fp", "تُبْدَأْنَ"}, {"ind_pass_2fs", "تُبْدَئِينَ"}, {"ind_pass_2mp", "تُبْدَؤُونَ"}, {"ind_pass_2ms", "تُبْدَأُ"}, {"ind_pass_3fd", "تُبْدَآنِ"}, {"ind_pass_3fp", "يُبْدَأْنَ"}, {"ind_pass_3fs", "تُبْدَأُ"}, {"ind_pass_3md", "يُبْدَآنِ"}, {"ind_pass_3mp", "يُبْدَؤُونَ"}, {"ind_pass_3ms", "يُبْدَأُ"}, {"past_1p", "بَدَأْنَا"}, {"past_1s", "بَدَأْتُ"}, {"past_2d", "بَدَأْتُمَا"}, {"past_2fp", "بَدَأْتُنَّ"}, {"past_2fs", "بَدَأْتِ"}, {"past_2mp", "بَدَأْتُمْ"}, {"past_2ms", "بَدَأْتَ"}, {"past_3fd", "بَدَأَتَا"}, {"past_3fp", "بَدَأْنَ"}, {"past_3fs", "بَدَأَتْ"}, {"past_3md", "بَدَآ"}, {"past_3mp", "بَدَؤُوا"}, {"past_3ms", "بَدَأَ"}, {"past_pass_1p", "بُدِئْنَا"}, {"past_pass_1s", "بُدِئْتُ"}, {"past_pass_2d", "بُدِئْتُمَا"}, {"past_pass_2fp", "بُدِئْتُنَّ"}, {"past_pass_2fs", "بُدِئْتِ"}, {"past_pass_2mp", "بُدِئْتُمْ"}, {"past_pass_2ms", "بُدِئْتَ"}, {"past_pass_3fd", "بُدِئَتَا"}, {"past_pass_3fp", "بُدِئْنَ"}, {"past_pass_3fs", "بُدِئَتْ"}, {"past_pass_3md", "بُدِئَا"}, {"past_pass_3mp", "بُدِئُوا"}, {"past_pass_3ms", "بُدِئَ"}, }, }, { label = "حَسِبَ ـِ (p.234، صحيح سالم)", root = "حسب", wazn = "فعِل يفعِل", pass = true, forms = { {"imp_2d", "اِحْسِبَا"}, {"imp_2fp", "اِحْسِبْنَ"}, {"imp_2fs", "اِحْسِبِي"}, {"imp_2mp", "اِحْسِبُوا"}, {"imp_2ms", "اِحْسِبْ"}, {"ind_1p", "نَحْسِبُ"}, {"ind_1s", "أَحْسِبُ"}, {"ind_2d", "تَحْسِبَانِ"}, {"ind_2fp", "تَحْسِبْنَ"}, {"ind_2fs", "تَحْسِبِينَ"}, {"ind_2mp", "تَحْسِبُونَ"}, {"ind_2ms", "تَحْسِبُ"}, {"ind_3fd", "تَحْسِبَانِ"}, {"ind_3fp", "يَحْسِبْنَ"}, {"ind_3fs", "تَحْسِبُ"}, {"ind_3md", "يَحْسِبَانِ"}, {"ind_3mp", "يَحْسِبُونَ"}, {"ind_3ms", "يَحْسِبُ"}, {"ind_pass_1p", "نُحْسَبُ"}, {"ind_pass_1s", "أُحْسَبُ"}, {"ind_pass_2d", "تُحْسَبَانِ"}, {"ind_pass_2fp", "تُحْسَبْنَ"}, {"ind_pass_2fs", "تُحْسَبِينَ"}, {"ind_pass_2mp", "تُحْسَبُونَ"}, {"ind_pass_2ms", "تُحْسَبُ"}, {"ind_pass_3fd", "تُحْسَبَانِ"}, {"ind_pass_3fp", "يُحْسَبْنَ"}, {"ind_pass_3fs", "تُحْسَبُ"}, {"ind_pass_3md", "يُحْسَبَانِ"}, {"ind_pass_3mp", "يُحْسَبُونَ"}, {"ind_pass_3ms", "يُحْسَبُ"}, {"past_1p", "حَسِبْنَا"}, {"past_1s", "حَسِبْتُ"}, {"past_2d", "حَسِبْتُمَا"}, {"past_2fp", "حَسِبْتُنَّ"}, {"past_2fs", "حَسِبْتِ"}, {"past_2mp", "حَسِبْتُمْ"}, {"past_2ms", "حَسِبْتَ"}, {"past_3fd", "حَسِبَتَا"}, {"past_3fp", "حَسِبْنَ"}, {"past_3fs", "حَسِبَتْ"}, {"past_3md", "حَسِبَا"}, {"past_3mp", "حَسِبُوا"}, {"past_3ms", "حَسِبَ"}, {"past_pass_1p", "حُسِبْنَا"}, {"past_pass_1s", "حُسِبْتُ"}, {"past_pass_2d", "حُسِبْتُمَا"}, {"past_pass_2fp", "حُسِبْتُنَّ"}, {"past_pass_2fs", "حُسِبْتِ"}, {"past_pass_2mp", "حُسِبْتُمْ"}, {"past_pass_2ms", "حُسِبْتَ"}, {"past_pass_3fd", "حُسِبَتَا"}, {"past_pass_3fp", "حُسِبْنَ"}, {"past_pass_3fs", "حُسِبَتْ"}, {"past_pass_3md", "حُسِبَا"}, {"past_pass_3mp", "حُسِبُوا"}, {"past_pass_3ms", "حُسِبَ"}, }, }, { label = "اِدَّارَأَ (p.312، تفاعل مدغم مهموز اللام)", root = "درأ", wazn = "تفاعل", reduced = true, forms = { {"imp_2d", "اِدَّارَآ"}, {"imp_2fp", "اِدَّارَأْنَ"}, {"imp_2fs", "اِدَّارَئِي"}, {"imp_2mp", "اِدَّارَؤُوا"}, {"imp_2ms", "اِدَّارَأْ"}, {"ind_1p", "نَدَّارَأُ"}, {"ind_1s", "أَدَّارَأُ"}, {"ind_2d", "تَدَّارَآنِ"}, {"ind_2fp", "تَدَّارَأْنَ"}, {"ind_2fs", "تَدَّارَئِينَ"}, {"ind_2mp", "تَدَّارَؤُونَ"}, {"ind_2ms", "تَدَّارَأُ"}, {"ind_3fd", "تَدَّارَآنِ"}, {"ind_3fp", "يَدَّارَأْنَ"}, {"ind_3fs", "تَدَّارَأُ"}, {"ind_3md", "يَدَّارَآنِ"}, {"ind_3mp", "يَدَّارَؤُونَ"}, {"ind_3ms", "يَدَّارَأُ"}, {"past_1p", "اِدَّارَأْنَا"}, {"past_1s", "اِدَّارَأْتُ"}, {"past_2d", "اِدَّارَأْتُمَا"}, {"past_2fp", "اِدَّارَأْتُنَّ"}, {"past_2fs", "اِدَّارَأْتِ"}, {"past_2mp", "اِدَّارَأْتُمْ"}, {"past_2ms", "اِدَّارَأْتَ"}, {"past_3fd", "اِدَّارَأَتَا"}, {"past_3fp", "اِدَّارَأْنَ"}, {"past_3fs", "اِدَّارَأَتْ"}, {"past_3md", "اِدَّارَآ"}, {"past_3mp", "اِدَّارَؤُوا"}, {"past_3ms", "اِدَّارَأَ"}, }, }, } h540rldbi4ksih3exgunwhdmrw39bsb وحدة:ar-verb/testcases/4 828 241795 1099197 2026-08-22T21:18:28Z ForzaGreen 28665 إنشاء صفحات اختبار وحدة:ar-verb مولَّدة آليًّا من مستودع GitHub (٦٠ نموذجًا، ٢٨١٨ خلية) 1099197 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 4 من 4. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/4") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_4() for _, entry in ipairs(data) do check(self, entry) end end return tests 1qgugjnvae2o42kw80zyg9dupg5hgke 1099206 1099197 2026-08-22T21:44:47Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099206 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 4 من 5. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/4") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_4() for _, entry in ipairs(data) do check(self, entry) end end return tests pzkva2vpsdv5sr9dchtxqdzl3vjwce6 وحدة:ar-verb/testcases/بيانات/5 828 241796 1099207 2026-08-22T21:44:48Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099207 Scribunto text/plain -- بيانات اختبار [[وحدة:ar-verb]] — مولَّدة آليًّا، لا تُحرَّر يدويًّا. -- Auto-generated from the fixtures in github.com/forzagreen/ar-wiktionary-modules. -- Regenerate with tools/make_wiki_testcases.py; edits here are overwritten. -- -- المصدر: أنطوان الدحداح، معجم تصريف الأفعال العربية، مكتبة لبنان ناشرون. -- الصيغ حقائق لغوية مُقابَلة على ذلك المرجع؛ لا يُعاد هنا نصُّ الكتاب ولا ترتيبه. -- -- القيم المنتظرة مكتوبة بإملاء الوحدة لا بإملاء الكتاب حيث اختلفا اختلافًا -- إملائيًّا مقبولًا في الوجهين (ألف التثنية، همزة الوصل، السكون الاختياري). -- الجزء 5 من 5. return { { label = "اِتّايَعَ (p.316، تفاعل مدغم، معتل العين)", root = "تيع", wazn = "تفاعل", reduced = true, forms = { {"imp_2d", "اِتَّايَعَا"}, {"imp_2fp", "اِتَّايَعْنَ"}, {"imp_2fs", "اِتَّايَعِي"}, {"imp_2mp", "اِتَّايَعُوا"}, {"imp_2ms", "اِتَّايَعْ"}, {"ind_1p", "نَتَّايَعُ"}, {"ind_1s", "أَتَّايَعُ"}, {"ind_2d", "تَتَّايَعَانِ"}, {"ind_2fp", "تَتَّايَعْنَ"}, {"ind_2fs", "تَتَّايَعِينَ"}, {"ind_2mp", "تَتَّايَعُونَ"}, {"ind_2ms", "تَتَّايَعُ"}, {"ind_3fd", "تَتَّايَعَانِ"}, {"ind_3fp", "يَتَّايَعْنَ"}, {"ind_3fs", "تَتَّايَعُ"}, {"ind_3md", "يَتَّايَعَانِ"}, {"ind_3mp", "يَتَّايَعُونَ"}, {"ind_3ms", "يَتَّايَعُ"}, {"past_1p", "اِتَّايَعْنَا"}, {"past_1s", "اِتَّايَعْتُ"}, {"past_2d", "اِتَّايَعْتُمَا"}, {"past_2fp", "اِتَّايَعْتُنَّ"}, {"past_2fs", "اِتَّايَعْتِ"}, {"past_2mp", "اِتَّايَعْتُمْ"}, {"past_2ms", "اِتَّايَعْتَ"}, {"past_3fd", "اِتَّايَعَتَا"}, {"past_3fp", "اِتَّايَعْنَ"}, {"past_3fs", "اِتَّايَعَتْ"}, {"past_3md", "اِتَّايَعَا"}, {"past_3mp", "اِتَّايَعُوا"}, {"past_3ms", "اِتَّايَعَ"}, }, }, { label = "اِنْفَعَلَ (p.321، abstract paradigm)", root = "فعل", wazn = "انفعل", forms = { {"imp_2d", "اِنْفَعِلَا"}, {"imp_2fp", "اِنْفَعِلْنَ"}, {"imp_2fs", "اِنْفَعِلِي"}, {"imp_2mp", "اِنْفَعِلُوا"}, {"imp_2ms", "اِنْفَعِلْ"}, {"ind_1p", "نَنْفَعِلُ"}, {"ind_1s", "أَنْفَعِلُ"}, {"ind_2d", "تَنْفَعِلَانِ"}, {"ind_2fp", "تَنْفَعِلْنَ"}, {"ind_2fs", "تَنْفَعِلِينَ"}, {"ind_2mp", "تَنْفَعِلُونَ"}, {"ind_2ms", "تَنْفَعِلُ"}, {"ind_3fd", "تَنْفَعِلَانِ"}, {"ind_3fp", "يَنْفَعِلْنَ"}, {"ind_3fs", "تَنْفَعِلُ"}, {"ind_3md", "يَنْفَعِلَانِ"}, {"ind_3mp", "يَنْفَعِلُونَ"}, {"ind_3ms", "يَنْفَعِلُ"}, {"past_1p", "اِنْفَعَلْنَا"}, {"past_1s", "اِنْفَعَلْتُ"}, {"past_2d", "اِنْفَعَلْتُمَا"}, {"past_2fp", "اِنْفَعَلْتُنَّ"}, {"past_2fs", "اِنْفَعَلْتِ"}, {"past_2mp", "اِنْفَعَلْتُمْ"}, {"past_2ms", "اِنْفَعَلْتَ"}, {"past_3fd", "اِنْفَعَلَتَا"}, {"past_3fp", "اِنْفَعَلْنَ"}, {"past_3fs", "اِنْفَعَلَتْ"}, {"past_3md", "اِنْفَعَلَا"}, {"past_3mp", "اِنْفَعَلُوا"}, {"past_3ms", "اِنْفَعَلَ"}, }, }, { label = "اِنْأَطَرَ (p.325، انفعل مهموز الفاء)", root = "أطر", wazn = "انفعل", forms = { {"imp_2d", "اِنْأَطِرَا"}, {"imp_2fp", "اِنْأَطِرْنَ"}, {"imp_2fs", "اِنْأَطِرِي"}, {"imp_2mp", "اِنْأَطِرُوا"}, {"imp_2ms", "اِنْأَطِرْ"}, {"ind_1p", "نَنْأَطِرُ"}, {"ind_1s", "أَنْأَطِرُ"}, {"ind_2d", "تَنْأَطِرَانِ"}, {"ind_2fp", "تَنْأَطِرْنَ"}, {"ind_2fs", "تَنْأَطِرِينَ"}, {"ind_2mp", "تَنْأَطِرُونَ"}, {"ind_2ms", "تَنْأَطِرُ"}, {"ind_3fd", "تَنْأَطِرَانِ"}, {"ind_3fp", "يَنْأَطِرْنَ"}, {"ind_3fs", "تَنْأَطِرُ"}, {"ind_3md", "يَنْأَطِرَانِ"}, {"ind_3mp", "يَنْأَطِرُونَ"}, {"ind_3ms", "يَنْأَطِرُ"}, {"past_1p", "اِنْأَطَرْنَا"}, {"past_1s", "اِنْأَطَرْتُ"}, {"past_2d", "اِنْأَطَرْتُمَا"}, {"past_2fp", "اِنْأَطَرْتُنَّ"}, {"past_2fs", "اِنْأَطَرْتِ"}, {"past_2mp", "اِنْأَطَرْتُمْ"}, {"past_2ms", "اِنْأَطَرْتَ"}, {"past_3fd", "اِنْأَطَرَتَا"}, {"past_3fp", "اِنْأَطَرْنَ"}, {"past_3fs", "اِنْأَطَرَتْ"}, {"past_3md", "اِنْأَطَرَا"}, {"past_3mp", "اِنْأَطَرُوا"}, {"past_3ms", "اِنْأَطَرَ"}, }, }, { label = "اِفْعَلَّ (p.356، abstract paradigm)", root = "فعل", wazn = "افعلّ", forms = { {"imp_2d", "اِفْعَلَّا"}, {"imp_2fp", "اِفْعَلِلْنَ"}, {"imp_2fs", "اِفْعَلِّي"}, {"imp_2mp", "اِفْعَلُّوا"}, {"imp_2ms", "اِفْعَلَّ"}, {"ind_1p", "نَفْعَلُّ"}, {"ind_1s", "أَفْعَلُّ"}, {"ind_2d", "تَفْعَلَّانِ"}, {"ind_2fp", "تَفْعَلِلْنَ"}, {"ind_2fs", "تَفْعَلِّينَ"}, {"ind_2mp", "تَفْعَلُّونَ"}, {"ind_2ms", "تَفْعَلُّ"}, {"ind_3fd", "تَفْعَلَّانِ"}, {"ind_3fp", "يَفْعَلِلْنَ"}, {"ind_3fs", "تَفْعَلُّ"}, {"ind_3md", "يَفْعَلَّانِ"}, {"ind_3mp", "يَفْعَلُّونَ"}, {"ind_3ms", "يَفْعَلُّ"}, {"past_1p", "اِفْعَلَلْنَا"}, {"past_1s", "اِفْعَلَلْتُ"}, {"past_2d", "اِفْعَلَلْتُمَا"}, {"past_2fp", "اِفْعَلَلْتُنَّ"}, {"past_2fs", "اِفْعَلَلْتِ"}, {"past_2mp", "اِفْعَلَلْتُمْ"}, {"past_2ms", "اِفْعَلَلْتَ"}, {"past_3fd", "اِفْعَلَّتَا"}, {"past_3fp", "اِفْعَلَلْنَ"}, {"past_3fs", "اِفْعَلَّتْ"}, {"past_3md", "اِفْعَلَّا"}, {"past_3mp", "اِفْعَلُّوا"}, {"past_3ms", "اِفْعَلَّ"}, }, }, { label = "اِسْتَفْعَلَ (p.360، abstract paradigm)", root = "فعل", wazn = "استفعل", pass = true, forms = { {"imp_2d", "اِسْتَفْعِلَا"}, {"imp_2fp", "اِسْتَفْعِلْنَ"}, {"imp_2fs", "اِسْتَفْعِلِي"}, {"imp_2mp", "اِسْتَفْعِلُوا"}, {"imp_2ms", "اِسْتَفْعِلْ"}, {"ind_1p", "نَسْتَفْعِلُ"}, {"ind_1s", "أَسْتَفْعِلُ"}, {"ind_2d", "تَسْتَفْعِلَانِ"}, {"ind_2fp", "تَسْتَفْعِلْنَ"}, {"ind_2fs", "تَسْتَفْعِلِينَ"}, {"ind_2mp", "تَسْتَفْعِلُونَ"}, {"ind_2ms", "تَسْتَفْعِلُ"}, {"ind_3fd", "تَسْتَفْعِلَانِ"}, {"ind_3fp", "يَسْتَفْعِلْنَ"}, {"ind_3fs", "تَسْتَفْعِلُ"}, {"ind_3md", "يَسْتَفْعِلَانِ"}, {"ind_3mp", "يَسْتَفْعِلُونَ"}, {"ind_3ms", "يَسْتَفْعِلُ"}, {"ind_pass_1p", "نُسْتَفْعَلُ"}, {"ind_pass_1s", "أُسْتَفْعَلُ"}, {"ind_pass_2d", "تُسْتَفْعَلَانِ"}, {"ind_pass_2fp", "تُسْتَفْعَلْنَ"}, {"ind_pass_2fs", "تُسْتَفْعَلِينَ"}, {"ind_pass_2mp", "تُسْتَفْعَلُونَ"}, {"ind_pass_2ms", "تُسْتَفْعَلُ"}, {"ind_pass_3fd", "تُسْتَفْعَلَانِ"}, {"ind_pass_3fp", "يُسْتَفْعَلْنَ"}, {"ind_pass_3fs", "تُسْتَفْعَلُ"}, {"ind_pass_3md", "يُسْتَفْعَلَانِ"}, {"ind_pass_3mp", "يُسْتَفْعَلُونَ"}, {"ind_pass_3ms", "يُسْتَفْعَلُ"}, {"past_1p", "اِسْتَفْعَلْنَا"}, {"past_1s", "اِسْتَفْعَلْتُ"}, {"past_2d", "اِسْتَفْعَلْتُمَا"}, {"past_2fp", "اِسْتَفْعَلْتُنَّ"}, {"past_2fs", "اِسْتَفْعَلْتِ"}, {"past_2mp", "اِسْتَفْعَلْتُمْ"}, {"past_2ms", "اِسْتَفْعَلْتَ"}, {"past_3fd", "اِسْتَفْعَلَتَا"}, {"past_3fp", "اِسْتَفْعَلْنَ"}, {"past_3fs", "اِسْتَفْعَلَتْ"}, {"past_3md", "اِسْتَفْعَلَا"}, {"past_3mp", "اِسْتَفْعَلُوا"}, {"past_3ms", "اِسْتَفْعَلَ"}, {"past_pass_1p", "اُسْتُفْعِلْنَا"}, {"past_pass_1s", "اُسْتُفْعِلْتُ"}, {"past_pass_2d", "اُسْتُفْعِلْتُمَا"}, {"past_pass_2fp", "اُسْتُفْعِلْتُنَّ"}, {"past_pass_2fs", "اُسْتُفْعِلْتِ"}, {"past_pass_2mp", "اُسْتُفْعِلْتُمْ"}, {"past_pass_2ms", "اُسْتُفْعِلْتَ"}, {"past_pass_3fd", "اُسْتُفْعِلَتَا"}, {"past_pass_3fp", "اُسْتُفْعِلْنَ"}, {"past_pass_3fs", "اُسْتُفْعِلَتْ"}, {"past_pass_3md", "اُسْتُفْعِلَا"}, {"past_pass_3mp", "اُسْتُفْعِلُوا"}, {"past_pass_3ms", "اُسْتُفْعِلَ"}, }, }, } 43bk6lly9qe5363cv4p575pbqrs3gep وحدة:ar-verb/testcases/5 828 241797 1099208 2026-08-22T21:44:49Z ForzaGreen 28665 تحديث صفحات الاختبار: 65 نموذجًا، 2999 خلية (إضافة الأوزان 246 و250 و252 و270 و280) 1099208 Scribunto text/plain -- اختبارات [[وحدة:ar-verb]] — الجزء 5 من 5. مولَّدة آليًّا. -- Auto-generated by tools/make_wiki_testcases.py. Do not edit by hand. -- انقر على صفحة النقاش لعرض النتائج. local tests = require("Module:UnitTests") local m_ar_verb = require("Module:ar-verb") local data = mw.loadData("Module:ar-verb/testcases/بيانات/5") -- Membership, not equality: a slot legitimately returns a set of variants, and -- the fixture passes if the expected form is anywhere in it. On failure we hand -- self:equals() the first variant so the talk page shows a readable diff. local function check(self, entry) local args = {["جذر"] = entry.root, ["وزن"] = entry.wazn} if entry.pass then args["مبني للمجهول"] = true end if entry.reduced then args["مدغم"] = true end local result = m_ar_verb.do_generate_forms(args, "ar-conj") for _, pair in ipairs(entry.forms) do local slot, expected = pair[1], pair[2] local got, hit = result.forms[slot], nil if got then for _, v in ipairs(got) do if v.form == expected then hit = expected; break end end hit = hit or (got[1] and got[1].form) end self:equals(entry.label .. " / " .. slot, hit or "(no form)", expected) end end function tests:test_fixtures_5() for _, entry in ipairs(data) do check(self, entry) end end return tests bxb8eyf2w74nlazi91bbam5pus9uu4m أَسْمَرَ 0 241798 1099209 2026-08-23T07:11:56Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099209 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1537068}} === المعاني === '''أَسْمَرَ''' {{أفعل}} {{معجمية|L1537068|معاني}} === النطق === * {{أصد-عر|أَسْمَرَ}} {{-}} === التصريفات === {{تصريف|جذر=سمر|وزن=أفعل}} === المراجع === {{مراجع}} 2wdz02czod1wsjqbrr0pmtq2ug35d0v تَدَبَّقَ 0 241799 1099210 2026-08-23T07:23:55Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099210 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535277}} === المعاني === '''تَدَبَّقَ''' {{تفعّل}} {{معجمية|L1535277|معاني}} === النطق === * {{أصد-عر|تَدَبَّقَ}} {{-}} === التصريفات === {{تصريف|جذر=دبق|وزن=تفعّل}} === المراجع === {{مراجع}} ma8flzp27keb4jj2k79nrsoixx80h8u دَبْكَلَ 0 241800 1099211 2026-08-23T07:30:13Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099211 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535278}} === المعاني === '''دَبْكَلَ''' {{فعلل}} {{معجمية|L1535278|معاني}} === النطق === * {{أصد-عر|دَبْكَلَ}} {{-}} === التصريفات === {{تصريف|جذر=دبكل|وزن=فعلل}} === المراجع === {{مراجع}} djwiuhkodt7byccw3tm2wwu9hqs92hk دَبَّهَ 0 241801 1099212 2026-08-23T07:44:51Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099212 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535279}} === المعاني === '''دَبَّهَ''' {{فعّل}} {{معجمية|L1535279|معاني}} === النطق === * {{أصد-عر|دَبَّهَ}} {{-}} === التصريفات === {{تصريف|جذر=دبه|وزن=فعّل}} === المراجع === {{مراجع}} 5g0rfgykmt7xyy4qssw3uxumv8zcxp1 اِدَّثَرَ 0 241802 1099213 2026-08-23T07:47:58Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099213 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535283}} === المعاني === '''اِدَّثَرَ''' {{افتعل}} {{معجمية|L1535283|معاني}} === النطق === * {{أصد-عر|اِدَّثَرَ}} {{-}} === التصريفات === {{تصريف|جذر=دثر|وزن=افتعل}} === المراجع === {{مراجع}} o221mzpljqb8iovxf810ohh5fvrgey4 تَدَاثَرَ 0 241803 1099214 2026-08-23T08:18:57Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099214 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535284}} === المعاني === '''تَدَاثَرَ''' {{تفاعل}} {{معجمية|L1535284|معاني}} === النطق === * {{أصد-عر|تَدَاثَرَ}} {{-}} === التصريفات === {{تصريف|جذر=دثر|وزن=تفاعل}} === المراجع === {{مراجع}} op345ltfj5cmc8u3m36lor6y92216k5 دَثَطَ 0 241804 1099215 2026-08-23T08:26:51Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099215 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1543751}} === المعاني === '''دَثَطَ''' {{نصر}} {{معجمية|L1543751|معاني}} === النطق === * {{أصد-عر|دَثَطَ}} {{-}} === التصريفات === {{تصريف|جذر=دثط|وزن=فعَل يفعُل}} === المراجع === {{مراجع}} gxof13l7r7s9e0blpf3m7afqfx1mrr9 تَدَجَّجَ 0 241805 1099216 2026-08-23T08:32:12Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099216 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1496096}} === المعاني === '''تَدَجَّجَ''' {{تفعّل}} {{معجمية|L1496096|معاني}} === النطق === * {{أصد-عر|تَدَجَّجَ}} {{-}} === التصريفات === {{تصريف|جذر=دجج|وزن=تفعّل}} === المراجع === {{مراجع}} 47r3fkdt71e0zolkryyal6sa5ojsop8 أَدْجَى 0 241806 1099217 2026-08-23T08:33:58Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099217 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1480970}} === المعاني === '''أَدْجَى''' {{أفعل}} {{معجمية|L1480970|معاني}} === النطق === * {{أصد-عر|أَدْجَى}} {{-}} === التصريفات === {{تصريف|جذر=دجو|وزن=أفعل}} === المراجع === {{مراجع}} 1izye50w89xxlbhmwzh2g3rky669ypf اِدْجَوْجَى 0 241807 1099218 2026-08-23T08:34:51Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099218 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535295}} === المعاني === '''اِدْجَوْجَى''' {{افعوعل}} {{معجمية|L1535295|معاني}} === النطق === * {{أصد-عر|اِدْجَوْجَى}} {{-}} === التصريفات === {{تصريف|جذر=دجو|وزن=افعوعل}} === المراجع === {{مراجع}} jo0lfjc64p1r3u81g18u2g8mjmsbdgn دَحْبَى 0 241808 1099219 2026-08-23T08:36:00Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099219 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535297}} === المعاني === '''دَحْبَى''' {{فعلل}} {{معجمية|L1535297|معاني}} === النطق === * {{أصد-عر|دَحْبَى}} {{-}} === التصريفات === {{تصريف|جذر=دحبي|وزن=فعلل}} === المراجع === {{مراجع}} dlszjx8k7fhrq7pwdbvi0f3yf2fd6pr تَدَحْدَرَ 0 241809 1099220 2026-08-23T08:37:56Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099220 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535300}} === المعاني === '''تَدَحْدَرَ''' {{تفعلل}} {{معجمية|L1535300|معاني}} === النطق === * {{أصد-عر|تَدَحْدَرَ}} {{-}} === التصريفات === {{تصريف|جذر=دحدر|وزن=تفعلل}} === المراجع === {{مراجع}} t47yvb4cpscyy9cu85kqfpy2vvj23ha اِنْدَحَرَ 0 241810 1099221 2026-08-23T08:38:50Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099221 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1484907}} === المعاني === '''اِنْدَحَرَ''' {{انفعل}} {{معجمية|L1484907|معاني}} === النطق === * {{أصد-عر|اِنْدَحَرَ}} {{-}} === التصريفات === {{تصريف|جذر=دحر|وزن=انفعل}} === المراجع === {{مراجع}} tliphy9shyeb7tthf61a32bq6hd2nju دَحْقَبَ 0 241811 1099222 2026-08-23T08:40:03Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099222 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535305}} === المعاني === '''دَحْقَبَ''' {{فعلل}} {{معجمية|L1535305|معاني}} === النطق === * {{أصد-عر|دَحْقَبَ}} {{-}} === التصريفات === {{تصريف|جذر=دحقب|وزن=فعلل}} === المراجع === {{مراجع}} nx80ca35gjwyl3tlpmts3e9wyhu9e8v دَحْقَلَ 0 241812 1099223 2026-08-23T08:41:26Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099223 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535306}} === المعاني === '''دَحْقَلَ''' {{فعلل}} {{معجمية|L1535306|معاني}} === النطق === * {{أصد-عر|دَحْقَلَ}} {{-}} === التصريفات === {{تصريف|جذر=دحقل|وزن=فعلل}} === المراجع === {{مراجع}} buy6tfg2bzxl27j00vdcacijiw6uowp تَدَحْلَمَ 0 241813 1099224 2026-08-23T08:42:55Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099224 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535312}} === المعاني === '''تَدَحْلَمَ''' {{تفعلل}} {{معجمية|L1535312|معاني}} === النطق === * {{أصد-عر|تَدَحْلَمَ}} {{-}} === التصريفات === {{تصريف|جذر=دحلم|وزن=تفعلل}} === المراجع === {{مراجع}} 262kdxzt0m9f9rfgqu9soapm8o5ol6i دَحْلَمَ 0 241814 1099225 2026-08-23T08:43:32Z أبو هشام 20788 إنشاء صفحة فعل من بيانات المعاجم (ar-senses tool) 1099225 wikitext text/x-wiki == {{اللغة|عربية}} == {{صندوق معلومات فعل|L1535311}} === المعاني === '''دَحْلَمَ''' {{فعلل}} {{معجمية|L1535311|معاني}} === النطق === * {{أصد-عر|دَحْلَمَ}} {{-}} === التصريفات === {{تصريف|جذر=دحلم|وزن=فعلل}} === المراجع === {{مراجع}} 7rto1c70qz4whdpm2j2wxh3zi3xehj2