Package libqutrub :: Package src :: Module classverb
[hide private]
[frames] | no frames]

Source Code for Module libqutrub.src.classverb

  1  #!/usr/bin/python 
  2  # -*- coding=utf-8 -*- 
  3   
  4  #************************************************************************ 
  5  # $Id: classverb.py,v 0.7 2009/06/02 01:10:00 Taha Zerrouki $ 
  6  # 
  7  # ------------ 
  8  # Description: 
  9  # ------------ 
 10  #  Copyright (c) 2009, Arabtechies, Arabeyes Taha Zerrouki 
 11  # 
 12  #  The Main class to do the conjugation 
 13  # 
 14  # ----------------- 
 15  # Revision Details:    (Updated by Revision Control System) 
 16  # ----------------- 
 17  #  $Date: 2009/06/02 01:10:00 $ 
 18  #  $Author: Taha Zerrouki $ 
 19  #  $Revision: 0.7 $ 
 20  #  $Source: arabtechies.sourceforge.net 
 21  # 
 22  #***********************************************************************/ 
 23  """ 
 24  Verb Class for conjugation 
 25  @author: Taha Zerrouki 
 26  @contact: taha dot zerrouki at gmail dot com 
 27  @copyright: Arabtechies, Arabeyes,  Taha Zerrouki 
 28  @license: GPL 
 29  @date:2009/06/02 
 30  @version: 0.9 
 31  """ 
 32  import copy 
 33  from ar_ctype import * 
 34  from ar_verb import * 
 35  from verb_const import * 
 36  from conjugatedisplay import * 
 37  import sys,re,string 
 38  import pyarabic.araby as araby 
 39   
