Grammalecte  Hex Artifact Content

Artifact 8e3260b6adce0a71217cb0dda99e2efc0857539bce63d4b970b85f5e2d5abe08:


0000: 20 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20   #!/usr/bin/env 
0010: 70 79 74 68 6f 6e 33 0a 23 20 63 6f 64 69 6e 67  python3.# coding
0020: 3a 20 55 54 46 2d 38 0a 0a 69 6d 70 6f 72 74 20  : UTF-8..import 
0030: 73 79 73 0a 69 6d 70 6f 72 74 20 6f 73 0a 69 6d  sys.import os.im
0040: 70 6f 72 74 20 73 75 62 70 72 6f 63 65 73 73 0a  port subprocess.
0050: 69 6d 70 6f 72 74 20 72 65 0a 69 6d 70 6f 72 74  import re.import
0060: 20 7a 69 70 66 69 6c 65 0a 69 6d 70 6f 72 74 20   zipfile.import 
0070: 74 72 61 63 65 62 61 63 6b 0a 69 6d 70 6f 72 74  traceback.import
0080: 20 63 6f 6e 66 69 67 70 61 72 73 65 72 0a 69 6d   configparser.im
0090: 70 6f 72 74 20 64 61 74 65 74 69 6d 65 0a 69 6d  port datetime.im
00a0: 70 6f 72 74 20 61 72 67 70 61 72 73 65 0a 69 6d  port argparse.im
00b0: 70 6f 72 74 20 69 6d 70 6f 72 74 6c 69 62 0a 69  port importlib.i
00c0: 6d 70 6f 72 74 20 75 6e 69 74 74 65 73 74 0a 69  mport unittest.i
00d0: 6d 70 6f 72 74 20 6a 73 6f 6e 0a 69 6d 70 6f 72  mport json.impor
00e0: 74 20 70 6c 61 74 66 6f 72 6d 0a 0a 66 72 6f 6d  t platform..from
00f0: 20 64 69 73 74 75 74 69 6c 73 20 69 6d 70 6f 72   distutils impor
0100: 74 20 64 69 72 5f 75 74 69 6c 2c 20 66 69 6c 65  t dir_util, file
0110: 5f 75 74 69 6c 0a 0a 69 6d 70 6f 72 74 20 64 69  _util..import di
0120: 61 6c 6f 67 5f 62 75 6e 64 6c 65 64 0a 69 6d 70  alog_bundled.imp
0130: 6f 72 74 20 63 6f 6d 70 69 6c 65 5f 72 75 6c 65  ort compile_rule
0140: 73 0a 69 6d 70 6f 72 74 20 68 65 6c 70 65 72 73  s.import helpers
0150: 0a 69 6d 70 6f 72 74 20 6c 65 78 5f 62 75 69 6c  .import lex_buil
0160: 64 0a 0a 0a 73 57 61 72 6e 69 6e 67 4d 65 73 73  d...sWarningMess
0170: 61 67 65 20 3d 20 22 54 68 65 20 63 6f 6e 74 65  age = "The conte
0180: 6e 74 20 6f 66 20 74 68 69 73 20 66 6f 6c 64 65  nt of this folde
0190: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
01a0: 79 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61  y code and repla
01b0: 63 65 64 20 61 74 20 65 61 63 68 20 62 75 69 6c  ced at each buil
01c0: 64 2e 5c 6e 22 0a 0a 0a 64 65 66 20 67 65 74 43  d.\n"...def getC
01d0: 6f 6e 66 69 67 20 28 73 4c 61 6e 67 29 3a 0a 20  onfig (sLang):. 
01e0: 20 20 20 78 43 6f 6e 66 69 67 20 3d 20 63 6f 6e     xConfig = con
01f0: 66 69 67 70 61 72 73 65 72 2e 53 61 66 65 43 6f  figparser.SafeCo
0200: 6e 66 69 67 50 61 72 73 65 72 28 29 0a 20 20 20  nfigParser().   
0210: 20 78 43 6f 6e 66 69 67 2e 6f 70 74 69 6f 6e 78   xConfig.optionx
0220: 66 6f 72 6d 20 3d 20 73 74 72 0a 20 20 20 20 74  form = str.    t
0230: 72 79 3a 0a 20 20 20 20 20 20 20 20 78 43 6f 6e  ry:.        xCon
0240: 66 69 67 2e 72 65 61 64 28 22 67 63 5f 6c 61 6e  fig.read("gc_lan
0250: 67 2f 22 20 2b 20 73 4c 61 6e 67 20 2b 20 22 2f  g/" + sLang + "/
0260: 63 6f 6e 66 69 67 2e 69 6e 69 22 2c 20 65 6e 63  config.ini", enc
0270: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 0a 20  oding="utf-8"). 
0280: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
0290: 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f     print("# Erro
02a0: 72 2e 20 43 61 6e e2 80 99 74 20 72 65 61 64 20  r. Can...t read 
02b0: 63 6f 6e 66 69 67 20 66 69 6c 65 20 5b 22 20 2b  config file [" +
02c0: 20 73 4c 61 6e 67 20 2b 20 22 5d 22 29 0a 20 20   sLang + "]").  
02d0: 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20 20        exit().   
02e0: 20 72 65 74 75 72 6e 20 78 43 6f 6e 66 69 67 0a   return xConfig.
02f0: 0a 0a 64 65 66 20 63 72 65 61 74 65 4f 70 74 69  ..def createOpti
0300: 6f 6e 73 4c 61 62 65 6c 50 72 6f 70 65 72 74 69  onsLabelProperti
0310: 65 73 20 28 64 4f 70 74 4c 62 6c 29 3a 0a 20 20  es (dOptLbl):.  
0320: 20 20 73 43 6f 6e 74 65 6e 74 20 3d 20 22 22 0a    sContent = "".
0330: 20 20 20 20 66 6f 72 20 73 4f 70 74 2c 20 74 4c      for sOpt, tL
0340: 61 62 65 6c 20 69 6e 20 64 4f 70 74 4c 62 6c 2e  abel in dOptLbl.
0350: 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20  items():.       
0360: 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 73 4f 70   sContent += sOp
0370: 74 20 2b 20 22 3d 22 20 2b 20 74 4c 61 62 65 6c  t + "=" + tLabel
0380: 5b 30 5d 20 2b 20 22 5c 6e 22 0a 20 20 20 20 20  [0] + "\n".     
0390: 20 20 20 69 66 20 74 4c 61 62 65 6c 5b 31 5d 3a     if tLabel[1]:
03a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
03b0: 6e 74 65 6e 74 20 2b 3d 20 22 68 6c 70 5f 22 20  ntent += "hlp_" 
03c0: 2b 20 73 4f 70 74 20 2b 20 22 3d 22 20 2b 20 74  + sOpt + "=" + t
03d0: 4c 61 62 65 6c 5b 31 5d 20 2b 20 22 5c 6e 22 0a  Label[1] + "\n".
03e0: 20 20 20 20 72 65 74 75 72 6e 20 73 43 6f 6e 74      return sCont
03f0: 65 6e 74 0a 0a 0a 64 65 66 20 63 72 65 61 74 65  ent...def create
0400: 44 69 61 6c 6f 67 4f 70 74 69 6f 6e 73 58 44 4c  DialogOptionsXDL
0410: 20 28 64 56 61 72 73 29 3a 0a 20 20 20 20 73 46   (dVars):.    sF
0420: 69 78 65 64 6c 69 6e 65 20 3d 20 27 3c 64 6c 67  ixedline = '<dlg
0430: 3a 66 69 78 65 64 6c 69 6e 65 20 64 6c 67 3a 69  :fixedline dlg:i
0440: 64 3d 22 7b 30 7d 22 20 64 6c 67 3a 74 61 62 2d  d="{0}" dlg:tab-
0450: 69 6e 64 65 78 3d 22 7b 31 7d 22 20 64 6c 67 3a  index="{1}" dlg:
0460: 74 6f 70 3d 22 7b 32 7d 22 20 64 6c 67 3a 6c 65  top="{2}" dlg:le
0470: 66 74 3d 22 35 22 20 64 6c 67 3a 77 69 64 74 68  ft="5" dlg:width
0480: 3d 22 7b 33 7d 22 20 64 6c 67 3a 68 65 69 67 68  ="{3}" dlg:heigh
0490: 74 3d 22 31 30 22 20 64 6c 67 3a 76 61 6c 75 65  t="10" dlg:value
04a0: 3d 22 26 61 6d 70 3b 7b 30 7d 22 20 2f 3e 5c 6e  ="&amp;{0}" />\n
04b0: 27 0a 20 20 20 20 73 43 68 65 63 6b 62 6f 78 20  '.    sCheckbox 
04c0: 3d 20 27 3c 64 6c 67 3a 63 68 65 63 6b 62 6f 78  = '<dlg:checkbox
04d0: 20 64 6c 67 3a 69 64 3d 22 7b 30 7d 22 20 64 6c   dlg:id="{0}" dl
04e0: 67 3a 74 61 62 2d 69 6e 64 65 78 3d 22 7b 31 7d  g:tab-index="{1}
04f0: 22 20 64 6c 67 3a 74 6f 70 3d 22 7b 32 7d 22 20  " dlg:top="{2}" 
0500: 64 6c 67 3a 6c 65 66 74 3d 22 7b 33 7d 22 20 64  dlg:left="{3}" d
0510: 6c 67 3a 77 69 64 74 68 3d 22 7b 34 7d 22 20 64  lg:width="{4}" d
0520: 6c 67 3a 68 65 69 67 68 74 3d 22 31 30 22 20 64  lg:height="10" d
0530: 6c 67 3a 76 61 6c 75 65 3d 22 26 61 6d 70 3b 7b  lg:value="&amp;{
0540: 30 7d 22 20 64 6c 67 3a 63 68 65 63 6b 65 64 3d  0}" dlg:checked=
0550: 22 7b 35 7d 22 20 7b 36 7d 20 2f 3e 5c 6e 27 0a  "{5}" {6} />\n'.
0560: 20 20 20 20 69 54 61 62 49 6e 64 65 78 20 3d 20      iTabIndex = 
0570: 31 0a 20 20 20 20 6e 50 6f 73 59 20 3d 20 35 0a  1.    nPosY = 5.
0580: 20 20 20 20 6e 57 69 64 74 68 20 3d 20 32 34 30      nWidth = 240
0590: 0a 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 3d 20  .    sContent = 
05a0: 22 22 0a 20 20 20 20 64 4f 70 74 20 3d 20 64 56  "".    dOpt = dV
05b0: 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e 22  ars["dOptPython"
05c0: 5d 0a 20 20 20 20 64 4f 70 74 4c 61 62 65 6c 20  ].    dOptLabel 
05d0: 3d 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61 62  = dVars["dOptLab
05e0: 65 6c 22 5d 5b 64 56 61 72 73 5b 22 6c 61 6e 67  el"][dVars["lang
05f0: 22 5d 5d 0a 20 20 20 20 66 6f 72 20 73 47 72 6f  "]].    for sGro
0600: 75 70 2c 20 6c 47 72 6f 75 70 4f 70 74 69 6f 6e  up, lGroupOption
0610: 73 20 69 6e 20 64 56 61 72 73 5b 22 6c 53 74 72  s in dVars["lStr
0620: 75 63 74 4f 70 74 22 5d 3a 0a 20 20 20 20 20 20  uctOpt"]:.      
0630: 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 73 46    sContent += sF
0640: 69 78 65 64 6c 69 6e 65 2e 66 6f 72 6d 61 74 28  ixedline.format(
0650: 73 47 72 6f 75 70 2c 20 69 54 61 62 49 6e 64 65  sGroup, iTabInde
0660: 78 2c 20 6e 50 6f 73 59 2c 20 6e 57 69 64 74 68  x, nPosY, nWidth
0670: 29 0a 20 20 20 20 20 20 20 20 69 54 61 62 49 6e  ).        iTabIn
0680: 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20 20 20  dex += 1.       
0690: 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e   for lLineOption
06a0: 73 20 69 6e 20 6c 47 72 6f 75 70 4f 70 74 69 6f  s in lGroupOptio
06b0: 6e 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns:.            
06c0: 6e 45 6c 65 6d 57 69 64 74 68 20 3d 20 6e 57 69  nElemWidth = nWi
06d0: 64 74 68 20 2f 2f 20 6c 65 6e 28 6c 4c 69 6e 65  dth // len(lLine
06e0: 4f 70 74 69 6f 6e 73 29 0a 20 20 20 20 20 20 20  Options).       
06f0: 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31 30       nPosY += 10
0700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6f  .            nPo
0710: 73 58 20 3d 20 31 30 0a 20 20 20 20 20 20 20 20  sX = 10.        
0720: 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20      for sOpt in 
0730: 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73 3a 0a 20 20  lLineOptions:.  
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 48                sH
0750: 65 6c 70 20 3d 20 27 64 6c 67 3a 68 65 6c 70 2d  elp = 'dlg:help-
0760: 74 65 78 74 3d 22 26 61 6d 70 3b 68 6c 70 5f 25  text="&amp;hlp_%
0770: 73 22 27 25 73 4f 70 74 20 20 69 66 20 64 4f 70  s"'%sOpt  if dOp
0780: 74 4c 61 62 65 6c 5b 73 4f 70 74 5d 5b 31 5d 20  tLabel[sOpt][1] 
0790: 20 65 6c 73 65 20 22 22 0a 20 20 20 20 20 20 20   else "".       
07a0: 20 20 20 20 20 20 20 20 20 73 43 6f 6e 74 65 6e           sConten
07b0: 74 20 2b 3d 20 73 43 68 65 63 6b 62 6f 78 2e 66  t += sCheckbox.f
07c0: 6f 72 6d 61 74 28 73 4f 70 74 2c 20 69 54 61 62  ormat(sOpt, iTab
07d0: 49 6e 64 65 78 2c 20 6e 50 6f 73 59 2c 20 6e 50  Index, nPosY, nP
07e0: 6f 73 58 2c 20 6e 45 6c 65 6d 57 69 64 74 68 2c  osX, nElemWidth,
07f0: 20 22 74 72 75 65 22 20 69 66 20 64 4f 70 74 5b   "true" if dOpt[
0800: 73 4f 70 74 5d 20 65 6c 73 65 20 22 66 61 6c 73  sOpt] else "fals
0810: 65 22 2c 20 73 48 65 6c 70 29 0a 20 20 20 20 20  e", sHelp).     
0820: 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 49             iTabI
0830: 6e 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20 20  ndex += 1.      
0840: 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 58 20            nPosX 
0850: 2b 3d 20 6e 45 6c 65 6d 57 69 64 74 68 0a 20 20  += nElemWidth.  
0860: 20 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31        nPosY += 1
0870: 30 0a 20 20 20 20 72 65 74 75 72 6e 20 73 43 6f  0.    return sCo
0880: 6e 74 65 6e 74 0a 0a 0a 64 65 66 20 63 72 65 61  ntent...def crea
0890: 74 65 4f 58 54 20 28 73 70 4c 61 6e 67 2c 20 64  teOXT (spLang, d
08a0: 56 61 72 73 2c 20 64 4f 78 74 2c 20 73 70 4c 61  Vars, dOxt, spLa
08b0: 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61 6c 6c  ngPack, bInstall
08c0: 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 65  ):.    "create e
08d0: 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 57 72 69  xtension for Wri
08e0: 74 65 72 22 0a 20 20 20 20 70 72 69 6e 74 28 22  ter".    print("
08f0: 42 75 69 6c 64 69 6e 67 20 65 78 74 65 6e 73 69  Building extensi
0900: 6f 6e 20 66 6f 72 20 57 72 69 74 65 72 22 29 0a  on for Writer").
0910: 20 20 20 20 73 70 66 5a 69 70 20 3d 20 22 5f 62      spfZip = "_b
0920: 75 69 6c 64 2f 22 20 2b 20 64 56 61 72 73 5b 27  uild/" + dVars['
0930: 6e 61 6d 65 27 5d 20 2b 20 22 2d 22 2b 20 64 56  name'] + "-"+ dV
0940: 61 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 22 2d 76  ars['lang'] +"-v
0950: 22 20 2b 20 64 56 61 72 73 5b 27 76 65 72 73 69  " + dVars['versi
0960: 6f 6e 27 5d 20 2b 20 27 2e 6f 78 74 27 0a 20 20  on'] + '.oxt'.  
0970: 20 20 68 5a 69 70 20 3d 20 7a 69 70 66 69 6c 65    hZip = zipfile
0980: 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a 69 70 2c  .ZipFile(spfZip,
0990: 20 6d 6f 64 65 3d 27 77 27 2c 20 63 6f 6d 70 72   mode='w', compr
09a0: 65 73 73 69 6f 6e 3d 7a 69 70 66 69 6c 65 2e 5a  ession=zipfile.Z
09b0: 49 50 5f 44 45 46 4c 41 54 45 44 29 0a 0a 20 20  IP_DEFLATED)..  
09c0: 20 20 23 20 50 61 63 6b 61 67 65 20 61 6e 64 20    # Package and 
09d0: 70 61 72 73 65 72 0a 20 20 20 20 63 6f 70 79 47  parser.    copyG
09e0: 72 61 6d 6d 61 6c 65 63 74 65 50 79 50 61 63 6b  rammalectePyPack
09f0: 61 67 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a 69  ageInZipFile(hZi
0a00: 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 22  p, spLangPack, "
0a10: 70 79 74 68 6f 6e 70 61 74 68 2f 22 29 0a 20 20  pythonpath/").  
0a20: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 72    hZip.write("gr
0a30: 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70 79  ammalecte-cli.py
0a40: 22 2c 20 22 70 79 74 68 6f 6e 70 61 74 68 2f 67  ", "pythonpath/g
0a50: 72 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70  rammalecte-cli.p
0a60: 79 22 29 0a 0a 20 20 20 20 23 20 45 78 74 65 6e  y")..    # Exten
0a70: 73 69 6f 6e 20 66 69 6c 65 73 0a 20 20 20 20 68  sion files.    h
0a80: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 4d 45  Zip.writestr("ME
0a90: 54 41 2d 49 4e 46 2f 6d 61 6e 69 66 65 73 74 2e  TA-INF/manifest.
0aa0: 78 6d 6c 22 2c 20 68 65 6c 70 65 72 73 2e 66 69  xml", helpers.fi
0ab0: 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f  leFile("gc_core/
0ac0: 70 79 2f 6f 78 74 2f 6d 61 6e 69 66 65 73 74 2e  py/oxt/manifest.
0ad0: 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20 20  xml", dVars)).  
0ae0: 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28    hZip.writestr(
0af0: 22 64 65 73 63 72 69 70 74 69 6f 6e 2e 78 6d 6c  "description.xml
0b00: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
0b10: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
0b20: 6f 78 74 2f 64 65 73 63 72 69 70 74 69 6f 6e 2e  oxt/description.
0b30: 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20 20  xml", dVars)).  
0b40: 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28    hZip.writestr(
0b50: 22 4c 69 6e 67 75 69 73 74 69 63 2e 78 63 75 22  "Linguistic.xcu"
0b60: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
0b70: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
0b80: 78 74 2f 4c 69 6e 67 75 69 73 74 69 63 2e 78 63  xt/Linguistic.xc
0b90: 75 22 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20  u", dVars)).    
0ba0: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 47  hZip.writestr("G
0bb0: 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22 2c 20  rammalecte.py", 
0bc0: 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65  helpers.fileFile
0bd0: 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74  ("gc_core/py/oxt
0be0: 2f 47 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22  /Grammalecte.py"
0bf0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
0c00: 69 70 2e 77 72 69 74 65 73 74 72 28 22 70 79 74  ip.writestr("pyt
0c10: 68 6f 6e 70 61 74 68 2f 68 65 6c 70 65 72 73 2e  honpath/helpers.
0c20: 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c  py", helpers.fil
0c30: 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70  eFile("gc_core/p
0c40: 79 2f 6f 78 74 2f 68 65 6c 70 65 72 73 2e 70 79  y/oxt/helpers.py
0c50: 22 2c 20 64 56 61 72 73 29 29 0a 0a 20 20 20 20  ", dVars))..    
0c60: 66 6f 72 20 73 66 20 69 6e 20 64 56 61 72 73 5b  for sf in dVars[
0c70: 22 65 78 74 72 61 73 22 5d 2e 73 70 6c 69 74 28  "extras"].split(
0c80: 22 2c 22 29 3a 0a 20 20 20 20 20 20 20 20 68 5a  ","):.        hZ
0c90: 69 70 2e 77 72 69 74 65 73 74 72 28 73 66 2e 73  ip.writestr(sf.s
0ca0: 74 72 69 70 28 29 2c 20 68 65 6c 70 65 72 73 2e  trip(), helpers.
0cb0: 66 69 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67 20  fileFile(spLang 
0cc0: 2b 20 27 2f 27 20 2b 20 73 66 2e 73 74 72 69 70  + '/' + sf.strip
0cd0: 28 29 2c 20 64 56 61 72 73 29 29 0a 0a 20 20 20  (), dVars))..   
0ce0: 20 69 66 20 22 6c 6f 67 6f 22 20 69 6e 20 64 56   if "logo" in dV
0cf0: 61 72 73 2e 6b 65 79 73 28 29 20 61 6e 64 20 64  ars.keys() and d
0d00: 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72  Vars["logo"].str
0d10: 69 70 28 29 3a 0a 20 20 20 20 20 20 20 20 68 5a  ip():.        hZ
0d20: 69 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 20  ip.write(spLang 
0d30: 2b 20 27 2f 27 20 2b 20 64 56 61 72 73 5b 22 6c  + '/' + dVars["l
0d40: 6f 67 6f 22 5d 2e 73 74 72 69 70 28 29 2c 20 64  ogo"].strip(), d
0d50: 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72  Vars["logo"].str
0d60: 69 70 28 29 29 0a 0a 20 20 20 20 23 23 20 4f 50  ip())..    ## OP
0d70: 54 49 4f 4e 53 0a 20 20 20 20 23 20 6f 70 74 69  TIONS.    # opti
0d80: 6f 6e 73 20 64 69 61 6c 6f 67 20 77 69 74 68 69  ons dialog withi
0d90: 6e 20 4c 4f 2f 4f 4f 20 6f 70 74 69 6f 6e 73 20  n LO/OO options 
0da0: 70 61 6e 65 6c 20 28 6c 65 67 61 63 79 29 0a 20  panel (legacy). 
0db0: 20 20 20 23 68 5a 69 70 2e 77 72 69 74 65 73 74     #hZip.writest
0dc0: 72 28 22 70 79 74 68 6f 6e 70 61 74 68 2f 6c 69  r("pythonpath/li
0dd0: 67 68 74 70 72 6f 6f 66 5f 68 61 6e 64 6c 65 72  ghtproof_handler
0de0: 5f 67 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22  _grammalecte.py"
0df0: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
0e00: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
0e10: 78 74 2f 6c 69 67 68 74 70 72 6f 6f 66 5f 68 61  xt/lightproof_ha
0e20: 6e 64 6c 65 72 5f 67 72 61 6d 6d 61 6c 65 63 74  ndler_grammalect
0e30: 65 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a 20  e.py", dVars)). 
0e40: 20 20 20 23 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73     #lLineOptions
0e50: 20 3d 20 6f 70 65 6e 28 73 70 4c 61 6e 67 20 2b   = open(spLang +
0e60: 20 22 2f 6f 70 74 69 6f 6e 73 2e 74 78 74 22 2c   "/options.txt",
0e70: 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "r", encoding="
0e80: 75 74 66 2d 38 22 29 2e 72 65 61 64 6c 69 6e 65  utf-8").readline
0e90: 73 28 29 0a 20 20 20 20 23 64 69 61 6c 6f 67 5f  s().    #dialog_
0ea0: 62 75 6e 64 6c 65 64 2e 63 28 64 56 61 72 73 5b  bundled.c(dVars[
0eb0: 22 69 6d 70 6c 6e 61 6d 65 22 5d 2c 20 6c 4c 69  "implname"], lLi
0ec0: 6e 65 4f 70 74 69 6f 6e 73 2c 20 68 5a 69 70 2c  neOptions, hZip,
0ed0: 20 64 56 61 72 73 5b 22 6c 61 6e 67 22 5d 29 0a   dVars["lang"]).
0ee0: 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20 64  .    # options d
0ef0: 69 61 6c 6f 67 0a 20 20 20 20 68 5a 69 70 2e 77  ialog.    hZip.w
0f00: 72 69 74 65 73 74 72 28 22 70 79 74 68 6f 6e 70  ritestr("pythonp
0f10: 61 74 68 2f 4f 70 74 69 6f 6e 73 2e 70 79 22 2c  ath/Options.py",
0f20: 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c   helpers.fileFil
0f30: 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78  e("gc_core/py/ox
0f40: 74 2f 4f 70 74 69 6f 6e 73 2e 70 79 22 2c 20 64  t/Options.py", d
0f50: 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69 70 2e  Vars)).    hZip.
0f60: 77 72 69 74 65 28 22 67 63 5f 63 6f 72 65 2f 70  write("gc_core/p
0f70: 79 2f 6f 78 74 2f 6f 70 5f 73 74 72 69 6e 67 73  y/oxt/op_strings
0f80: 2e 70 79 22 2c 20 22 70 79 74 68 6f 6e 70 61 74  .py", "pythonpat
0f90: 68 2f 6f 70 5f 73 74 72 69 6e 67 73 2e 70 79 22  h/op_strings.py"
0fa0: 29 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20  ).    # options 
0fb0: 64 69 61 6c 6f 67 20 77 69 74 68 69 6e 20 57 72  dialog within Wr
0fc0: 69 74 65 72 20 6f 70 74 69 6f 6e 73 20 70 61 6e  iter options pan
0fd0: 65 6c 0a 20 20 20 20 64 56 61 72 73 5b 22 78 64  el.    dVars["xd
0fe0: 6c 5f 64 69 61 6c 6f 67 5f 6f 70 74 69 6f 6e 73  l_dialog_options
0ff0: 22 5d 20 3d 20 63 72 65 61 74 65 44 69 61 6c 6f  "] = createDialo
1000: 67 4f 70 74 69 6f 6e 73 58 44 4c 28 64 56 61 72  gOptionsXDL(dVar
1010: 73 29 0a 20 20 20 20 64 56 61 72 73 5b 22 78 63  s).    dVars["xc
1020: 73 5f 6f 70 74 69 6f 6e 73 22 5d 20 3d 20 22 5c  s_options"] = "\
1030: 6e 22 2e 6a 6f 69 6e 28 5b 20 27 3c 70 72 6f 70  n".join([ '<prop
1040: 20 6f 6f 72 3a 6e 61 6d 65 3d 22 27 2b 73 4f 70   oor:name="'+sOp
1050: 74 2b 27 22 20 6f 6f 72 3a 74 79 70 65 3d 22 78  t+'" oor:type="x
1060: 73 3a 73 74 72 69 6e 67 22 3e 3c 76 61 6c 75 65  s:string"><value
1070: 3e 3c 2f 76 61 6c 75 65 3e 3c 2f 70 72 6f 70 3e  ></value></prop>
1080: 27 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 64 56  ' for sOpt in dV
1090: 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e 22  ars["dOptPython"
10a0: 5d 20 5d 29 0a 20 20 20 20 64 56 61 72 73 5b 22  ] ]).    dVars["
10b0: 78 63 75 5f 6c 61 62 65 6c 5f 76 61 6c 75 65 73  xcu_label_values
10c0: 22 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 5b  "] = "\n".join([
10d0: 20 27 3c 76 61 6c 75 65 20 78 6d 6c 3a 6c 61 6e   '<value xml:lan
10e0: 67 3d 22 27 2b 73 4c 61 6e 67 2b 27 22 3e 27 20  g="'+sLang+'">' 
10f0: 2b 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61 62  + dVars["dOptLab
1100: 65 6c 22 5d 5b 73 4c 61 6e 67 5d 5b 22 5f 5f 6f  el"][sLang]["__o
1110: 70 74 69 6f 6e 74 69 74 6c 65 5f 5f 22 5d 20 2b  ptiontitle__"] +
1120: 20 27 3c 2f 76 61 6c 75 65 3e 27 20 20 66 6f 72   '</value>'  for
1130: 20 73 4c 61 6e 67 20 69 6e 20 64 56 61 72 73 5b   sLang in dVars[
1140: 22 64 4f 70 74 4c 61 62 65 6c 22 5d 20 5d 29 0a  "dOptLabel"] ]).
1150: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
1160: 72 28 22 64 69 61 6c 6f 67 2f 6f 70 74 69 6f 6e  r("dialog/option
1170: 73 5f 70 61 67 65 2e 78 64 6c 22 2c 20 68 65 6c  s_page.xdl", hel
1180: 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 22 67  pers.fileFile("g
1190: 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6f 70  c_core/py/oxt/op
11a0: 74 69 6f 6e 73 5f 70 61 67 65 2e 78 64 6c 22 2c  tions_page.xdl",
11b0: 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69   dVars)).    hZi
11c0: 70 2e 77 72 69 74 65 73 74 72 28 22 64 69 61 6c  p.writestr("dial
11d0: 6f 67 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f 67  og/OptionsDialog
11e0: 2e 78 63 73 22 2c 20 68 65 6c 70 65 72 73 2e 66  .xcs", helpers.f
11f0: 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65  ileFile("gc_core
1200: 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73 44  /py/oxt/OptionsD
1210: 69 61 6c 6f 67 2e 78 63 73 22 2c 20 64 56 61 72  ialog.xcs", dVar
1220: 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  s)).    hZip.wri
1230: 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 4f 70  testr("dialog/Op
1240: 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 75 22  tionsDialog.xcu"
1250: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
1260: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
1270: 78 74 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f 67  xt/OptionsDialog
1280: 2e 78 63 75 22 2c 20 64 56 61 72 73 29 29 0a 20  .xcu", dVars)). 
1290: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72     hZip.writestr
12a0: 28 22 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56 61  ("dialog/" + dVa
12b0: 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f 65  rs['lang'] + "_e
12c0: 6e 2e 64 65 66 61 75 6c 74 22 2c 20 22 22 29 0a  n.default", "").
12d0: 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 4c 62 6c      for sLangLbl
12e0: 2c 20 64 4f 70 74 4c 62 6c 20 69 6e 20 64 56 61  , dOptLbl in dVa
12f0: 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d 2e  rs['dOptLabel'].
1300: 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20  items():.       
1310: 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22   hZip.writestr("
1320: 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56 61 72 73  dialog/" + dVars
1330: 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f 22 20 2b  ['lang'] + "_" +
1340: 20 73 4c 61 6e 67 4c 62 6c 20 2b 20 22 2e 70 72   sLangLbl + ".pr
1350: 6f 70 65 72 74 69 65 73 22 2c 20 63 72 65 61 74  operties", creat
1360: 65 4f 70 74 69 6f 6e 73 4c 61 62 65 6c 50 72 6f  eOptionsLabelPro
1370: 70 65 72 74 69 65 73 28 64 4f 70 74 4c 62 6c 29  perties(dOptLbl)
1380: 29 0a 0a 20 20 20 20 23 23 20 41 44 44 4f 4e 53  )..    ## ADDONS
1390: 20 4f 58 54 0a 20 20 20 20 70 72 69 6e 74 28 22   OXT.    print("
13a0: 2b 20 4f 58 54 3a 20 22 2c 20 65 6e 64 3d 22 22  + OXT: ", end=""
13b0: 29 0a 20 20 20 20 66 6f 72 20 73 70 66 53 72 63  ).    for spfSrc
13c0: 2c 20 73 70 66 44 73 74 20 69 6e 20 64 4f 78 74  , spfDst in dOxt
13d0: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
13e0: 20 20 70 72 69 6e 74 28 73 70 66 53 72 63 2c 20    print(spfSrc, 
13f0: 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 20 20  end=", ").      
1400: 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73 64    if os.path.isd
1410: 69 72 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70  ir(spLang+'/'+sp
1420: 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20  fSrc):.         
1430: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
1440: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 27  listdir(spLang+'
1450: 2f 27 2b 73 70 66 53 72 63 29 3a 0a 20 20 20 20  /'+spfSrc):.    
1460: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
1470: 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 2b 27 2f  .write(spLang+'/
1480: 27 2b 73 70 66 53 72 63 2b 22 2f 22 2b 73 66 2c  '+spfSrc+"/"+sf,
1490: 20 73 70 66 44 73 74 2b 22 2f 22 2b 73 66 29 0a   spfDst+"/"+sf).
14a0: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
14b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 70 66            if spf
14c0: 53 72 63 2e 65 6e 64 73 77 69 74 68 28 28 27 2e  Src.endswith(('.
14d0: 74 78 74 27 2c 20 27 2e 70 79 27 29 29 3a 0a 20  txt', '.py')):. 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
14f0: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73 70 66  Zip.writestr(spf
1500: 44 73 74 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c  Dst, helpers.fil
1510: 65 46 69 6c 65 28 73 70 4c 61 6e 67 2b 27 2f 27  eFile(spLang+'/'
1520: 2b 73 70 66 53 72 63 2c 20 64 56 61 72 73 29 29  +spfSrc, dVars))
1530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
1540: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1550: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70     hZip.write(sp
1560: 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63 2c  Lang+'/'+spfSrc,
1570: 20 73 70 66 44 73 74 29 0a 20 20 20 20 70 72 69   spfDst).    pri
1580: 6e 74 28 29 0a 20 20 20 20 68 5a 69 70 2e 63 6c  nt().    hZip.cl
1590: 6f 73 65 28 29 0a 0a 20 20 20 20 23 20 49 6e 73  ose()..    # Ins
15a0: 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57 72 69  tallation in Wri
15b0: 74 65 72 20 70 72 6f 66 69 6c 65 0a 20 20 20 20  ter profile.    
15c0: 69 66 20 62 49 6e 73 74 61 6c 6c 3a 0a 20 20 20  if bInstall:.   
15d0: 20 20 20 20 20 70 72 69 6e 74 28 22 3e 20 69 6e       print("> in
15e0: 73 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57 72  stallation in Wr
15f0: 69 74 65 72 22 29 0a 20 20 20 20 20 20 20 20 69  iter").        i
1600: 66 20 64 56 61 72 73 2e 67 65 74 28 27 75 6e 6f  f dVars.get('uno
1610: 70 6b 67 27 2c 20 46 61 6c 73 65 29 3a 0a 20 20  pkg', False):.  
1620: 20 20 20 20 20 20 20 20 20 20 63 6d 64 20 3d 20            cmd = 
1630: 27 22 27 2b 6f 73 2e 70 61 74 68 2e 61 62 73 70  '"'+os.path.absp
1640: 61 74 68 28 64 56 61 72 73 2e 67 65 74 28 27 75  ath(dVars.get('u
1650: 6e 6f 70 6b 67 27 29 2b 27 22 20 61 64 64 20 2d  nopkg')+'" add -
1660: 66 20 27 2b 73 70 66 5a 69 70 29 0a 20 20 20 20  f '+spfZip).    
1670: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 63 6d          print(cm
1680: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d).            #
1690: 73 75 62 70 72 6f 63 65 73 73 2e 72 75 6e 28 63  subprocess.run(c
16a0: 6d 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  md).            
16b0: 6f 73 2e 73 79 73 74 65 6d 28 63 6d 64 29 0a 20  os.system(cmd). 
16c0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
16d0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
16e0: 23 20 45 72 72 6f 72 3a 20 70 61 74 68 20 61 6e  # Error: path an
16f0: 64 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 75 6e  d filename of un
1700: 6f 70 6b 67 20 6e 6f 74 20 73 65 74 20 69 6e 20  opkg not set in 
1710: 63 6f 6e 66 69 67 2e 69 6e 69 22 29 0a 0a 0a 64  config.ini")...d
1720: 65 66 20 63 72 65 61 74 65 53 65 72 76 65 72 4f  ef createServerO
1730: 70 74 69 6f 6e 73 20 28 73 4c 61 6e 67 2c 20 64  ptions (sLang, d
1740: 4f 70 74 44 61 74 61 29 3a 0a 20 20 20 20 77 69  OptData):.    wi
1750: 74 68 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c  th open("grammal
1760: 65 63 74 65 2d 73 65 72 76 65 72 2d 6f 70 74 69  ecte-server-opti
1770: 6f 6e 73 2e 22 2b 73 4c 61 6e 67 2b 22 2e 69 6e  ons."+sLang+".in
1780: 69 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e  i", "w", encodin
1790: 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69  g="utf-8", newli
17a0: 6e 65 3d 22 5c 6e 22 29 20 61 73 20 68 44 73 74  ne="\n") as hDst
17b0: 3a 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e 77  :.        hDst.w
17c0: 72 69 74 65 28 22 23 20 53 65 72 76 65 72 20 6f  rite("# Server o
17d0: 70 74 69 6f 6e 73 2e 20 4c 61 6e 67 3a 20 22 20  ptions. Lang: " 
17e0: 2b 20 73 4c 61 6e 67 20 2b 20 22 5c 6e 5c 6e 5b  + sLang + "\n\n[
17f0: 67 63 5f 6f 70 74 69 6f 6e 73 5d 5c 6e 22 29 0a  gc_options]\n").
1800: 20 20 20 20 20 20 20 20 66 6f 72 20 73 53 65 63          for sSec
1810: 74 69 6f 6e 2c 20 6c 4f 70 74 20 69 6e 20 64 4f  tion, lOpt in dO
1820: 70 74 44 61 74 61 5b 22 6c 53 74 72 75 63 74 4f  ptData["lStructO
1830: 70 74 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20  pt"]:.          
1840: 20 20 68 44 73 74 2e 77 72 69 74 65 28 22 5c 6e    hDst.write("\n
1850: 23 23 23 23 23 23 23 23 23 23 20 22 20 2b 20 64  ########## " + d
1860: 4f 70 74 44 61 74 61 5b 22 64 4f 70 74 4c 61 62  OptData["dOptLab
1870: 65 6c 22 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74 28  el"][sLang].get(
1880: 73 53 65 63 74 69 6f 6e 2c 20 73 53 65 63 74 69  sSection, sSecti
1890: 6f 6e 20 2b 20 22 5b 6e 6f 20 6c 61 62 65 6c 20  on + "[no label 
18a0: 66 6f 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22 20  found]")[0] + " 
18b0: 23 23 23 23 23 23 23 23 23 23 5c 6e 22 29 0a 20  ##########\n"). 
18c0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 6c             for l
18d0: 4c 69 6e 65 4f 70 74 20 69 6e 20 6c 4f 70 74 3a  LineOpt in lOpt:
18e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f0: 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c 4c 69   for sOpt in lLi
1900: 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20 20 20 20  neOpt:.         
1910: 20 20 20 20 20 20 20 20 20 20 20 68 44 73 74 2e             hDst.
1920: 77 72 69 74 65 28 22 23 20 22 20 2b 20 64 4f 70  write("# " + dOp
1930: 74 44 61 74 61 5b 22 64 4f 70 74 4c 61 62 65 6c  tData["dOptLabel
1940: 22 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74 28 73 4f  "][sLang].get(sO
1950: 70 74 2c 20 22 5b 6e 6f 20 6c 61 62 65 6c 20 66  pt, "[no label f
1960: 6f 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22 5c 6e  ound]")[0] + "\n
1970: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
1980: 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69 74         hDst.writ
1990: 65 28 73 4f 70 74 20 2b 20 22 20 3d 20 22 20 2b  e(sOpt + " = " +
19a0: 20 28 22 31 22 20 69 66 20 64 4f 70 74 44 61 74   ("1" if dOptDat
19b0: 61 5b 22 64 4f 70 74 53 65 72 76 65 72 22 5d 2e  a["dOptServer"].
19c0: 67 65 74 28 73 4f 70 74 2c 20 4e 6f 6e 65 29 20  get(sOpt, None) 
19d0: 65 6c 73 65 20 22 30 22 29 20 2b 20 22 5c 6e 22  else "0") + "\n"
19e0: 29 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e 77  ).        hDst.w
19f0: 72 69 74 65 28 22 68 74 6d 6c 20 3d 20 31 5c 6e  rite("html = 1\n
1a00: 22 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 50  ")...def createP
1a10: 61 63 6b 61 67 65 5a 69 70 20 28 73 4c 61 6e 67  ackageZip (sLang
1a20: 2c 20 64 56 61 72 73 2c 20 73 70 4c 61 6e 67 50  , dVars, spLangP
1a30: 61 63 6b 29 3a 0a 20 20 20 20 22 63 72 65 61 74  ack):.    "creat
1a40: 65 20 73 65 72 76 65 72 20 7a 69 70 22 0a 20 20  e server zip".  
1a50: 20 20 73 70 66 5a 69 70 20 3d 20 22 5f 62 75 69    spfZip = "_bui
1a60: 6c 64 2f 22 20 2b 20 64 56 61 72 73 5b 27 6e 61  ld/" + dVars['na
1a70: 6d 65 27 5d 20 2b 20 22 2d 22 2b 20 64 56 61 72  me'] + "-"+ dVar
1a80: 73 5b 27 6c 61 6e 67 27 5d 20 2b 22 2d 76 22 20  s['lang'] +"-v" 
1a90: 2b 20 64 56 61 72 73 5b 27 76 65 72 73 69 6f 6e  + dVars['version
1aa0: 27 5d 20 2b 20 27 2e 7a 69 70 27 0a 20 20 20 20  '] + '.zip'.    
1ab0: 68 5a 69 70 20 3d 20 7a 69 70 66 69 6c 65 2e 5a  hZip = zipfile.Z
1ac0: 69 70 46 69 6c 65 28 73 70 66 5a 69 70 2c 20 6d  ipFile(spfZip, m
1ad0: 6f 64 65 3d 27 77 27 2c 20 63 6f 6d 70 72 65 73  ode='w', compres
1ae0: 73 69 6f 6e 3d 7a 69 70 66 69 6c 65 2e 5a 49 50  sion=zipfile.ZIP
1af0: 5f 44 45 46 4c 41 54 45 44 29 0a 20 20 20 20 63  _DEFLATED).    c
1b00: 6f 70 79 47 72 61 6d 6d 61 6c 65 63 74 65 50 79  opyGrammalectePy
1b10: 50 61 63 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65  PackageInZipFile
1b20: 28 68 5a 69 70 2c 20 73 70 4c 61 6e 67 50 61 63  (hZip, spLangPac
1b30: 6b 29 0a 20 20 20 20 66 6f 72 20 73 70 66 20 69  k).    for spf i
1b40: 6e 20 5b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  n ["grammalecte-
1b50: 63 6c 69 2e 70 79 22 2c 20 22 67 72 61 6d 6d 61  cli.py", "gramma
1b60: 6c 65 63 74 65 2d 73 65 72 76 65 72 2e 70 79 22  lecte-server.py"
1b70: 2c 20 22 62 6f 74 74 6c 65 2e 70 79 22 2c 20 5c  , "bottle.py", \
1b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b90: 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 73 65   "grammalecte-se
1ba0: 72 76 65 72 2d 6f 70 74 69 6f 6e 73 2e 5f 67 6c  rver-options._gl
1bb0: 6f 62 61 6c 2e 69 6e 69 22 2c 20 22 67 72 61 6d  obal.ini", "gram
1bc0: 6d 61 6c 65 63 74 65 2d 73 65 72 76 65 72 2d 6f  malecte-server-o
1bd0: 70 74 69 6f 6e 73 2e 22 2b 73 4c 61 6e 67 2b 22  ptions."+sLang+"
1be0: 2e 69 6e 69 22 2c 20 5c 0a 20 20 20 20 20 20 20  .ini", \.       
1bf0: 20 20 20 20 20 20 20 20 20 22 52 45 41 44 4d 45           "README
1c00: 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45 2e  .txt", "LICENSE.
1c10: 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45 2e 66  txt", "LICENSE.f
1c20: 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20 20 20 20  r.txt"]:.       
1c30: 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66 29   hZip.write(spf)
1c40: 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73  .    hZip.writes
1c50: 74 72 28 22 73 65 74 75 70 2e 70 79 22 2c 20 68  tr("setup.py", h
1c60: 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28  elpers.fileFile(
1c70: 22 67 63 5f 6c 61 6e 67 2f 66 72 2f 73 65 74 75  "gc_lang/fr/setu
1c80: 70 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a 0a  p.py", dVars))..
1c90: 0a 64 65 66 20 63 6f 70 79 47 72 61 6d 6d 61 6c  .def copyGrammal
1ca0: 65 63 74 65 50 79 50 61 63 6b 61 67 65 49 6e 5a  ectePyPackageInZ
1cb0: 69 70 46 69 6c 65 20 28 68 5a 69 70 2c 20 73 70  ipFile (hZip, sp
1cc0: 4c 61 6e 67 50 61 63 6b 2c 20 73 41 64 64 50 61  LangPack, sAddPa
1cd0: 74 68 3d 22 22 29 3a 0a 20 20 20 20 66 6f 72 20  th=""):.    for 
1ce0: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
1cf0: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 22 29 3a  ("grammalecte"):
1d00: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
1d10: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67  os.path.isdir("g
1d20: 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66 29  rammalecte/"+sf)
1d30: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 5a  :.            hZ
1d40: 69 70 2e 77 72 69 74 65 28 22 67 72 61 6d 6d 61  ip.write("gramma
1d50: 6c 65 63 74 65 2f 22 2b 73 66 2c 20 73 41 64 64  lecte/"+sf, sAdd
1d60: 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63 74  Path+"grammalect
1d70: 65 2f 22 2b 73 66 29 0a 20 20 20 20 66 6f 72 20  e/"+sf).    for 
1d80: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
1d90: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72  ("grammalecte/gr
1da0: 61 70 68 73 70 65 6c 6c 22 29 3a 0a 20 20 20 20  aphspell"):.    
1db0: 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61      if not os.pa
1dc0: 74 68 2e 69 73 64 69 72 28 22 67 72 61 6d 6d 61  th.isdir("gramma
1dd0: 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c  lecte/graphspell
1de0: 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20  /"+sf):.        
1df0: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22      hZip.write("
1e00: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70  grammalecte/grap
1e10: 68 73 70 65 6c 6c 2f 22 2b 73 66 2c 20 73 41 64  hspell/"+sf, sAd
1e20: 64 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63  dPath+"grammalec
1e30: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  te/graphspell/"+
1e40: 73 66 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69  sf).    for sf i
1e50: 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 72  n os.listdir("gr
1e60: 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73  ammalecte/graphs
1e70: 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69  pell/_dictionari
1e80: 65 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  es"):.        if
1e90: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
1ea0: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  ir("grammalecte/
1eb0: 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74  graphspell/_dict
1ec0: 69 6f 6e 61 72 69 65 73 2f 22 2b 73 66 29 3a 0a  ionaries/"+sf):.
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
1ee0: 2e 77 72 69 74 65 28 22 67 72 61 6d 6d 61 6c 65  .write("grammale
1ef0: 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f  cte/graphspell/_
1f00: 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73  dictionaries/"+s
1f10: 66 2c 20 73 41 64 64 50 61 74 68 2b 22 67 72 61  f, sAddPath+"gra
1f20: 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70  mmalecte/graphsp
1f30: 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65  ell/_dictionarie
1f40: 73 2f 22 2b 73 66 29 0a 20 20 20 20 66 6f 72 20  s/"+sf).    for 
1f50: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
1f60: 28 73 70 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20  (spLangPack):.  
1f70: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
1f80: 70 61 74 68 2e 69 73 64 69 72 28 73 70 4c 61 6e  path.isdir(spLan
1f90: 67 50 61 63 6b 2b 22 2f 22 2b 73 66 29 3a 0a 20  gPack+"/"+sf):. 
1fa0: 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e             hZip.
1fb0: 77 72 69 74 65 28 73 70 4c 61 6e 67 50 61 63 6b  write(spLangPack
1fc0: 2b 22 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74  +"/"+sf, sAddPat
1fd0: 68 2b 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22  h+spLangPack+"/"
1fe0: 2b 73 66 29 0a 0a 0a 64 65 66 20 63 72 65 61 74  +sf)...def creat
1ff0: 65 20 28 73 4c 61 6e 67 2c 20 78 43 6f 6e 66 69  e (sLang, xConfi
2000: 67 2c 20 62 49 6e 73 74 61 6c 6c 4f 58 54 2c 20  g, bInstallOXT, 
2010: 62 4a 61 76 61 53 63 72 69 70 74 29 3a 0a 20 20  bJavaScript):.  
2020: 20 20 6f 4e 6f 77 20 3d 20 64 61 74 65 74 69 6d    oNow = datetim
2030: 65 2e 64 61 74 65 74 69 6d 65 2e 6e 6f 77 28 29  e.datetime.now()
2040: 0a 20 20 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d  .    print("====
2050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 4d 41 4b 45 20  ========== MAKE 
2060: 47 52 41 4d 4d 41 4c 45 43 54 45 20 5b 7b 30 7d  GRAMMALECTE [{0}
2070: 5d 20 61 74 20 7b 31 2e 68 6f 75 72 3a 3e 32 7d  ] at {1.hour:>2}
2080: 20 68 20 7b 31 2e 6d 69 6e 75 74 65 3a 3e 32 7d   h {1.minute:>2}
2090: 20 6d 69 6e 20 7b 31 2e 73 65 63 6f 6e 64 3a 3e   min {1.second:>
20a0: 32 7d 20 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  2} s ===========
20b0: 3d 3d 3d 22 2e 66 6f 72 6d 61 74 28 73 4c 61 6e  ===".format(sLan
20c0: 67 2c 20 6f 4e 6f 77 29 29 0a 0a 20 20 20 20 23  g, oNow))..    #
20d0: 23 23 23 20 52 45 41 44 20 43 4f 4e 46 49 47 55  ### READ CONFIGU
20e0: 52 41 54 49 4f 4e 0a 20 20 20 20 70 72 69 6e 74  RATION.    print
20f0: 28 22 3e 20 72 65 61 64 20 63 6f 6e 66 69 67 75  ("> read configu
2100: 72 61 74 69 6f 6e 2e 2e 2e 22 29 0a 20 20 20 20  ration...").    
2110: 73 70 4c 61 6e 67 20 3d 20 22 67 63 5f 6c 61 6e  spLang = "gc_lan
2120: 67 2f 22 20 2b 20 73 4c 61 6e 67 0a 0a 20 20 20  g/" + sLang..   
2130: 20 64 56 61 72 73 20 3d 20 78 43 6f 6e 66 69 67   dVars = xConfig
2140: 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 61 72 67 73  ._sections['args
2150: 27 5d 0a 20 20 20 20 64 56 61 72 73 5b 27 6c 6f  '].    dVars['lo
2160: 63 61 6c 65 73 27 5d 20 3d 20 64 56 61 72 73 5b  cales'] = dVars[
2170: 22 6c 6f 63 61 6c 65 73 22 5d 2e 72 65 70 6c 61  "locales"].repla
2180: 63 65 28 22 5f 22 2c 20 22 2d 22 29 0a 20 20 20  ce("_", "-").   
2190: 20 64 56 61 72 73 5b 27 6c 6f 63 27 5d 20 3d 20   dVars['loc'] = 
21a0: 73 74 72 28 64 69 63 74 28 5b 20 5b 73 2c 20 5b  str(dict([ [s, [
21b0: 73 5b 30 3a 32 5d 2c 20 73 5b 33 3a 35 5d 2c 20  s[0:2], s[3:5], 
21c0: 22 22 5d 5d 20 66 6f 72 20 73 20 69 6e 20 64 56  ""]] for s in dV
21d0: 61 72 73 5b 22 6c 6f 63 61 6c 65 73 22 5d 2e 73  ars["locales"].s
21e0: 70 6c 69 74 28 22 20 22 29 20 5d 29 29 0a 0a 20  plit(" ") ])).. 
21f0: 20 20 20 23 23 20 43 4f 4d 50 49 4c 45 20 52 55     ## COMPILE RU
2200: 4c 45 53 0a 20 20 20 20 70 72 69 6e 74 28 22 3e  LES.    print(">
2210: 20 72 65 61 64 20 72 75 6c 65 73 20 66 69 6c 65   read rules file
2220: 2e 2e 2e 22 29 0a 20 20 20 20 74 72 79 3a 0a 20  ...").    try:. 
2230: 20 20 20 20 20 20 20 6c 52 75 6c 65 73 20 3d 20         lRules = 
2240: 6f 70 65 6e 28 73 70 4c 61 6e 67 20 2b 20 22 2f  open(spLang + "/
2250: 72 75 6c 65 73 2e 67 72 78 22 2c 20 27 72 27 2c  rules.grx", 'r',
2260: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
2270: 22 29 2e 72 65 61 64 6c 69 6e 65 73 28 29 0a 20  ").readlines(). 
2280: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
2290: 20 20 20 70 72 69 6e 74 28 22 52 75 6c 65 73 20     print("Rules 
22a0: 66 69 6c 65 20 69 6e 20 70 72 6f 6a 65 63 74 20  file in project 
22b0: 5b 22 20 2b 20 73 4c 61 6e 67 20 2b 20 22 5d 20  [" + sLang + "] 
22c0: 6e 6f 74 20 66 6f 75 6e 64 22 29 0a 20 20 20 20  not found").    
22d0: 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 64      return.    d
22e0: 56 61 72 73 2e 75 70 64 61 74 65 28 63 6f 6d 70  Vars.update(comp
22f0: 69 6c 65 5f 72 75 6c 65 73 2e 6d 61 6b 65 28 6c  ile_rules.make(l
2300: 52 75 6c 65 73 2c 20 64 56 61 72 73 5b 27 6c 61  Rules, dVars['la
2310: 6e 67 27 5d 2c 20 62 4a 61 76 61 53 63 72 69 70  ng'], bJavaScrip
2320: 74 29 29 0a 0a 20 20 20 20 23 23 20 52 45 41 44  t))..    ## READ
2330: 20 47 52 41 4d 4d 41 52 20 43 48 45 43 4b 45 52   GRAMMAR CHECKER
2340: 20 50 4c 55 47 49 4e 53 0a 20 20 20 20 70 72 69   PLUGINS.    pri
2350: 6e 74 28 22 50 59 54 48 4f 4e 3a 22 29 0a 20 20  nt("PYTHON:").  
2360: 20 20 70 72 69 6e 74 28 22 2b 20 50 6c 75 67 69    print("+ Plugi
2370: 6e 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20  ns: ", end=""). 
2380: 20 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73 20     sCodePlugins 
2390: 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 66 20  = "".    for sf 
23a0: 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 73 70  in os.listdir(sp
23b0: 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 22 29  Lang+"/modules")
23c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 72 65 2e  :.        if re.
23d0: 6d 61 74 63 68 28 72 22 67 63 65 5f 5c 77 2b 5b  match(r"gce_\w+[
23e0: 2e 5d 70 79 24 22 2c 20 73 66 29 3a 0a 20 20 20  .]py$", sf):.   
23f0: 20 20 20 20 20 20 20 20 20 73 43 6f 64 65 50 6c           sCodePl
2400: 75 67 69 6e 73 20 2b 3d 20 22 5c 6e 5c 6e 22 20  ugins += "\n\n" 
2410: 2b 20 6f 70 65 6e 28 73 70 4c 61 6e 67 2b 27 2f  + open(spLang+'/
2420: 6d 6f 64 75 6c 65 73 2f 27 2b 73 66 2c 20 22 72  modules/'+sf, "r
2430: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
2440: 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20 20 20  -8").read().    
2450: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 66          print(sf
2460: 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20  , end=", ").    
2470: 70 72 69 6e 74 28 29 0a 20 20 20 20 64 56 61 72  print().    dVar
2480: 73 5b 22 70 6c 75 67 69 6e 73 22 5d 20 3d 20 73  s["plugins"] = s
2490: 43 6f 64 65 50 6c 75 67 69 6e 73 0a 0a 20 20 20  CodePlugins..   
24a0: 20 23 23 20 43 4f 50 59 20 47 43 5f 43 4f 52 45   ## COPY GC_CORE
24b0: 20 43 4f 4d 4d 4f 4e 20 46 49 4c 45 53 0a 20 20   COMMON FILES.  
24c0: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
24d0: 69 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f  istdir("gc_core/
24e0: 70 79 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  py"):.        if
24f0: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
2500: 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 22  ir("gc_core/py/"
2510: 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20  +sf):.          
2520: 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e    helpers.copyAn
2530: 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 22 67  dFileTemplate("g
2540: 63 5f 63 6f 72 65 2f 70 79 2f 22 2b 73 66 2c 20  c_core/py/"+sf, 
2550: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73  "grammalecte/"+s
2560: 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20 6f 70  f, dVars).    op
2570: 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  en("grammalecte/
2580: 57 41 52 4e 49 4e 47 2e 74 78 74 22 2c 20 22 77  WARNING.txt", "w
2590: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
25a0: 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e  -8", newline="\n
25b0: 22 29 2e 77 72 69 74 65 28 73 57 61 72 6e 69 6e  ").write(sWarnin
25c0: 67 4d 65 73 73 61 67 65 29 0a 0a 20 20 20 20 23  gMessage)..    #
25d0: 23 20 43 52 45 41 54 45 20 47 52 41 4d 4d 41 52  # CREATE GRAMMAR
25e0: 20 43 48 45 43 4b 45 52 20 50 41 43 4b 41 47 45   CHECKER PACKAGE
25f0: 0a 20 20 20 20 73 70 4c 61 6e 67 50 61 63 6b 20  .    spLangPack 
2600: 3d 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22  = "grammalecte/"
2610: 2b 73 4c 61 6e 67 0a 20 20 20 20 68 65 6c 70 65  +sLang.    helpe
2620: 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e 46 6f  rs.createCleanFo
2630: 6c 64 65 72 28 73 70 4c 61 6e 67 50 61 63 6b 29  lder(spLangPack)
2640: 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f  .    for sf in o
2650: 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f 63 6f  s.listdir("gc_co
2660: 72 65 2f 70 79 2f 6c 61 6e 67 5f 63 6f 72 65 22  re/py/lang_core"
2670: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
2680: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
2690: 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e 67  "gc_core/py/lang
26a0: 5f 63 6f 72 65 2f 22 2b 73 66 29 3a 0a 20 20 20  _core/"+sf):.   
26b0: 20 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73           helpers
26c0: 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70  .copyAndFileTemp
26d0: 6c 61 74 65 28 22 67 63 5f 63 6f 72 65 2f 70 79  late("gc_core/py
26e0: 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 2c  /lang_core/"+sf,
26f0: 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b   spLangPack+"/"+
2700: 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20 70  sf, dVars).    p
2710: 72 69 6e 74 28 22 2b 20 4d 6f 64 75 6c 65 73 3a  rint("+ Modules:
2720: 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20   ", end="").    
2730: 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73  for sf in os.lis
2740: 74 64 69 72 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f  tdir(spLang+"/mo
2750: 64 75 6c 65 73 22 29 3a 0a 20 20 20 20 20 20 20  dules"):.       
2760: 20 69 66 20 6e 6f 74 20 73 66 2e 73 74 61 72 74   if not sf.start
2770: 73 77 69 74 68 28 28 22 67 63 65 5f 22 2c 20 22  swith(("gce_", "
2780: 5f 5f 70 79 63 61 63 68 65 5f 5f 22 29 29 3a 0a  __pycache__")):.
2790: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
27a0: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
27b0: 65 6d 70 6c 61 74 65 28 73 70 4c 61 6e 67 2b 22  emplate(spLang+"
27c0: 2f 6d 6f 64 75 6c 65 73 2f 22 2b 73 66 2c 20 73  /modules/"+sf, s
27d0: 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66  pLangPack+"/"+sf
27e0: 2c 20 64 56 61 72 73 29 0a 20 20 20 20 20 20 20  , dVars).       
27f0: 20 20 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65       print(sf, e
2800: 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 70 72 69  nd=", ").    pri
2810: 6e 74 28 29 0a 0a 20 20 20 20 23 20 54 45 53 54  nt()..    # TEST
2820: 20 46 49 4c 45 53 0a 20 20 20 20 77 69 74 68 20   FILES.    with 
2830: 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63 74  open("grammalect
2840: 65 2f 22 2b 73 4c 61 6e 67 2b 22 2f 67 63 5f 74  e/"+sLang+"/gc_t
2850: 65 73 74 2e 74 78 74 22 2c 20 22 77 22 2c 20 65  est.txt", "w", e
2860: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c  ncoding="utf-8",
2870: 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 20 61   newline="\n") a
2880: 73 20 68 44 73 74 50 79 3a 0a 20 20 20 20 20 20  s hDstPy:.      
2890: 20 20 68 44 73 74 50 79 2e 77 72 69 74 65 28 22    hDstPy.write("
28a0: 23 20 54 45 53 54 53 20 46 4f 52 20 4c 41 4e 47  # TESTS FOR LANG
28b0: 20 5b 22 20 2b 20 73 4c 61 6e 67 20 2b 20 22 5d   [" + sLang + "]
28c0: 5c 6e 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 68  \n\n").        h
28d0: 44 73 74 50 79 2e 77 72 69 74 65 28 64 56 61 72  DstPy.write(dVar
28e0: 73 5b 27 67 63 74 65 73 74 73 27 5d 29 0a 0a 20  s['gctests']).. 
28f0: 20 20 20 63 72 65 61 74 65 4f 58 54 28 73 70 4c     createOXT(spL
2900: 61 6e 67 2c 20 64 56 61 72 73 2c 20 78 43 6f 6e  ang, dVars, xCon
2910: 66 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 6f  fig._sections['o
2920: 78 74 27 5d 2c 20 73 70 4c 61 6e 67 50 61 63 6b  xt'], spLangPack
2930: 2c 20 62 49 6e 73 74 61 6c 6c 4f 58 54 29 0a 0a  , bInstallOXT)..
2940: 20 20 20 20 63 72 65 61 74 65 53 65 72 76 65 72      createServer
2950: 4f 70 74 69 6f 6e 73 28 73 4c 61 6e 67 2c 20 64  Options(sLang, d
2960: 56 61 72 73 29 0a 20 20 20 20 63 72 65 61 74 65  Vars).    create
2970: 50 61 63 6b 61 67 65 5a 69 70 28 73 4c 61 6e 67  PackageZip(sLang
2980: 2c 20 64 56 61 72 73 2c 20 73 70 4c 61 6e 67 50  , dVars, spLangP
2990: 61 63 6b 29 0a 0a 20 20 20 20 23 23 23 23 20 4a  ack)..    #### J
29a0: 41 56 41 53 43 52 49 50 54 0a 20 20 20 20 69 66  AVASCRIPT.    if
29b0: 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a 20 20   bJavaScript:.  
29c0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 4a 41 56        print("JAV
29d0: 41 53 43 52 49 50 54 3a 22 29 0a 20 20 20 20 20  ASCRIPT:").     
29e0: 20 20 20 70 72 69 6e 74 28 22 2b 20 50 6c 75 67     print("+ Plug
29f0: 69 6e 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a  ins: ", end="").
2a00: 20 20 20 20 20 20 20 20 73 43 6f 64 65 50 6c 75          sCodePlu
2a10: 67 69 6e 73 20 3d 20 22 22 0a 20 20 20 20 20 20  gins = "".      
2a20: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
2a30: 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 22 2f  istdir(spLang+"/
2a40: 6d 6f 64 75 6c 65 73 2d 6a 73 22 29 3a 0a 20 20  modules-js"):.  
2a50: 20 20 20 20 20 20 20 20 20 20 69 66 20 72 65 2e            if re.
2a60: 6d 61 74 63 68 28 72 22 67 63 65 5f 5c 77 2b 5b  match(r"gce_\w+[
2a70: 2e 5d 6a 73 24 22 2c 20 73 66 29 3a 0a 20 20 20  .]js$", sf):.   
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f               sCo
2a90: 64 65 50 6c 75 67 69 6e 73 20 2b 3d 20 22 5c 6e  dePlugins += "\n
2aa0: 5c 6e 22 20 2b 20 6f 70 65 6e 28 73 70 4c 61 6e  \n" + open(spLan
2ab0: 67 2b 27 2f 6d 6f 64 75 6c 65 73 2d 6a 73 2f 27  g+'/modules-js/'
2ac0: 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69  +sf, "r", encodi
2ad0: 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72 65 61 64  ng="utf-8").read
2ae0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
2af0: 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64     print(sf, end
2b00: 3d 22 2c 20 22 29 0a 20 20 20 20 20 20 20 20 70  =", ").        p
2b10: 72 69 6e 74 28 29 0a 20 20 20 20 20 20 20 20 64  rint().        d
2b20: 56 61 72 73 5b 22 70 6c 75 67 69 6e 73 4a 53 22  Vars["pluginsJS"
2b30: 5d 20 3d 20 73 43 6f 64 65 50 6c 75 67 69 6e 73  ] = sCodePlugins
2b40: 0a 0a 20 20 20 20 20 20 20 20 23 20 6f 70 74 69  ..        # opti
2b50: 6f 6e 73 20 64 61 74 61 20 73 74 72 75 63 74 0a  ons data struct.
2b60: 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 22 64          dVars["d
2b70: 4f 70 74 4a 61 76 61 53 63 72 69 70 74 22 5d 20  OptJavaScript"] 
2b80: 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 69 73  = json.dumps(lis
2b90: 74 28 64 56 61 72 73 5b 22 64 4f 70 74 4a 61 76  t(dVars["dOptJav
2ba0: 61 53 63 72 69 70 74 22 5d 2e 69 74 65 6d 73 28  aScript"].items(
2bb0: 29 29 29 0a 20 20 20 20 20 20 20 20 64 56 61 72  ))).        dVar
2bc0: 73 5b 22 64 4f 70 74 46 69 72 65 66 6f 78 22 5d  s["dOptFirefox"]
2bd0: 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 69   = json.dumps(li
2be0: 73 74 28 64 56 61 72 73 5b 22 64 4f 70 74 46 69  st(dVars["dOptFi
2bf0: 72 65 66 6f 78 22 5d 2e 69 74 65 6d 73 28 29 29  refox"].items())
2c00: 29 0a 20 20 20 20 20 20 20 20 64 56 61 72 73 5b  ).        dVars[
2c10: 22 64 4f 70 74 54 68 75 6e 64 65 72 62 69 72 64  "dOptThunderbird
2c20: 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28  "] = json.dumps(
2c30: 6c 69 73 74 28 64 56 61 72 73 5b 22 64 4f 70 74  list(dVars["dOpt
2c40: 54 68 75 6e 64 65 72 62 69 72 64 22 5d 2e 69 74  Thunderbird"].it
2c50: 65 6d 73 28 29 29 29 0a 20 20 20 20 20 20 20 20  ems())).        
2c60: 0a 20 20 20 20 20 20 20 20 23 20 63 72 65 61 74  .        # creat
2c70: 65 20 66 6f 6c 64 65 72 0a 20 20 20 20 20 20 20  e folder.       
2c80: 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22 67   spLangPack = "g
2c90: 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b  rammalecte-js/"+
2ca0: 73 4c 61 6e 67 0a 20 20 20 20 20 20 20 20 68 65  sLang.        he
2cb0: 6c 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61  lpers.createClea
2cc0: 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67 50 61  nFolder(spLangPa
2cd0: 63 6b 29 0a 0a 20 20 20 20 20 20 20 20 23 20 63  ck)..        # c
2ce0: 72 65 61 74 65 20 66 69 6c 65 73 0a 20 20 20 20  reate files.    
2cf0: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
2d00: 2e 6c 69 73 74 64 69 72 28 22 6a 73 5f 65 78 74  .listdir("js_ext
2d10: 65 6e 73 69 6f 6e 22 29 3a 0a 20 20 20 20 20 20  ension"):.      
2d20: 20 20 20 20 20 20 64 56 61 72 73 5b 73 66 5b 3a        dVars[sf[:
2d30: 2d 33 5d 5d 20 3d 20 6f 70 65 6e 28 22 6a 73 5f  -3]] = open("js_
2d40: 65 78 74 65 6e 73 69 6f 6e 2f 22 2b 73 66 2c 20  extension/"+sf, 
2d50: 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "r", encoding="u
2d60: 74 66 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20  tf-8").read().  
2d70: 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20        for sf in 
2d80: 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f 63  os.listdir("gc_c
2d90: 6f 72 65 2f 6a 73 22 29 3a 0a 20 20 20 20 20 20  ore/js"):.      
2da0: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
2db0: 70 61 74 68 2e 69 73 64 69 72 28 22 67 63 5f 63  path.isdir("gc_c
2dc0: 6f 72 65 2f 6a 73 2f 22 2b 73 66 29 20 61 6e 64  ore/js/"+sf) and
2dd0: 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69   not sf.startswi
2de0: 74 68 28 22 6a 73 65 78 5f 22 29 3a 0a 20 20 20  th("jsex_"):.   
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
2e00: 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65  pers.copyAndFile
2e10: 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72  Template("gc_cor
2e20: 65 2f 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61 6d  e/js/"+sf, "gram
2e30: 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66 2c  malecte-js/"+sf,
2e40: 20 64 56 61 72 73 29 0a 20 20 20 20 20 20 20 20   dVars).        
2e50: 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63 74  open("grammalect
2e60: 65 2d 6a 73 2f 57 41 52 4e 49 4e 47 2e 74 78 74  e-js/WARNING.txt
2e70: 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67  ", "w", encoding
2e80: 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e  ="utf-8", newlin
2e90: 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 57  e="\n").write(sW
2ea0: 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 29 0a 20  arningMessage). 
2eb0: 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e         for sf in
2ec0: 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f   os.listdir("gc_
2ed0: 63 6f 72 65 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72  core/js/lang_cor
2ee0: 65 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e"):.           
2ef0: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
2f00: 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a  isdir("gc_core/j
2f10: 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66  s/lang_core/"+sf
2f20: 29 20 61 6e 64 20 73 66 2e 73 74 61 72 74 73 77  ) and sf.startsw
2f30: 69 74 68 28 22 67 63 5f 22 29 3a 0a 20 20 20 20  ith("gc_"):.    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
2f50: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
2f60: 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72 65  emplate("gc_core
2f70: 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b  /js/lang_core/"+
2f80: 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22  sf, spLangPack+"
2f90: 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20  /"+sf, dVars).  
2fa0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 2b 20 4d        print("+ M
2fb0: 6f 64 75 6c 65 73 3a 20 22 2c 20 65 6e 64 3d 22  odules: ", end="
2fc0: 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73  ").        for s
2fd0: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
2fe0: 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73  spLang+"/modules
2ff0: 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20  -js"):.         
3000: 20 20 20 69 66 20 6e 6f 74 20 73 66 2e 73 74 61     if not sf.sta
3010: 72 74 73 77 69 74 68 28 22 67 63 65 5f 22 29 3a  rtswith("gce_"):
3020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3030: 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64   helpers.copyAnd
3040: 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73 70 4c  FileTemplate(spL
3050: 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73  ang+"/modules-js
3060: 2f 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50 61 63  /"+sf, spLangPac
3070: 6b 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73 29  k+"/"+sf, dVars)
3080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3090: 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d 22   print(sf, end="
30a0: 2c 20 22 29 0a 20 20 20 20 20 20 20 20 70 72 69  , ").        pri
30b0: 6e 74 28 29 0a 0a 20 20 20 20 20 20 20 20 74 72  nt()..        tr
30c0: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  y:.            b
30d0: 75 69 6c 64 5f 6d 6f 64 75 6c 65 20 3d 20 69 6d  uild_module = im
30e0: 70 6f 72 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d  portlib.import_m
30f0: 6f 64 75 6c 65 28 22 67 63 5f 6c 61 6e 67 2e 22  odule("gc_lang."
3100: 2b 73 4c 61 6e 67 2b 22 2e 62 75 69 6c 64 22 29  +sLang+".build")
3110: 0a 20 20 20 20 20 20 20 20 65 78 63 65 70 74 20  .        except 
3120: 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20  ImportError:.   
3130: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
3140: 23 20 4e 6f 20 63 6f 6d 70 6c 65 6d 65 6e 74 61  # No complementa
3150: 72 79 20 62 75 69 6c 64 65 72 20 3c 62 75 69 6c  ry builder <buil
3160: 64 2e 70 79 3e 20 69 6e 20 66 6f 6c 64 65 72 20  d.py> in folder 
3170: 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29  gc_lang/"+sLang)
3180: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
3190: 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
31a0: 5f 6d 6f 64 75 6c 65 2e 62 75 69 6c 64 28 73 4c  _module.build(sL
31b0: 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70 4c 61  ang, dVars, spLa
31c0: 6e 67 50 61 63 6b 29 0a 0a 20 20 20 20 72 65 74  ngPack)..    ret
31d0: 75 72 6e 20 64 56 61 72 73 5b 27 76 65 72 73 69  urn dVars['versi
31e0: 6f 6e 27 5d 0a 0a 0a 64 65 66 20 63 6f 70 79 47  on']...def copyG
31f0: 72 61 70 68 73 70 65 6c 6c 43 6f 72 65 20 28 62  raphspellCore (b
3200: 4a 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73 65  JavaScript=False
3210: 29 3a 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 63  ):.    helpers.c
3220: 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72  reateCleanFolder
3230: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72  ("grammalecte/gr
3240: 61 70 68 73 70 65 6c 6c 22 29 0a 20 20 20 20 64  aphspell").    d
3250: 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68 28 22  ir_util.mkpath("
3260: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70  grammalecte/grap
3270: 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61  hspell/_dictiona
3280: 72 69 65 73 22 29 0a 20 20 20 20 66 6f 72 20 73  ries").    for s
3290: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
32a0: 22 67 72 61 70 68 73 70 65 6c 6c 22 29 3a 0a 20  "graphspell"):. 
32b0: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
32c0: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61  .path.isdir("gra
32d0: 70 68 73 70 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20  phspell/"+sf):. 
32e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f             file_
32f0: 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 22  util.copy_file("
3300: 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66 2c  graphspell/"+sf,
3310: 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72   "grammalecte/gr
3320: 61 70 68 73 70 65 6c 6c 22 29 0a 20 20 20 20 69  aphspell").    i
3330: 66 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a 20  f bJavaScript:. 
3340: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63         helpers.c
3350: 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72  reateCleanFolder
3360: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73  ("grammalecte-js
3370: 2f 67 72 61 70 68 73 70 65 6c 6c 22 29 0a 20 20  /graphspell").  
3380: 20 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d        dir_util.m
3390: 6b 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63  kpath("grammalec
33a0: 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c  te-js/graphspell
33b0: 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29  /_dictionaries")
33c0: 0a 20 20 20 20 20 20 20 20 64 56 61 72 73 20 3d  .        dVars =
33d0: 20 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 20   {}.        for 
33e0: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
33f0: 28 22 6a 73 5f 65 78 74 65 6e 73 69 6f 6e 22 29  ("js_extension")
3400: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 56  :.            dV
3410: 61 72 73 5b 73 66 5b 3a 2d 33 5d 5d 20 3d 20 6f  ars[sf[:-3]] = o
3420: 70 65 6e 28 22 6a 73 5f 65 78 74 65 6e 73 69 6f  pen("js_extensio
3430: 6e 2f 22 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63  n/"+sf, "r", enc
3440: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72  oding="utf-8").r
3450: 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 66 6f  ead().        fo
3460: 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64  r sf in os.listd
3470: 69 72 28 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a  ir("graphspell-j
3480: 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s"):.           
3490: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
34a0: 69 73 64 69 72 28 22 67 72 61 70 68 73 70 65 6c  isdir("graphspel
34b0: 6c 2d 6a 73 2f 22 2b 73 66 29 3a 0a 20 20 20 20  l-js/"+sf):.    
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
34d0: 5f 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28  _util.copy_file(
34e0: 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f 22  "graphspell-js/"
34f0: 2b 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74  +sf, "grammalect
3500: 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 22  e-js/graphspell"
3510: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3520: 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e    helpers.copyAn
3530: 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 22 67  dFileTemplate("g
3540: 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f 22 2b 73  raphspell-js/"+s
3550: 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  f, "grammalecte-
3560: 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  js/graphspell/"+
3570: 73 66 2c 20 64 56 61 72 73 29 0a 0a 0a 64 65 66  sf, dVars)...def
3580: 20 63 6f 70 79 47 72 61 70 68 73 70 65 6c 6c 44   copyGraphspellD
3590: 69 63 74 69 6f 6e 61 72 69 65 73 20 28 64 56 61  ictionaries (dVa
35a0: 72 73 2c 20 62 4a 61 76 61 53 63 72 69 70 74 3d  rs, bJavaScript=
35b0: 46 61 6c 73 65 2c 20 62 45 78 74 65 6e 64 65 64  False, bExtended
35c0: 44 69 63 74 3d 46 61 6c 73 65 2c 20 62 43 6f 6d  Dict=False, bCom
35d0: 6d 75 6e 69 74 79 44 69 63 74 3d 46 61 6c 73 65  munityDict=False
35e0: 2c 20 62 50 65 72 73 6f 6e 61 6c 44 69 63 74 3d  , bPersonalDict=
35f0: 46 61 6c 73 65 29 3a 0a 20 20 20 20 64 56 61 72  False):.    dVar
3600: 73 5b 22 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65  s["dic_main_file
3610: 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20  name_py"] = "". 
3620: 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f 6d 61     dVars["dic_ma
3630: 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d  in_filename_js"]
3640: 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b   = "".    dVars[
3650: 22 64 69 63 5f 65 78 74 65 6e 64 65 64 5f 66 69  "dic_extended_fi
3660: 6c 65 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22  lename_py"] = ""
3670: 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f  .    dVars["dic_
3680: 65 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d  extended_filenam
3690: 65 5f 6a 73 22 5d 20 3d 20 22 22 0a 20 20 20 20  e_js"] = "".    
36a0: 64 56 61 72 73 5b 22 64 69 63 5f 63 6f 6d 6d 75  dVars["dic_commu
36b0: 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 70 79  nity_filename_py
36c0: 22 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72  "] = "".    dVar
36d0: 73 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79  s["dic_community
36e0: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d  _filename_js"] =
36f0: 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64   "".    dVars["d
3700: 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65  ic_personal_file
3710: 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20  name_py"] = "". 
3720: 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f 70 65     dVars["dic_pe
3730: 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f  rsonal_filename_
3740: 6a 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 6c 44  js"] = "".    lD
3750: 69 63 74 20 3d 20 5b 20 28 22 6d 61 69 6e 22 2c  ict = [ ("main",
3760: 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69 6c 65   dVars['dic_file
3770: 6e 61 6d 65 27 5d 29 20 5d 0a 20 20 20 20 69 66  name']) ].    if
3780: 20 62 45 78 74 65 6e 64 65 64 44 69 63 74 3a 0a   bExtendedDict:.
3790: 20 20 20 20 20 20 20 20 6c 44 69 63 74 2e 61 70          lDict.ap
37a0: 70 65 6e 64 28 28 22 65 78 74 65 6e 64 65 64 22  pend(("extended"
37b0: 2c 20 64 56 61 72 73 5b 27 64 69 63 5f 65 78 74  , dVars['dic_ext
37c0: 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65 27 5d  ended_filename']
37d0: 29 29 0a 20 20 20 20 69 66 20 62 43 6f 6d 6d 75  )).    if bCommu
37e0: 6e 69 74 79 44 69 63 74 3a 0a 20 20 20 20 20 20  nityDict:.      
37f0: 20 20 6c 44 69 63 74 2e 61 70 70 65 6e 64 28 28    lDict.append((
3800: 22 63 6f 6d 6d 75 6e 69 74 79 22 2c 20 64 56 61  "community", dVa
3810: 72 73 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69 74  rs['dic_communit
3820: 79 5f 66 69 6c 65 6e 61 6d 65 27 5d 29 29 0a 20  y_filename'])). 
3830: 20 20 20 69 66 20 62 50 65 72 73 6f 6e 61 6c 44     if bPersonalD
3840: 69 63 74 3a 0a 20 20 20 20 20 20 20 20 6c 44 69  ict:.        lDi
3850: 63 74 2e 61 70 70 65 6e 64 28 28 22 70 65 72 73  ct.append(("pers
3860: 6f 6e 61 6c 22 2c 20 64 56 61 72 73 5b 27 64 69  onal", dVars['di
3870: 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e  c_personal_filen
3880: 61 6d 65 27 5d 29 29 0a 20 20 20 20 66 6f 72 20  ame'])).    for 
3890: 73 54 79 70 65 2c 20 73 46 69 6c 65 4e 61 6d 65  sType, sFileName
38a0: 20 69 6e 20 6c 44 69 63 74 3a 0a 20 20 20 20 20   in lDict:.     
38b0: 20 20 20 73 70 66 50 79 44 69 63 20 3d 20 22 67     spfPyDic = "g
38c0: 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69  raphspell/_dicti
38d0: 6f 6e 61 72 69 65 73 2f 22 20 2b 20 73 46 69 6c  onaries/" + sFil
38e0: 65 4e 61 6d 65 20 2b 20 22 2e 62 64 69 63 22 0a  eName + ".bdic".
38f0: 20 20 20 20 20 20 20 20 73 70 66 4a 53 44 69 63          spfJSDic
3900: 20 3d 20 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a   = "graphspell-j
3910: 73 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  s/_dictionaries/
3920: 22 20 2b 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20  " + sFileName + 
3930: 22 2e 6a 73 6f 6e 22 0a 20 20 20 20 20 20 20 20  ".json".        
3940: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
3950: 73 66 69 6c 65 28 73 70 66 50 79 44 69 63 29 20  sfile(spfPyDic) 
3960: 6f 72 20 28 62 4a 61 76 61 53 63 72 69 70 74 20  or (bJavaScript 
3970: 61 6e 64 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e  and not os.path.
3980: 69 73 66 69 6c 65 28 73 70 66 4a 53 44 69 63 29  isfile(spfJSDic)
3990: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ):.            b
39a0: 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 28 64  uildDictionary(d
39b0: 56 61 72 73 2c 20 73 54 79 70 65 2c 20 62 4a 61  Vars, sType, bJa
39c0: 76 61 53 63 72 69 70 74 29 0a 20 20 20 20 20 20  vaScript).      
39d0: 20 20 70 72 69 6e 74 28 73 70 66 50 79 44 69 63    print(spfPyDic
39e0: 29 0a 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75  ).        file_u
39f0: 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73 70  til.copy_file(sp
3a00: 66 50 79 44 69 63 2c 20 22 67 72 61 6d 6d 61 6c  fPyDic, "grammal
3a10: 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f  ecte/graphspell/
3a20: 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29 0a  _dictionaries").
3a30: 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 27 64          dVars['d
3a40: 69 63 5f 27 2b 73 54 79 70 65 2b 27 5f 66 69 6c  ic_'+sType+'_fil
3a50: 65 6e 61 6d 65 5f 70 79 27 5d 20 3d 20 73 46 69  ename_py'] = sFi
3a60: 6c 65 4e 61 6d 65 20 2b 20 27 2e 62 64 69 63 27  leName + '.bdic'
3a70: 0a 20 20 20 20 20 20 20 20 69 66 20 62 4a 61 76  .        if bJav
3a80: 61 53 63 72 69 70 74 3a 0a 20 20 20 20 20 20 20  aScript:.       
3a90: 20 20 20 20 20 66 69 6c 65 5f 75 74 69 6c 2e 63       file_util.c
3aa0: 6f 70 79 5f 66 69 6c 65 28 73 70 66 4a 53 44 69  opy_file(spfJSDi
3ab0: 63 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  c, "grammalecte-
3ac0: 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64  js/graphspell/_d
3ad0: 69 63 74 69 6f 6e 61 72 69 65 73 22 29 0a 20 20  ictionaries").  
3ae0: 20 20 20 20 20 20 20 20 20 20 64 56 61 72 73 5b            dVars[
3af0: 27 64 69 63 5f 27 2b 73 54 79 70 65 2b 27 5f 66  'dic_'+sType+'_f
3b00: 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d 20 3d 20 73  ilename_js'] = s
3b10: 46 69 6c 65 4e 61 6d 65 20 2b 20 27 2e 6a 73 6f  FileName + '.jso
3b20: 6e 27 0a 0a 0a 64 65 66 20 62 75 69 6c 64 44 69  n'...def buildDi
3b30: 63 74 69 6f 6e 61 72 79 20 28 64 56 61 72 73 2c  ctionary (dVars,
3b40: 20 73 54 79 70 65 2c 20 62 4a 61 76 61 53 63 72   sType, bJavaScr
3b50: 69 70 74 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20  ipt=False):.    
3b60: 69 66 20 73 54 79 70 65 20 3d 3d 20 22 6d 61 69  if sType == "mai
3b70: 6e 22 3a 0a 20 20 20 20 20 20 20 20 73 70 66 4c  n":.        spfL
3b80: 65 78 53 72 63 20 3d 20 64 56 61 72 73 5b 27 6c  exSrc = dVars['l
3b90: 65 78 69 63 6f 6e 5f 73 72 63 27 5d 0a 20 20 20  exicon_src'].   
3ba0: 20 20 20 20 20 73 66 44 69 63 74 44 73 74 20 3d       sfDictDst =
3bb0: 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69 6c 65   dVars['dic_file
3bc0: 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 73  name'].        s
3bd0: 44 69 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b  DicName = dVars[
3be0: 27 64 69 63 5f 6e 61 6d 65 27 5d 0a 20 20 20 20  'dic_name'].    
3bf0: 65 6c 69 66 20 73 54 79 70 65 20 3d 3d 20 22 65  elif sType == "e
3c00: 78 74 65 6e 64 65 64 22 3a 0a 20 20 20 20 20 20  xtended":.      
3c10: 20 20 73 70 66 4c 65 78 53 72 63 20 3d 20 64 56    spfLexSrc = dV
3c20: 61 72 73 5b 27 6c 65 78 69 63 6f 6e 5f 65 78 74  ars['lexicon_ext
3c30: 65 6e 64 65 64 5f 73 72 63 27 5d 0a 20 20 20 20  ended_src'].    
3c40: 20 20 20 20 73 66 44 69 63 74 44 73 74 20 3d 20      sfDictDst = 
3c50: 64 56 61 72 73 5b 27 64 69 63 5f 65 78 74 65 6e  dVars['dic_exten
3c60: 64 65 64 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a 20  ded_filename']. 
3c70: 20 20 20 20 20 20 20 73 44 69 63 4e 61 6d 65 20         sDicName 
3c80: 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 65 78 74  = dVars['dic_ext
3c90: 65 6e 64 65 64 5f 6e 61 6d 65 27 5d 0a 20 20 20  ended_name'].   
3ca0: 20 65 6c 69 66 20 73 54 79 70 65 20 3d 3d 20 22   elif sType == "
3cb0: 63 6f 6d 6d 75 6e 69 74 79 22 3a 0a 20 20 20 20  community":.    
3cc0: 20 20 20 20 73 70 66 4c 65 78 53 72 63 20 3d 20      spfLexSrc = 
3cd0: 64 56 61 72 73 5b 27 6c 65 78 69 63 6f 6e 5f 63  dVars['lexicon_c
3ce0: 6f 6d 6d 75 6e 69 74 79 5f 73 72 63 27 5d 0a 20  ommunity_src']. 
3cf0: 20 20 20 20 20 20 20 73 66 44 69 63 74 44 73 74         sfDictDst
3d00: 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 63 6f   = dVars['dic_co
3d10: 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65  mmunity_filename
3d20: 27 5d 0a 20 20 20 20 20 20 20 20 73 44 69 63 4e  '].        sDicN
3d30: 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64 69 63  ame = dVars['dic
3d40: 5f 63 6f 6d 6d 75 6e 69 74 79 5f 6e 61 6d 65 27  _community_name'
3d50: 5d 0a 20 20 20 20 65 6c 69 66 20 73 54 79 70 65  ].    elif sType
3d60: 20 3d 3d 20 22 70 65 72 73 6f 6e 61 6c 22 3a 0a   == "personal":.
3d70: 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53 72          spfLexSr
3d80: 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69 63  c = dVars['lexic
3d90: 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63 27  on_personal_src'
3da0: 5d 0a 20 20 20 20 20 20 20 20 73 66 44 69 63 74  ].        sfDict
3db0: 44 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69 63  Dst = dVars['dic
3dc0: 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61  _personal_filena
3dd0: 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 73 44 69  me'].        sDi
3de0: 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64  cName = dVars['d
3df0: 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 6e 61 6d 65  ic_personal_name
3e00: 27 5d 0a 20 20 20 20 6c 65 78 5f 62 75 69 6c 64  '].    lex_build
3e10: 2e 62 75 69 6c 64 28 73 70 66 4c 65 78 53 72 63  .build(spfLexSrc
3e20: 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c  , dVars['lang'],
3e30: 20 64 56 61 72 73 5b 27 6c 61 6e 67 5f 6e 61 6d   dVars['lang_nam
3e40: 65 27 5d 2c 20 73 66 44 69 63 74 44 73 74 2c 20  e'], sfDictDst, 
3e50: 62 4a 61 76 61 53 63 72 69 70 74 2c 20 73 44 69  bJavaScript, sDi
3e60: 63 4e 61 6d 65 2c 20 64 56 61 72 73 5b 27 73 74  cName, dVars['st
3e70: 65 6d 6d 69 6e 67 5f 6d 65 74 68 6f 64 27 5d 2c  emming_method'],
3e80: 20 69 6e 74 28 64 56 61 72 73 5b 27 66 73 61 5f   int(dVars['fsa_
3e90: 6d 65 74 68 6f 64 27 5d 29 29 0a 0a 0a 0a 64 65  method']))....de
3ea0: 66 20 6d 61 69 6e 20 28 29 3a 0a 20 20 20 20 70  f main ():.    p
3eb0: 72 69 6e 74 28 22 50 79 74 68 6f 6e 3a 20 22 20  rint("Python: " 
3ec0: 2b 20 73 79 73 2e 76 65 72 73 69 6f 6e 29 0a 20  + sys.version). 
3ed0: 20 20 20 78 50 61 72 73 65 72 20 3d 20 61 72 67     xParser = arg
3ee0: 70 61 72 73 65 2e 41 72 67 75 6d 65 6e 74 50 61  parse.ArgumentPa
3ef0: 72 73 65 72 28 29 0a 20 20 20 20 78 50 61 72 73  rser().    xPars
3f00: 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28  er.add_argument(
3f10: 22 6c 61 6e 67 22 2c 20 74 79 70 65 3d 73 74 72  "lang", type=str
3f20: 2c 20 6e 61 72 67 73 3d 27 2b 27 2c 20 68 65 6c  , nargs='+', hel
3f30: 70 3d 22 6c 61 6e 67 20 70 72 6f 6a 65 63 74 20  p="lang project 
3f40: 74 6f 20 67 65 6e 65 72 61 74 65 20 28 6e 61 6d  to generate (nam
3f50: 65 20 6f 66 20 66 6f 6c 64 65 72 20 69 6e 20 2f  e of folder in /
3f60: 6c 61 6e 67 29 22 29 0a 20 20 20 20 78 50 61 72  lang)").    xPar
3f70: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
3f80: 28 22 2d 62 22 2c 20 22 2d 2d 62 75 69 6c 64 5f  ("-b", "--build_
3f90: 64 61 74 61 22 2c 20 68 65 6c 70 3d 22 6c 61 75  data", help="lau
3fa0: 6e 63 68 20 62 75 69 6c 64 5f 64 61 74 61 2e 70  nch build_data.p
3fb0: 79 20 28 70 61 72 74 20 31 20 61 6e 64 20 32 29  y (part 1 and 2)
3fc0: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
3fd0: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
3fe0: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
3ff0: 28 22 2d 62 62 22 2c 20 22 2d 2d 62 75 69 6c 64  ("-bb", "--build
4000: 5f 64 61 74 61 5f 62 65 66 6f 72 65 22 2c 20 68  _data_before", h
4010: 65 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75 69 6c  elp="launch buil
4020: 64 5f 64 61 74 61 2e 70 79 20 28 6f 6e 6c 79 20  d_data.py (only 
4030: 70 61 72 74 20 31 3a 20 62 65 66 6f 72 65 20 64  part 1: before d
4040: 69 63 74 69 6f 6e 61 72 79 20 62 75 69 6c 64 69  ictionary buildi
4050: 6e 67 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ng)", action="st
4060: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
4070: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
4080: 65 6e 74 28 22 2d 62 61 22 2c 20 22 2d 2d 62 75  ent("-ba", "--bu
4090: 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 22 2c  ild_data_after",
40a0: 20 68 65 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75   help="launch bu
40b0: 69 6c 64 5f 64 61 74 61 2e 70 79 20 28 6f 6e 6c  ild_data.py (onl
40c0: 79 20 70 61 72 74 20 32 3a 20 62 65 66 6f 72 65  y part 2: before
40d0: 20 64 69 63 74 69 6f 6e 61 72 79 20 62 75 69 6c   dictionary buil
40e0: 64 69 6e 67 29 22 2c 20 61 63 74 69 6f 6e 3d 22  ding)", action="
40f0: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4100: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4110: 75 6d 65 6e 74 28 22 2d 64 22 2c 20 22 2d 2d 64  ument("-d", "--d
4120: 69 63 74 22 2c 20 68 65 6c 70 3d 22 67 65 6e 65  ict", help="gene
4130: 72 61 74 65 20 46 53 41 20 64 69 63 74 69 6f 6e  rate FSA diction
4140: 61 72 79 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ary", action="st
4150: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
4160: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
4170: 65 6e 74 28 22 2d 74 22 2c 20 22 2d 2d 74 65 73  ent("-t", "--tes
4180: 74 73 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20 75  ts", help="run u
4190: 6e 69 74 20 74 65 73 74 73 22 2c 20 61 63 74 69  nit tests", acti
41a0: 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29  on="store_true")
41b0: 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64  .    xParser.add
41c0: 5f 61 72 67 75 6d 65 6e 74 28 22 2d 70 22 2c 20  _argument("-p", 
41d0: 22 2d 2d 70 65 72 66 22 2c 20 68 65 6c 70 3d 22  "--perf", help="
41e0: 72 75 6e 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  run performance 
41f0: 74 65 73 74 73 22 2c 20 61 63 74 69 6f 6e 3d 22  tests", action="
4200: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4210: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4220: 75 6d 65 6e 74 28 22 2d 70 6d 22 2c 20 22 2d 2d  ument("-pm", "--
4230: 70 65 72 66 5f 6d 65 6d 6f 22 2c 20 68 65 6c 70  perf_memo", help
4240: 3d 22 72 75 6e 20 70 65 72 66 6f 72 6d 61 6e 63  ="run performanc
4250: 65 20 74 65 73 74 73 20 61 6e 64 20 73 74 6f 72  e tests and stor
4260: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 65 72  e results in per
4270: 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 61 63 74  f_memo.txt", act
4280: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4290: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
42a0: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 6a 73 22  d_argument("-js"
42b0: 2c 20 22 2d 2d 6a 61 76 61 73 63 72 69 70 74 22  , "--javascript"
42c0: 2c 20 68 65 6c 70 3d 22 4a 61 76 61 53 63 72 69  , help="JavaScri
42d0: 70 74 20 62 75 69 6c 64 20 66 6f 72 20 46 69 72  pt build for Fir
42e0: 65 66 6f 78 22 2c 20 61 63 74 69 6f 6e 3d 22 73  efox", action="s
42f0: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4300: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4310: 6d 65 6e 74 28 22 2d 61 65 64 22 2c 20 22 2d 2d  ment("-aed", "--
4320: 61 64 64 5f 65 78 74 65 6e 64 65 64 5f 64 69 63  add_extended_dic
4330: 74 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d 22  tionary", help="
4340: 61 64 64 20 65 78 74 65 6e 64 65 64 20 64 69 63  add extended dic
4350: 74 69 6f 6e 61 72 79 20 74 6f 20 74 68 65 20 62  tionary to the b
4360: 75 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73  uild", action="s
4370: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4380: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4390: 6d 65 6e 74 28 22 2d 61 63 64 22 2c 20 22 2d 2d  ment("-acd", "--
43a0: 61 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69  add_community_di
43b0: 63 74 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d  ctionary", help=
43c0: 22 61 64 64 20 63 6f 6d 6d 75 6e 69 74 79 20 64  "add community d
43d0: 69 63 74 69 6f 6e 61 72 79 20 74 6f 20 74 68 65  ictionary to the
43e0: 20 62 75 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d   build", action=
43f0: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
4400: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
4410: 67 75 6d 65 6e 74 28 22 2d 61 70 64 22 2c 20 22  gument("-apd", "
4420: 2d 2d 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64  --add_personal_d
4430: 69 63 74 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70  ictionary", help
4440: 3d 22 61 64 64 20 70 65 72 73 6f 6e 61 6c 20 64  ="add personal d
4450: 69 63 74 69 6f 6e 61 72 79 20 74 6f 20 74 68 65  ictionary to the
4460: 20 62 75 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d   build", action=
4470: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
4480: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
4490: 67 75 6d 65 6e 74 28 22 2d 66 78 22 2c 20 22 2d  gument("-fx", "-
44a0: 2d 66 69 72 65 66 6f 78 22 2c 20 68 65 6c 70 3d  -firefox", help=
44b0: 22 4c 61 75 6e 63 68 20 46 69 72 65 66 6f 78 20  "Launch Firefox 
44c0: 44 65 76 65 6c 6f 70 70 65 72 20 66 6f 72 20 57  Developper for W
44d0: 65 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73 74  ebExtension test
44e0: 69 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ing", action="st
44f0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
4500: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
4510: 65 6e 74 28 22 2d 77 65 22 2c 20 22 2d 2d 77 65  ent("-we", "--we
4520: 62 5f 65 78 74 22 2c 20 68 65 6c 70 3d 22 4c 61  b_ext", help="La
4530: 75 6e 63 68 20 46 69 72 65 66 6f 78 20 4e 69 67  unch Firefox Nig
4540: 68 74 6c 79 20 66 6f 72 20 57 65 62 45 78 74 65  htly for WebExte
4550: 6e 73 69 6f 6e 20 74 65 73 74 69 6e 67 22 2c 20  nsion testing", 
4560: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
4570: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
4580: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
4590: 74 62 22 2c 20 22 2d 2d 74 68 75 6e 64 65 72 62  tb", "--thunderb
45a0: 69 72 64 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e  ird", help="Laun
45b0: 63 68 20 54 68 75 6e 64 65 72 62 69 72 64 22 2c  ch Thunderbird",
45c0: 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74   action="store_t
45d0: 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65  rue").    xParse
45e0: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
45f0: 2d 69 22 2c 20 22 2d 2d 69 6e 73 74 61 6c 6c 22  -i", "--install"
4600: 2c 20 68 65 6c 70 3d 22 69 6e 73 74 61 6c 6c 20  , help="install 
4610: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 6e  the extension in
4620: 20 57 72 69 74 65 72 20 28 70 61 74 68 20 6f 66   Writer (path of
4630: 20 75 6e 6f 70 6b 67 20 6d 75 73 74 20 62 65 20   unopkg must be 
4640: 73 65 74 20 69 6e 20 63 6f 6e 66 69 67 2e 69 6e  set in config.in
4650: 69 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  i)", action="sto
4660: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 41  re_true").    xA
4670: 72 67 73 20 3d 20 78 50 61 72 73 65 72 2e 70 61  rgs = xParser.pa
4680: 72 73 65 5f 61 72 67 73 28 29 0a 0a 20 20 20 20  rse_args()..    
4690: 69 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64  if xArgs.build_d
46a0: 61 74 61 3a 0a 20 20 20 20 20 20 20 20 78 41 72  ata:.        xAr
46b0: 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 62 65  gs.build_data_be
46c0: 66 6f 72 65 20 3d 20 54 72 75 65 0a 20 20 20 20  fore = True.    
46d0: 20 20 20 20 78 41 72 67 73 2e 62 75 69 6c 64 5f      xArgs.build_
46e0: 64 61 74 61 5f 61 66 74 65 72 20 3d 20 54 72 75  data_after = Tru
46f0: 65 0a 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e  e..    dir_util.
4700: 6d 6b 70 61 74 68 28 22 5f 62 75 69 6c 64 22 29  mkpath("_build")
4710: 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b  .    dir_util.mk
4720: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
4730: 65 22 29 0a 20 20 20 20 69 66 20 78 41 72 67 73  e").    if xArgs
4740: 2e 6a 61 76 61 73 63 72 69 70 74 3a 0a 20 20 20  .javascript:.   
4750: 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b       dir_util.mk
4760: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
4770: 65 2d 6a 73 22 29 0a 0a 20 20 20 20 63 6f 70 79  e-js")..    copy
4780: 47 72 61 70 68 73 70 65 6c 6c 43 6f 72 65 28 78  GraphspellCore(x
4790: 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29  Args.javascript)
47a0: 0a 0a 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 20  ..    for sLang 
47b0: 69 6e 20 78 41 72 67 73 2e 6c 61 6e 67 3a 0a 20  in xArgs.lang:. 
47c0: 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61 74         if os.pat
47d0: 68 2e 65 78 69 73 74 73 28 22 67 63 5f 6c 61 6e  h.exists("gc_lan
47e0: 67 2f 22 2b 73 4c 61 6e 67 29 20 61 6e 64 20 6f  g/"+sLang) and o
47f0: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63  s.path.isdir("gc
4800: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 3a 0a  _lang/"+sLang):.
4810: 20 20 20 20 20 20 20 20 20 20 20 20 78 43 6f 6e              xCon
4820: 66 69 67 20 3d 20 67 65 74 43 6f 6e 66 69 67 28  fig = getConfig(
4830: 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 20  sLang).         
4840: 20 20 20 64 56 61 72 73 20 3d 20 78 43 6f 6e 66     dVars = xConf
4850: 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 61 72  ig._sections['ar
4860: 67 73 27 5d 0a 0a 20 20 20 20 20 20 20 20 20 20  gs']..          
4870: 20 20 69 66 20 6e 6f 74 20 64 56 61 72 73 5b 22    if not dVars["
4880: 6c 65 78 69 63 6f 6e 5f 65 78 74 65 6e 64 65 64  lexicon_extended
4890: 5f 73 72 63 22 5d 3a 0a 20 20 20 20 20 20 20 20  _src"]:.        
48a0: 20 20 20 20 20 20 20 20 78 41 72 67 73 2e 61 64          xArgs.ad
48b0: 64 5f 65 78 74 65 6e 64 65 64 5f 64 69 63 74 69  d_extended_dicti
48c0: 6f 6e 61 72 79 20 3d 20 46 61 6c 73 65 0a 20 20  onary = False.  
48d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
48e0: 20 64 56 61 72 73 5b 22 6c 65 78 69 63 6f 6e 5f   dVars["lexicon_
48f0: 63 6f 6d 6d 75 6e 69 74 79 5f 73 72 63 22 5d 3a  community_src"]:
4900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4910: 20 78 41 72 67 73 2e 61 64 64 5f 63 6f 6d 6d 75   xArgs.add_commu
4920: 6e 69 74 79 5f 64 69 63 74 69 6f 6e 61 72 79 20  nity_dictionary 
4930: 3d 20 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20  = False.        
4940: 20 20 20 20 69 66 20 6e 6f 74 20 64 56 61 72 73      if not dVars
4950: 5b 22 6c 65 78 69 63 6f 6e 5f 70 65 72 73 6f 6e  ["lexicon_person
4960: 61 6c 5f 73 72 63 22 5d 3a 0a 20 20 20 20 20 20  al_src"]:.      
4970: 20 20 20 20 20 20 20 20 20 20 78 41 72 67 73 2e            xArgs.
4980: 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69 63  add_personal_dic
4990: 74 69 6f 6e 61 72 79 20 3d 20 46 61 6c 73 65 0a  tionary = False.
49a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 62  .            # b
49b0: 75 69 6c 64 20 64 61 74 61 0a 20 20 20 20 20 20  uild data.      
49c0: 20 20 20 20 20 20 62 75 69 6c 64 5f 64 61 74 61        build_data
49d0: 5f 6d 6f 64 75 6c 65 20 3d 20 4e 6f 6e 65 0a 20  _module = None. 
49e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
49f0: 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 62  rgs.build_data_b
4a00: 65 66 6f 72 65 20 6f 72 20 78 41 72 67 73 2e 62  efore or xArgs.b
4a10: 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 3a  uild_data_after:
4a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a30: 20 23 20 6c 61 6e 67 20 64 61 74 61 0a 20 20 20   # lang data.   
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
4a50: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4a60: 20 20 20 20 20 20 62 75 69 6c 64 5f 64 61 74 61        build_data
4a70: 5f 6d 6f 64 75 6c 65 20 3d 20 69 6d 70 6f 72 74  _module = import
4a80: 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c  lib.import_modul
4a90: 65 28 22 67 63 5f 6c 61 6e 67 2e 22 2b 73 4c 61  e("gc_lang."+sLa
4aa0: 6e 67 2b 22 2e 62 75 69 6c 64 5f 64 61 74 61 22  ng+".build_data"
4ab0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4ac0: 20 20 65 78 63 65 70 74 20 49 6d 70 6f 72 74 45    except ImportE
4ad0: 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20 20 20  rror:.          
4ae0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
4af0: 22 23 20 45 72 72 6f 72 2e 20 43 6f 75 6c 64 6e  "# Error. Couldn
4b00: e2 80 99 74 20 69 6d 70 6f 72 74 20 66 69 6c 65  ...t import file
4b10: 20 62 75 69 6c 64 5f 64 61 74 61 2e 70 79 20 69   build_data.py i
4b20: 6e 20 66 6f 6c 64 65 72 20 67 63 5f 6c 61 6e 67  n folder gc_lang
4b30: 2f 22 2b 73 4c 61 6e 67 29 0a 20 20 20 20 20 20  /"+sLang).      
4b40: 20 20 20 20 20 20 69 66 20 62 75 69 6c 64 5f 64        if build_d
4b50: 61 74 61 5f 6d 6f 64 75 6c 65 20 61 6e 64 20 78  ata_module and x
4b60: 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f  Args.build_data_
4b70: 62 65 66 6f 72 65 3a 0a 20 20 20 20 20 20 20 20  before:.        
4b80: 20 20 20 20 20 20 20 20 62 75 69 6c 64 5f 64 61          build_da
4b90: 74 61 5f 6d 6f 64 75 6c 65 2e 62 65 66 6f 72 65  ta_module.before
4ba0: 28 27 67 63 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e  ('gc_lang/'+sLan
4bb0: 67 2c 20 64 56 61 72 73 2c 20 78 41 72 67 73 2e  g, dVars, xArgs.
4bc0: 6a 61 76 61 73 63 72 69 70 74 29 0a 20 20 20 20  javascript).    
4bd0: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
4be0: 2e 64 69 63 74 3a 0a 20 20 20 20 20 20 20 20 20  .dict:.         
4bf0: 20 20 20 20 20 20 20 62 75 69 6c 64 44 69 63 74         buildDict
4c00: 69 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 22 6d  ionary(dVars, "m
4c10: 61 69 6e 22 2c 20 78 41 72 67 73 2e 6a 61 76 61  ain", xArgs.java
4c20: 73 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20  script).        
4c30: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
4c40: 2e 61 64 64 5f 65 78 74 65 6e 64 65 64 5f 64 69  .add_extended_di
4c50: 63 74 69 6f 6e 61 72 79 3a 0a 20 20 20 20 20 20  ctionary:.      
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
4c70: 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 28 64 56  ildDictionary(dV
4c80: 61 72 73 2c 20 22 65 78 74 65 6e 64 65 64 22 2c  ars, "extended",
4c90: 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70   xArgs.javascrip
4ca0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
4cb0: 20 20 20 69 66 20 78 41 72 67 73 2e 61 64 64 5f     if xArgs.add_
4cc0: 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63 74 69 6f  community_dictio
4cd0: 6e 61 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20  nary:.          
4ce0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 44            buildD
4cf0: 69 63 74 69 6f 6e 61 72 79 28 64 56 61 72 73 2c  ictionary(dVars,
4d00: 20 22 63 6f 6d 6d 75 6e 69 74 79 22 2c 20 78 41   "community", xA
4d10: 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a  rgs.javascript).
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 69 66 20 78 41 72 67 73 2e 61 64 64 5f 70 65 72  if xArgs.add_per
4d40: 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79  sonal_dictionary
4d50: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4d60: 20 20 20 20 20 20 62 75 69 6c 64 44 69 63 74 69        buildDicti
4d70: 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 22 70 65  onary(dVars, "pe
4d80: 72 73 6f 6e 61 6c 22 2c 20 78 41 72 67 73 2e 6a  rsonal", xArgs.j
4d90: 61 76 61 73 63 72 69 70 74 29 0a 20 20 20 20 20  avascript).     
4da0: 20 20 20 20 20 20 20 69 66 20 62 75 69 6c 64 5f         if build_
4db0: 64 61 74 61 5f 6d 6f 64 75 6c 65 20 61 6e 64 20  data_module and 
4dc0: 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61  xArgs.build_data
4dd0: 5f 61 66 74 65 72 3a 0a 20 20 20 20 20 20 20 20  _after:.        
4de0: 20 20 20 20 20 20 20 20 62 75 69 6c 64 5f 64 61          build_da
4df0: 74 61 5f 6d 6f 64 75 6c 65 2e 61 66 74 65 72 28  ta_module.after(
4e00: 27 67 63 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67  'gc_lang/'+sLang
4e10: 2c 20 64 56 61 72 73 2c 20 78 41 72 67 73 2e 6a  , dVars, xArgs.j
4e20: 61 76 61 73 63 72 69 70 74 29 0a 0a 20 20 20 20  avascript)..    
4e30: 20 20 20 20 20 20 20 20 23 20 63 6f 70 79 20 64          # copy d
4e40: 69 63 74 69 6f 6e 61 72 69 65 73 20 66 72 6f 6d  ictionaries from
4e50: 20 47 72 61 70 68 73 70 65 6c 6c 0a 20 20 20 20   Graphspell.    
4e60: 20 20 20 20 20 20 20 20 63 6f 70 79 47 72 61 70          copyGrap
4e70: 68 73 70 65 6c 6c 44 69 63 74 69 6f 6e 61 72 69  hspellDictionari
4e80: 65 73 28 64 56 61 72 73 2c 20 78 41 72 67 73 2e  es(dVars, xArgs.
4e90: 6a 61 76 61 73 63 72 69 70 74 2c 20 78 41 72 67  javascript, xArg
4ea0: 73 2e 61 64 64 5f 65 78 74 65 6e 64 65 64 5f 64  s.add_extended_d
4eb0: 69 63 74 69 6f 6e 61 72 79 2c 20 78 41 72 67 73  ictionary, xArgs
4ec0: 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64  .add_community_d
4ed0: 69 63 74 69 6f 6e 61 72 79 2c 20 78 41 72 67 73  ictionary, xArgs
4ee0: 2e 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69  .add_personal_di
4ef0: 63 74 69 6f 6e 61 72 79 29 0a 0a 20 20 20 20 20  ctionary)..     
4f00: 20 20 20 20 20 20 20 23 20 6d 61 6b 65 0a 20 20         # make.  
4f10: 20 20 20 20 20 20 20 20 20 20 73 56 65 72 73 69            sVersi
4f20: 6f 6e 20 3d 20 63 72 65 61 74 65 28 73 4c 61 6e  on = create(sLan
4f30: 67 2c 20 78 43 6f 6e 66 69 67 2c 20 78 41 72 67  g, xConfig, xArg
4f40: 73 2e 69 6e 73 74 61 6c 6c 2c 20 78 41 72 67 73  s.install, xArgs
4f50: 2e 6a 61 76 61 73 63 72 69 70 74 2c 20 29 0a 0a  .javascript, )..
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 74 65              # te
4f70: 73 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  sts.            
4f80: 69 66 20 78 41 72 67 73 2e 74 65 73 74 73 20 6f  if xArgs.tests o
4f90: 72 20 78 41 72 67 73 2e 70 65 72 66 20 6f 72 20  r xArgs.perf or 
4fa0: 78 41 72 67 73 2e 70 65 72 66 5f 6d 65 6d 6f 3a  xArgs.perf_memo:
4fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4fc0: 20 70 72 69 6e 74 28 22 3e 20 52 75 6e 6e 69 6e   print("> Runnin
4fd0: 67 20 74 65 73 74 73 22 29 0a 20 20 20 20 20 20  g tests").      
4fe0: 20 20 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20            try:. 
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 74 65 73 74 73 20 3d 20 69 6d 70 6f 72     tests = impor
5010: 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75  tlib.import_modu
5020: 6c 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2e  le("grammalecte.
5030: 22 2b 73 4c 61 6e 67 2b 22 2e 74 65 73 74 73 22  "+sLang+".tests"
5040: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5050: 20 20 20 20 20 20 70 72 69 6e 74 28 74 65 73 74        print(test
5060: 73 2e 5f 5f 66 69 6c 65 5f 5f 29 0a 20 20 20 20  s.__file__).    
5070: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65              exce
5080: 70 74 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a  pt ImportError:.
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72      print("# Err
50b0: 6f 72 2e 20 49 6d 70 6f 72 74 20 66 61 69 6c 65  or. Import faile
50c0: 64 3a 22 20 2b 20 22 67 72 61 6d 6d 61 6c 65 63  d:" + "grammalec
50d0: 74 65 2e 22 2b 73 4c 61 6e 67 2b 22 2e 74 65 73  te."+sLang+".tes
50e0: 74 73 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  ts").           
50f0: 20 20 20 20 20 20 20 20 20 74 72 61 63 65 62 61           traceba
5100: 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a 20  ck.print_exc(). 
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
5120: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
5130: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5140: 73 2e 74 65 73 74 73 3a 0a 20 20 20 20 20 20 20  s.tests:.       
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 78 54 65 73 74 53 75 69 74 65 20 3d 20 75 6e   xTestSuite = un
5170: 69 74 74 65 73 74 2e 54 65 73 74 4c 6f 61 64 65  ittest.TestLoade
5180: 72 28 29 2e 6c 6f 61 64 54 65 73 74 73 46 72 6f  r().loadTestsFro
5190: 6d 4d 6f 64 75 6c 65 28 74 65 73 74 73 29 0a 20  mModule(tests). 
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 20 20 20 75 6e 69 74 74 65 73 74 2e         unittest.
51c0: 54 65 78 74 54 65 73 74 52 75 6e 6e 65 72 28 29  TextTestRunner()
51d0: 2e 72 75 6e 28 78 54 65 73 74 53 75 69 74 65 29  .run(xTestSuite)
51e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51f0: 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 70 65       if xArgs.pe
5200: 72 66 20 6f 72 20 78 41 72 67 73 2e 70 65 72 66  rf or xArgs.perf
5210: 5f 6d 65 6d 6f 3a 0a 20 20 20 20 20 20 20 20 20  _memo:.         
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
5230: 44 73 74 20 3d 20 6f 70 65 6e 28 22 2e 2f 67 63  Dst = open("./gc
5240: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f  _lang/"+sLang+"/
5250: 70 65 72 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20  perf_memo.txt", 
5260: 22 61 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "a", encoding="u
5270: 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22  tf-8", newline="
5280: 5c 6e 22 29 20 20 69 66 20 78 41 72 67 73 2e 70  \n")  if xArgs.p
5290: 65 72 66 5f 6d 65 6d 6f 20 20 65 6c 73 65 20 4e  erf_memo  else N
52a0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
52c0: 73 2e 70 65 72 66 28 73 56 65 72 73 69 6f 6e 2c  s.perf(sVersion,
52d0: 20 68 44 73 74 29 0a 0a 20 20 20 20 20 20 20 20   hDst)..        
52e0: 20 20 20 20 23 20 46 69 72 65 66 6f 78 0a 20 20      # Firefox.  
52f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 46 61 6c            if Fal
5300: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
5310: 20 20 20 20 23 20 6f 62 73 6f 6c 65 74 65 0a 20      # obsolete. 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
5330: 69 74 68 20 68 65 6c 70 65 72 73 2e 63 64 28 22  ith helpers.cd("
5340: 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61  _build/xpi/"+sLa
5350: 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ng):.           
5360: 20 20 20 20 20 20 20 20 20 73 70 66 46 69 72 65           spfFire
5370: 66 6f 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e  fox = dVars['win
5380: 5f 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 20 20  _fx_dev_path']  
5390: 69 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74  if platform.syst
53a0: 65 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73  em() == "Windows
53b0: 22 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c  "  else dVars['l
53c0: 69 6e 75 78 5f 66 78 5f 64 65 76 5f 70 61 74 68  inux_fx_dev_path
53d0: 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '].             
53e0: 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65 6d         os.system
53f0: 28 27 6a 70 6d 20 72 75 6e 20 2d 62 20 22 27 20  ('jpm run -b "' 
5400: 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20 27  + spfFirefox + '
5410: 22 27 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20  "')..           
5420: 20 69 66 20 78 41 72 67 73 2e 77 65 62 5f 65 78   if xArgs.web_ex
5430: 74 20 6f 72 20 78 41 72 67 73 2e 66 69 72 65 66  t or xArgs.firef
5440: 6f 78 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ox:.            
5450: 20 20 20 20 77 69 74 68 20 68 65 6c 70 65 72 73      with helpers
5460: 2e 63 64 28 22 5f 62 75 69 6c 64 2f 77 65 62 65  .cd("_build/webe
5470: 78 74 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20  xt/"+sLang):.   
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 69 66 20 78 41 72 67 73 2e 66 69 72 65 66 6f   if xArgs.firefo
54a0: 78 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x:.             
54b0: 20 20 20 20 20 20 20 20 20 20 20 23 20 46 69 72             # Fir
54c0: 65 66 6f 78 20 44 65 76 65 6c 6f 70 70 65 72 20  efox Developper 
54d0: 65 64 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  edition.        
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 73 70 66 46 69 72 65 66 6f 78 20 3d 20 64 56 61  spfFirefox = dVa
5500: 72 73 5b 27 77 69 6e 5f 66 78 5f 64 65 76 5f 70  rs['win_fx_dev_p
5510: 61 74 68 27 5d 20 20 69 66 20 70 6c 61 74 66 6f  ath']  if platfo
5520: 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20 22  rm.system() == "
5530: 57 69 6e 64 6f 77 73 22 20 20 65 6c 73 65 20 64  Windows"  else d
5540: 56 61 72 73 5b 27 6c 69 6e 75 78 5f 66 78 5f 64  Vars['linux_fx_d
5550: 65 76 5f 70 61 74 68 27 5d 0a 20 20 20 20 20 20  ev_path'].      
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
5570: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
5580: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 46 69              # Fi
5590: 72 65 66 6f 78 20 4e 69 67 68 74 6c 79 20 65 64  refox Nightly ed
55a0: 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ition.          
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
55c0: 66 46 69 72 65 66 6f 78 20 3d 20 64 56 61 72 73  fFirefox = dVars
55d0: 5b 27 77 69 6e 5f 66 78 5f 6e 69 67 68 74 6c 79  ['win_fx_nightly
55e0: 5f 70 61 74 68 27 5d 20 20 69 66 20 70 6c 61 74  _path']  if plat
55f0: 66 6f 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d 3d  form.system() ==
5600: 20 22 57 69 6e 64 6f 77 73 22 20 20 65 6c 73 65   "Windows"  else
5610: 20 64 56 61 72 73 5b 27 6c 69 6e 75 78 5f 66 78   dVars['linux_fx
5620: 5f 6e 69 67 68 74 6c 79 5f 70 61 74 68 27 5d 0a  _nightly_path'].
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 6f 73 2e 73 79 73 74 65 6d 28 72 27      os.system(r'
5650: 77 65 62 2d 65 78 74 20 72 75 6e 20 2d 2d 66 69  web-ext run --fi
5660: 72 65 66 6f 78 3d 22 27 20 2b 20 73 70 66 46 69  refox="' + spfFi
5670: 72 65 66 6f 78 20 2b 20 27 22 20 2d 2d 62 72 6f  refox + '" --bro
5680: 77 73 65 72 2d 63 6f 6e 73 6f 6c 65 20 2d 2d 66  wser-console --f
5690: 69 72 65 66 6f 78 2d 70 72 6f 66 69 6c 65 3d 64  irefox-profile=d
56a0: 65 62 75 67 27 29 20 20 20 20 20 20 20 20 20 20  ebug')          
56b0: 20 20 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20    ..            
56c0: 23 20 54 68 75 6e 64 65 72 62 69 72 64 0a 20 20  # Thunderbird.  
56d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
56e0: 67 73 2e 74 68 75 6e 64 65 72 62 69 72 64 3a 0a  gs.thunderbird:.
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 6f 73 2e 73 79 73 74 65 6d 28 22 74 68 75 6e 64  os.system("thund
5710: 65 72 62 69 72 64 20 2d 6a 73 63 6f 6e 73 6f 6c  erbird -jsconsol
5720: 65 20 2d 50 20 64 65 62 75 67 22 29 0a 20 20 20  e -P debug").   
5730: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
5740: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 46 6f         print("Fo
5750: 6c 64 65 72 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  lder not found: 
5760: 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29  gc_lang/"+sLang)
5770: 0a 0a 20 20 20 20 6f 4e 6f 77 20 3d 20 64 61 74  ..    oNow = dat
5780: 65 74 69 6d 65 2e 64 61 74 65 74 69 6d 65 2e 6e  etime.datetime.n
5790: 6f 77 28 29 0a 20 20 20 20 70 72 69 6e 74 28 22  ow().    print("
57a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 4d  ============== M
57b0: 41 4b 45 20 47 52 41 4d 4d 41 4c 45 43 54 45 20  AKE GRAMMALECTE 
57c0: 5b 66 69 6e 69 73 68 65 64 5d 20 61 74 20 7b 30  [finished] at {0
57d0: 2e 68 6f 75 72 3a 3e 32 7d 20 68 20 7b 30 2e 6d  .hour:>2} h {0.m
57e0: 69 6e 75 74 65 3a 3e 32 7d 20 6d 69 6e 20 7b 30  inute:>2} min {0
57f0: 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20 73 20 3d 3d  .second:>2} s ==
5800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 2e 66 6f  ============".fo
5810: 72 6d 61 74 28 6f 4e 6f 77 29 29 0a 0a 0a 69 66  rmat(oNow))...if
5820: 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d 20 27 5f 5f   __name__ == '__
5830: 6d 61 69 6e 5f 5f 27 3a 0a 20 20 20 20 6d 61 69  main__':.    mai
5840: 6e 28 29 0a                                      n().