Grammalecte  Hex Artifact Content

Artifact 50fbeb414d02f638be74fe7195954694e97667cc55741d0d60142009534b6f5e:


0000: 23 23 23 23 20 47 52 41 4d 4d 41 52 20 43 48 45  #### GRAMMAR CHE
0010: 43 4b 49 4e 47 20 45 4e 47 49 4e 45 20 50 4c 55  CKING ENGINE PLU
0020: 47 49 4e 3a 20 53 75 67 67 65 73 74 69 6f 6e 20  GIN: Suggestion 
0030: 6d 65 63 68 61 6e 69 73 6d 73 0a 0a 66 72 6f 6d  mechanisms..from
0040: 20 2e 20 69 6d 70 6f 72 74 20 63 6f 6e 6a 0a 66   . import conj.f
0050: 72 6f 6d 20 2e 20 69 6d 70 6f 72 74 20 6d 66 73  rom . import mfs
0060: 70 0a 66 72 6f 6d 20 2e 20 69 6d 70 6f 72 74 20  p.from . import 
0070: 70 68 6f 6e 65 74 0a 0a 0a 23 23 20 56 65 72 62  phonet...## Verb
0080: 73 0a 0a 64 65 66 20 73 75 67 67 56 65 72 62 20  s..def suggVerb 
0090: 28 73 46 6c 65 78 2c 20 73 57 68 6f 2c 20 66 75  (sFlex, sWho, fu
00a0: 6e 63 53 75 67 67 32 3d 4e 6f 6e 65 29 3a 0a 20  ncSugg2=None):. 
00b0: 20 20 20 61 53 75 67 67 20 3d 20 73 65 74 28 29     aSugg = set()
00c0: 0a 20 20 20 20 66 6f 72 20 73 53 74 65 6d 20 69  .    for sStem i
00d0: 6e 20 73 74 65 6d 28 73 46 6c 65 78 29 3a 0a 20  n stem(sFlex):. 
00e0: 20 20 20 20 20 20 20 74 54 61 67 73 20 3d 20 63         tTags = c
00f0: 6f 6e 6a 2e 5f 67 65 74 54 61 67 73 28 73 53 74  onj._getTags(sSt
0100: 65 6d 29 0a 20 20 20 20 20 20 20 20 69 66 20 74  em).        if t
0110: 54 61 67 73 3a 0a 20 20 20 20 20 20 20 20 20 20  Tags:.          
0120: 20 20 23 20 77 65 20 67 65 74 20 74 68 65 20 74    # we get the t
0130: 65 6e 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  ense.           
0140: 20 61 54 65 6e 73 65 20 3d 20 73 65 74 28 29 0a   aTense = set().
0150: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
0160: 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c  sMorph in _dAnal
0170: 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c 20  yses.get(sFlex, 
0180: 5b 5d 29 3a 20 23 20 77 65 20 64 6f 6e e2 80 99  []): # we don...
0190: 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20  t check if word 
01a0: 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c  exists in _dAnal
01b0: 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20  yses, for it is 
01c0: 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62  assumed it has b
01d0: 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a  een done before.
01e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01f0: 66 6f 72 20 6d 20 69 6e 20 72 65 2e 66 69 6e 64  for m in re.find
0200: 69 74 65 72 28 22 3e 22 2b 73 53 74 65 6d 2b 22  iter(">"+sStem+"
0210: 20 2e 2a 3f 28 3a 28 3f 3a 59 7c 49 5b 70 71 73   .*?(:(?:Y|I[pqs
0220: 66 5d 7c 53 5b 70 71 5d 7c 4b 7c 50 29 29 22 2c  f]|S[pq]|K|P))",
0230: 20 73 4d 6f 72 70 68 29 3a 0a 20 20 20 20 20 20   sMorph):.      
0240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
0250: 73 74 65 6d 20 6d 75 73 74 20 62 65 20 75 73 65  stem must be use
0260: 64 20 69 6e 20 72 65 67 65 78 20 74 6f 20 70 72  d in regex to pr
0270: 65 76 65 6e 74 20 63 6f 6e 66 75 73 69 6f 6e 20  event confusion 
0280: 62 65 74 77 65 65 6e 20 64 69 66 66 65 72 65 6e  between differen
0290: 74 20 76 65 72 62 73 20 28 65 2e 67 2e 20 73 61  t verbs (e.g. sa
02a0: 75 72 61 73 20 68 61 73 20 32 20 73 74 65 6d 73  uras has 2 stems
02b0: 3a 20 73 61 76 6f 69 72 20 61 6e 64 20 73 61 75  : savoir and sau
02c0: 72 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  rer).           
02d0: 20 20 20 20 20 20 20 20 20 69 66 20 6d 3a 0a 20           if m:. 
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02f0: 20 20 20 20 20 20 20 69 66 20 6d 2e 67 72 6f 75         if m.grou
0300: 70 28 31 29 20 3d 3d 20 22 3a 59 22 3a 0a 20 20  p(1) == ":Y":.  
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 20 20 20 20 20 20 20 20 61 54 65 6e 73 65            aTense
0330: 2e 61 64 64 28 22 3a 49 70 22 29 0a 20 20 20 20  .add(":Ip").    
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 61 54 65 6e 73 65 2e 61          aTense.a
0360: 64 64 28 22 3a 49 71 22 29 0a 20 20 20 20 20 20  dd(":Iq").      
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 20 20 20 20 20 20 61 54 65 6e 73 65 2e 61 64 64        aTense.add
0390: 28 22 3a 49 73 22 29 0a 20 20 20 20 20 20 20 20  (":Is").        
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03b0: 65 6c 69 66 20 6d 2e 67 72 6f 75 70 28 31 29 20  elif m.group(1) 
03c0: 3d 3d 20 22 3a 50 22 3a 0a 20 20 20 20 20 20 20  == ":P":.       
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 61 54 65 6e 73 65 2e 61 64 64 28       aTense.add(
03f0: 22 3a 49 70 22 29 0a 20 20 20 20 20 20 20 20 20  ":Ip").         
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
0410: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 61 54 65 6e 73 65 2e 61 64 64 28 6d 2e 67 72   aTense.add(m.gr
0440: 6f 75 70 28 31 29 29 0a 20 20 20 20 20 20 20 20  oup(1)).        
0450: 20 20 20 20 66 6f 72 20 73 54 65 6e 73 65 20 69      for sTense i
0460: 6e 20 61 54 65 6e 73 65 3a 0a 20 20 20 20 20 20  n aTense:.      
0470: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 57 68            if sWh
0480: 6f 20 3d 3d 20 22 3a 31 c5 9b 22 20 61 6e 64 20  o == ":1.." and 
0490: 6e 6f 74 20 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e  not conj._hasCon
04a0: 6a 57 69 74 68 54 61 67 73 28 74 54 61 67 73 2c  jWithTags(tTags,
04b0: 20 73 54 65 6e 73 65 2c 20 22 3a 31 c5 9b 22 29   sTense, ":1..")
04c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
04d0: 20 20 20 20 20 20 73 57 68 6f 20 3d 20 22 3a 31        sWho = ":1
04e0: 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s".             
04f0: 20 20 20 69 66 20 63 6f 6e 6a 2e 5f 68 61 73 43     if conj._hasC
0500: 6f 6e 6a 57 69 74 68 54 61 67 73 28 74 54 61 67  onjWithTags(tTag
0510: 73 2c 20 73 54 65 6e 73 65 2c 20 73 57 68 6f 29  s, sTense, sWho)
0520: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0530: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0540: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0550: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0560: 67 73 2c 20 73 54 65 6e 73 65 2c 20 73 57 68 6f  gs, sTense, sWho
0570: 29 29 0a 20 20 20 20 69 66 20 66 75 6e 63 53 75  )).    if funcSu
0580: 67 67 32 3a 0a 20 20 20 20 20 20 20 20 61 53 75  gg2:.        aSu
0590: 67 67 32 20 3d 20 66 75 6e 63 53 75 67 67 32 28  gg2 = funcSugg2(
05a0: 73 46 6c 65 78 29 0a 20 20 20 20 20 20 20 20 69  sFlex).        i
05b0: 66 20 61 53 75 67 67 32 3a 0a 20 20 20 20 20 20  f aSugg2:.      
05c0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
05d0: 61 53 75 67 67 32 29 0a 20 20 20 20 69 66 20 61  aSugg2).    if a
05e0: 53 75 67 67 3a 0a 20 20 20 20 20 20 20 20 72 65  Sugg:.        re
05f0: 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e 28 61 53  turn "|".join(aS
0600: 75 67 67 29 0a 20 20 20 20 72 65 74 75 72 6e 20  ugg).    return 
0610: 22 22 0a 0a 0a 64 65 66 20 73 75 67 67 56 65 72  ""...def suggVer
0620: 62 50 70 61 73 20 28 73 46 6c 65 78 2c 20 73 57  bPpas (sFlex, sW
0630: 68 61 74 3d 4e 6f 6e 65 29 3a 0a 20 20 20 20 61  hat=None):.    a
0640: 53 75 67 67 20 3d 20 73 65 74 28 29 0a 20 20 20  Sugg = set().   
0650: 20 66 6f 72 20 73 53 74 65 6d 20 69 6e 20 73 74   for sStem in st
0660: 65 6d 28 73 46 6c 65 78 29 3a 0a 20 20 20 20 20  em(sFlex):.     
0670: 20 20 20 74 54 61 67 73 20 3d 20 63 6f 6e 6a 2e     tTags = conj.
0680: 5f 67 65 74 54 61 67 73 28 73 53 74 65 6d 29 0a  _getTags(sStem).
0690: 20 20 20 20 20 20 20 20 69 66 20 74 54 61 67 73          if tTags
06a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
06b0: 20 6e 6f 74 20 73 57 68 61 74 3a 0a 20 20 20 20   not sWhat:.    
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
06d0: 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43  g.add(conj._getC
06e0: 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74 65  onjWithTags(sSte
06f0: 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22 2c  m, tTags, ":PQ",
0700: 20 22 3a 51 31 22 29 29 0a 20 20 20 20 20 20 20   ":Q1")).       
0710: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
0720: 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a  dd(conj._getConj
0730: 57 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20  WithTags(sStem, 
0740: 74 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a  tTags, ":PQ", ":
0750: 51 32 22 29 29 0a 20 20 20 20 20 20 20 20 20 20  Q2")).          
0760: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0770: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0780: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0790: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22  gs, ":PQ", ":Q3"
07a0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
07b0: 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e     aSugg.add(con
07c0: 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54 61  j._getConjWithTa
07d0: 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73 2c  gs(sStem, tTags,
07e0: 20 22 3a 50 51 22 2c 20 22 3a 51 34 22 29 29 0a   ":PQ", ":Q4")).
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 61 53 75 67 67 2e 64 69 73 63 61 72 64 28 22 22  aSugg.discard(""
0810: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
0820: 69 66 20 73 57 68 61 74 20 3d 3d 20 22 3a 6d 3a  if sWhat == ":m:
0830: 73 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  s":.            
0840: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
0850: 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54  nj._getConjWithT
0860: 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73  ags(sStem, tTags
0870: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29  , ":PQ", ":Q1"))
0880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69  .            eli
0890: 66 20 73 57 68 61 74 20 3d 3d 20 22 3a 6d 3a 70  f sWhat == ":m:p
08a0: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
08b0: 20 20 20 69 66 20 63 6f 6e 6a 2e 5f 68 61 73 43     if conj._hasC
08c0: 6f 6e 6a 57 69 74 68 54 61 67 73 28 74 54 61 67  onjWithTags(tTag
08d0: 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22 29  s, ":PQ", ":Q2")
08e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
08f0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0900: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0910: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0920: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22  gs, ":PQ", ":Q2"
0930: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
0940: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
0960: 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74  gg.add(conj._get
0970: 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74  ConjWithTags(sSt
0980: 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22  em, tTags, ":PQ"
0990: 2c 20 22 3a 51 31 22 29 29 0a 20 20 20 20 20 20  , ":Q1")).      
09a0: 20 20 20 20 20 20 65 6c 69 66 20 73 57 68 61 74        elif sWhat
09b0: 20 3d 3d 20 22 3a 66 3a 73 22 3a 0a 20 20 20 20   == ":f:s":.    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63              if c
09d0: 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a 57 69 74 68  onj._hasConjWith
09e0: 54 61 67 73 28 74 54 61 67 73 2c 20 22 3a 50 51  Tags(tTags, ":PQ
09f0: 22 2c 20 22 3a 51 33 22 29 3a 0a 20 20 20 20 20  ", ":Q3"):.     
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a10: 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67  Sugg.add(conj._g
0a20: 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73  etConjWithTags(s
0a30: 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50  Stem, tTags, ":P
0a40: 51 22 2c 20 22 3a 51 33 22 29 29 0a 20 20 20 20  Q", ":Q3")).    
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
0a60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0a70: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0a80: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0a90: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0aa0: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31 22  gs, ":PQ", ":Q1"
0ab0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  )).            e
0ac0: 6c 69 66 20 73 57 68 61 74 20 3d 3d 20 22 3a 66  lif sWhat == ":f
0ad0: 3a 70 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  :p":.           
0ae0: 20 20 20 20 20 69 66 20 63 6f 6e 6a 2e 5f 68 61       if conj._ha
0af0: 73 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 74 54  sConjWithTags(tT
0b00: 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 34  ags, ":PQ", ":Q4
0b10: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
0b20: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
0b30: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
0b40: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
0b50: 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Tags, ":PQ", ":Q
0b60: 34 22 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  4")).           
0b70: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0b90: 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67  Sugg.add(conj._g
0ba0: 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73  etConjWithTags(s
0bb0: 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50  Stem, tTags, ":P
0bc0: 51 22 2c 20 22 3a 51 31 22 29 29 0a 20 20 20 20  Q", ":Q1")).    
0bd0: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 57 68          elif sWh
0be0: 61 74 20 3d 3d 20 22 3a 73 22 3a 0a 20 20 20 20  at == ":s":.    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
0c00: 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43  g.add(conj._getC
0c10: 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74 65  onjWithTags(sSte
0c20: 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22 2c  m, tTags, ":PQ",
0c30: 20 22 3a 51 31 22 29 29 0a 20 20 20 20 20 20 20   ":Q1")).       
0c40: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
0c50: 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a  dd(conj._getConj
0c60: 57 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20  WithTags(sStem, 
0c70: 74 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a  tTags, ":PQ", ":
0c80: 51 33 22 29 29 0a 20 20 20 20 20 20 20 20 20 20  Q3")).          
0c90: 20 20 20 20 20 20 61 53 75 67 67 2e 64 69 73 63        aSugg.disc
0ca0: 61 72 64 28 22 22 29 0a 20 20 20 20 20 20 20 20  ard("").        
0cb0: 20 20 20 20 65 6c 69 66 20 73 57 68 61 74 20 3d      elif sWhat =
0cc0: 3d 20 22 3a 70 22 3a 0a 20 20 20 20 20 20 20 20  = ":p":.        
0cd0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
0ce0: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
0cf0: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
0d00: 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Tags, ":PQ", ":Q
0d10: 32 22 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  2")).           
0d20: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63       aSugg.add(c
0d30: 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68  onj._getConjWith
0d40: 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67  Tags(sStem, tTag
0d50: 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 34 22 29  s, ":PQ", ":Q4")
0d60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0d70: 20 20 61 53 75 67 67 2e 64 69 73 63 61 72 64 28    aSugg.discard(
0d80: 22 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  "").            
0d90: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
0da0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0db0: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0dc0: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0dd0: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31 22  gs, ":PQ", ":Q1"
0de0: 29 29 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a  )).    if aSugg:
0df0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0e00: 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a  "|".join(aSugg).
0e10: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a      return ""...
0e20: 64 65 66 20 73 75 67 67 56 65 72 62 54 65 6e 73  def suggVerbTens
0e30: 65 20 28 73 46 6c 65 78 2c 20 73 54 65 6e 73 65  e (sFlex, sTense
0e40: 2c 20 73 57 68 6f 29 3a 0a 20 20 20 20 61 53 75  , sWho):.    aSu
0e50: 67 67 20 3d 20 73 65 74 28 29 0a 20 20 20 20 66  gg = set().    f
0e60: 6f 72 20 73 53 74 65 6d 20 69 6e 20 73 74 65 6d  or sStem in stem
0e70: 28 73 46 6c 65 78 29 3a 0a 20 20 20 20 20 20 20  (sFlex):.       
0e80: 20 69 66 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a   if conj.hasConj
0e90: 28 73 53 74 65 6d 2c 20 73 54 65 6e 73 65 2c 20  (sStem, sTense, 
0ea0: 73 57 68 6f 29 3a 0a 20 20 20 20 20 20 20 20 20  sWho):.         
0eb0: 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e     aSugg.add(con
0ec0: 6a 2e 67 65 74 43 6f 6e 6a 28 73 53 74 65 6d 2c  j.getConj(sStem,
0ed0: 20 73 54 65 6e 73 65 2c 20 73 57 68 6f 29 29 0a   sTense, sWho)).
0ee0: 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20 20      if aSugg:.  
0ef0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c 22        return "|"
0f00: 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20 20  .join(aSugg).   
0f10: 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65 66   return ""...def
0f20: 20 73 75 67 67 56 65 72 62 49 6d 70 65 20 28 73   suggVerbImpe (s
0f30: 46 6c 65 78 29 3a 0a 20 20 20 20 61 53 75 67 67  Flex):.    aSugg
0f40: 20 3d 20 73 65 74 28 29 0a 20 20 20 20 66 6f 72   = set().    for
0f50: 20 73 53 74 65 6d 20 69 6e 20 73 74 65 6d 28 73   sStem in stem(s
0f60: 46 6c 65 78 29 3a 0a 20 20 20 20 20 20 20 20 74  Flex):.        t
0f70: 54 61 67 73 20 3d 20 63 6f 6e 6a 2e 5f 67 65 74  Tags = conj._get
0f80: 54 61 67 73 28 73 53 74 65 6d 29 0a 20 20 20 20  Tags(sStem).    
0f90: 20 20 20 20 69 66 20 74 54 61 67 73 3a 0a 20 20      if tTags:.  
0fa0: 20 20 20 20 20 20 20 20 20 20 69 66 20 63 6f 6e            if con
0fb0: 6a 2e 5f 68 61 73 43 6f 6e 6a 57 69 74 68 54 61  j._hasConjWithTa
0fc0: 67 73 28 74 54 61 67 73 2c 20 22 3a 45 22 2c 20  gs(tTags, ":E", 
0fd0: 22 3a 32 73 22 29 3a 0a 20 20 20 20 20 20 20 20  ":2s"):.        
0fe0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
0ff0: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
1000: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
1010: 54 61 67 73 2c 20 22 3a 45 22 2c 20 22 3a 32 73  Tags, ":E", ":2s
1020: 22 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ")).            
1030: 69 66 20 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a  if conj._hasConj
1040: 57 69 74 68 54 61 67 73 28 74 54 61 67 73 2c 20  WithTags(tTags, 
1050: 22 3a 45 22 2c 20 22 3a 31 70 22 29 3a 0a 20 20  ":E", ":1p"):.  
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1070: 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65  ugg.add(conj._ge
1080: 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53  tConjWithTags(sS
1090: 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 45 22  tem, tTags, ":E"
10a0: 2c 20 22 3a 31 70 22 29 29 0a 20 20 20 20 20 20  , ":1p")).      
10b0: 20 20 20 20 20 20 69 66 20 63 6f 6e 6a 2e 5f 68        if conj._h
10c0: 61 73 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 74  asConjWithTags(t
10d0: 54 61 67 73 2c 20 22 3a 45 22 2c 20 22 3a 32 70  Tags, ":E", ":2p
10e0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
10f0: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
1100: 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54  nj._getConjWithT
1110: 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73  ags(sStem, tTags
1120: 2c 20 22 3a 45 22 2c 20 22 3a 32 70 22 29 29 0a  , ":E", ":2p")).
1130: 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20 20      if aSugg:.  
1140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c 22        return "|"
1150: 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20 20  .join(aSugg).   
1160: 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65 66   return ""...def
1170: 20 73 75 67 67 56 65 72 62 49 6e 66 69 20 28 73   suggVerbInfi (s
1180: 46 6c 65 78 29 3a 0a 20 20 20 20 72 65 74 75 72  Flex):.    retur
1190: 6e 20 22 7c 22 2e 6a 6f 69 6e 28 5b 20 73 53 74  n "|".join([ sSt
11a0: 65 6d 20 20 66 6f 72 20 73 53 74 65 6d 20 69 6e  em  for sStem in
11b0: 20 73 74 65 6d 28 73 46 6c 65 78 29 20 20 69 66   stem(sFlex)  if
11c0: 20 63 6f 6e 6a 2e 69 73 56 65 72 62 28 73 53 74   conj.isVerb(sSt
11d0: 65 6d 29 20 5d 29 0a 0a 0a 5f 64 51 75 69 45 73  em) ])..._dQuiEs
11e0: 74 20 3d 20 7b 20 22 6a 65 22 3a 20 22 3a 31 73  t = { "je": ":1s
11f0: 22 2c 20 22 6a e2 80 99 22 3a 20 22 3a 31 73 22  ", "j...": ":1s"
1200: 2c 20 22 6a e2 80 99 65 6e 22 3a 20 22 3a 31 73  , "j...en": ":1s
1210: 22 2c 20 22 6a e2 80 99 79 22 3a 20 22 3a 31 73  ", "j...y": ":1s
1220: 22 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  ", \.           
1230: 20 20 22 74 75 22 3a 20 22 3a 32 73 22 2c 20 22    "tu": ":2s", "
1240: 69 6c 22 3a 20 22 3a 33 73 22 2c 20 22 6f 6e 22  il": ":3s", "on"
1250: 3a 20 22 3a 33 73 22 2c 20 22 65 6c 6c 65 22 3a  : ":3s", "elle":
1260: 20 22 3a 33 73 22 2c 20 22 6e 6f 75 73 22 3a 20   ":3s", "nous": 
1270: 22 3a 31 70 22 2c 20 22 76 6f 75 73 22 3a 20 22  ":1p", "vous": "
1280: 3a 32 70 22 2c 20 22 69 6c 73 22 3a 20 22 3a 33  :2p", "ils": ":3
1290: 70 22 2c 20 22 65 6c 6c 65 73 22 3a 20 22 3a 33  p", "elles": ":3
12a0: 70 22 20 7d 0a 5f 6c 49 6e 64 69 63 61 74 69 66  p" }._lIndicatif
12b0: 20 3d 20 5b 22 3a 49 70 22 2c 20 22 3a 49 71 22   = [":Ip", ":Iq"
12c0: 2c 20 22 3a 49 73 22 2c 20 22 3a 49 66 22 5d 0a  , ":Is", ":If"].
12d0: 5f 6c 53 75 62 6a 6f 6e 63 74 69 66 20 3d 20 5b  _lSubjonctif = [
12e0: 22 3a 53 70 22 2c 20 22 3a 53 71 22 5d 0a 0a 64  ":Sp", ":Sq"]..d
12f0: 65 66 20 73 75 67 67 56 65 72 62 4d 6f 64 65 20  ef suggVerbMode 
1300: 28 73 46 6c 65 78 2c 20 63 4d 6f 64 65 2c 20 73  (sFlex, cMode, s
1310: 53 75 6a 29 3a 0a 20 20 20 20 69 66 20 63 4d 6f  Suj):.    if cMo
1320: 64 65 20 3d 3d 20 22 3a 49 22 3a 0a 20 20 20 20  de == ":I":.    
1330: 20 20 20 20 6c 4d 6f 64 65 20 3d 20 5f 6c 49 6e      lMode = _lIn
1340: 64 69 63 61 74 69 66 0a 20 20 20 20 65 6c 69 66  dicatif.    elif
1350: 20 63 4d 6f 64 65 20 3d 3d 20 22 3a 53 22 3a 0a   cMode == ":S":.
1360: 20 20 20 20 20 20 20 20 6c 4d 6f 64 65 20 3d 20          lMode = 
1370: 5f 6c 53 75 62 6a 6f 6e 63 74 69 66 0a 20 20 20  _lSubjonctif.   
1380: 20 65 6c 69 66 20 63 4d 6f 64 65 2e 73 74 61 72   elif cMode.star
1390: 74 73 77 69 74 68 28 28 22 3a 49 22 2c 20 22 3a  tswith((":I", ":
13a0: 53 22 29 29 3a 0a 20 20 20 20 20 20 20 20 6c 4d  S")):.        lM
13b0: 6f 64 65 20 3d 20 5b 63 4d 6f 64 65 5d 0a 20 20  ode = [cMode].  
13c0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
13d0: 72 65 74 75 72 6e 20 22 22 0a 20 20 20 20 73 57  return "".    sW
13e0: 68 6f 20 3d 20 5f 64 51 75 69 45 73 74 2e 67 65  ho = _dQuiEst.ge
13f0: 74 28 73 53 75 6a 2e 6c 6f 77 65 72 28 29 2c 20  t(sSuj.lower(), 
1400: 4e 6f 6e 65 29 0a 20 20 20 20 69 66 20 6e 6f 74  None).    if not
1410: 20 73 57 68 6f 3a 0a 20 20 20 20 20 20 20 20 69   sWho:.        i
1420: 66 20 73 53 75 6a 5b 30 3a 31 5d 2e 69 73 6c 6f  f sSuj[0:1].islo
1430: 77 65 72 28 29 3a 20 23 20 70 61 73 20 75 6e 20  wer(): # pas un 
1440: 70 72 6f 6e 6f 6d 2c 20 6e 69 20 75 6e 20 6e 6f  pronom, ni un no
1450: 6d 20 70 72 6f 70 72 65 0a 20 20 20 20 20 20 20  m propre.       
1460: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 20       return "". 
1470: 20 20 20 20 20 20 20 73 57 68 6f 20 3d 20 22 3a         sWho = ":
1480: 33 73 22 0a 20 20 20 20 61 53 75 67 67 20 3d 20  3s".    aSugg = 
1490: 73 65 74 28 29 0a 20 20 20 20 66 6f 72 20 73 53  set().    for sS
14a0: 74 65 6d 20 69 6e 20 73 74 65 6d 28 73 46 6c 65  tem in stem(sFle
14b0: 78 29 3a 0a 20 20 20 20 20 20 20 20 74 54 61 67  x):.        tTag
14c0: 73 20 3d 20 63 6f 6e 6a 2e 5f 67 65 74 54 61 67  s = conj._getTag
14d0: 73 28 73 53 74 65 6d 29 0a 20 20 20 20 20 20 20  s(sStem).       
14e0: 20 69 66 20 74 54 61 67 73 3a 0a 20 20 20 20 20   if tTags:.     
14f0: 20 20 20 20 20 20 20 66 6f 72 20 73 54 65 6e 73         for sTens
1500: 65 20 69 6e 20 6c 4d 6f 64 65 3a 0a 20 20 20 20  e in lMode:.    
1510: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63              if c
1520: 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a 57 69 74 68  onj._hasConjWith
1530: 54 61 67 73 28 74 54 61 67 73 2c 20 73 54 65 6e  Tags(tTags, sTen
1540: 73 65 2c 20 73 57 68 6f 29 3a 0a 20 20 20 20 20  se, sWho):.     
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1560: 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67  Sugg.add(conj._g
1570: 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73  etConjWithTags(s
1580: 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 73 54 65  Stem, tTags, sTe
1590: 6e 73 65 2c 20 73 57 68 6f 29 29 0a 20 20 20 20  nse, sWho)).    
15a0: 69 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20 20  if aSugg:.      
15b0: 20 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69    return "|".joi
15c0: 6e 28 61 53 75 67 67 29 0a 20 20 20 20 72 65 74  n(aSugg).    ret
15d0: 75 72 6e 20 22 22 0a 0a 0a 23 23 20 4e 6f 75 6e  urn ""...## Noun
15e0: 73 20 61 6e 64 20 61 64 6a 65 63 74 69 76 65 73  s and adjectives
15f0: 0a 0a 64 65 66 20 73 75 67 67 50 6c 75 72 20 28  ..def suggPlur (
1600: 73 46 6c 65 78 2c 20 73 57 6f 72 64 54 6f 41 67  sFlex, sWordToAg
1610: 72 65 65 3d 4e 6f 6e 65 29 3a 0a 20 20 20 20 22  ree=None):.    "
1620: 72 65 74 75 72 6e 73 20 70 6c 75 72 61 6c 20 66  returns plural f
1630: 6f 72 6d 73 20 61 73 73 75 6d 69 6e 67 20 73 46  orms assuming sF
1640: 6c 65 78 20 69 73 20 73 69 6e 67 75 6c 61 72 22  lex is singular"
1650: 0a 20 20 20 20 69 66 20 73 57 6f 72 64 54 6f 41  .    if sWordToA
1660: 67 72 65 65 3a 0a 20 20 20 20 20 20 20 20 69 66  gree:.        if
1670: 20 73 57 6f 72 64 54 6f 41 67 72 65 65 20 6e 6f   sWordToAgree no
1680: 74 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 20  t in _dAnalyses 
1690: 61 6e 64 20 6e 6f 74 20 5f 73 74 6f 72 65 4d 6f  and not _storeMo
16a0: 72 70 68 46 72 6f 6d 46 53 41 28 73 57 6f 72 64  rphFromFSA(sWord
16b0: 54 6f 41 67 72 65 65 29 3a 0a 20 20 20 20 20 20  ToAgree):.      
16c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a        return "".
16d0: 20 20 20 20 20 20 20 20 73 47 65 6e 64 65 72 20          sGender 
16e0: 3d 20 63 72 2e 67 65 74 47 65 6e 64 65 72 28 5f  = cr.getGender(_
16f0: 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57  dAnalyses.get(sW
1700: 6f 72 64 54 6f 41 67 72 65 65 2c 20 5b 5d 29 29  ordToAgree, []))
1710: 0a 20 20 20 20 20 20 20 20 69 66 20 73 47 65 6e  .        if sGen
1720: 64 65 72 20 3d 3d 20 22 3a 6d 22 3a 0a 20 20 20  der == ":m":.   
1730: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1740: 73 75 67 67 4d 61 73 50 6c 75 72 28 73 46 6c 65  suggMasPlur(sFle
1750: 78 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  x).        elif 
1760: 73 47 65 6e 64 65 72 20 3d 3d 20 22 3a 66 22 3a  sGender == ":f":
1770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1780: 75 72 6e 20 73 75 67 67 46 65 6d 50 6c 75 72 28  urn suggFemPlur(
1790: 73 46 6c 65 78 29 0a 20 20 20 20 61 53 75 67 67  sFlex).    aSugg
17a0: 20 3d 20 73 65 74 28 29 0a 20 20 20 20 69 66 20   = set().    if 
17b0: 22 2d 22 20 6e 6f 74 20 69 6e 20 73 46 6c 65 78  "-" not in sFlex
17c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 73 46 6c  :.        if sFl
17d0: 65 78 2e 65 6e 64 73 77 69 74 68 28 22 6c 22 29  ex.endswith("l")
17e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
17f0: 20 73 46 6c 65 78 2e 65 6e 64 73 77 69 74 68 28   sFlex.endswith(
1800: 22 61 6c 22 29 20 61 6e 64 20 6c 65 6e 28 73 46  "al") and len(sF
1810: 6c 65 78 29 20 3e 20 32 20 61 6e 64 20 5f 6f 44  lex) > 2 and _oD
1820: 69 63 74 2e 69 73 56 61 6c 69 64 28 73 46 6c 65  ict.isValid(sFle
1830: 78 5b 3a 2d 31 5d 2b 22 75 78 22 29 3a 0a 20 20  x[:-1]+"ux"):.  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1850: 75 67 67 2e 61 64 64 28 73 46 6c 65 78 5b 3a 2d  ugg.add(sFlex[:-
1860: 31 5d 2b 22 75 78 22 29 0a 20 20 20 20 20 20 20  1]+"ux").       
1870: 20 20 20 20 20 69 66 20 73 46 6c 65 78 2e 65 6e       if sFlex.en
1880: 64 73 77 69 74 68 28 22 61 69 6c 22 29 20 61 6e  dswith("ail") an
1890: 64 20 6c 65 6e 28 73 46 6c 65 78 29 20 3e 20 33  d len(sFlex) > 3
18a0: 20 61 6e 64 20 5f 6f 44 69 63 74 2e 69 73 56 61   and _oDict.isVa
18b0: 6c 69 64 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22  lid(sFlex[:-2]+"
18c0: 75 78 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ux"):.          
18d0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
18e0: 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 75 78 22 29  sFlex[:-2]+"ux")
18f0: 0a 20 20 20 20 20 20 20 20 69 66 20 5f 6f 44 69  .        if _oDi
1900: 63 74 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78  ct.isValid(sFlex
1910: 2b 22 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20  +"s"):.         
1920: 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 46 6c     aSugg.add(sFl
1930: 65 78 2b 22 73 22 29 0a 20 20 20 20 20 20 20 20  ex+"s").        
1940: 69 66 20 5f 6f 44 69 63 74 2e 69 73 56 61 6c 69  if _oDict.isVali
1950: 64 28 73 46 6c 65 78 2b 22 78 22 29 3a 0a 20 20  d(sFlex+"x"):.  
1960: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
1970: 61 64 64 28 73 46 6c 65 78 2b 22 78 22 29 0a 20  add(sFlex+"x"). 
1980: 20 20 20 69 66 20 6d 66 73 70 2e 68 61 73 4d 69     if mfsp.hasMi
1990: 73 63 50 6c 75 72 61 6c 28 73 46 6c 65 78 29 3a  scPlural(sFlex):
19a0: 0a 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 75  .        aSugg.u
19b0: 70 64 61 74 65 28 6d 66 73 70 2e 67 65 74 4d 69  pdate(mfsp.getMi
19c0: 73 63 50 6c 75 72 61 6c 28 73 46 6c 65 78 29 29  scPlural(sFlex))
19d0: 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20  .    if aSugg:. 
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c         return "|
19f0: 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20  ".join(aSugg).  
1a00: 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65    return ""...de
1a10: 66 20 73 75 67 67 53 69 6e 67 20 28 73 46 6c 65  f suggSing (sFle
1a20: 78 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  x):.    "returns
1a30: 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d 73 20   singular forms 
1a40: 61 73 73 75 6d 69 6e 67 20 73 46 6c 65 78 20 69  assuming sFlex i
1a50: 73 20 70 6c 75 72 61 6c 22 0a 20 20 20 20 69 66  s plural".    if
1a60: 20 22 2d 22 20 69 6e 20 73 46 6c 65 78 3a 0a 20   "-" in sFlex:. 
1a70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
1a80: 0a 20 20 20 20 61 53 75 67 67 20 3d 20 73 65 74  .    aSugg = set
1a90: 28 29 0a 20 20 20 20 69 66 20 73 46 6c 65 78 2e  ().    if sFlex.
1aa0: 65 6e 64 73 77 69 74 68 28 22 75 78 22 29 3a 0a  endswith("ux"):.
1ab0: 20 20 20 20 20 20 20 20 69 66 20 5f 6f 44 69 63          if _oDic
1ac0: 74 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78 5b  t.isValid(sFlex[
1ad0: 3a 2d 32 5d 2b 22 6c 22 29 3a 0a 20 20 20 20 20  :-2]+"l"):.     
1ae0: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
1af0: 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 6c 22 29  (sFlex[:-2]+"l")
1b00: 0a 20 20 20 20 20 20 20 20 69 66 20 5f 6f 44 69  .        if _oDi
1b10: 63 74 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78  ct.isValid(sFlex
1b20: 5b 3a 2d 32 5d 2b 22 69 6c 22 29 3a 0a 20 20 20  [:-2]+"il"):.   
1b30: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
1b40: 64 64 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 69  dd(sFlex[:-2]+"i
1b50: 6c 22 29 0a 20 20 20 20 69 66 20 5f 6f 44 69 63  l").    if _oDic
1b60: 74 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78 5b  t.isValid(sFlex[
1b70: 3a 2d 31 5d 29 3a 0a 20 20 20 20 20 20 20 20 61  :-1]):.        a
1b80: 53 75 67 67 2e 61 64 64 28 73 46 6c 65 78 5b 3a  Sugg.add(sFlex[:
1b90: 2d 31 5d 29 0a 20 20 20 20 69 66 20 61 53 75 67  -1]).    if aSug
1ba0: 67 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  g:.        retur
1bb0: 6e 20 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67  n "|".join(aSugg
1bc0: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a  ).    return "".
1bd0: 0a 0a 64 65 66 20 73 75 67 67 4d 61 73 53 69 6e  ..def suggMasSin
1be0: 67 20 28 73 46 6c 65 78 2c 20 62 53 75 67 67 53  g (sFlex, bSuggS
1bf0: 69 6d 69 6c 3d 46 61 6c 73 65 29 3a 0a 20 20 20  imil=False):.   
1c00: 20 22 72 65 74 75 72 6e 73 20 6d 61 73 63 75 6c   "returns mascul
1c10: 69 6e 65 20 73 69 6e 67 75 6c 61 72 20 66 6f 72  ine singular for
1c20: 6d 73 22 0a 20 20 20 20 23 20 77 65 20 64 6f 6e  ms".    # we don
1c30: e2 80 99 74 20 63 68 65 63 6b 20 69 66 20 77 6f  ...t check if wo
1c40: 72 64 20 65 78 69 73 74 73 20 69 6e 20 5f 64 41  rd exists in _dA
1c50: 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20 69 74 20  nalyses, for it 
1c60: 69 73 20 61 73 73 75 6d 65 64 20 69 74 20 68 61  is assumed it ha
1c70: 73 20 62 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f  s been done befo
1c80: 72 65 0a 20 20 20 20 61 53 75 67 67 20 3d 20 73  re.    aSugg = s
1c90: 65 74 28 29 0a 20 20 20 20 66 6f 72 20 73 4d 6f  et().    for sMo
1ca0: 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65  rph in _dAnalyse
1cb0: 73 2e 67 65 74 28 73 46 6c 65 78 2c 20 5b 5d 29  s.get(sFlex, [])
1cc0: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74  :.        if not
1cd0: 20 22 3a 56 22 20 69 6e 20 73 4d 6f 72 70 68 3a   ":V" in sMorph:
1ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6e  .            # n
1cf0: 6f 74 20 61 20 76 65 72 62 0a 20 20 20 20 20 20  ot a verb.      
1d00: 20 20 20 20 20 20 69 66 20 22 3a 6d 22 20 69 6e        if ":m" in
1d10: 20 73 4d 6f 72 70 68 20 6f 72 20 22 3a 65 22 20   sMorph or ":e" 
1d20: 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20  in sMorph:.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
1d40: 2e 61 64 64 28 73 75 67 67 53 69 6e 67 28 73 46  .add(suggSing(sF
1d50: 6c 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  lex)).          
1d60: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
1d70: 20 20 20 20 20 20 20 20 73 53 74 65 6d 20 3d 20          sStem = 
1d80: 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72  cr.getLemmaOfMor
1d90: 70 68 28 73 4d 6f 72 70 68 29 0a 20 20 20 20 20  ph(sMorph).     
1da0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6d 66             if mf
1db0: 73 70 2e 69 73 46 65 6d 46 6f 72 6d 28 73 53 74  sp.isFemForm(sSt
1dc0: 65 6d 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  em):.           
1dd0: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 75           aSugg.u
1de0: 70 64 61 74 65 28 6d 66 73 70 2e 67 65 74 4d 61  pdate(mfsp.getMa
1df0: 73 46 6f 72 6d 28 73 53 74 65 6d 2c 20 46 61 6c  sForm(sStem, Fal
1e00: 73 65 29 29 0a 20 20 20 20 20 20 20 20 65 6c 73  se)).        els
1e10: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e:.            #
1e20: 20 61 20 76 65 72 62 0a 20 20 20 20 20 20 20 20   a verb.        
1e30: 20 20 20 20 73 56 65 72 62 20 3d 20 63 72 2e 67      sVerb = cr.g
1e40: 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28 73  etLemmaOfMorph(s
1e50: 4d 6f 72 70 68 29 0a 20 20 20 20 20 20 20 20 20  Morph).         
1e60: 20 20 20 69 66 20 63 6f 6e 6a 2e 68 61 73 43 6f     if conj.hasCo
1e70: 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c  nj(sVerb, ":PQ",
1e80: 20 22 3a 51 31 22 29 20 61 6e 64 20 63 6f 6e 6a   ":Q1") and conj
1e90: 2e 68 61 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20  .hasConj(sVerb, 
1ea0: 22 3a 50 51 22 2c 20 22 3a 51 33 22 29 3a 0a 20  ":PQ", ":Q3"):. 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ec0: 20 57 65 20 61 6c 73 6f 20 63 68 65 63 6b 20 69   We also check i
1ed0: 66 20 74 68 65 20 76 65 72 62 20 68 61 73 20 61  f the verb has a
1ee0: 20 66 65 6d 69 6e 69 6e 65 20 66 6f 72 6d 2e 0a   feminine form..
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 23 20 49 66 20 6e 6f 74 2c 20 77 65 20 63 6f 6e  # If not, we con
1f10: 73 69 64 65 72 20 69 74 e2 80 99 73 20 62 65 74  sider it...s bet
1f20: 74 65 72 20 74 6f 20 6e 6f 74 20 73 75 67 67 65  ter to not sugge
1f30: 73 74 20 74 68 65 20 6d 61 73 63 75 6c 69 6e 65  st the masculine
1f40: 20 6f 6e 65 2c 20 61 73 20 69 74 20 63 61 6e 20   one, as it can 
1f50: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e  be considered in
1f60: 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20  variable..      
1f70: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
1f80: 61 64 64 28 63 6f 6e 6a 2e 67 65 74 43 6f 6e 6a  add(conj.getConj
1f90: 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c 20 22  (sVerb, ":PQ", "
1fa0: 3a 51 31 22 29 29 0a 20 20 20 20 69 66 20 62 53  :Q1")).    if bS
1fb0: 75 67 67 53 69 6d 69 6c 3a 0a 20 20 20 20 20 20  uggSimil:.      
1fc0: 20 20 66 6f 72 20 65 20 69 6e 20 70 68 6f 6e 65    for e in phone
1fd0: 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c 28 73 46  t.selectSimil(sF
1fe0: 6c 65 78 2c 20 22 3a 6d 3a 5b 73 69 5d 22 29 3a  lex, ":m:[si]"):
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75  .            aSu
2000: 67 67 2e 61 64 64 28 65 29 0a 20 20 20 20 69 66  gg.add(e).    if
2010: 20 61 53 75 67 67 3a 0a 20 20 20 20 20 20 20 20   aSugg:.        
2020: 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e 28  return "|".join(
2030: 61 53 75 67 67 29 0a 20 20 20 20 72 65 74 75 72  aSugg).    retur
2040: 6e 20 22 22 0a 0a 0a 64 65 66 20 73 75 67 67 4d  n ""...def suggM
2050: 61 73 50 6c 75 72 20 28 73 46 6c 65 78 2c 20 62  asPlur (sFlex, b
2060: 53 75 67 67 53 69 6d 69 6c 3d 46 61 6c 73 65 29  SuggSimil=False)
2070: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 6d  :.    "returns m
2080: 61 73 63 75 6c 69 6e 65 20 70 6c 75 72 61 6c 20  asculine plural 
2090: 66 6f 72 6d 73 22 0a 20 20 20 20 23 20 77 65 20  forms".    # we 
20a0: 64 6f 6e e2 80 99 74 20 63 68 65 63 6b 20 69 66  don...t check if
20b0: 20 77 6f 72 64 20 65 78 69 73 74 73 20 69 6e 20   word exists in 
20c0: 5f 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20  _dAnalyses, for 
20d0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 69 74  it is assumed it
20e0: 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 62   has been done b
20f0: 65 66 6f 72 65 0a 20 20 20 20 61 53 75 67 67 20  efore.    aSugg 
2100: 3d 20 73 65 74 28 29 0a 20 20 20 20 66 6f 72 20  = set().    for 
2110: 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c  sMorph in _dAnal
2120: 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c 20  yses.get(sFlex, 
2130: 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  []):.        if 
2140: 6e 6f 74 20 22 3a 56 22 20 69 6e 20 73 4d 6f 72  not ":V" in sMor
2150: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
2160: 23 20 6e 6f 74 20 61 20 76 65 72 62 0a 20 20 20  # not a verb.   
2170: 20 20 20 20 20 20 20 20 20 69 66 20 22 3a 6d 22           if ":m"
2180: 20 69 6e 20 73 4d 6f 72 70 68 20 6f 72 20 22 3a   in sMorph or ":
2190: 65 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20  e" in sMorph:.  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
21b0: 75 67 67 2e 61 64 64 28 73 75 67 67 50 6c 75 72  ugg.add(suggPlur
21c0: 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20 20 20  (sFlex)).       
21d0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
21e0: 20 20 20 20 20 20 20 20 20 20 20 73 53 74 65 6d             sStem
21f0: 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66   = cr.getLemmaOf
2200: 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29 0a 20 20  Morph(sMorph).  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2220: 20 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72 6d 28   mfsp.isFemForm(
2230: 73 53 74 65 6d 29 3a 0a 20 20 20 20 20 20 20 20  sStem):.        
2240: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
2250: 67 2e 75 70 64 61 74 65 28 6d 66 73 70 2e 67 65  g.update(mfsp.ge
2260: 74 4d 61 73 46 6f 72 6d 28 73 53 74 65 6d 2c 20  tMasForm(sStem, 
2270: 54 72 75 65 29 29 0a 20 20 20 20 20 20 20 20 65  True)).        e
2280: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
2290: 20 23 20 61 20 76 65 72 62 0a 20 20 20 20 20 20   # a verb.      
22a0: 20 20 20 20 20 20 73 56 65 72 62 20 3d 20 63 72        sVerb = cr
22b0: 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68  .getLemmaOfMorph
22c0: 28 73 4d 6f 72 70 68 29 0a 20 20 20 20 20 20 20  (sMorph).       
22d0: 20 20 20 20 20 69 66 20 63 6f 6e 6a 2e 68 61 73       if conj.has
22e0: 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51  Conj(sVerb, ":PQ
22f0: 22 2c 20 22 3a 51 32 22 29 3a 0a 20 20 20 20 20  ", ":Q2"):.     
2300: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
2310: 2e 61 64 64 28 63 6f 6e 6a 2e 67 65 74 43 6f 6e  .add(conj.getCon
2320: 6a 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c 20  j(sVerb, ":PQ", 
2330: 22 3a 51 32 22 29 29 0a 20 20 20 20 20 20 20 20  ":Q2")).        
2340: 20 20 20 20 65 6c 69 66 20 63 6f 6e 6a 2e 68 61      elif conj.ha
2350: 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50  sConj(sVerb, ":P
2360: 51 22 2c 20 22 3a 51 31 22 29 3a 0a 20 20 20 20  Q", ":Q1"):.    
2370: 20 20 20 20 20 20 20 20 20 20 20 20 73 53 75 67              sSug
2380: 67 20 3d 20 63 6f 6e 6a 2e 67 65 74 43 6f 6e 6a  g = conj.getConj
2390: 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c 20 22  (sVerb, ":PQ", "
23a0: 3a 51 31 22 29 0a 20 20 20 20 20 20 20 20 20 20  :Q1").          
23b0: 20 20 20 20 20 20 23 20 69 74 20 69 73 20 6e 65        # it is ne
23c0: 63 65 73 73 61 72 79 20 74 6f 20 66 69 6c 74 65  cessary to filte
23d0: 72 20 74 68 65 73 65 20 66 6c 65 78 69 6f 6e 73  r these flexions
23e0: 2c 20 6c 69 6b 65 20 e2 80 9c 73 75 63 63 c3 a9  , like ...succ..
23f0: 64 c3 a9 e2 80 9d 20 6f 72 20 e2 80 9c 61 67 69  d..... or ...agi
2400: e2 80 9d 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ... that are not
2410: 20 6d 61 73 63 75 6c 69 6e 65 20 70 6c 75 72 61   masculine plura
2420: 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l..             
2430: 20 20 20 69 66 20 73 53 75 67 67 2e 65 6e 64 73     if sSugg.ends
2440: 77 69 74 68 28 22 73 22 29 3a 0a 20 20 20 20 20  with("s"):.     
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2460: 53 75 67 67 2e 61 64 64 28 73 53 75 67 67 29 0a  Sugg.add(sSugg).
2470: 20 20 20 20 69 66 20 62 53 75 67 67 53 69 6d 69      if bSuggSimi
2480: 6c 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 65  l:.        for e
2490: 20 69 6e 20 70 68 6f 6e 65 74 2e 73 65 6c 65 63   in phonet.selec
24a0: 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a  tSimil(sFlex, ":
24b0: 6d 3a 5b 70 69 5d 22 29 3a 0a 20 20 20 20 20 20  m:[pi]"):.      
24c0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
24d0: 65 29 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a  e).    if aSugg:
24e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24f0: 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a  "|".join(aSugg).
2500: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a      return ""...
2510: 64 65 66 20 73 75 67 67 46 65 6d 53 69 6e 67 20  def suggFemSing 
2520: 28 73 46 6c 65 78 2c 20 62 53 75 67 67 53 69 6d  (sFlex, bSuggSim
2530: 69 6c 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22  il=False):.    "
2540: 72 65 74 75 72 6e 73 20 66 65 6d 69 6e 69 6e 65  returns feminine
2550: 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d 73 22   singular forms"
2560: 0a 20 20 20 20 23 20 77 65 20 64 6f 6e e2 80 99  .    # we don...
2570: 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20  t check if word 
2580: 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c  exists in _dAnal
2590: 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20  yses, for it is 
25a0: 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62  assumed it has b
25b0: 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a  een done before.
25c0: 20 20 20 20 61 53 75 67 67 20 3d 20 73 65 74 28      aSugg = set(
25d0: 29 0a 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68  ).    for sMorph
25e0: 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67   in _dAnalyses.g
25f0: 65 74 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20  et(sFlex, []):. 
2600: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 22 3a         if not ":
2610: 56 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20  V" in sMorph:.  
2620: 20 20 20 20 20 20 20 20 20 20 23 20 6e 6f 74 20            # not 
2630: 61 20 76 65 72 62 0a 20 20 20 20 20 20 20 20 20  a verb.         
2640: 20 20 20 69 66 20 22 3a 66 22 20 69 6e 20 73 4d     if ":f" in sM
2650: 6f 72 70 68 20 6f 72 20 22 3a 65 22 20 69 6e 20  orph or ":e" in 
2660: 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20  sMorph:.        
2670: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
2680: 64 28 73 75 67 67 53 69 6e 67 28 73 46 6c 65 78  d(suggSing(sFlex
2690: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  )).            e
26a0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
26b0: 20 20 20 20 20 73 53 74 65 6d 20 3d 20 63 72 2e       sStem = cr.
26c0: 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28  getLemmaOfMorph(
26d0: 73 4d 6f 72 70 68 29 0a 20 20 20 20 20 20 20 20  sMorph).        
26e0: 20 20 20 20 20 20 20 20 69 66 20 6d 66 73 70 2e          if mfsp.
26f0: 69 73 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d 29  isFemForm(sStem)
2700: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2710: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
2720: 73 53 74 65 6d 29 0a 20 20 20 20 20 20 20 20 65  sStem).        e
2730: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
2740: 20 23 20 61 20 76 65 72 62 0a 20 20 20 20 20 20   # a verb.      
2750: 20 20 20 20 20 20 73 56 65 72 62 20 3d 20 63 72        sVerb = cr
2760: 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68  .getLemmaOfMorph
2770: 28 73 4d 6f 72 70 68 29 0a 20 20 20 20 20 20 20  (sMorph).       
2780: 20 20 20 20 20 69 66 20 63 6f 6e 6a 2e 68 61 73       if conj.has
2790: 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51  Conj(sVerb, ":PQ
27a0: 22 2c 20 22 3a 51 33 22 29 3a 0a 20 20 20 20 20  ", ":Q3"):.     
27b0: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
27c0: 2e 61 64 64 28 63 6f 6e 6a 2e 67 65 74 43 6f 6e  .add(conj.getCon
27d0: 6a 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c 20  j(sVerb, ":PQ", 
27e0: 22 3a 51 33 22 29 29 0a 20 20 20 20 69 66 20 62  ":Q3")).    if b
27f0: 53 75 67 67 53 69 6d 69 6c 3a 0a 20 20 20 20 20  SuggSimil:.     
2800: 20 20 20 66 6f 72 20 65 20 69 6e 20 70 68 6f 6e     for e in phon
2810: 65 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c 28 73  et.selectSimil(s
2820: 46 6c 65 78 2c 20 22 3a 66 3a 5b 73 69 5d 22 29  Flex, ":f:[si]")
2830: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  :.            aS
2840: 75 67 67 2e 61 64 64 28 65 29 0a 20 20 20 20 69  ugg.add(e).    i
2850: 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20 20 20  f aSugg:.       
2860: 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e   return "|".join
2870: 28 61 53 75 67 67 29 0a 20 20 20 20 72 65 74 75  (aSugg).    retu
2880: 72 6e 20 22 22 0a 0a 0a 64 65 66 20 73 75 67 67  rn ""...def sugg
2890: 46 65 6d 50 6c 75 72 20 28 73 46 6c 65 78 2c 20  FemPlur (sFlex, 
28a0: 62 53 75 67 67 53 69 6d 69 6c 3d 46 61 6c 73 65  bSuggSimil=False
28b0: 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20  ):.    "returns 
28c0: 66 65 6d 69 6e 69 6e 65 20 70 6c 75 72 61 6c 20  feminine plural 
28d0: 66 6f 72 6d 73 22 0a 20 20 20 20 23 20 77 65 20  forms".    # we 
28e0: 64 6f 6e e2 80 99 74 20 63 68 65 63 6b 20 69 66  don...t check if
28f0: 20 77 6f 72 64 20 65 78 69 73 74 73 20 69 6e 20   word exists in 
2900: 5f 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20  _dAnalyses, for 
2910: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 69 74  it is assumed it
2920: 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 62   has been done b
2930: 65 66 6f 72 65 0a 20 20 20 20 61 53 75 67 67 20  efore.    aSugg 
2940: 3d 20 73 65 74 28 29 0a 20 20 20 20 66 6f 72 20  = set().    for 
2950: 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c  sMorph in _dAnal
2960: 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c 20  yses.get(sFlex, 
2970: 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  []):.        if 
2980: 6e 6f 74 20 22 3a 56 22 20 69 6e 20 73 4d 6f 72  not ":V" in sMor
2990: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
29a0: 23 20 6e 6f 74 20 61 20 76 65 72 62 0a 20 20 20  # not a verb.   
29b0: 20 20 20 20 20 20 20 20 20 69 66 20 22 3a 66 22           if ":f"
29c0: 20 69 6e 20 73 4d 6f 72 70 68 20 6f 72 20 22 3a   in sMorph or ":
29d0: 65 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20  e" in sMorph:.  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
29f0: 75 67 67 2e 61 64 64 28 73 75 67 67 50 6c 75 72  ugg.add(suggPlur
2a00: 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20 20 20  (sFlex)).       
2a10: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
2a20: 20 20 20 20 20 20 20 20 20 20 20 73 53 74 65 6d             sStem
2a30: 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66   = cr.getLemmaOf
2a40: 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29 0a 20 20  Morph(sMorph).  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a60: 20 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72 6d 28   mfsp.isFemForm(
2a70: 73 53 74 65 6d 29 3a 0a 20 20 20 20 20 20 20 20  sStem):.        
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
2a90: 67 2e 61 64 64 28 73 53 74 65 6d 2b 22 73 22 29  g.add(sStem+"s")
2aa0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 23 20 61 20 76             # a v
2ac0: 65 72 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  erb.            
2ad0: 73 56 65 72 62 20 3d 20 63 72 2e 67 65 74 4c 65  sVerb = cr.getLe
2ae0: 6d 6d 61 4f 66 4d 6f 72 70 68 28 73 4d 6f 72 70  mmaOfMorph(sMorp
2af0: 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  h).            i
2b00: 66 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73  f conj.hasConj(s
2b10: 56 65 72 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Verb, ":PQ", ":Q
2b20: 34 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  4"):.           
2b30: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63       aSugg.add(c
2b40: 6f 6e 6a 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72  onj.getConj(sVer
2b50: 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51 34 22 29  b, ":PQ", ":Q4")
2b60: 29 0a 20 20 20 20 69 66 20 62 53 75 67 67 53 69  ).    if bSuggSi
2b70: 6d 69 6c 3a 0a 20 20 20 20 20 20 20 20 66 6f 72  mil:.        for
2b80: 20 65 20 69 6e 20 70 68 6f 6e 65 74 2e 73 65 6c   e in phonet.sel
2b90: 65 63 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20  ectSimil(sFlex, 
2ba0: 22 3a 66 3a 5b 70 69 5d 22 29 3a 0a 20 20 20 20  ":f:[pi]"):.    
2bb0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
2bc0: 64 28 65 29 0a 20 20 20 20 69 66 20 61 53 75 67  d(e).    if aSug
2bd0: 67 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  g:.        retur
2be0: 6e 20 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67  n "|".join(aSugg
2bf0: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a  ).    return "".
2c00: 0a 0a 64 65 66 20 68 61 73 46 65 6d 46 6f 72 6d  ..def hasFemForm
2c10: 20 28 73 46 6c 65 78 29 3a 0a 20 20 20 20 66 6f   (sFlex):.    fo
2c20: 72 20 73 53 74 65 6d 20 69 6e 20 73 74 65 6d 28  r sStem in stem(
2c30: 73 46 6c 65 78 29 3a 0a 20 20 20 20 20 20 20 20  sFlex):.        
2c40: 69 66 20 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72  if mfsp.isFemFor
2c50: 6d 28 73 53 74 65 6d 29 20 6f 72 20 63 6f 6e 6a  m(sStem) or conj
2c60: 2e 68 61 73 43 6f 6e 6a 28 73 53 74 65 6d 2c 20  .hasConj(sStem, 
2c70: 22 3a 50 51 22 2c 20 22 3a 51 33 22 29 3a 0a 20  ":PQ", ":Q3"):. 
2c80: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c90: 6e 20 54 72 75 65 0a 20 20 20 20 69 66 20 70 68  n True.    if ph
2ca0: 6f 6e 65 74 2e 68 61 73 53 69 6d 69 6c 28 73 46  onet.hasSimil(sF
2cb0: 6c 65 78 2c 20 22 3a 66 22 29 3a 0a 20 20 20 20  lex, ":f"):.    
2cc0: 20 20 20 20 72 65 74 75 72 6e 20 54 72 75 65 0a      return True.
2cd0: 20 20 20 20 72 65 74 75 72 6e 20 46 61 6c 73 65      return False
2ce0: 0a 0a 0a 64 65 66 20 68 61 73 4d 61 73 46 6f 72  ...def hasMasFor
2cf0: 6d 20 28 73 46 6c 65 78 29 3a 0a 20 20 20 20 66  m (sFlex):.    f
2d00: 6f 72 20 73 53 74 65 6d 20 69 6e 20 73 74 65 6d  or sStem in stem
2d10: 28 73 46 6c 65 78 29 3a 0a 20 20 20 20 20 20 20  (sFlex):.       
2d20: 20 69 66 20 6d 66 73 70 2e 69 73 46 65 6d 46 6f   if mfsp.isFemFo
2d30: 72 6d 28 73 53 74 65 6d 29 20 6f 72 20 63 6f 6e  rm(sStem) or con
2d40: 6a 2e 68 61 73 43 6f 6e 6a 28 73 53 74 65 6d 2c  j.hasConj(sStem,
2d50: 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 3a 0a   ":PQ", ":Q1"):.
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 77 68              # wh
2d70: 61 74 20 68 61 73 20 61 20 66 65 6d 69 6e 69 6e  at has a feminin
2d80: 65 20 66 6f 72 6d 20 61 6c 73 6f 20 68 61 73 20  e form also has 
2d90: 61 20 6d 61 73 63 75 6c 69 6e 65 20 66 6f 72 6d  a masculine form
2da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2db0: 75 72 6e 20 54 72 75 65 0a 20 20 20 20 69 66 20  urn True.    if 
2dc0: 70 68 6f 6e 65 74 2e 68 61 73 53 69 6d 69 6c 28  phonet.hasSimil(
2dd0: 73 46 6c 65 78 2c 20 22 3a 6d 22 29 3a 0a 20 20  sFlex, ":m"):.  
2de0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 72 75        return Tru
2df0: 65 0a 20 20 20 20 72 65 74 75 72 6e 20 46 61 6c  e.    return Fal
2e00: 73 65 0a 0a 0a 64 65 66 20 73 77 69 74 63 68 47  se...def switchG
2e10: 65 6e 64 65 72 20 28 73 46 6c 65 78 2c 20 62 50  ender (sFlex, bP
2e20: 6c 75 72 3d 4e 6f 6e 65 29 3a 0a 20 20 20 20 23  lur=None):.    #
2e30: 20 77 65 20 64 6f 6e e2 80 99 74 20 63 68 65 63   we don...t chec
2e40: 6b 20 69 66 20 77 6f 72 64 20 65 78 69 73 74 73  k if word exists
2e50: 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2c 20   in _dAnalyses, 
2e60: 66 6f 72 20 69 74 20 69 73 20 61 73 73 75 6d 65  for it is assume
2e70: 64 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 6f  d it has been do
2e80: 6e 65 20 62 65 66 6f 72 65 0a 20 20 20 20 61 53  ne before.    aS
2e90: 75 67 67 20 3d 20 73 65 74 28 29 0a 20 20 20 20  ugg = set().    
2ea0: 69 66 20 62 50 6c 75 72 20 3d 3d 20 4e 6f 6e 65  if bPlur == None
2eb0: 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 4d  :.        for sM
2ec0: 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c 79 73  orph in _dAnalys
2ed0: 65 73 2e 67 65 74 28 73 46 6c 65 78 2c 20 5b 5d  es.get(sFlex, []
2ee0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
2ef0: 66 20 22 3a 66 22 20 69 6e 20 73 4d 6f 72 70 68  f ":f" in sMorph
2f00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2f10: 20 20 69 66 20 22 3a 73 22 20 69 6e 20 73 4d 6f    if ":s" in sMo
2f20: 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20  rph:.           
2f30: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
2f40: 64 64 28 73 75 67 67 4d 61 73 53 69 6e 67 28 73  dd(suggMasSing(s
2f50: 46 6c 65 78 29 29 0a 20 20 20 20 20 20 20 20 20  Flex)).         
2f60: 20 20 20 20 20 20 20 65 6c 69 66 20 22 3a 70 22         elif ":p"
2f70: 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20   in sMorph:.    
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 61 53 75 67 67 2e 61 64 64 28 73 75 67 67 4d 61  aSugg.add(suggMa
2fa0: 73 50 6c 75 72 28 73 46 6c 65 78 29 29 0a 20 20  sPlur(sFlex)).  
2fb0: 20 20 20 20 20 20 20 20 20 20 65 6c 69 66 20 22            elif "
2fc0: 3a 6d 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20  :m" in sMorph:. 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2fe0: 66 20 22 3a 73 22 20 69 6e 20 73 4d 6f 72 70 68  f ":s" in sMorph
2ff0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3000: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
3010: 73 75 67 67 46 65 6d 53 69 6e 67 28 73 46 6c 65  suggFemSing(sFle
3020: 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  x)).            
3030: 20 20 20 20 65 6c 69 66 20 22 3a 70 22 20 69 6e      elif ":p" in
3040: 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20   sMorph:.       
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
3060: 67 67 2e 61 64 64 28 73 75 67 67 46 65 6d 50 6c  gg.add(suggFemPl
3070: 75 72 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20  ur(sFlex)).     
3080: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
3090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a0: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
30b0: 75 67 67 46 65 6d 53 69 6e 67 28 73 46 6c 65 78  uggFemSing(sFlex
30c0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
30d0: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
30e0: 28 73 75 67 67 46 65 6d 50 6c 75 72 28 73 46 6c  (suggFemPlur(sFl
30f0: 65 78 29 29 0a 20 20 20 20 65 6c 69 66 20 62 50  ex)).    elif bP
3100: 6c 75 72 3a 0a 20 20 20 20 20 20 20 20 66 6f 72  lur:.        for
3110: 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61   sMorph in _dAna
3120: 6c 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c  lyses.get(sFlex,
3130: 20 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 20 20   []):.          
3140: 20 20 69 66 20 22 3a 66 22 20 69 6e 20 73 4d 6f    if ":f" in sMo
3150: 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20  rph:.           
3160: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
3170: 75 67 67 4d 61 73 50 6c 75 72 28 73 46 6c 65 78  uggMasPlur(sFlex
3180: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  )).            e
3190: 6c 69 66 20 22 3a 6d 22 20 69 6e 20 73 4d 6f 72  lif ":m" in sMor
31a0: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
31b0: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 75      aSugg.add(su
31c0: 67 67 46 65 6d 50 6c 75 72 28 73 46 6c 65 78 29  ggFemPlur(sFlex)
31d0: 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ).    else:.    
31e0: 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69      for sMorph i
31f0: 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74  n _dAnalyses.get
3200: 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20 20  (sFlex, []):.   
3210: 20 20 20 20 20 20 20 20 20 69 66 20 22 3a 66 22           if ":f"
3220: 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20   in sMorph:.    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
3240: 67 2e 61 64 64 28 73 75 67 67 4d 61 73 53 69 6e  g.add(suggMasSin
3250: 67 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20 20  g(sFlex)).      
3260: 20 20 20 20 20 20 65 6c 69 66 20 22 3a 6d 22 20        elif ":m" 
3270: 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20  in sMorph:.     
3280: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
3290: 2e 61 64 64 28 73 75 67 67 46 65 6d 53 69 6e 67  .add(suggFemSing
32a0: 28 73 46 6c 65 78 29 29 0a 20 20 20 20 69 66 20  (sFlex)).    if 
32b0: 61 53 75 67 67 3a 0a 20 20 20 20 20 20 20 20 72  aSugg:.        r
32c0: 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e 28 61  eturn "|".join(a
32d0: 53 75 67 67 29 0a 20 20 20 20 72 65 74 75 72 6e  Sugg).    return
32e0: 20 22 22 0a 0a 0a 64 65 66 20 73 77 69 74 63 68   ""...def switch
32f0: 50 6c 75 72 61 6c 20 28 73 46 6c 65 78 29 3a 0a  Plural (sFlex):.
3300: 20 20 20 20 23 20 77 65 20 64 6f 6e e2 80 99 74      # we don...t
3310: 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20 65   check if word e
3320: 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c 79  xists in _dAnaly
3330: 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20 61  ses, for it is a
3340: 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62 65  ssumed it has be
3350: 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a 20  en done before. 
3360: 20 20 20 61 53 75 67 67 20 3d 20 73 65 74 28 29     aSugg = set()
3370: 0a 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68 20  .    for sMorph 
3380: 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65  in _dAnalyses.ge
3390: 74 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20  t(sFlex, []):.  
33a0: 20 20 20 20 20 20 69 66 20 22 3a 73 22 20 69 6e        if ":s" in
33b0: 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20   sMorph:.       
33c0: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
33d0: 75 67 67 50 6c 75 72 28 73 46 6c 65 78 29 29 0a  uggPlur(sFlex)).
33e0: 20 20 20 20 20 20 20 20 65 6c 69 66 20 22 3a 70          elif ":p
33f0: 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20  " in sMorph:.   
3400: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
3410: 64 64 28 73 75 67 67 53 69 6e 67 28 73 46 6c 65  dd(suggSing(sFle
3420: 78 29 29 0a 20 20 20 20 69 66 20 61 53 75 67 67  x)).    if aSugg
3430: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
3440: 20 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29   "|".join(aSugg)
3450: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 0a  .    return ""..
3460: 0a 64 65 66 20 68 61 73 53 69 6d 69 6c 20 28 73  .def hasSimil (s
3470: 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e 3d 4e  Word, sPattern=N
3480: 6f 6e 65 29 3a 0a 20 20 20 20 72 65 74 75 72 6e  one):.    return
3490: 20 70 68 6f 6e 65 74 2e 68 61 73 53 69 6d 69 6c   phonet.hasSimil
34a0: 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e  (sWord, sPattern
34b0: 29 0a 0a 0a 64 65 66 20 73 75 67 67 53 69 6d 69  )...def suggSimi
34c0: 6c 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65  l (sWord, sPatte
34d0: 72 6e 3d 4e 6f 6e 65 2c 20 62 53 75 62 73 74 3d  rn=None, bSubst=
34e0: 46 61 6c 73 65 29 3a 0a 20 20 20 20 22 72 65 74  False):.    "ret
34f0: 75 72 6e 20 6c 69 73 74 20 6f 66 20 77 6f 72 64  urn list of word
3500: 73 20 70 68 6f 6e 65 74 69 63 61 6c 6c 79 20 73  s phonetically s
3510: 69 6d 69 6c 61 72 20 74 6f 20 73 57 6f 72 64 20  imilar to sWord 
3520: 61 6e 64 20 77 68 6f 6d 20 50 4f 53 20 69 73 20  and whom POS is 
3530: 6d 61 74 63 68 69 6e 67 20 73 50 61 74 74 65 72  matching sPatter
3540: 6e 22 0a 20 20 20 20 23 20 77 65 20 64 6f 6e e2  n".    # we don.
3550: 80 99 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72  ..t check if wor
3560: 64 20 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e  d exists in _dAn
3570: 61 6c 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69  alyses, for it i
3580: 73 20 61 73 73 75 6d 65 64 20 69 74 20 68 61 73  s assumed it has
3590: 20 62 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72   been done befor
35a0: 65 0a 20 20 20 20 61 53 75 67 67 20 3d 20 70 68  e.    aSugg = ph
35b0: 6f 6e 65 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c  onet.selectSimil
35c0: 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e  (sWord, sPattern
35d0: 29 0a 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68  ).    for sMorph
35e0: 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67   in _dAnalyses.g
35f0: 65 74 28 73 57 6f 72 64 2c 20 5b 5d 29 3a 0a 20  et(sWord, []):. 
3600: 20 20 20 20 20 20 20 61 53 75 67 67 2e 75 70 64         aSugg.upd
3610: 61 74 65 28 63 6f 6e 6a 2e 67 65 74 53 69 6d 69  ate(conj.getSimi
3620: 6c 28 73 57 6f 72 64 2c 20 73 4d 6f 72 70 68 2c  l(sWord, sMorph,
3630: 20 62 53 75 62 73 74 29 29 0a 20 20 20 20 20 20   bSubst)).      
3640: 20 20 62 72 65 61 6b 0a 20 20 20 20 69 66 20 61    break.    if a
3650: 53 75 67 67 3a 0a 20 20 20 20 20 20 20 20 72 65  Sugg:.        re
3660: 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e 28 61 53  turn "|".join(aS
3670: 75 67 67 29 0a 20 20 20 20 72 65 74 75 72 6e 20  ugg).    return 
3680: 22 22 0a 0a 0a 64 65 66 20 73 75 67 67 43 65 4f  ""...def suggCeO
3690: 72 43 65 74 20 28 73 57 6f 72 64 29 3a 0a 20 20  rCet (sWord):.  
36a0: 20 20 69 66 20 72 65 2e 6d 61 74 63 68 28 22 28    if re.match("(
36b0: 3f 69 29 5b 61 65 c3 a9 c3 a8 c3 aa 69 6f 75 79  ?i)[ae......iouy
36c0: c3 a2 c3 ae c3 af 5d 22 2c 20 73 57 6f 72 64 29  ......]", sWord)
36d0: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
36e0: 20 22 63 65 74 22 0a 20 20 20 20 69 66 20 73 57   "cet".    if sW
36f0: 6f 72 64 5b 30 3a 31 5d 20 3d 3d 20 22 68 22 20  ord[0:1] == "h" 
3700: 6f 72 20 73 57 6f 72 64 5b 30 3a 31 5d 20 3d 3d  or sWord[0:1] ==
3710: 20 22 48 22 3a 0a 20 20 20 20 20 20 20 20 72 65   "H":.        re
3720: 74 75 72 6e 20 22 63 65 7c 63 65 74 22 0a 20 20  turn "ce|cet".  
3730: 20 20 72 65 74 75 72 6e 20 22 63 65 22 0a 0a 0a    return "ce"...
3740: 64 65 66 20 73 75 67 67 4c 65 73 4c 61 20 28 73  def suggLesLa (s
3750: 57 6f 72 64 29 3a 0a 20 20 20 20 23 20 77 65 20  Word):.    # we 
3760: 64 6f 6e e2 80 99 74 20 63 68 65 63 6b 20 69 66  don...t check if
3770: 20 77 6f 72 64 20 65 78 69 73 74 73 20 69 6e 20   word exists in 
3780: 5f 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20  _dAnalyses, for 
3790: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 69 74  it is assumed it
37a0: 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 62   has been done b
37b0: 65 66 6f 72 65 0a 20 20 20 20 69 66 20 61 6e 79  efore.    if any
37c0: 28 20 22 3a 70 22 20 69 6e 20 73 4d 6f 72 70 68  ( ":p" in sMorph
37d0: 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20    for sMorph in 
37e0: 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73  _dAnalyses.get(s
37f0: 57 6f 72 64 2c 20 5b 5d 29 20 29 3a 0a 20 20 20  Word, []) ):.   
3800: 20 20 20 20 20 72 65 74 75 72 6e 20 22 6c 65 73       return "les
3810: 7c 6c 61 22 0a 20 20 20 20 72 65 74 75 72 6e 20  |la".    return 
3820: 22 6c 61 22 0a 0a 0a 5f 7a 42 69 6e 61 72 79 20  "la"..._zBinary 
3830: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 5e 5b  = re.compile("^[
3840: 30 31 5d 2b 24 22 29 0a 0a 64 65 66 20 66 6f 72  01]+$")..def for
3850: 6d 61 74 4e 75 6d 62 65 72 20 28 73 29 3a 0a 20  matNumber (s):. 
3860: 20 20 20 6e 4c 65 6e 20 3d 20 6c 65 6e 28 73 29     nLen = len(s)
3870: 0a 20 20 20 20 69 66 20 6e 4c 65 6e 20 3c 20 34  .    if nLen < 4
3880: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
3890: 20 73 0a 20 20 20 20 73 52 65 73 20 3d 20 22 22   s.    sRes = ""
38a0: 0a 20 20 20 20 23 20 6e 6f 6d 62 72 65 20 6f 72  .    # nombre or
38b0: 64 69 6e 61 69 72 65 0a 20 20 20 20 6e 45 6e 64  dinaire.    nEnd
38c0: 20 3d 20 6e 4c 65 6e 0a 20 20 20 20 77 68 69 6c   = nLen.    whil
38d0: 65 20 6e 45 6e 64 20 3e 20 30 3a 0a 20 20 20 20  e nEnd > 0:.    
38e0: 20 20 20 20 6e 53 74 61 72 74 20 3d 20 6d 61 78      nStart = max
38f0: 28 6e 45 6e 64 2d 33 2c 20 30 29 0a 20 20 20 20  (nEnd-3, 0).    
3900: 20 20 20 20 73 52 65 73 20 3d 20 73 5b 6e 53 74      sRes = s[nSt
3910: 61 72 74 3a 6e 45 6e 64 5d 20 2b 20 22 c2 a0 22  art:nEnd] + ".."
3920: 20 2b 20 73 52 65 73 20 20 69 66 20 73 52 65 73   + sRes  if sRes
3930: 20 20 65 6c 73 65 20 73 5b 6e 53 74 61 72 74 3a    else s[nStart:
3940: 6e 45 6e 64 5d 0a 20 20 20 20 20 20 20 20 6e 45  nEnd].        nE
3950: 6e 64 20 3d 20 6e 45 6e 64 20 2d 20 33 0a 20 20  nd = nEnd - 3.  
3960: 20 20 23 20 62 69 6e 61 69 72 65 0a 20 20 20 20    # binaire.    
3970: 69 66 20 5f 7a 42 69 6e 61 72 79 2e 73 65 61 72  if _zBinary.sear
3980: 63 68 28 73 29 3a 0a 20 20 20 20 20 20 20 20 6e  ch(s):.        n
3990: 45 6e 64 20 3d 20 6e 4c 65 6e 0a 20 20 20 20 20  End = nLen.     
39a0: 20 20 20 73 42 69 6e 20 3d 20 22 22 0a 20 20 20     sBin = "".   
39b0: 20 20 20 20 20 77 68 69 6c 65 20 6e 45 6e 64 20       while nEnd 
39c0: 3e 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20  > 0:.           
39d0: 20 6e 53 74 61 72 74 20 3d 20 6d 61 78 28 6e 45   nStart = max(nE
39e0: 6e 64 2d 34 2c 20 30 29 0a 20 20 20 20 20 20 20  nd-4, 0).       
39f0: 20 20 20 20 20 73 42 69 6e 20 3d 20 73 5b 6e 53       sBin = s[nS
3a00: 74 61 72 74 3a 6e 45 6e 64 5d 20 2b 20 22 c2 a0  tart:nEnd] + "..
3a10: 22 20 2b 20 73 42 69 6e 20 20 69 66 20 73 42 69  " + sBin  if sBi
3a20: 6e 20 20 65 6c 73 65 20 73 5b 6e 53 74 61 72 74  n  else s[nStart
3a30: 3a 6e 45 6e 64 5d 0a 20 20 20 20 20 20 20 20 20  :nEnd].         
3a40: 20 20 20 6e 45 6e 64 20 3d 20 6e 45 6e 64 20 2d     nEnd = nEnd -
3a50: 20 34 0a 20 20 20 20 20 20 20 20 73 52 65 73 20   4.        sRes 
3a60: 2b 3d 20 22 7c 22 20 2b 20 73 42 69 6e 0a 20 20  += "|" + sBin.  
3a70: 20 20 23 20 6e 75 6d c3 a9 72 6f 73 20 64 65 20    # num..ros de 
3a80: 74 c3 a9 6c c3 a9 70 68 6f 6e 65 0a 20 20 20 20  t..l..phone.    
3a90: 69 66 20 6e 4c 65 6e 20 3d 3d 20 31 30 3a 0a 20  if nLen == 10:. 
3aa0: 20 20 20 20 20 20 20 69 66 20 73 2e 73 74 61 72         if s.star
3ab0: 74 73 77 69 74 68 28 22 30 22 29 3a 0a 20 20 20  tswith("0"):.   
3ac0: 20 20 20 20 20 20 20 20 20 73 52 65 73 20 2b 3d           sRes +=
3ad0: 20 22 7c 22 20 2b 20 73 5b 30 3a 32 5d 20 2b 20   "|" + s[0:2] + 
3ae0: 22 c2 a0 22 20 2b 20 73 5b 32 3a 34 5d 20 2b 20  ".." + s[2:4] + 
3af0: 22 c2 a0 22 20 2b 20 73 5b 34 3a 36 5d 20 2b 20  ".." + s[4:6] + 
3b00: 22 c2 a0 22 20 2b 20 73 5b 36 3a 38 5d 20 2b 20  ".." + s[6:8] + 
3b10: 22 c2 a0 22 20 2b 20 73 5b 38 3a 5d 20 23 20 74  ".." + s[8:] # t
3b20: c3 a9 6c c3 a9 70 68 6f 6e 65 20 66 72 61 6e c3  ..l..phone fran.
3b30: a7 61 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  .ais.           
3b40: 20 69 66 20 73 5b 31 5d 20 3d 3d 20 22 34 22 20   if s[1] == "4" 
3b50: 61 6e 64 20 28 73 5b 32 5d 3d 3d 22 37 22 20 6f  and (s[2]=="7" o
3b60: 72 20 73 5b 32 5d 3d 3d 22 38 22 20 6f 72 20 73  r s[2]=="8" or s
3b70: 5b 32 5d 3d 3d 22 39 22 29 3a 0a 20 20 20 20 20  [2]=="9"):.     
3b80: 20 20 20 20 20 20 20 20 20 20 20 73 52 65 73 20             sRes 
3b90: 2b 3d 20 22 7c 22 20 2b 20 73 5b 30 3a 34 5d 20  += "|" + s[0:4] 
3ba0: 2b 20 22 c2 a0 22 20 2b 20 73 5b 34 3a 36 5d 20  + ".." + s[4:6] 
3bb0: 2b 20 22 c2 a0 22 20 2b 20 73 5b 36 3a 38 5d 20  + ".." + s[6:8] 
3bc0: 2b 20 22 c2 a0 22 20 2b 20 73 5b 38 3a 5d 20 20  + ".." + s[8:]  
3bd0: 20 20 20 20 20 20 20 20 20 20 23 20 6d 6f 62 69            # mobi
3be0: 6c 65 20 62 65 6c 67 65 0a 20 20 20 20 20 20 20  le belge.       
3bf0: 20 20 20 20 20 73 52 65 73 20 2b 3d 20 22 7c 22       sRes += "|"
3c00: 20 2b 20 73 5b 30 3a 33 5d 20 2b 20 22 c2 a0 22   + s[0:3] + ".."
3c10: 20 2b 20 73 5b 33 3a 36 5d 20 2b 20 22 c2 a0 22   + s[3:6] + ".."
3c20: 20 2b 20 73 5b 36 3a 38 5d 20 2b 20 22 c2 a0 22   + s[6:8] + ".."
3c30: 20 2b 20 73 5b 38 3a 5d 20 20 20 20 20 20 20 20   + s[8:]        
3c40: 20 20 20 20 20 20 20 20 23 20 74 c3 a9 6c c3 a9          # t..l..
3c50: 70 68 6f 6e 65 20 73 75 69 73 73 65 0a 20 20 20  phone suisse.   
3c60: 20 20 20 20 20 73 52 65 73 20 2b 3d 20 22 7c 22       sRes += "|"
3c70: 20 2b 20 73 5b 30 3a 34 5d 20 2b 20 22 c2 a0 22   + s[0:4] + ".."
3c80: 20 2b 20 73 5b 34 3a 37 5d 20 2b 20 22 2d 22 20   + s[4:7] + "-" 
3c90: 2b 20 73 5b 37 3a 5d 20 20 20 20 20 20 20 20 20  + s[7:]         
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 20 20 23 20 74 c3 a9 6c            # t..l
3cc0: c3 a9 70 68 6f 6e 65 20 63 61 6e 61 64 69 65 6e  ..phone canadien
3cd0: 20 6f 75 20 61 6d c3 a9 72 69 63 61 69 6e 0a 20   ou am..ricain. 
3ce0: 20 20 20 65 6c 69 66 20 6e 4c 65 6e 20 3d 3d 20     elif nLen == 
3cf0: 39 20 61 6e 64 20 73 2e 73 74 61 72 74 73 77 69  9 and s.startswi
3d00: 74 68 28 22 30 22 29 3a 0a 20 20 20 20 20 20 20  th("0"):.       
3d10: 20 73 52 65 73 20 2b 3d 20 22 7c 22 20 2b 20 73   sRes += "|" + s
3d20: 5b 30 3a 33 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [0:3] + ".." + s
3d30: 5b 33 3a 35 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [3:5] + ".." + s
3d40: 5b 35 3a 37 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [5:7] + ".." + s
3d50: 5b 37 3a 39 5d 20 20 20 20 20 20 20 20 20 20 20  [7:9]           
3d60: 20 20 20 20 20 20 20 20 23 20 66 69 78 65 20 62          # fixe b
3d70: 65 6c 67 65 20 31 0a 20 20 20 20 20 20 20 20 73  elge 1.        s
3d80: 52 65 73 20 2b 3d 20 22 7c 22 20 2b 20 73 5b 30  Res += "|" + s[0
3d90: 3a 32 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 32  :2] + ".." + s[2
3da0: 3a 35 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 35  :5] + ".." + s[5
3db0: 3a 37 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 37  :7] + ".." + s[7
3dc0: 3a 39 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  :9]             
3dd0: 20 20 20 20 20 20 23 20 66 69 78 65 20 62 65 6c        # fixe bel
3de0: 67 65 20 32 0a 20 20 20 20 72 65 74 75 72 6e 20  ge 2.    return 
3df0: 73 52 65 73 0a 0a 0a 64 65 66 20 66 6f 72 6d 61  sRes...def forma
3e00: 74 4e 46 20 28 73 29 3a 0a 20 20 20 20 74 72 79  tNF (s):.    try
3e10: 3a 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 72 65  :.        m = re
3e20: 2e 6d 61 74 63 68 28 22 4e 46 5b 20 c2 a0 2d 5d  .match("NF[ ..-]
3e30: 3f 28 43 7c 45 7c 50 7c 51 7c 53 7c 58 7c 5a 7c  ?(C|E|P|Q|S|X|Z|
3e40: 45 4e 28 3f 3a 5b 20 c2 a0 2d 5d 49 53 4f 7c 29  EN(?:[ ..-]ISO|)
3e50: 29 5b 20 c2 a0 2d 5d 3f 28 5b 30 2d 39 5d 2b 28  )[ ..-]?([0-9]+(
3e60: 3f 3a 5b 2f e2 80 91 2d 5d 5b 30 2d 39 5d 2b 7c  ?:[/...-][0-9]+|
3e70: 29 29 22 2c 20 73 29 0a 20 20 20 20 20 20 20 20  ))", s).        
3e80: 69 66 20 6e 6f 74 20 6d 3a 0a 20 20 20 20 20 20  if not m:.      
3e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a        return "".
3ea0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
3eb0: 4e 46 c2 a0 22 20 2b 20 6d 2e 67 72 6f 75 70 28  NF.." + m.group(
3ec0: 31 29 2e 75 70 70 65 72 28 29 2e 72 65 70 6c 61  1).upper().repla
3ed0: 63 65 28 22 20 22 2c 20 22 c2 a0 22 29 2e 72 65  ce(" ", "..").re
3ee0: 70 6c 61 63 65 28 22 2d 22 2c 20 22 c2 a0 22 29  place("-", "..")
3ef0: 20 2b 20 22 c2 a0 22 20 2b 20 6d 2e 67 72 6f 75   + ".." + m.grou
3f00: 70 28 32 29 2e 72 65 70 6c 61 63 65 28 22 2f 22  p(2).replace("/"
3f10: 2c 20 22 e2 80 91 22 29 2e 72 65 70 6c 61 63 65  , "...").replace
3f20: 28 22 2d 22 2c 20 22 e2 80 91 22 29 0a 20 20 20  ("-", "...").   
3f30: 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20   except:.       
3f40: 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e 74   traceback.print
3f50: 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20 20 72  _exc().        r
3f60: 65 74 75 72 6e 20 22 23 20 65 72 72 65 75 72 20  eturn "# erreur 
3f70: 23 22 0a 0a 0a 64 65 66 20 75 6e 64 6f 4c 69 67  #"...def undoLig
3f80: 61 74 75 72 65 20 28 63 29 3a 0a 20 20 20 20 69  ature (c):.    i
3f90: 66 20 63 20 3d 3d 20 22 ef ac 81 22 3a 0a 20 20  f c == "...":.  
3fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 66 69        return "fi
3fb0: 22 0a 20 20 20 20 65 6c 69 66 20 63 20 3d 3d 20  ".    elif c == 
3fc0: 22 ef ac 82 22 3a 0a 20 20 20 20 20 20 20 20 72  "...":.        r
3fd0: 65 74 75 72 6e 20 22 66 6c 22 0a 20 20 20 20 65  eturn "fl".    e
3fe0: 6c 69 66 20 63 20 3d 3d 20 22 ef ac 80 22 3a 0a  lif c == "...":.
3ff0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
4000: 66 66 22 0a 20 20 20 20 65 6c 69 66 20 63 20 3d  ff".    elif c =
4010: 3d 20 22 ef ac 83 22 3a 0a 20 20 20 20 20 20 20  = "...":.       
4020: 20 72 65 74 75 72 6e 20 22 66 66 69 22 0a 20 20   return "ffi".  
4030: 20 20 65 6c 69 66 20 63 20 3d 3d 20 22 ef ac 84    elif c == "...
4040: 22 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ":.        retur
4050: 6e 20 22 66 66 6c 22 0a 20 20 20 20 65 6c 69 66  n "ffl".    elif
4060: 20 63 20 3d 3d 20 22 ef ac 85 22 3a 0a 20 20 20   c == "...":.   
4070: 20 20 20 20 20 72 65 74 75 72 6e 20 22 66 74 22       return "ft"
4080: 0a 20 20 20 20 65 6c 69 66 20 63 20 3d 3d 20 22  .    elif c == "
4090: ef ac 86 22 3a 0a 20 20 20 20 20 20 20 20 72 65  ...":.        re
40a0: 74 75 72 6e 20 22 73 74 22 0a 20 20 20 20 72 65  turn "st".    re
40b0: 74 75 72 6e 20 22 5f 22 0a 0a 0a 0a 0a 5f 78 4e  turn "_"....._xN
40c0: 6f 72 6d 61 6c 69 7a 65 64 43 68 61 72 73 46 6f  ormalizedCharsFo
40d0: 72 49 6e 63 6c 75 73 69 76 65 57 72 69 74 69 6e  rInclusiveWritin
40e0: 67 20 3d 20 73 74 72 2e 6d 61 6b 65 74 72 61 6e  g = str.maketran
40f0: 73 28 7b 0a 20 20 20 20 27 28 27 3a 20 27 5f 27  s({.    '(': '_'
4100: 2c 20 20 27 29 27 3a 20 27 5f 27 2c 0a 20 20 20  ,  ')': '_',.   
4110: 20 27 2e 27 3a 20 27 5f 27 2c 20 20 27 c2 b7 27   '.': '_',  '..'
4120: 3a 20 27 5f 27 2c 0a 20 20 20 20 27 e2 80 93 27  : '_',.    '...'
4130: 3a 20 27 5f 27 2c 20 20 27 e2 80 94 27 3a 20 27  : '_',  '...': '
4140: 5f 27 2c 0a 20 20 20 20 27 2f 27 3a 20 27 5f 27  _',.    '/': '_'
4150: 0a 20 7d 29 0a 0a 0a 64 65 66 20 6e 6f 72 6d 61  . })...def norma
4160: 6c 69 7a 65 49 6e 63 6c 75 73 69 76 65 57 72 69  lizeInclusiveWri
4170: 74 69 6e 67 20 28 73 54 6f 6b 65 6e 29 3a 0a 20  ting (sToken):. 
4180: 20 20 20 72 65 74 75 72 6e 20 73 54 6f 6b 65 6e     return sToken
4190: 2e 74 72 61 6e 73 6c 61 74 65 28 5f 78 4e 6f 72  .translate(_xNor
41a0: 6d 61 6c 69 7a 65 64 43 68 61 72 73 46 6f 72 49  malizedCharsForI
41b0: 6e 63 6c 75 73 69 76 65 57 72 69 74 69 6e 67 29  nclusiveWriting)
41c0: 0a                                               .