Grammalecte  Hex Artifact Content

Artifact b9941a680980b880cc229794e6df5ab28bb95db2385b98a9ff09cd567156bbd1:


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 50 65 72  Dict=False, bPer
35d0: 73 6f 6e 61 6c 44 69 63 74 3d 46 61 6c 73 65 29  sonalDict=False)
35e0: 3a 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63  :.    dVars["dic
35f0: 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 70  _main_filename_p
3600: 79 22 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61  y"] = "".    dVa
3610: 72 73 5b 22 64 69 63 5f 6d 61 69 6e 5f 66 69 6c  rs["dic_main_fil
3620: 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20 22 22 0a  ename_js"] = "".
3630: 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f 65      dVars["dic_e
3640: 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65  xtended_filename
3650: 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20 20 20 64  _py"] = "".    d
3660: 56 61 72 73 5b 22 64 69 63 5f 65 78 74 65 6e 64  Vars["dic_extend
3670: 65 64 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d  ed_filename_js"]
3680: 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b   = "".    dVars[
3690: 22 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69  "dic_personal_fi
36a0: 6c 65 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22  lename_py"] = ""
36b0: 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f  .    dVars["dic_
36c0: 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d  personal_filenam
36d0: 65 5f 6a 73 22 5d 20 3d 20 22 22 0a 20 20 20 20  e_js"] = "".    
36e0: 6c 44 69 63 74 20 3d 20 5b 20 28 22 6d 61 69 6e  lDict = [ ("main
36f0: 22 2c 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69  ", dVars['dic_fi
3700: 6c 65 6e 61 6d 65 27 5d 29 20 5d 0a 20 20 20 20  lename']) ].    
3710: 69 66 20 62 45 78 74 65 6e 64 65 64 44 69 63 74  if bExtendedDict
3720: 3a 0a 20 20 20 20 20 20 20 20 6c 44 69 63 74 2e  :.        lDict.
3730: 61 70 70 65 6e 64 28 28 22 65 78 74 65 6e 64 65  append(("extende
3740: 64 22 2c 20 64 56 61 72 73 5b 27 64 69 63 5f 65  d", dVars['dic_e
3750: 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65  xtended_filename
3760: 27 5d 29 29 0a 20 20 20 20 69 66 20 62 50 65 72  '])).    if bPer
3770: 73 6f 6e 61 6c 44 69 63 74 3a 0a 20 20 20 20 20  sonalDict:.     
3780: 20 20 20 6c 44 69 63 74 2e 61 70 70 65 6e 64 28     lDict.append(
3790: 28 22 70 65 72 73 6f 6e 61 6c 22 2c 20 64 56 61  ("personal", dVa
37a0: 72 73 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61 6c  rs['dic_personal
37b0: 5f 66 69 6c 65 6e 61 6d 65 27 5d 29 29 0a 20 20  _filename'])).  
37c0: 20 20 66 6f 72 20 73 54 79 70 65 2c 20 73 46 69    for sType, sFi
37d0: 6c 65 4e 61 6d 65 20 69 6e 20 6c 44 69 63 74 3a  leName in lDict:
37e0: 0a 20 20 20 20 20 20 20 20 73 70 66 50 79 44 69  .        spfPyDi
37f0: 63 20 3d 20 22 67 72 61 70 68 73 70 65 6c 6c 2f  c = "graphspell/
3800: 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 20  _dictionaries/" 
3810: 2b 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 22 2e  + sFileName + ".
3820: 62 64 69 63 22 0a 20 20 20 20 20 20 20 20 73 70  bdic".        sp
3830: 66 4a 53 44 69 63 20 3d 20 22 67 72 61 70 68 73  fJSDic = "graphs
3840: 70 65 6c 6c 2d 6a 73 2f 5f 64 69 63 74 69 6f 6e  pell-js/_diction
3850: 61 72 69 65 73 2f 22 20 2b 20 73 46 69 6c 65 4e  aries/" + sFileN
3860: 61 6d 65 20 2b 20 22 2e 6a 73 6f 6e 22 0a 20 20  ame + ".json".  
3870: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
3880: 70 61 74 68 2e 69 73 66 69 6c 65 28 73 70 66 50  path.isfile(spfP
3890: 79 44 69 63 29 20 6f 72 20 28 62 4a 61 76 61 53  yDic) or (bJavaS
38a0: 63 72 69 70 74 20 61 6e 64 20 6e 6f 74 20 6f 73  cript and not os
38b0: 2e 70 61 74 68 2e 69 73 66 69 6c 65 28 73 70 66  .path.isfile(spf
38c0: 4a 53 44 69 63 29 29 3a 0a 20 20 20 20 20 20 20  JSDic)):.       
38d0: 20 20 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f       buildDictio
38e0: 6e 61 72 79 28 64 56 61 72 73 2c 20 73 54 79 70  nary(dVars, sTyp
38f0: 65 2c 20 62 4a 61 76 61 53 63 72 69 70 74 29 0a  e, bJavaScript).
3900: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 70          print(sp
3910: 66 50 79 44 69 63 29 0a 20 20 20 20 20 20 20 20  fPyDic).        
3920: 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66  file_util.copy_f
3930: 69 6c 65 28 73 70 66 50 79 44 69 63 2c 20 22 67  ile(spfPyDic, "g
3940: 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68  rammalecte/graph
3950: 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72  spell/_dictionar
3960: 69 65 73 22 29 0a 20 20 20 20 20 20 20 20 64 56  ies").        dV
3970: 61 72 73 5b 27 64 69 63 5f 27 2b 73 54 79 70 65  ars['dic_'+sType
3980: 2b 27 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 27 5d  +'_filename_py']
3990: 20 3d 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 27   = sFileName + '
39a0: 2e 62 64 69 63 27 0a 20 20 20 20 20 20 20 20 69  .bdic'.        i
39b0: 66 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a 20  f bJavaScript:. 
39c0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f             file_
39d0: 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73  util.copy_file(s
39e0: 70 66 4a 53 44 69 63 2c 20 22 67 72 61 6d 6d 61  pfJSDic, "gramma
39f0: 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70  lecte-js/graphsp
3a00: 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65  ell/_dictionarie
3a10: 73 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s").            
3a20: 64 56 61 72 73 5b 27 64 69 63 5f 27 2b 73 54 79  dVars['dic_'+sTy
3a30: 70 65 2b 27 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  pe+'_filename_js
3a40: 27 5d 20 3d 20 73 46 69 6c 65 4e 61 6d 65 20 2b  '] = sFileName +
3a50: 20 27 2e 6a 73 6f 6e 27 0a 0a 0a 64 65 66 20 62   '.json'...def b
3a60: 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 20 28  uildDictionary (
3a70: 64 56 61 72 73 2c 20 73 54 79 70 65 2c 20 62 4a  dVars, sType, bJ
3a80: 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73 65 29  avaScript=False)
3a90: 3a 0a 20 20 20 20 69 66 20 73 54 79 70 65 20 3d  :.    if sType =
3aa0: 3d 20 22 6d 61 69 6e 22 3a 0a 20 20 20 20 20 20  = "main":.      
3ab0: 20 20 73 70 66 4c 65 78 53 72 63 20 3d 20 64 56    spfLexSrc = dV
3ac0: 61 72 73 5b 27 6c 65 78 69 63 6f 6e 5f 73 72 63  ars['lexicon_src
3ad0: 27 5d 0a 20 20 20 20 20 20 20 20 73 66 44 69 63  '].        sfDic
3ae0: 74 44 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69  tDst = dVars['di
3af0: 63 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a 20 20 20  c_filename'].   
3b00: 20 20 20 20 20 73 44 69 63 4e 61 6d 65 20 3d 20       sDicName = 
3b10: 64 56 61 72 73 5b 27 64 69 63 5f 6e 61 6d 65 27  dVars['dic_name'
3b20: 5d 0a 20 20 20 20 65 6c 69 66 20 73 54 79 70 65  ].    elif sType
3b30: 20 3d 3d 20 22 65 78 74 65 6e 64 65 64 22 3a 0a   == "extended":.
3b40: 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53 72          spfLexSr
3b50: 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69 63  c = dVars['lexic
3b60: 6f 6e 5f 65 78 74 65 6e 64 65 64 5f 73 72 63 27  on_extended_src'
3b70: 5d 0a 20 20 20 20 20 20 20 20 73 66 44 69 63 74  ].        sfDict
3b80: 44 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69 63  Dst = dVars['dic
3b90: 5f 65 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61  _extended_filena
3ba0: 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 73 44 69  me'].        sDi
3bb0: 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64  cName = dVars['d
3bc0: 69 63 5f 65 78 74 65 6e 64 65 64 5f 6e 61 6d 65  ic_extended_name
3bd0: 27 5d 0a 20 20 20 20 65 6c 69 66 20 73 54 79 70  '].    elif sTyp
3be0: 65 20 3d 3d 20 22 70 65 72 73 6f 6e 61 6c 22 3a  e == "personal":
3bf0: 0a 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53  .        spfLexS
3c00: 72 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69  rc = dVars['lexi
3c10: 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63  con_personal_src
3c20: 27 5d 0a 20 20 20 20 20 20 20 20 73 66 44 69 63  '].        sfDic
3c30: 74 44 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69  tDst = dVars['di
3c40: 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e  c_personal_filen
3c50: 61 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 73 44  ame'].        sD
3c60: 69 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27  icName = dVars['
3c70: 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 6e 61 6d  dic_personal_nam
3c80: 65 27 5d 0a 20 20 20 20 6c 65 78 5f 62 75 69 6c  e'].    lex_buil
3c90: 64 2e 62 75 69 6c 64 28 73 70 66 4c 65 78 53 72  d.build(spfLexSr
3ca0: 63 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d  c, dVars['lang']
3cb0: 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 5f 6e 61  , dVars['lang_na
3cc0: 6d 65 27 5d 2c 20 73 66 44 69 63 74 44 73 74 2c  me'], sfDictDst,
3cd0: 20 62 4a 61 76 61 53 63 72 69 70 74 2c 20 73 44   bJavaScript, sD
3ce0: 69 63 4e 61 6d 65 2c 20 64 56 61 72 73 5b 27 73  icName, dVars['s
3cf0: 74 65 6d 6d 69 6e 67 5f 6d 65 74 68 6f 64 27 5d  temming_method']
3d00: 2c 20 69 6e 74 28 64 56 61 72 73 5b 27 66 73 61  , int(dVars['fsa
3d10: 5f 6d 65 74 68 6f 64 27 5d 29 29 0a 0a 0a 0a 64  _method']))....d
3d20: 65 66 20 6d 61 69 6e 20 28 29 3a 0a 20 20 20 20  ef main ():.    
3d30: 70 72 69 6e 74 28 22 50 79 74 68 6f 6e 3a 20 22  print("Python: "
3d40: 20 2b 20 73 79 73 2e 76 65 72 73 69 6f 6e 29 0a   + sys.version).
3d50: 20 20 20 20 78 50 61 72 73 65 72 20 3d 20 61 72      xParser = ar
3d60: 67 70 61 72 73 65 2e 41 72 67 75 6d 65 6e 74 50  gparse.ArgumentP
3d70: 61 72 73 65 72 28 29 0a 20 20 20 20 78 50 61 72  arser().    xPar
3d80: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
3d90: 28 22 6c 61 6e 67 22 2c 20 74 79 70 65 3d 73 74  ("lang", type=st
3da0: 72 2c 20 6e 61 72 67 73 3d 27 2b 27 2c 20 68 65  r, nargs='+', he
3db0: 6c 70 3d 22 6c 61 6e 67 20 70 72 6f 6a 65 63 74  lp="lang project
3dc0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 28 6e 61   to generate (na
3dd0: 6d 65 20 6f 66 20 66 6f 6c 64 65 72 20 69 6e 20  me of folder in 
3de0: 2f 6c 61 6e 67 29 22 29 0a 20 20 20 20 78 50 61  /lang)").    xPa
3df0: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
3e00: 74 28 22 2d 62 22 2c 20 22 2d 2d 62 75 69 6c 64  t("-b", "--build
3e10: 5f 64 61 74 61 22 2c 20 68 65 6c 70 3d 22 6c 61  _data", help="la
3e20: 75 6e 63 68 20 62 75 69 6c 64 5f 64 61 74 61 2e  unch build_data.
3e30: 70 79 20 28 70 61 72 74 20 31 20 61 6e 64 20 32  py (part 1 and 2
3e40: 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  )", action="stor
3e50: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
3e60: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
3e70: 74 28 22 2d 62 62 22 2c 20 22 2d 2d 62 75 69 6c  t("-bb", "--buil
3e80: 64 5f 64 61 74 61 5f 62 65 66 6f 72 65 22 2c 20  d_data_before", 
3e90: 68 65 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75 69  help="launch bui
3ea0: 6c 64 5f 64 61 74 61 2e 70 79 20 28 6f 6e 6c 79  ld_data.py (only
3eb0: 20 70 61 72 74 20 31 3a 20 62 65 66 6f 72 65 20   part 1: before 
3ec0: 64 69 63 74 69 6f 6e 61 72 79 20 62 75 69 6c 64  dictionary build
3ed0: 69 6e 67 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73  ing)", action="s
3ee0: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
3ef0: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
3f00: 6d 65 6e 74 28 22 2d 62 61 22 2c 20 22 2d 2d 62  ment("-ba", "--b
3f10: 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 22  uild_data_after"
3f20: 2c 20 68 65 6c 70 3d 22 6c 61 75 6e 63 68 20 62  , help="launch b
3f30: 75 69 6c 64 5f 64 61 74 61 2e 70 79 20 28 6f 6e  uild_data.py (on
3f40: 6c 79 20 70 61 72 74 20 32 3a 20 62 65 66 6f 72  ly part 2: befor
3f50: 65 20 64 69 63 74 69 6f 6e 61 72 79 20 62 75 69  e dictionary bui
3f60: 6c 64 69 6e 67 29 22 2c 20 61 63 74 69 6f 6e 3d  lding)", action=
3f70: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
3f80: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
3f90: 67 75 6d 65 6e 74 28 22 2d 64 22 2c 20 22 2d 2d  gument("-d", "--
3fa0: 64 69 63 74 22 2c 20 68 65 6c 70 3d 22 67 65 6e  dict", help="gen
3fb0: 65 72 61 74 65 20 46 53 41 20 64 69 63 74 69 6f  erate FSA dictio
3fc0: 6e 61 72 79 22 2c 20 61 63 74 69 6f 6e 3d 22 73  nary", action="s
3fd0: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
3fe0: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
3ff0: 6d 65 6e 74 28 22 2d 74 22 2c 20 22 2d 2d 74 65  ment("-t", "--te
4000: 73 74 73 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20  sts", help="run 
4010: 75 6e 69 74 20 74 65 73 74 73 22 2c 20 61 63 74  unit tests", act
4020: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4030: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4040: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 70 22 2c  d_argument("-p",
4050: 20 22 2d 2d 70 65 72 66 22 2c 20 68 65 6c 70 3d   "--perf", help=
4060: 22 72 75 6e 20 70 65 72 66 6f 72 6d 61 6e 63 65  "run performance
4070: 20 74 65 73 74 73 22 2c 20 61 63 74 69 6f 6e 3d   tests", action=
4080: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
4090: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
40a0: 67 75 6d 65 6e 74 28 22 2d 70 6d 22 2c 20 22 2d  gument("-pm", "-
40b0: 2d 70 65 72 66 5f 6d 65 6d 6f 22 2c 20 68 65 6c  -perf_memo", hel
40c0: 70 3d 22 72 75 6e 20 70 65 72 66 6f 72 6d 61 6e  p="run performan
40d0: 63 65 20 74 65 73 74 73 20 61 6e 64 20 73 74 6f  ce tests and sto
40e0: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 65  re results in pe
40f0: 72 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 61 63  rf_memo.txt", ac
4100: 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65  tion="store_true
4110: 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  ").    xParser.a
4120: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 6a 73  dd_argument("-js
4130: 22 2c 20 22 2d 2d 6a 61 76 61 73 63 72 69 70 74  ", "--javascript
4140: 22 2c 20 68 65 6c 70 3d 22 4a 61 76 61 53 63 72  ", help="JavaScr
4150: 69 70 74 20 62 75 69 6c 64 20 66 6f 72 20 46 69  ipt build for Fi
4160: 72 65 66 6f 78 22 2c 20 61 63 74 69 6f 6e 3d 22  refox", action="
4170: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4180: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4190: 75 6d 65 6e 74 28 22 2d 61 65 64 22 2c 20 22 2d  ument("-aed", "-
41a0: 2d 61 64 64 5f 65 78 74 65 6e 64 65 64 5f 64 69  -add_extended_di
41b0: 63 74 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d  ctionary", help=
41c0: 22 61 64 64 20 65 78 74 65 6e 64 65 64 20 64 69  "add extended di
41d0: 63 74 69 6f 6e 61 72 79 20 74 6f 20 74 68 65 20  ctionary to the 
41e0: 62 75 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d 22  build", action="
41f0: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4200: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4210: 75 6d 65 6e 74 28 22 2d 61 70 64 22 2c 20 22 2d  ument("-apd", "-
4220: 2d 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69  -add_personal_di
4230: 63 74 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d  ctionary", help=
4240: 22 61 64 64 20 70 65 72 73 6f 6e 61 6c 20 64 69  "add personal di
4250: 63 74 69 6f 6e 61 72 79 20 74 6f 20 74 68 65 20  ctionary to the 
4260: 62 75 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d 22  build", action="
4270: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4280: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4290: 75 6d 65 6e 74 28 22 2d 66 78 22 2c 20 22 2d 2d  ument("-fx", "--
42a0: 66 69 72 65 66 6f 78 22 2c 20 68 65 6c 70 3d 22  firefox", help="
42b0: 4c 61 75 6e 63 68 20 46 69 72 65 66 6f 78 20 44  Launch Firefox D
42c0: 65 76 65 6c 6f 70 70 65 72 20 66 6f 72 20 57 65  evelopper for We
42d0: 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73 74 69  bExtension testi
42e0: 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  ng", action="sto
42f0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
4300: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
4310: 6e 74 28 22 2d 77 65 22 2c 20 22 2d 2d 77 65 62  nt("-we", "--web
4320: 5f 65 78 74 22 2c 20 68 65 6c 70 3d 22 4c 61 75  _ext", help="Lau
4330: 6e 63 68 20 46 69 72 65 66 6f 78 20 4e 69 67 68  nch Firefox Nigh
4340: 74 6c 79 20 66 6f 72 20 57 65 62 45 78 74 65 6e  tly for WebExten
4350: 73 69 6f 6e 20 74 65 73 74 69 6e 67 22 2c 20 61  sion testing", a
4360: 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75  ction="store_tru
4370: 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e  e").    xParser.
4380: 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 74  add_argument("-t
4390: 62 22 2c 20 22 2d 2d 74 68 75 6e 64 65 72 62 69  b", "--thunderbi
43a0: 72 64 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63  rd", help="Launc
43b0: 68 20 54 68 75 6e 64 65 72 62 69 72 64 22 2c 20  h Thunderbird", 
43c0: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
43d0: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
43e0: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
43f0: 69 22 2c 20 22 2d 2d 69 6e 73 74 61 6c 6c 22 2c  i", "--install",
4400: 20 68 65 6c 70 3d 22 69 6e 73 74 61 6c 6c 20 74   help="install t
4410: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 6e 20  he extension in 
4420: 57 72 69 74 65 72 20 28 70 61 74 68 20 6f 66 20  Writer (path of 
4430: 75 6e 6f 70 6b 67 20 6d 75 73 74 20 62 65 20 73  unopkg must be s
4440: 65 74 20 69 6e 20 63 6f 6e 66 69 67 2e 69 6e 69  et in config.ini
4450: 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  )", action="stor
4460: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 41 72  e_true").    xAr
4470: 67 73 20 3d 20 78 50 61 72 73 65 72 2e 70 61 72  gs = xParser.par
4480: 73 65 5f 61 72 67 73 28 29 0a 0a 20 20 20 20 69  se_args()..    i
4490: 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61  f xArgs.build_da
44a0: 74 61 3a 0a 20 20 20 20 20 20 20 20 78 41 72 67  ta:.        xArg
44b0: 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 62 65 66  s.build_data_bef
44c0: 6f 72 65 20 3d 20 54 72 75 65 0a 20 20 20 20 20  ore = True.     
44d0: 20 20 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64     xArgs.build_d
44e0: 61 74 61 5f 61 66 74 65 72 20 3d 20 54 72 75 65  ata_after = True
44f0: 0a 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d  ..    dir_util.m
4500: 6b 70 61 74 68 28 22 5f 62 75 69 6c 64 22 29 0a  kpath("_build").
4510: 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70      dir_util.mkp
4520: 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  ath("grammalecte
4530: 22 29 0a 20 20 20 20 69 66 20 78 41 72 67 73 2e  ").    if xArgs.
4540: 6a 61 76 61 73 63 72 69 70 74 3a 0a 20 20 20 20  javascript:.    
4550: 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70      dir_util.mkp
4560: 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  ath("grammalecte
4570: 2d 6a 73 22 29 0a 0a 20 20 20 20 63 6f 70 79 47  -js")..    copyG
4580: 72 61 70 68 73 70 65 6c 6c 43 6f 72 65 28 78 41  raphspellCore(xA
4590: 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a  rgs.javascript).
45a0: 0a 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 20 69  .    for sLang i
45b0: 6e 20 78 41 72 67 73 2e 6c 61 6e 67 3a 0a 20 20  n xArgs.lang:.  
45c0: 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68        if os.path
45d0: 2e 65 78 69 73 74 73 28 22 67 63 5f 6c 61 6e 67  .exists("gc_lang
45e0: 2f 22 2b 73 4c 61 6e 67 29 20 61 6e 64 20 6f 73  /"+sLang) and os
45f0: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63 5f  .path.isdir("gc_
4600: 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20  lang/"+sLang):. 
4610: 20 20 20 20 20 20 20 20 20 20 20 78 43 6f 6e 66             xConf
4620: 69 67 20 3d 20 67 65 74 43 6f 6e 66 69 67 28 73  ig = getConfig(s
4630: 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20  Lang).          
4640: 20 20 64 56 61 72 73 20 3d 20 78 43 6f 6e 66 69    dVars = xConfi
4650: 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 61 72 67  g._sections['arg
4660: 73 27 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20  s']..           
4670: 20 69 66 20 6e 6f 74 20 64 56 61 72 73 5b 22 6c   if not dVars["l
4680: 65 78 69 63 6f 6e 5f 65 78 74 65 6e 64 65 64 5f  exicon_extended_
4690: 73 72 63 22 5d 3a 0a 20 20 20 20 20 20 20 20 20  src"]:.         
46a0: 20 20 20 20 20 20 20 78 41 72 67 73 2e 61 64 64         xArgs.add
46b0: 5f 65 78 74 65 6e 64 65 64 5f 64 69 63 74 69 6f  _extended_dictio
46c0: 6e 61 72 79 20 3d 20 46 61 6c 73 65 0a 20 20 20  nary = False.   
46d0: 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20           if not 
46e0: 64 56 61 72 73 5b 22 6c 65 78 69 63 6f 6e 5f 70  dVars["lexicon_p
46f0: 65 72 73 6f 6e 61 6c 5f 73 72 63 22 5d 3a 0a 20  ersonal_src"]:. 
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
4710: 41 72 67 73 2e 61 64 64 5f 70 65 72 73 6f 6e 61  Args.add_persona
4720: 6c 5f 64 69 63 74 69 6f 6e 61 72 79 20 3d 20 46  l_dictionary = F
4730: 61 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 20 20  alse..          
4740: 20 20 23 20 62 75 69 6c 64 20 64 61 74 61 0a 20    # build data. 
4750: 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
4760: 5f 64 61 74 61 5f 6d 6f 64 75 6c 65 20 3d 20 4e  _data_module = N
4770: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
4780: 69 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64  if xArgs.build_d
4790: 61 74 61 5f 62 65 66 6f 72 65 20 6f 72 20 78 41  ata_before or xA
47a0: 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 61  rgs.build_data_a
47b0: 66 74 65 72 3a 0a 20 20 20 20 20 20 20 20 20 20  fter:.          
47c0: 20 20 20 20 20 20 23 20 6c 61 6e 67 20 64 61 74        # lang dat
47d0: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
47e0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
47f0: 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
4800: 5f 64 61 74 61 5f 6d 6f 64 75 6c 65 20 3d 20 69  _data_module = i
4810: 6d 70 6f 72 74 6c 69 62 2e 69 6d 70 6f 72 74 5f  mportlib.import_
4820: 6d 6f 64 75 6c 65 28 22 67 63 5f 6c 61 6e 67 2e  module("gc_lang.
4830: 22 2b 73 4c 61 6e 67 2b 22 2e 62 75 69 6c 64 5f  "+sLang+".build_
4840: 64 61 74 61 22 29 0a 20 20 20 20 20 20 20 20 20  data").         
4850: 20 20 20 20 20 20 20 65 78 63 65 70 74 20 49 6d         except Im
4860: 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20 20 20  portError:.     
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4880: 72 69 6e 74 28 22 23 20 45 72 72 6f 72 2e 20 43  rint("# Error. C
4890: 6f 75 6c 64 6e e2 80 99 74 20 69 6d 70 6f 72 74  ouldn...t import
48a0: 20 66 69 6c 65 20 62 75 69 6c 64 5f 64 61 74 61   file build_data
48b0: 2e 70 79 20 69 6e 20 66 6f 6c 64 65 72 20 67 63  .py in folder gc
48c0: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 0a 20  _lang/"+sLang). 
48d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 62 75             if bu
48e0: 69 6c 64 5f 64 61 74 61 5f 6d 6f 64 75 6c 65 20  ild_data_module 
48f0: 61 6e 64 20 78 41 72 67 73 2e 62 75 69 6c 64 5f  and xArgs.build_
4900: 64 61 74 61 5f 62 65 66 6f 72 65 3a 0a 20 20 20  data_before:.   
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69               bui
4920: 6c 64 5f 64 61 74 61 5f 6d 6f 64 75 6c 65 2e 62  ld_data_module.b
4930: 65 66 6f 72 65 28 27 67 63 5f 6c 61 6e 67 2f 27  efore('gc_lang/'
4940: 2b 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 78  +sLang, dVars, x
4950: 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29  Args.javascript)
4960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4970: 78 41 72 67 73 2e 64 69 63 74 3a 0a 20 20 20 20  xArgs.dict:.    
4980: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c              buil
4990: 64 44 69 63 74 69 6f 6e 61 72 79 28 64 56 61 72  dDictionary(dVar
49a0: 73 2c 20 22 6d 61 69 6e 22 2c 20 78 41 72 67 73  s, "main", xArgs
49b0: 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20 20 20  .javascript).   
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
49d0: 78 41 72 67 73 2e 61 64 64 5f 65 78 74 65 6e 64  xArgs.add_extend
49e0: 65 64 5f 64 69 63 74 69 6f 6e 61 72 79 3a 0a 20  ed_dictionary:. 
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61     buildDictiona
4a10: 72 79 28 64 56 61 72 73 2c 20 22 65 78 74 65 6e  ry(dVars, "exten
4a20: 64 65 64 22 2c 20 78 41 72 67 73 2e 6a 61 76 61  ded", xArgs.java
4a30: 73 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20  script).        
4a40: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
4a50: 2e 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69  .add_personal_di
4a60: 63 74 69 6f 6e 61 72 79 3a 0a 20 20 20 20 20 20  ctionary:.      
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
4a80: 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 28 64 56  ildDictionary(dV
4a90: 61 72 73 2c 20 22 70 65 72 73 6f 6e 61 6c 22 2c  ars, "personal",
4aa0: 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70   xArgs.javascrip
4ab0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t).            i
4ac0: 66 20 62 75 69 6c 64 5f 64 61 74 61 5f 6d 6f 64  f build_data_mod
4ad0: 75 6c 65 20 61 6e 64 20 78 41 72 67 73 2e 62 75  ule and xArgs.bu
4ae0: 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 3a 0a  ild_data_after:.
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 62 75 69 6c 64 5f 64 61 74 61 5f 6d 6f 64 75 6c  build_data_modul
4b10: 65 2e 61 66 74 65 72 28 27 67 63 5f 6c 61 6e 67  e.after('gc_lang
4b20: 2f 27 2b 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c  /'+sLang, dVars,
4b30: 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70   xArgs.javascrip
4b40: 74 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
4b50: 23 20 63 6f 70 79 20 64 69 63 74 69 6f 6e 61 72  # copy dictionar
4b60: 69 65 73 20 66 72 6f 6d 20 47 72 61 70 68 73 70  ies from Graphsp
4b70: 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
4b80: 63 6f 70 79 47 72 61 70 68 73 70 65 6c 6c 44 69  copyGraphspellDi
4b90: 63 74 69 6f 6e 61 72 69 65 73 28 64 56 61 72 73  ctionaries(dVars
4ba0: 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69  , xArgs.javascri
4bb0: 70 74 2c 20 78 41 72 67 73 2e 61 64 64 5f 65 78  pt, xArgs.add_ex
4bc0: 74 65 6e 64 65 64 5f 64 69 63 74 69 6f 6e 61 72  tended_dictionar
4bd0: 79 2c 20 78 41 72 67 73 2e 61 64 64 5f 70 65 72  y, xArgs.add_per
4be0: 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79  sonal_dictionary
4bf0: 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  )..            #
4c00: 20 6d 61 6b 65 0a 20 20 20 20 20 20 20 20 20 20   make.          
4c10: 20 20 73 56 65 72 73 69 6f 6e 20 3d 20 63 72 65    sVersion = cre
4c20: 61 74 65 28 73 4c 61 6e 67 2c 20 78 43 6f 6e 66  ate(sLang, xConf
4c30: 69 67 2c 20 78 41 72 67 73 2e 69 6e 73 74 61 6c  ig, xArgs.instal
4c40: 6c 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72  l, xArgs.javascr
4c50: 69 70 74 2c 20 29 0a 0a 20 20 20 20 20 20 20 20  ipt, )..        
4c60: 20 20 20 20 23 20 74 65 73 74 73 0a 20 20 20 20      # tests.    
4c70: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
4c80: 2e 74 65 73 74 73 20 6f 72 20 78 41 72 67 73 2e  .tests or xArgs.
4c90: 70 65 72 66 20 6f 72 20 78 41 72 67 73 2e 70 65  perf or xArgs.pe
4ca0: 72 66 5f 6d 65 6d 6f 3a 0a 20 20 20 20 20 20 20  rf_memo:.       
4cb0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
4cc0: 3e 20 52 75 6e 6e 69 6e 67 20 74 65 73 74 73 22  > Running tests"
4cd0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4ce0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
4cf0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 73             tests
4d00: 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d 70   = importlib.imp
4d10: 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67 72 61 6d  ort_module("gram
4d20: 6d 61 6c 65 63 74 65 2e 22 2b 73 4c 61 6e 67 2b  malecte."+sLang+
4d30: 22 2e 74 65 73 74 73 22 29 0a 20 20 20 20 20 20  ".tests").      
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
4d50: 69 6e 74 28 74 65 73 74 73 2e 5f 5f 66 69 6c 65  int(tests.__file
4d60: 5f 5f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  __).            
4d70: 20 20 20 20 65 78 63 65 70 74 20 49 6d 70 6f 72      except Impor
4d80: 74 45 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20  tError:.        
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4da0: 74 28 22 23 20 45 72 72 6f 72 2e 20 49 6d 70 6f  t("# Error. Impo
4db0: 72 74 20 66 61 69 6c 65 64 3a 22 20 2b 20 22 67  rt failed:" + "g
4dc0: 72 61 6d 6d 61 6c 65 63 74 65 2e 22 2b 73 4c 61  rammalecte."+sLa
4dd0: 6e 67 2b 22 2e 74 65 73 74 73 22 29 0a 20 20 20  ng+".tests").   
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e 74   traceback.print
4e00: 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20 20 20  _exc().         
4e10: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 69 66 20 78 41 72 67 73 2e 74 65 73 74 73 3a   if xArgs.tests:
4e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4e50: 20 20 20 20 20 20 20 20 20 78 54 65 73 74 53 75           xTestSu
4e60: 69 74 65 20 3d 20 75 6e 69 74 74 65 73 74 2e 54  ite = unittest.T
4e70: 65 73 74 4c 6f 61 64 65 72 28 29 2e 6c 6f 61 64  estLoader().load
4e80: 54 65 73 74 73 46 72 6f 6d 4d 6f 64 75 6c 65 28  TestsFromModule(
4e90: 74 65 73 74 73 29 0a 20 20 20 20 20 20 20 20 20  tests).         
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
4eb0: 6e 69 74 74 65 73 74 2e 54 65 78 74 54 65 73 74  nittest.TextTest
4ec0: 52 75 6e 6e 65 72 28 29 2e 72 75 6e 28 78 54 65  Runner().run(xTe
4ed0: 73 74 53 75 69 74 65 29 0a 20 20 20 20 20 20 20  stSuite).       
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4ef0: 78 41 72 67 73 2e 70 65 72 66 20 6f 72 20 78 41  xArgs.perf or xA
4f00: 72 67 73 2e 70 65 72 66 5f 6d 65 6d 6f 3a 0a 20  rgs.perf_memo:. 
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 20 20 20 68 44 73 74 20 3d 20 6f 70         hDst = op
4f30: 65 6e 28 22 2e 2f 67 63 5f 6c 61 6e 67 2f 22 2b  en("./gc_lang/"+
4f40: 73 4c 61 6e 67 2b 22 2f 70 65 72 66 5f 6d 65 6d  sLang+"/perf_mem
4f50: 6f 2e 74 78 74 22 2c 20 22 61 22 2c 20 65 6e 63  o.txt", "a", enc
4f60: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e  oding="utf-8", n
4f70: 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 20 20 69 66  ewline="\n")  if
4f80: 20 78 41 72 67 73 2e 70 65 72 66 5f 6d 65 6d 6f   xArgs.perf_memo
4f90: 20 20 65 6c 73 65 20 4e 6f 6e 65 0a 20 20 20 20    else None.    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 74 65 73 74 73 2e 70 65 72 66 28 73      tests.perf(s
4fc0: 56 65 72 73 69 6f 6e 2c 20 68 44 73 74 29 0a 0a  Version, hDst)..
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 46 69              # Fi
4fe0: 72 65 66 6f 78 0a 20 20 20 20 20 20 20 20 20 20  refox.          
4ff0: 20 20 69 66 20 46 61 6c 73 65 3a 0a 20 20 20 20    if False:.    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6f 62              # ob
5010: 73 6f 6c 65 74 65 0a 20 20 20 20 20 20 20 20 20  solete.         
5020: 20 20 20 20 20 20 20 77 69 74 68 20 68 65 6c 70         with help
5030: 65 72 73 2e 63 64 28 22 5f 62 75 69 6c 64 2f 78  ers.cd("_build/x
5040: 70 69 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20  pi/"+sLang):.   
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 73 70 66 46 69 72 65 66 6f 78 20 3d 20 64 56   spfFirefox = dV
5070: 61 72 73 5b 27 77 69 6e 5f 66 78 5f 64 65 76 5f  ars['win_fx_dev_
5080: 70 61 74 68 27 5d 20 20 69 66 20 70 6c 61 74 66  path']  if platf
5090: 6f 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20  orm.system() == 
50a0: 22 57 69 6e 64 6f 77 73 22 20 20 65 6c 73 65 20  "Windows"  else 
50b0: 64 56 61 72 73 5b 27 6c 69 6e 75 78 5f 66 78 5f  dVars['linux_fx_
50c0: 64 65 76 5f 70 61 74 68 27 5d 0a 20 20 20 20 20  dev_path'].     
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
50e0: 73 2e 73 79 73 74 65 6d 28 27 6a 70 6d 20 72 75  s.system('jpm ru
50f0: 6e 20 2d 62 20 22 27 20 2b 20 73 70 66 46 69 72  n -b "' + spfFir
5100: 65 66 6f 78 20 2b 20 27 22 27 29 0a 0a 20 20 20  efox + '"')..   
5110: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5120: 73 2e 77 65 62 5f 65 78 74 20 6f 72 20 78 41 72  s.web_ext or xAr
5130: 67 73 2e 66 69 72 65 66 6f 78 3a 0a 20 20 20 20  gs.firefox:.    
5140: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68              with
5150: 20 68 65 6c 70 65 72 73 2e 63 64 28 22 5f 62 75   helpers.cd("_bu
5160: 69 6c 64 2f 77 65 62 65 78 74 2f 22 2b 73 4c 61  ild/webext/"+sLa
5170: 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ng):.           
5180: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5190: 73 2e 66 69 72 65 66 6f 78 3a 0a 20 20 20 20 20  s.firefox:.     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 23 20 46 69 72 65 66 6f 78 20 44 65 76     # Firefox Dev
51c0: 65 6c 6f 70 70 65 72 20 65 64 69 74 69 6f 6e 0a  elopper edition.
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 20 20 20 20 20 20 73 70 66 46 69 72 65 66          spfFiref
51f0: 6f 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f  ox = dVars['win_
5200: 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 20 20 69  fx_dev_path']  i
5210: 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65  f platform.syste
5220: 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22  m() == "Windows"
5230: 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69    else dVars['li
5240: 6e 75 78 5f 66 78 5f 64 65 76 5f 70 61 74 68 27  nux_fx_dev_path'
5250: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
5260: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 23 20 46 69 72 65 66 6f 78 20 4e 69      # Firefox Ni
5290: 67 68 74 6c 79 20 65 64 69 74 69 6f 6e 0a 20 20  ghtly edition.  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 20 20 73 70 66 46 69 72 65 66 6f 78        spfFirefox
52c0: 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78   = dVars['win_fx
52d0: 5f 6e 69 67 68 74 6c 79 5f 70 61 74 68 27 5d 20  _nightly_path'] 
52e0: 20 69 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73   if platform.sys
52f0: 74 65 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77  tem() == "Window
5300: 73 22 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27  s"  else dVars['
5310: 6c 69 6e 75 78 5f 66 78 5f 6e 69 67 68 74 6c 79  linux_fx_nightly
5320: 5f 70 61 74 68 27 5d 0a 20 20 20 20 20 20 20 20  _path'].        
5330: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73              os.s
5340: 79 73 74 65 6d 28 72 27 77 65 62 2d 65 78 74 20  ystem(r'web-ext 
5350: 72 75 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22 27  run --firefox="'
5360: 20 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20   + spfFirefox + 
5370: 27 22 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f 6e  '" --browser-con
5380: 73 6f 6c 65 20 2d 2d 66 69 72 65 66 6f 78 2d 70  sole --firefox-p
5390: 72 6f 66 69 6c 65 3d 64 65 62 75 67 27 29 20 20  rofile=debug')  
53a0: 20 20 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20            ..    
53b0: 20 20 20 20 20 20 20 20 23 20 54 68 75 6e 64 65          # Thunde
53c0: 72 62 69 72 64 0a 20 20 20 20 20 20 20 20 20 20  rbird.          
53d0: 20 20 69 66 20 78 41 72 67 73 2e 74 68 75 6e 64    if xArgs.thund
53e0: 65 72 62 69 72 64 3a 0a 20 20 20 20 20 20 20 20  erbird:.        
53f0: 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65          os.syste
5400: 6d 28 22 74 68 75 6e 64 65 72 62 69 72 64 20 2d  m("thunderbird -
5410: 6a 73 63 6f 6e 73 6f 6c 65 20 2d 50 20 64 65 62  jsconsole -P deb
5420: 75 67 22 29 0a 20 20 20 20 20 20 20 20 65 6c 73  ug").        els
5430: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e:.            p
5440: 72 69 6e 74 28 22 46 6f 6c 64 65 72 20 6e 6f 74  rint("Folder not
5450: 20 66 6f 75 6e 64 3a 20 67 63 5f 6c 61 6e 67 2f   found: gc_lang/
5460: 22 2b 73 4c 61 6e 67 29 0a 0a 20 20 20 20 6f 4e  "+sLang)..    oN
5470: 6f 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64 61  ow = datetime.da
5480: 74 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20 20  tetime.now().   
5490: 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d   print("========
54a0: 3d 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41 4d  ====== MAKE GRAM
54b0: 4d 41 4c 45 43 54 45 20 5b 66 69 6e 69 73 68 65  MALECTE [finishe
54c0: 64 5d 20 61 74 20 7b 30 2e 68 6f 75 72 3a 3e 32  d] at {0.hour:>2
54d0: 7d 20 68 20 7b 30 2e 6d 69 6e 75 74 65 3a 3e 32  } h {0.minute:>2
54e0: 7d 20 6d 69 6e 20 7b 30 2e 73 65 63 6f 6e 64 3a  } min {0.second:
54f0: 3e 32 7d 20 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  >2} s ==========
5500: 3d 3d 3d 3d 22 2e 66 6f 72 6d 61 74 28 6f 4e 6f  ====".format(oNo
5510: 77 29 29 0a 0a 0a 69 66 20 5f 5f 6e 61 6d 65 5f  w))...if __name_
5520: 5f 20 3d 3d 20 27 5f 5f 6d 61 69 6e 5f 5f 27 3a  _ == '__main__':
5530: 0a 20 20 20 20 6d 61 69 6e 28 29 0a              .    main().