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

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