Grammalecte  Hex Artifact Content

Artifact 732462dec89ca9437e71315258525226939a93616214293939d60cdbbbecdc7e:


0000: 23 21 70 79 74 68 6f 6e 33 0a 0a 23 20 46 52 45  #!python3..# FRE
0010: 4e 43 48 20 44 41 54 41 20 42 55 49 4c 44 45 52  NCH DATA BUILDER
0020: 0a 23 0a 23 20 62 79 20 4f 6c 69 76 69 65 72 20  .#.# by Olivier 
0030: 52 2e 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 50  R..# License: MP
0040: 4c 20 32 0a 0a 69 6d 70 6f 72 74 20 6a 73 6f 6e  L 2..import json
0050: 0a 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f 72  .import os.impor
0060: 74 20 69 74 65 72 74 6f 6f 6c 73 0a 0a 69 6d 70  t itertools..imp
0070: 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e  ort grammalecte.
0080: 69 62 64 61 77 67 20 61 73 20 69 62 64 61 77 67  ibdawg as ibdawg
0090: 0a 66 72 6f 6d 20 67 72 61 6d 6d 61 6c 65 63 74  .from grammalect
00a0: 65 2e 65 63 68 6f 20 69 6d 70 6f 72 74 20 65 63  e.echo import ec
00b0: 68 6f 0a 66 72 6f 6d 20 67 72 61 6d 6d 61 6c 65  ho.from grammale
00c0: 63 74 65 2e 73 74 72 5f 74 72 61 6e 73 66 6f 72  cte.str_transfor
00d0: 6d 20 69 6d 70 6f 72 74 20 64 65 66 69 6e 65 53  m import defineS
00e0: 75 66 66 69 78 43 6f 64 65 0a 69 6d 70 6f 72 74  uffixCode.import
00f0: 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e 66 72 2e   grammalecte.fr.
0100: 63 6f 6e 6a 20 61 73 20 63 6f 6e 6a 0a 69 6d 70  conj as conj.imp
0110: 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e  ort grammalecte.
0120: 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 74 6b 7a  tokenizer as tkz
0130: 0a 0a 0a 63 6c 61 73 73 20 63 64 3a 0a 20 20 20  ...class cd:.   
0140: 20 22 22 22 43 6f 6e 74 65 78 74 20 6d 61 6e 61   """Context mana
0150: 67 65 72 20 66 6f 72 20 63 68 61 6e 67 69 6e 67  ger for changing
0160: 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72   the current wor
0170: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 22 22  king directory""
0180: 22 0a 20 20 20 20 64 65 66 20 5f 5f 69 6e 69 74  ".    def __init
0190: 5f 5f 20 28 73 65 6c 66 2c 20 6e 65 77 50 61 74  __ (self, newPat
01a0: 68 29 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66  h):.        self
01b0: 2e 6e 65 77 50 61 74 68 20 3d 20 6f 73 2e 70 61  .newPath = os.pa
01c0: 74 68 2e 65 78 70 61 6e 64 75 73 65 72 28 6e 65  th.expanduser(ne
01d0: 77 50 61 74 68 29 0a 0a 20 20 20 20 64 65 66 20  wPath)..    def 
01e0: 5f 5f 65 6e 74 65 72 5f 5f 20 28 73 65 6c 66 29  __enter__ (self)
01f0: 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 73  :.        self.s
0200: 61 76 65 64 50 61 74 68 20 3d 20 6f 73 2e 67 65  avedPath = os.ge
0210: 74 63 77 64 28 29 0a 20 20 20 20 20 20 20 20 6f  tcwd().        o
0220: 73 2e 63 68 64 69 72 28 73 65 6c 66 2e 6e 65 77  s.chdir(self.new
0230: 50 61 74 68 29 0a 0a 20 20 20 20 64 65 66 20 5f  Path)..    def _
0240: 5f 65 78 69 74 5f 5f 20 28 73 65 6c 66 2c 20 65  _exit__ (self, e
0250: 74 79 70 65 2c 20 76 61 6c 75 65 2c 20 74 72 61  type, value, tra
0260: 63 65 62 61 63 6b 29 3a 0a 20 20 20 20 20 20 20  ceback):.       
0270: 20 6f 73 2e 63 68 64 69 72 28 73 65 6c 66 2e 73   os.chdir(self.s
0280: 61 76 65 64 50 61 74 68 29 0a 0a 0a 64 65 66 20  avedPath)...def 
0290: 72 65 61 64 46 69 6c 65 20 28 73 70 66 29 3a 0a  readFile (spf):.
02a0: 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69      if os.path.i
02b0: 73 66 69 6c 65 28 73 70 66 29 3a 0a 20 20 20 20  sfile(spf):.    
02c0: 20 20 20 20 77 69 74 68 20 6f 70 65 6e 28 73 70      with open(sp
02d0: 66 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67  f, "r", encoding
02e0: 3d 22 75 74 66 2d 38 22 29 20 61 73 20 68 53 72  ="utf-8") as hSr
02f0: 63 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  c:.            f
0300: 6f 72 20 73 4c 69 6e 65 20 69 6e 20 68 53 72 63  or sLine in hSrc
0310: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0320: 20 20 73 4c 69 6e 65 20 3d 20 73 4c 69 6e 65 2e    sLine = sLine.
0330: 73 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20  strip().        
0340: 20 20 20 20 20 20 20 20 69 66 20 73 4c 69 6e 65          if sLine
0350: 20 61 6e 64 20 6e 6f 74 20 73 4c 69 6e 65 2e 73   and not sLine.s
0360: 74 61 72 74 73 77 69 74 68 28 22 23 22 29 3a 0a  tartswith("#"):.
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 20 20 20 20 79 69 65 6c 64 20 73 4c 69 6e 65 0a      yield sLine.
0390: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
03a0: 20 20 72 61 69 73 65 20 4f 53 45 72 72 6f 72 28    raise OSError(
03b0: 22 23 20 45 72 72 6f 72 2e 20 46 69 6c 65 20 6e  "# Error. File n
03c0: 6f 74 20 66 6f 75 6e 64 20 6f 72 20 6e 6f 74 20  ot found or not 
03d0: 6c 6f 61 64 61 62 6c 65 3a 20 22 20 2b 20 73 70  loadable: " + sp
03e0: 66 29 0a 0a 0a 64 65 66 20 6d 61 6b 65 44 69 63  f)...def makeDic
03f0: 74 69 6f 6e 61 72 69 65 73 20 28 73 70 2c 20 73  tionaries (sp, s
0400: 56 65 72 73 69 6f 6e 29 3a 0a 20 20 20 20 77 69  Version):.    wi
0410: 74 68 20 63 64 28 73 70 2b 22 2f 64 69 63 74 69  th cd(sp+"/dicti
0420: 6f 6e 6e 61 69 72 65 22 29 3a 0a 20 20 20 20 20  onnaire"):.     
0430: 20 20 20 6f 73 2e 73 79 73 74 65 6d 28 22 67 65     os.system("ge
0440: 6e 66 72 64 69 63 2e 70 79 20 2d 73 20 2d 67 6c  nfrdic.py -s -gl
0450: 20 2d 76 20 22 2b 73 56 65 72 73 69 6f 6e 29 0a   -v "+sVersion).
0460: 0a 0a 64 65 66 20 6d 61 6b 65 43 6f 6e 6a 20 28  ..def makeConj (
0470: 73 70 2c 20 62 4a 53 3d 46 61 6c 73 65 29 3a 0a  sp, bJS=False):.
0480: 20 20 20 20 70 72 69 6e 74 28 22 3e 20 43 6f 6e      print("> Con
0490: 6a 75 67 61 69 73 6f 6e 73 20 22 2c 20 65 6e 64  jugaisons ", end
04a0: 3d 22 22 29 0a 20 20 20 20 70 72 69 6e 74 28 22  ="").    print("
04b0: 28 50 79 74 68 6f 6e 20 65 74 20 4a 61 76 61 53  (Python et JavaS
04c0: 63 72 69 70 74 29 22 20 20 69 66 20 62 4a 53 20  cript)"  if bJS 
04d0: 20 65 6c 73 65 20 22 28 50 79 74 68 6f 6e 20 73   else "(Python s
04e0: 65 75 6c 65 6d 65 6e 74 29 22 29 0a 20 20 20 20  eulement)").    
04f0: 64 56 65 72 62 20 3d 20 7b 7d 0a 20 20 20 20 6c  dVerb = {}.    l
0500: 56 74 79 70 20 3d 20 5b 5d 3b 20 64 56 74 79 70  Vtyp = []; dVtyp
0510: 20 3d 20 7b 7d 3b 20 6e 56 74 79 70 20 3d 20 30   = {}; nVtyp = 0
0520: 0a 20 20 20 20 6c 54 61 67 73 20 3d 20 5b 5d 3b  .    lTags = [];
0530: 20 64 54 61 67 73 20 3d 20 7b 7d 3b 20 6e 54 61   dTags = {}; nTa
0540: 67 73 20 3d 20 30 0a 0a 20 20 20 20 64 50 61 74  gs = 0..    dPat
0550: 74 65 72 6e 4c 69 73 74 20 3d 20 7b 20 22 3a 50  ternList = { ":P
0560: 51 22 3a 20 5b 5d 2c 20 22 3a 49 70 22 3a 20 5b  Q": [], ":Ip": [
0570: 5d 2c 20 22 3a 49 71 22 3a 20 5b 5d 2c 20 22 3a  ], ":Iq": [], ":
0580: 49 73 22 3a 20 5b 5d 2c 20 22 3a 49 66 22 3a 20  Is": [], ":If": 
0590: 5b 5d 2c 20 22 3a 4b 22 3a 20 5b 5d 2c 20 22 3a  [], ":K": [], ":
05a0: 53 70 22 3a 20 5b 5d 2c 20 22 3a 53 71 22 3a 20  Sp": [], ":Sq": 
05b0: 5b 5d 2c 20 22 3a 45 22 3a 20 5b 5d 20 7d 0a 20  [], ":E": [] }. 
05c0: 20 20 20 64 54 72 61 64 20 3d 20 7b 20 20 20 22     dTrad = {   "
05d0: 69 6e 66 69 22 3a 20 22 3a 59 22 2c 20 22 70 70  infi": ":Y", "pp
05e0: 72 65 22 3a 20 22 3a 50 51 22 2c 20 22 70 70 61  re": ":PQ", "ppa
05f0: 73 22 3a 20 22 3a 50 51 22 2c 0a 20 20 20 20 20  s": ":PQ",.     
0600: 20 20 20 20 20 20 20 20 20 20 20 22 69 70 72 65             "ipre
0610: 22 3a 20 22 3a 49 70 22 2c 20 22 69 69 6d 70 22  ": ":Ip", "iimp"
0620: 3a 20 22 3a 49 71 22 2c 20 22 69 70 73 69 22 3a  : ":Iq", "ipsi":
0630: 20 22 3a 49 73 22 2c 20 22 69 66 75 74 22 3a 20   ":Is", "ifut": 
0640: 22 3a 49 66 22 2c 0a 20 20 20 20 20 20 20 20 20  ":If",.         
0650: 20 20 20 20 20 20 20 22 73 70 72 65 22 3a 20 22         "spre": "
0660: 3a 53 70 22 2c 20 22 73 69 6d 70 22 3a 20 22 3a  :Sp", "simp": ":
0670: 53 71 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sq",.           
0680: 20 20 20 20 20 22 63 6f 6e 64 22 3a 20 22 3a 4b       "cond": ":K
0690: 22 2c 20 22 69 6d 70 65 22 3a 20 22 3a 45 22 2c  ", "impe": ":E",
06a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
06b0: 20 22 31 73 67 22 3a 20 22 3a 31 73 22 2c 20 22   "1sg": ":1s", "
06c0: 32 73 67 22 3a 20 22 3a 32 73 22 2c 20 22 33 73  2sg": ":2s", "3s
06d0: 67 22 3a 20 22 3a 33 73 22 2c 20 22 31 70 6c 22  g": ":3s", "1pl"
06e0: 3a 20 22 3a 31 70 22 2c 20 22 32 70 6c 22 3a 20  : ":1p", "2pl": 
06f0: 22 3a 32 70 22 2c 20 22 33 70 6c 22 3a 20 22 3a  ":2p", "3pl": ":
0700: 33 70 22 2c 20 22 31 69 73 67 22 3a 20 22 3a 31  3p", "1isg": ":1
0710: c5 9b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ..",.           
0720: 20 20 20 20 20 22 6d 61 73 20 73 67 22 3a 20 22       "mas sg": "
0730: 3a 51 31 22 2c 20 22 6d 61 73 20 70 6c 22 3a 20  :Q1", "mas pl": 
0740: 22 3a 51 32 22 2c 20 22 6d 61 73 20 69 6e 76 22  ":Q2", "mas inv"
0750: 3a 20 22 3a 51 31 22 2c 20 22 66 65 6d 20 73 67  : ":Q1", "fem sg
0760: 22 3a 20 22 3a 51 33 22 2c 20 22 66 65 6d 20 70  ": ":Q3", "fem p
0770: 6c 22 3a 20 22 3a 51 34 22 2c 20 22 65 70 69 20  l": ":Q4", "epi 
0780: 69 6e 76 22 3a 20 22 3a 51 31 22 0a 20 20 20 20  inv": ":Q1".    
0790: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 23          }..    #
07a0: 20 72 65 61 64 20 6c 65 78 69 63 6f 6e 0a 20 20   read lexicon.  
07b0: 20 20 6e 53 74 6f 70 20 3d 20 30 0a 20 20 20 20    nStop = 0.    
07c0: 66 6f 72 20 6e 2c 20 73 4c 69 6e 65 20 69 6e 20  for n, sLine in 
07d0: 65 6e 75 6d 65 72 61 74 65 28 72 65 61 64 46 69  enumerate(readFi
07e0: 6c 65 28 73 70 2b 22 2f 64 61 74 61 2f 64 69 63  le(sp+"/data/dic
07f0: 74 43 6f 6e 6a 2e 74 78 74 22 29 29 3a 0a 20 20  tConj.txt")):.  
0800: 20 20 20 20 20 20 6e 54 61 62 20 3d 20 73 4c 69        nTab = sLi
0810: 6e 65 2e 63 6f 75 6e 74 28 22 5c 74 22 29 0a 20  ne.count("\t"). 
0820: 20 20 20 20 20 20 20 69 66 20 6e 54 61 62 20 3d         if nTab =
0830: 3d 20 31 3a 0a 20 20 20 20 20 20 20 20 20 20 20  = 1:.           
0840: 20 23 20 6e 65 77 20 65 6e 74 72 79 0a 20 20 20   # new entry.   
0850: 20 20 20 20 20 20 20 20 20 73 4c 65 6d 6d 61 2c           sLemma,
0860: 20 73 56 74 79 70 20 3d 20 73 4c 69 6e 65 2e 73   sVtyp = sLine.s
0870: 70 6c 69 74 28 22 5c 74 22 29 0a 20 20 20 20 20  plit("\t").     
0880: 20 20 20 20 20 20 20 64 43 6f 6e 6a 20 3d 20 7b         dConj = {
0890: 20 20 20 22 3a 50 51 22 3a 20 7b 20 22 3a 50 22     ":PQ": { ":P"
08a0: 3a 20 22 22 2c 20 22 3a 51 31 22 3a 20 22 22 2c  : "", ":Q1": "",
08b0: 20 22 3a 51 32 22 3a 20 22 22 2c 20 22 3a 51 33   ":Q2": "", ":Q3
08c0: 22 3a 20 22 22 2c 20 22 3a 51 34 22 3a 20 22 22  ": "", ":Q4": ""
08d0: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  },.             
08e0: 20 20 20 20 20 20 20 20 20 20 20 22 3a 49 70 22             ":Ip"
08f0: 3a 20 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20 22  : { ":1s": "", "
0900: 3a 32 73 22 3a 20 22 22 2c 20 22 3a 33 73 22 3a  :2s": "", ":3s":
0910: 20 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20   "", ":1p": "", 
0920: 22 3a 32 70 22 3a 20 22 22 2c 20 22 3a 33 70 22  ":2p": "", ":3p"
0930: 3a 20 22 22 2c 20 22 3a 31 c5 9b 22 3a 20 22 22  : "", ":1..": ""
0940: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
0950: 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 49 71              ":Iq
0960: 22 3a 20 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20  ": { ":1s": "", 
0970: 22 3a 32 73 22 3a 20 22 22 2c 20 22 3a 33 73 22  ":2s": "", ":3s"
0980: 3a 20 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c  : "", ":1p": "",
0990: 20 22 3a 32 70 22 3a 20 22 22 2c 20 22 3a 33 70   ":2p": "", ":3p
09a0: 22 3a 20 22 22 20 7d 2c 0a 20 20 20 20 20 20 20  ": "" },.       
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 22 3a 49 73 22 3a 20 7b 20 22 3a 31 73 22 3a   ":Is": { ":1s":
09d0: 20 22 22 2c 20 22 3a 32 73 22 3a 20 22 22 2c 20   "", ":2s": "", 
09e0: 22 3a 33 73 22 3a 20 22 22 2c 20 22 3a 31 70 22  ":3s": "", ":1p"
09f0: 3a 20 22 22 2c 20 22 3a 32 70 22 3a 20 22 22 2c  : "", ":2p": "",
0a00: 20 22 3a 33 70 22 3a 20 22 22 20 7d 2c 0a 20 20   ":3p": "" },.  
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 22 3a 49 66 22 3a 20 7b 20 22        ":If": { "
0a30: 3a 31 73 22 3a 20 22 22 2c 20 22 3a 32 73 22 3a  :1s": "", ":2s":
0a40: 20 22 22 2c 20 22 3a 33 73 22 3a 20 22 22 2c 20   "", ":3s": "", 
0a50: 22 3a 31 70 22 3a 20 22 22 2c 20 22 3a 32 70 22  ":1p": "", ":2p"
0a60: 3a 20 22 22 2c 20 22 3a 33 70 22 3a 20 22 22 20  : "", ":3p": "" 
0a70: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  },.             
0a80: 20 20 20 20 20 20 20 20 20 20 20 22 3a 4b 22 3a             ":K":
0a90: 20 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20 22 3a   { ":1s": "", ":
0aa0: 32 73 22 3a 20 22 22 2c 20 22 3a 33 73 22 3a 20  2s": "", ":3s": 
0ab0: 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20 22  "", ":1p": "", "
0ac0: 3a 32 70 22 3a 20 22 22 2c 20 22 3a 33 70 22 3a  :2p": "", ":3p":
0ad0: 20 22 22 20 7d 2c 0a 20 20 20 20 20 20 20 20 20   "" },.         
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0af0: 3a 53 70 22 3a 20 7b 20 22 3a 31 73 22 3a 20 22  :Sp": { ":1s": "
0b00: 22 2c 20 22 3a 32 73 22 3a 20 22 22 2c 20 22 3a  ", ":2s": "", ":
0b10: 33 73 22 3a 20 22 22 2c 20 22 3a 31 70 22 3a 20  3s": "", ":1p": 
0b20: 22 22 2c 20 22 3a 32 70 22 3a 20 22 22 2c 20 22  "", ":2p": "", "
0b30: 3a 33 70 22 3a 20 22 22 2c 20 22 3a 31 c5 9b 22  :3p": "", ":1.."
0b40: 3a 20 22 22 20 7d 2c 0a 20 20 20 20 20 20 20 20  : "" },.        
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 22 3a 53 71 22 3a 20 7b 20 22 3a 31 73 22 3a 20  ":Sq": { ":1s": 
0b70: 22 22 2c 20 22 3a 32 73 22 3a 20 22 22 2c 20 22  "", ":2s": "", "
0b80: 3a 33 73 22 3a 20 22 22 2c 20 22 3a 31 70 22 3a  :3s": "", ":1p":
0b90: 20 22 22 2c 20 22 3a 32 70 22 3a 20 22 22 2c 20   "", ":2p": "", 
0ba0: 22 3a 33 70 22 3a 20 22 22 2c 20 22 3a 31 c5 9b  ":3p": "", ":1..
0bb0: 22 3a 20 22 22 20 7d 2c 0a 20 20 20 20 20 20 20  ": "" },.       
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 22 3a 45 22 3a 20 7b 20 22 3a 32 73 22 3a 20   ":E": { ":2s": 
0be0: 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20 22  "", ":1p": "", "
0bf0: 3a 32 70 22 3a 20 22 22 20 7d 0a 20 20 20 20 20  :2p": "" }.     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0c20: 73 56 74 79 70 20 6e 6f 74 20 69 6e 20 6c 56 74  sVtyp not in lVt
0c30: 79 70 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  yp:.            
0c40: 20 20 20 20 64 56 74 79 70 5b 73 56 74 79 70 5d      dVtyp[sVtyp]
0c50: 20 3d 20 6e 56 74 79 70 0a 20 20 20 20 20 20 20   = nVtyp.       
0c60: 20 20 20 20 20 20 20 20 20 6c 56 74 79 70 2e 61           lVtyp.a
0c70: 70 70 65 6e 64 28 73 56 74 79 70 29 0a 20 20 20  ppend(sVtyp).   
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 56 74               nVt
0c90: 79 70 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20  yp += 1.        
0ca0: 65 6c 69 66 20 6e 54 61 62 20 3d 3d 20 32 3a 0a  elif nTab == 2:.
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66 6c              # fl
0cc0: 65 78 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  exion.          
0cd0: 20 20 5f 2c 20 73 54 61 67 2c 20 73 46 6c 65 78    _, sTag, sFlex
0ce0: 20 3d 20 73 4c 69 6e 65 2e 73 70 6c 69 74 28 22   = sLine.split("
0cf0: 5c 74 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  \t").           
0d00: 20 69 66 20 73 54 61 67 2e 63 6f 75 6e 74 28 22   if sTag.count("
0d10: 20 22 29 20 3d 3d 20 30 3a 0a 20 20 20 20 20 20   ") == 0:.      
0d20: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 54 61            if sTa
0d30: 67 20 3d 3d 20 22 70 70 72 65 22 3a 0a 20 20 20  g == "ppre":.   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 64 43 6f 6e 6a 5b 22 3a 50 51 22 5d 5b 22 3a   dConj[":PQ"][":
0d60: 50 22 5d 20 3d 20 64 65 66 69 6e 65 53 75 66 66  P"] = defineSuff
0d70: 69 78 43 6f 64 65 28 73 4c 65 6d 6d 61 2c 20 73  ixCode(sLemma, s
0d80: 46 6c 65 78 29 0a 20 20 20 20 20 20 20 20 20 20  Flex).          
0d90: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
0da0: 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20          try:.   
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 6d 6f 64 65 2c 20 67 20 3d 20 73 54 61 67 2e   mode, g = sTag.
0dd0: 73 70 6c 69 74 28 6d 61 78 73 70 6c 69 74 3d 31  split(maxsplit=1
0de0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0df0: 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 64 54 72        mode = dTr
0e00: 61 64 5b 6d 6f 64 65 5d 0a 20 20 20 20 20 20 20  ad[mode].       
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 20 3d               g =
0e20: 20 64 54 72 61 64 5b 67 5d 0a 20 20 20 20 20 20   dTrad[g].      
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0e40: 20 64 43 6f 6e 6a 5b 6d 6f 64 65 5d 5b 67 5d 20   dConj[mode][g] 
0e50: 3d 3d 20 22 22 3a 0a 20 20 20 20 20 20 20 20 20  == "":.         
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0e70: 43 6f 6e 6a 5b 6d 6f 64 65 5d 5b 67 5d 20 3d 20  Conj[mode][g] = 
0e80: 64 65 66 69 6e 65 53 75 66 66 69 78 43 6f 64 65  defineSuffixCode
0e90: 28 73 4c 65 6d 6d 61 2c 20 73 46 6c 65 78 29 0a  (sLemma, sFlex).
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 23 20 63 6f 6d 6d 65 6e 74 20 67 c3 a9 72    # comment g..r
0ee0: 65 72 20 6c 65 73 20 61 75 74 72 65 73 20 67 72  er les autres gr
0ef0: 61 70 68 69 65 73 20 3f 0a 20 20 20 20 20 20 20  aphies ?.       
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 20 20   pass.          
0f20: 20 20 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20        except:.  
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 70 72 69 6e 74 28 73 4c 65 6d 6d 61 2e 65    print(sLemma.e
0f50: 6e 63 6f 64 65 28 22 75 74 66 2d 38 22 29 2e 64  ncode("utf-8").d
0f60: 65 63 6f 64 65 28 22 61 73 63 69 69 22 29 2c 20  ecode("ascii"), 
0f70: 22 20 2d 20 22 2c 20 73 54 61 67 2c 20 22 20 2d  " - ", sTag, " -
0f80: 20 6e 6f 6e 20 67 c3 a9 72 c3 a9 3a 20 22 2c 20   non g..r..: ", 
0f90: 6d 6f 64 65 2c 20 22 20 2f 20 22 2c 20 67 29 0a  mode, " / ", g).
0fa0: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69          elif sLi
0fb0: 6e 65 20 3d 3d 20 22 24 22 3a 0a 20 20 20 20 20  ne == "$":.     
0fc0: 20 20 20 20 20 20 20 23 20 77 65 20 73 74 6f 72         # we stor
0fd0: 65 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79  e the dictionary
0fe0: 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20 74 68   of rules for th
0ff0: 69 73 20 6c 65 6d 6d 61 0a 20 20 20 20 20 20 20  is lemma.       
1000: 20 20 20 20 20 69 66 20 64 43 6f 6e 6a 5b 22 3a       if dConj[":
1010: 49 70 22 5d 5b 22 3a 31 c5 9b 22 5d 20 3d 3d 20  Ip"][":1.."] == 
1020: 22 32 c3 a8 22 3a 0a 20 20 20 20 20 20 20 20 20  "2..":.         
1030: 20 20 20 20 20 20 20 64 43 6f 6e 6a 5b 22 3a 49         dConj[":I
1040: 70 22 5d 5b 22 3a 31 c5 9b 22 5d 20 3d 20 22 32  p"][":1.."] = "2
1050: c3 a9 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ..".            
1060: 65 6c 69 66 20 73 4c 65 6d 6d 61 20 3d 3d 20 22  elif sLemma == "
1070: 70 6f 75 76 6f 69 72 22 3a 0a 20 20 20 20 20 20  pouvoir":.      
1080: 20 20 20 20 20 20 20 20 20 20 64 43 6f 6e 6a 5b            dConj[
1090: 22 3a 49 70 22 5d 5b 22 3a 31 c5 9b 22 5d 20 3d  ":Ip"][":1.."] =
10a0: 20 22 36 75 69 73 22 0a 20 20 20 20 20 20 20 20   "6uis".        
10b0: 20 20 20 20 6c 43 6f 6e 6a 54 61 67 73 20 3d 20      lConjTags = 
10c0: 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  [].            f
10d0: 6f 72 20 6b 65 79 20 69 6e 20 5b 22 3a 50 51 22  or key in [":PQ"
10e0: 2c 20 22 3a 49 70 22 2c 20 22 3a 49 71 22 2c 20  , ":Ip", ":Iq", 
10f0: 22 3a 49 73 22 2c 20 22 3a 49 66 22 2c 20 22 3a  ":Is", ":If", ":
1100: 4b 22 2c 20 22 3a 53 70 22 2c 20 22 3a 53 71 22  K", ":Sp", ":Sq"
1110: 2c 20 22 3a 45 22 5d 3a 0a 20 20 20 20 20 20 20  , ":E"]:.       
1120: 20 20 20 20 20 20 20 20 20 62 46 6f 75 6e 64 20           bFound 
1130: 3d 20 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20  = False.        
1140: 20 20 20 20 20 20 20 20 66 6f 72 20 69 2c 20 64          for i, d
1150: 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 64 50   in enumerate(dP
1160: 61 74 74 65 72 6e 4c 69 73 74 5b 6b 65 79 5d 29  atternList[key])
1170: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1180: 20 20 20 20 20 20 69 66 20 64 43 6f 6e 6a 5b 6b        if dConj[k
1190: 65 79 5d 20 3d 3d 20 64 3a 0a 20 20 20 20 20 20  ey] == d:.      
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 20 62 46 6f 75 6e 64 20 3d 20 54 72 75 65 0a    bFound = True.
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 20 20 20 20 20 6c 43 6f 6e 6a 54 61 67          lConjTag
11e0: 73 2e 61 70 70 65 6e 64 28 69 29 0a 20 20 20 20  s.append(i).    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20 20 20      break.      
1210: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
1220: 20 62 46 6f 75 6e 64 3a 0a 20 20 20 20 20 20 20   bFound:.       
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 43 6f               lCo
1240: 6e 6a 54 61 67 73 2e 61 70 70 65 6e 64 28 6c 65  njTags.append(le
1250: 6e 28 64 50 61 74 74 65 72 6e 4c 69 73 74 5b 6b  n(dPatternList[k
1260: 65 79 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  ey])).          
1270: 20 20 20 20 20 20 20 20 20 20 64 50 61 74 74 65            dPatte
1280: 72 6e 4c 69 73 74 5b 6b 65 79 5d 2e 61 70 70 65  rnList[key].appe
1290: 6e 64 28 64 43 6f 6e 6a 5b 6b 65 79 5d 29 0a 20  nd(dConj[key]). 
12a0: 20 20 20 20 20 20 20 20 20 20 20 74 43 6f 6e 6a             tConj
12b0: 54 61 67 73 20 3d 20 74 75 70 6c 65 28 6c 43 6f  Tags = tuple(lCo
12c0: 6e 6a 54 61 67 73 29 0a 20 20 20 20 20 20 20 20  njTags).        
12d0: 20 20 20 20 69 66 20 74 43 6f 6e 6a 54 61 67 73      if tConjTags
12e0: 20 6e 6f 74 20 69 6e 20 6c 54 61 67 73 3a 0a 20   not in lTags:. 
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1300: 54 61 67 73 5b 74 43 6f 6e 6a 54 61 67 73 5d 20  Tags[tConjTags] 
1310: 3d 20 6e 54 61 67 73 0a 20 20 20 20 20 20 20 20  = nTags.        
1320: 20 20 20 20 20 20 20 20 6c 54 61 67 73 2e 61 70          lTags.ap
1330: 70 65 6e 64 28 74 43 6f 6e 6a 54 61 67 73 29 0a  pend(tConjTags).
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 6e 54 61 67 73 20 2b 3d 20 31 0a 20 20 20 20 20  nTags += 1.     
1360: 20 20 20 20 20 20 20 64 56 65 72 62 5b 73 4c 65         dVerb[sLe
1370: 6d 6d 61 5d 20 3d 20 28 64 56 74 79 70 5b 73 56  mma] = (dVtyp[sV
1380: 74 79 70 5d 2c 20 64 54 61 67 73 5b 74 43 6f 6e  typ], dTags[tCon
1390: 6a 54 61 67 73 5d 29 0a 20 20 20 20 20 20 20 20  jTags]).        
13a0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
13b0: 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72    print("# Error
13c0: 20 2d 20 75 6e 6b 6e 6f 77 6e 20 6c 69 6e 65 20   - unknown line 
13d0: 23 22 2c 20 6e 29 0a 0a 20 20 20 20 23 20 63 6f  #", n)..    # co
13e0: 6e 76 65 72 74 20 74 75 70 6c 65 73 20 74 6f 20  nvert tuples to 
13f0: 62 79 74 65 73 20 73 74 72 69 6e 67 0a 20 20 20  bytes string.   
1400: 20 23 20 73 69 20 c3 a7 61 20 6d 65 72 64 65 2c   # si ..a merde,
1410: 20 74 6f 75 74 65 20 6c 61 20 70 61 72 74 69 65   toute la partie
1420: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 70 65 75 74   conversion peut
1430: 20 c3 aa 74 72 65 20 73 75 70 70 72 69 6d c3 a9   ..tre supprim..
1440: 65 0a 20 20 20 20 23 20 6c 42 79 74 65 73 54 61  e.    # lBytesTa
1450: 67 73 20 3d 20 5b 5d 0a 20 20 20 20 23 20 66 6f  gs = [].    # fo
1460: 72 20 74 20 69 6e 20 6c 54 61 67 73 3a 0a 20 20  r t in lTags:.  
1470: 20 20 23 20 20 20 20 20 62 20 3d 20 62 22 22 0a    #     b = b"".
1480: 20 20 20 20 23 20 20 20 20 20 66 6f 72 20 6e 20      #     for n 
1490: 69 6e 20 74 3a 0a 20 20 20 20 23 20 20 20 20 20  in t:.    #     
14a0: 20 20 20 20 69 66 20 6e 20 3e 20 32 35 35 3a 0a      if n > 255:.
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 20      #           
14c0: 20 20 70 72 69 6e 74 28 22 45 72 72 65 75 72 20    print("Erreur 
14d0: 3a 20 6c 27 69 6e 64 69 63 65 20 6e 65 20 70 65  : l'indice ne pe
14e0: 75 74 20 c3 aa 74 72 65 20 73 75 70 c3 a9 72 69  ut ..tre sup..ri
14f0: 65 75 72 20 c3 a0 20 32 35 36 20 70 6f 75 72 20  eur .. 256 pour 
1500: 75 74 69 6c 69 73 65 72 20 64 65 73 20 63 68 61  utiliser des cha
1510: c3 ae 6e 65 73 20 64 27 6f 63 74 65 74 73 20 28  ..nes d'octets (
1520: 62 79 74 65 73 20 73 74 72 69 6e 67 73 29 22 29  bytes strings)")
1530: 0a 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20  .    #          
1540: 20 20 20 65 78 69 74 28 29 0a 20 20 20 20 23 20     exit().    # 
1550: 20 20 20 20 20 20 20 20 62 20 2b 3d 20 6e 2e 74          b += n.t
1560: 6f 5f 62 79 74 65 73 28 31 2c 20 62 79 74 65 6f  o_bytes(1, byteo
1570: 72 64 65 72 3d 22 62 69 67 22 29 0a 20 20 20 20  rder="big").    
1580: 23 20 20 20 20 20 6c 42 79 74 65 73 54 61 67 73  #     lBytesTags
1590: 2e 61 70 70 65 6e 64 28 62 29 0a 20 20 20 20 23  .append(b).    #
15a0: 20 6c 54 61 67 73 20 3d 20 6c 42 79 74 65 73 54   lTags = lBytesT
15b0: 61 67 73 0a 0a 20 20 20 20 23 20 66 6f 72 20 6b  ags..    # for k
15c0: 65 79 20 69 6e 20 64 56 65 72 62 2e 6b 65 79 73  ey in dVerb.keys
15d0: 28 29 3a 0a 20 20 20 20 23 20 20 20 20 20 62 20  ():.    #     b 
15e0: 3d 20 62 22 22 0a 20 20 20 20 23 20 20 20 20 20  = b"".    #     
15f0: 66 6f 72 20 6e 20 69 6e 20 64 56 65 72 62 5b 6b  for n in dVerb[k
1600: 65 79 5d 3a 0a 20 20 20 20 23 20 20 20 20 20 20  ey]:.    #      
1610: 20 20 20 69 66 20 6e 20 3e 20 32 35 35 3a 0a 20     if n > 255:. 
1620: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20     #            
1630: 20 70 72 69 6e 74 28 22 45 72 72 65 75 72 20 3a   print("Erreur :
1640: 20 6c 27 69 6e 64 69 63 65 20 6e 65 20 70 65 75   l'indice ne peu
1650: 74 20 c3 aa 74 72 65 20 73 75 70 c3 a9 72 69 65  t ..tre sup..rie
1660: 75 72 20 c3 a0 20 32 35 36 20 70 6f 75 72 20 75  ur .. 256 pour u
1670: 74 69 6c 69 73 65 72 20 64 65 73 20 63 68 61 c3  tiliser des cha.
1680: ae 6e 65 73 20 64 27 6f 63 74 65 74 73 20 28 62  .nes d'octets (b
1690: 79 74 65 73 20 73 74 72 69 6e 67 73 29 22 29 0a  ytes strings)").
16a0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 20      #           
16b0: 20 20 65 78 69 74 28 29 0a 20 20 20 20 23 20 20    exit().    #  
16c0: 20 20 20 20 20 20 20 62 20 2b 3d 20 6e 2e 74 6f         b += n.to
16d0: 5f 62 79 74 65 73 28 31 2c 20 62 79 74 65 6f 72  _bytes(1, byteor
16e0: 64 65 72 3d 22 62 69 67 22 29 0a 20 20 20 20 23  der="big").    #
16f0: 20 20 20 20 20 64 56 65 72 62 5b 6b 65 79 5d 20       dVerb[key] 
1700: 3d 20 62 0a 20 20 20 20 23 20 65 6e 64 20 63 6f  = b.    # end co
1710: 6e 76 65 72 73 69 6f 6e 0a 0a 0a 20 20 20 20 23  nversion...    #
1720: 23 20 77 72 69 74 65 20 66 69 6c 65 20 66 6f 72  # write file for
1730: 20 50 79 74 68 6f 6e 0a 20 20 20 20 73 43 6f 64   Python.    sCod
1740: 65 20 3d 20 22 23 23 20 67 65 6e 65 72 61 74 65  e = "## generate
1750: 64 20 64 61 74 61 20 28 64 6f 20 6e 6f 74 20 65  d data (do not e
1760: 64 69 74 29 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20  dit)\n\n" + \.  
1770: 20 20 20 20 20 20 20 20 20 20 22 23 20 49 6e 66            "# Inf
1780: 6f 72 6d 61 74 69 6f 6e 73 20 61 62 6f 75 74 20  ormations about 
1790: 76 65 72 62 73 5c 6e 22 20 2b 20 5c 0a 20 20 20  verbs\n" + \.   
17a0: 20 20 20 20 20 20 20 20 20 22 6c 56 74 79 70 20           "lVtyp 
17b0: 3d 20 22 20 2b 20 73 74 72 28 6c 56 74 79 70 29  = " + str(lVtyp)
17c0: 20 2b 20 22 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20   + "\n\n" + \.  
17d0: 20 20 20 20 20 20 20 20 20 20 22 23 20 69 6e 64            "# ind
17e0: 65 78 65 73 20 6f 66 20 74 65 6e 73 65 73 20 69  exes of tenses i
17f0: 6e 20 5f 64 50 61 74 74 65 72 6e 43 6f 6e 6a 5c  n _dPatternConj\
1800: 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20  n" + \.         
1810: 20 20 20 22 6c 54 61 67 73 20 3d 20 22 20 2b 20     "lTags = " + 
1820: 73 74 72 28 6c 54 61 67 73 29 20 2b 20 22 5c 6e  str(lTags) + "\n
1830: 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  \n" + \.        
1840: 20 20 20 20 22 23 20 6c 69 73 74 73 20 6f 66 20      "# lists of 
1850: 61 66 66 69 78 20 63 6f 64 65 73 20 74 6f 20 67  affix codes to g
1860: 65 6e 65 72 61 74 65 20 69 6e 66 6c 65 63 74 65  enerate inflecte
1870: 64 20 66 6f 72 6d 73 5c 6e 22 20 2b 20 5c 0a 20  d forms\n" + \. 
1880: 20 20 20 20 20 20 20 20 20 20 20 22 64 50 61 74             "dPat
1890: 74 65 72 6e 43 6f 6e 6a 20 3d 20 22 20 2b 20 73  ternConj = " + s
18a0: 74 72 28 64 50 61 74 74 65 72 6e 4c 69 73 74 29  tr(dPatternList)
18b0: 20 2b 20 22 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20   + "\n\n" + \.  
18c0: 20 20 20 20 20 20 20 20 20 20 22 23 20 64 69 63            "# dic
18d0: 74 69 6f 6e 61 72 79 20 6f 66 20 76 65 72 62 73  tionary of verbs
18e0: 20 3a 20 28 69 6e 64 65 78 20 6f 66 20 56 74 79   : (index of Vty
18f0: 70 2c 20 69 6e 64 65 78 20 6f 66 20 54 61 67 73  p, index of Tags
1900: 29 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20  )\n" + \.       
1910: 20 20 20 20 20 22 64 56 65 72 62 20 3d 20 22 20       "dVerb = " 
1920: 2b 20 73 74 72 28 64 56 65 72 62 29 20 2b 20 22  + str(dVerb) + "
1930: 5c 6e 22 0a 20 20 20 20 6f 70 65 6e 28 73 70 2b  \n".    open(sp+
1940: 22 2f 6d 6f 64 75 6c 65 73 2f 63 6f 6e 6a 5f 64  "/modules/conj_d
1950: 61 74 61 2e 70 79 22 2c 20 22 77 22 2c 20 65 6e  ata.py", "w", en
1960: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20  coding="utf-8", 
1970: 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77 72  newline="\n").wr
1980: 69 74 65 28 73 43 6f 64 65 29 0a 0a 20 20 20 20  ite(sCode)..    
1990: 69 66 20 62 4a 53 3a 0a 20 20 20 20 20 20 20 20  if bJS:.        
19a0: 23 23 20 77 72 69 74 65 20 66 69 6c 65 20 66 6f  ## write file fo
19b0: 72 20 4a 61 76 61 53 63 72 69 70 74 0a 20 20 20  r JavaScript.   
19c0: 20 20 20 20 20 77 69 74 68 20 6f 70 65 6e 28 73       with open(s
19d0: 70 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 2f 63  p+"/modules-js/c
19e0: 6f 6e 6a 5f 64 61 74 61 2e 6a 73 6f 6e 22 2c 20  onj_data.json", 
19f0: 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "w", encoding="u
1a00: 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22  tf-8", newline="
1a10: 5c 6e 22 29 20 61 73 20 68 44 73 74 3a 0a 20 20  \n") as hDst:.  
1a20: 20 20 20 20 20 20 20 20 20 20 68 44 73 74 2e 77            hDst.w
1a30: 72 69 74 65 28 22 7b 5c 6e 22 29 0a 20 20 20 20  rite("{\n").    
1a40: 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69          hDst.wri
1a50: 74 65 28 27 20 20 20 20 22 6c 56 74 79 70 22 3a  te('    "lVtyp":
1a60: 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73 28   ' + json.dumps(
1a70: 6c 56 74 79 70 2c 20 65 6e 73 75 72 65 5f 61 73  lVtyp, ensure_as
1a80: 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22 2c 5c  cii=False) + ",\
1a90: 6e 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n").            
1aa0: 68 44 73 74 2e 77 72 69 74 65 28 27 20 20 20 20  hDst.write('    
1ab0: 22 6c 54 61 67 73 22 3a 20 27 20 2b 20 6a 73 6f  "lTags": ' + jso
1ac0: 6e 2e 64 75 6d 70 73 28 6c 54 61 67 73 2c 20 65  n.dumps(lTags, e
1ad0: 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73  nsure_ascii=Fals
1ae0: 65 29 20 2b 20 22 2c 5c 6e 22 29 0a 20 20 20 20  e) + ",\n").    
1af0: 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69          hDst.wri
1b00: 74 65 28 27 20 20 20 20 22 64 50 61 74 74 65 72  te('    "dPatter
1b10: 6e 43 6f 6e 6a 22 3a 20 27 20 2b 20 6a 73 6f 6e  nConj": ' + json
1b20: 2e 64 75 6d 70 73 28 64 50 61 74 74 65 72 6e 4c  .dumps(dPatternL
1b30: 69 73 74 2c 20 65 6e 73 75 72 65 5f 61 73 63 69  ist, ensure_asci
1b40: 69 3d 46 61 6c 73 65 29 20 2b 20 22 2c 5c 6e 22  i=False) + ",\n"
1b50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 44  ).            hD
1b60: 73 74 2e 77 72 69 74 65 28 27 20 20 20 20 22 64  st.write('    "d
1b70: 56 65 72 62 22 3a 20 27 20 2b 20 6a 73 6f 6e 2e  Verb": ' + json.
1b80: 64 75 6d 70 73 28 64 56 65 72 62 2c 20 65 6e 73  dumps(dVerb, ens
1b90: 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29  ure_ascii=False)
1ba0: 20 2b 20 22 5c 6e 22 29 0a 20 20 20 20 20 20 20   + "\n").       
1bb0: 20 20 20 20 20 68 44 73 74 2e 77 72 69 74 65 28       hDst.write(
1bc0: 22 7d 5c 6e 22 29 0a 0a 0a 64 65 66 20 6d 61 6b  "}\n")...def mak
1bd0: 65 4d 66 73 70 20 28 73 70 2c 20 62 4a 53 3d 46  eMfsp (sp, bJS=F
1be0: 61 6c 73 65 29 3a 0a 20 20 20 20 70 72 69 6e 74  alse):.    print
1bf0: 28 22 3e 20 50 6c 75 72 69 65 6c 2f 73 69 6e 67  ("> Pluriel/sing
1c00: 75 6c 69 65 72 2f 6d 61 73 63 75 6c 69 6e 2f 66  ulier/masculin/f
1c10: c3 a9 6d 69 6e 69 6e 20 22 2c 20 65 6e 64 3d 22  ..minin ", end="
1c20: 22 29 0a 20 20 20 20 70 72 69 6e 74 28 22 28 50  ").    print("(P
1c30: 79 74 68 6f 6e 20 65 74 20 4a 61 76 61 53 63 72  ython et JavaScr
1c40: 69 70 74 29 22 20 20 69 66 20 62 4a 53 20 20 65  ipt)"  if bJS  e
1c50: 6c 73 65 20 22 28 50 79 74 68 6f 6e 20 73 65 75  lse "(Python seu
1c60: 6c 65 6d 65 6e 74 29 22 29 0a 20 20 20 20 61 50  lement)").    aP
1c70: 6c 75 72 53 20 3d 20 73 65 74 28 29 0a 20 20 20  lurS = set().   
1c80: 20 64 54 61 67 20 3d 20 7b 7d 0a 20 20 20 20 6c   dTag = {}.    l
1c90: 54 61 67 4d 61 73 46 6f 72 6d 20 3d 20 5b 5d 0a  TagMasForm = [].
1ca0: 20 20 20 20 6c 54 61 67 4d 69 73 63 50 6c 75 72      lTagMiscPlur
1cb0: 20 3d 20 5b 5d 0a 20 20 20 20 64 4d 69 73 63 50   = [].    dMiscP
1cc0: 6c 75 72 20 3d 20 7b 7d 0a 20 20 20 20 64 4d 61  lur = {}.    dMa
1cd0: 73 46 6f 72 6d 20 3d 20 7b 7d 0a 20 20 20 20 6c  sForm = {}.    l
1ce0: 54 61 67 20 3d 20 5b 5d 0a 20 20 20 20 6c 54 61  Tag = [].    lTa
1cf0: 67 4d 61 73 50 6c 20 3d 20 5b 5d 0a 20 20 20 20  gMasPl = [].    
1d00: 66 6f 72 20 6e 2c 20 73 4c 69 6e 65 20 69 6e 20  for n, sLine in 
1d10: 65 6e 75 6d 65 72 61 74 65 28 72 65 61 64 46 69  enumerate(readFi
1d20: 6c 65 28 73 70 2b 22 2f 64 61 74 61 2f 64 69 63  le(sp+"/data/dic
1d30: 74 44 65 63 6c 2e 74 78 74 22 29 29 3a 0a 20 20  tDecl.txt")):.  
1d40: 20 20 20 20 20 20 6e 54 61 62 20 3d 20 73 4c 69        nTab = sLi
1d50: 6e 65 2e 63 6f 75 6e 74 28 22 5c 74 22 29 0a 20  ne.count("\t"). 
1d60: 20 20 20 20 20 20 20 69 66 20 6e 54 61 62 20 3d         if nTab =
1d70: 3d 20 31 3a 0a 20 20 20 20 20 20 20 20 20 20 20  = 1:.           
1d80: 20 23 20 6e 65 77 20 65 6e 74 72 79 0a 20 20 20   # new entry.   
1d90: 20 20 20 20 20 20 20 20 20 6c 54 61 67 2e 63 6c           lTag.cl
1da0: 65 61 72 28 29 0a 20 20 20 20 20 20 20 20 20 20  ear().          
1db0: 20 20 6c 54 61 67 4d 61 73 50 6c 2e 63 6c 65 61    lTagMasPl.clea
1dc0: 72 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r().            
1dd0: 73 4c 65 6d 6d 61 2c 20 73 46 6c 61 67 73 20 3d  sLemma, sFlags =
1de0: 20 73 4c 69 6e 65 2e 73 70 6c 69 74 28 22 5c 74   sLine.split("\t
1df0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ").            i
1e00: 66 20 73 46 6c 61 67 73 2e 73 74 61 72 74 73 77  f sFlags.startsw
1e10: 69 74 68 28 22 53 22 29 3a 0a 20 20 20 20 20 20  ith("S"):.      
1e20: 20 20 20 20 20 20 20 20 20 20 63 54 79 70 65 20            cType 
1e30: 3d 20 22 73 22 0a 20 20 20 20 20 20 20 20 20 20  = "s".          
1e40: 20 20 65 6c 69 66 20 73 46 6c 61 67 73 2e 73 74    elif sFlags.st
1e50: 61 72 74 73 77 69 74 68 28 22 58 22 29 3a 0a 20  artswith("X"):. 
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1e70: 54 79 70 65 20 3d 20 22 70 22 0a 20 20 20 20 20  Type = "p".     
1e80: 20 20 20 20 20 20 20 65 6c 69 66 20 73 46 6c 61         elif sFla
1e90: 67 73 2e 73 74 61 72 74 73 77 69 74 68 28 22 41  gs.startswith("A
1ea0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
1eb0: 20 20 20 20 63 54 79 70 65 20 3d 20 22 70 22 0a      cType = "p".
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66              elif
1ed0: 20 73 46 6c 61 67 73 2e 73 74 61 72 74 73 77 69   sFlags.startswi
1ee0: 74 68 28 22 49 22 29 3a 0a 20 20 20 20 20 20 20  th("I"):.       
1ef0: 20 20 20 20 20 20 20 20 20 63 54 79 70 65 20 3d           cType =
1f00: 20 22 70 22 0a 20 20 20 20 20 20 20 20 20 20 20   "p".           
1f10: 20 65 6c 69 66 20 73 46 6c 61 67 73 2e 73 74 61   elif sFlags.sta
1f20: 72 74 73 77 69 74 68 28 22 46 22 29 3a 0a 20 20  rtswith("F"):.  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 54                cT
1f40: 79 70 65 20 3d 20 22 6d 22 0a 20 20 20 20 20 20  ype = "m".      
1f50: 20 20 20 20 20 20 65 6c 69 66 20 73 46 6c 61 67        elif sFlag
1f60: 73 2e 73 74 61 72 74 73 77 69 74 68 28 22 57 22  s.startswith("W"
1f70: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
1f80: 20 20 20 63 54 79 70 65 20 3d 20 22 6d 22 0a 20     cType = "m". 
1f90: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
1fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fb0: 20 63 54 79 70 65 20 3d 20 22 3f 22 0a 20 20 20   cType = "?".   
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
1fd0: 6e 74 28 22 20 3e 20 69 6e 63 6f 6e 6e 75 20 3a  nt(" > inconnu :
1fe0: 20 22 20 2b 20 73 46 6c 61 67 73 29 0a 20 20 20   " + sFlags).   
1ff0: 20 20 20 20 20 65 6c 69 66 20 6e 54 61 62 20 3d       elif nTab =
2000: 3d 20 32 3a 0a 20 20 20 20 20 20 20 20 20 20 20  = 2:.           
2010: 20 69 66 20 63 54 79 70 65 20 3d 3d 20 22 73 22   if cType == "s"
2020: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2030: 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20    continue.     
2040: 20 20 20 20 20 20 20 5f 2c 20 73 46 6c 65 78 54         _, sFlexT
2050: 61 67 73 2c 20 73 46 6c 65 78 20 3d 20 73 4c 69  ags, sFlex = sLi
2060: 6e 65 2e 73 70 6c 69 74 28 22 5c 74 22 29 0a 20  ne.split("\t"). 
2070: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63 54             if cT
2080: 79 70 65 20 3d 3d 20 22 70 22 3a 0a 20 20 20 20  ype == "p":.    
2090: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
20a0: 46 6c 65 78 54 61 67 73 2e 65 6e 64 73 77 69 74  FlexTags.endswit
20b0: 68 28 22 70 6c 22 29 3a 0a 20 20 20 20 20 20 20  h("pl"):.       
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 61               lTa
20d0: 67 2e 61 70 70 65 6e 64 28 64 65 66 69 6e 65 53  g.append(defineS
20e0: 75 66 66 69 78 43 6f 64 65 28 73 4c 65 6d 6d 61  uffixCode(sLemma
20f0: 2c 20 73 46 6c 65 78 29 29 0a 20 20 20 20 20 20  , sFlex)).      
2100: 20 20 20 20 20 20 65 6c 69 66 20 63 54 79 70 65        elif cType
2110: 20 3d 3d 20 22 6d 22 3a 0a 20 20 20 20 20 20 20   == "m":.       
2120: 20 20 20 20 20 20 20 20 20 69 66 20 73 46 6c 65           if sFle
2130: 78 54 61 67 73 2e 65 6e 64 73 77 69 74 68 28 22  xTags.endswith("
2140: 6d 61 73 20 73 67 22 29 20 6f 72 20 73 46 6c 65  mas sg") or sFle
2150: 78 54 61 67 73 2e 65 6e 64 73 77 69 74 68 28 22  xTags.endswith("
2160: 6d 61 73 20 69 6e 76 22 29 3a 0a 20 20 20 20 20  mas inv"):.     
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
2180: 54 61 67 2e 61 70 70 65 6e 64 28 64 65 66 69 6e  Tag.append(defin
2190: 65 53 75 66 66 69 78 43 6f 64 65 28 73 4c 65 6d  eSuffixCode(sLem
21a0: 6d 61 2c 20 73 46 6c 65 78 29 29 0a 20 20 20 20  ma, sFlex)).    
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
21c0: 46 6c 65 78 54 61 67 73 2e 65 6e 64 73 77 69 74  FlexTags.endswit
21d0: 68 28 22 6d 61 73 20 70 6c 22 29 3a 0a 20 20 20  h("mas pl"):.   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 6c 54 61 67 4d 61 73 50 6c 2e 61 70 70 65 6e   lTagMasPl.appen
2200: 64 28 64 65 66 69 6e 65 53 75 66 66 69 78 43 6f  d(defineSuffixCo
2210: 64 65 28 73 4c 65 6d 6d 61 2c 20 73 46 6c 65 78  de(sLemma, sFlex
2220: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  )).            e
2230: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
2240: 20 20 20 20 20 70 72 69 6e 74 28 22 65 72 72 65       print("erre
2250: 75 72 3a 20 22 20 2b 20 63 54 79 70 65 29 0a 20  ur: " + cType). 
2260: 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e         elif sLin
2270: 65 20 3d 3d 20 22 24 22 3a 0a 20 20 20 20 20 20  e == "$":.      
2280: 20 20 20 20 20 20 69 66 20 63 54 79 70 65 20 3d        if cType =
2290: 3d 20 22 73 22 3a 0a 20 20 20 20 20 20 20 20 20  = "s":.         
22a0: 20 20 20 20 20 20 20 61 50 6c 75 72 53 2e 61 64         aPlurS.ad
22b0: 64 28 73 4c 65 6d 6d 61 29 0a 20 20 20 20 20 20  d(sLemma).      
22c0: 20 20 20 20 20 20 65 6c 69 66 20 63 54 79 70 65        elif cType
22d0: 20 3d 3d 20 22 70 22 3a 0a 20 20 20 20 20 20 20   == "p":.       
22e0: 20 20 20 20 20 20 20 20 20 73 54 61 67 20 3d 20           sTag = 
22f0: 22 7c 22 2e 6a 6f 69 6e 28 6c 54 61 67 29 0a 20  "|".join(lTag). 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2310: 66 20 73 54 61 67 20 6e 6f 74 20 69 6e 20 64 54  f sTag not in dT
2320: 61 67 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag:.            
2330: 20 20 20 20 20 20 20 20 64 54 61 67 5b 73 54 61          dTag[sTa
2340: 67 5d 20 3d 20 6c 65 6e 28 6c 54 61 67 4d 69 73  g] = len(lTagMis
2350: 63 50 6c 75 72 29 0a 20 20 20 20 20 20 20 20 20  cPlur).         
2360: 20 20 20 20 20 20 20 20 20 20 20 6c 54 61 67 4d             lTagM
2370: 69 73 63 50 6c 75 72 2e 61 70 70 65 6e 64 28 73  iscPlur.append(s
2380: 54 61 67 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tag).           
2390: 20 20 20 20 20 64 4d 69 73 63 50 6c 75 72 5b 73       dMiscPlur[s
23a0: 4c 65 6d 6d 61 5d 20 3d 20 64 54 61 67 5b 73 54  Lemma] = dTag[sT
23b0: 61 67 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag].            
23c0: 65 6c 69 66 20 63 54 79 70 65 20 3d 3d 20 22 6d  elif cType == "m
23d0: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
23e0: 20 20 20 73 54 61 67 20 3d 20 22 7c 22 2e 6a 6f     sTag = "|".jo
23f0: 69 6e 28 6c 54 61 67 29 0a 20 20 20 20 20 20 20  in(lTag).       
2400: 20 20 20 20 20 20 20 20 20 69 66 20 6c 54 61 67           if lTag
2410: 4d 61 73 50 6c 3a 0a 20 20 20 20 20 20 20 20 20  MasPl:.         
2420: 20 20 20 20 20 20 20 20 20 20 20 73 54 61 67 20             sTag 
2430: 2b 3d 20 22 2f 22 20 2b 20 22 7c 22 2e 6a 6f 69  += "/" + "|".joi
2440: 6e 28 6c 54 61 67 4d 61 73 50 6c 29 0a 20 20 20  n(lTagMasPl).   
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2460: 73 54 61 67 20 6e 6f 74 20 69 6e 20 64 54 61 67  sTag not in dTag
2470: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2480: 20 20 20 20 20 20 64 54 61 67 5b 73 54 61 67 5d        dTag[sTag]
2490: 20 3d 20 6c 65 6e 28 6c 54 61 67 4d 61 73 46 6f   = len(lTagMasFo
24a0: 72 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm).            
24b0: 20 20 20 20 20 20 20 20 6c 54 61 67 4d 61 73 46          lTagMasF
24c0: 6f 72 6d 2e 61 70 70 65 6e 64 28 73 54 61 67 29  orm.append(sTag)
24d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24e0: 20 64 4d 61 73 46 6f 72 6d 5b 73 4c 65 6d 6d 61   dMasForm[sLemma
24f0: 5d 20 3d 20 64 54 61 67 5b 73 54 61 67 5d 0a 20  ] = dTag[sTag]. 
2500: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
2510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2520: 20 70 72 69 6e 74 28 22 75 6e 6b 6e 6f 77 6e 20   print("unknown 
2530: 74 61 67 3a 20 22 20 2b 20 63 74 79 70 65 29 0a  tag: " + ctype).
2540: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
2550: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
2560: 22 23 20 45 72 72 6f 72 20 2d 20 75 6e 6b 6e 6f  "# Error - unkno
2570: 77 6e 20 6c 69 6e 65 20 23 22 2c 20 6e 29 0a 0a  wn line #", n)..
2580: 20 20 20 20 23 23 20 77 72 69 74 65 20 66 69 6c      ## write fil
2590: 65 20 66 6f 72 20 50 79 74 68 6f 6e 0a 20 20 20  e for Python.   
25a0: 20 73 43 6f 64 65 20 3d 20 22 23 20 67 65 6e 65   sCode = "# gene
25b0: 72 61 74 65 64 20 64 61 74 61 20 28 64 6f 20 6e  rated data (do n
25c0: 6f 74 20 65 64 69 74 29 5c 6e 5c 6e 22 20 2b 20  ot edit)\n\n" + 
25d0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 23  \.            "#
25e0: 20 6c 69 73 74 20 6f 66 20 61 66 66 69 78 20 63   list of affix c
25f0: 6f 64 65 73 5c 6e 22 20 2b 20 5c 0a 20 20 20 20  odes\n" + \.    
2600: 20 20 20 20 20 20 20 20 22 6c 54 61 67 4d 69 73          "lTagMis
2610: 63 50 6c 75 72 20 3d 20 22 20 2b 20 73 74 72 28  cPlur = " + str(
2620: 6c 54 61 67 4d 69 73 63 50 6c 75 72 29 20 2b 20  lTagMiscPlur) + 
2630: 22 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20  "\n" + \.       
2640: 20 20 20 20 20 22 6c 54 61 67 4d 61 73 46 6f 72       "lTagMasFor
2650: 6d 20 3d 20 22 20 2b 20 73 74 72 28 6c 54 61 67  m = " + str(lTag
2660: 4d 61 73 46 6f 72 6d 29 20 2b 20 22 5c 6e 5c 6e  MasForm) + "\n\n
2670: 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  " + \.          
2680: 20 20 22 23 20 64 69 63 74 69 6f 6e 61 72 79 20    "# dictionary 
2690: 6f 66 20 77 6f 72 64 73 20 77 69 74 68 20 75 6e  of words with un
26a0: 63 6f 6d 6d 6f 6e 20 70 6c 75 72 61 6c 73 20 28  common plurals (
26b0: 2d 78 2c 20 2d 75 78 2c 20 65 6e 67 6c 69 73 68  -x, -ux, english
26c0: 2c 20 6c 61 74 69 6e 20 61 6e 64 20 69 74 61 6c  , latin and ital
26d0: 69 61 6e 20 70 6c 75 72 61 6c 73 29 20 61 6e 64  ian plurals) and
26e0: 20 74 61 67 73 20 74 6f 20 67 65 6e 65 72 61 74   tags to generat
26f0: 65 20 74 68 65 6d 5c 6e 22 20 2b 20 5c 0a 20 20  e them\n" + \.  
2700: 20 20 20 20 20 20 20 20 20 20 22 64 4d 69 73 63            "dMisc
2710: 50 6c 75 72 20 3d 20 22 20 2b 20 73 74 72 28 64  Plur = " + str(d
2720: 4d 69 73 63 50 6c 75 72 29 20 2b 20 22 5c 6e 5c  MiscPlur) + "\n\
2730: 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20  n" + \.         
2740: 20 20 20 22 23 20 64 69 63 74 69 6f 6e 61 72 79     "# dictionary
2750: 20 6f 66 20 66 65 6d 69 6e 69 6e 65 20 66 6f 72   of feminine for
2760: 6d 73 20 61 6e 64 20 74 61 67 73 20 74 6f 20 67  ms and tags to g
2770: 65 6e 65 72 61 74 65 20 6d 61 73 63 75 6c 69 6e  enerate masculin
2780: 65 20 66 6f 72 6d 73 20 28 73 69 6e 67 75 6c 61  e forms (singula
2790: 72 20 61 6e 64 20 70 6c 75 72 61 6c 29 5c 6e 22  r and plural)\n"
27a0: 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   + \.           
27b0: 20 22 64 4d 61 73 46 6f 72 6d 20 3d 20 22 20 2b   "dMasForm = " +
27c0: 20 73 74 72 28 64 4d 61 73 46 6f 72 6d 29 20 2b   str(dMasForm) +
27d0: 20 22 5c 6e 22 0a 20 20 20 20 6f 70 65 6e 28 73   "\n".    open(s
27e0: 70 2b 22 2f 6d 6f 64 75 6c 65 73 2f 6d 66 73 70  p+"/modules/mfsp
27f0: 5f 64 61 74 61 2e 70 79 22 2c 20 22 77 22 2c 20  _data.py", "w", 
2800: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
2810: 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e  , newline="\n").
2820: 77 72 69 74 65 28 73 43 6f 64 65 29 0a 0a 20 20  write(sCode)..  
2830: 20 20 69 66 20 62 4a 53 3a 0a 20 20 20 20 20 20    if bJS:.      
2840: 20 20 23 23 20 77 72 69 74 65 20 66 69 6c 65 20    ## write file 
2850: 66 6f 72 20 4a 61 76 61 53 63 72 69 70 74 0a 20  for JavaScript. 
2860: 20 20 20 20 20 20 20 73 43 6f 64 65 20 3d 20 27         sCode = '
2870: 7b 5c 6e 27 20 2b 20 5c 0a 20 20 20 20 20 20 20  {\n' + \.       
2880: 20 20 20 20 20 20 20 20 20 27 20 20 20 20 22 6c           '    "l
2890: 54 61 67 4d 69 73 63 50 6c 75 72 22 3a 20 27 20  TagMiscPlur": ' 
28a0: 2b 20 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 54  +  json.dumps(lT
28b0: 61 67 4d 69 73 63 50 6c 75 72 2c 20 65 6e 73 75  agMiscPlur, ensu
28c0: 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 20  re_ascii=False) 
28d0: 2b 20 22 2c 5c 6e 22 20 2b 20 5c 0a 20 20 20 20  + ",\n" + \.    
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 27 20 20 20              '   
28f0: 20 22 6c 54 61 67 4d 61 73 46 6f 72 6d 22 3a 20   "lTagMasForm": 
2900: 27 20 2b 20 20 6a 73 6f 6e 2e 64 75 6d 70 73 28  ' +  json.dumps(
2910: 6c 54 61 67 4d 61 73 46 6f 72 6d 2c 20 65 6e 73  lTagMasForm, ens
2920: 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29  ure_ascii=False)
2930: 20 2b 20 22 2c 5c 6e 22 20 2b 20 5c 0a 20 20 20   + ",\n" + \.   
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 20 20               '  
2950: 20 20 22 64 4d 69 73 63 50 6c 75 72 22 3a 20 27    "dMiscPlur": '
2960: 20 2b 20 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 64   +  json.dumps(d
2970: 4d 69 73 63 50 6c 75 72 2c 20 65 6e 73 75 72 65  MiscPlur, ensure
2980: 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 20 2b 20  _ascii=False) + 
2990: 22 2c 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20  ",\n" + \.      
29a0: 20 20 20 20 20 20 20 20 20 20 27 20 20 20 20 22            '    "
29b0: 64 4d 61 73 46 6f 72 6d 22 3a 20 27 20 2b 20 20  dMasForm": ' +  
29c0: 6a 73 6f 6e 2e 64 75 6d 70 73 28 64 4d 61 73 46  json.dumps(dMasF
29d0: 6f 72 6d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69  orm, ensure_asci
29e0: 69 3d 46 61 6c 73 65 29 20 2b 20 22 5c 6e 7d 22  i=False) + "\n}"
29f0: 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 28 73 70  .        open(sp
2a00: 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 2f 6d 66  +"/modules-js/mf
2a10: 73 70 5f 64 61 74 61 2e 6a 73 6f 6e 22 2c 20 22  sp_data.json", "
2a20: 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  w", encoding="ut
2a30: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
2a40: 6e 22 29 2e 77 72 69 74 65 28 73 43 6f 64 65 29  n").write(sCode)
2a50: 0a 0a 0a 64 65 66 20 6d 61 6b 65 50 68 6f 6e 65  ...def makePhone
2a60: 74 54 61 62 6c 65 20 28 73 70 2c 20 62 4a 53 3d  tTable (sp, bJS=
2a70: 46 61 6c 73 65 29 3a 0a 20 20 20 20 70 72 69 6e  False):.    prin
2a80: 74 28 22 3e 20 43 6f 72 72 65 73 70 6f 6e 64 61  t("> Corresponda
2a90: 6e 63 65 73 20 70 68 6f 6e c3 a9 74 69 71 75 65  nces phon..tique
2aa0: 73 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20  s ", end="").   
2ab0: 20 70 72 69 6e 74 28 22 28 50 79 74 68 6f 6e 20   print("(Python 
2ac0: 65 74 20 4a 61 76 61 53 63 72 69 70 74 29 22 20  et JavaScript)" 
2ad0: 20 69 66 20 62 4a 53 20 20 65 6c 73 65 20 22 28   if bJS  else "(
2ae0: 50 79 74 68 6f 6e 20 73 65 75 6c 65 6d 65 6e 74  Python seulement
2af0: 29 22 29 0a 0a 20 20 20 20 74 72 79 3a 0a 20 20  )")..    try:.  
2b00: 20 20 20 20 20 20 6f 44 69 63 74 20 3d 20 69 62        oDict = ib
2b10: 64 61 77 67 2e 49 42 44 41 57 47 28 22 46 72 65  dawg.IBDAWG("Fre
2b20: 6e 63 68 2e 62 64 69 63 22 29 0a 20 20 20 20 65  nch.bdic").    e
2b30: 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 74  xcept:.        t
2b40: 72 61 63 65 62 61 63 6b 2e 70 72 69 6e 74 5f 65  raceback.print_e
2b50: 78 63 28 29 0a 20 20 20 20 20 20 20 20 72 65 74  xc().        ret
2b60: 75 72 6e 0a 0a 20 20 20 20 23 20 73 65 74 20 6f  urn..    # set o
2b70: 66 20 68 6f 6d 6f 70 68 6f 6e 69 63 20 77 6f 72  f homophonic wor
2b80: 64 73 0a 20 20 20 20 6c 53 65 74 20 3d 20 5b 5d  ds.    lSet = []
2b90: 0a 20 20 20 20 66 6f 72 20 73 4c 69 6e 65 20 69  .    for sLine i
2ba0: 6e 20 72 65 61 64 46 69 6c 65 28 73 70 2b 22 2f  n readFile(sp+"/
2bb0: 64 61 74 61 2f 70 68 6f 6e 65 74 5f 73 69 6d 69  data/phonet_simi
2bc0: 6c 2e 74 78 74 22 29 3a 0a 20 20 20 20 20 20 20  l.txt"):.       
2bd0: 20 6c 57 6f 72 64 20 3d 20 73 4c 69 6e 65 2e 73   lWord = sLine.s
2be0: 70 6c 69 74 28 29 0a 20 20 20 20 20 20 20 20 61  plit().        a
2bf0: 4d 6f 72 65 20 3d 20 73 65 74 28 29 0a 20 20 20  More = set().   
2c00: 20 20 20 20 20 66 6f 72 20 73 57 6f 72 64 20 69       for sWord i
2c10: 6e 20 6c 57 6f 72 64 3a 0a 20 20 20 20 20 20 20  n lWord:.       
2c20: 20 20 20 20 20 69 66 20 73 57 6f 72 64 2e 65 6e       if sWord.en
2c30: 64 73 77 69 74 68 28 22 65 72 22 29 20 61 6e 64  dswith("er") and
2c40: 20 63 6f 6e 6a 2e 69 73 56 65 72 62 28 73 57 6f   conj.isVerb(sWo
2c50: 72 64 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  rd):.           
2c60: 20 20 20 20 20 61 4d 6f 72 65 20 3d 20 61 4d 6f       aMore = aMo
2c70: 72 65 2e 75 6e 69 6f 6e 28 63 6f 6e 6a 2e 67 65  re.union(conj.ge
2c80: 74 43 6f 6e 6a 53 69 6d 69 6c 49 6e 66 69 56 31  tConjSimilInfiV1
2c90: 28 73 57 6f 72 64 29 29 0a 20 20 20 20 20 20 20  (sWord)).       
2ca0: 20 6c 57 6f 72 64 2e 65 78 74 65 6e 64 28 6c 69   lWord.extend(li
2cb0: 73 74 28 61 4d 6f 72 65 29 29 0a 20 20 20 20 20  st(aMore)).     
2cc0: 20 20 20 6c 53 65 74 2e 61 70 70 65 6e 64 28 73     lSet.append(s
2cd0: 6f 72 74 65 64 28 73 65 74 28 6c 57 6f 72 64 29  orted(set(lWord)
2ce0: 29 29 0a 20 20 20 20 23 20 64 69 63 74 69 6f 6e  )).    # diction
2cf0: 61 72 79 20 6f 66 20 77 6f 72 64 73 0a 20 20 20  ary of words.   
2d00: 20 64 57 6f 72 64 20 3d 20 7b 7d 0a 20 20 20 20   dWord = {}.    
2d10: 66 6f 72 20 69 2c 20 61 53 65 74 20 69 6e 20 65  for i, aSet in e
2d20: 6e 75 6d 65 72 61 74 65 28 6c 53 65 74 29 3a 0a  numerate(lSet):.
2d30: 20 20 20 20 20 20 20 20 66 6f 72 20 73 57 6f 72          for sWor
2d40: 64 20 69 6e 20 61 53 65 74 3a 0a 20 20 20 20 20  d in aSet:.     
2d50: 20 20 20 20 20 20 20 69 66 20 6f 44 69 63 74 2e         if oDict.
2d60: 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29 3a 0a 20  lookup(sWord):. 
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2d80: 57 6f 72 64 5b 73 57 6f 72 64 5d 20 3d 20 69 20  Word[sWord] = i 
2d90: 20 23 20 77 61 72 6e 69 6e 67 2c 20 77 68 61 74   # warning, what
2da0: 20 69 66 20 77 6f 72 64 20 69 6e 20 73 65 76 65   if word in seve
2db0: 72 61 6c 20 73 65 74 73 3f 0a 20 20 20 20 20 20  ral sets?.      
2dc0: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
2de0: 28 22 4d 6f 74 20 69 6e 63 6f 6e 6e 75 20 3a 20  ("Mot inconnu : 
2df0: 22 20 2b 20 73 57 6f 72 64 29 0a 20 20 20 20 23  " + sWord).    #
2e00: 20 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20 6d   dictionary of m
2e10: 6f 72 70 68 6f 6c 6f 67 69 65 73 0a 20 20 20 20  orphologies.    
2e20: 64 4d 6f 72 70 68 20 3d 20 7b 7d 0a 20 20 20 20  dMorph = {}.    
2e30: 66 6f 72 20 73 57 6f 72 64 20 69 6e 20 64 57 6f  for sWord in dWo
2e40: 72 64 3a 0a 20 20 20 20 20 20 20 20 64 4d 6f 72  rd:.        dMor
2e50: 70 68 5b 73 57 6f 72 64 5d 20 3d 20 6f 44 69 63  ph[sWord] = oDic
2e60: 74 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64  t.getMorph(sWord
2e70: 29 0a 0a 20 20 20 20 23 20 77 72 69 74 65 20 66  )..    # write f
2e80: 69 6c 65 20 66 6f 72 20 50 79 74 68 6f 6e 0a 20  ile for Python. 
2e90: 20 20 20 73 43 6f 64 65 20 3d 20 22 23 20 67 65     sCode = "# ge
2ea0: 6e 65 72 61 74 65 64 20 64 61 74 61 20 28 64 6f  nerated data (do
2eb0: 20 6e 6f 74 20 65 64 69 74 29 5c 6e 5c 6e 22 20   not edit)\n\n" 
2ec0: 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  + \.            
2ed0: 22 64 57 6f 72 64 20 3d 20 22 20 2b 20 73 74 72  "dWord = " + str
2ee0: 28 64 57 6f 72 64 29 20 2b 20 22 5c 6e 5c 6e 22  (dWord) + "\n\n"
2ef0: 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   + \.           
2f00: 20 22 6c 53 65 74 20 3d 20 22 20 2b 20 73 74 72   "lSet = " + str
2f10: 28 6c 53 65 74 29 20 2b 20 22 5c 6e 5c 6e 22 20  (lSet) + "\n\n" 
2f20: 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  + \.            
2f30: 22 64 4d 6f 72 70 68 20 3d 20 22 20 2b 20 73 74  "dMorph = " + st
2f40: 72 28 64 4d 6f 72 70 68 29 20 2b 20 22 5c 6e 22  r(dMorph) + "\n"
2f50: 0a 20 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d  .    open(sp+"/m
2f60: 6f 64 75 6c 65 73 2f 70 68 6f 6e 65 74 5f 64 61  odules/phonet_da
2f70: 74 61 2e 70 79 22 2c 20 22 77 22 2c 20 65 6e 63  ta.py", "w", enc
2f80: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e  oding="utf-8", n
2f90: 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69  ewline="\n").wri
2fa0: 74 65 28 73 43 6f 64 65 29 0a 0a 20 20 20 20 69  te(sCode)..    i
2fb0: 66 20 62 4a 53 3a 0a 20 20 20 20 20 20 20 20 23  f bJS:.        #
2fc0: 23 20 77 72 69 74 65 20 66 69 6c 65 20 66 6f 72  # write file for
2fd0: 20 4a 61 76 61 53 63 72 69 70 74 0a 20 20 20 20   JavaScript.    
2fe0: 20 20 20 20 73 43 6f 64 65 20 3d 20 22 7b 5c 6e      sCode = "{\n
2ff0: 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  " + \.          
3000: 20 20 20 20 20 20 27 20 20 20 20 22 64 57 6f 72        '    "dWor
3010: 64 22 3a 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d  d": ' + json.dum
3020: 70 73 28 64 57 6f 72 64 2c 20 65 6e 73 75 72 65  ps(dWord, ensure
3030: 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 20 2b 20  _ascii=False) + 
3040: 22 2c 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20  ",\n" + \.      
3050: 20 20 20 20 20 20 20 20 20 20 27 20 20 20 20 22            '    "
3060: 6c 53 65 74 22 3a 20 27 20 2b 20 6a 73 6f 6e 2e  lSet": ' + json.
3070: 64 75 6d 70 73 28 6c 53 65 74 2c 20 65 6e 73 75  dumps(lSet, ensu
3080: 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 20  re_ascii=False) 
3090: 2b 20 22 2c 5c 6e 22 20 2b 20 5c 0a 20 20 20 20  + ",\n" + \.    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 27 20 20 20              '   
30b0: 20 22 64 4d 6f 72 70 68 22 3a 20 27 20 2b 20 6a   "dMorph": ' + j
30c0: 73 6f 6e 2e 64 75 6d 70 73 28 64 4d 6f 72 70 68  son.dumps(dMorph
30d0: 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69 3d 46  , ensure_ascii=F
30e0: 61 6c 73 65 29 20 2b 20 22 5c 6e 7d 22 0a 20 20  alse) + "\n}".  
30f0: 20 20 20 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f        open(sp+"/
3100: 6d 6f 64 75 6c 65 73 2d 6a 73 2f 70 68 6f 6e 65  modules-js/phone
3110: 74 5f 64 61 74 61 2e 6a 73 6f 6e 22 2c 20 22 77  t_data.json", "w
3120: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
3130: 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e  -8", newline="\n
3140: 22 29 2e 77 72 69 74 65 28 73 43 6f 64 65 29 0a  ").write(sCode).
3150: 0a 0a 64 65 66 20 6d 61 6b 65 4c 6f 63 75 74 69  ..def makeLocuti
3160: 6f 6e 73 20 28 73 70 2c 20 62 4a 53 3d 46 61 6c  ons (sp, bJS=Fal
3170: 73 65 29 3a 0a 20 20 20 20 22 63 6f 6d 70 69 6c  se):.    "compil
3180: 65 20 6c 69 73 74 20 6f 66 20 6c 6f 63 75 74 69  e list of locuti
3190: 6f 6e 73 20 69 6e 20 4a 53 4f 4e 22 0a 20 20 20  ons in JSON".   
31a0: 20 70 72 69 6e 74 28 22 3e 20 4c 6f 63 75 74 69   print("> Locuti
31b0: 6f 6e 73 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20  ons ", end=""). 
31c0: 20 20 20 70 72 69 6e 74 28 22 28 50 79 74 68 6f     print("(Pytho
31d0: 6e 20 65 74 20 4a 61 76 61 53 63 72 69 70 74 29  n et JavaScript)
31e0: 22 20 20 69 66 20 62 4a 53 20 20 65 6c 73 65 20  "  if bJS  else 
31f0: 22 28 50 79 74 68 6f 6e 20 73 65 75 6c 65 6d 65  "(Python seuleme
3200: 6e 74 29 22 29 0a 20 20 20 20 64 4c 6f 63 47 72  nt)").    dLocGr
3210: 61 70 68 20 3d 20 7b 7d 0a 20 20 20 20 6f 54 6f  aph = {}.    oTo
3220: 6b 65 6e 69 7a 65 72 20 3d 20 74 6b 7a 2e 54 6f  kenizer = tkz.To
3230: 6b 65 6e 69 7a 65 72 28 22 66 72 22 29 0a 20 20  kenizer("fr").  
3240: 20 20 66 6f 72 20 73 4c 69 6e 65 20 69 6e 20 69    for sLine in i
3250: 74 65 72 74 6f 6f 6c 73 2e 63 68 61 69 6e 28 72  tertools.chain(r
3260: 65 61 64 46 69 6c 65 28 73 70 2b 22 2f 64 61 74  eadFile(sp+"/dat
3270: 61 2f 6c 6f 63 75 74 69 6f 6e 73 2e 74 78 74 22  a/locutions.txt"
3280: 29 2c 20 72 65 61 64 46 69 6c 65 28 73 70 2b 22  ), readFile(sp+"
3290: 2f 64 61 74 61 2f 6c 6f 63 75 74 69 6f 6e 73 5f  /data/locutions_
32a0: 76 72 61 63 2e 74 78 74 22 29 29 3a 0a 20 20 20  vrac.txt")):.   
32b0: 20 20 20 20 20 64 43 75 72 20 3d 20 64 4c 6f 63       dCur = dLoc
32c0: 47 72 61 70 68 0a 20 20 20 20 20 20 20 20 73 4c  Graph.        sL
32d0: 6f 63 2c 20 73 54 61 67 20 3d 20 73 4c 69 6e 65  oc, sTag = sLine
32e0: 2e 73 70 6c 69 74 28 22 5c 74 22 29 0a 20 20 20  .split("\t").   
32f0: 20 20 20 20 20 66 6f 72 20 6f 54 6f 6b 65 6e 20       for oToken 
3300: 69 6e 20 6f 54 6f 6b 65 6e 69 7a 65 72 2e 67 65  in oTokenizer.ge
3310: 6e 54 6f 6b 65 6e 73 28 73 4c 6f 63 2e 73 74 72  nTokens(sLoc.str
3320: 69 70 28 29 29 3a 0a 20 20 20 20 20 20 20 20 20  ip()):.         
3330: 20 20 20 73 57 6f 72 64 20 3d 20 6f 54 6f 6b 65     sWord = oToke
3340: 6e 5b 22 73 56 61 6c 75 65 22 5d 0a 20 20 20 20  n["sValue"].    
3350: 20 20 20 20 20 20 20 20 69 66 20 73 57 6f 72 64          if sWord
3360: 20 6e 6f 74 20 69 6e 20 64 43 75 72 3a 0a 20 20   not in dCur:.  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 43                dC
3380: 75 72 5b 73 57 6f 72 64 5d 20 3d 20 7b 7d 0a 20  ur[sWord] = {}. 
3390: 20 20 20 20 20 20 20 20 20 20 20 64 43 75 72 20             dCur 
33a0: 3d 20 64 43 75 72 5b 73 57 6f 72 64 5d 0a 20 20  = dCur[sWord].  
33b0: 20 20 20 20 20 20 64 43 75 72 5b 22 3a 22 5d 20        dCur[":"] 
33c0: 3d 20 73 54 61 67 0a 0a 20 20 20 20 73 43 6f 64  = sTag..    sCod
33d0: 65 20 3d 20 22 23 20 67 65 6e 65 72 61 74 65 64  e = "# generated
33e0: 20 64 61 74 61 20 28 64 6f 20 6e 6f 74 20 65 64   data (do not ed
33f0: 69 74 29 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20 20  it)\n\n" + \.   
3400: 20 20 20 20 20 20 20 20 20 22 64 4c 6f 63 75 74           "dLocut
3410: 69 6f 6e 73 20 3d 20 22 20 2b 20 73 74 72 28 64  ions = " + str(d
3420: 4c 6f 63 47 72 61 70 68 29 20 2b 20 22 5c 6e 22  LocGraph) + "\n"
3430: 0a 20 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d  .    open(sp+"/m
3440: 6f 64 75 6c 65 73 2f 6c 6f 63 75 74 69 6f 6e 73  odules/locutions
3450: 5f 64 61 74 61 2e 70 79 22 2c 20 22 77 22 2c 20  _data.py", "w", 
3460: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
3470: 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e  , newline="\n").
3480: 77 72 69 74 65 28 73 43 6f 64 65 29 0a 20 20 20  write(sCode).   
3490: 20 69 66 20 62 4a 53 3a 0a 20 20 20 20 20 20 20   if bJS:.       
34a0: 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f 64 75 6c   open(sp+"/modul
34b0: 65 73 2d 6a 73 2f 6c 6f 63 75 74 69 6f 6e 73 5f  es-js/locutions_
34c0: 64 61 74 61 2e 6a 73 6f 6e 22 2c 20 22 77 22 2c  data.json", "w",
34d0: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
34e0: 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29  ", newline="\n")
34f0: 2e 77 72 69 74 65 28 6a 73 6f 6e 2e 64 75 6d 70  .write(json.dump
3500: 73 28 64 4c 6f 63 47 72 61 70 68 2c 20 65 6e 73  s(dLocGraph, ens
3510: 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29  ure_ascii=False)
3520: 29 0a 0a 0a 64 65 66 20 62 65 66 6f 72 65 20 28  )...def before (
3530: 73 70 4c 61 75 6e 63 68 2c 20 64 56 61 72 73 2c  spLaunch, dVars,
3540: 20 62 4a 53 3d 46 61 6c 73 65 29 3a 0a 20 20 20   bJS=False):.   
3550: 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d   print("========
3560: 3d 3d 20 42 75 69 6c 64 20 48 75 6e 73 70 65 6c  == Build Hunspel
3570: 6c 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 3d  l dictionaries =
3580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 0a 20 20 20 20  =========").    
3590: 6d 61 6b 65 44 69 63 74 69 6f 6e 61 72 69 65 73  makeDictionaries
35a0: 28 73 70 4c 61 75 6e 63 68 2c 20 64 56 61 72 73  (spLaunch, dVars
35b0: 5b 27 6f 78 74 5f 76 65 72 73 69 6f 6e 27 5d 29  ['oxt_version'])
35c0: 0a 0a 0a 64 65 66 20 61 66 74 65 72 20 28 73 70  ...def after (sp
35d0: 4c 61 75 6e 63 68 2c 20 64 56 61 72 73 2c 20 62  Launch, dVars, b
35e0: 4a 53 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 70  JS=False):.    p
35f0: 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  rint("==========
3600: 20 42 75 69 6c 64 20 46 72 65 6e 63 68 20 64 61   Build French da
3610: 74 61 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 0a  ta ==========").
3620: 20 20 20 20 6d 61 6b 65 4d 66 73 70 28 73 70 4c      makeMfsp(spL
3630: 61 75 6e 63 68 2c 20 62 4a 53 29 0a 20 20 20 20  aunch, bJS).    
3640: 6d 61 6b 65 43 6f 6e 6a 28 73 70 4c 61 75 6e 63  makeConj(spLaunc
3650: 68 2c 20 62 4a 53 29 0a 20 20 20 20 6d 61 6b 65  h, bJS).    make
3660: 50 68 6f 6e 65 74 54 61 62 6c 65 28 73 70 4c 61  PhonetTable(spLa
3670: 75 6e 63 68 2c 20 62 4a 53 29 0a 20 20 20 20 6d  unch, bJS).    m
3680: 61 6b 65 4c 6f 63 75 74 69 6f 6e 73 28 73 70 4c  akeLocutions(spL
3690: 61 75 6e 63 68 2c 20 62 4a 53 29 0a              aunch, bJS).