Grammalecte  Hex Artifact Content

Artifact 1f69de4a2f5569c5515e573217243f4f08b3a1b815230b6de5f2e07b0ddbc1ef:


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 70 68 73 70 65 6c 6c 2e 69  ort graphspell.i
0080: 62 64 61 77 67 20 61 73 20 69 62 64 61 77 67 0a  bdawg as ibdawg.
0090: 66 72 6f 6d 20 67 72 61 70 68 73 70 65 6c 6c 2e  from graphspell.
00a0: 65 63 68 6f 20 69 6d 70 6f 72 74 20 65 63 68 6f  echo import echo
00b0: 0a 66 72 6f 6d 20 67 72 61 70 68 73 70 65 6c 6c  .from graphspell
00c0: 2e 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 20 69  .str_transform i
00d0: 6d 70 6f 72 74 20 64 65 66 69 6e 65 53 75 66 66  mport defineSuff
00e0: 69 78 43 6f 64 65 0a 69 6d 70 6f 72 74 20 67 72  ixCode.import gr
00f0: 61 70 68 73 70 65 6c 6c 2e 74 6f 6b 65 6e 69 7a  aphspell.tokeniz
0100: 65 72 20 61 73 20 74 6b 7a 0a 0a 0a 63 6c 61 73  er as tkz...clas
0110: 73 20 63 64 3a 0a 20 20 20 20 22 22 22 43 6f 6e  s cd:.    """Con
0120: 74 65 78 74 20 6d 61 6e 61 67 65 72 20 66 6f 72  text manager for
0130: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 63 75   changing the cu
0140: 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
0150: 72 65 63 74 6f 72 79 22 22 22 0a 20 20 20 20 64  rectory""".    d
0160: 65 66 20 5f 5f 69 6e 69 74 5f 5f 20 28 73 65 6c  ef __init__ (sel
0170: 66 2c 20 6e 65 77 50 61 74 68 29 3a 0a 20 20 20  f, newPath):.   
0180: 20 20 20 20 20 73 65 6c 66 2e 6e 65 77 50 61 74       self.newPat
0190: 68 20 3d 20 6f 73 2e 70 61 74 68 2e 65 78 70 61  h = os.path.expa
01a0: 6e 64 75 73 65 72 28 6e 65 77 50 61 74 68 29 0a  nduser(newPath).
01b0: 0a 20 20 20 20 64 65 66 20 5f 5f 65 6e 74 65 72  .    def __enter
01c0: 5f 5f 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20  __ (self):.     
01d0: 20 20 20 73 65 6c 66 2e 73 61 76 65 64 50 61 74     self.savedPat
01e0: 68 20 3d 20 6f 73 2e 67 65 74 63 77 64 28 29 0a  h = os.getcwd().
01f0: 20 20 20 20 20 20 20 20 6f 73 2e 63 68 64 69 72          os.chdir
0200: 28 73 65 6c 66 2e 6e 65 77 50 61 74 68 29 0a 0a  (self.newPath)..
0210: 20 20 20 20 64 65 66 20 5f 5f 65 78 69 74 5f 5f      def __exit__
0220: 20 28 73 65 6c 66 2c 20 65 74 79 70 65 2c 20 76   (self, etype, v
0230: 61 6c 75 65 2c 20 74 72 61 63 65 62 61 63 6b 29  alue, traceback)
0240: 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68 64  :.        os.chd
0250: 69 72 28 73 65 6c 66 2e 73 61 76 65 64 50 61 74  ir(self.savedPat
0260: 68 29 0a 0a 0a 64 65 66 20 72 65 61 64 46 69 6c  h)...def readFil
0270: 65 20 28 73 70 66 29 3a 0a 20 20 20 20 69 66 20  e (spf):.    if 
0280: 6f 73 2e 70 61 74 68 2e 69 73 66 69 6c 65 28 73  os.path.isfile(s
0290: 70 66 29 3a 0a 20 20 20 20 20 20 20 20 77 69 74  pf):.        wit
02a0: 68 20 6f 70 65 6e 28 73 70 66 2c 20 22 72 22 2c  h open(spf, "r",
02b0: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
02c0: 22 29 20 61 73 20 68 53 72 63 3a 0a 20 20 20 20  ") as hSrc:.    
02d0: 20 20 20 20 20 20 20 20 66 6f 72 20 73 4c 69 6e          for sLin
02e0: 65 20 69 6e 20 68 53 72 63 3a 0a 20 20 20 20 20  e in hSrc:.     
02f0: 20 20 20 20 20 20 20 20 20 20 20 73 4c 69 6e 65             sLine
0300: 20 3d 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29   = sLine.strip()
0310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0320: 20 69 66 20 73 4c 69 6e 65 20 3d 3d 20 22 5f 5f   if sLine == "__
0330: 45 4e 44 5f 5f 22 3a 0a 20 20 20 20 20 20 20 20  END__":.        
0340: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
0350: 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k.              
0360: 20 20 69 66 20 73 4c 69 6e 65 20 61 6e 64 20 6e    if sLine and n
0370: 6f 74 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  ot sLine.startsw
0380: 69 74 68 28 22 23 22 29 3a 0a 20 20 20 20 20 20  ith("#"):.      
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
03a0: 65 6c 64 20 73 4c 69 6e 65 0a 20 20 20 20 65 6c  eld sLine.    el
03b0: 73 65 3a 0a 20 20 20 20 20 20 20 20 72 61 69 73  se:.        rais
03c0: 65 20 4f 53 45 72 72 6f 72 28 22 23 20 45 72 72  e OSError("# Err
03d0: 6f 72 2e 20 46 69 6c 65 20 6e 6f 74 20 66 6f 75  or. File not fou
03e0: 6e 64 20 6f 72 20 6e 6f 74 20 6c 6f 61 64 61 62  nd or not loadab
03f0: 6c 65 3a 20 22 20 2b 20 73 70 66 29 0a 0a 0a 64  le: " + spf)...d
0400: 65 66 20 6d 61 6b 65 44 69 63 74 69 6f 6e 61 72  ef makeDictionar
0410: 69 65 73 20 28 73 70 2c 20 73 56 65 72 73 69 6f  ies (sp, sVersio
0420: 6e 29 3a 0a 20 20 20 20 77 69 74 68 20 63 64 28  n):.    with cd(
0430: 73 70 2b 22 2f 64 69 63 74 69 6f 6e 6e 61 69 72  sp+"/dictionnair
0440: 65 22 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e  e"):.        os.
0450: 73 79 73 74 65 6d 28 22 67 65 6e 66 72 64 69 63  system("genfrdic
0460: 2e 70 79 20 2d 73 20 2d 67 6c 20 2d 76 20 22 2b  .py -s -gl -v "+
0470: 73 56 65 72 73 69 6f 6e 29 0a 0a 0a 64 65 66 20  sVersion)...def 
0480: 6d 61 6b 65 43 6f 6e 6a 20 28 73 70 2c 20 62 4a  makeConj (sp, bJ
0490: 53 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 70 72  S=False):.    pr
04a0: 69 6e 74 28 22 3e 20 43 6f 6e 6a 75 67 61 69 73  int("> Conjugais
04b0: 6f 6e 73 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20  ons ", end=""). 
04c0: 20 20 20 70 72 69 6e 74 28 22 28 50 79 74 68 6f     print("(Pytho
04d0: 6e 20 65 74 20 4a 61 76 61 53 63 72 69 70 74 29  n et JavaScript)
04e0: 22 20 20 69 66 20 62 4a 53 20 20 65 6c 73 65 20  "  if bJS  else 
04f0: 22 28 50 79 74 68 6f 6e 20 73 65 75 6c 65 6d 65  "(Python seuleme
0500: 6e 74 29 22 29 0a 20 20 20 20 64 56 65 72 62 20  nt)").    dVerb 
0510: 3d 20 7b 7d 0a 20 20 20 20 6c 56 74 79 70 20 3d  = {}.    lVtyp =
0520: 20 5b 5d 3b 20 64 56 74 79 70 20 3d 20 7b 7d 3b   []; dVtyp = {};
0530: 20 6e 56 74 79 70 20 3d 20 30 0a 20 20 20 20 6c   nVtyp = 0.    l
0540: 54 61 67 73 20 3d 20 5b 5d 3b 20 64 54 61 67 73  Tags = []; dTags
0550: 20 3d 20 7b 7d 3b 20 6e 54 61 67 73 20 3d 20 30   = {}; nTags = 0
0560: 0a 0a 20 20 20 20 64 50 61 74 74 65 72 6e 4c 69  ..    dPatternLi
0570: 73 74 20 3d 20 7b 20 22 3a 50 51 22 3a 20 5b 5d  st = { ":PQ": []
0580: 2c 20 22 3a 49 70 22 3a 20 5b 5d 2c 20 22 3a 49  , ":Ip": [], ":I
0590: 71 22 3a 20 5b 5d 2c 20 22 3a 49 73 22 3a 20 5b  q": [], ":Is": [
05a0: 5d 2c 20 22 3a 49 66 22 3a 20 5b 5d 2c 20 22 3a  ], ":If": [], ":
05b0: 4b 22 3a 20 5b 5d 2c 20 22 3a 53 70 22 3a 20 5b  K": [], ":Sp": [
05c0: 5d 2c 20 22 3a 53 71 22 3a 20 5b 5d 2c 20 22 3a  ], ":Sq": [], ":
05d0: 45 22 3a 20 5b 5d 20 7d 0a 20 20 20 20 64 54 72  E": [] }.    dTr
05e0: 61 64 20 3d 20 7b 20 20 20 22 69 6e 66 69 22 3a  ad = {   "infi":
05f0: 20 22 3a 59 22 2c 20 22 70 70 72 65 22 3a 20 22   ":Y", "ppre": "
0600: 3a 50 51 22 2c 20 22 70 70 61 73 22 3a 20 22 3a  :PQ", "ppas": ":
0610: 50 51 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  PQ",.           
0620: 20 20 20 20 20 22 69 70 72 65 22 3a 20 22 3a 49       "ipre": ":I
0630: 70 22 2c 20 22 69 69 6d 70 22 3a 20 22 3a 49 71  p", "iimp": ":Iq
0640: 22 2c 20 22 69 70 73 69 22 3a 20 22 3a 49 73 22  ", "ipsi": ":Is"
0650: 2c 20 22 69 66 75 74 22 3a 20 22 3a 49 66 22 2c  , "ifut": ":If",
0660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0670: 20 22 73 70 72 65 22 3a 20 22 3a 53 70 22 2c 20   "spre": ":Sp", 
0680: 22 73 69 6d 70 22 3a 20 22 3a 53 71 22 2c 0a 20  "simp": ":Sq",. 
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
06a0: 63 6f 6e 64 22 3a 20 22 3a 4b 22 2c 20 22 69 6d  cond": ":K", "im
06b0: 70 65 22 3a 20 22 3a 45 22 2c 0a 20 20 20 20 20  pe": ":E",.     
06c0: 20 20 20 20 20 20 20 20 20 20 20 22 31 73 67 22             "1sg"
06d0: 3a 20 22 3a 31 73 22 2c 20 22 32 73 67 22 3a 20  : ":1s", "2sg": 
06e0: 22 3a 32 73 22 2c 20 22 33 73 67 22 3a 20 22 3a  ":2s", "3sg": ":
06f0: 33 73 22 2c 20 22 31 70 6c 22 3a 20 22 3a 31 70  3s", "1pl": ":1p
0700: 22 2c 20 22 32 70 6c 22 3a 20 22 3a 32 70 22 2c  ", "2pl": ":2p",
0710: 20 22 33 70 6c 22 3a 20 22 3a 33 70 22 2c 20 22   "3pl": ":3p", "
0720: 31 69 73 67 22 3a 20 22 3a 31 c5 9b 22 2c 0a 20  1isg": ":1..",. 
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0740: 6d 61 73 20 73 67 22 3a 20 22 3a 51 31 22 2c 20  mas sg": ":Q1", 
0750: 22 6d 61 73 20 70 6c 22 3a 20 22 3a 51 32 22 2c  "mas pl": ":Q2",
0760: 20 22 6d 61 73 20 69 6e 76 22 3a 20 22 3a 51 31   "mas inv": ":Q1
0770: 22 2c 20 22 66 65 6d 20 73 67 22 3a 20 22 3a 51  ", "fem sg": ":Q
0780: 33 22 2c 20 22 66 65 6d 20 70 6c 22 3a 20 22 3a  3", "fem pl": ":
0790: 51 34 22 2c 20 22 65 70 69 20 69 6e 76 22 3a 20  Q4", "epi inv": 
07a0: 22 3a 51 31 22 0a 20 20 20 20 20 20 20 20 20 20  ":Q1".          
07b0: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 61 64 20    }..    # read 
07c0: 6c 65 78 69 63 6f 6e 0a 20 20 20 20 6e 53 74 6f  lexicon.    nSto
07d0: 70 20 3d 20 30 0a 20 20 20 20 66 6f 72 20 6e 2c  p = 0.    for n,
07e0: 20 73 4c 69 6e 65 20 69 6e 20 65 6e 75 6d 65 72   sLine in enumer
07f0: 61 74 65 28 72 65 61 64 46 69 6c 65 28 73 70 2b  ate(readFile(sp+
0800: 22 2f 64 61 74 61 2f 64 69 63 74 43 6f 6e 6a 2e  "/data/dictConj.
0810: 74 78 74 22 29 29 3a 0a 20 20 20 20 20 20 20 20  txt")):.        
0820: 6e 54 61 62 20 3d 20 73 4c 69 6e 65 2e 63 6f 75  nTab = sLine.cou
0830: 6e 74 28 22 5c 74 22 29 0a 20 20 20 20 20 20 20  nt("\t").       
0840: 20 69 66 20 6e 54 61 62 20 3d 3d 20 31 3a 0a 20   if nTab == 1:. 
0850: 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 65 77             # new
0860: 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 20   entry.         
0870: 20 20 20 73 4c 65 6d 6d 61 2c 20 73 56 74 79 70     sLemma, sVtyp
0880: 20 3d 20 73 4c 69 6e 65 2e 73 70 6c 69 74 28 22   = sLine.split("
0890: 5c 74 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  \t").           
08a0: 20 64 43 6f 6e 6a 20 3d 20 7b 20 20 20 22 3a 50   dConj = {   ":P
08b0: 51 22 3a 20 7b 20 22 3a 50 22 3a 20 22 22 2c 20  Q": { ":P": "", 
08c0: 22 3a 51 31 22 3a 20 22 22 2c 20 22 3a 51 32 22  ":Q1": "", ":Q2"
08d0: 3a 20 22 22 2c 20 22 3a 51 33 22 3a 20 22 22 2c  : "", ":Q3": "",
08e0: 20 22 3a 51 34 22 3a 20 22 22 7d 2c 0a 20 20 20   ":Q4": ""},.   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 22 3a 49 70 22 3a 20 7b 20 22 3a       ":Ip": { ":
0910: 31 73 22 3a 20 22 22 2c 20 22 3a 32 73 22 3a 20  1s": "", ":2s": 
0920: 22 22 2c 20 22 3a 33 73 22 3a 20 22 22 2c 20 22  "", ":3s": "", "
0930: 3a 31 70 22 3a 20 22 22 2c 20 22 3a 32 70 22 3a  :1p": "", ":2p":
0940: 20 22 22 2c 20 22 3a 33 70 22 3a 20 22 22 2c 20   "", ":3p": "", 
0950: 22 3a 31 c5 9b 22 3a 20 22 22 20 7d 2c 0a 20 20  ":1..": "" },.  
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 20 22 3a 49 71 22 3a 20 7b 20 22        ":Iq": { "
0980: 3a 31 73 22 3a 20 22 22 2c 20 22 3a 32 73 22 3a  :1s": "", ":2s":
0990: 20 22 22 2c 20 22 3a 33 73 22 3a 20 22 22 2c 20   "", ":3s": "", 
09a0: 22 3a 31 70 22 3a 20 22 22 2c 20 22 3a 32 70 22  ":1p": "", ":2p"
09b0: 3a 20 22 22 2c 20 22 3a 33 70 22 3a 20 22 22 20  : "", ":3p": "" 
09c0: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  },.             
09d0: 20 20 20 20 20 20 20 20 20 20 20 22 3a 49 73 22             ":Is"
09e0: 3a 20 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20 22  : { ":1s": "", "
09f0: 3a 32 73 22 3a 20 22 22 2c 20 22 3a 33 73 22 3a  :2s": "", ":3s":
0a00: 20 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20   "", ":1p": "", 
0a10: 22 3a 32 70 22 3a 20 22 22 2c 20 22 3a 33 70 22  ":2p": "", ":3p"
0a20: 3a 20 22 22 20 7d 2c 0a 20 20 20 20 20 20 20 20  : "" },.        
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 22 3a 49 66 22 3a 20 7b 20 22 3a 31 73 22 3a 20  ":If": { ":1s": 
0a50: 22 22 2c 20 22 3a 32 73 22 3a 20 22 22 2c 20 22  "", ":2s": "", "
0a60: 3a 33 73 22 3a 20 22 22 2c 20 22 3a 31 70 22 3a  :3s": "", ":1p":
0a70: 20 22 22 2c 20 22 3a 32 70 22 3a 20 22 22 2c 20   "", ":2p": "", 
0a80: 22 3a 33 70 22 3a 20 22 22 20 7d 2c 0a 20 20 20  ":3p": "" },.   
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 22 3a 4b 22 3a 20 7b 20 22 3a 31       ":K": { ":1
0ab0: 73 22 3a 20 22 22 2c 20 22 3a 32 73 22 3a 20 22  s": "", ":2s": "
0ac0: 22 2c 20 22 3a 33 73 22 3a 20 22 22 2c 20 22 3a  ", ":3s": "", ":
0ad0: 31 70 22 3a 20 22 22 2c 20 22 3a 32 70 22 3a 20  1p": "", ":2p": 
0ae0: 22 22 2c 20 22 3a 33 70 22 3a 20 22 22 20 7d 2c  "", ":3p": "" },
0af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0b00: 20 20 20 20 20 20 20 20 20 22 3a 53 70 22 3a 20           ":Sp": 
0b10: 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20 22 3a 32  { ":1s": "", ":2
0b20: 73 22 3a 20 22 22 2c 20 22 3a 33 73 22 3a 20 22  s": "", ":3s": "
0b30: 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20 22 3a  ", ":1p": "", ":
0b40: 32 70 22 3a 20 22 22 2c 20 22 3a 33 70 22 3a 20  2p": "", ":3p": 
0b50: 22 22 2c 20 22 3a 31 c5 9b 22 3a 20 22 22 20 7d  "", ":1..": "" }
0b60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0b70: 20 20 20 20 20 20 20 20 20 20 22 3a 53 71 22 3a            ":Sq":
0b80: 20 7b 20 22 3a 31 73 22 3a 20 22 22 2c 20 22 3a   { ":1s": "", ":
0b90: 32 73 22 3a 20 22 22 2c 20 22 3a 33 73 22 3a 20  2s": "", ":3s": 
0ba0: 22 22 2c 20 22 3a 31 70 22 3a 20 22 22 2c 20 22  "", ":1p": "", "
0bb0: 3a 32 70 22 3a 20 22 22 2c 20 22 3a 33 70 22 3a  :2p": "", ":3p":
0bc0: 20 22 22 2c 20 22 3a 31 c5 9b 22 3a 20 22 22 20   "", ":1..": "" 
0bd0: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  },.             
0be0: 20 20 20 20 20 20 20 20 20 20 20 22 3a 45 22 3a             ":E":
0bf0: 20 7b 20 22 3a 32 73 22 3a 20 22 22 2c 20 22 3a   { ":2s": "", ":
0c00: 31 70 22 3a 20 22 22 2c 20 22 3a 32 70 22 3a 20  1p": "", ":2p": 
0c10: 22 22 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  "" }.           
0c20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0c30: 20 20 20 20 20 20 20 69 66 20 73 56 74 79 70 20         if sVtyp 
0c40: 6e 6f 74 20 69 6e 20 6c 56 74 79 70 3a 0a 20 20  not in lVtyp:.  
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 56                dV
0c60: 74 79 70 5b 73 56 74 79 70 5d 20 3d 20 6e 56 74  typ[sVtyp] = nVt
0c70: 79 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  yp.             
0c80: 20 20 20 6c 56 74 79 70 2e 61 70 70 65 6e 64 28     lVtyp.append(
0c90: 73 56 74 79 70 29 0a 20 20 20 20 20 20 20 20 20  sVtyp).         
0ca0: 20 20 20 20 20 20 20 6e 56 74 79 70 20 2b 3d 20         nVtyp += 
0cb0: 31 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 6e  1.        elif n
0cc0: 54 61 62 20 3d 3d 20 32 3a 0a 20 20 20 20 20 20  Tab == 2:.      
0cd0: 20 20 20 20 20 20 23 20 66 6c 65 78 69 6f 6e 0a        # flexion.
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 2c 20 73              _, s
0cf0: 54 61 67 2c 20 73 46 6c 65 78 20 3d 20 73 4c 69  Tag, sFlex = sLi
0d00: 6e 65 2e 73 70 6c 69 74 28 22 5c 74 22 29 0a 20  ne.split("\t"). 
0d10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 54             if sT
0d20: 61 67 2e 63 6f 75 6e 74 28 22 20 22 29 20 3d 3d  ag.count(" ") ==
0d30: 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   0:.            
0d40: 20 20 20 20 69 66 20 73 54 61 67 20 3d 3d 20 22      if sTag == "
0d50: 70 70 72 65 22 3a 0a 20 20 20 20 20 20 20 20 20  ppre":.         
0d60: 20 20 20 20 20 20 20 20 20 20 20 64 43 6f 6e 6a             dConj
0d70: 5b 22 3a 50 51 22 5d 5b 22 3a 50 22 5d 20 3d 20  [":PQ"][":P"] = 
0d80: 64 65 66 69 6e 65 53 75 66 66 69 78 43 6f 64 65  defineSuffixCode
0d90: 28 73 4c 65 6d 6d 61 2c 20 73 46 6c 65 78 29 0a  (sLemma, sFlex).
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
0db0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0dc0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
0dd0: 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 2c             mode,
0de0: 20 67 20 3d 20 73 54 61 67 2e 73 70 6c 69 74 28   g = sTag.split(
0df0: 6d 61 78 73 70 6c 69 74 3d 31 29 0a 20 20 20 20  maxsplit=1).    
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 6d 6f 64 65 20 3d 20 64 54 72 61 64 5b 6d 6f 64  mode = dTrad[mod
0e20: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
0e30: 20 20 20 20 20 20 20 67 20 3d 20 64 54 72 61 64         g = dTrad
0e40: 5b 67 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [g].            
0e50: 20 20 20 20 20 20 20 20 69 66 20 64 43 6f 6e 6a          if dConj
0e60: 5b 6d 6f 64 65 5d 5b 67 5d 20 3d 3d 20 22 22 3a  [mode][g] == "":
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e80: 20 20 20 20 20 20 20 20 20 64 43 6f 6e 6a 5b 6d           dConj[m
0e90: 6f 64 65 5d 5b 67 5d 20 3d 20 64 65 66 69 6e 65  ode][g] = define
0ea0: 53 75 66 66 69 78 43 6f 64 65 28 73 4c 65 6d 6d  SuffixCode(sLemm
0eb0: 61 2c 20 73 46 6c 65 78 29 0a 20 20 20 20 20 20  a, sFlex).      
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
0ed0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 63 6f              # co
0ef0: 6d 6d 65 6e 74 20 67 c3 a9 72 65 72 20 6c 65 73  mment g..rer les
0f00: 20 61 75 74 72 65 73 20 67 72 61 70 68 69 65 73   autres graphies
0f10: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
0f20: 20 20 20 20 20 20 20 20 20 20 20 70 61 73 73 0a             pass.
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20  except:.        
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
0f60: 74 28 73 4c 65 6d 6d 61 2e 65 6e 63 6f 64 65 28  t(sLemma.encode(
0f70: 22 75 74 66 2d 38 22 29 2e 64 65 63 6f 64 65 28  "utf-8").decode(
0f80: 22 61 73 63 69 69 22 29 2c 20 22 20 2d 20 22 2c  "ascii"), " - ",
0f90: 20 73 54 61 67 2c 20 22 20 2d 20 6e 6f 6e 20 67   sTag, " - non g
0fa0: c3 a9 72 c3 a9 3a 20 22 2c 20 6d 6f 64 65 2c 20  ..r..: ", mode, 
0fb0: 22 20 2f 20 22 2c 20 67 29 0a 20 20 20 20 20 20  " / ", g).      
0fc0: 20 20 65 6c 69 66 20 73 4c 69 6e 65 20 3d 3d 20    elif sLine == 
0fd0: 22 24 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "$":.           
0fe0: 20 23 20 77 65 20 73 74 6f 72 65 20 74 68 65 20   # we store the 
0ff0: 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20 72 75  dictionary of ru
1000: 6c 65 73 20 66 6f 72 20 74 68 69 73 20 6c 65 6d  les for this lem
1010: 6d 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ma.            i
1020: 66 20 64 43 6f 6e 6a 5b 22 3a 49 70 22 5d 5b 22  f dConj[":Ip"]["
1030: 3a 31 c5 9b 22 5d 20 3d 3d 20 22 32 c3 a8 22 3a  :1.."] == "2..":
1040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1050: 20 64 43 6f 6e 6a 5b 22 3a 49 70 22 5d 5b 22 3a   dConj[":Ip"][":
1060: 31 c5 9b 22 5d 20 3d 20 22 32 c3 a9 22 0a 20 20  1.."] = "2..".  
1070: 20 20 20 20 20 20 20 20 20 20 65 6c 69 66 20 73            elif s
1080: 4c 65 6d 6d 61 20 3d 3d 20 22 70 6f 75 76 6f 69  Lemma == "pouvoi
1090: 72 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  r":.            
10a0: 20 20 20 20 64 43 6f 6e 6a 5b 22 3a 49 70 22 5d      dConj[":Ip"]
10b0: 5b 22 3a 31 c5 9b 22 5d 20 3d 20 22 36 75 69 73  [":1.."] = "6uis
10c0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 43  ".            lC
10d0: 6f 6e 6a 54 61 67 73 20 3d 20 5b 5d 0a 20 20 20  onjTags = [].   
10e0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 6b 65 79           for key
10f0: 20 69 6e 20 5b 22 3a 50 51 22 2c 20 22 3a 49 70   in [":PQ", ":Ip
1100: 22 2c 20 22 3a 49 71 22 2c 20 22 3a 49 73 22 2c  ", ":Iq", ":Is",
1110: 20 22 3a 49 66 22 2c 20 22 3a 4b 22 2c 20 22 3a   ":If", ":K", ":
1120: 53 70 22 2c 20 22 3a 53 71 22 2c 20 22 3a 45 22  Sp", ":Sq", ":E"
1130: 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]:.             
1140: 20 20 20 62 46 6f 75 6e 64 20 3d 20 46 61 6c 73     bFound = Fals
1150: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1160: 20 20 66 6f 72 20 69 2c 20 64 20 69 6e 20 65 6e    for i, d in en
1170: 75 6d 65 72 61 74 65 28 64 50 61 74 74 65 72 6e  umerate(dPattern
1180: 4c 69 73 74 5b 6b 65 79 5d 29 3a 0a 20 20 20 20  List[key]):.    
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 69 66 20 64 43 6f 6e 6a 5b 6b 65 79 5d 20 3d 3d  if dConj[key] ==
11b0: 20 64 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   d:.            
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 46 6f 75              bFou
11d0: 6e 64 20 3d 20 54 72 75 65 0a 20 20 20 20 20 20  nd = True.      
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 6c 43 6f 6e 6a 54 61 67 73 2e 61 70 70 65    lConjTags.appe
1200: 6e 64 28 69 29 0a 20 20 20 20 20 20 20 20 20 20  nd(i).          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1220: 65 61 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20  eak.            
1230: 20 20 20 20 69 66 20 6e 6f 74 20 62 46 6f 75 6e      if not bFoun
1240: 64 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d:.             
1250: 20 20 20 20 20 20 20 6c 43 6f 6e 6a 54 61 67 73         lConjTags
1260: 2e 61 70 70 65 6e 64 28 6c 65 6e 28 64 50 61 74  .append(len(dPat
1270: 74 65 72 6e 4c 69 73 74 5b 6b 65 79 5d 29 29 0a  ternList[key])).
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 64 50 61 74 74 65 72 6e 4c 69 73 74      dPatternList
12a0: 5b 6b 65 79 5d 2e 61 70 70 65 6e 64 28 64 43 6f  [key].append(dCo
12b0: 6e 6a 5b 6b 65 79 5d 29 0a 20 20 20 20 20 20 20  nj[key]).       
12c0: 20 20 20 20 20 74 43 6f 6e 6a 54 61 67 73 20 3d       tConjTags =
12d0: 20 74 75 70 6c 65 28 6c 43 6f 6e 6a 54 61 67 73   tuple(lConjTags
12e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ).            if
12f0: 20 74 43 6f 6e 6a 54 61 67 73 20 6e 6f 74 20 69   tConjTags not i
1300: 6e 20 6c 54 61 67 73 3a 0a 20 20 20 20 20 20 20  n lTags:.       
1310: 20 20 20 20 20 20 20 20 20 64 54 61 67 73 5b 74           dTags[t
1320: 43 6f 6e 6a 54 61 67 73 5d 20 3d 20 6e 54 61 67  ConjTags] = nTag
1330: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
1340: 20 20 6c 54 61 67 73 2e 61 70 70 65 6e 64 28 74    lTags.append(t
1350: 43 6f 6e 6a 54 61 67 73 29 0a 20 20 20 20 20 20  ConjTags).      
1360: 20 20 20 20 20 20 20 20 20 20 6e 54 61 67 73 20            nTags 
1370: 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  += 1.           
1380: 20 64 56 65 72 62 5b 73 4c 65 6d 6d 61 5d 20 3d   dVerb[sLemma] =
1390: 20 28 64 56 74 79 70 5b 73 56 74 79 70 5d 2c 20   (dVtyp[sVtyp], 
13a0: 64 54 61 67 73 5b 74 43 6f 6e 6a 54 61 67 73 5d  dTags[tConjTags]
13b0: 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a  ).        else:.
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
13d0: 74 28 22 23 20 45 72 72 6f 72 20 2d 20 75 6e 6b  t("# Error - unk
13e0: 6e 6f 77 6e 20 6c 69 6e 65 20 23 22 2c 20 6e 29  nown line #", n)
13f0: 0a 0a 20 20 20 20 23 20 63 6f 6e 76 65 72 74 20  ..    # convert 
1400: 74 75 70 6c 65 73 20 74 6f 20 62 79 74 65 73 20  tuples to bytes 
1410: 73 74 72 69 6e 67 0a 20 20 20 20 23 20 73 69 20  string.    # si 
1420: c3 a7 61 20 6d 65 72 64 65 2c 20 74 6f 75 74 65  ..a merde, toute
1430: 20 6c 61 20 70 61 72 74 69 65 20 63 6f 6e 76 65   la partie conve
1440: 72 73 69 6f 6e 20 70 65 75 74 20 c3 aa 74 72 65  rsion peut ..tre
1450: 20 73 75 70 70 72 69 6d c3 a9 65 0a 20 20 20 20   supprim..e.    
1460: 23 20 6c 42 79 74 65 73 54 61 67 73 20 3d 20 5b  # lBytesTags = [
1470: 5d 0a 20 20 20 20 23 20 66 6f 72 20 74 20 69 6e  ].    # for t in
1480: 20 6c 54 61 67 73 3a 0a 20 20 20 20 23 20 20 20   lTags:.    #   
1490: 20 20 62 20 3d 20 62 22 22 0a 20 20 20 20 23 20    b = b"".    # 
14a0: 20 20 20 20 66 6f 72 20 6e 20 69 6e 20 74 3a 0a      for n in t:.
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 69 66      #         if
14c0: 20 6e 20 3e 20 32 35 35 3a 0a 20 20 20 20 23 20   n > 255:.    # 
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
14e0: 74 28 22 45 72 72 65 75 72 20 3a 20 6c 27 69 6e  t("Erreur : l'in
14f0: 64 69 63 65 20 6e 65 20 70 65 75 74 20 c3 aa 74  dice ne peut ..t
1500: 72 65 20 73 75 70 c3 a9 72 69 65 75 72 20 c3 a0  re sup..rieur ..
1510: 20 32 35 36 20 70 6f 75 72 20 75 74 69 6c 69 73   256 pour utilis
1520: 65 72 20 64 65 73 20 63 68 61 c3 ae 6e 65 73 20  er des cha..nes 
1530: 64 27 6f 63 74 65 74 73 20 28 62 79 74 65 73 20  d'octets (bytes 
1540: 73 74 72 69 6e 67 73 29 22 29 0a 20 20 20 20 23  strings)").    #
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69               exi
1560: 74 28 29 0a 20 20 20 20 23 20 20 20 20 20 20 20  t().    #       
1570: 20 20 62 20 2b 3d 20 6e 2e 74 6f 5f 62 79 74 65    b += n.to_byte
1580: 73 28 31 2c 20 62 79 74 65 6f 72 64 65 72 3d 22  s(1, byteorder="
1590: 62 69 67 22 29 0a 20 20 20 20 23 20 20 20 20 20  big").    #     
15a0: 6c 42 79 74 65 73 54 61 67 73 2e 61 70 70 65 6e  lBytesTags.appen
15b0: 64 28 62 29 0a 20 20 20 20 23 20 6c 54 61 67 73  d(b).    # lTags
15c0: 20 3d 20 6c 42 79 74 65 73 54 61 67 73 0a 0a 20   = lBytesTags.. 
15d0: 20 20 20 23 20 66 6f 72 20 6b 65 79 20 69 6e 20     # for key in 
15e0: 64 56 65 72 62 2e 6b 65 79 73 28 29 3a 0a 20 20  dVerb.keys():.  
15f0: 20 20 23 20 20 20 20 20 62 20 3d 20 62 22 22 0a    #     b = b"".
1600: 20 20 20 20 23 20 20 20 20 20 66 6f 72 20 6e 20      #     for n 
1610: 69 6e 20 64 56 65 72 62 5b 6b 65 79 5d 3a 0a 20  in dVerb[key]:. 
1620: 20 20 20 23 20 20 20 20 20 20 20 20 20 69 66 20     #         if 
1630: 6e 20 3e 20 32 35 35 3a 0a 20 20 20 20 23 20 20  n > 255:.    #  
1640: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1650: 28 22 45 72 72 65 75 72 20 3a 20 6c 27 69 6e 64  ("Erreur : l'ind
1660: 69 63 65 20 6e 65 20 70 65 75 74 20 c3 aa 74 72  ice ne peut ..tr
1670: 65 20 73 75 70 c3 a9 72 69 65 75 72 20 c3 a0 20  e sup..rieur .. 
1680: 32 35 36 20 70 6f 75 72 20 75 74 69 6c 69 73 65  256 pour utilise
1690: 72 20 64 65 73 20 63 68 61 c3 ae 6e 65 73 20 64  r des cha..nes d
16a0: 27 6f 63 74 65 74 73 20 28 62 79 74 65 73 20 73  'octets (bytes s
16b0: 74 72 69 6e 67 73 29 22 29 0a 20 20 20 20 23 20  trings)").    # 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74              exit
16d0: 28 29 0a 20 20 20 20 23 20 20 20 20 20 20 20 20  ().    #        
16e0: 20 62 20 2b 3d 20 6e 2e 74 6f 5f 62 79 74 65 73   b += n.to_bytes
16f0: 28 31 2c 20 62 79 74 65 6f 72 64 65 72 3d 22 62  (1, byteorder="b
1700: 69 67 22 29 0a 20 20 20 20 23 20 20 20 20 20 64  ig").    #     d
1710: 56 65 72 62 5b 6b 65 79 5d 20 3d 20 62 0a 20 20  Verb[key] = b.  
1720: 20 20 23 20 65 6e 64 20 63 6f 6e 76 65 72 73 69    # end conversi
1730: 6f 6e 0a 0a 0a 20 20 20 20 23 23 20 77 72 69 74  on...    ## writ
1740: 65 20 66 69 6c 65 20 66 6f 72 20 50 79 74 68 6f  e file for Pytho
1750: 6e 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 22 23  n.    sCode = "#
1760: 23 20 67 65 6e 65 72 61 74 65 64 20 64 61 74 61  # generated data
1770: 20 28 64 6f 20 6e 6f 74 20 65 64 69 74 29 5c 6e   (do not edit)\n
1780: 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  \n" + \.        
1790: 20 20 20 20 22 23 20 49 6e 66 6f 72 6d 61 74 69      "# Informati
17a0: 6f 6e 73 20 61 62 6f 75 74 20 76 65 72 62 73 5c  ons about verbs\
17b0: 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20  n" + \.         
17c0: 20 20 20 22 6c 56 74 79 70 20 3d 20 22 20 2b 20     "lVtyp = " + 
17d0: 73 74 72 28 6c 56 74 79 70 29 20 2b 20 22 5c 6e  str(lVtyp) + "\n
17e0: 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  \n" + \.        
17f0: 20 20 20 20 22 23 20 69 6e 64 65 78 65 73 20 6f      "# indexes o
1800: 66 20 74 65 6e 73 65 73 20 69 6e 20 5f 64 50 61  f tenses in _dPa
1810: 74 74 65 72 6e 43 6f 6e 6a 5c 6e 22 20 2b 20 5c  tternConj\n" + \
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 54  .            "lT
1830: 61 67 73 20 3d 20 22 20 2b 20 73 74 72 28 6c 54  ags = " + str(lT
1840: 61 67 73 29 20 2b 20 22 5c 6e 5c 6e 22 20 2b 20  ags) + "\n\n" + 
1850: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 23  \.            "#
1860: 20 6c 69 73 74 73 20 6f 66 20 61 66 66 69 78 20   lists of affix 
1870: 63 6f 64 65 73 20 74 6f 20 67 65 6e 65 72 61 74  codes to generat
1880: 65 20 69 6e 66 6c 65 63 74 65 64 20 66 6f 72 6d  e inflected form
1890: 73 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20  s\n" + \.       
18a0: 20 20 20 20 20 22 64 50 61 74 74 65 72 6e 43 6f       "dPatternCo
18b0: 6e 6a 20 3d 20 22 20 2b 20 73 74 72 28 64 50 61  nj = " + str(dPa
18c0: 74 74 65 72 6e 4c 69 73 74 29 20 2b 20 22 5c 6e  tternList) + "\n
18d0: 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  \n" + \.        
18e0: 20 20 20 20 22 23 20 64 69 63 74 69 6f 6e 61 72      "# dictionar
18f0: 79 20 6f 66 20 76 65 72 62 73 20 3a 20 28 69 6e  y of verbs : (in
1900: 64 65 78 20 6f 66 20 56 74 79 70 2c 20 69 6e 64  dex of Vtyp, ind
1910: 65 78 20 6f 66 20 54 61 67 73 29 5c 6e 22 20 2b  ex of Tags)\n" +
1920: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   \.            "
1930: 64 56 65 72 62 20 3d 20 22 20 2b 20 73 74 72 28  dVerb = " + str(
1940: 64 56 65 72 62 29 20 2b 20 22 5c 6e 22 0a 20 20  dVerb) + "\n".  
1950: 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f 64 75    open(sp+"/modu
1960: 6c 65 73 2f 63 6f 6e 6a 5f 64 61 74 61 2e 70 79  les/conj_data.py
1970: 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67  ", "w", encoding
1980: 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e  ="utf-8", newlin
1990: 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 43  e="\n").write(sC
19a0: 6f 64 65 29 0a 0a 20 20 20 20 69 66 20 62 4a 53  ode)..    if bJS
19b0: 3a 0a 20 20 20 20 20 20 20 20 23 23 20 77 72 69  :.        ## wri
19c0: 74 65 20 66 69 6c 65 20 66 6f 72 20 4a 61 76 61  te file for Java
19d0: 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 77  Script.        w
19e0: 69 74 68 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f  ith open(sp+"/mo
19f0: 64 75 6c 65 73 2d 6a 73 2f 63 6f 6e 6a 5f 64 61  dules-js/conj_da
1a00: 74 61 2e 6a 73 6f 6e 22 2c 20 22 77 22 2c 20 65  ta.json", "w", e
1a10: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c  ncoding="utf-8",
1a20: 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 20 61   newline="\n") a
1a30: 73 20 68 44 73 74 3a 0a 20 20 20 20 20 20 20 20  s hDst:.        
1a40: 20 20 20 20 68 44 73 74 2e 77 72 69 74 65 28 22      hDst.write("
1a50: 7b 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 20 20  {\n").          
1a60: 20 20 68 44 73 74 2e 77 72 69 74 65 28 27 20 20    hDst.write('  
1a70: 20 20 22 6c 56 74 79 70 22 3a 20 27 20 2b 20 6a    "lVtyp": ' + j
1a80: 73 6f 6e 2e 64 75 6d 70 73 28 6c 56 74 79 70 2c  son.dumps(lVtyp,
1a90: 20 65 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61   ensure_ascii=Fa
1aa0: 6c 73 65 29 20 2b 20 22 2c 5c 6e 22 29 0a 20 20  lse) + ",\n").  
1ab0: 20 20 20 20 20 20 20 20 20 20 68 44 73 74 2e 77            hDst.w
1ac0: 72 69 74 65 28 27 20 20 20 20 22 6c 54 61 67 73  rite('    "lTags
1ad0: 22 3a 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70  ": ' + json.dump
1ae0: 73 28 6c 54 61 67 73 2c 20 65 6e 73 75 72 65 5f  s(lTags, ensure_
1af0: 61 73 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22  ascii=False) + "
1b00: 2c 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 20 20  ,\n").          
1b10: 20 20 68 44 73 74 2e 77 72 69 74 65 28 27 20 20    hDst.write('  
1b20: 20 20 22 64 50 61 74 74 65 72 6e 43 6f 6e 6a 22    "dPatternConj"
1b30: 3a 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73  : ' + json.dumps
1b40: 28 64 50 61 74 74 65 72 6e 4c 69 73 74 2c 20 65  (dPatternList, e
1b50: 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73  nsure_ascii=Fals
1b60: 65 29 20 2b 20 22 2c 5c 6e 22 29 0a 20 20 20 20  e) + ",\n").    
1b70: 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69          hDst.wri
1b80: 74 65 28 27 20 20 20 20 22 64 56 65 72 62 22 3a  te('    "dVerb":
1b90: 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73 28   ' + json.dumps(
1ba0: 64 56 65 72 62 2c 20 65 6e 73 75 72 65 5f 61 73  dVerb, ensure_as
1bb0: 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22 5c 6e  cii=False) + "\n
1bc0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ").            h
1bd0: 44 73 74 2e 77 72 69 74 65 28 22 7d 5c 6e 22 29  Dst.write("}\n")
1be0: 0a 0a 0a 64 65 66 20 6d 61 6b 65 4d 66 73 70 20  ...def makeMfsp 
1bf0: 28 73 70 2c 20 62 4a 53 3d 46 61 6c 73 65 29 3a  (sp, bJS=False):
1c00: 0a 20 20 20 20 70 72 69 6e 74 28 22 3e 20 50 6c  .    print("> Pl
1c10: 75 72 69 65 6c 2f 73 69 6e 67 75 6c 69 65 72 2f  uriel/singulier/
1c20: 6d 61 73 63 75 6c 69 6e 2f 66 c3 a9 6d 69 6e 69  masculin/f..mini
1c30: 6e 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20  n ", end="").   
1c40: 20 70 72 69 6e 74 28 22 28 50 79 74 68 6f 6e 20   print("(Python 
1c50: 65 74 20 4a 61 76 61 53 63 72 69 70 74 29 22 20  et JavaScript)" 
1c60: 20 69 66 20 62 4a 53 20 20 65 6c 73 65 20 22 28   if bJS  else "(
1c70: 50 79 74 68 6f 6e 20 73 65 75 6c 65 6d 65 6e 74  Python seulement
1c80: 29 22 29 0a 20 20 20 20 61 50 6c 75 72 53 20 3d  )").    aPlurS =
1c90: 20 73 65 74 28 29 0a 20 20 20 20 64 54 61 67 20   set().    dTag 
1ca0: 3d 20 7b 7d 0a 20 20 20 20 6c 54 61 67 4d 61 73  = {}.    lTagMas
1cb0: 46 6f 72 6d 20 3d 20 5b 5d 0a 20 20 20 20 6c 54  Form = [].    lT
1cc0: 61 67 4d 69 73 63 50 6c 75 72 20 3d 20 5b 5d 0a  agMiscPlur = [].
1cd0: 20 20 20 20 64 4d 69 73 63 50 6c 75 72 20 3d 20      dMiscPlur = 
1ce0: 7b 7d 0a 20 20 20 20 64 4d 61 73 46 6f 72 6d 20  {}.    dMasForm 
1cf0: 3d 20 7b 7d 0a 20 20 20 20 6c 54 61 67 20 3d 20  = {}.    lTag = 
1d00: 5b 5d 0a 20 20 20 20 6c 54 61 67 4d 61 73 50 6c  [].    lTagMasPl
1d10: 20 3d 20 5b 5d 0a 20 20 20 20 66 6f 72 20 6e 2c   = [].    for n,
1d20: 20 73 4c 69 6e 65 20 69 6e 20 65 6e 75 6d 65 72   sLine in enumer
1d30: 61 74 65 28 72 65 61 64 46 69 6c 65 28 73 70 2b  ate(readFile(sp+
1d40: 22 2f 64 61 74 61 2f 64 69 63 74 44 65 63 6c 2e  "/data/dictDecl.
1d50: 74 78 74 22 29 29 3a 0a 20 20 20 20 20 20 20 20  txt")):.        
1d60: 6e 54 61 62 20 3d 20 73 4c 69 6e 65 2e 63 6f 75  nTab = sLine.cou
1d70: 6e 74 28 22 5c 74 22 29 0a 20 20 20 20 20 20 20  nt("\t").       
1d80: 20 69 66 20 6e 54 61 62 20 3d 3d 20 31 3a 0a 20   if nTab == 1:. 
1d90: 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 65 77             # new
1da0: 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 20   entry.         
1db0: 20 20 20 6c 54 61 67 2e 63 6c 65 61 72 28 29 0a     lTag.clear().
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 61 67              lTag
1dd0: 4d 61 73 50 6c 2e 63 6c 65 61 72 28 29 0a 20 20  MasPl.clear().  
1de0: 20 20 20 20 20 20 20 20 20 20 73 4c 65 6d 6d 61            sLemma
1df0: 2c 20 73 46 6c 61 67 73 20 3d 20 73 4c 69 6e 65  , sFlags = sLine
1e00: 2e 73 70 6c 69 74 28 22 5c 74 22 29 0a 20 20 20  .split("\t").   
1e10: 20 20 20 20 20 20 20 20 20 69 66 20 73 46 6c 61           if sFla
1e20: 67 73 2e 73 74 61 72 74 73 77 69 74 68 28 22 53  gs.startswith("S
1e30: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
1e40: 20 20 20 20 63 54 79 70 65 20 3d 20 22 73 22 0a      cType = "s".
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66              elif
1e60: 20 73 46 6c 61 67 73 2e 73 74 61 72 74 73 77 69   sFlags.startswi
1e70: 74 68 28 22 58 22 29 3a 0a 20 20 20 20 20 20 20  th("X"):.       
1e80: 20 20 20 20 20 20 20 20 20 63 54 79 70 65 20 3d           cType =
1e90: 20 22 70 22 0a 20 20 20 20 20 20 20 20 20 20 20   "p".           
1ea0: 20 65 6c 69 66 20 73 46 6c 61 67 73 2e 73 74 61   elif sFlags.sta
1eb0: 72 74 73 77 69 74 68 28 22 41 22 29 3a 0a 20 20  rtswith("A"):.  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 54                cT
1ed0: 79 70 65 20 3d 20 22 70 22 0a 20 20 20 20 20 20  ype = "p".      
1ee0: 20 20 20 20 20 20 65 6c 69 66 20 73 46 6c 61 67        elif sFlag
1ef0: 73 2e 73 74 61 72 74 73 77 69 74 68 28 22 49 22  s.startswith("I"
1f00: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
1f10: 20 20 20 63 54 79 70 65 20 3d 20 22 70 22 0a 20     cType = "p". 
1f20: 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66 20             elif 
1f30: 73 46 6c 61 67 73 2e 73 74 61 72 74 73 77 69 74  sFlags.startswit
1f40: 68 28 22 46 22 29 3a 0a 20 20 20 20 20 20 20 20  h("F"):.        
1f50: 20 20 20 20 20 20 20 20 63 54 79 70 65 20 3d 20          cType = 
1f60: 22 6d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  "m".            
1f70: 65 6c 69 66 20 73 46 6c 61 67 73 2e 73 74 61 72  elif sFlags.star
1f80: 74 73 77 69 74 68 28 22 57 22 29 3a 0a 20 20 20  tswith("W"):.   
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 54 79               cTy
1fa0: 70 65 20 3d 20 22 6d 22 0a 20 20 20 20 20 20 20  pe = "m".       
1fb0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1fc0: 20 20 20 20 20 20 20 20 20 20 20 63 54 79 70 65             cType
1fd0: 20 3d 20 22 3f 22 0a 20 20 20 20 20 20 20 20 20   = "?".         
1fe0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 20 3e         print(" >
1ff0: 20 69 6e 63 6f 6e 6e 75 20 3a 20 22 20 2b 20 73   inconnu : " + s
2000: 46 6c 61 67 73 29 0a 20 20 20 20 20 20 20 20 65  Flags).        e
2010: 6c 69 66 20 6e 54 61 62 20 3d 3d 20 32 3a 0a 20  lif nTab == 2:. 
2020: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63 54             if cT
2030: 79 70 65 20 3d 3d 20 22 73 22 3a 0a 20 20 20 20  ype == "s":.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2050: 69 6e 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  inue.           
2060: 20 5f 2c 20 73 46 6c 65 78 54 61 67 73 2c 20 73   _, sFlexTags, s
2070: 46 6c 65 78 20 3d 20 73 4c 69 6e 65 2e 73 70 6c  Flex = sLine.spl
2080: 69 74 28 22 5c 74 22 29 0a 20 20 20 20 20 20 20  it("\t").       
2090: 20 20 20 20 20 69 66 20 63 54 79 70 65 20 3d 3d       if cType ==
20a0: 20 22 70 22 3a 0a 20 20 20 20 20 20 20 20 20 20   "p":.          
20b0: 20 20 20 20 20 20 69 66 20 73 46 6c 65 78 54 61        if sFlexTa
20c0: 67 73 2e 65 6e 64 73 77 69 74 68 28 22 70 6c 22  gs.endswith("pl"
20d0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
20e0: 20 20 20 20 20 20 20 6c 54 61 67 2e 61 70 70 65         lTag.appe
20f0: 6e 64 28 64 65 66 69 6e 65 53 75 66 66 69 78 43  nd(defineSuffixC
2100: 6f 64 65 28 73 4c 65 6d 6d 61 2c 20 73 46 6c 65  ode(sLemma, sFle
2110: 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  x)).            
2120: 65 6c 69 66 20 63 54 79 70 65 20 3d 3d 20 22 6d  elif cType == "m
2130: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
2140: 20 20 20 69 66 20 73 46 6c 65 78 54 61 67 73 2e     if sFlexTags.
2150: 65 6e 64 73 77 69 74 68 28 22 6d 61 73 20 73 67  endswith("mas sg
2160: 22 29 20 6f 72 20 73 46 6c 65 78 54 61 67 73 2e  ") or sFlexTags.
2170: 65 6e 64 73 77 69 74 68 28 22 6d 61 73 20 69 6e  endswith("mas in
2180: 76 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  v"):.           
2190: 20 20 20 20 20 20 20 20 20 6c 54 61 67 2e 61 70           lTag.ap
21a0: 70 65 6e 64 28 64 65 66 69 6e 65 53 75 66 66 69  pend(defineSuffi
21b0: 78 43 6f 64 65 28 73 4c 65 6d 6d 61 2c 20 73 46  xCode(sLemma, sF
21c0: 6c 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  lex)).          
21d0: 20 20 20 20 20 20 69 66 20 73 46 6c 65 78 54 61        if sFlexTa
21e0: 67 73 2e 65 6e 64 73 77 69 74 68 28 22 6d 61 73  gs.endswith("mas
21f0: 20 70 6c 22 29 3a 0a 20 20 20 20 20 20 20 20 20   pl"):.         
2200: 20 20 20 20 20 20 20 20 20 20 20 6c 54 61 67 4d             lTagM
2210: 61 73 50 6c 2e 61 70 70 65 6e 64 28 64 65 66 69  asPl.append(defi
2220: 6e 65 53 75 66 66 69 78 43 6f 64 65 28 73 4c 65  neSuffixCode(sLe
2230: 6d 6d 61 2c 20 73 46 6c 65 78 29 29 0a 20 20 20  mma, sFlex)).   
2240: 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20           else:. 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2260: 72 69 6e 74 28 22 65 72 72 65 75 72 3a 20 22 20  rint("erreur: " 
2270: 2b 20 63 54 79 70 65 29 0a 20 20 20 20 20 20 20  + cType).       
2280: 20 65 6c 69 66 20 73 4c 69 6e 65 20 3d 3d 20 22   elif sLine == "
2290: 24 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  $":.            
22a0: 69 66 20 63 54 79 70 65 20 3d 3d 20 22 73 22 3a  if cType == "s":
22b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c0: 20 61 50 6c 75 72 53 2e 61 64 64 28 73 4c 65 6d   aPlurS.add(sLem
22d0: 6d 61 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma).            
22e0: 65 6c 69 66 20 63 54 79 70 65 20 3d 3d 20 22 70  elif cType == "p
22f0: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
2300: 20 20 20 73 54 61 67 20 3d 20 22 7c 22 2e 6a 6f     sTag = "|".jo
2310: 69 6e 28 6c 54 61 67 29 0a 20 20 20 20 20 20 20  in(lTag).       
2320: 20 20 20 20 20 20 20 20 20 69 66 20 73 54 61 67           if sTag
2330: 20 6e 6f 74 20 69 6e 20 64 54 61 67 3a 0a 20 20   not in dTag:.  
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 64 54 61 67 5b 73 54 61 67 5d 20 3d 20 6c    dTag[sTag] = l
2360: 65 6e 28 6c 54 61 67 4d 69 73 63 50 6c 75 72 29  en(lTagMiscPlur)
2370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2380: 20 20 20 20 20 6c 54 61 67 4d 69 73 63 50 6c 75       lTagMiscPlu
2390: 72 2e 61 70 70 65 6e 64 28 73 54 61 67 29 0a 20  r.append(sTag). 
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
23b0: 4d 69 73 63 50 6c 75 72 5b 73 4c 65 6d 6d 61 5d  MiscPlur[sLemma]
23c0: 20 3d 20 64 54 61 67 5b 73 54 61 67 5d 0a 20 20   = dTag[sTag].  
23d0: 20 20 20 20 20 20 20 20 20 20 65 6c 69 66 20 63            elif c
23e0: 54 79 70 65 20 3d 3d 20 22 6d 22 3a 0a 20 20 20  Type == "m":.   
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54 61               sTa
2400: 67 20 3d 20 22 7c 22 2e 6a 6f 69 6e 28 6c 54 61  g = "|".join(lTa
2410: 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g).             
2420: 20 20 20 69 66 20 6c 54 61 67 4d 61 73 50 6c 3a     if lTagMasPl:
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2440: 20 20 20 20 20 73 54 61 67 20 2b 3d 20 22 2f 22       sTag += "/"
2450: 20 2b 20 22 7c 22 2e 6a 6f 69 6e 28 6c 54 61 67   + "|".join(lTag
2460: 4d 61 73 50 6c 29 0a 20 20 20 20 20 20 20 20 20  MasPl).         
2470: 20 20 20 20 20 20 20 69 66 20 73 54 61 67 20 6e         if sTag n
2480: 6f 74 20 69 6e 20 64 54 61 67 3a 0a 20 20 20 20  ot in dTag:.    
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 64 54 61 67 5b 73 54 61 67 5d 20 3d 20 6c 65 6e  dTag[sTag] = len
24b0: 28 6c 54 61 67 4d 61 73 46 6f 72 6d 29 0a 20 20  (lTagMasForm).  
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 6c 54 61 67 4d 61 73 46 6f 72 6d 2e 61 70    lTagMasForm.ap
24e0: 70 65 6e 64 28 73 54 61 67 29 0a 20 20 20 20 20  pend(sTag).     
24f0: 20 20 20 20 20 20 20 20 20 20 20 64 4d 61 73 46             dMasF
2500: 6f 72 6d 5b 73 4c 65 6d 6d 61 5d 20 3d 20 64 54  orm[sLemma] = dT
2510: 61 67 5b 73 54 61 67 5d 0a 20 20 20 20 20 20 20  ag[sTag].       
2520: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
2530: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
2540: 28 22 75 6e 6b 6e 6f 77 6e 20 74 61 67 3a 20 22  ("unknown tag: "
2550: 20 2b 20 63 74 79 70 65 29 0a 20 20 20 20 20 20   + ctype).      
2560: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
2570: 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72      print("# Err
2580: 6f 72 20 2d 20 75 6e 6b 6e 6f 77 6e 20 6c 69 6e  or - unknown lin
2590: 65 20 23 22 2c 20 6e 29 0a 0a 20 20 20 20 23 23  e #", n)..    ##
25a0: 20 77 72 69 74 65 20 66 69 6c 65 20 66 6f 72 20   write file for 
25b0: 50 79 74 68 6f 6e 0a 20 20 20 20 73 43 6f 64 65  Python.    sCode
25c0: 20 3d 20 22 23 20 67 65 6e 65 72 61 74 65 64 20   = "# generated 
25d0: 64 61 74 61 20 28 64 6f 20 6e 6f 74 20 65 64 69  data (do not edi
25e0: 74 29 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20 20 20  t)\n\n" + \.    
25f0: 20 20 20 20 20 20 20 20 22 23 20 6c 69 73 74 20          "# list 
2600: 6f 66 20 61 66 66 69 78 20 63 6f 64 65 73 5c 6e  of affix codes\n
2610: 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  " + \.          
2620: 20 20 22 6c 54 61 67 4d 69 73 63 50 6c 75 72 20    "lTagMiscPlur 
2630: 3d 20 22 20 2b 20 73 74 72 28 6c 54 61 67 4d 69  = " + str(lTagMi
2640: 73 63 50 6c 75 72 29 20 2b 20 22 5c 6e 22 20 2b  scPlur) + "\n" +
2650: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   \.            "
2660: 6c 54 61 67 4d 61 73 46 6f 72 6d 20 3d 20 22 20  lTagMasForm = " 
2670: 2b 20 73 74 72 28 6c 54 61 67 4d 61 73 46 6f 72  + str(lTagMasFor
2680: 6d 29 20 2b 20 22 5c 6e 5c 6e 22 20 2b 20 5c 0a  m) + "\n\n" + \.
2690: 20 20 20 20 20 20 20 20 20 20 20 20 22 23 20 64              "# d
26a0: 69 63 74 69 6f 6e 61 72 79 20 6f 66 20 77 6f 72  ictionary of wor
26b0: 64 73 20 77 69 74 68 20 75 6e 63 6f 6d 6d 6f 6e  ds with uncommon
26c0: 20 70 6c 75 72 61 6c 73 20 28 2d 78 2c 20 2d 75   plurals (-x, -u
26d0: 78 2c 20 65 6e 67 6c 69 73 68 2c 20 6c 61 74 69  x, english, lati
26e0: 6e 20 61 6e 64 20 69 74 61 6c 69 61 6e 20 70 6c  n and italian pl
26f0: 75 72 61 6c 73 29 20 61 6e 64 20 74 61 67 73 20  urals) and tags 
2700: 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 6d  to generate them
2710: 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  \n" + \.        
2720: 20 20 20 20 22 64 4d 69 73 63 50 6c 75 72 20 3d      "dMiscPlur =
2730: 20 22 20 2b 20 73 74 72 28 64 4d 69 73 63 50 6c   " + str(dMiscPl
2740: 75 72 29 20 2b 20 22 5c 6e 5c 6e 22 20 2b 20 5c  ur) + "\n\n" + \
2750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 23 20  .            "# 
2760: 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20 66 65  dictionary of fe
2770: 6d 69 6e 69 6e 65 20 66 6f 72 6d 73 20 61 6e 64  minine forms and
2780: 20 74 61 67 73 20 74 6f 20 67 65 6e 65 72 61 74   tags to generat
2790: 65 20 6d 61 73 63 75 6c 69 6e 65 20 66 6f 72 6d  e masculine form
27a0: 73 20 28 73 69 6e 67 75 6c 61 72 20 61 6e 64 20  s (singular and 
27b0: 70 6c 75 72 61 6c 29 5c 6e 22 20 2b 20 5c 0a 20  plural)\n" + \. 
27c0: 20 20 20 20 20 20 20 20 20 20 20 22 64 4d 61 73             "dMas
27d0: 46 6f 72 6d 20 3d 20 22 20 2b 20 73 74 72 28 64  Form = " + str(d
27e0: 4d 61 73 46 6f 72 6d 29 20 2b 20 22 5c 6e 22 0a  MasForm) + "\n".
27f0: 20 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f      open(sp+"/mo
2800: 64 75 6c 65 73 2f 6d 66 73 70 5f 64 61 74 61 2e  dules/mfsp_data.
2810: 70 79 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69  py", "w", encodi
2820: 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c  ng="utf-8", newl
2830: 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28  ine="\n").write(
2840: 73 43 6f 64 65 29 0a 0a 20 20 20 20 69 66 20 62  sCode)..    if b
2850: 4a 53 3a 0a 20 20 20 20 20 20 20 20 23 23 20 77  JS:.        ## w
2860: 72 69 74 65 20 66 69 6c 65 20 66 6f 72 20 4a 61  rite file for Ja
2870: 76 61 53 63 72 69 70 74 0a 20 20 20 20 20 20 20  vaScript.       
2880: 20 73 43 6f 64 65 20 3d 20 27 7b 5c 6e 27 20 2b   sCode = '{\n' +
2890: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
28a0: 20 20 20 27 20 20 20 20 22 6c 54 61 67 4d 69 73     '    "lTagMis
28b0: 63 50 6c 75 72 22 3a 20 27 20 2b 20 20 6a 73 6f  cPlur": ' +  jso
28c0: 6e 2e 64 75 6d 70 73 28 6c 54 61 67 4d 69 73 63  n.dumps(lTagMisc
28d0: 50 6c 75 72 2c 20 65 6e 73 75 72 65 5f 61 73 63  Plur, ensure_asc
28e0: 69 69 3d 46 61 6c 73 65 29 20 2b 20 22 2c 5c 6e  ii=False) + ",\n
28f0: 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  " + \.          
2900: 20 20 20 20 20 20 27 20 20 20 20 22 6c 54 61 67        '    "lTag
2910: 4d 61 73 46 6f 72 6d 22 3a 20 27 20 2b 20 20 6a  MasForm": ' +  j
2920: 73 6f 6e 2e 64 75 6d 70 73 28 6c 54 61 67 4d 61  son.dumps(lTagMa
2930: 73 46 6f 72 6d 2c 20 65 6e 73 75 72 65 5f 61 73  sForm, ensure_as
2940: 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22 2c 5c  cii=False) + ",\
2950: 6e 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20  n" + \.         
2960: 20 20 20 20 20 20 20 27 20 20 20 20 22 64 4d 69         '    "dMi
2970: 73 63 50 6c 75 72 22 3a 20 27 20 2b 20 20 6a 73  scPlur": ' +  js
2980: 6f 6e 2e 64 75 6d 70 73 28 64 4d 69 73 63 50 6c  on.dumps(dMiscPl
2990: 75 72 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69  ur, ensure_ascii
29a0: 3d 46 61 6c 73 65 29 20 2b 20 22 2c 5c 6e 22 20  =False) + ",\n" 
29b0: 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  + \.            
29c0: 20 20 20 20 27 20 20 20 20 22 64 4d 61 73 46 6f      '    "dMasFo
29d0: 72 6d 22 3a 20 27 20 2b 20 20 6a 73 6f 6e 2e 64  rm": ' +  json.d
29e0: 75 6d 70 73 28 64 4d 61 73 46 6f 72 6d 2c 20 65  umps(dMasForm, e
29f0: 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73  nsure_ascii=Fals
2a00: 65 29 20 2b 20 22 5c 6e 7d 22 0a 20 20 20 20 20  e) + "\n}".     
2a10: 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f 64     open(sp+"/mod
2a20: 75 6c 65 73 2d 6a 73 2f 6d 66 73 70 5f 64 61 74  ules-js/mfsp_dat
2a30: 61 2e 6a 73 6f 6e 22 2c 20 22 77 22 2c 20 65 6e  a.json", "w", en
2a40: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20  coding="utf-8", 
2a50: 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77 72  newline="\n").wr
2a60: 69 74 65 28 73 43 6f 64 65 29 0a 0a 0a 64 65 66  ite(sCode)...def
2a70: 20 6d 61 6b 65 50 68 6f 6e 65 74 54 61 62 6c 65   makePhonetTable
2a80: 20 28 73 70 2c 20 62 4a 53 3d 46 61 6c 73 65 29   (sp, bJS=False)
2a90: 3a 0a 20 20 20 20 70 72 69 6e 74 28 22 3e 20 43  :.    print("> C
2aa0: 6f 72 72 65 73 70 6f 6e 64 61 6e 63 65 73 20 70  orrespondances p
2ab0: 68 6f 6e c3 a9 74 69 71 75 65 73 20 22 2c 20 65  hon..tiques ", e
2ac0: 6e 64 3d 22 22 29 0a 20 20 20 20 70 72 69 6e 74  nd="").    print
2ad0: 28 22 28 50 79 74 68 6f 6e 20 65 74 20 4a 61 76  ("(Python et Jav
2ae0: 61 53 63 72 69 70 74 29 22 20 20 69 66 20 62 4a  aScript)"  if bJ
2af0: 53 20 20 65 6c 73 65 20 22 28 50 79 74 68 6f 6e  S  else "(Python
2b00: 20 73 65 75 6c 65 6d 65 6e 74 29 22 29 0a 20 20   seulement)").  
2b10: 20 20 0a 20 20 20 20 69 6d 70 6f 72 74 20 67 63    .    import gc
2b20: 5f 6c 61 6e 67 2e 66 72 2e 6d 6f 64 75 6c 65 73  _lang.fr.modules
2b30: 2e 63 6f 6e 6a 20 61 73 20 63 6f 6e 6a 0a 0a 20  .conj as conj.. 
2b40: 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20     try:.        
2b50: 6f 44 69 63 74 20 3d 20 69 62 64 61 77 67 2e 49  oDict = ibdawg.I
2b60: 42 44 41 57 47 28 22 66 72 2e 62 64 69 63 22 29  BDAWG("fr.bdic")
2b70: 0a 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20  .    except:.   
2b80: 20 20 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70       traceback.p
2b90: 72 69 6e 74 5f 65 78 63 28 29 0a 20 20 20 20 20  rint_exc().     
2ba0: 20 20 20 72 65 74 75 72 6e 0a 0a 20 20 20 20 23     return..    #
2bb0: 20 73 65 74 20 6f 66 20 68 6f 6d 6f 70 68 6f 6e   set of homophon
2bc0: 69 63 20 77 6f 72 64 73 0a 20 20 20 20 6c 53 65  ic words.    lSe
2bd0: 74 20 3d 20 5b 5d 0a 20 20 20 20 66 6f 72 20 73  t = [].    for s
2be0: 4c 69 6e 65 20 69 6e 20 72 65 61 64 46 69 6c 65  Line in readFile
2bf0: 28 73 70 2b 22 2f 64 61 74 61 2f 70 68 6f 6e 65  (sp+"/data/phone
2c00: 74 5f 73 69 6d 69 6c 2e 74 78 74 22 29 3a 0a 20  t_simil.txt"):. 
2c10: 20 20 20 20 20 20 20 6c 57 6f 72 64 20 3d 20 73         lWord = s
2c20: 4c 69 6e 65 2e 73 70 6c 69 74 28 29 0a 20 20 20  Line.split().   
2c30: 20 20 20 20 20 61 4d 6f 72 65 20 3d 20 73 65 74       aMore = set
2c40: 28 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73  ().        for s
2c50: 57 6f 72 64 20 69 6e 20 6c 57 6f 72 64 3a 0a 20  Word in lWord:. 
2c60: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 57             if sW
2c70: 6f 72 64 2e 65 6e 64 73 77 69 74 68 28 22 65 72  ord.endswith("er
2c80: 22 29 20 61 6e 64 20 63 6f 6e 6a 2e 69 73 56 65  ") and conj.isVe
2c90: 72 62 28 73 57 6f 72 64 29 3a 0a 20 20 20 20 20  rb(sWord):.     
2ca0: 20 20 20 20 20 20 20 20 20 20 20 61 4d 6f 72 65             aMore
2cb0: 20 3d 20 61 4d 6f 72 65 2e 75 6e 69 6f 6e 28 63   = aMore.union(c
2cc0: 6f 6e 6a 2e 67 65 74 43 6f 6e 6a 53 69 6d 69 6c  onj.getConjSimil
2cd0: 49 6e 66 69 56 31 28 73 57 6f 72 64 29 29 0a 20  InfiV1(sWord)). 
2ce0: 20 20 20 20 20 20 20 6c 57 6f 72 64 2e 65 78 74         lWord.ext
2cf0: 65 6e 64 28 6c 69 73 74 28 61 4d 6f 72 65 29 29  end(list(aMore))
2d00: 0a 20 20 20 20 20 20 20 20 6c 53 65 74 2e 61 70  .        lSet.ap
2d10: 70 65 6e 64 28 73 6f 72 74 65 64 28 73 65 74 28  pend(sorted(set(
2d20: 6c 57 6f 72 64 29 29 29 0a 0a 20 20 20 20 23 20  lWord)))..    # 
2d30: 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20 77 6f  dictionary of wo
2d40: 72 64 73 0a 20 20 20 20 64 57 6f 72 64 20 3d 20  rds.    dWord = 
2d50: 7b 7d 0a 20 20 20 20 66 6f 72 20 69 2c 20 61 53  {}.    for i, aS
2d60: 65 74 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28  et in enumerate(
2d70: 6c 53 65 74 29 3a 0a 20 20 20 20 20 20 20 20 66  lSet):.        f
2d80: 6f 72 20 73 57 6f 72 64 20 69 6e 20 61 53 65 74  or sWord in aSet
2d90: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
2da0: 20 6f 44 69 63 74 2e 6c 6f 6f 6b 75 70 28 73 57   oDict.lookup(sW
2db0: 6f 72 64 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ord):.          
2dc0: 20 20 20 20 20 20 64 57 6f 72 64 5b 73 57 6f 72        dWord[sWor
2dd0: 64 5d 20 3d 20 69 20 20 23 20 77 61 72 6e 69 6e  d] = i  # warnin
2de0: 67 2c 20 77 68 61 74 20 69 66 20 77 6f 72 64 20  g, what if word 
2df0: 69 6e 20 73 65 76 65 72 61 6c 20 73 65 74 73 3f  in several sets?
2e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
2e10: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
2e20: 20 20 20 65 63 68 6f 28 22 4d 6f 74 20 69 6e 63     echo("Mot inc
2e30: 6f 6e 6e 75 20 3a 20 22 20 2b 20 73 57 6f 72 64  onnu : " + sWord
2e40: 29 0a 20 20 20 20 23 20 64 69 63 74 69 6f 6e 61  ).    # dictiona
2e50: 72 79 20 6f 66 20 6d 6f 72 70 68 6f 6c 6f 67 69  ry of morphologi
2e60: 65 73 0a 20 20 20 20 64 4d 6f 72 70 68 20 3d 20  es.    dMorph = 
2e70: 7b 7d 0a 20 20 20 20 66 6f 72 20 73 57 6f 72 64  {}.    for sWord
2e80: 20 69 6e 20 64 57 6f 72 64 3a 0a 20 20 20 20 20   in dWord:.     
2e90: 20 20 20 64 4d 6f 72 70 68 5b 73 57 6f 72 64 5d     dMorph[sWord]
2ea0: 20 3d 20 6f 44 69 63 74 2e 67 65 74 4d 6f 72 70   = oDict.getMorp
2eb0: 68 28 73 57 6f 72 64 29 0a 0a 20 20 20 20 23 20  h(sWord)..    # 
2ec0: 77 72 69 74 65 20 66 69 6c 65 20 66 6f 72 20 50  write file for P
2ed0: 79 74 68 6f 6e 0a 20 20 20 20 73 43 6f 64 65 20  ython.    sCode 
2ee0: 3d 20 22 23 20 67 65 6e 65 72 61 74 65 64 20 64  = "# generated d
2ef0: 61 74 61 20 28 64 6f 20 6e 6f 74 20 65 64 69 74  ata (do not edit
2f00: 29 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20  )\n\n" + \.     
2f10: 20 20 20 20 20 20 20 22 64 57 6f 72 64 20 3d 20         "dWord = 
2f20: 22 20 2b 20 73 74 72 28 64 57 6f 72 64 29 20 2b  " + str(dWord) +
2f30: 20 22 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20 20 20   "\n\n" + \.    
2f40: 20 20 20 20 20 20 20 20 22 6c 53 65 74 20 3d 20          "lSet = 
2f50: 22 20 2b 20 73 74 72 28 6c 53 65 74 29 20 2b 20  " + str(lSet) + 
2f60: 22 5c 6e 5c 6e 22 20 2b 20 5c 0a 20 20 20 20 20  "\n\n" + \.     
2f70: 20 20 20 20 20 20 20 22 64 4d 6f 72 70 68 20 3d         "dMorph =
2f80: 20 22 20 2b 20 73 74 72 28 64 4d 6f 72 70 68 29   " + str(dMorph)
2f90: 20 2b 20 22 5c 6e 22 0a 20 20 20 20 6f 70 65 6e   + "\n".    open
2fa0: 28 73 70 2b 22 2f 6d 6f 64 75 6c 65 73 2f 70 68  (sp+"/modules/ph
2fb0: 6f 6e 65 74 5f 64 61 74 61 2e 70 79 22 2c 20 22  onet_data.py", "
2fc0: 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  w", encoding="ut
2fd0: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
2fe0: 6e 22 29 2e 77 72 69 74 65 28 73 43 6f 64 65 29  n").write(sCode)
2ff0: 0a 0a 20 20 20 20 69 66 20 62 4a 53 3a 0a 20 20  ..    if bJS:.  
3000: 20 20 20 20 20 20 23 23 20 77 72 69 74 65 20 66        ## write f
3010: 69 6c 65 20 66 6f 72 20 4a 61 76 61 53 63 72 69  ile for JavaScri
3020: 70 74 0a 20 20 20 20 20 20 20 20 73 43 6f 64 65  pt.        sCode
3030: 20 3d 20 22 7b 5c 6e 22 20 2b 20 5c 0a 20 20 20   = "{\n" + \.   
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 20 20               '  
3050: 20 20 22 64 57 6f 72 64 22 3a 20 27 20 2b 20 6a    "dWord": ' + j
3060: 73 6f 6e 2e 64 75 6d 70 73 28 64 57 6f 72 64 2c  son.dumps(dWord,
3070: 20 65 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61   ensure_ascii=Fa
3080: 6c 73 65 29 20 2b 20 22 2c 5c 6e 22 20 2b 20 5c  lse) + ",\n" + \
3090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a0: 20 27 20 20 20 20 22 6c 53 65 74 22 3a 20 27 20   '    "lSet": ' 
30b0: 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 53 65  + json.dumps(lSe
30c0: 74 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69 3d  t, ensure_ascii=
30d0: 46 61 6c 73 65 29 20 2b 20 22 2c 5c 6e 22 20 2b  False) + ",\n" +
30e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
30f0: 20 20 20 27 20 20 20 20 22 64 4d 6f 72 70 68 22     '    "dMorph"
3100: 3a 20 27 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73  : ' + json.dumps
3110: 28 64 4d 6f 72 70 68 2c 20 65 6e 73 75 72 65 5f  (dMorph, ensure_
3120: 61 73 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22  ascii=False) + "
3130: 5c 6e 7d 22 0a 20 20 20 20 20 20 20 20 6f 70 65  \n}".        ope
3140: 6e 28 73 70 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a  n(sp+"/modules-j
3150: 73 2f 70 68 6f 6e 65 74 5f 64 61 74 61 2e 6a 73  s/phonet_data.js
3160: 6f 6e 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69  on", "w", encodi
3170: 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c  ng="utf-8", newl
3180: 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28  ine="\n").write(
3190: 73 43 6f 64 65 29 0a 0a 0a 64 65 66 20 6d 61 6b  sCode)...def mak
31a0: 65 4c 6f 63 75 74 69 6f 6e 73 20 28 73 70 2c 20  eLocutions (sp, 
31b0: 62 4a 53 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20  bJS=False):.    
31c0: 22 63 6f 6d 70 69 6c 65 20 6c 69 73 74 20 6f 66  "compile list of
31d0: 20 6c 6f 63 75 74 69 6f 6e 73 20 69 6e 20 4a 53   locutions in JS
31e0: 4f 4e 22 0a 20 20 20 20 70 72 69 6e 74 28 22 3e  ON".    print(">
31f0: 20 4c 6f 63 75 74 69 6f 6e 73 20 22 2c 20 65 6e   Locutions ", en
3200: 64 3d 22 22 29 0a 20 20 20 20 70 72 69 6e 74 28  d="").    print(
3210: 22 28 50 79 74 68 6f 6e 20 65 74 20 4a 61 76 61  "(Python et Java
3220: 53 63 72 69 70 74 29 22 20 20 69 66 20 62 4a 53  Script)"  if bJS
3230: 20 20 65 6c 73 65 20 22 28 50 79 74 68 6f 6e 20    else "(Python 
3240: 73 65 75 6c 65 6d 65 6e 74 29 22 29 0a 20 20 20  seulement)").   
3250: 20 64 4c 6f 63 47 72 61 70 68 20 3d 20 7b 7d 0a   dLocGraph = {}.
3260: 20 20 20 20 6f 54 6f 6b 65 6e 69 7a 65 72 20 3d      oTokenizer =
3270: 20 74 6b 7a 2e 54 6f 6b 65 6e 69 7a 65 72 28 22   tkz.Tokenizer("
3280: 66 72 22 29 0a 20 20 20 20 66 6f 72 20 73 4c 69  fr").    for sLi
3290: 6e 65 20 69 6e 20 69 74 65 72 74 6f 6f 6c 73 2e  ne in itertools.
32a0: 63 68 61 69 6e 28 72 65 61 64 46 69 6c 65 28 73  chain(readFile(s
32b0: 70 2b 22 2f 64 61 74 61 2f 6c 6f 63 75 74 69 6f  p+"/data/locutio
32c0: 6e 73 5f 61 64 76 65 72 62 69 61 6c 65 73 2e 74  ns_adverbiales.t
32d0: 78 74 22 29 2c 20 5c 0a 20 20 20 20 20 20 20 20  xt"), \.        
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 20 20 20 20 20 20 20 20 72 65 61 64 46 69 6c           readFil
3300: 65 28 73 70 2b 22 2f 64 61 74 61 2f 6c 6f 63 75  e(sp+"/data/locu
3310: 74 69 6f 6e 73 5f 70 72 c3 a9 70 6f 73 69 74 69  tions_pr..positi
3320: 76 65 73 2e 74 78 74 22 29 2c 20 5c 0a 20 20 20  ves.txt"), \.   
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
3350: 61 64 46 69 6c 65 28 73 70 2b 22 2f 64 61 74 61  adFile(sp+"/data
3360: 2f 6c 6f 63 75 74 69 6f 6e 73 5f 63 6f 6e 6a 6f  /locutions_conjo
3370: 6e 63 74 69 76 65 73 2e 74 78 74 22 29 2c 20 5c  nctives.txt"), \
3380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 72 65 61 64 46 69 6c 65 28 73 70 2b 22 2f    readFile(sp+"/
33b0: 64 61 74 61 2f 6c 6f 63 75 74 69 6f 6e 73 5f 70  data/locutions_p
33c0: 72 6f 6e 6f 6d 69 6e 61 6c 65 73 2e 74 78 74 22  ronominales.txt"
33d0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  ), \.           
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 20 72 65 61 64 46 69 6c 65 28 73        readFile(s
3400: 70 2b 22 2f 64 61 74 61 2f 6c 6f 63 75 74 69 6f  p+"/data/locutio
3410: 6e 73 5f 61 64 6a 65 63 74 69 76 61 6c 65 73 2e  ns_adjectivales.
3420: 74 78 74 22 29 2c 20 5c 0a 20 20 20 20 20 20 20  txt"), \.       
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 46 69            readFi
3450: 6c 65 28 73 70 2b 22 2f 64 61 74 61 2f 6c 6f 63  le(sp+"/data/loc
3460: 75 74 69 6f 6e 73 5f 69 6e 74 65 72 6a 65 63 74  utions_interject
3470: 69 76 65 73 2e 74 78 74 22 29 2c 20 5c 0a 20 20  ives.txt"), \.  
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
34a0: 65 61 64 46 69 6c 65 28 73 70 2b 22 2f 64 61 74  eadFile(sp+"/dat
34b0: 61 2f 6c 6f 63 75 74 69 6f 6e 73 5f 6e 6f 6d 69  a/locutions_nomi
34c0: 6e 61 6c 65 73 2e 74 78 74 22 29 2c 20 5c 0a 20  nales.txt"), \. 
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 72 65 61 64 46 69 6c 65 28 73 70 2b 22 2f 64 61  readFile(sp+"/da
3500: 74 61 2f 6c 6f 63 75 74 69 6f 6e 73 5f 76 65 72  ta/locutions_ver
3510: 62 61 6c 65 73 2e 74 78 74 22 29 29 3a 0a 20 20  bales.txt")):.  
3520: 20 20 20 20 20 20 64 43 75 72 20 3d 20 64 4c 6f        dCur = dLo
3530: 63 47 72 61 70 68 0a 20 20 20 20 20 20 20 20 73  cGraph.        s
3540: 4c 6f 63 2c 20 73 54 61 67 20 3d 20 73 4c 69 6e  Loc, sTag = sLin
3550: 65 2e 73 70 6c 69 74 28 22 5c 74 22 29 0a 20 20  e.split("\t").  
3560: 20 20 20 20 20 20 66 6f 72 20 6f 54 6f 6b 65 6e        for oToken
3570: 20 69 6e 20 6f 54 6f 6b 65 6e 69 7a 65 72 2e 67   in oTokenizer.g
3580: 65 6e 54 6f 6b 65 6e 73 28 73 4c 6f 63 2e 73 74  enTokens(sLoc.st
3590: 72 69 70 28 29 29 3a 0a 20 20 20 20 20 20 20 20  rip()):.        
35a0: 20 20 20 20 73 57 6f 72 64 20 3d 20 6f 54 6f 6b      sWord = oTok
35b0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 0a 20 20 20  en["sValue"].   
35c0: 20 20 20 20 20 20 20 20 20 69 66 20 73 57 6f 72           if sWor
35d0: 64 20 6e 6f 74 20 69 6e 20 64 43 75 72 3a 0a 20  d not in dCur:. 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
35f0: 43 75 72 5b 73 57 6f 72 64 5d 20 3d 20 7b 7d 0a  Cur[sWord] = {}.
3600: 20 20 20 20 20 20 20 20 20 20 20 20 64 43 75 72              dCur
3610: 20 3d 20 64 43 75 72 5b 73 57 6f 72 64 5d 0a 20   = dCur[sWord]. 
3620: 20 20 20 20 20 20 20 64 43 75 72 5b 22 5f 3a 5f         dCur["_:_
3630: 22 5d 20 3d 20 73 54 61 67 0a 0a 20 20 20 20 73  "] = sTag..    s
3640: 43 6f 64 65 20 3d 20 22 23 20 67 65 6e 65 72 61  Code = "# genera
3650: 74 65 64 20 64 61 74 61 20 28 64 6f 20 6e 6f 74  ted data (do not
3660: 20 65 64 69 74 29 5c 6e 5c 6e 22 20 2b 20 5c 0a   edit)\n\n" + \.
3670: 20 20 20 20 20 20 20 20 20 20 20 20 22 64 4c 6f              "dLo
3680: 63 75 74 69 6f 6e 73 20 3d 20 22 20 2b 20 73 74  cutions = " + st
3690: 72 28 64 4c 6f 63 47 72 61 70 68 29 20 2b 20 22  r(dLocGraph) + "
36a0: 5c 6e 22 0a 20 20 20 20 6f 70 65 6e 28 73 70 2b  \n".    open(sp+
36b0: 22 2f 6d 6f 64 75 6c 65 73 2f 6c 6f 63 75 74 69  "/modules/locuti
36c0: 6f 6e 73 5f 64 61 74 61 2e 70 79 22 2c 20 22 77  ons_data.py", "w
36d0: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
36e0: 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e  -8", newline="\n
36f0: 22 29 2e 77 72 69 74 65 28 73 43 6f 64 65 29 0a  ").write(sCode).
3700: 20 20 20 20 69 66 20 62 4a 53 3a 0a 20 20 20 20      if bJS:.    
3710: 20 20 20 20 6f 70 65 6e 28 73 70 2b 22 2f 6d 6f      open(sp+"/mo
3720: 64 75 6c 65 73 2d 6a 73 2f 6c 6f 63 75 74 69 6f  dules-js/locutio
3730: 6e 73 5f 64 61 74 61 2e 6a 73 6f 6e 22 2c 20 22  ns_data.json", "
3740: 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  w", encoding="ut
3750: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
3760: 6e 22 29 2e 77 72 69 74 65 28 6a 73 6f 6e 2e 64  n").write(json.d
3770: 75 6d 70 73 28 64 4c 6f 63 47 72 61 70 68 2c 20  umps(dLocGraph, 
3780: 65 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61 6c  ensure_ascii=Fal
3790: 73 65 29 29 0a 0a 0a 64 65 66 20 62 65 66 6f 72  se))...def befor
37a0: 65 20 28 73 70 4c 61 75 6e 63 68 2c 20 64 56 61  e (spLaunch, dVa
37b0: 72 73 2c 20 62 4a 53 3d 46 61 6c 73 65 29 3a 0a  rs, bJS=False):.
37c0: 20 20 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d      print("=====
37d0: 3d 3d 3d 3d 3d 20 42 75 69 6c 64 20 48 75 6e 73  ===== Build Huns
37e0: 70 65 6c 6c 20 64 69 63 74 69 6f 6e 61 72 69 65  pell dictionarie
37f0: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 0a 20  s =========="). 
3800: 20 20 20 6d 61 6b 65 44 69 63 74 69 6f 6e 61 72     makeDictionar
3810: 69 65 73 28 73 70 4c 61 75 6e 63 68 2c 20 64 56  ies(spLaunch, dV
3820: 61 72 73 5b 27 6f 78 74 5f 76 65 72 73 69 6f 6e  ars['oxt_version
3830: 27 5d 29 0a 0a 0a 64 65 66 20 61 66 74 65 72 20  '])...def after 
3840: 28 73 70 4c 61 75 6e 63 68 2c 20 64 56 61 72 73  (spLaunch, dVars
3850: 2c 20 62 4a 53 3d 46 61 6c 73 65 29 3a 0a 20 20  , bJS=False):.  
3860: 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d    print("=======
3870: 3d 3d 3d 20 42 75 69 6c 64 20 46 72 65 6e 63 68  === Build French
3880: 20 64 61 74 61 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   data ==========
3890: 22 29 0a 20 20 20 20 6d 61 6b 65 4d 66 73 70 28  ").    makeMfsp(
38a0: 73 70 4c 61 75 6e 63 68 2c 20 62 4a 53 29 0a 20  spLaunch, bJS). 
38b0: 20 20 20 6d 61 6b 65 43 6f 6e 6a 28 73 70 4c 61     makeConj(spLa
38c0: 75 6e 63 68 2c 20 62 4a 53 29 0a 20 20 20 20 6d  unch, bJS).    m
38d0: 61 6b 65 50 68 6f 6e 65 74 54 61 62 6c 65 28 73  akePhonetTable(s
38e0: 70 4c 61 75 6e 63 68 2c 20 62 4a 53 29 0a 20 20  pLaunch, bJS).  
38f0: 20 20 6d 61 6b 65 4c 6f 63 75 74 69 6f 6e 73 28    makeLocutions(
3900: 73 70 4c 61 75 6e 63 68 2c 20 62 4a 53 29 0a     spLaunch, bJS).