Grammalecte  Hex Artifact Content

Artifact 79835965e41d75da22908d8ff75f39af58a7524c2dd07d9ecabb302b93d730ac:


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 53  lex) > 2 and _oS
1820: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61  pellChecker.isVa
1830: 6c 69 64 28 73 46 6c 65 78 5b 3a 2d 31 5d 2b 22  lid(sFlex[:-1]+"
1840: 75 78 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ux"):.          
1850: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
1860: 73 46 6c 65 78 5b 3a 2d 31 5d 2b 22 75 78 22 29  sFlex[:-1]+"ux")
1870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1880: 73 46 6c 65 78 2e 65 6e 64 73 77 69 74 68 28 22  sFlex.endswith("
1890: 61 69 6c 22 29 20 61 6e 64 20 6c 65 6e 28 73 46  ail") and len(sF
18a0: 6c 65 78 29 20 3e 20 33 20 61 6e 64 20 5f 6f 53  lex) > 3 and _oS
18b0: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61  pellChecker.isVa
18c0: 6c 69 64 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22  lid(sFlex[:-2]+"
18d0: 75 78 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ux"):.          
18e0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
18f0: 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 75 78 22 29  sFlex[:-2]+"ux")
1900: 0a 20 20 20 20 20 20 20 20 69 66 20 5f 6f 53 70  .        if _oSp
1910: 65 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c  ellChecker.isVal
1920: 69 64 28 73 46 6c 65 78 2b 22 73 22 29 3a 0a 20  id(sFlex+"s"):. 
1930: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
1940: 2e 61 64 64 28 73 46 6c 65 78 2b 22 73 22 29 0a  .add(sFlex+"s").
1950: 20 20 20 20 20 20 20 20 69 66 20 5f 6f 53 70 65          if _oSpe
1960: 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69  llChecker.isVali
1970: 64 28 73 46 6c 65 78 2b 22 78 22 29 3a 0a 20 20  d(sFlex+"x"):.  
1980: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
1990: 61 64 64 28 73 46 6c 65 78 2b 22 78 22 29 0a 20  add(sFlex+"x"). 
19a0: 20 20 20 69 66 20 6d 66 73 70 2e 68 61 73 4d 69     if mfsp.hasMi
19b0: 73 63 50 6c 75 72 61 6c 28 73 46 6c 65 78 29 3a  scPlural(sFlex):
19c0: 0a 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 75  .        aSugg.u
19d0: 70 64 61 74 65 28 6d 66 73 70 2e 67 65 74 4d 69  pdate(mfsp.getMi
19e0: 73 63 50 6c 75 72 61 6c 28 73 46 6c 65 78 29 29  scPlural(sFlex))
19f0: 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20  .    if aSugg:. 
1a00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c         return "|
1a10: 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20  ".join(aSugg).  
1a20: 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65    return ""...de
1a30: 66 20 73 75 67 67 53 69 6e 67 20 28 73 46 6c 65  f suggSing (sFle
1a40: 78 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  x):.    "returns
1a50: 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d 73 20   singular forms 
1a60: 61 73 73 75 6d 69 6e 67 20 73 46 6c 65 78 20 69  assuming sFlex i
1a70: 73 20 70 6c 75 72 61 6c 22 0a 20 20 20 20 69 66  s plural".    if
1a80: 20 22 2d 22 20 69 6e 20 73 46 6c 65 78 3a 0a 20   "-" in sFlex:. 
1a90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
1aa0: 0a 20 20 20 20 61 53 75 67 67 20 3d 20 73 65 74  .    aSugg = set
1ab0: 28 29 0a 20 20 20 20 69 66 20 73 46 6c 65 78 2e  ().    if sFlex.
1ac0: 65 6e 64 73 77 69 74 68 28 22 75 78 22 29 3a 0a  endswith("ux"):.
1ad0: 20 20 20 20 20 20 20 20 69 66 20 5f 6f 53 70 65          if _oSpe
1ae0: 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69  llChecker.isVali
1af0: 64 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 6c 22  d(sFlex[:-2]+"l"
1b00: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ):.            a
1b10: 53 75 67 67 2e 61 64 64 28 73 46 6c 65 78 5b 3a  Sugg.add(sFlex[:
1b20: 2d 32 5d 2b 22 6c 22 29 0a 20 20 20 20 20 20 20  -2]+"l").       
1b30: 20 69 66 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b   if _oSpellCheck
1b40: 65 72 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78  er.isValid(sFlex
1b50: 5b 3a 2d 32 5d 2b 22 69 6c 22 29 3a 0a 20 20 20  [:-2]+"il"):.   
1b60: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
1b70: 64 64 28 73 46 6c 65 78 5b 3a 2d 32 5d 2b 22 69  dd(sFlex[:-2]+"i
1b80: 6c 22 29 0a 20 20 20 20 69 66 20 5f 6f 53 70 65  l").    if _oSpe
1b90: 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69  llChecker.isVali
1ba0: 64 28 73 46 6c 65 78 5b 3a 2d 31 5d 29 3a 0a 20  d(sFlex[:-1]):. 
1bb0: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
1bc0: 28 73 46 6c 65 78 5b 3a 2d 31 5d 29 0a 20 20 20  (sFlex[:-1]).   
1bd0: 20 69 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20   if aSugg:.     
1be0: 20 20 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f     return "|".jo
1bf0: 69 6e 28 61 53 75 67 67 29 0a 20 20 20 20 72 65  in(aSugg).    re
1c00: 74 75 72 6e 20 22 22 0a 0a 0a 64 65 66 20 73 75  turn ""...def su
1c10: 67 67 4d 61 73 53 69 6e 67 20 28 73 46 6c 65 78  ggMasSing (sFlex
1c20: 2c 20 62 53 75 67 67 53 69 6d 69 6c 3d 46 61 6c  , bSuggSimil=Fal
1c30: 73 65 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e  se):.    "return
1c40: 73 20 6d 61 73 63 75 6c 69 6e 65 20 73 69 6e 67  s masculine sing
1c50: 75 6c 61 72 20 66 6f 72 6d 73 22 0a 20 20 20 20  ular forms".    
1c60: 23 20 77 65 20 64 6f 6e e2 80 99 74 20 63 68 65  # we don...t che
1c70: 63 6b 20 69 66 20 77 6f 72 64 20 65 78 69 73 74  ck if word exist
1c80: 73 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2c  s in _dAnalyses,
1c90: 20 66 6f 72 20 69 74 20 69 73 20 61 73 73 75 6d   for it is assum
1ca0: 65 64 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  ed it has been d
1cb0: 6f 6e 65 20 62 65 66 6f 72 65 0a 20 20 20 20 61  one before.    a
1cc0: 53 75 67 67 20 3d 20 73 65 74 28 29 0a 20 20 20  Sugg = set().   
1cd0: 20 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20 5f   for sMorph in _
1ce0: 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 46  dAnalyses.get(sF
1cf0: 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20 20 20 20 20  lex, []):.      
1d00: 20 20 69 66 20 6e 6f 74 20 22 3a 56 22 20 69 6e    if not ":V" in
1d10: 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20   sMorph:.       
1d20: 20 20 20 20 20 23 20 6e 6f 74 20 61 20 76 65 72       # not a ver
1d30: 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  b.            if
1d40: 20 22 3a 6d 22 20 69 6e 20 73 4d 6f 72 70 68 20   ":m" in sMorph 
1d50: 6f 72 20 22 3a 65 22 20 69 6e 20 73 4d 6f 72 70  or ":e" in sMorp
1d60: 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h:.             
1d70: 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 75 67     aSugg.add(sug
1d80: 67 53 69 6e 67 28 73 46 6c 65 78 29 29 0a 20 20  gSing(sFlex)).  
1d90: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a            else:.
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 73 53 74 65 6d 20 3d 20 63 72 2e 67 65 74 4c 65  sStem = cr.getLe
1dc0: 6d 6d 61 4f 66 4d 6f 72 70 68 28 73 4d 6f 72 70  mmaOfMorph(sMorp
1dd0: 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h).             
1de0: 20 20 20 69 66 20 6d 66 73 70 2e 69 73 46 65 6d     if mfsp.isFem
1df0: 46 6f 72 6d 28 73 53 74 65 6d 29 3a 0a 20 20 20  Form(sStem):.   
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 61 53 75 67 67 2e 75 70 64 61 74 65 28 6d 66   aSugg.update(mf
1e20: 73 70 2e 67 65 74 4d 61 73 46 6f 72 6d 28 73 53  sp.getMasForm(sS
1e30: 74 65 6d 2c 20 46 61 6c 73 65 29 29 0a 20 20 20  tem, False)).   
1e40: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1e50: 20 20 20 20 20 20 20 23 20 61 20 76 65 72 62 0a         # a verb.
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 73 56 65 72              sVer
1e70: 62 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f  b = cr.getLemmaO
1e80: 66 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29 0a 20  fMorph(sMorph). 
1e90: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63 6f             if co
1ea0: 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 56 65 72 62  nj.hasConj(sVerb
1eb0: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 20  , ":PQ", ":Q1") 
1ec0: 61 6e 64 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a  and conj.hasConj
1ed0: 28 73 56 65 72 62 2c 20 22 3a 50 51 22 2c 20 22  (sVerb, ":PQ", "
1ee0: 3a 51 33 22 29 3a 0a 20 20 20 20 20 20 20 20 20  :Q3"):.         
1ef0: 20 20 20 20 20 20 20 23 20 57 65 20 61 6c 73 6f         # We also
1f00: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 76 65   check if the ve
1f10: 72 62 20 68 61 73 20 61 20 66 65 6d 69 6e 69 6e  rb has a feminin
1f20: 65 20 66 6f 72 6d 2e 0a 20 20 20 20 20 20 20 20  e form..        
1f30: 20 20 20 20 20 20 20 20 23 20 49 66 20 6e 6f 74          # If not
1f40: 2c 20 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74  , we consider it
1f50: e2 80 99 73 20 62 65 74 74 65 72 20 74 6f 20 6e  ...s better to n
1f60: 6f 74 20 73 75 67 67 65 73 74 20 74 68 65 20 6d  ot suggest the m
1f70: 61 73 63 75 6c 69 6e 65 20 6f 6e 65 2c 20 61 73  asculine one, as
1f80: 20 69 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 69   it can be consi
1f90: 64 65 72 65 64 20 69 6e 76 61 72 69 61 62 6c 65  dered invariable
1fa0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb0: 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a    aSugg.add(conj
1fc0: 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62 2c 20  .getConj(sVerb, 
1fd0: 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29 0a 20  ":PQ", ":Q1")). 
1fe0: 20 20 20 69 66 20 62 53 75 67 67 53 69 6d 69 6c     if bSuggSimil
1ff0: 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 65 20  :.        for e 
2000: 69 6e 20 70 68 6f 6e 65 74 2e 73 65 6c 65 63 74  in phonet.select
2010: 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a 6d  Simil(sFlex, ":m
2020: 3a 5b 73 69 5d 22 29 3a 0a 20 20 20 20 20 20 20  :[si]"):.       
2030: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 65       aSugg.add(e
2040: 29 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a  ).    if aSugg:.
2050: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
2060: 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20  |".join(aSugg). 
2070: 20 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64     return ""...d
2080: 65 66 20 73 75 67 67 4d 61 73 50 6c 75 72 20 28  ef suggMasPlur (
2090: 73 46 6c 65 78 2c 20 62 53 75 67 67 53 69 6d 69  sFlex, bSuggSimi
20a0: 6c 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22 72  l=False):.    "r
20b0: 65 74 75 72 6e 73 20 6d 61 73 63 75 6c 69 6e 65  eturns masculine
20c0: 20 70 6c 75 72 61 6c 20 66 6f 72 6d 73 22 0a 20   plural forms". 
20d0: 20 20 20 23 20 77 65 20 64 6f 6e e2 80 99 74 20     # we don...t 
20e0: 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20 65 78  check if word ex
20f0: 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c 79 73  ists in _dAnalys
2100: 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20 61 73  es, for it is as
2110: 73 75 6d 65 64 20 69 74 20 68 61 73 20 62 65 65  sumed it has bee
2120: 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a 20 20  n done before.  
2130: 20 20 61 53 75 67 67 20 3d 20 73 65 74 28 29 0a    aSugg = set().
2140: 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69      for sMorph i
2150: 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74  n _dAnalyses.get
2160: 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20 20  (sFlex, []):.   
2170: 20 20 20 20 20 69 66 20 6e 6f 74 20 22 3a 56 22       if not ":V"
2180: 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20   in sMorph:.    
2190: 20 20 20 20 20 20 20 20 23 20 6e 6f 74 20 61 20          # not a 
21a0: 76 65 72 62 0a 20 20 20 20 20 20 20 20 20 20 20  verb.           
21b0: 20 69 66 20 22 3a 6d 22 20 69 6e 20 73 4d 6f 72   if ":m" in sMor
21c0: 70 68 20 6f 72 20 22 3a 65 22 20 69 6e 20 73 4d  ph or ":e" in sM
21d0: 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20  orph:.          
21e0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
21f0: 73 75 67 67 50 6c 75 72 28 73 46 6c 65 78 29 29  suggPlur(sFlex))
2200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
2210: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
2220: 20 20 20 73 53 74 65 6d 20 3d 20 63 72 2e 67 65     sStem = cr.ge
2230: 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28 73 4d  tLemmaOfMorph(sM
2240: 6f 72 70 68 29 0a 20 20 20 20 20 20 20 20 20 20  orph).          
2250: 20 20 20 20 20 20 69 66 20 6d 66 73 70 2e 69 73        if mfsp.is
2260: 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d 29 3a 0a  FemForm(sStem):.
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 61 53 75 67 67 2e 75 70 64 61 74 65      aSugg.update
2290: 28 6d 66 73 70 2e 67 65 74 4d 61 73 46 6f 72 6d  (mfsp.getMasForm
22a0: 28 73 53 74 65 6d 2c 20 54 72 75 65 29 29 0a 20  (sStem, True)). 
22b0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
22c0: 20 20 20 20 20 20 20 20 20 23 20 61 20 76 65 72           # a ver
22d0: 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 56  b.            sV
22e0: 65 72 62 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d  erb = cr.getLemm
22f0: 61 4f 66 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29  aOfMorph(sMorph)
2300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2310: 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 56 65  conj.hasConj(sVe
2320: 72 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22  rb, ":PQ", ":Q2"
2330: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
2340: 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e     aSugg.add(con
2350: 6a 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62 2c  j.getConj(sVerb,
2360: 20 22 3a 50 51 22 2c 20 22 3a 51 32 22 29 29 0a   ":PQ", ":Q2")).
2370: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66              elif
2380: 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 56   conj.hasConj(sV
2390: 65 72 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31  erb, ":PQ", ":Q1
23a0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
23b0: 20 20 20 20 73 53 75 67 67 20 3d 20 63 6f 6e 6a      sSugg = conj
23c0: 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62 2c 20  .getConj(sVerb, 
23d0: 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 0a 20 20  ":PQ", ":Q1").  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
23f0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2400: 74 6f 20 66 69 6c 74 65 72 20 74 68 65 73 65 20  to filter these 
2410: 66 6c 65 78 69 6f 6e 73 2c 20 6c 69 6b 65 20 e2  flexions, like .
2420: 80 9c 73 75 63 63 c3 a9 64 c3 a9 e2 80 9d 20 6f  ..succ..d..... o
2430: 72 20 e2 80 9c 61 67 69 e2 80 9d 20 74 68 61 74  r ...agi... that
2440: 20 61 72 65 20 6e 6f 74 20 6d 61 73 63 75 6c 69   are not masculi
2450: 6e 65 20 70 6c 75 72 61 6c 2e 0a 20 20 20 20 20  ne plural..     
2460: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 53             if sS
2470: 75 67 67 2e 65 6e 64 73 77 69 74 68 28 22 73 22  ugg.endswith("s"
2480: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
2490: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
24a0: 28 73 53 75 67 67 29 0a 20 20 20 20 69 66 20 62  (sSugg).    if b
24b0: 53 75 67 67 53 69 6d 69 6c 3a 0a 20 20 20 20 20  SuggSimil:.     
24c0: 20 20 20 66 6f 72 20 65 20 69 6e 20 70 68 6f 6e     for e in phon
24d0: 65 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c 28 73  et.selectSimil(s
24e0: 46 6c 65 78 2c 20 22 3a 6d 3a 5b 70 69 5d 22 29  Flex, ":m:[pi]")
24f0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  :.            aS
2500: 75 67 67 2e 61 64 64 28 65 29 0a 20 20 20 20 69  ugg.add(e).    i
2510: 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20 20 20  f aSugg:.       
2520: 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69 6e   return "|".join
2530: 28 61 53 75 67 67 29 0a 20 20 20 20 72 65 74 75  (aSugg).    retu
2540: 72 6e 20 22 22 0a 0a 0a 64 65 66 20 73 75 67 67  rn ""...def sugg
2550: 46 65 6d 53 69 6e 67 20 28 73 46 6c 65 78 2c 20  FemSing (sFlex, 
2560: 62 53 75 67 67 53 69 6d 69 6c 3d 46 61 6c 73 65  bSuggSimil=False
2570: 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20  ):.    "returns 
2580: 66 65 6d 69 6e 69 6e 65 20 73 69 6e 67 75 6c 61  feminine singula
2590: 72 20 66 6f 72 6d 73 22 0a 20 20 20 20 23 20 77  r forms".    # w
25a0: 65 20 64 6f 6e e2 80 99 74 20 63 68 65 63 6b 20  e don...t check 
25b0: 69 66 20 77 6f 72 64 20 65 78 69 73 74 73 20 69  if word exists i
25c0: 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f  n _dAnalyses, fo
25d0: 72 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  r it is assumed 
25e0: 69 74 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65  it has been done
25f0: 20 62 65 66 6f 72 65 0a 20 20 20 20 61 53 75 67   before.    aSug
2600: 67 20 3d 20 73 65 74 28 29 0a 20 20 20 20 66 6f  g = set().    fo
2610: 72 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e  r sMorph in _dAn
2620: 61 6c 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78  alyses.get(sFlex
2630: 2c 20 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 69  , []):.        i
2640: 66 20 6e 6f 74 20 22 3a 56 22 20 69 6e 20 73 4d  f not ":V" in sM
2650: 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20  orph:.          
2660: 20 20 23 20 6e 6f 74 20 61 20 76 65 72 62 0a 20    # not a verb. 
2670: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 22 3a             if ":
2680: 66 22 20 69 6e 20 73 4d 6f 72 70 68 20 6f 72 20  f" in sMorph or 
2690: 22 3a 65 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a  ":e" in sMorph:.
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 61 53 75 67 67 2e 61 64 64 28 73 75 67 67 53 69  aSugg.add(suggSi
26c0: 6e 67 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20  ng(sFlex)).     
26d0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 53 74               sSt
26f0: 65 6d 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61  em = cr.getLemma
2700: 4f 66 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29 0a  OfMorph(sMorph).
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 69 66 20 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72  if mfsp.isFemFor
2730: 6d 28 73 53 74 65 6d 29 3a 0a 20 20 20 20 20 20  m(sStem):.      
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
2750: 75 67 67 2e 61 64 64 28 73 53 74 65 6d 29 0a 20  ugg.add(sStem). 
2760: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
2770: 20 20 20 20 20 20 20 20 20 23 20 61 20 76 65 72           # a ver
2780: 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 56  b.            sV
2790: 65 72 62 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d  erb = cr.getLemm
27a0: 61 4f 66 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29  aOfMorph(sMorph)
27b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
27c0: 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 56 65  conj.hasConj(sVe
27d0: 72 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22  rb, ":PQ", ":Q3"
27e0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
27f0: 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e     aSugg.add(con
2800: 6a 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62 2c  j.getConj(sVerb,
2810: 20 22 3a 50 51 22 2c 20 22 3a 51 33 22 29 29 0a   ":PQ", ":Q3")).
2820: 20 20 20 20 69 66 20 62 53 75 67 67 53 69 6d 69      if bSuggSimi
2830: 6c 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 65  l:.        for e
2840: 20 69 6e 20 70 68 6f 6e 65 74 2e 73 65 6c 65 63   in phonet.selec
2850: 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a  tSimil(sFlex, ":
2860: 66 3a 5b 73 69 5d 22 29 3a 0a 20 20 20 20 20 20  f:[si]"):.      
2870: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
2880: 65 29 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a  e).    if aSugg:
2890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28a0: 22 7c 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a  "|".join(aSugg).
28b0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a      return ""...
28c0: 64 65 66 20 73 75 67 67 46 65 6d 50 6c 75 72 20  def suggFemPlur 
28d0: 28 73 46 6c 65 78 2c 20 62 53 75 67 67 53 69 6d  (sFlex, bSuggSim
28e0: 69 6c 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22  il=False):.    "
28f0: 72 65 74 75 72 6e 73 20 66 65 6d 69 6e 69 6e 65  returns feminine
2900: 20 70 6c 75 72 61 6c 20 66 6f 72 6d 73 22 0a 20   plural forms". 
2910: 20 20 20 23 20 77 65 20 64 6f 6e e2 80 99 74 20     # we don...t 
2920: 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20 65 78  check if word ex
2930: 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c 79 73  ists in _dAnalys
2940: 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20 61 73  es, for it is as
2950: 73 75 6d 65 64 20 69 74 20 68 61 73 20 62 65 65  sumed it has bee
2960: 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a 20 20  n done before.  
2970: 20 20 61 53 75 67 67 20 3d 20 73 65 74 28 29 0a    aSugg = set().
2980: 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69      for sMorph i
2990: 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74  n _dAnalyses.get
29a0: 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20 20  (sFlex, []):.   
29b0: 20 20 20 20 20 69 66 20 6e 6f 74 20 22 3a 56 22       if not ":V"
29c0: 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20   in sMorph:.    
29d0: 20 20 20 20 20 20 20 20 23 20 6e 6f 74 20 61 20          # not a 
29e0: 76 65 72 62 0a 20 20 20 20 20 20 20 20 20 20 20  verb.           
29f0: 20 69 66 20 22 3a 66 22 20 69 6e 20 73 4d 6f 72   if ":f" in sMor
2a00: 70 68 20 6f 72 20 22 3a 65 22 20 69 6e 20 73 4d  ph or ":e" in sM
2a10: 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20  orph:.          
2a20: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
2a30: 73 75 67 67 50 6c 75 72 28 73 46 6c 65 78 29 29  suggPlur(sFlex))
2a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
2a50: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
2a60: 20 20 20 73 53 74 65 6d 20 3d 20 63 72 2e 67 65     sStem = cr.ge
2a70: 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28 73 4d  tLemmaOfMorph(sM
2a80: 6f 72 70 68 29 0a 20 20 20 20 20 20 20 20 20 20  orph).          
2a90: 20 20 20 20 20 20 69 66 20 6d 66 73 70 2e 69 73        if mfsp.is
2aa0: 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d 29 3a 0a  FemForm(sStem):.
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 53      aSugg.add(sS
2ad0: 74 65 6d 2b 22 73 22 29 0a 20 20 20 20 20 20 20  tem+"s").       
2ae0: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
2af0: 20 20 20 23 20 61 20 76 65 72 62 0a 20 20 20 20     # a verb.    
2b00: 20 20 20 20 20 20 20 20 73 56 65 72 62 20 3d 20          sVerb = 
2b10: 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72  cr.getLemmaOfMor
2b20: 70 68 28 73 4d 6f 72 70 68 29 0a 20 20 20 20 20  ph(sMorph).     
2b30: 20 20 20 20 20 20 20 69 66 20 63 6f 6e 6a 2e 68         if conj.h
2b40: 61 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a  asConj(sVerb, ":
2b50: 50 51 22 2c 20 22 3a 51 34 22 29 3a 0a 20 20 20  PQ", ":Q4"):.   
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
2b70: 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 67 65 74 43  gg.add(conj.getC
2b80: 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51 22  onj(sVerb, ":PQ"
2b90: 2c 20 22 3a 51 34 22 29 29 0a 20 20 20 20 69 66  , ":Q4")).    if
2ba0: 20 62 53 75 67 67 53 69 6d 69 6c 3a 0a 20 20 20   bSuggSimil:.   
2bb0: 20 20 20 20 20 66 6f 72 20 65 20 69 6e 20 70 68       for e in ph
2bc0: 6f 6e 65 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c  onet.selectSimil
2bd0: 28 73 46 6c 65 78 2c 20 22 3a 66 3a 5b 70 69 5d  (sFlex, ":f:[pi]
2be0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
2bf0: 61 53 75 67 67 2e 61 64 64 28 65 29 0a 20 20 20  aSugg.add(e).   
2c00: 20 69 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20   if aSugg:.     
2c10: 20 20 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f     return "|".jo
2c20: 69 6e 28 61 53 75 67 67 29 0a 20 20 20 20 72 65  in(aSugg).    re
2c30: 74 75 72 6e 20 22 22 0a 0a 0a 64 65 66 20 68 61  turn ""...def ha
2c40: 73 46 65 6d 46 6f 72 6d 20 28 73 46 6c 65 78 29  sFemForm (sFlex)
2c50: 3a 0a 20 20 20 20 66 6f 72 20 73 53 74 65 6d 20  :.    for sStem 
2c60: 69 6e 20 73 74 65 6d 28 73 46 6c 65 78 29 3a 0a  in stem(sFlex):.
2c70: 20 20 20 20 20 20 20 20 69 66 20 6d 66 73 70 2e          if mfsp.
2c80: 69 73 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d 29  isFemForm(sStem)
2c90: 20 6f 72 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a   or conj.hasConj
2ca0: 28 73 53 74 65 6d 2c 20 22 3a 50 51 22 2c 20 22  (sStem, ":PQ", "
2cb0: 3a 51 33 22 29 3a 0a 20 20 20 20 20 20 20 20 20  :Q3"):.         
2cc0: 20 20 20 72 65 74 75 72 6e 20 54 72 75 65 0a 20     return True. 
2cd0: 20 20 20 69 66 20 70 68 6f 6e 65 74 2e 68 61 73     if phonet.has
2ce0: 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a 66  Simil(sFlex, ":f
2cf0: 22 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  "):.        retu
2d00: 72 6e 20 54 72 75 65 0a 20 20 20 20 72 65 74 75  rn True.    retu
2d10: 72 6e 20 46 61 6c 73 65 0a 0a 0a 64 65 66 20 68  rn False...def h
2d20: 61 73 4d 61 73 46 6f 72 6d 20 28 73 46 6c 65 78  asMasForm (sFlex
2d30: 29 3a 0a 20 20 20 20 66 6f 72 20 73 53 74 65 6d  ):.    for sStem
2d40: 20 69 6e 20 73 74 65 6d 28 73 46 6c 65 78 29 3a   in stem(sFlex):
2d50: 0a 20 20 20 20 20 20 20 20 69 66 20 6d 66 73 70  .        if mfsp
2d60: 2e 69 73 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d  .isFemForm(sStem
2d70: 29 20 6f 72 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e  ) or conj.hasCon
2d80: 6a 28 73 53 74 65 6d 2c 20 22 3a 50 51 22 2c 20  j(sStem, ":PQ", 
2d90: 22 3a 51 31 22 29 3a 0a 20 20 20 20 20 20 20 20  ":Q1"):.        
2da0: 20 20 20 20 23 20 77 68 61 74 20 68 61 73 20 61      # what has a
2db0: 20 66 65 6d 69 6e 69 6e 65 20 66 6f 72 6d 20 61   feminine form a
2dc0: 6c 73 6f 20 68 61 73 20 61 20 6d 61 73 63 75 6c  lso has a mascul
2dd0: 69 6e 65 20 66 6f 72 6d 0a 20 20 20 20 20 20 20  ine form.       
2de0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 72 75 65       return True
2df0: 0a 20 20 20 20 69 66 20 70 68 6f 6e 65 74 2e 68  .    if phonet.h
2e00: 61 73 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20 22  asSimil(sFlex, "
2e10: 3a 6d 22 29 3a 0a 20 20 20 20 20 20 20 20 72 65  :m"):.        re
2e20: 74 75 72 6e 20 54 72 75 65 0a 20 20 20 20 72 65  turn True.    re
2e30: 74 75 72 6e 20 46 61 6c 73 65 0a 0a 0a 64 65 66  turn False...def
2e40: 20 73 77 69 74 63 68 47 65 6e 64 65 72 20 28 73   switchGender (s
2e50: 46 6c 65 78 2c 20 62 50 6c 75 72 3d 4e 6f 6e 65  Flex, bPlur=None
2e60: 29 3a 0a 20 20 20 20 23 20 77 65 20 64 6f 6e e2  ):.    # we don.
2e70: 80 99 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72  ..t check if wor
2e80: 64 20 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e  d exists in _dAn
2e90: 61 6c 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69  alyses, for it i
2ea0: 73 20 61 73 73 75 6d 65 64 20 69 74 20 68 61 73  s assumed it has
2eb0: 20 62 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72   been done befor
2ec0: 65 0a 20 20 20 20 61 53 75 67 67 20 3d 20 73 65  e.    aSugg = se
2ed0: 74 28 29 0a 20 20 20 20 69 66 20 62 50 6c 75 72  t().    if bPlur
2ee0: 20 3d 3d 20 4e 6f 6e 65 3a 0a 20 20 20 20 20 20   == None:.      
2ef0: 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20    for sMorph in 
2f00: 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73  _dAnalyses.get(s
2f10: 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20 20 20 20  Flex, []):.     
2f20: 20 20 20 20 20 20 20 69 66 20 22 3a 66 22 20 69         if ":f" i
2f30: 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20  n sMorph:.      
2f40: 20 20 20 20 20 20 20 20 20 20 69 66 20 22 3a 73            if ":s
2f50: 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20  " in sMorph:.   
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 61 53 75 67 67 2e 61 64 64 28 73 75 67 67 4d   aSugg.add(suggM
2f80: 61 73 53 69 6e 67 28 73 46 6c 65 78 29 29 0a 20  asSing(sFlex)). 
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2fa0: 6c 69 66 20 22 3a 70 22 20 69 6e 20 73 4d 6f 72  lif ":p" in sMor
2fb0: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
2fc0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
2fd0: 64 28 73 75 67 67 4d 61 73 50 6c 75 72 28 73 46  d(suggMasPlur(sF
2fe0: 6c 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  lex)).          
2ff0: 20 20 65 6c 69 66 20 22 3a 6d 22 20 69 6e 20 73    elif ":m" in s
3000: 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20  Morph:.         
3010: 20 20 20 20 20 20 20 69 66 20 22 3a 73 22 20 69         if ":s" i
3020: 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20  n sMorph:.      
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3040: 75 67 67 2e 61 64 64 28 73 75 67 67 46 65 6d 53  ugg.add(suggFemS
3050: 69 6e 67 28 73 46 6c 65 78 29 29 0a 20 20 20 20  ing(sFlex)).    
3060: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66              elif
3070: 20 22 3a 70 22 20 69 6e 20 73 4d 6f 72 70 68 3a   ":p" in sMorph:
3080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3090: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
30a0: 75 67 67 46 65 6d 50 6c 75 72 28 73 46 6c 65 78  uggFemPlur(sFlex
30b0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
30c0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
30e0: 67 67 2e 61 64 64 28 73 75 67 67 46 65 6d 53 69  gg.add(suggFemSi
30f0: 6e 67 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20  ng(sFlex)).     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3110: 53 75 67 67 2e 61 64 64 28 73 75 67 67 46 65 6d  Sugg.add(suggFem
3120: 50 6c 75 72 28 73 46 6c 65 78 29 29 0a 20 20 20  Plur(sFlex)).   
3130: 20 65 6c 69 66 20 62 50 6c 75 72 3a 0a 20 20 20   elif bPlur:.   
3140: 20 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68 20       for sMorph 
3150: 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65  in _dAnalyses.ge
3160: 74 28 73 46 6c 65 78 2c 20 5b 5d 29 3a 0a 20 20  t(sFlex, []):.  
3170: 20 20 20 20 20 20 20 20 20 20 69 66 20 22 3a 66            if ":f
3180: 22 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20  " in sMorph:.   
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
31a0: 67 67 2e 61 64 64 28 73 75 67 67 4d 61 73 50 6c  gg.add(suggMasPl
31b0: 75 72 28 73 46 6c 65 78 29 29 0a 20 20 20 20 20  ur(sFlex)).     
31c0: 20 20 20 20 20 20 20 65 6c 69 66 20 22 3a 6d 22         elif ":m"
31d0: 20 69 6e 20 73 4d 6f 72 70 68 3a 0a 20 20 20 20   in sMorph:.    
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
31f0: 67 2e 61 64 64 28 73 75 67 67 46 65 6d 50 6c 75  g.add(suggFemPlu
3200: 72 28 73 46 6c 65 78 29 29 0a 20 20 20 20 65 6c  r(sFlex)).    el
3210: 73 65 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  se:.        for 
3220: 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c  sMorph in _dAnal
3230: 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c 20  yses.get(sFlex, 
3240: 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  []):.           
3250: 20 69 66 20 22 3a 66 22 20 69 6e 20 73 4d 6f 72   if ":f" in sMor
3260: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
3270: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 75      aSugg.add(su
3280: 67 67 4d 61 73 53 69 6e 67 28 73 46 6c 65 78 29  ggMasSing(sFlex)
3290: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
32a0: 69 66 20 22 3a 6d 22 20 69 6e 20 73 4d 6f 72 70  if ":m" in sMorp
32b0: 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h:.             
32c0: 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 75 67     aSugg.add(sug
32d0: 67 46 65 6d 53 69 6e 67 28 73 46 6c 65 78 29 29  gFemSing(sFlex))
32e0: 0a 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20  .    if aSugg:. 
32f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c         return "|
3300: 22 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20  ".join(aSugg).  
3310: 20 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65    return ""...de
3320: 66 20 73 77 69 74 63 68 50 6c 75 72 61 6c 20 28  f switchPlural (
3330: 73 46 6c 65 78 29 3a 0a 20 20 20 20 23 20 77 65  sFlex):.    # we
3340: 20 64 6f 6e e2 80 99 74 20 63 68 65 63 6b 20 69   don...t check i
3350: 66 20 77 6f 72 64 20 65 78 69 73 74 73 20 69 6e  f word exists in
3360: 20 5f 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72   _dAnalyses, for
3370: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 69   it is assumed i
3380: 74 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20  t has been done 
3390: 62 65 66 6f 72 65 0a 20 20 20 20 61 53 75 67 67  before.    aSugg
33a0: 20 3d 20 73 65 74 28 29 0a 20 20 20 20 66 6f 72   = set().    for
33b0: 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61   sMorph in _dAna
33c0: 6c 79 73 65 73 2e 67 65 74 28 73 46 6c 65 78 2c  lyses.get(sFlex,
33d0: 20 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 69 66   []):.        if
33e0: 20 22 3a 73 22 20 69 6e 20 73 4d 6f 72 70 68 3a   ":s" in sMorph:
33f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75  .            aSu
3400: 67 67 2e 61 64 64 28 73 75 67 67 50 6c 75 72 28  gg.add(suggPlur(
3410: 73 46 6c 65 78 29 29 0a 20 20 20 20 20 20 20 20  sFlex)).        
3420: 65 6c 69 66 20 22 3a 70 22 20 69 6e 20 73 4d 6f  elif ":p" in sMo
3430: 72 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20  rph:.           
3440: 20 61 53 75 67 67 2e 61 64 64 28 73 75 67 67 53   aSugg.add(suggS
3450: 69 6e 67 28 73 46 6c 65 78 29 29 0a 20 20 20 20  ing(sFlex)).    
3460: 69 66 20 61 53 75 67 67 3a 0a 20 20 20 20 20 20  if aSugg:.      
3470: 20 20 72 65 74 75 72 6e 20 22 7c 22 2e 6a 6f 69    return "|".joi
3480: 6e 28 61 53 75 67 67 29 0a 20 20 20 20 72 65 74  n(aSugg).    ret
3490: 75 72 6e 20 22 22 0a 0a 0a 64 65 66 20 68 61 73  urn ""...def has
34a0: 53 69 6d 69 6c 20 28 73 57 6f 72 64 2c 20 73 50  Simil (sWord, sP
34b0: 61 74 74 65 72 6e 3d 4e 6f 6e 65 29 3a 0a 20 20  attern=None):.  
34c0: 20 20 72 65 74 75 72 6e 20 70 68 6f 6e 65 74 2e    return phonet.
34d0: 68 61 73 53 69 6d 69 6c 28 73 57 6f 72 64 2c 20  hasSimil(sWord, 
34e0: 73 50 61 74 74 65 72 6e 29 0a 0a 0a 64 65 66 20  sPattern)...def 
34f0: 73 75 67 67 53 69 6d 69 6c 20 28 73 57 6f 72 64  suggSimil (sWord
3500: 2c 20 73 50 61 74 74 65 72 6e 3d 4e 6f 6e 65 2c  , sPattern=None,
3510: 20 62 53 75 62 73 74 3d 46 61 6c 73 65 29 3a 0a   bSubst=False):.
3520: 20 20 20 20 22 72 65 74 75 72 6e 20 6c 69 73 74      "return list
3530: 20 6f 66 20 77 6f 72 64 73 20 70 68 6f 6e 65 74   of words phonet
3540: 69 63 61 6c 6c 79 20 73 69 6d 69 6c 61 72 20 74  ically similar t
3550: 6f 20 73 57 6f 72 64 20 61 6e 64 20 77 68 6f 6d  o sWord and whom
3560: 20 50 4f 53 20 69 73 20 6d 61 74 63 68 69 6e 67   POS is matching
3570: 20 73 50 61 74 74 65 72 6e 22 0a 20 20 20 20 23   sPattern".    #
3580: 20 77 65 20 64 6f 6e e2 80 99 74 20 63 68 65 63   we don...t chec
3590: 6b 20 69 66 20 77 6f 72 64 20 65 78 69 73 74 73  k if word exists
35a0: 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2c 20   in _dAnalyses, 
35b0: 66 6f 72 20 69 74 20 69 73 20 61 73 73 75 6d 65  for it is assume
35c0: 64 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 6f  d it has been do
35d0: 6e 65 20 62 65 66 6f 72 65 0a 20 20 20 20 61 53  ne before.    aS
35e0: 75 67 67 20 3d 20 70 68 6f 6e 65 74 2e 73 65 6c  ugg = phonet.sel
35f0: 65 63 74 53 69 6d 69 6c 28 73 57 6f 72 64 2c 20  ectSimil(sWord, 
3600: 73 50 61 74 74 65 72 6e 29 0a 20 20 20 20 66 6f  sPattern).    fo
3610: 72 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64 41 6e  r sMorph in _dAn
3620: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
3630: 2c 20 5b 5d 29 3a 0a 20 20 20 20 20 20 20 20 61  , []):.        a
3640: 53 75 67 67 2e 75 70 64 61 74 65 28 63 6f 6e 6a  Sugg.update(conj
3650: 2e 67 65 74 53 69 6d 69 6c 28 73 57 6f 72 64 2c  .getSimil(sWord,
3660: 20 73 4d 6f 72 70 68 2c 20 62 53 75 62 73 74 29   sMorph, bSubst)
3670: 29 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a  ).        break.
3680: 20 20 20 20 69 66 20 61 53 75 67 67 3a 0a 20 20      if aSugg:.  
3690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 7c 22        return "|"
36a0: 2e 6a 6f 69 6e 28 61 53 75 67 67 29 0a 20 20 20  .join(aSugg).   
36b0: 20 72 65 74 75 72 6e 20 22 22 0a 0a 0a 64 65 66   return ""...def
36c0: 20 73 75 67 67 43 65 4f 72 43 65 74 20 28 73 57   suggCeOrCet (sW
36d0: 6f 72 64 29 3a 0a 20 20 20 20 69 66 20 72 65 2e  ord):.    if re.
36e0: 6d 61 74 63 68 28 22 28 3f 69 29 5b 61 65 c3 a9  match("(?i)[ae..
36f0: c3 a8 c3 aa 69 6f 75 79 c3 a2 c3 ae c3 af 5d 22  ....iouy......]"
3700: 2c 20 73 57 6f 72 64 29 3a 0a 20 20 20 20 20 20  , sWord):.      
3710: 20 20 72 65 74 75 72 6e 20 22 63 65 74 22 0a 20    return "cet". 
3720: 20 20 20 69 66 20 73 57 6f 72 64 5b 30 3a 31 5d     if sWord[0:1]
3730: 20 3d 3d 20 22 68 22 20 6f 72 20 73 57 6f 72 64   == "h" or sWord
3740: 5b 30 3a 31 5d 20 3d 3d 20 22 48 22 3a 0a 20 20  [0:1] == "H":.  
3750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 63 65        return "ce
3760: 7c 63 65 74 22 0a 20 20 20 20 72 65 74 75 72 6e  |cet".    return
3770: 20 22 63 65 22 0a 0a 0a 64 65 66 20 73 75 67 67   "ce"...def sugg
3780: 4c 65 73 4c 61 20 28 73 57 6f 72 64 29 3a 0a 20  LesLa (sWord):. 
3790: 20 20 20 23 20 77 65 20 64 6f 6e e2 80 99 74 20     # we don...t 
37a0: 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20 65 78  check if word ex
37b0: 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c 79 73  ists in _dAnalys
37c0: 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20 61 73  es, for it is as
37d0: 73 75 6d 65 64 20 69 74 20 68 61 73 20 62 65 65  sumed it has bee
37e0: 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a 20 20  n done before.  
37f0: 20 20 69 66 20 61 6e 79 28 20 22 3a 70 22 20 69    if any( ":p" i
3800: 6e 20 73 4d 6f 72 70 68 20 20 66 6f 72 20 73 4d  n sMorph  for sM
3810: 6f 72 70 68 20 69 6e 20 5f 64 41 6e 61 6c 79 73  orph in _dAnalys
3820: 65 73 2e 67 65 74 28 73 57 6f 72 64 2c 20 5b 5d  es.get(sWord, []
3830: 29 20 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ) ):.        ret
3840: 75 72 6e 20 22 6c 65 73 7c 6c 61 22 0a 20 20 20  urn "les|la".   
3850: 20 72 65 74 75 72 6e 20 22 6c 61 22 0a 0a 0a 5f   return "la"..._
3860: 7a 42 69 6e 61 72 79 20 3d 20 72 65 2e 63 6f 6d  zBinary = re.com
3870: 70 69 6c 65 28 22 5e 5b 30 31 5d 2b 24 22 29 0a  pile("^[01]+$").
3880: 0a 64 65 66 20 66 6f 72 6d 61 74 4e 75 6d 62 65  .def formatNumbe
3890: 72 20 28 73 29 3a 0a 20 20 20 20 6e 4c 65 6e 20  r (s):.    nLen 
38a0: 3d 20 6c 65 6e 28 73 29 0a 20 20 20 20 69 66 20  = len(s).    if 
38b0: 6e 4c 65 6e 20 3c 20 34 3a 0a 20 20 20 20 20 20  nLen < 4:.      
38c0: 20 20 72 65 74 75 72 6e 20 73 0a 20 20 20 20 73    return s.    s
38d0: 52 65 73 20 3d 20 22 22 0a 20 20 20 20 23 20 6e  Res = "".    # n
38e0: 6f 6d 62 72 65 20 6f 72 64 69 6e 61 69 72 65 0a  ombre ordinaire.
38f0: 20 20 20 20 6e 45 6e 64 20 3d 20 6e 4c 65 6e 0a      nEnd = nLen.
3900: 20 20 20 20 77 68 69 6c 65 20 6e 45 6e 64 20 3e      while nEnd >
3910: 20 30 3a 0a 20 20 20 20 20 20 20 20 6e 53 74 61   0:.        nSta
3920: 72 74 20 3d 20 6d 61 78 28 6e 45 6e 64 2d 33 2c  rt = max(nEnd-3,
3930: 20 30 29 0a 20 20 20 20 20 20 20 20 73 52 65 73   0).        sRes
3940: 20 3d 20 73 5b 6e 53 74 61 72 74 3a 6e 45 6e 64   = s[nStart:nEnd
3950: 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 52 65 73 20  ] + ".." + sRes 
3960: 20 69 66 20 73 52 65 73 20 20 65 6c 73 65 20 73   if sRes  else s
3970: 5b 6e 53 74 61 72 74 3a 6e 45 6e 64 5d 0a 20 20  [nStart:nEnd].  
3980: 20 20 20 20 20 20 6e 45 6e 64 20 3d 20 6e 45 6e        nEnd = nEn
3990: 64 20 2d 20 33 0a 20 20 20 20 23 20 62 69 6e 61  d - 3.    # bina
39a0: 69 72 65 0a 20 20 20 20 69 66 20 5f 7a 42 69 6e  ire.    if _zBin
39b0: 61 72 79 2e 73 65 61 72 63 68 28 73 29 3a 0a 20  ary.search(s):. 
39c0: 20 20 20 20 20 20 20 6e 45 6e 64 20 3d 20 6e 4c         nEnd = nL
39d0: 65 6e 0a 20 20 20 20 20 20 20 20 73 42 69 6e 20  en.        sBin 
39e0: 3d 20 22 22 0a 20 20 20 20 20 20 20 20 77 68 69  = "".        whi
39f0: 6c 65 20 6e 45 6e 64 20 3e 20 30 3a 0a 20 20 20  le nEnd > 0:.   
3a00: 20 20 20 20 20 20 20 20 20 6e 53 74 61 72 74 20           nStart 
3a10: 3d 20 6d 61 78 28 6e 45 6e 64 2d 34 2c 20 30 29  = max(nEnd-4, 0)
3a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 42 69  .            sBi
3a30: 6e 20 3d 20 73 5b 6e 53 74 61 72 74 3a 6e 45 6e  n = s[nStart:nEn
3a40: 64 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 42 69 6e  d] + ".." + sBin
3a50: 20 20 69 66 20 73 42 69 6e 20 20 65 6c 73 65 20    if sBin  else 
3a60: 73 5b 6e 53 74 61 72 74 3a 6e 45 6e 64 5d 0a 20  s[nStart:nEnd]. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 6e 45 6e 64 20             nEnd 
3a80: 3d 20 6e 45 6e 64 20 2d 20 34 0a 20 20 20 20 20  = nEnd - 4.     
3a90: 20 20 20 73 52 65 73 20 2b 3d 20 22 7c 22 20 2b     sRes += "|" +
3aa0: 20 73 42 69 6e 0a 20 20 20 20 23 20 6e 75 6d c3   sBin.    # num.
3ab0: a9 72 6f 73 20 64 65 20 74 c3 a9 6c c3 a9 70 68  .ros de t..l..ph
3ac0: 6f 6e 65 0a 20 20 20 20 69 66 20 6e 4c 65 6e 20  one.    if nLen 
3ad0: 3d 3d 20 31 30 3a 0a 20 20 20 20 20 20 20 20 69  == 10:.        i
3ae0: 66 20 73 2e 73 74 61 72 74 73 77 69 74 68 28 22  f s.startswith("
3af0: 30 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  0"):.           
3b00: 20 73 52 65 73 20 2b 3d 20 22 7c 22 20 2b 20 73   sRes += "|" + s
3b10: 5b 30 3a 32 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [0:2] + ".." + s
3b20: 5b 32 3a 34 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [2:4] + ".." + s
3b30: 5b 34 3a 36 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [4:6] + ".." + s
3b40: 5b 36 3a 38 5d 20 2b 20 22 c2 a0 22 20 2b 20 73  [6:8] + ".." + s
3b50: 5b 38 3a 5d 20 23 20 74 c3 a9 6c c3 a9 70 68 6f  [8:] # t..l..pho
3b60: 6e 65 20 66 72 61 6e c3 a7 61 69 73 0a 20 20 20  ne fran..ais.   
3b70: 20 20 20 20 20 20 20 20 20 69 66 20 73 5b 31 5d           if s[1]
3b80: 20 3d 3d 20 22 34 22 20 61 6e 64 20 28 73 5b 32   == "4" and (s[2
3b90: 5d 3d 3d 22 37 22 20 6f 72 20 73 5b 32 5d 3d 3d  ]=="7" or s[2]==
3ba0: 22 38 22 20 6f 72 20 73 5b 32 5d 3d 3d 22 39 22  "8" or s[2]=="9"
3bb0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
3bc0: 20 20 20 73 52 65 73 20 2b 3d 20 22 7c 22 20 2b     sRes += "|" +
3bd0: 20 73 5b 30 3a 34 5d 20 2b 20 22 c2 a0 22 20 2b   s[0:4] + ".." +
3be0: 20 73 5b 34 3a 36 5d 20 2b 20 22 c2 a0 22 20 2b   s[4:6] + ".." +
3bf0: 20 73 5b 36 3a 38 5d 20 2b 20 22 c2 a0 22 20 2b   s[6:8] + ".." +
3c00: 20 73 5b 38 3a 5d 20 20 20 20 20 20 20 20 20 20   s[8:]          
3c10: 20 20 23 20 6d 6f 62 69 6c 65 20 62 65 6c 67 65    # mobile belge
3c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65  .            sRe
3c30: 73 20 2b 3d 20 22 7c 22 20 2b 20 73 5b 30 3a 33  s += "|" + s[0:3
3c40: 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 33 3a 36  ] + ".." + s[3:6
3c50: 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 36 3a 38  ] + ".." + s[6:8
3c60: 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 38 3a 5d  ] + ".." + s[8:]
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 23 20 74 c3 a9 6c c3 a9 70 68 6f 6e 65 20 73 75  # t..l..phone su
3c90: 69 73 73 65 0a 20 20 20 20 20 20 20 20 73 52 65  isse.        sRe
3ca0: 73 20 2b 3d 20 22 7c 22 20 2b 20 73 5b 30 3a 34  s += "|" + s[0:4
3cb0: 5d 20 2b 20 22 c2 a0 22 20 2b 20 73 5b 34 3a 37  ] + ".." + s[4:7
3cc0: 5d 20 2b 20 22 2d 22 20 2b 20 73 5b 37 3a 5d 20  ] + "-" + s[7:] 
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 23 20 74 c3 a9 6c c3 a9 70 68 6f 6e 65 20    # t..l..phone 
3d00: 63 61 6e 61 64 69 65 6e 20 6f 75 20 61 6d c3 a9  canadien ou am..
3d10: 72 69 63 61 69 6e 0a 20 20 20 20 65 6c 69 66 20  ricain.    elif 
3d20: 6e 4c 65 6e 20 3d 3d 20 39 20 61 6e 64 20 73 2e  nLen == 9 and s.
3d30: 73 74 61 72 74 73 77 69 74 68 28 22 30 22 29 3a  startswith("0"):
3d40: 0a 20 20 20 20 20 20 20 20 73 52 65 73 20 2b 3d  .        sRes +=
3d50: 20 22 7c 22 20 2b 20 73 5b 30 3a 33 5d 20 2b 20   "|" + s[0:3] + 
3d60: 22 c2 a0 22 20 2b 20 73 5b 33 3a 35 5d 20 2b 20  ".." + s[3:5] + 
3d70: 22 c2 a0 22 20 2b 20 73 5b 35 3a 37 5d 20 2b 20  ".." + s[5:7] + 
3d80: 22 c2 a0 22 20 2b 20 73 5b 37 3a 39 5d 20 20 20  ".." + s[7:9]   
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 23 20 66 69 78 65 20 62 65 6c 67 65 20 31 0a 20  # fixe belge 1. 
3db0: 20 20 20 20 20 20 20 73 52 65 73 20 2b 3d 20 22         sRes += "
3dc0: 7c 22 20 2b 20 73 5b 30 3a 32 5d 20 2b 20 22 c2  |" + s[0:2] + ".
3dd0: a0 22 20 2b 20 73 5b 32 3a 35 5d 20 2b 20 22 c2  ." + s[2:5] + ".
3de0: a0 22 20 2b 20 73 5b 35 3a 37 5d 20 2b 20 22 c2  ." + s[5:7] + ".
3df0: a0 22 20 2b 20 73 5b 37 3a 39 5d 20 20 20 20 20  ." + s[7:9]     
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
3e10: 66 69 78 65 20 62 65 6c 67 65 20 32 0a 20 20 20  fixe belge 2.   
3e20: 20 72 65 74 75 72 6e 20 73 52 65 73 0a 0a 0a 64   return sRes...d
3e30: 65 66 20 66 6f 72 6d 61 74 4e 46 20 28 73 29 3a  ef formatNF (s):
3e40: 0a 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20  .    try:.      
3e50: 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28 22    m = re.match("
3e60: 4e 46 5b 20 c2 a0 2d 5d 3f 28 43 7c 45 7c 50 7c  NF[ ..-]?(C|E|P|
3e70: 51 7c 53 7c 58 7c 5a 7c 45 4e 28 3f 3a 5b 20 c2  Q|S|X|Z|EN(?:[ .
3e80: a0 2d 5d 49 53 4f 7c 29 29 5b 20 c2 a0 2d 5d 3f  .-]ISO|))[ ..-]?
3e90: 28 5b 30 2d 39 5d 2b 28 3f 3a 5b 2f e2 80 91 2d  ([0-9]+(?:[/...-
3ea0: 5d 5b 30 2d 39 5d 2b 7c 29 29 22 2c 20 73 29 0a  ][0-9]+|))", s).
3eb0: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6d          if not m
3ec0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
3ed0: 74 75 72 6e 20 22 22 0a 20 20 20 20 20 20 20 20  turn "".        
3ee0: 72 65 74 75 72 6e 20 22 4e 46 c2 a0 22 20 2b 20  return "NF.." + 
3ef0: 6d 2e 67 72 6f 75 70 28 31 29 2e 75 70 70 65 72  m.group(1).upper
3f00: 28 29 2e 72 65 70 6c 61 63 65 28 22 20 22 2c 20  ().replace(" ", 
3f10: 22 c2 a0 22 29 2e 72 65 70 6c 61 63 65 28 22 2d  "..").replace("-
3f20: 22 2c 20 22 c2 a0 22 29 20 2b 20 22 c2 a0 22 20  ", "..") + ".." 
3f30: 2b 20 6d 2e 67 72 6f 75 70 28 32 29 2e 72 65 70  + m.group(2).rep
3f40: 6c 61 63 65 28 22 2f 22 2c 20 22 e2 80 91 22 29  lace("/", "...")
3f50: 2e 72 65 70 6c 61 63 65 28 22 2d 22 2c 20 22 e2  .replace("-", ".
3f60: 80 91 22 29 0a 20 20 20 20 65 78 63 65 70 74 3a  ..").    except:
3f70: 0a 20 20 20 20 20 20 20 20 74 72 61 63 65 62 61  .        traceba
3f80: 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a 20  ck.print_exc(). 
3f90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 23         return "#
3fa0: 20 65 72 72 65 75 72 20 23 22 0a 0a 0a 64 65 66   erreur #"...def
3fb0: 20 75 6e 64 6f 4c 69 67 61 74 75 72 65 20 28 63   undoLigature (c
3fc0: 29 3a 0a 20 20 20 20 69 66 20 63 20 3d 3d 20 22  ):.    if c == "
3fd0: ef ac 81 22 3a 0a 20 20 20 20 20 20 20 20 72 65  ...":.        re
3fe0: 74 75 72 6e 20 22 66 69 22 0a 20 20 20 20 65 6c  turn "fi".    el
3ff0: 69 66 20 63 20 3d 3d 20 22 ef ac 82 22 3a 0a 20  if c == "...":. 
4000: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 66         return "f
4010: 6c 22 0a 20 20 20 20 65 6c 69 66 20 63 20 3d 3d  l".    elif c ==
4020: 20 22 ef ac 80 22 3a 0a 20 20 20 20 20 20 20 20   "...":.        
4030: 72 65 74 75 72 6e 20 22 66 66 22 0a 20 20 20 20  return "ff".    
4040: 65 6c 69 66 20 63 20 3d 3d 20 22 ef ac 83 22 3a  elif c == "...":
4050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4060: 22 66 66 69 22 0a 20 20 20 20 65 6c 69 66 20 63  "ffi".    elif c
4070: 20 3d 3d 20 22 ef ac 84 22 3a 0a 20 20 20 20 20   == "...":.     
4080: 20 20 20 72 65 74 75 72 6e 20 22 66 66 6c 22 0a     return "ffl".
4090: 20 20 20 20 65 6c 69 66 20 63 20 3d 3d 20 22 ef      elif c == ".
40a0: ac 85 22 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ..":.        ret
40b0: 75 72 6e 20 22 66 74 22 0a 20 20 20 20 65 6c 69  urn "ft".    eli
40c0: 66 20 63 20 3d 3d 20 22 ef ac 86 22 3a 0a 20 20  f c == "...":.  
40d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 73 74        return "st
40e0: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 22 5f 22  ".    return "_"
40f0: 0a 0a 0a 0a 0a 5f 78 4e 6f 72 6d 61 6c 69 7a 65  ....._xNormalize
4100: 64 43 68 61 72 73 46 6f 72 49 6e 63 6c 75 73 69  dCharsForInclusi
4110: 76 65 57 72 69 74 69 6e 67 20 3d 20 73 74 72 2e  veWriting = str.
4120: 6d 61 6b 65 74 72 61 6e 73 28 7b 0a 20 20 20 20  maketrans({.    
4130: 27 28 27 3a 20 27 5f 27 2c 20 20 27 29 27 3a 20  '(': '_',  ')': 
4140: 27 5f 27 2c 0a 20 20 20 20 27 2e 27 3a 20 27 5f  '_',.    '.': '_
4150: 27 2c 20 20 27 c2 b7 27 3a 20 27 5f 27 2c 0a 20  ',  '..': '_',. 
4160: 20 20 20 27 e2 80 93 27 3a 20 27 5f 27 2c 20 20     '...': '_',  
4170: 27 e2 80 94 27 3a 20 27 5f 27 2c 0a 20 20 20 20  '...': '_',.    
4180: 27 2f 27 3a 20 27 5f 27 0a 20 7d 29 0a 0a 0a 64  '/': '_'. })...d
4190: 65 66 20 6e 6f 72 6d 61 6c 69 7a 65 49 6e 63 6c  ef normalizeIncl
41a0: 75 73 69 76 65 57 72 69 74 69 6e 67 20 28 73 54  usiveWriting (sT
41b0: 6f 6b 65 6e 29 3a 0a 20 20 20 20 72 65 74 75 72  oken):.    retur
41c0: 6e 20 73 54 6f 6b 65 6e 2e 74 72 61 6e 73 6c 61  n sToken.transla
41d0: 74 65 28 5f 78 4e 6f 72 6d 61 6c 69 7a 65 64 43  te(_xNormalizedC
41e0: 68 61 72 73 46 6f 72 49 6e 63 6c 75 73 69 76 65  harsForInclusive
41f0: 57 72 69 74 69 6e 67 29 0a                       Writing).