40 -class conjug_stem:
41 """ 42 A Class to represent a conjugated stem 43 """ 44 # بنية جذع تصريف الجذع 45 #تتكون من الزمن، الحروف والحركات 46 # تستعمل لتخزين جذوع التصريف 47 tense=u""; 48 """ the actual tense""" 49 letters=u""; 50 """ letters of the conjugated stem""" 51 marks=u""; 52 """ marks of the conjugated stem"""
53 - def __init__(self,tense,letters,marks):
54 """ 55 init method 56 @param tense: the given tense; 57 @type tense: unicode. 58 @param letters: the word letters; 59 @type letters: unicode. 60 @param marks: the word marks; 61 @type marks: unicode. 62 """ 63 self.tense=tense; 64 self.letters=letters; 65 self.marks=marks;
66
67 -class verbclass:
68 """ 69 Verb Class: represent a verb, prepare it to be conjugated and store the conjugation result 70 """ 71 verb=u""; 72 #" internl verb : is the normalized form of the verb" 73 internal_verb=u""; 74 word_letters=u""; 75 word_marks=u""; 76 unvocalized=u""; 77 vlength=0; 78 vtype=u""; 79 future_type=u''; 80 transitive=u""; 81 hamza_zaida=False; 82 teh_zaida=False; 83 future_form=u""; 84 conj_display=None; 85 tab_conjug_stem=None; 86 87 #---------------------------------------------------------------------------
88 - def __init__(self,verb,transitive, future_type=FATHA):
89 """ 90 init method 91 @param verb: the given verb; 92 @type verb: unicode. 93 @param transitive: the verb is transitive or not; 94 @type transitive: Boolean. 95 @param future_type: The mark of the third radical letter in the verb, used for triletiral verb only. Default value is Fatha; 96 @type future_type: unicode; one arabic letter (Fatha, Damma, Kasra). 97 """ 98 self.verb=verb; 99 self.internal_verb=normalize(verb); 100 self.future_type=future_type; 101 (self.word_letters,self.word_marks)=uniformate_verb(verb); 102 #Before last haraka in the past 103 self.past_haraka=araby.secondlastChar(self.word_marks); 104 self.word_marks=uniformate_alef_origin(self.word_marks,self.internal_verb,self.future_type); 105 106 self.transitive=transitive; 107 self.hamza_zaida=False; 108 self.teh_zaida=False; 109 110 ## self.conj_display.add_attribut(u"الكتابة الداخلية للفعل",self.word_letters+" - "+self.word_marks); 111 self.tab_conjug_stem={}; 112 verb=self.verb; 113 ## root=self.root; 114 tab_type=[u"",u"",u"",u"فعل ثلاثي",u"فعل رباعي",u"فعل خماسي",u"فعل سداسي",u"فعل سباعي",u"فعل ثماني",u"فعل تساعي"]; 115 verb=normalize(verb); 116 117 self.unvocalized=araby.stripHarakat(verb); 118 verb_nm=self.unvocalized; 119 self.vlength=len(verb_nm); 120 self.vtype=tab_type[self.vlength]; 121 122 # الهمزة زائدة 123 self.hamza_zaida=self.is_hamza_zaida(verb_nm); 124 125 # التاء الزائدة 126 self.teh_zaida=self.is_teh_zaida(verb_nm); 127 128 # معالجة حالة الأفعال الشاذة 129 # إذا كان الفعل من الشواذ، استخرجنا جذوع التصريف من جدوله 130 #وإلا ولّدنا جذوع تصريفه 131 # في المضارع والأمر فقط 132 # أما الماضي فليس فيه شذوذ 133 self.prepare_past_stem(); 134 self.prepare_passive_past_stem(); 135 if self.is_irregular_verb(): 136 self.prepare_irregular_future_and_imperative_stem(); 137 138 else: 139 self.prepare_future_and_imperative_stem(); 140 141 142 # display object 143 self.conj_display=conjugatedisplay(self.verb); 144 if self.transitive : 145 self.conj_display.add_attribut(u"اللزوم/التعدي",u"متعدي"); 146 else : 147 self.conj_display.add_attribut(u"اللزوم/التعدي",u"لازم"); 148 self.conj_display.add_attribut(u"الفعل",self.verb); 149 self.conj_display.add_attribut(u"نوع الفعل",self.vtype);#+str(self.vlength)); 150 self.future_form=self.conjugate_tense_pronoun(TenseFuture,PronounHuwa); 151 self.conj_display.set_future_form(self.future_form); 152 if self.transitive : self.conj_display.settransitive(); 153 self.conj_display.setbab(self.future_type);
154 155 ##################################### 156 #{ Attributes functions 157 #####################################
158 - def set_display(self, mode='Text'):
159 """ 160 Set the display mode as: 161 - 'Text': 162 - 'HTML': 163 - 'HTMLColoredDiacritics': 164 - 'DICT': 165 - 'CSV': 166 - 'GUI': 167 - 'TABLE': 168 - 'XML': 169 - 'TeX': 170 - 'ROWS': 171 @param mode: the given mode to display result; 172 """ 173 self.conj_display.setmode(mode)
174 #-------------------------------------------------------------------------------------
175 - def get_conj_display(self):
176 """ 177 Get The conjugation display class with result. 178 @return: an object with result. 179 @rtype: conjugatedisplay class; 180 """ 181 return copy.copy(self.conj_display)
182 ##################################### 183 #{ Extract information from verb functions 184 #####################################
185 - def is_teh_zaida(self, verb_normalized_unvocalized):
186 """ 187 Determine if the verb starts with Teh and the Teh is not original like تفاعل, 188 Tafa3ala. The verb starting by adde teh change the first vowel of teh, the future mark will be fatha, else kasra, e.g: yatafa3'a'lu (teh added), yafta3'i'lu ( non added teh); 189 @param verb_normalized_unvocalized: the unvovalized form f the verb. 190 @type verb_normalized_unvocalized: unicde; 191 @return: return True if the start Teh is not original 192 @rtype: boolean; 193 """ 194 # How to deterine that Teh is Added: 195 # rule : Teh is added, if the verb is 5 letters lenght and starts by Teh 196 #الناء الأولى زائدة في الفعل الخماسي مطلقا 197 # لا يمكن أن يكون الفعل الخماسي مبدوءا بتاء أصلية، 198 199 return ( len(verb_normalized_unvocalized)==5 and verb_normalized_unvocalized.startswith(TEH))
200 201
202 - def is_hamza_zaida(self, verb_normalized_unvocalized):
203 """ 204 Function to determine if the first HAMZA in the verb is not original 205 ترجع إذا كانت الهمزة الأولى في الفعل غير أصليةDetermine if the verb starts with Hamza and the Teh is not original like أضرب 206 @param verb_normalized_unvocalized: the unvovalized form f the verb. 207 @type verb_normalized_unvocalized: unicde; 208 @return: return True if the start Teh is not original 209 @rtype: boolean; 210 """ 211 # if the lenght of verb is exactely 4 letters and starts by hamza 212 # and it is in the AF3Al wazn and not FA33al or FAA3la 213 # ألوزن المعني هو أفعل 214 # الأوزان غير المعنية هي فاعل وفعّل 215 # الأوزان المشتقة هي أفعّ من أفعل 216 # الخلاصة أن يكون الفعل رباعيا، حرفه الأول همزة 217 # ولا يكون حرفه الثاني ألف، لمنع الوزن فاعل 218 # ولا يكون حرفه الثالث شدة، لمنع الوزن فعّل 219 verb=verb_normalized_unvocalized; 220 if len(verb)!=4 or not verb.startswith(HAMZA) :return False; 221 elif len(verb)==4 and verb.startswith(HAMZA) and verb[1]!=ALEF and verb[2]!=SHADDA: 222 return True; 223 else : return False;
224
225 - def homogenize_harakat(self,original_harakat,applied_harakat):
226 """ 227 Treat Harakat to be homogenized with letters in conjugation. 228 إذا كان طول الحركات ألأصلية للفعل أقل من طول حركات الماضي المبني للمجهول 229 هذا يعني وجود حركة طويلة 230 نقوم بتحويل الحركة الطويلة إلى ما يوافقها 231 232 @param original_harakat: given original harakatof the verb. 233 @type original_harakat: unicode. 234 @param applied_harakat: given harakat to be applied to verb. 235 @type applied_harakat: unicode. 236 @return: nesw harakat to be applied to the verb. 237 @rtype: unicode. 238 """ 239 marks=original_harakat; 240 new_marks=applied_harakat; 241 # إذا كان طول الحركات ألأصلية للفعل أقل من طول حركات الماضي المبني للمجهول 242 # هذا يعني وجود حركة طويلة 243 # نقوم بتحويل الحركة الطويلة إلى ما يوافقها 244 if len(marks)<len(new_marks): 245 alef_haraka_pos=marks.find(ALEF_HARAKA); 246 if alef_haraka_pos<0: 247 alef_haraka_pos=marks.find(ALEF_WAW_HARAKA); 248 if alef_haraka_pos<0: 249 alef_haraka_pos=marks.find(ALEF_YEH_HARAKA); 250 if alef_haraka_pos>=0 and alef_haraka_pos+1<len(new_marks): 251 first=new_marks[alef_haraka_pos]; 252 second=new_marks[alef_haraka_pos+1]; 253 changed_haraka=tab_homogenize_alef_haraka[first][second]; 254 new_marks=new_marks[:alef_haraka_pos]+changed_haraka+new_marks[alef_haraka_pos+2:] 255 return new_marks;
256 ##################################### 257 #{ Preparing conjugation stems for every tense functions 258 ##################################### 259
261 """ 262 Prepare the conjugation stems for future tenses (future, jussive, subjective) and imperative tense. Those stems will be concatenated with conjugation affixes. This function store results in self.tab_conjug_stem. This function prepare conjugation stems for the following tenses: 263 - TenseFuture : تصريف الفعل المضارع 264 - TenseJussiveFuture : تصريف الفعل المضارع المجزوم 265 - TenseSubjunctiveFuture : تصريف الفعل المضارع المنصوب 266 - TenseConfirmedFuture: المضارع المؤكد الثقيل 267 - TensePassiveFuture :تصريف الفعل المضارع المبني للمجهول 268 - TensePassiveJussiveFuture: تصريف الفعل المضارع المجزوم المني للمجهول 269 - TensePassiveSubjunctiveFuture:تصريف الفعل المضارع المنصوب 270 - TensePassiveConfirmedFuture:المضارع المؤكد الثقيل المنبي للمجهول 271 - TenseImperative:الفعل الامر 272 - TenseConfirmedImperative: الفعل الامر المؤكد. 273 """ 274 letters=self.word_letters; 275 marks=self.word_marks; 276 future_letters=letters; 277 # حالة الفعل الثلاثي 278 if self.vlength==3: 279 first_future_mark=FATHA; 280 first_passive_future_mark=DAMMA; 281 future_marks=SUKUN+self.future_type+FATHA; 282 passive_future_marks=SUKUN+FATHA+FATHA; 283 # معالجة الفعل المثال الواوي 284 #ToDO 285 286 # الفعل الرباعي 287 elif self.vlength==4: 288 first_future_mark=DAMMA; 289 first_passive_future_mark=DAMMA; 290 future_marks=FATHA+SUKUN+KASRA+DAMMA; 291 passive_future_marks=FATHA+SUKUN+FATHA+DAMMA; 292 # الفعل الخماسي 293 elif self.vlength==5: 294 first_future_mark=FATHA; 295 first_passive_future_mark=DAMMA; 296 if letters.startswith(TEH): 297 future_marks=FATHA+FATHA+SUKUN+FATHA+DAMMA; 298 passive_future_marks=FATHA+FATHA+SUKUN+FATHA+DAMMA; 299 else : 300 future_marks=FATHA+SUKUN+FATHA+KASRA+DAMMA; 301 passive_future_marks=FATHA+SUKUN+FATHA+FATHA+DAMMA; 302 #الفعل السداسي 303 elif self.vlength==6: 304 first_future_mark=FATHA; 305 first_passive_future_mark=DAMMA; 306 future_marks=FATHA+SUKUN+FATHA+SUKUN+KASRA+DAMMA; 307 passive_future_marks=FATHA+SUKUN+FATHA+SUKUN+FATHA+DAMMA; 308 # معالجة الألفات في الفعل والحركات الطويلة 309 # إذا كان طول الحركات ألأصلية للفعل أقل من طول حركات الماضي المبني للمجهول 310 # هذا يعني وجود حركة طويلة 311 # نقوم بتحويل الحركة الطويلة إلى ما يوافقها 312 if len(marks)<len(future_marks): 313 future_marks=self.homogenize_harakat(marks,future_marks) 314 passive_future_marks=self.homogenize_harakat(marks,passive_future_marks) 315 imp_marks=future_marks; 316 imp_letters=future_letters; 317 # حالة الأفعال التي تبدأ بألف وصل 318 if letters.startswith(ALEF) or self.hamza_zaida: 319 future_letters=letters[1:]; 320 future_marks=future_marks[1:] 321 passive_future_marks=passive_future_marks[1:]; 322 passive_letters=letters[1:]; 323 # حالة الفعل المثال 324 elif self.vlength==3 and self.word_letters.startswith(WAW) and (self.future_type==KASRA or (self.future_type==FATHA and self.word_marks==FATHA+FATHA+FATHA)): 325 future_letters=letters[1:]; 326 future_marks=future_marks[1:] 327 ## passive_future_marks=passive_future_marks[1:] 328 passive_letters=letters; 329 else: 330 future_letters=letters; 331 passive_letters=letters; 332 new_marks=first_future_mark+future_marks; 333 passive_marks=first_passive_future_mark+passive_future_marks; 334 335 # حالة الأفعال التي تبدأ بألف وصل 336 if imp_letters.startswith(ALEF): 337 imp_letters=letters[1:]; 338 imp_marks=imp_marks[1:] 339 elif self.vlength==3 and self.word_letters.startswith(WAW) and (self.future_type==KASRA or (self.future_type==FATHA and self.word_marks==FATHA+FATHA+FATHA)): 340 imp_letters=letters[1:]; 341 imp_marks=imp_marks[1:] 342 else: 343 imp_letters=letters; 344 345 # معالجة الفعل الناقص عند تصريفه في المجهول 346 # تستبدل واو التاقص الذي حركة عين ماضيه فتحة بياء 347 ## passive_letters=future_letters; 348 if self.vlength==3 and passive_letters.endswith(ALEF_MAMDUDA): 349 passive_letters=passive_letters[:-1]+ALEF_MAKSURA; 350 # القعل الأمر يأخذ نفس حركات الفعل المضارع دون حركة حرف المضارعة 351 ## imp_marks=future_marks; 352 ### معلجة إضافة حرف ألف الوصل في الأفعال المسبوقة بالسكون 353 ## new_marks=first_future_mark+future_marks; 354 ## passive_marks=first_passive_future_mark+passive_future_marks; 355 self.tab_conjug_stem[TenseFuture]=conjug_stem(TenseFuture,future_letters,new_marks); 356 # تصريف الفعل المضارع المنصوب والمجزوم 357 self.tab_conjug_stem[TenseJussiveFuture]=conjug_stem(TenseJussiveFuture,future_letters,new_marks); 358 self.tab_conjug_stem[TenseSubjunctiveFuture]=conjug_stem(TenseSubjunctiveFuture,future_letters,new_marks); 359 # المضارع المؤكد الثقيل 360 self.tab_conjug_stem[TenseConfirmedFuture]=conjug_stem(TenseConfirmedFuture,future_letters,new_marks); 361 362 # المبني للمجهول 363 self.tab_conjug_stem[TensePassiveFuture]=conjug_stem(TensePassiveFuture,passive_letters,passive_marks); 364 # تصريف الفعل المضارع المنصوب والمجزوم المني للمجهول 365 self.tab_conjug_stem[TensePassiveJussiveFuture]=conjug_stem(TensePassiveJussiveFuture,passive_letters,passive_marks); 366 self.tab_conjug_stem[TensePassiveSubjunctiveFuture]=conjug_stem(TensePassiveSubjunctiveFuture,passive_letters,passive_marks); 367 # المضارع المؤكد الثقيل المنبي للمجهول 368 self.tab_conjug_stem[TensePassiveConfirmedFuture]=conjug_stem(TensePassiveConfirmedFuture,passive_letters,passive_marks); 369 370 # الفعل الامر 371 self.tab_conjug_stem[TenseImperative]=conjug_stem(TenseImperative,imp_letters,imp_marks); 372 # الفعل الامر المؤكد 373 self.tab_conjug_stem[TenseConfirmedImperative]=conjug_stem(TenseConfirmedImperative,imp_letters,imp_marks);
374 375 # --------------------------------------------------------------------------
376 - def prepare_past_stem(self):
377 """ 378 Prepare the conjugation stems for past tense. 379 Those stems will be concatenated with conjugation affixes. 380 This function store results in self.tab_conjug_stem. This function prepare conjugation stems for the following tenses: 381 - TensePast: الفعل الماضي. 382 """ 383 self.past_stem=self.internal_verb; 384 self.tab_conjug_stem[TensePast]=conjug_stem(TensePast,self.word_letters,self.word_marks);
385 386
388 """ 389 Prepare the conjugation stems for past tense. 390 Those stems will be concatenated with conjugation affixes. 391 This function store results in self.tab_conjug_stem. This function prepare conjugation stems for the following tenses: 392 - TensePast: الفعل الماضي 393 """ 394 ## verb=self.internal_verb; 395 letters=self.word_letters; 396 marks=self.word_marks; 397 398 if len(letters)==3 and letters.endswith(ALEF_MAMDUDA) and marks[1]==FATHA: 399 letters=letters[:-1]+ALEF_MAKSURA; 400 if self.vlength==3: 401 passive_marks=DAMMA+KASRA+FATHA; 402 elif self.vlength==4: 403 passive_marks=DAMMA+SUKUN+KASRA+FATHA; 404 elif self.vlength==5: 405 if letters.startswith(TEH): 406 passive_marks=DAMMA+DAMMA+SUKUN+KASRA+FATHA; 407 else : 408 passive_marks=DAMMA+SUKUN+DAMMA+KASRA+FATHA; 409 elif self.vlength==6: 410 passive_marks=DAMMA+SUKUN+DAMMA+SUKUN+KASRA+FATHA; 411 # إذا كان طول الحركات ألأصلية للفعل أقل من طول حركات الماضي المبني للمجهول 412 # هذا يعني وجود حركة طويلة 413 # نقوم بتحويل الحركة الطويلة إلى ما يوافقها 414 if len(marks)<len(passive_marks): 415 passive_marks=self.homogenize_harakat(marks,passive_marks) 416 417 # - حالة الفعل الأجوف الذي حركة مضارعه فتحة أو كسرة، 418 #- فيصبح في الماضي عند التقاء الساكنين كسرة، لذا يجب تعديل ذلك في الماضي المجهول، بجعلها تتحول إلى ضمة عند التقاء الساكنين. 419 if len(passive_marks)==2 and passive_marks[0]==YEH_HARAKA and self.future_type in(FATHA,KASRA): 420 passive_marks=ALTERNATIVE_YEH_HARAKA+FATHA; 421 self.tab_conjug_stem[TensePassivePast]=conjug_stem(TensePassivePast,letters,passive_marks);
422
423 - def conjugate_tense_pronoun(self,tense,pronoun):
424 """ 425 Conjugate a verb in a given tense with a pronoun. 426 @param tense: given tense; 427 @type tense: unicode name of the tense; 428 @param pronoun: given pronoun; 429 @type pronoun: unicode name of the pronoun; 430 @return: conjugated verb; 431 @rtype: unicode; 432 """ 433 #prefix 434 pre_val=TableTensePronoun[tense][pronoun][0]; 435 #suffix 436 suf_val=TableTensePronoun[tense][pronoun][1]; 437 stem_l=self.tab_conjug_stem[tense].letters; 438 stem_m=self.tab_conjug_stem[tense].marks; 439 #deprecated 440 ## return self.join(stem_l,stem_m,prefix,suffix); 441 # _m : marks 442 #_l :letters 443 if pre_val!=u"": 444 pre_val_l=pre_val; 445 pre_val_m=stem_m[0]; 446 stem_m=stem_m[1:]; 447 else: 448 pre_val_l=u""; 449 pre_val_m=u""; 450 451 # the suffix already start by a HARAKA, 452 # we add Taweel to ensure valid word in the uniformate function 453 suf_val=TATWEEL+suf_val; 454 #uniformate suffix 455 (suf_val_l,suf_val_m)=uniformate_suffix(suf_val); 456 # add affix to the stem 457 conj_l=pre_val_l+stem_l+suf_val_l; 458 #The end of the stem marks takes the begining of the suffix marks 459 conj_m=pre_val_m+stem_m[:-1]+suf_val_m; 460 # the begining of suffix letters is Tatweel, it will be striped 461 conj_l=pre_val_l+stem_l+suf_val_l[1:]; 462 463 # Treat sukun 464 conj_m=treat_sukun2(conj_l,conj_m,self.future_type); 465 # standard orthographic form 466 conj=standard2(conj_l,conj_m); 467 return conj;
468 469 470 #-------------------------------------------------------------------------------- 471 # التصريف في الأزمنة المختلفة، 472 # عند وضع قائمة خاصة بالأزمنة المختارة، 473 # تلقائيا كافة الأزمنة 474 #--------------------------------------------------------------------------------
475 - def conjugate_all_tenses(self,listtense=TableTense):
476 """ 477 Conjugate a verb with a list of tenses. 478 @param listtense: given tense; 479 @type listtense: list of unicode; 480 @return: conjugated verb ; 481 @rtype: the type is given according to the display mode; 482 """ 483 for tense in listtense: 484 if tense==TensePast: 485 conj_ana=self.conjugate_tense_pronoun(tense,PronounAna); 486 self.conj_display.add(tense,PronounAna,conj_ana); 487 conj_ana_without_last_mark=conj_ana[:-1]; 488 self.conj_display.add(tense,PronounAnta,conj_ana_without_last_mark+FATHA); 489 self.conj_display.add(tense,PronounAnti,conj_ana_without_last_mark+KASRA); 490 self.conj_display.add(tense,PronounAntuma,conj_ana+MEEM+FATHA+ALEF); 491 self.conj_display.add(tense,PronounAntuma_f,conj_ana+MEEM+FATHA+ALEF); 492 self.conj_display.add(tense,PronounAntum,conj_ana+MEEM); 493 self.conj_display.add(tense,PronounAntunna,conj_ana+NOON+SHADDA+FATHA) 494 self.conj_display.add(tense,PronounAna,conj_ana); 495 496 conj_nahnu=self.conjugate_tense_pronoun(tense,PronounNahnu); 497 self.conj_display.add(tense,PronounNahnu,conj_nahnu); 498 499 conj_hunna=self.conjugate_tense_pronoun(tense,PronounHunna); 500 self.conj_display.add(tense,PronounHunna,conj_hunna); 501 502 conj_huma=self.conjugate_tense_pronoun(tense,PronounHuma); 503 self.conj_display.add(tense,PronounHuma,conj_huma); 504 505 conj_hum=self.conjugate_tense_pronoun(tense,PronounHum); 506 self.conj_display.add(tense,PronounHum,conj_hum); 507 508 conj_hunna=self.conjugate_tense_pronoun(tense,PronounHunna); 509 self.conj_display.add(tense,PronounHunna,conj_hunna); 510 511 conj_huwa=self.conjugate_tense_pronoun(tense,PronounHuwa); 512 self.conj_display.add(tense,PronounHuwa,conj_huwa); 513 conj_hya=self.conjugate_tense_pronoun(tense,PronounHya); 514 self.conj_display.add(tense,PronounHya,conj_hya); 515 self.conj_display.add(tense,PronounHuma_f,conj_hya[:-1]+FATHA+ALEF); 516 elif tense ==TensePassivePast: 517 conj_ana=self.conjugate_tense_pronoun(tense,PronounAna); 518 self.conj_display.add(tense,PronounAna,conj_ana); 519 conj_ana_without_last_mark=conj_ana[:-1]; 520 self.conj_display.add(tense,PronounAnta,conj_ana_without_last_mark+FATHA); 521 self.conj_display.add(tense,PronounAnti,conj_ana_without_last_mark+KASRA); 522 self.conj_display.add(tense,PronounAntuma,conj_ana+MEEM+FATHA+ALEF); 523 self.conj_display.add(tense,PronounAntuma_f,conj_ana+MEEM+FATHA+ALEF); 524 self.conj_display.add(tense,PronounAntum,conj_ana+MEEM); 525 self.conj_display.add(tense,PronounAntunna,conj_ana+NOON+SHADDA+FATHA) 526 self.conj_display.add(tense,PronounAna,conj_ana); 527 528 conj_nahnu=self.conjugate_tense_pronoun(tense,PronounNahnu); 529 self.conj_display.add(tense,PronounNahnu,conj_nahnu); 530 531 conj_hunna=self.conjugate_tense_pronoun(tense,PronounHunna); 532 self.conj_display.add(tense,PronounHunna,conj_hunna); 533 534 conj_hunna=self.conjugate_tense_pronoun(tense,PronounHunna); 535 self.conj_display.add(tense,PronounHunna,conj_hunna); 536 537 conj_huwa=self.conjugate_tense_pronoun(tense,PronounHuwa); 538 self.conj_display.add(tense,PronounHuwa,conj_huwa); 539 # حالة الفعل مهموز الآخر 540 if conj_huwa.endswith(YEH+HAMZA+FATHA) : 541 self.conj_display.add(tense,PronounHya,conj_huwa[:-2]+YEH_HAMZA+FATHA+TEH+SUKUN); 542 self.conj_display.add(tense,PronounHuma_f,conj_huwa[:-2]+YEH_HAMZA+FATHA+TEH+FATHA+ALEF); 543 ## conj_huma=self.conjugate_tense_pronoun(tense,PronounHuma); 544 self.conj_display.add(tense,PronounHuma,conj_huwa[:-2]+YEH_HAMZA+FATHA+ALEF); 545 546 ## conj_hum=self.conjugate_tense_pronoun(tense,PronounHum); 547 self.conj_display.add(tense,PronounHum,conj_huwa[:-2]+YEH_HAMZA+DAMMA+WAW+ALEF); 548 549 else : 550 self.conj_display.add(tense,PronounHya,conj_huwa+TEH+SUKUN); 551 self.conj_display.add(tense,PronounHuma_f,conj_huwa+TEH+FATHA+ALEF); 552 self.conj_display.add(tense,PronounHuma,conj_huwa+ALEF); 553 if conj_huwa.endswith(KASRA+YEH+FATHA): 554 self.conj_display.add(tense,PronounHum,conj_huwa[:-3]+DAMMA+WAW+ALEF); 555 else: 556 self.conj_display.add(tense,PronounHum,conj_huwa[:-1]+DAMMA+WAW+ALEF); 557 elif tense in (TenseFuture,TensePassiveFuture,TenseJussiveFuture,TenseSubjunctiveFuture,TenseConfirmedFuture,TensePassiveJussiveFuture,TensePassiveSubjunctiveFuture,TensePassiveConfirmedFuture): 558 conj_ana=self.conjugate_tense_pronoun(tense,PronounAna); 559 self.conj_display.add(tense,PronounAna,conj_ana); 560 561 conj_anta=self.conjugate_tense_pronoun(tense,PronounAnta); 562 self.conj_display.add(tense,PronounAnta,conj_anta); 563 conj_anta_without_future_letter=conj_anta[1:]; 564 ## self.conj_display.add(tense,PronounAnta,TEH+conj_ana_without_future_letter); 565 self.conj_display.add(tense,PronounNahnu,NOON+conj_anta_without_future_letter); 566 self.conj_display.add(tense,PronounHuwa,YEH+conj_anta_without_future_letter); 567 self.conj_display.add(tense,PronounHya,TEH+conj_anta_without_future_letter); 568 569 conj_anti=self.conjugate_tense_pronoun(tense,PronounAnti); 570 self.conj_display.add(tense,PronounAnti,conj_anti); 571 572 conj_antuma=self.conjugate_tense_pronoun(tense,PronounAntuma); 573 self.conj_display.add(tense,PronounAntuma,conj_antuma); 574 self.conj_display.add(tense,PronounAntuma_f,conj_antuma); 575 self.conj_display.add(tense,PronounHuma_f,conj_antuma); 576 self.conj_display.add(tense,PronounHuma,YEH+conj_antuma[1:]); 577 578 conj_antum=self.conjugate_tense_pronoun(tense,PronounAntum); 579 self.conj_display.add(tense,PronounAntum,conj_antum); 580 self.conj_display.add(tense,PronounHum,YEH+conj_antum[1:]); 581 582 conj_antunna=self.conjugate_tense_pronoun(tense,PronounAntunna); 583 self.conj_display.add(tense,PronounAntunna,conj_antunna); 584 self.conj_display.add(tense,PronounHunna,YEH+conj_antunna[1:]); 585 elif tense ==TenseImperative or tense ==TenseConfirmedImperative: 586 for pron in ImperativePronouns: 587 conj=self.conjugate_tense_pronoun(tense,pron); 588 self.conj_display.add(tense,pron,conj); 589 if not self.transitive: 590 for tense in TablePassiveTense: 591 for pron in PronounsTableNotPassiveForUntransitive: 592 self.conj_display.add(tense,pron,u""); 593 # if the result is not diplyed directely on the screen, we return it 594 result=self.conj_display.display(self.conj_display.mode,listtense); 595 if result: return result;
596 597 ##################################### 598 #{ Irregular verbs functions 599 ##################################### 600 #-------------------------------------------------------- 601 602 # 603 #--------------------------------------------------------
604 - def is_irregular_verb(self):
605 """ 606 Return True if the verb is irregular, founded in the irregular verb table 607 إرجاع إّذا كان الفعل ضاذا. 608 الأفعال العربية الخاصة هي 609 رأى، أكل أمر سأل، 610 ج- إذا كان يتصرف من باب (مَنَعَ يَمْنَعُ)، تحذف واوه, نحو: وَضَعَ، يَضَعُ، وَجَأَ يَجَأُ، وَدَعَ يَدَعُ، وَزَعَ يَزَعُ، وَضَأَ يَضَأُ، وَطَأَ يَطَأُ، وَقَعَ يَقَعُ، وَلَغَ يَلَغُ، وَهَبَ يَهَبُ، عدا خمسة أفعال هي: (وَبَأ)، و(وَبَهَ)، و(وَجَعَ)، و(وَسَعَ)، و(وَهَلَ)، فلا تحذف منها الواو؛ فنقول: يَوْبَأُ، يَوْبَهُ، يَوْجَعُ، يَوْسَعُ، يَوْهَلُ. الأفعال (وَبَأ)، و(وَبَهَ)، و(وَجَعَ)، و(وَسَعَ)، و(وَهَلَ)، الفعل وبَأ يوبأ 611 612 @return:True if irregular; 613 @rtype: Boolean; 614 """ 615 if len(self.word_letters)!=3: return False; 616 else: 617 # the key is composed from the letters and past and future marks, to identify irregular verb 618 key=self.word_letters+self.past_haraka+self.future_type 619 if IrregularVerbsConjug.has_key(key ): 620 return True; 621 ## if self.past_haraka== IrregularVerbsConjug[self.word_letters][ConjugBab][0] and self.future_type== IrregularVerbsConjug[self.word_letters][ConjugBab][1]: 622 ## return True; 623 return False;
624
626 """ 627 Get the future stem for irregular verb. 628 @return: the future conjuagtion stem; 629 @rtype: unicode; 630 """ 631 # the key is composed from the letters and past and future marks, to identify irregular verb 632 key=self.word_letters+self.past_haraka+self.future_type 633 if IrregularVerbsConjug.has_key(key): 634 return IrregularVerbsConjug[key][TenseFuture]; 635 else: 636 self.word_letters
637 #--------------------------------------------------------
639 """ 640 Get the passive future stem for irregular verb. 641 @return: the passive future conjuagtion stem; 642 @rtype: unicode; 643 """ 644 # the key is composed from the letters and past and future marks, to identify irregular verb 645 key=self.word_letters+self.past_haraka+self.future_type 646 if IrregularVerbsConjug.has_key(key): 647 return IrregularVerbsConjug[key][TensePassiveFuture]; 648 else: 649 self.word_letters
650 #--------------------------------------------------------
652 """ 653 Get the imperative stem for irregular verb. 654 @return: the passive imperative conjuagtion stem; 655 @rtype: unicode; 656 """ 657 # the key is composed from the letters and past and future marks, to identify irregular verb 658 key=self.word_letters+self.past_haraka+self.future_type 659 if IrregularVerbsConjug.has_key(key): 660 return IrregularVerbsConjug[key][TenseImperative]; 661 else: 662 self.word_letters
663 664 #-------------------------------------------------------- 665 # prepare the irregular conjug for future and imperative 666 # تحضير جذوع التصريف في المضارع والأمر للأفعال الضاذة 667 # 668 #--------------------------------------------------------
670 """ 671 Prepare the conjugation stems for future tenses (future, jussive, subjective) and imperative tense. 672 Those stems will be concatenated with conjugation affixes. 673 """ 674 ## if self.word_letters in IrregularVerbsConjug.keys(): 675 if self.is_irregular_verb(): 676 (l,m)=self.get_irregular_future_stem(); 677 #IrregularVerbsConjug[self.word_letters][TenseFuture]; 678 #تمت إضافة حركة حرف المضارعة إلى الجذع المستعمل في الفعل الشاذ 679 self.tab_conjug_stem[TenseFuture]=conjug_stem(TenseFuture,l,m); 680 self.tab_conjug_stem[TenseJussiveFuture]=conjug_stem(TenseJussiveFuture,l,m); 681 self.tab_conjug_stem[TenseSubjunctiveFuture]=conjug_stem(TenseSubjunctiveFuture,l,m); 682 self.tab_conjug_stem[TenseConfirmedFuture]=conjug_stem(TenseConfirmedFuture,l,m); 683 684 685 (l1,m1)=self.get_irregular_passivefuture_stem(); 686 #تمت إضافة حركة حرف المضارعة إلى الجذع المستعمل في الفعل الشاذ 687 self.tab_conjug_stem[TensePassiveFuture]=conjug_stem(TensePassiveFuture,l1,m1); 688 self.tab_conjug_stem[TensePassiveJussiveFuture]=conjug_stem(TensePassiveJussiveFuture,l1,m1); 689 self.tab_conjug_stem[TensePassiveSubjunctiveFuture]=conjug_stem(TensePassiveSubjunctiveFuture,l1,m1); 690 self.tab_conjug_stem[TensePassiveConfirmedFuture]=conjug_stem(TensePassiveConfirmedFuture,l1,m1); 691 692 693 (l2,m2)=self.get_irregular_imperative_stem(); 694 self.tab_conjug_stem[TenseImperative]=conjug_stem(TenseImperative,l2,m2); 695 self.tab_conjug_stem[TenseConfirmedImperative]=conjug_stem(TenseConfirmedImperative,l2,m2); 696 ## print l.encode("utf"),m.encode("utf"); 697 return False;
698