Grammalecte  Hex Artifact Content

Artifact b49201a58aa7bedd3e0245ca38b84128b0cb8487f6a6f490def475702d603c97:

  • File make.py — part of check-in [86a861f07a] at 2019-09-07 22:44:51 on branch trunk — [build] use fileFile with files copied from folders (user: olr size: 23899)

0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70  #!/usr/bin/env p
0010: 79 74 68 6f 6e 33 0a 23 20 63 6f 64 69 6e 67 3a  ython3.# coding:
0020: 20 55 54 46 2d 38 0a 0a 22 22 22 0a 47 72 61 6d   UTF-8..""".Gram
0030: 6d 61 6c 65 63 74 65 20 62 75 69 6c 64 65 72 0a  malecte builder.
0040: 22 22 22 0a 0a 69 6d 70 6f 72 74 20 73 79 73 0a  """..import sys.
0050: 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f 72 74  import os.import
0060: 20 72 65 0a 69 6d 70 6f 72 74 20 7a 69 70 66 69   re.import zipfi
0070: 6c 65 0a 69 6d 70 6f 72 74 20 74 72 61 63 65 62  le.import traceb
0080: 61 63 6b 0a 69 6d 70 6f 72 74 20 63 6f 6e 66 69  ack.import confi
0090: 67 70 61 72 73 65 72 0a 69 6d 70 6f 72 74 20 64  gparser.import d
00a0: 61 74 65 74 69 6d 65 0a 69 6d 70 6f 72 74 20 61  atetime.import a
00b0: 72 67 70 61 72 73 65 0a 69 6d 70 6f 72 74 20 69  rgparse.import i
00c0: 6d 70 6f 72 74 6c 69 62 0a 69 6d 70 6f 72 74 20  mportlib.import 
00d0: 75 6e 69 74 74 65 73 74 0a 69 6d 70 6f 72 74 20  unittest.import 
00e0: 6a 73 6f 6e 0a 69 6d 70 6f 72 74 20 70 6c 61 74  json.import plat
00f0: 66 6f 72 6d 0a 0a 66 72 6f 6d 20 64 69 73 74 75  form..from distu
0100: 74 69 6c 73 20 69 6d 70 6f 72 74 20 64 69 72 5f  tils import dir_
0110: 75 74 69 6c 2c 20 66 69 6c 65 5f 75 74 69 6c 0a  util, file_util.
0120: 0a 23 69 6d 70 6f 72 74 20 64 69 61 6c 6f 67 5f  .#import dialog_
0130: 62 75 6e 64 6c 65 64 0a 69 6d 70 6f 72 74 20 63  bundled.import c
0140: 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 0a 69 6d 70  ompile_rules.imp
0150: 6f 72 74 20 68 65 6c 70 65 72 73 0a 69 6d 70 6f  ort helpers.impo
0160: 72 74 20 6c 65 78 5f 62 75 69 6c 64 0a 0a 0a 73  rt lex_build...s
0170: 57 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 20 3d  WarningMessage =
0180: 20 22 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66   "The content of
0190: 20 74 68 69 73 20 66 6f 6c 64 65 72 20 69 73 20   this folder is 
01a0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64  generated by cod
01b0: 65 20 61 6e 64 20 72 65 70 6c 61 63 65 64 20 61  e and replaced a
01c0: 74 20 65 61 63 68 20 62 75 69 6c 64 2e 5c 6e 22  t each build.\n"
01d0: 0a 0a 0a 64 65 66 20 67 65 74 43 6f 6e 66 69 67  ...def getConfig
01e0: 20 28 73 4c 61 6e 67 29 3a 0a 20 20 20 20 22 6c   (sLang):.    "l
01f0: 6f 61 64 20 63 6f 6e 66 69 67 2e 69 6e 69 20 69  oad config.ini i
0200: 6e 20 3c 73 4c 61 6e 67 3e 20 61 74 20 67 63 5f  n <sLang> at gc_
0210: 6c 61 6e 67 2f 3c 73 4c 61 6e 67 3e 2c 20 72 65  lang/<sLang>, re
0220: 74 75 72 6e 73 20 78 43 6f 6e 66 69 67 50 61 72  turns xConfigPar
0230: 73 65 72 20 6f 62 6a 65 63 74 22 0a 20 20 20 20  ser object".    
0240: 78 43 6f 6e 66 69 67 20 3d 20 63 6f 6e 66 69 67  xConfig = config
0250: 70 61 72 73 65 72 2e 43 6f 6e 66 69 67 50 61 72  parser.ConfigPar
0260: 73 65 72 28 29 0a 20 20 20 20 78 43 6f 6e 66 69  ser().    xConfi
0270: 67 2e 6f 70 74 69 6f 6e 78 66 6f 72 6d 20 3d 20  g.optionxform = 
0280: 73 74 72 0a 20 20 20 20 74 72 79 3a 0a 20 20 20  str.    try:.   
0290: 20 20 20 20 20 78 43 6f 6e 66 69 67 2e 72 65 61       xConfig.rea
02a0: 64 5f 66 69 6c 65 28 6f 70 65 6e 28 22 67 63 5f  d_file(open("gc_
02b0: 6c 61 6e 67 2f 22 20 2b 20 73 4c 61 6e 67 20 2b  lang/" + sLang +
02c0: 20 22 2f 63 6f 6e 66 69 67 2e 69 6e 69 22 2c 20   "/config.ini", 
02d0: 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "r", encoding="u
02e0: 74 66 2d 38 22 29 29 0a 20 20 20 20 65 78 63 65  tf-8")).    exce
02f0: 70 74 20 46 69 6c 65 4e 6f 74 46 6f 75 6e 64 45  pt FileNotFoundE
0300: 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20 70 72  rror:.        pr
0310: 69 6e 74 28 22 23 20 45 72 72 6f 72 2e 20 43 61  int("# Error. Ca
0320: 6e e2 80 99 74 20 72 65 61 64 20 63 6f 6e 66 69  n...t read confi
0330: 67 20 66 69 6c 65 20 5b 22 20 2b 20 73 4c 61 6e  g file [" + sLan
0340: 67 20 2b 20 22 5d 22 29 0a 20 20 20 20 20 20 20  g + "]").       
0350: 20 65 78 69 74 28 29 0a 20 20 20 20 72 65 74 75   exit().    retu
0360: 72 6e 20 78 43 6f 6e 66 69 67 0a 0a 0a 64 65 66  rn xConfig...def
0370: 20 63 72 65 61 74 65 4f 70 74 69 6f 6e 73 4c 61   createOptionsLa
0380: 62 65 6c 50 72 6f 70 65 72 74 69 65 73 20 28 64  belProperties (d
0390: 4f 70 74 4c 62 6c 29 3a 0a 20 20 20 20 22 63 72  OptLbl):.    "cr
03a0: 65 61 74 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72  eate content for
03b0: 20 2e 70 72 6f 70 65 72 74 69 65 73 20 66 69 6c   .properties fil
03c0: 65 73 20 28 4c 69 62 72 65 4f 66 66 69 63 65 29  es (LibreOffice)
03d0: 22 0a 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 3d  ".    sContent =
03e0: 20 22 22 0a 20 20 20 20 66 6f 72 20 73 4f 70 74   "".    for sOpt
03f0: 2c 20 74 4c 61 62 65 6c 20 69 6e 20 64 4f 70 74  , tLabel in dOpt
0400: 4c 62 6c 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20  Lbl.items():.   
0410: 20 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d       sContent +=
0420: 20 73 4f 70 74 20 2b 20 22 3d 22 20 2b 20 74 4c   sOpt + "=" + tL
0430: 61 62 65 6c 5b 30 5d 20 2b 20 22 5c 6e 22 0a 20  abel[0] + "\n". 
0440: 20 20 20 20 20 20 20 69 66 20 74 4c 61 62 65 6c         if tLabel
0450: 5b 31 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  [1]:.           
0460: 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 22 68 6c   sContent += "hl
0470: 70 5f 22 20 2b 20 73 4f 70 74 20 2b 20 22 3d 22  p_" + sOpt + "="
0480: 20 2b 20 74 4c 61 62 65 6c 5b 31 5d 20 2b 20 22   + tLabel[1] + "
0490: 5c 6e 22 0a 20 20 20 20 72 65 74 75 72 6e 20 73  \n".    return s
04a0: 43 6f 6e 74 65 6e 74 0a 0a 0a 64 65 66 20 63 72  Content...def cr
04b0: 65 61 74 65 44 69 61 6c 6f 67 4f 70 74 69 6f 6e  eateDialogOption
04c0: 73 58 44 4c 20 28 64 56 61 72 73 29 3a 0a 20 20  sXDL (dVars):.  
04d0: 20 20 22 63 72 65 61 74 65 20 62 75 6e 64 6c 65    "create bundle
04e0: 64 20 64 69 61 6c 6f 67 20 6f 70 74 69 6f 6e 73  d dialog options
04f0: 20 66 69 6c 65 20 2e 78 64 6c 20 28 4c 69 62 72   file .xdl (Libr
0500: 65 4f 66 66 69 63 65 29 22 0a 20 20 20 20 73 46  eOffice)".    sF
0510: 69 78 65 64 6c 69 6e 65 20 3d 20 27 3c 64 6c 67  ixedline = '<dlg
0520: 3a 66 69 78 65 64 6c 69 6e 65 20 64 6c 67 3a 69  :fixedline dlg:i
0530: 64 3d 22 7b 30 7d 22 20 64 6c 67 3a 74 61 62 2d  d="{0}" dlg:tab-
0540: 69 6e 64 65 78 3d 22 7b 31 7d 22 20 64 6c 67 3a  index="{1}" dlg:
0550: 74 6f 70 3d 22 7b 32 7d 22 20 64 6c 67 3a 6c 65  top="{2}" dlg:le
0560: 66 74 3d 22 35 22 20 64 6c 67 3a 77 69 64 74 68  ft="5" dlg:width
0570: 3d 22 7b 33 7d 22 20 64 6c 67 3a 68 65 69 67 68  ="{3}" dlg:heigh
0580: 74 3d 22 31 30 22 20 64 6c 67 3a 76 61 6c 75 65  t="10" dlg:value
0590: 3d 22 26 61 6d 70 3b 7b 30 7d 22 20 2f 3e 5c 6e  ="&amp;{0}" />\n
05a0: 27 0a 20 20 20 20 73 43 68 65 63 6b 62 6f 78 20  '.    sCheckbox 
05b0: 3d 20 27 3c 64 6c 67 3a 63 68 65 63 6b 62 6f 78  = '<dlg:checkbox
05c0: 20 64 6c 67 3a 69 64 3d 22 7b 30 7d 22 20 64 6c   dlg:id="{0}" dl
05d0: 67 3a 74 61 62 2d 69 6e 64 65 78 3d 22 7b 31 7d  g:tab-index="{1}
05e0: 22 20 64 6c 67 3a 74 6f 70 3d 22 7b 32 7d 22 20  " dlg:top="{2}" 
05f0: 64 6c 67 3a 6c 65 66 74 3d 22 7b 33 7d 22 20 64  dlg:left="{3}" d
0600: 6c 67 3a 77 69 64 74 68 3d 22 7b 34 7d 22 20 64  lg:width="{4}" d
0610: 6c 67 3a 68 65 69 67 68 74 3d 22 31 30 22 20 64  lg:height="10" d
0620: 6c 67 3a 76 61 6c 75 65 3d 22 26 61 6d 70 3b 7b  lg:value="&amp;{
0630: 30 7d 22 20 64 6c 67 3a 63 68 65 63 6b 65 64 3d  0}" dlg:checked=
0640: 22 7b 35 7d 22 20 7b 36 7d 20 2f 3e 5c 6e 27 0a  "{5}" {6} />\n'.
0650: 20 20 20 20 69 54 61 62 49 6e 64 65 78 20 3d 20      iTabIndex = 
0660: 31 0a 20 20 20 20 6e 50 6f 73 59 20 3d 20 35 0a  1.    nPosY = 5.
0670: 20 20 20 20 6e 57 69 64 74 68 20 3d 20 32 34 30      nWidth = 240
0680: 0a 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 3d 20  .    sContent = 
0690: 22 22 0a 20 20 20 20 64 4f 70 74 20 3d 20 64 56  "".    dOpt = dV
06a0: 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e 22  ars["dOptPython"
06b0: 5d 0a 20 20 20 20 64 4f 70 74 4c 61 62 65 6c 20  ].    dOptLabel 
06c0: 3d 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61 62  = dVars["dOptLab
06d0: 65 6c 22 5d 5b 64 56 61 72 73 5b 22 6c 61 6e 67  el"][dVars["lang
06e0: 22 5d 5d 0a 20 20 20 20 66 6f 72 20 73 47 72 6f  "]].    for sGro
06f0: 75 70 2c 20 6c 47 72 6f 75 70 4f 70 74 69 6f 6e  up, lGroupOption
0700: 73 20 69 6e 20 64 56 61 72 73 5b 22 6c 53 74 72  s in dVars["lStr
0710: 75 63 74 4f 70 74 22 5d 3a 0a 20 20 20 20 20 20  uctOpt"]:.      
0720: 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 73 46    sContent += sF
0730: 69 78 65 64 6c 69 6e 65 2e 66 6f 72 6d 61 74 28  ixedline.format(
0740: 73 47 72 6f 75 70 2c 20 69 54 61 62 49 6e 64 65  sGroup, iTabInde
0750: 78 2c 20 6e 50 6f 73 59 2c 20 6e 57 69 64 74 68  x, nPosY, nWidth
0760: 29 0a 20 20 20 20 20 20 20 20 69 54 61 62 49 6e  ).        iTabIn
0770: 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20 20 20  dex += 1.       
0780: 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e   for lLineOption
0790: 73 20 69 6e 20 6c 47 72 6f 75 70 4f 70 74 69 6f  s in lGroupOptio
07a0: 6e 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns:.            
07b0: 6e 45 6c 65 6d 57 69 64 74 68 20 3d 20 6e 57 69  nElemWidth = nWi
07c0: 64 74 68 20 2f 2f 20 6c 65 6e 28 6c 4c 69 6e 65  dth // len(lLine
07d0: 4f 70 74 69 6f 6e 73 29 0a 20 20 20 20 20 20 20  Options).       
07e0: 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31 30       nPosY += 10
07f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6f  .            nPo
0800: 73 58 20 3d 20 31 30 0a 20 20 20 20 20 20 20 20  sX = 10.        
0810: 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20      for sOpt in 
0820: 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73 3a 0a 20 20  lLineOptions:.  
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 48                sH
0840: 65 6c 70 20 3d 20 27 64 6c 67 3a 68 65 6c 70 2d  elp = 'dlg:help-
0850: 74 65 78 74 3d 22 26 61 6d 70 3b 68 6c 70 5f 25  text="&amp;hlp_%
0860: 73 22 27 25 73 4f 70 74 20 20 69 66 20 64 4f 70  s"'%sOpt  if dOp
0870: 74 4c 61 62 65 6c 5b 73 4f 70 74 5d 5b 31 5d 20  tLabel[sOpt][1] 
0880: 20 65 6c 73 65 20 22 22 0a 20 20 20 20 20 20 20   else "".       
0890: 20 20 20 20 20 20 20 20 20 73 43 6f 6e 74 65 6e           sConten
08a0: 74 20 2b 3d 20 73 43 68 65 63 6b 62 6f 78 2e 66  t += sCheckbox.f
08b0: 6f 72 6d 61 74 28 73 4f 70 74 2c 20 69 54 61 62  ormat(sOpt, iTab
08c0: 49 6e 64 65 78 2c 20 6e 50 6f 73 59 2c 20 6e 50  Index, nPosY, nP
08d0: 6f 73 58 2c 20 6e 45 6c 65 6d 57 69 64 74 68 2c  osX, nElemWidth,
08e0: 20 22 74 72 75 65 22 20 69 66 20 64 4f 70 74 5b   "true" if dOpt[
08f0: 73 4f 70 74 5d 20 65 6c 73 65 20 22 66 61 6c 73  sOpt] else "fals
0900: 65 22 2c 20 73 48 65 6c 70 29 0a 20 20 20 20 20  e", sHelp).     
0910: 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 49             iTabI
0920: 6e 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20 20  ndex += 1.      
0930: 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 58 20            nPosX 
0940: 2b 3d 20 6e 45 6c 65 6d 57 69 64 74 68 0a 20 20  += nElemWidth.  
0950: 20 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31        nPosY += 1
0960: 30 0a 20 20 20 20 72 65 74 75 72 6e 20 73 43 6f  0.    return sCo
0970: 6e 74 65 6e 74 0a 0a 0a 64 65 66 20 63 72 65 61  ntent...def crea
0980: 74 65 4f 58 54 20 28 73 70 4c 61 6e 67 2c 20 64  teOXT (spLang, d
0990: 56 61 72 73 2c 20 64 4f 78 74 2c 20 73 70 4c 61  Vars, dOxt, spLa
09a0: 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61 6c 6c  ngPack, bInstall
09b0: 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 65  ):.    "create e
09c0: 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 57 72 69  xtension for Wri
09d0: 74 65 72 22 0a 20 20 20 20 70 72 69 6e 74 28 22  ter".    print("
09e0: 42 75 69 6c 64 69 6e 67 20 65 78 74 65 6e 73 69  Building extensi
09f0: 6f 6e 20 66 6f 72 20 57 72 69 74 65 72 22 29 0a  on for Writer").
0a00: 20 20 20 20 73 70 66 5a 69 70 20 3d 20 22 5f 62      spfZip = "_b
0a10: 75 69 6c 64 2f 22 20 2b 20 64 56 61 72 73 5b 27  uild/" + dVars['
0a20: 6e 61 6d 65 27 5d 20 2b 20 22 2d 22 2b 20 64 56  name'] + "-"+ dV
0a30: 61 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 22 2d 76  ars['lang'] +"-v
0a40: 22 20 2b 20 64 56 61 72 73 5b 27 76 65 72 73 69  " + dVars['versi
0a50: 6f 6e 27 5d 20 2b 20 27 2e 6f 78 74 27 0a 20 20  on'] + '.oxt'.  
0a60: 20 20 68 5a 69 70 20 3d 20 7a 69 70 66 69 6c 65    hZip = zipfile
0a70: 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a 69 70 2c  .ZipFile(spfZip,
0a80: 20 6d 6f 64 65 3d 27 77 27 2c 20 63 6f 6d 70 72   mode='w', compr
0a90: 65 73 73 69 6f 6e 3d 7a 69 70 66 69 6c 65 2e 5a  ession=zipfile.Z
0aa0: 49 50 5f 44 45 46 4c 41 54 45 44 29 0a 0a 20 20  IP_DEFLATED)..  
0ab0: 20 20 23 20 50 61 63 6b 61 67 65 20 61 6e 64 20    # Package and 
0ac0: 70 61 72 73 65 72 0a 20 20 20 20 63 6f 70 79 47  parser.    copyG
0ad0: 72 61 6d 6d 61 6c 65 63 74 65 50 79 50 61 63 6b  rammalectePyPack
0ae0: 61 67 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a 69  ageInZipFile(hZi
0af0: 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 22  p, spLangPack, "
0b00: 70 79 74 68 6f 6e 70 61 74 68 2f 22 29 0a 20 20  pythonpath/").  
0b10: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 72    hZip.write("gr
0b20: 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70 79  ammalecte-cli.py
0b30: 22 2c 20 22 70 79 74 68 6f 6e 70 61 74 68 2f 67  ", "pythonpath/g
0b40: 72 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70  rammalecte-cli.p
0b50: 79 22 29 0a 0a 20 20 20 20 23 20 45 78 74 65 6e  y")..    # Exten
0b60: 73 69 6f 6e 20 66 69 6c 65 73 0a 20 20 20 20 68  sion files.    h
0b70: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 4d 45  Zip.writestr("ME
0b80: 54 41 2d 49 4e 46 2f 6d 61 6e 69 66 65 73 74 2e  TA-INF/manifest.
0b90: 78 6d 6c 22 2c 20 68 65 6c 70 65 72 73 2e 66 69  xml", helpers.fi
0ba0: 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f  leFile("gc_core/
0bb0: 70 79 2f 6f 78 74 2f 6d 61 6e 69 66 65 73 74 2e  py/oxt/manifest.
0bc0: 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20 20  xml", dVars)).  
0bd0: 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28    hZip.writestr(
0be0: 22 64 65 73 63 72 69 70 74 69 6f 6e 2e 78 6d 6c  "description.xml
0bf0: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
0c00: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
0c10: 6f 78 74 2f 64 65 73 63 72 69 70 74 69 6f 6e 2e  oxt/description.
0c20: 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20 20  xml", dVars)).  
0c30: 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28    hZip.writestr(
0c40: 22 4c 69 6e 67 75 69 73 74 69 63 2e 78 63 75 22  "Linguistic.xcu"
0c50: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
0c60: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
0c70: 78 74 2f 4c 69 6e 67 75 69 73 74 69 63 2e 78 63  xt/Linguistic.xc
0c80: 75 22 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20  u", dVars)).    
0c90: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 47  hZip.writestr("G
0ca0: 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22 2c 20  rammalecte.py", 
0cb0: 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65  helpers.fileFile
0cc0: 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74  ("gc_core/py/oxt
0cd0: 2f 47 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22  /Grammalecte.py"
0ce0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
0cf0: 69 70 2e 77 72 69 74 65 73 74 72 28 22 70 79 74  ip.writestr("pyt
0d00: 68 6f 6e 70 61 74 68 2f 68 65 6c 70 65 72 73 2e  honpath/helpers.
0d10: 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c  py", helpers.fil
0d20: 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70  eFile("gc_core/p
0d30: 79 2f 6f 78 74 2f 68 65 6c 70 65 72 73 2e 70 79  y/oxt/helpers.py
0d40: 22 2c 20 64 56 61 72 73 29 29 0a 0a 20 20 20 20  ", dVars))..    
0d50: 66 6f 72 20 73 66 20 69 6e 20 64 56 61 72 73 5b  for sf in dVars[
0d60: 22 65 78 74 72 61 73 22 5d 2e 73 70 6c 69 74 28  "extras"].split(
0d70: 22 2c 22 29 3a 0a 20 20 20 20 20 20 20 20 68 5a  ","):.        hZ
0d80: 69 70 2e 77 72 69 74 65 73 74 72 28 73 66 2e 73  ip.writestr(sf.s
0d90: 74 72 69 70 28 29 2c 20 68 65 6c 70 65 72 73 2e  trip(), helpers.
0da0: 66 69 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67 20  fileFile(spLang 
0db0: 2b 20 27 2f 27 20 2b 20 73 66 2e 73 74 72 69 70  + '/' + sf.strip
0dc0: 28 29 2c 20 64 56 61 72 73 29 29 0a 0a 20 20 20  (), dVars))..   
0dd0: 20 69 66 20 22 6c 6f 67 6f 22 20 69 6e 20 64 56   if "logo" in dV
0de0: 61 72 73 2e 6b 65 79 73 28 29 20 61 6e 64 20 64  ars.keys() and d
0df0: 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72  Vars["logo"].str
0e00: 69 70 28 29 3a 0a 20 20 20 20 20 20 20 20 68 5a  ip():.        hZ
0e10: 69 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 20  ip.write(spLang 
0e20: 2b 20 27 2f 27 20 2b 20 64 56 61 72 73 5b 22 6c  + '/' + dVars["l
0e30: 6f 67 6f 22 5d 2e 73 74 72 69 70 28 29 2c 20 64  ogo"].strip(), d
0e40: 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72  Vars["logo"].str
0e50: 69 70 28 29 29 0a 0a 20 20 20 20 23 23 20 4f 50  ip())..    ## OP
0e60: 54 49 4f 4e 53 0a 20 20 20 20 23 20 6f 70 74 69  TIONS.    # opti
0e70: 6f 6e 73 20 64 69 61 6c 6f 67 20 77 69 74 68 69  ons dialog withi
0e80: 6e 20 4c 4f 2f 4f 4f 20 6f 70 74 69 6f 6e 73 20  n LO/OO options 
0e90: 70 61 6e 65 6c 20 28 6c 65 67 61 63 79 29 0a 20  panel (legacy). 
0ea0: 20 20 20 23 68 5a 69 70 2e 77 72 69 74 65 73 74     #hZip.writest
0eb0: 72 28 22 70 79 74 68 6f 6e 70 61 74 68 2f 6c 69  r("pythonpath/li
0ec0: 67 68 74 70 72 6f 6f 66 5f 68 61 6e 64 6c 65 72  ghtproof_handler
0ed0: 5f 67 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22  _grammalecte.py"
0ee0: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
0ef0: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
0f00: 78 74 2f 6c 69 67 68 74 70 72 6f 6f 66 5f 68 61  xt/lightproof_ha
0f10: 6e 64 6c 65 72 5f 67 72 61 6d 6d 61 6c 65 63 74  ndler_grammalect
0f20: 65 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a 20  e.py", dVars)). 
0f30: 20 20 20 23 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73     #lLineOptions
0f40: 20 3d 20 6f 70 65 6e 28 73 70 4c 61 6e 67 20 2b   = open(spLang +
0f50: 20 22 2f 6f 70 74 69 6f 6e 73 2e 74 78 74 22 2c   "/options.txt",
0f60: 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "r", encoding="
0f70: 75 74 66 2d 38 22 29 2e 72 65 61 64 6c 69 6e 65  utf-8").readline
0f80: 73 28 29 0a 20 20 20 20 23 64 69 61 6c 6f 67 5f  s().    #dialog_
0f90: 62 75 6e 64 6c 65 64 2e 63 28 64 56 61 72 73 5b  bundled.c(dVars[
0fa0: 22 69 6d 70 6c 6e 61 6d 65 22 5d 2c 20 6c 4c 69  "implname"], lLi
0fb0: 6e 65 4f 70 74 69 6f 6e 73 2c 20 68 5a 69 70 2c  neOptions, hZip,
0fc0: 20 64 56 61 72 73 5b 22 6c 61 6e 67 22 5d 29 0a   dVars["lang"]).
0fd0: 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20 64  .    # options d
0fe0: 69 61 6c 6f 67 0a 20 20 20 20 68 5a 69 70 2e 77  ialog.    hZip.w
0ff0: 72 69 74 65 73 74 72 28 22 70 79 74 68 6f 6e 70  ritestr("pythonp
1000: 61 74 68 2f 4f 70 74 69 6f 6e 73 2e 70 79 22 2c  ath/Options.py",
1010: 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c   helpers.fileFil
1020: 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78  e("gc_core/py/ox
1030: 74 2f 4f 70 74 69 6f 6e 73 2e 70 79 22 2c 20 64  t/Options.py", d
1040: 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69 70 2e  Vars)).    hZip.
1050: 77 72 69 74 65 28 22 67 63 5f 63 6f 72 65 2f 70  write("gc_core/p
1060: 79 2f 6f 78 74 2f 6f 70 5f 73 74 72 69 6e 67 73  y/oxt/op_strings
1070: 2e 70 79 22 2c 20 22 70 79 74 68 6f 6e 70 61 74  .py", "pythonpat
1080: 68 2f 6f 70 5f 73 74 72 69 6e 67 73 2e 70 79 22  h/op_strings.py"
1090: 29 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20  ).    # options 
10a0: 64 69 61 6c 6f 67 20 77 69 74 68 69 6e 20 57 72  dialog within Wr
10b0: 69 74 65 72 20 6f 70 74 69 6f 6e 73 20 70 61 6e  iter options pan
10c0: 65 6c 0a 20 20 20 20 64 56 61 72 73 5b 22 78 64  el.    dVars["xd
10d0: 6c 5f 64 69 61 6c 6f 67 5f 6f 70 74 69 6f 6e 73  l_dialog_options
10e0: 22 5d 20 3d 20 63 72 65 61 74 65 44 69 61 6c 6f  "] = createDialo
10f0: 67 4f 70 74 69 6f 6e 73 58 44 4c 28 64 56 61 72  gOptionsXDL(dVar
1100: 73 29 0a 20 20 20 20 64 56 61 72 73 5b 22 78 63  s).    dVars["xc
1110: 73 5f 6f 70 74 69 6f 6e 73 22 5d 20 3d 20 22 5c  s_options"] = "\
1120: 6e 22 2e 6a 6f 69 6e 28 5b 20 27 3c 70 72 6f 70  n".join([ '<prop
1130: 20 6f 6f 72 3a 6e 61 6d 65 3d 22 27 2b 73 4f 70   oor:name="'+sOp
1140: 74 2b 27 22 20 6f 6f 72 3a 74 79 70 65 3d 22 78  t+'" oor:type="x
1150: 73 3a 73 74 72 69 6e 67 22 3e 3c 76 61 6c 75 65  s:string"><value
1160: 3e 3c 2f 76 61 6c 75 65 3e 3c 2f 70 72 6f 70 3e  ></value></prop>
1170: 27 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 64 56  ' for sOpt in dV
1180: 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e 22  ars["dOptPython"
1190: 5d 20 5d 29 0a 20 20 20 20 64 56 61 72 73 5b 22  ] ]).    dVars["
11a0: 78 63 75 5f 6c 61 62 65 6c 5f 76 61 6c 75 65 73  xcu_label_values
11b0: 22 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 5b  "] = "\n".join([
11c0: 20 27 3c 76 61 6c 75 65 20 78 6d 6c 3a 6c 61 6e   '<value xml:lan
11d0: 67 3d 22 27 2b 73 4c 61 6e 67 2b 27 22 3e 27 20  g="'+sLang+'">' 
11e0: 2b 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61 62  + dVars["dOptLab
11f0: 65 6c 22 5d 5b 73 4c 61 6e 67 5d 5b 22 5f 5f 6f  el"][sLang]["__o
1200: 70 74 69 6f 6e 74 69 74 6c 65 5f 5f 22 5d 20 2b  ptiontitle__"] +
1210: 20 27 3c 2f 76 61 6c 75 65 3e 27 20 20 66 6f 72   '</value>'  for
1220: 20 73 4c 61 6e 67 20 69 6e 20 64 56 61 72 73 5b   sLang in dVars[
1230: 22 64 4f 70 74 4c 61 62 65 6c 22 5d 20 5d 29 0a  "dOptLabel"] ]).
1240: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
1250: 72 28 22 64 69 61 6c 6f 67 2f 6f 70 74 69 6f 6e  r("dialog/option
1260: 73 5f 70 61 67 65 2e 78 64 6c 22 2c 20 68 65 6c  s_page.xdl", hel
1270: 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 22 67  pers.fileFile("g
1280: 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6f 70  c_core/py/oxt/op
1290: 74 69 6f 6e 73 5f 70 61 67 65 2e 78 64 6c 22 2c  tions_page.xdl",
12a0: 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69   dVars)).    hZi
12b0: 70 2e 77 72 69 74 65 73 74 72 28 22 64 69 61 6c  p.writestr("dial
12c0: 6f 67 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f 67  og/OptionsDialog
12d0: 2e 78 63 73 22 2c 20 68 65 6c 70 65 72 73 2e 66  .xcs", helpers.f
12e0: 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65  ileFile("gc_core
12f0: 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73 44  /py/oxt/OptionsD
1300: 69 61 6c 6f 67 2e 78 63 73 22 2c 20 64 56 61 72  ialog.xcs", dVar
1310: 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  s)).    hZip.wri
1320: 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 4f 70  testr("dialog/Op
1330: 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 75 22  tionsDialog.xcu"
1340: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
1350: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
1360: 78 74 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f 67  xt/OptionsDialog
1370: 2e 78 63 75 22 2c 20 64 56 61 72 73 29 29 0a 20  .xcu", dVars)). 
1380: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72     hZip.writestr
1390: 28 22 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56 61  ("dialog/" + dVa
13a0: 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f 65  rs['lang'] + "_e
13b0: 6e 2e 64 65 66 61 75 6c 74 22 2c 20 22 22 29 0a  n.default", "").
13c0: 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 4c 62 6c      for sLangLbl
13d0: 2c 20 64 4f 70 74 4c 62 6c 20 69 6e 20 64 56 61  , dOptLbl in dVa
13e0: 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d 2e  rs['dOptLabel'].
13f0: 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20  items():.       
1400: 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22   hZip.writestr("
1410: 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56 61 72 73  dialog/" + dVars
1420: 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f 22 20 2b  ['lang'] + "_" +
1430: 20 73 4c 61 6e 67 4c 62 6c 20 2b 20 22 2e 70 72   sLangLbl + ".pr
1440: 6f 70 65 72 74 69 65 73 22 2c 20 63 72 65 61 74  operties", creat
1450: 65 4f 70 74 69 6f 6e 73 4c 61 62 65 6c 50 72 6f  eOptionsLabelPro
1460: 70 65 72 74 69 65 73 28 64 4f 70 74 4c 62 6c 29  perties(dOptLbl)
1470: 29 0a 0a 20 20 20 20 23 23 20 41 44 44 4f 4e 53  )..    ## ADDONS
1480: 20 4f 58 54 0a 20 20 20 20 70 72 69 6e 74 28 22   OXT.    print("
1490: 2b 20 4f 58 54 3a 20 22 2c 20 65 6e 64 3d 22 22  + OXT: ", end=""
14a0: 29 0a 20 20 20 20 66 6f 72 20 73 70 66 53 72 63  ).    for spfSrc
14b0: 2c 20 73 70 66 44 73 74 20 69 6e 20 64 4f 78 74  , spfDst in dOxt
14c0: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
14d0: 20 20 70 72 69 6e 74 28 73 70 66 53 72 63 2c 20    print(spfSrc, 
14e0: 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 20 20  end=", ").      
14f0: 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73 64    if os.path.isd
1500: 69 72 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70  ir(spLang+'/'+sp
1510: 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20  fSrc):.         
1520: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
1530: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 27  listdir(spLang+'
1540: 2f 27 2b 73 70 66 53 72 63 29 3a 0a 20 20 20 20  /'+spfSrc):.    
1550: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
1560: 66 2e 65 6e 64 73 77 69 74 68 28 28 27 2e 74 78  f.endswith(('.tx
1570: 74 27 2c 20 27 2e 70 79 27 29 29 3a 0a 20 20 20  t', '.py')):.   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73   hZip.writestr(s
15a0: 70 66 44 73 74 2b 22 2f 22 2b 73 66 2c 20 68 65  pfDst+"/"+sf, he
15b0: 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 73  lpers.fileFile(s
15c0: 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63  pLang+'/'+spfSrc
15d0: 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 29  +"/"+sf, dVars))
15e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f0: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
1600: 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e             hZip.
1610: 77 72 69 74 65 28 73 70 4c 61 6e 67 2b 27 2f 27  write(spLang+'/'
1620: 2b 73 70 66 53 72 63 2b 22 2f 22 2b 73 66 2c 20  +spfSrc+"/"+sf, 
1630: 73 70 66 44 73 74 2b 22 2f 22 2b 73 66 29 0a 20  spfDst+"/"+sf). 
1640: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
1650: 20 20 20 20 20 20 20 20 20 69 66 20 73 70 66 53           if spfS
1660: 72 63 2e 65 6e 64 73 77 69 74 68 28 28 27 2e 74  rc.endswith(('.t
1670: 78 74 27 2c 20 27 2e 70 79 27 29 29 3a 0a 20 20  xt', '.py')):.  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a                hZ
1690: 69 70 2e 77 72 69 74 65 73 74 72 28 73 70 66 44  ip.writestr(spfD
16a0: 73 74 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65  st, helpers.file
16b0: 46 69 6c 65 28 73 70 4c 61 6e 67 2b 27 2f 27 2b  File(spLang+'/'+
16c0: 73 70 66 53 72 63 2c 20 64 56 61 72 73 29 29 0a  spfSrc, dVars)).
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
16e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
16f0: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 4c    hZip.write(spL
1700: 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63 2c 20  ang+'/'+spfSrc, 
1710: 73 70 66 44 73 74 29 0a 20 20 20 20 70 72 69 6e  spfDst).    prin
1720: 74 28 29 0a 20 20 20 20 68 5a 69 70 2e 63 6c 6f  t().    hZip.clo
1730: 73 65 28 29 0a 0a 20 20 20 20 23 20 49 6e 73 74  se()..    # Inst
1740: 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57 72 69 74  allation in Writ
1750: 65 72 20 70 72 6f 66 69 6c 65 0a 20 20 20 20 69  er profile.    i
1760: 66 20 62 49 6e 73 74 61 6c 6c 3a 0a 20 20 20 20  f bInstall:.    
1770: 20 20 20 20 70 72 69 6e 74 28 22 3e 20 69 6e 73      print("> ins
1780: 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57 72 69  tallation in Wri
1790: 74 65 72 22 29 0a 20 20 20 20 20 20 20 20 69 66  ter").        if
17a0: 20 64 56 61 72 73 2e 67 65 74 28 27 75 6e 6f 70   dVars.get('unop
17b0: 6b 67 27 2c 20 46 61 6c 73 65 29 3a 0a 20 20 20  kg', False):.   
17c0: 20 20 20 20 20 20 20 20 20 63 6d 64 20 3d 20 27           cmd = '
17d0: 22 27 2b 6f 73 2e 70 61 74 68 2e 61 62 73 70 61  "'+os.path.abspa
17e0: 74 68 28 64 56 61 72 73 2e 67 65 74 28 27 75 6e  th(dVars.get('un
17f0: 6f 70 6b 67 27 29 2b 27 22 20 61 64 64 20 2d 66  opkg')+'" add -f
1800: 20 27 2b 73 70 66 5a 69 70 29 0a 20 20 20 20 20   '+spfZip).     
1810: 20 20 20 20 20 20 20 70 72 69 6e 74 28 63 6d 64         print(cmd
1820: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  ).            os
1830: 2e 73 79 73 74 65 6d 28 63 6d 64 29 0a 20 20 20  .system(cmd).   
1840: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1850: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
1860: 45 72 72 6f 72 3a 20 70 61 74 68 20 61 6e 64 20  Error: path and 
1870: 66 69 6c 65 6e 61 6d 65 20 6f 66 20 75 6e 6f 70  filename of unop
1880: 6b 67 20 6e 6f 74 20 73 65 74 20 69 6e 20 63 6f  kg not set in co
1890: 6e 66 69 67 2e 69 6e 69 22 29 0a 0a 0a 64 65 66  nfig.ini")...def
18a0: 20 63 72 65 61 74 65 53 65 72 76 65 72 4f 70 74   createServerOpt
18b0: 69 6f 6e 73 20 28 73 4c 61 6e 67 2c 20 64 4f 70  ions (sLang, dOp
18c0: 74 44 61 74 61 29 3a 0a 20 20 20 20 22 63 72 65  tData):.    "cre
18d0: 61 74 65 20 66 69 6c 65 20 6f 70 74 69 6f 6e 73  ate file options
18e0: 20 66 6f 72 20 47 72 61 6d 6d 61 6c 65 63 74 65   for Grammalecte
18f0: 20 73 65 72 76 65 72 22 0a 20 20 20 20 77 69 74   server".    wit
1900: 68 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65  h open("grammale
1910: 63 74 65 2d 73 65 72 76 65 72 2d 6f 70 74 69 6f  cte-server-optio
1920: 6e 73 2e 22 2b 73 4c 61 6e 67 2b 22 2e 69 6e 69  ns."+sLang+".ini
1930: 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67  ", "w", encoding
1940: 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e  ="utf-8", newlin
1950: 65 3d 22 5c 6e 22 29 20 61 73 20 68 44 73 74 3a  e="\n") as hDst:
1960: 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72  .        hDst.wr
1970: 69 74 65 28 22 23 20 53 65 72 76 65 72 20 6f 70  ite("# Server op
1980: 74 69 6f 6e 73 2e 20 4c 61 6e 67 3a 20 22 20 2b  tions. Lang: " +
1990: 20 73 4c 61 6e 67 20 2b 20 22 5c 6e 5c 6e 5b 67   sLang + "\n\n[g
19a0: 63 5f 6f 70 74 69 6f 6e 73 5d 5c 6e 22 29 0a 20  c_options]\n"). 
19b0: 20 20 20 20 20 20 20 66 6f 72 20 73 53 65 63 74         for sSect
19c0: 69 6f 6e 2c 20 6c 4f 70 74 20 69 6e 20 64 4f 70  ion, lOpt in dOp
19d0: 74 44 61 74 61 5b 22 6c 53 74 72 75 63 74 4f 70  tData["lStructOp
19e0: 74 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  t"]:.           
19f0: 20 68 44 73 74 2e 77 72 69 74 65 28 22 5c 6e 23   hDst.write("\n#
1a00: 23 23 23 23 23 23 23 23 23 20 22 20 2b 20 64 4f  ######### " + dO
1a10: 70 74 44 61 74 61 5b 22 64 4f 70 74 4c 61 62 65  ptData["dOptLabe
1a20: 6c 22 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74 28 73  l"][sLang].get(s
1a30: 53 65 63 74 69 6f 6e 2c 20 73 53 65 63 74 69 6f  Section, sSectio
1a40: 6e 20 2b 20 22 5b 6e 6f 20 6c 61 62 65 6c 20 66  n + "[no label f
1a50: 6f 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22 20 23  ound]")[0] + " #
1a60: 23 23 23 23 23 23 23 23 23 5c 6e 22 29 0a 20 20  #########\n").  
1a70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 6c 4c            for lL
1a80: 69 6e 65 4f 70 74 20 69 6e 20 6c 4f 70 74 3a 0a  ineOpt in lOpt:.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c 4c 69 6e  for sOpt in lLin
1ab0: 65 4f 70 74 3a 0a 20 20 20 20 20 20 20 20 20 20  eOpt:.          
1ac0: 20 20 20 20 20 20 20 20 20 20 68 44 73 74 2e 77            hDst.w
1ad0: 72 69 74 65 28 22 23 20 22 20 2b 20 64 4f 70 74  rite("# " + dOpt
1ae0: 44 61 74 61 5b 22 64 4f 70 74 4c 61 62 65 6c 22  Data["dOptLabel"
1af0: 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74 28 73 4f 70  ][sLang].get(sOp
1b00: 74 2c 20 22 5b 6e 6f 20 6c 61 62 65 6c 20 66 6f  t, "[no label fo
1b10: 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22 5c 6e 22  und]")[0] + "\n"
1b20: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1b30: 20 20 20 20 20 20 68 44 73 74 2e 77 72 69 74 65        hDst.write
1b40: 28 73 4f 70 74 20 2b 20 22 20 3d 20 22 20 2b 20  (sOpt + " = " + 
1b50: 28 22 31 22 20 69 66 20 64 4f 70 74 44 61 74 61  ("1" if dOptData
1b60: 5b 22 64 4f 70 74 53 65 72 76 65 72 22 5d 2e 67  ["dOptServer"].g
1b70: 65 74 28 73 4f 70 74 2c 20 4e 6f 6e 65 29 20 65  et(sOpt, None) e
1b80: 6c 73 65 20 22 30 22 29 20 2b 20 22 5c 6e 22 29  lse "0") + "\n")
1b90: 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72  .        hDst.wr
1ba0: 69 74 65 28 22 68 74 6d 6c 20 3d 20 31 5c 6e 22  ite("html = 1\n"
1bb0: 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 50 61  )...def createPa
1bc0: 63 6b 61 67 65 5a 69 70 20 28 64 56 61 72 73 2c  ckageZip (dVars,
1bd0: 20 73 70 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20   spLangPack):.  
1be0: 20 20 22 63 72 65 61 74 65 20 73 65 72 76 65 72    "create server
1bf0: 20 7a 69 70 22 0a 20 20 20 20 73 70 66 5a 69 70   zip".    spfZip
1c00: 20 3d 20 22 5f 62 75 69 6c 64 2f 22 20 2b 20 64   = "_build/" + d
1c10: 56 61 72 73 5b 27 6e 61 6d 65 27 5d 20 2b 20 22  Vars['name'] + "
1c20: 2d 22 2b 20 64 56 61 72 73 5b 27 6c 61 6e 67 27  -"+ dVars['lang'
1c30: 5d 20 2b 22 2d 76 22 20 2b 20 64 56 61 72 73 5b  ] +"-v" + dVars[
1c40: 27 76 65 72 73 69 6f 6e 27 5d 20 2b 20 27 2e 7a  'version'] + '.z
1c50: 69 70 27 0a 20 20 20 20 68 5a 69 70 20 3d 20 7a  ip'.    hZip = z
1c60: 69 70 66 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73  ipfile.ZipFile(s
1c70: 70 66 5a 69 70 2c 20 6d 6f 64 65 3d 27 77 27 2c  pfZip, mode='w',
1c80: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 3d 7a 69 70   compression=zip
1c90: 66 69 6c 65 2e 5a 49 50 5f 44 45 46 4c 41 54 45  file.ZIP_DEFLATE
1ca0: 44 29 0a 20 20 20 20 63 6f 70 79 47 72 61 6d 6d  D).    copyGramm
1cb0: 61 6c 65 63 74 65 50 79 50 61 63 6b 61 67 65 49  alectePyPackageI
1cc0: 6e 5a 69 70 46 69 6c 65 28 68 5a 69 70 2c 20 73  nZipFile(hZip, s
1cd0: 70 4c 61 6e 67 50 61 63 6b 29 0a 20 20 20 20 66  pLangPack).    f
1ce0: 6f 72 20 73 70 66 20 69 6e 20 5b 22 67 72 61 6d  or spf in ["gram
1cf0: 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70 79 22 2c  malecte-cli.py",
1d00: 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 73 65   "grammalecte-se
1d10: 72 76 65 72 2e 70 79 22 2c 20 5c 0a 20 20 20 20  rver.py", \.    
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41              "REA
1d30: 44 4d 45 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e  DME.txt", "LICEN
1d40: 53 45 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53  SE.txt", "LICENS
1d50: 45 2e 66 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20  E.fr.txt"]:.    
1d60: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73      hZip.write(s
1d70: 70 66 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  pf).    hZip.wri
1d80: 74 65 73 74 72 28 22 73 65 74 75 70 2e 70 79 22  testr("setup.py"
1d90: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
1da0: 6c 65 28 22 67 63 5f 6c 61 6e 67 2f 66 72 2f 73  le("gc_lang/fr/s
1db0: 65 74 75 70 2e 70 79 22 2c 20 64 56 61 72 73 29  etup.py", dVars)
1dc0: 29 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72 61 6d  )...def copyGram
1dd0: 6d 61 6c 65 63 74 65 50 79 50 61 63 6b 61 67 65  malectePyPackage
1de0: 49 6e 5a 69 70 46 69 6c 65 20 28 68 5a 69 70 2c  InZipFile (hZip,
1df0: 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 73 41 64   spLangPack, sAd
1e00: 64 50 61 74 68 3d 22 22 29 3a 0a 20 20 20 20 22  dPath=""):.    "
1e10: 63 6f 70 79 20 47 72 61 6d 6d 61 6c 65 63 74 65  copy Grammalecte
1e20: 20 50 79 74 68 6f 6e 20 70 61 63 6b 61 67 65 20   Python package 
1e30: 69 6e 20 7a 69 70 20 66 69 6c 65 22 0a 20 20 20  in zip file".   
1e40: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
1e50: 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63  stdir("grammalec
1e60: 74 65 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  te"):.        if
1e70: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
1e80: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  ir("grammalecte/
1e90: 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  "+sf):.         
1ea0: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67     hZip.write("g
1eb0: 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66 2c  rammalecte/"+sf,
1ec0: 20 73 41 64 64 50 61 74 68 2b 22 67 72 61 6d 6d   sAddPath+"gramm
1ed0: 61 6c 65 63 74 65 2f 22 2b 73 66 29 0a 20 20 20  alecte/"+sf).   
1ee0: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
1ef0: 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63  stdir("grammalec
1f00: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 22 29 3a  te/graphspell"):
1f10: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
1f20: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67  os.path.isdir("g
1f30: 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68  rammalecte/graph
1f40: 73 70 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20 20 20  spell/"+sf):.   
1f50: 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72           hZip.wr
1f60: 69 74 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  ite("grammalecte
1f70: 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66  /graphspell/"+sf
1f80: 2c 20 73 41 64 64 50 61 74 68 2b 22 67 72 61 6d  , sAddPath+"gram
1f90: 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65  malecte/graphspe
1fa0: 6c 6c 2f 22 2b 73 66 29 0a 20 20 20 20 66 6f 72  ll/"+sf).    for
1fb0: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
1fc0: 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67  r("grammalecte/g
1fd0: 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69  raphspell/_dicti
1fe0: 6f 6e 61 72 69 65 73 22 29 3a 0a 20 20 20 20 20  onaries"):.     
1ff0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
2000: 68 2e 69 73 64 69 72 28 22 67 72 61 6d 6d 61 6c  h.isdir("grammal
2010: 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f  ecte/graphspell/
2020: 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b  _dictionaries/"+
2030: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
2040: 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 72 61   hZip.write("gra
2050: 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70  mmalecte/graphsp
2060: 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65  ell/_dictionarie
2070: 73 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68  s/"+sf, sAddPath
2080: 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72  +"grammalecte/gr
2090: 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f  aphspell/_dictio
20a0: 6e 61 72 69 65 73 2f 22 2b 73 66 29 0a 20 20 20  naries/"+sf).   
20b0: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
20c0: 73 74 64 69 72 28 73 70 4c 61 6e 67 50 61 63 6b  stdir(spLangPack
20d0: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
20e0: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
20f0: 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73  spLangPack+"/"+s
2100: 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  f):.            
2110: 68 5a 69 70 2e 77 72 69 74 65 28 73 70 4c 61 6e  hZip.write(spLan
2120: 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 73 41  gPack+"/"+sf, sA
2130: 64 64 50 61 74 68 2b 73 70 4c 61 6e 67 50 61 63  ddPath+spLangPac
2140: 6b 2b 22 2f 22 2b 73 66 29 0a 0a 0a 64 65 66 20  k+"/"+sf)...def 
2150: 63 72 65 61 74 65 20 28 73 4c 61 6e 67 2c 20 78  create (sLang, x
2160: 43 6f 6e 66 69 67 2c 20 62 49 6e 73 74 61 6c 6c  Config, bInstall
2170: 4f 58 54 2c 20 62 4a 61 76 61 53 63 72 69 70 74  OXT, bJavaScript
2180: 2c 20 62 55 73 65 43 61 63 68 65 29 3a 0a 20 20  , bUseCache):.  
2190: 20 20 22 6d 61 6b 65 20 47 72 61 6d 6d 61 6c 65    "make Grammale
21a0: 63 74 65 20 66 6f 72 20 70 72 6f 6a 65 63 74 20  cte for project 
21b0: 3c 73 4c 61 6e 67 3e 22 0a 20 20 20 20 6f 4e 6f  <sLang>".    oNo
21c0: 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64 61 74  w = datetime.dat
21d0: 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20 20 20  etime.now().    
21e0: 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d 3d  print("=========
21f0: 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41 4d 4d  ===== MAKE GRAMM
2200: 41 4c 45 43 54 45 20 5b 7b 30 7d 5d 20 61 74 20  ALECTE [{0}] at 
2210: 7b 31 2e 68 6f 75 72 3a 3e 32 7d 20 68 20 7b 31  {1.hour:>2} h {1
2220: 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d 69 6e 20  .minute:>2} min 
2230: 7b 31 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20 73 20  {1.second:>2} s 
2240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 2e  ==============".
2250: 66 6f 72 6d 61 74 28 73 4c 61 6e 67 2c 20 6f 4e  format(sLang, oN
2260: 6f 77 29 29 0a 0a 20 20 20 20 23 23 23 23 20 52  ow))..    #### R
2270: 45 41 44 20 43 4f 4e 46 49 47 55 52 41 54 49 4f  EAD CONFIGURATIO
2280: 4e 0a 20 20 20 20 70 72 69 6e 74 28 22 3e 20 72  N.    print("> r
2290: 65 61 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ead configuratio
22a0: 6e 2e 2e 2e 22 29 0a 20 20 20 20 73 70 4c 61 6e  n...").    spLan
22b0: 67 20 3d 20 22 67 63 5f 6c 61 6e 67 2f 22 20 2b  g = "gc_lang/" +
22c0: 20 73 4c 61 6e 67 0a 0a 20 20 20 20 64 56 61 72   sLang..    dVar
22d0: 73 20 3d 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63  s = xConfig._sec
22e0: 74 69 6f 6e 73 5b 27 61 72 67 73 27 5d 0a 20 20  tions['args'].  
22f0: 20 20 64 56 61 72 73 5b 27 6c 6f 63 61 6c 65 73    dVars['locales
2300: 27 5d 20 3d 20 64 56 61 72 73 5b 22 6c 6f 63 61  '] = dVars["loca
2310: 6c 65 73 22 5d 2e 72 65 70 6c 61 63 65 28 22 5f  les"].replace("_
2320: 22 2c 20 22 2d 22 29 0a 20 20 20 20 64 56 61 72  ", "-").    dVar
2330: 73 5b 27 6c 6f 63 27 5d 20 3d 20 73 74 72 28 7b  s['loc'] = str({
2340: 20 73 3a 20 5b 73 5b 30 3a 32 5d 2c 20 73 5b 33   s: [s[0:2], s[3
2350: 3a 35 5d 2c 20 22 22 5d 20 20 66 6f 72 20 73 20  :5], ""]  for s 
2360: 69 6e 20 64 56 61 72 73 5b 22 6c 6f 63 61 6c 65  in dVars["locale
2370: 73 22 5d 2e 73 70 6c 69 74 28 22 20 22 29 20 7d  s"].split(" ") }
2380: 29 0a 0a 20 20 20 20 23 23 20 43 4f 4d 50 49 4c  )..    ## COMPIL
2390: 45 20 52 55 4c 45 53 0a 20 20 20 20 64 52 65 73  E RULES.    dRes
23a0: 75 6c 74 20 3d 20 63 6f 6d 70 69 6c 65 5f 72 75  ult = compile_ru
23b0: 6c 65 73 2e 6d 61 6b 65 28 73 70 4c 61 6e 67 2c  les.make(spLang,
23c0: 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c 20   dVars['lang'], 
23d0: 62 55 73 65 43 61 63 68 65 29 0a 20 20 20 20 64  bUseCache).    d
23e0: 56 61 72 73 2e 75 70 64 61 74 65 28 64 52 65 73  Vars.update(dRes
23f0: 75 6c 74 29 0a 0a 20 20 20 20 23 23 20 52 45 41  ult)..    ## REA
2400: 44 20 47 52 41 4d 4d 41 52 20 43 48 45 43 4b 45  D GRAMMAR CHECKE
2410: 52 20 50 4c 55 47 49 4e 53 0a 20 20 20 20 70 72  R PLUGINS.    pr
2420: 69 6e 74 28 22 50 59 54 48 4f 4e 3a 22 29 0a 20  int("PYTHON:"). 
2430: 20 20 20 70 72 69 6e 74 28 22 2b 20 50 6c 75 67     print("+ Plug
2440: 69 6e 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a  ins: ", end="").
2450: 20 20 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73      sCodePlugins
2460: 20 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 66   = "".    for sf
2470: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 73   in os.listdir(s
2480: 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 22  pLang+"/modules"
2490: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 72 65  ):.        if re
24a0: 2e 6d 61 74 63 68 28 72 22 67 63 65 5f 5c 77 2b  .match(r"gce_\w+
24b0: 5b 2e 5d 70 79 24 22 2c 20 73 66 29 3a 0a 20 20  [.]py$", sf):.  
24c0: 20 20 20 20 20 20 20 20 20 20 73 43 6f 64 65 50            sCodeP
24d0: 6c 75 67 69 6e 73 20 2b 3d 20 22 5c 6e 5c 6e 22  lugins += "\n\n"
24e0: 20 2b 20 6f 70 65 6e 28 73 70 4c 61 6e 67 2b 27   + open(spLang+'
24f0: 2f 6d 6f 64 75 6c 65 73 2f 27 2b 73 66 2c 20 22  /modules/'+sf, "
2500: 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  r", encoding="ut
2510: 66 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20 20  f-8").read().   
2520: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73           print(s
2530: 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20  f, end=", ").   
2540: 20 70 72 69 6e 74 28 29 0a 20 20 20 20 64 56 61   print().    dVa
2550: 72 73 5b 22 70 6c 75 67 69 6e 73 22 5d 20 3d 20  rs["plugins"] = 
2560: 73 43 6f 64 65 50 6c 75 67 69 6e 73 0a 0a 20 20  sCodePlugins..  
2570: 20 20 23 23 20 43 4f 50 59 20 47 43 5f 43 4f 52    ## COPY GC_COR
2580: 45 20 43 4f 4d 4d 4f 4e 20 46 49 4c 45 53 0a 20  E COMMON FILES. 
2590: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
25a0: 6c 69 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65  listdir("gc_core
25b0: 2f 70 79 22 29 3a 0a 20 20 20 20 20 20 20 20 69  /py"):.        i
25c0: 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73  f not os.path.is
25d0: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  dir("gc_core/py/
25e0: 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  "+sf):.         
25f0: 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41     helpers.copyA
2600: 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 22  ndFileTemplate("
2610: 67 63 5f 63 6f 72 65 2f 70 79 2f 22 2b 73 66 2c  gc_core/py/"+sf,
2620: 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b   "grammalecte/"+
2630: 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20 66  sf, dVars).    f
2640: 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66 69  ile_util.copy_fi
2650: 6c 65 28 22 33 72 64 2f 62 6f 74 74 6c 65 2e 70  le("3rd/bottle.p
2660: 79 22 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65  y", "grammalecte
2670: 2f 62 6f 74 74 6c 65 2e 70 79 22 29 0a 20 20 20  /bottle.py").   
2680: 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63   open("grammalec
2690: 74 65 2f 57 41 52 4e 49 4e 47 2e 74 78 74 22 2c  te/WARNING.txt",
26a0: 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "w", encoding="
26b0: 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d  utf-8", newline=
26c0: 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 57 61 72  "\n").write(sWar
26d0: 6e 69 6e 67 4d 65 73 73 61 67 65 29 0a 0a 20 20  ningMessage)..  
26e0: 20 20 23 23 20 43 52 45 41 54 45 20 47 52 41 4d    ## CREATE GRAM
26f0: 4d 41 52 20 43 48 45 43 4b 45 52 20 50 41 43 4b  MAR CHECKER PACK
2700: 41 47 45 0a 20 20 20 20 73 70 4c 61 6e 67 50 61  AGE.    spLangPa
2710: 63 6b 20 3d 20 22 67 72 61 6d 6d 61 6c 65 63 74  ck = "grammalect
2720: 65 2f 22 2b 73 4c 61 6e 67 0a 20 20 20 20 68 65  e/"+sLang.    he
2730: 6c 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61  lpers.createClea
2740: 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67 50 61  nFolder(spLangPa
2750: 63 6b 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69  ck).    for sf i
2760: 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63  n os.listdir("gc
2770: 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e 67 5f 63 6f  _core/py/lang_co
2780: 72 65 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  re"):.        if
2790: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
27a0: 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6c  ir("gc_core/py/l
27b0: 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 29 3a 0a  ang_core/"+sf):.
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
27d0: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
27e0: 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72 65  emplate("gc_core
27f0: 2f 70 79 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b  /py/lang_core/"+
2800: 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22  sf, spLangPack+"
2810: 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20  /"+sf, dVars).  
2820: 20 20 70 72 69 6e 74 28 22 2b 20 4d 6f 64 75 6c    print("+ Modul
2830: 65 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20  es: ", end=""). 
2840: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
2850: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 22  listdir(spLang+"
2860: 2f 6d 6f 64 75 6c 65 73 22 29 3a 0a 20 20 20 20  /modules"):.    
2870: 20 20 20 20 69 66 20 6e 6f 74 20 73 66 2e 73 74      if not sf.st
2880: 61 72 74 73 77 69 74 68 28 28 22 67 63 65 5f 22  artswith(("gce_"
2890: 2c 20 22 5f 5f 70 79 63 61 63 68 65 5f 5f 22 29  , "__pycache__")
28a0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ):.            h
28b0: 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69  elpers.copyAndFi
28c0: 6c 65 54 65 6d 70 6c 61 74 65 28 73 70 4c 61 6e  leTemplate(spLan
28d0: 67 2b 22 2f 6d 6f 64 75 6c 65 73 2f 22 2b 73 66  g+"/modules/"+sf
28e0: 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22  , spLangPack+"/"
28f0: 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20  +sf, dVars).    
2900: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 66          print(sf
2910: 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20  , end=", ").    
2920: 70 72 69 6e 74 28 29 0a 0a 20 20 20 20 23 20 54  print()..    # T
2930: 45 53 54 20 46 49 4c 45 53 0a 20 20 20 20 77 69  EST FILES.    wi
2940: 74 68 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c  th open("grammal
2950: 65 63 74 65 2f 22 2b 73 4c 61 6e 67 2b 22 2f 67  ecte/"+sLang+"/g
2960: 63 5f 74 65 73 74 2e 74 78 74 22 2c 20 22 77 22  c_test.txt", "w"
2970: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
2980: 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22  8", newline="\n"
2990: 29 20 61 73 20 68 44 73 74 50 79 3a 0a 20 20 20  ) as hDstPy:.   
29a0: 20 20 20 20 20 68 44 73 74 50 79 2e 77 72 69 74       hDstPy.writ
29b0: 65 28 22 23 20 54 45 53 54 53 20 46 4f 52 20 4c  e("# TESTS FOR L
29c0: 41 4e 47 20 5b 22 20 2b 20 73 4c 61 6e 67 20 2b  ANG [" + sLang +
29d0: 20 22 5d 5c 6e 5c 6e 22 29 0a 20 20 20 20 20 20   "]\n\n").      
29e0: 20 20 68 44 73 74 50 79 2e 77 72 69 74 65 28 64    hDstPy.write(d
29f0: 56 61 72 73 5b 27 67 63 74 65 73 74 73 27 5d 29  Vars['gctests'])
2a00: 0a 20 20 20 20 20 20 20 20 68 44 73 74 50 79 2e  .        hDstPy.
2a10: 77 72 69 74 65 28 22 5c 6e 22 29 0a 0a 20 20 20  write("\n")..   
2a20: 20 63 72 65 61 74 65 4f 58 54 28 73 70 4c 61 6e   createOXT(spLan
2a30: 67 2c 20 64 56 61 72 73 2c 20 78 43 6f 6e 66 69  g, dVars, xConfi
2a40: 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 6f 78 74  g._sections['oxt
2a50: 27 5d 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20  '], spLangPack, 
2a60: 62 49 6e 73 74 61 6c 6c 4f 58 54 29 0a 0a 20 20  bInstallOXT)..  
2a70: 20 20 63 72 65 61 74 65 50 61 63 6b 61 67 65 5a    createPackageZ
2a80: 69 70 28 64 56 61 72 73 2c 20 73 70 4c 61 6e 67  ip(dVars, spLang
2a90: 50 61 63 6b 29 0a 0a 20 20 20 20 23 23 23 23 20  Pack)..    #### 
2aa0: 4a 41 56 41 53 43 52 49 50 54 0a 20 20 20 20 69  JAVASCRIPT.    i
2ab0: 66 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a 20  f bJavaScript:. 
2ac0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 4a 41         print("JA
2ad0: 56 41 53 43 52 49 50 54 3a 22 29 0a 20 20 20 20  VASCRIPT:").    
2ae0: 20 20 20 20 70 72 69 6e 74 28 22 2b 20 50 6c 75      print("+ Plu
2af0: 67 69 6e 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29  gins: ", end="")
2b00: 0a 20 20 20 20 20 20 20 20 73 43 6f 64 65 50 6c  .        sCodePl
2b10: 75 67 69 6e 73 20 3d 20 22 22 0a 20 20 20 20 20  ugins = "".     
2b20: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
2b30: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 22  listdir(spLang+"
2b40: 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22 29 3a 0a 20  /modules-js"):. 
2b50: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 72 65             if re
2b60: 2e 6d 61 74 63 68 28 72 22 67 63 65 5f 5c 77 2b  .match(r"gce_\w+
2b70: 5b 2e 5d 6a 73 24 22 2c 20 73 66 29 3a 0a 20 20  [.]js$", sf):.  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43                sC
2b90: 6f 64 65 50 6c 75 67 69 6e 73 20 2b 3d 20 22 5c  odePlugins += "\
2ba0: 6e 5c 6e 22 20 2b 20 6f 70 65 6e 28 73 70 4c 61  n\n" + open(spLa
2bb0: 6e 67 2b 27 2f 6d 6f 64 75 6c 65 73 2d 6a 73 2f  ng+'/modules-js/
2bc0: 27 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63 6f 64  '+sf, "r", encod
2bd0: 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72 65 61  ing="utf-8").rea
2be0: 64 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  d().            
2bf0: 20 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e      print(sf, en
2c00: 64 3d 22 2c 20 22 29 0a 20 20 20 20 20 20 20 20  d=", ").        
2c10: 70 72 69 6e 74 28 29 0a 20 20 20 20 20 20 20 20  print().        
2c20: 64 56 61 72 73 5b 22 70 6c 75 67 69 6e 73 4a 53  dVars["pluginsJS
2c30: 22 5d 20 3d 20 73 43 6f 64 65 50 6c 75 67 69 6e  "] = sCodePlugin
2c40: 73 0a 0a 20 20 20 20 20 20 20 20 23 20 6f 70 74  s..        # opt
2c50: 69 6f 6e 73 20 64 61 74 61 20 73 74 72 75 63 74  ions data struct
2c60: 0a 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 22  .        dVars["
2c70: 64 4f 70 74 4a 61 76 61 53 63 72 69 70 74 22 5d  dOptJavaScript"]
2c80: 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 69   = json.dumps(li
2c90: 73 74 28 64 56 61 72 73 5b 22 64 4f 70 74 4a 61  st(dVars["dOptJa
2ca0: 76 61 53 63 72 69 70 74 22 5d 2e 69 74 65 6d 73  vaScript"].items
2cb0: 28 29 29 29 0a 20 20 20 20 20 20 20 20 64 56 61  ())).        dVa
2cc0: 72 73 5b 22 64 4f 70 74 46 69 72 65 66 6f 78 22  rs["dOptFirefox"
2cd0: 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c  ] = json.dumps(l
2ce0: 69 73 74 28 64 56 61 72 73 5b 22 64 4f 70 74 46  ist(dVars["dOptF
2cf0: 69 72 65 66 6f 78 22 5d 2e 69 74 65 6d 73 28 29  irefox"].items()
2d00: 29 29 0a 20 20 20 20 20 20 20 20 64 56 61 72 73  )).        dVars
2d10: 5b 22 64 4f 70 74 54 68 75 6e 64 65 72 62 69 72  ["dOptThunderbir
2d20: 64 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73  d"] = json.dumps
2d30: 28 6c 69 73 74 28 64 56 61 72 73 5b 22 64 4f 70  (list(dVars["dOp
2d40: 74 54 68 75 6e 64 65 72 62 69 72 64 22 5d 2e 69  tThunderbird"].i
2d50: 74 65 6d 73 28 29 29 29 0a 0a 20 20 20 20 20 20  tems()))..      
2d60: 20 20 23 20 63 72 65 61 74 65 20 66 6f 6c 64 65    # create folde
2d70: 72 0a 20 20 20 20 20 20 20 20 73 70 4c 61 6e 67  r.        spLang
2d80: 50 61 63 6b 20 3d 20 22 67 72 61 6d 6d 61 6c 65  Pack = "grammale
2d90: 63 74 65 2d 6a 73 2f 22 2b 73 4c 61 6e 67 0a 20  cte-js/"+sLang. 
2da0: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63         helpers.c
2db0: 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72  reateCleanFolder
2dc0: 28 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a 20 20  (spLangPack)..  
2dd0: 20 20 20 20 20 20 23 20 63 72 65 61 74 65 20 66        # create f
2de0: 69 6c 65 73 0a 20 20 20 20 20 20 20 20 66 6f 72  iles.        for
2df0: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
2e00: 72 28 22 6a 73 5f 65 78 74 65 6e 73 69 6f 6e 22  r("js_extension"
2e10: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ):.            d
2e20: 56 61 72 73 5b 73 66 5b 3a 2d 33 5d 5d 20 3d 20  Vars[sf[:-3]] = 
2e30: 6f 70 65 6e 28 22 6a 73 5f 65 78 74 65 6e 73 69  open("js_extensi
2e40: 6f 6e 2f 22 2b 73 66 2c 20 22 72 22 2c 20 65 6e  on/"+sf, "r", en
2e50: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e  coding="utf-8").
2e60: 72 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 66  read().        f
2e70: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
2e80: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 22  dir("gc_core/js"
2e90: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
2ea0: 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73  f not os.path.is
2eb0: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f  dir("gc_core/js/
2ec0: 22 2b 73 66 29 20 61 6e 64 20 6e 6f 74 20 73 66  "+sf) and not sf
2ed0: 2e 73 74 61 72 74 73 77 69 74 68 28 22 6a 73 65  .startswith("jse
2ee0: 78 5f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  x_"):.          
2ef0: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f        helpers.co
2f00: 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74  pyAndFileTemplat
2f10: 65 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 22 2b  e("gc_core/js/"+
2f20: 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65  sf, "grammalecte
2f30: 2d 6a 73 2f 22 2b 73 66 2c 20 64 56 61 72 73 29  -js/"+sf, dVars)
2f40: 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 28 22 67  .        open("g
2f50: 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 57 41  rammalecte-js/WA
2f60: 52 4e 49 4e 47 2e 74 78 74 22 2c 20 22 77 22 2c  RNING.txt", "w",
2f70: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
2f80: 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29  ", newline="\n")
2f90: 2e 77 72 69 74 65 28 73 57 61 72 6e 69 6e 67 4d  .write(sWarningM
2fa0: 65 73 73 61 67 65 29 0a 20 20 20 20 20 20 20 20  essage).        
2fb0: 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73  for sf in os.lis
2fc0: 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73  tdir("gc_core/js
2fd0: 2f 6c 61 6e 67 5f 63 6f 72 65 22 29 3a 0a 20 20  /lang_core"):.  
2fe0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
2ff0: 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22   os.path.isdir("
3000: 67 63 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e 67 5f  gc_core/js/lang_
3010: 63 6f 72 65 2f 22 2b 73 66 29 20 61 6e 64 20 73  core/"+sf) and s
3020: 66 2e 73 74 61 72 74 73 77 69 74 68 28 22 67 63  f.startswith("gc
3030: 5f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  _"):.           
3040: 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70       helpers.cop
3050: 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65  yAndFileTemplate
3060: 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e  ("gc_core/js/lan
3070: 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73 70 4c  g_core/"+sf, spL
3080: 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20  angPack+"/"+sf, 
3090: 64 56 61 72 73 29 0a 20 20 20 20 20 20 20 20 70  dVars).        p
30a0: 72 69 6e 74 28 22 2b 20 4d 6f 64 75 6c 65 73 3a  rint("+ Modules:
30b0: 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20   ", end="").    
30c0: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
30d0: 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b  .listdir(spLang+
30e0: 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22 29 3a 0a  "/modules-js"):.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
3100: 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69 74 68  ot sf.startswith
3110: 28 22 67 63 65 5f 22 29 3a 0a 20 20 20 20 20 20  ("gce_"):.      
3120: 20 20 20 20 20 20 20 20 20 20 68 65 6c 70 65 72            helper
3130: 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d  s.copyAndFileTem
3140: 70 6c 61 74 65 28 73 70 4c 61 6e 67 2b 22 2f 6d  plate(spLang+"/m
3150: 6f 64 75 6c 65 73 2d 6a 73 2f 22 2b 73 66 2c 20  odules-js/"+sf, 
3160: 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73  spLangPack+"/"+s
3170: 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20 20 20  f, dVars).      
3180: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
3190: 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20  sf, end=", ").  
31a0: 20 20 20 20 20 20 70 72 69 6e 74 28 29 0a 0a 20        print().. 
31b0: 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20         try:.    
31c0: 20 20 20 20 20 20 20 20 62 75 69 6c 64 6a 73 20          buildjs 
31d0: 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d 70 6f  = importlib.impo
31e0: 72 74 5f 6d 6f 64 75 6c 65 28 22 67 63 5f 6c 61  rt_module("gc_la
31f0: 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22 2e 62 75 69  ng."+sLang+".bui
3200: 6c 64 22 29 0a 20 20 20 20 20 20 20 20 65 78 63  ld").        exc
3210: 65 70 74 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a  ept ImportError:
3220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
3230: 6e 74 28 22 23 20 4e 6f 20 63 6f 6d 70 6c 65 6d  nt("# No complem
3240: 65 6e 74 61 72 79 20 62 75 69 6c 64 65 72 20 3c  entary builder <
3250: 62 75 69 6c 64 2e 70 79 3e 20 69 6e 20 66 6f 6c  build.py> in fol
3260: 64 65 72 20 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c  der gc_lang/"+sL
3270: 61 6e 67 29 0a 20 20 20 20 20 20 20 20 65 6c 73  ang).        els
3280: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  e:.            b
3290: 75 69 6c 64 6a 73 2e 62 75 69 6c 64 28 73 4c 61  uildjs.build(sLa
32a0: 6e 67 2c 20 64 56 61 72 73 2c 20 73 70 4c 61 6e  ng, dVars, spLan
32b0: 67 50 61 63 6b 29 0a 0a 20 20 20 20 72 65 74 75  gPack)..    retu
32c0: 72 6e 20 64 56 61 72 73 5b 27 76 65 72 73 69 6f  rn dVars['versio
32d0: 6e 27 5d 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72  n']...def copyGr
32e0: 61 70 68 73 70 65 6c 6c 43 6f 72 65 20 28 62 4a  aphspellCore (bJ
32f0: 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73 65 29  avaScript=False)
3300: 3a 0a 20 20 20 20 22 63 6f 70 79 20 47 72 61 70  :.    "copy Grap
3310: 68 73 70 65 6c 6c 20 70 61 63 6b 61 67 65 20 69  hspell package i
3320: 6e 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 70 61  n Grammalecte pa
3330: 63 6b 61 67 65 22 0a 20 20 20 20 68 65 6c 70 65  ckage".    helpe
3340: 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e 46 6f  rs.createCleanFo
3350: 6c 64 65 72 28 22 67 72 61 6d 6d 61 6c 65 63 74  lder("grammalect
3360: 65 2f 67 72 61 70 68 73 70 65 6c 6c 22 29 0a 20  e/graphspell"). 
3370: 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61     dir_util.mkpa
3380: 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  th("grammalecte/
3390: 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74  graphspell/_dict
33a0: 69 6f 6e 61 72 69 65 73 22 29 0a 20 20 20 20 66  ionaries").    f
33b0: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
33c0: 64 69 72 28 22 67 72 61 70 68 73 70 65 6c 6c 22  dir("graphspell"
33d0: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
33e0: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
33f0: 22 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66  "graphspell/"+sf
3400: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ):.            f
3410: 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66 69  ile_util.copy_fi
3420: 6c 65 28 22 67 72 61 70 68 73 70 65 6c 6c 2f 22  le("graphspell/"
3430: 2b 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74  +sf, "grammalect
3440: 65 2f 67 72 61 70 68 73 70 65 6c 6c 22 29 0a 20  e/graphspell"). 
3450: 20 20 20 69 66 20 62 4a 61 76 61 53 63 72 69 70     if bJavaScrip
3460: 74 3a 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65  t:.        helpe
3470: 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e 46 6f  rs.createCleanFo
3480: 6c 64 65 72 28 22 67 72 61 6d 6d 61 6c 65 63 74  lder("grammalect
3490: 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 22  e-js/graphspell"
34a0: 29 0a 20 20 20 20 20 20 20 20 64 69 72 5f 75 74  ).        dir_ut
34b0: 69 6c 2e 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d  il.mkpath("gramm
34c0: 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73  alecte-js/graphs
34d0: 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69  pell/_dictionari
34e0: 65 73 22 29 0a 20 20 20 20 20 20 20 20 64 56 61  es").        dVa
34f0: 72 73 20 3d 20 7b 7d 0a 20 20 20 20 20 20 20 20  rs = {}.        
3500: 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73  for sf in os.lis
3510: 74 64 69 72 28 22 6a 73 5f 65 78 74 65 6e 73 69  tdir("js_extensi
3520: 6f 6e 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  on"):.          
3530: 20 20 64 56 61 72 73 5b 73 66 5b 3a 2d 33 5d 5d    dVars[sf[:-3]]
3540: 20 3d 20 6f 70 65 6e 28 22 6a 73 5f 65 78 74 65   = open("js_exte
3550: 6e 73 69 6f 6e 2f 22 2b 73 66 2c 20 22 72 22 2c  nsion/"+sf, "r",
3560: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
3570: 22 29 2e 72 65 61 64 28 29 0a 20 20 20 20 20 20  ").read().      
3580: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
3590: 69 73 74 64 69 72 28 22 67 72 61 70 68 73 70 65  istdir("graphspe
35a0: 6c 6c 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20  ll-js"):.       
35b0: 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70       if not os.p
35c0: 61 74 68 2e 69 73 64 69 72 28 22 67 72 61 70 68  ath.isdir("graph
35d0: 73 70 65 6c 6c 2d 6a 73 2f 22 2b 73 66 29 3a 0a  spell-js/"+sf):.
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66  file_util.copy_f
3600: 69 6c 65 28 22 67 72 61 70 68 73 70 65 6c 6c 2d  ile("graphspell-
3610: 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61 6d 6d 61  js/"+sf, "gramma
3620: 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70  lecte-js/graphsp
3630: 65 6c 6c 22 29 0a 20 20 20 20 20 20 20 20 20 20  ell").          
3640: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f        helpers.co
3650: 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74  pyAndFileTemplat
3660: 65 28 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73  e("graphspell-js
3670: 2f 22 2b 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65  /"+sf, "grammale
3680: 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c  cte-js/graphspel
3690: 6c 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 0a  l/"+sf, dVars)..
36a0: 0a 64 65 66 20 63 6f 70 79 47 72 61 70 68 73 70  .def copyGraphsp
36b0: 65 6c 6c 44 69 63 74 69 6f 6e 61 72 69 65 73 20  ellDictionaries 
36c0: 28 64 56 61 72 73 2c 20 62 4a 61 76 61 53 63 72  (dVars, bJavaScr
36d0: 69 70 74 3d 46 61 6c 73 65 2c 20 62 43 6f 6d 6d  ipt=False, bComm
36e0: 75 6e 69 74 79 44 69 63 74 3d 46 61 6c 73 65 2c  unityDict=False,
36f0: 20 62 50 65 72 73 6f 6e 61 6c 44 69 63 74 3d 46   bPersonalDict=F
3700: 61 6c 73 65 29 3a 0a 20 20 20 20 22 63 6f 70 79  alse):.    "copy
3710: 20 72 65 71 75 65 73 74 65 64 20 47 72 61 70 68   requested Graph
3720: 73 70 65 6c 6c 20 64 69 63 74 69 6f 6e 61 72 69  spell dictionari
3730: 65 73 20 69 6e 20 47 72 61 6d 6d 61 6c 65 63 74  es in Grammalect
3740: 65 20 70 61 63 6b 61 67 65 22 0a 20 20 20 20 64  e package".    d
3750: 56 61 72 73 5b 22 64 69 63 5f 6d 61 69 6e 5f 66  Vars["dic_main_f
3760: 69 6c 65 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22  ilename_py"] = "
3770: 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63  ".    dVars["dic
3780: 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a  _main_filename_j
3790: 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61  s"] = "".    dVa
37a0: 72 73 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e 69 74  rs["dic_communit
37b0: 79 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 22 5d 20  y_filename_py"] 
37c0: 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22  = "".    dVars["
37d0: 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 66 69  dic_community_fi
37e0: 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20 22 22  lename_js"] = ""
37f0: 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f  .    dVars["dic_
3800: 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d  personal_filenam
3810: 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20 20 20  e_py"] = "".    
3820: 64 56 61 72 73 5b 22 64 69 63 5f 70 65 72 73 6f  dVars["dic_perso
3830: 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 22  nal_filename_js"
3840: 5d 20 3d 20 22 22 0a 20 20 20 20 6c 44 69 63 74  ] = "".    lDict
3850: 20 3d 20 5b 20 28 22 6d 61 69 6e 22 2c 20 73 29   = [ ("main", s)
3860: 20 20 66 6f 72 20 73 20 69 6e 20 64 56 61 72 73    for s in dVars
3870: 5b 27 64 69 63 5f 66 69 6c 65 6e 61 6d 65 73 27  ['dic_filenames'
3880: 5d 2e 73 70 6c 69 74 28 22 2c 22 29 20 5d 0a 20  ].split(",") ]. 
3890: 20 20 20 69 66 20 62 43 6f 6d 6d 75 6e 69 74 79     if bCommunity
38a0: 44 69 63 74 3a 0a 20 20 20 20 20 20 20 20 6c 44  Dict:.        lD
38b0: 69 63 74 2e 61 70 70 65 6e 64 28 28 22 63 6f 6d  ict.append(("com
38c0: 6d 75 6e 69 74 79 22 2c 20 64 56 61 72 73 5b 27  munity", dVars['
38d0: 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 66 69  dic_community_fi
38e0: 6c 65 6e 61 6d 65 27 5d 29 29 0a 20 20 20 20 69  lename'])).    i
38f0: 66 20 62 50 65 72 73 6f 6e 61 6c 44 69 63 74 3a  f bPersonalDict:
3900: 0a 20 20 20 20 20 20 20 20 6c 44 69 63 74 2e 61  .        lDict.a
3910: 70 70 65 6e 64 28 28 22 70 65 72 73 6f 6e 61 6c  ppend(("personal
3920: 22 2c 20 64 56 61 72 73 5b 27 64 69 63 5f 70 65  ", dVars['dic_pe
3930: 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 27  rsonal_filename'
3940: 5d 29 29 0a 20 20 20 20 66 6f 72 20 73 54 79 70  ])).    for sTyp
3950: 65 2c 20 73 46 69 6c 65 4e 61 6d 65 20 69 6e 20  e, sFileName in 
3960: 6c 44 69 63 74 3a 0a 20 20 20 20 20 20 20 20 73  lDict:.        s
3970: 70 66 50 79 44 69 63 20 3d 20 22 67 72 61 70 68  pfPyDic = "graph
3980: 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72  spell/_dictionar
3990: 69 65 73 2f 22 20 2b 20 73 46 69 6c 65 4e 61 6d  ies/" + sFileNam
39a0: 65 20 2b 20 22 2e 62 64 69 63 22 0a 20 20 20 20  e + ".bdic".    
39b0: 20 20 20 20 73 70 66 4a 53 44 69 63 20 3d 20 22      spfJSDic = "
39c0: 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f 5f 64  graphspell-js/_d
39d0: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 20 2b 20  ictionaries/" + 
39e0: 73 46 69 6c 65 4e 61 6d 65 20 2b 20 22 2e 6a 73  sFileName + ".js
39f0: 6f 6e 22 0a 20 20 20 20 20 20 20 20 69 66 20 6e  on".        if n
3a00: 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 66 69 6c  ot os.path.isfil
3a10: 65 28 73 70 66 50 79 44 69 63 29 20 6f 72 20 28  e(spfPyDic) or (
3a20: 62 4a 61 76 61 53 63 72 69 70 74 20 61 6e 64 20  bJavaScript and 
3a30: 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 66 69  not os.path.isfi
3a40: 6c 65 28 73 70 66 4a 53 44 69 63 29 29 3a 0a 20  le(spfJSDic)):. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
3a60: 44 69 63 74 69 6f 6e 61 72 79 28 64 56 61 72 73  Dictionary(dVars
3a70: 2c 20 73 54 79 70 65 2c 20 62 4a 61 76 61 53 63  , sType, bJavaSc
3a80: 72 69 70 74 29 0a 20 20 20 20 20 20 20 20 70 72  ript).        pr
3a90: 69 6e 74 28 73 70 66 50 79 44 69 63 29 0a 20 20  int(spfPyDic).  
3aa0: 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69 6c 2e        file_util.
3ab0: 63 6f 70 79 5f 66 69 6c 65 28 73 70 66 50 79 44  copy_file(spfPyD
3ac0: 69 63 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65  ic, "grammalecte
3ad0: 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63  /graphspell/_dic
3ae0: 74 69 6f 6e 61 72 69 65 73 22 29 0a 20 20 20 20  tionaries").    
3af0: 20 20 20 20 64 56 61 72 73 5b 27 64 69 63 5f 27      dVars['dic_'
3b00: 2b 73 54 79 70 65 2b 27 5f 66 69 6c 65 6e 61 6d  +sType+'_filenam
3b10: 65 5f 70 79 27 5d 20 3d 20 73 46 69 6c 65 4e 61  e_py'] = sFileNa
3b20: 6d 65 20 2b 20 27 2e 62 64 69 63 27 0a 20 20 20  me + '.bdic'.   
3b30: 20 20 20 20 20 69 66 20 62 4a 61 76 61 53 63 72       if bJavaScr
3b40: 69 70 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ipt:.           
3b50: 20 70 72 69 6e 74 28 73 70 66 4a 53 44 69 63 29   print(spfJSDic)
3b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
3b70: 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65  e_util.copy_file
3b80: 28 73 70 66 4a 53 44 69 63 2c 20 22 67 72 61 6d  (spfJSDic, "gram
3b90: 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68  malecte-js/graph
3ba0: 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72  spell/_dictionar
3bb0: 69 65 73 22 29 0a 20 20 20 20 20 20 20 20 20 20  ies").          
3bc0: 20 20 64 56 61 72 73 5b 27 64 69 63 5f 27 2b 73    dVars['dic_'+s
3bd0: 54 79 70 65 2b 27 5f 66 69 6c 65 6e 61 6d 65 5f  Type+'_filename_
3be0: 6a 73 27 5d 20 3d 20 73 46 69 6c 65 4e 61 6d 65  js'] = sFileName
3bf0: 20 2b 20 27 2e 6a 73 6f 6e 27 0a 20 20 20 20 64   + '.json'.    d
3c00: 56 61 72 73 5b 27 64 69 63 5f 6d 61 69 6e 5f 66  Vars['dic_main_f
3c10: 69 6c 65 6e 61 6d 65 5f 70 79 27 5d 20 3d 20 64  ilename_py'] = d
3c20: 56 61 72 73 5b 27 64 69 63 5f 64 65 66 61 75 6c  Vars['dic_defaul
3c30: 74 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 27 5d 20  t_filename_py'] 
3c40: 2b 20 22 2e 62 64 69 63 22 0a 20 20 20 20 64 56  + ".bdic".    dV
3c50: 61 72 73 5b 27 64 69 63 5f 6d 61 69 6e 5f 66 69  ars['dic_main_fi
3c60: 6c 65 6e 61 6d 65 5f 6a 73 27 5d 20 3d 20 64 56  lename_js'] = dV
3c70: 61 72 73 5b 27 64 69 63 5f 64 65 66 61 75 6c 74  ars['dic_default
3c80: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d 20 2b  _filename_js'] +
3c90: 20 22 2e 6a 73 6f 6e 22 0a 0a 0a 64 65 66 20 62   ".json"...def b
3ca0: 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 20 28  uildDictionary (
3cb0: 64 56 61 72 73 2c 20 73 54 79 70 65 2c 20 62 4a  dVars, sType, bJ
3cc0: 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73 65 29  avaScript=False)
3cd0: 3a 0a 20 20 20 20 22 62 75 69 6c 64 20 62 69 6e  :.    "build bin
3ce0: 61 72 79 20 64 69 63 74 69 6f 6e 61 72 79 20 66  ary dictionary f
3cf0: 6f 72 20 47 72 61 70 68 73 70 65 6c 6c 20 66 72  or Graphspell fr
3d00: 6f 6d 20 6c 65 78 69 63 6f 6e 73 22 0a 20 20 20  om lexicons".   
3d10: 20 69 66 20 73 54 79 70 65 20 3d 3d 20 22 6d 61   if sType == "ma
3d20: 69 6e 22 3a 0a 20 20 20 20 20 20 20 20 73 70 66  in":.        spf
3d30: 4c 65 78 53 72 63 20 3d 20 64 56 61 72 73 5b 27  LexSrc = dVars['
3d40: 6c 65 78 69 63 6f 6e 5f 73 72 63 27 5d 0a 20 20  lexicon_src'].  
3d50: 20 20 20 20 20 20 6c 53 66 44 69 63 74 44 73 74        lSfDictDst
3d60: 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69   = dVars['dic_fi
3d70: 6c 65 6e 61 6d 65 73 27 5d 2e 73 70 6c 69 74 28  lenames'].split(
3d80: 22 2c 22 29 0a 20 20 20 20 20 20 20 20 6c 44 69  ",").        lDi
3d90: 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64  cName = dVars['d
3da0: 69 63 5f 6e 61 6d 65 27 5d 2e 73 70 6c 69 74 28  ic_name'].split(
3db0: 22 2c 22 29 0a 20 20 20 20 20 20 20 20 6c 44 65  ",").        lDe
3dc0: 73 63 72 69 70 74 69 6f 6e 20 3d 20 64 56 61 72  scription = dVar
3dd0: 73 5b 27 64 69 63 5f 64 65 73 63 72 69 70 74 69  s['dic_descripti
3de0: 6f 6e 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29 0a  on'].split(",").
3df0: 20 20 20 20 20 20 20 20 6c 46 69 6c 74 65 72 20          lFilter 
3e00: 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69 6c  = dVars['dic_fil
3e10: 74 65 72 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29  ter'].split(",")
3e20: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 44  .        for sfD
3e30: 69 63 74 44 73 74 2c 20 73 44 69 63 4e 61 6d 65  ictDst, sDicName
3e40: 2c 20 73 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  , sDescription, 
3e50: 73 46 69 6c 74 65 72 20 69 6e 20 7a 69 70 28 6c  sFilter in zip(l
3e60: 53 66 44 69 63 74 44 73 74 2c 20 6c 44 69 63 4e  SfDictDst, lDicN
3e70: 61 6d 65 2c 20 6c 44 65 73 63 72 69 70 74 69 6f  ame, lDescriptio
3e80: 6e 2c 20 6c 46 69 6c 74 65 72 29 3a 0a 20 20 20  n, lFilter):.   
3e90: 20 20 20 20 20 20 20 20 20 6c 65 78 5f 62 75 69           lex_bui
3ea0: 6c 64 2e 62 75 69 6c 64 28 73 70 66 4c 65 78 53  ld.build(spfLexS
3eb0: 72 63 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27  rc, dVars['lang'
3ec0: 5d 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 5f 6e  ], dVars['lang_n
3ed0: 61 6d 65 27 5d 2c 20 73 66 44 69 63 74 44 73 74  ame'], sfDictDst
3ee0: 2c 20 62 4a 61 76 61 53 63 72 69 70 74 2c 20 73  , bJavaScript, s
3ef0: 44 69 63 4e 61 6d 65 2c 20 73 44 65 73 63 72 69  DicName, sDescri
3f00: 70 74 69 6f 6e 2c 20 73 46 69 6c 74 65 72 2c 20  ption, sFilter, 
3f10: 64 56 61 72 73 5b 27 73 74 65 6d 6d 69 6e 67 5f  dVars['stemming_
3f20: 6d 65 74 68 6f 64 27 5d 2c 20 69 6e 74 28 64 56  method'], int(dV
3f30: 61 72 73 5b 27 66 73 61 5f 6d 65 74 68 6f 64 27  ars['fsa_method'
3f40: 5d 29 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20  ])).    else:.  
3f50: 20 20 20 20 20 20 69 66 20 73 54 79 70 65 20 3d        if sType =
3f60: 3d 20 22 63 6f 6d 6d 75 6e 69 74 79 22 3a 0a 20  = "community":. 
3f70: 20 20 20 20 20 20 20 20 20 20 20 73 70 66 4c 65             spfLe
3f80: 78 53 72 63 20 3d 20 64 56 61 72 73 5b 27 6c 65  xSrc = dVars['le
3f90: 78 69 63 6f 6e 5f 63 6f 6d 6d 75 6e 69 74 79 5f  xicon_community_
3fa0: 73 72 63 27 5d 0a 20 20 20 20 20 20 20 20 20 20  src'].          
3fb0: 20 20 73 66 44 69 63 74 44 73 74 20 3d 20 64 56    sfDictDst = dV
3fc0: 61 72 73 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69  ars['dic_communi
3fd0: 74 79 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a 20 20  ty_filename'].  
3fe0: 20 20 20 20 20 20 20 20 20 20 73 44 69 63 4e 61            sDicNa
3ff0: 6d 65 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f  me = dVars['dic_
4000: 63 6f 6d 6d 75 6e 69 74 79 5f 6e 61 6d 65 27 5d  community_name']
4010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 44 65  .            sDe
4020: 73 63 72 69 70 74 69 6f 6e 20 3d 20 64 56 61 72  scription = dVar
4030: 73 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79  s['dic_community
4040: 5f 64 65 73 63 72 69 70 74 69 6f 6e 27 5d 0a 20  _description']. 
4050: 20 20 20 20 20 20 20 65 6c 69 66 20 73 54 79 70         elif sTyp
4060: 65 20 3d 3d 20 22 70 65 72 73 6f 6e 61 6c 22 3a  e == "personal":
4070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70 66  .            spf
4080: 4c 65 78 53 72 63 20 3d 20 64 56 61 72 73 5b 27  LexSrc = dVars['
4090: 6c 65 78 69 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c  lexicon_personal
40a0: 5f 73 72 63 27 5d 0a 20 20 20 20 20 20 20 20 20  _src'].         
40b0: 20 20 20 73 66 44 69 63 74 44 73 74 20 3d 20 64     sfDictDst = d
40c0: 56 61 72 73 5b 27 64 69 63 5f 70 65 72 73 6f 6e  Vars['dic_person
40d0: 61 6c 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a 20 20  al_filename'].  
40e0: 20 20 20 20 20 20 20 20 20 20 73 44 69 63 4e 61            sDicNa
40f0: 6d 65 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f  me = dVars['dic_
4100: 70 65 72 73 6f 6e 61 6c 5f 6e 61 6d 65 27 5d 0a  personal_name'].
4110: 20 20 20 20 20 20 20 20 20 20 20 20 73 44 65 73              sDes
4120: 63 72 69 70 74 69 6f 6e 20 3d 20 64 56 61 72 73  cription = dVars
4130: 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 64  ['dic_personal_d
4140: 65 73 63 72 69 70 74 69 6f 6e 27 5d 0a 20 20 20  escription'].   
4150: 20 20 20 20 20 6c 65 78 5f 62 75 69 6c 64 2e 62       lex_build.b
4160: 75 69 6c 64 28 73 70 66 4c 65 78 53 72 63 2c 20  uild(spfLexSrc, 
4170: 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c 20 64  dVars['lang'], d
4180: 56 61 72 73 5b 27 6c 61 6e 67 5f 6e 61 6d 65 27  Vars['lang_name'
4190: 5d 2c 20 73 66 44 69 63 74 44 73 74 2c 20 62 4a  ], sfDictDst, bJ
41a0: 61 76 61 53 63 72 69 70 74 2c 20 73 44 69 63 4e  avaScript, sDicN
41b0: 61 6d 65 2c 20 73 44 65 73 63 72 69 70 74 69 6f  ame, sDescriptio
41c0: 6e 2c 20 22 22 2c 20 64 56 61 72 73 5b 27 73 74  n, "", dVars['st
41d0: 65 6d 6d 69 6e 67 5f 6d 65 74 68 6f 64 27 5d 2c  emming_method'],
41e0: 20 69 6e 74 28 64 56 61 72 73 5b 27 66 73 61 5f   int(dVars['fsa_
41f0: 6d 65 74 68 6f 64 27 5d 29 29 0a 0a 0a 64 65 66  method']))...def
4200: 20 6d 61 69 6e 20 28 29 3a 0a 20 20 20 20 22 62   main ():.    "b
4210: 75 69 6c 64 20 47 72 61 6d 6d 61 6c 65 63 74 65  uild Grammalecte
4220: 20 77 69 74 68 20 72 65 71 75 65 73 74 65 64 20   with requested 
4230: 6f 70 74 69 6f 6e 73 22 0a 20 20 20 20 70 72 69  options".    pri
4240: 6e 74 28 22 50 79 74 68 6f 6e 3a 20 22 20 2b 20  nt("Python: " + 
4250: 73 79 73 2e 76 65 72 73 69 6f 6e 29 0a 20 20 20  sys.version).   
4260: 20 78 50 61 72 73 65 72 20 3d 20 61 72 67 70 61   xParser = argpa
4270: 72 73 65 2e 41 72 67 75 6d 65 6e 74 50 61 72 73  rse.ArgumentPars
4280: 65 72 28 29 0a 20 20 20 20 78 50 61 72 73 65 72  er().    xParser
4290: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 6c  .add_argument("l
42a0: 61 6e 67 22 2c 20 74 79 70 65 3d 73 74 72 2c 20  ang", type=str, 
42b0: 6e 61 72 67 73 3d 27 2b 27 2c 20 68 65 6c 70 3d  nargs='+', help=
42c0: 22 6c 61 6e 67 20 70 72 6f 6a 65 63 74 20 74 6f  "lang project to
42d0: 20 67 65 6e 65 72 61 74 65 20 28 6e 61 6d 65 20   generate (name 
42e0: 6f 66 20 66 6f 6c 64 65 72 20 69 6e 20 2f 6c 61  of folder in /la
42f0: 6e 67 29 22 29 0a 20 20 20 20 78 50 61 72 73 65  ng)").    xParse
4300: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
4310: 2d 75 63 22 2c 20 22 2d 2d 75 73 65 5f 63 61 63  -uc", "--use_cac
4320: 68 65 22 2c 20 68 65 6c 70 3d 22 75 73 65 20 64  he", help="use d
4330: 61 74 61 20 63 61 63 68 65 20 69 6e 73 74 65 61  ata cache instea
4340: 64 20 6f 66 20 72 65 62 75 69 6c 64 69 6e 67 20  d of rebuilding 
4350: 72 75 6c 65 73 22 2c 20 61 63 74 69 6f 6e 3d 22  rules", action="
4360: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
4370: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
4380: 75 6d 65 6e 74 28 22 2d 62 22 2c 20 22 2d 2d 62  ument("-b", "--b
4390: 75 69 6c 64 5f 64 61 74 61 22 2c 20 68 65 6c 70  uild_data", help
43a0: 3d 22 6c 61 75 6e 63 68 20 62 75 69 6c 64 5f 64  ="launch build_d
43b0: 61 74 61 2e 70 79 20 28 70 61 72 74 20 31 20 61  ata.py (part 1 a
43c0: 6e 64 20 32 29 22 2c 20 61 63 74 69 6f 6e 3d 22  nd 2)", action="
43d0: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
43e0: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
43f0: 75 6d 65 6e 74 28 22 2d 62 62 22 2c 20 22 2d 2d  ument("-bb", "--
4400: 62 75 69 6c 64 5f 64 61 74 61 5f 62 65 66 6f 72  build_data_befor
4410: 65 22 2c 20 68 65 6c 70 3d 22 6c 61 75 6e 63 68  e", help="launch
4420: 20 62 75 69 6c 64 5f 64 61 74 61 2e 70 79 20 28   build_data.py (
4430: 6f 6e 6c 79 20 70 61 72 74 20 31 3a 20 62 65 66  only part 1: bef
4440: 6f 72 65 20 64 69 63 74 69 6f 6e 61 72 79 20 62  ore dictionary b
4450: 75 69 6c 64 69 6e 67 29 22 2c 20 61 63 74 69 6f  uilding)", actio
4460: 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a  n="store_true").
4470: 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f      xParser.add_
4480: 61 72 67 75 6d 65 6e 74 28 22 2d 62 61 22 2c 20  argument("-ba", 
4490: 22 2d 2d 62 75 69 6c 64 5f 64 61 74 61 5f 61 66  "--build_data_af
44a0: 74 65 72 22 2c 20 68 65 6c 70 3d 22 6c 61 75 6e  ter", help="laun
44b0: 63 68 20 62 75 69 6c 64 5f 64 61 74 61 2e 70 79  ch build_data.py
44c0: 20 28 6f 6e 6c 79 20 70 61 72 74 20 32 3a 20 62   (only part 2: b
44d0: 65 66 6f 72 65 20 64 69 63 74 69 6f 6e 61 72 79  efore dictionary
44e0: 20 62 75 69 6c 64 69 6e 67 29 22 2c 20 61 63 74   building)", act
44f0: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4500: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4510: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 64 22 2c  d_argument("-d",
4520: 20 22 2d 2d 64 69 63 74 22 2c 20 68 65 6c 70 3d   "--dict", help=
4530: 22 67 65 6e 65 72 61 74 65 20 46 53 41 20 64 69  "generate FSA di
4540: 63 74 69 6f 6e 61 72 79 22 2c 20 61 63 74 69 6f  ctionary", actio
4550: 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a  n="store_true").
4560: 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f      xParser.add_
4570: 61 72 67 75 6d 65 6e 74 28 22 2d 74 22 2c 20 22  argument("-t", "
4580: 2d 2d 74 65 73 74 73 22 2c 20 68 65 6c 70 3d 22  --tests", help="
4590: 72 75 6e 20 75 6e 69 74 20 74 65 73 74 73 22 2c  run unit tests",
45a0: 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74   action="store_t
45b0: 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65  rue").    xParse
45c0: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
45d0: 2d 70 22 2c 20 22 2d 2d 70 65 72 66 22 2c 20 68  -p", "--perf", h
45e0: 65 6c 70 3d 22 72 75 6e 20 70 65 72 66 6f 72 6d  elp="run perform
45f0: 61 6e 63 65 20 74 65 73 74 73 22 2c 20 61 63 74  ance tests", act
4600: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4610: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4620: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 70 6d 22  d_argument("-pm"
4630: 2c 20 22 2d 2d 70 65 72 66 5f 6d 65 6d 6f 22 2c  , "--perf_memo",
4640: 20 68 65 6c 70 3d 22 72 75 6e 20 70 65 72 66 6f   help="run perfo
4650: 72 6d 61 6e 63 65 20 74 65 73 74 73 20 61 6e 64  rmance tests and
4660: 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   store results i
4670: 6e 20 70 65 72 66 5f 6d 65 6d 6f 2e 74 78 74 22  n perf_memo.txt"
4680: 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f  , action="store_
4690: 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73  true").    xPars
46a0: 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28  er.add_argument(
46b0: 22 2d 6a 73 22 2c 20 22 2d 2d 6a 61 76 61 73 63  "-js", "--javasc
46c0: 72 69 70 74 22 2c 20 68 65 6c 70 3d 22 4a 61 76  ript", help="Jav
46d0: 61 53 63 72 69 70 74 20 62 75 69 6c 64 20 66 6f  aScript build fo
46e0: 72 20 46 69 72 65 66 6f 78 22 2c 20 61 63 74 69  r Firefox", acti
46f0: 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29  on="store_true")
4700: 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64  .    xParser.add
4710: 5f 61 72 67 75 6d 65 6e 74 28 22 2d 61 63 64 22  _argument("-acd"
4720: 2c 20 22 2d 2d 61 64 64 5f 63 6f 6d 6d 75 6e 69  , "--add_communi
4730: 74 79 5f 64 69 63 74 69 6f 6e 61 72 79 22 2c 20  ty_dictionary", 
4740: 68 65 6c 70 3d 22 61 64 64 20 63 6f 6d 6d 75 6e  help="add commun
4750: 69 74 79 20 64 69 63 74 69 6f 6e 61 72 79 20 74  ity dictionary t
4760: 6f 20 74 68 65 20 62 75 69 6c 64 22 2c 20 61 63  o the build", ac
4770: 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65  tion="store_true
4780: 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  ").    xParser.a
4790: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 61 70  dd_argument("-ap
47a0: 64 22 2c 20 22 2d 2d 61 64 64 5f 70 65 72 73 6f  d", "--add_perso
47b0: 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79 22 2c  nal_dictionary",
47c0: 20 68 65 6c 70 3d 22 61 64 64 20 70 65 72 73 6f   help="add perso
47d0: 6e 61 6c 20 64 69 63 74 69 6f 6e 61 72 79 20 74  nal dictionary t
47e0: 6f 20 74 68 65 20 62 75 69 6c 64 22 2c 20 61 63  o the build", ac
47f0: 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65  tion="store_true
4800: 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  ").    xParser.a
4810: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 66 78  dd_argument("-fx
4820: 22 2c 20 22 2d 2d 66 69 72 65 66 6f 78 22 2c 20  ", "--firefox", 
4830: 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20 46 69 72  help="Launch Fir
4840: 65 66 6f 78 20 44 65 76 65 6c 6f 70 70 65 72 20  efox Developper 
4850: 66 6f 72 20 57 65 62 45 78 74 65 6e 73 69 6f 6e  for WebExtension
4860: 20 74 65 73 74 69 6e 67 22 2c 20 61 63 74 69 6f   testing", actio
4870: 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a  n="store_true").
4880: 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f      xParser.add_
4890: 61 72 67 75 6d 65 6e 74 28 22 2d 77 65 22 2c 20  argument("-we", 
48a0: 22 2d 2d 77 65 62 5f 65 78 74 22 2c 20 68 65 6c  "--web_ext", hel
48b0: 70 3d 22 4c 61 75 6e 63 68 20 46 69 72 65 66 6f  p="Launch Firefo
48c0: 78 20 4e 69 67 68 74 6c 79 20 66 6f 72 20 57 65  x Nightly for We
48d0: 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73 74 69  bExtension testi
48e0: 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  ng", action="sto
48f0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
4900: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
4910: 6e 74 28 22 2d 6c 22 2c 20 22 2d 2d 6c 69 6e 74  nt("-l", "--lint
4920: 5f 77 65 62 5f 65 78 74 22 2c 20 68 65 6c 70 3d  _web_ext", help=
4930: 22 77 65 62 2d 65 78 74 20 6c 69 6e 74 20 6f 6e  "web-ext lint on
4940: 20 74 68 65 20 57 65 62 45 78 74 65 6e 73 69 6f   the WebExtensio
4950: 6e 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  n", action="stor
4960: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
4970: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
4980: 74 28 22 2d 74 62 22 2c 20 22 2d 2d 74 68 75 6e  t("-tb", "--thun
4990: 64 65 72 62 69 72 64 22 2c 20 68 65 6c 70 3d 22  derbird", help="
49a0: 4c 61 75 6e 63 68 20 54 68 75 6e 64 65 72 62 69  Launch Thunderbi
49b0: 72 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  rd", action="sto
49c0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
49d0: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
49e0: 6e 74 28 22 2d 74 62 62 22 2c 20 22 2d 2d 74 68  nt("-tbb", "--th
49f0: 75 6e 64 65 72 62 69 72 64 5f 62 65 74 61 22 2c  underbird_beta",
4a00: 20 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20 54 68   help="Launch Th
4a10: 75 6e 64 65 72 62 69 72 64 20 42 65 74 61 22 2c  underbird Beta",
4a20: 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74   action="store_t
4a30: 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65  rue").    xParse
4a40: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
4a50: 2d 69 22 2c 20 22 2d 2d 69 6e 73 74 61 6c 6c 22  -i", "--install"
4a60: 2c 20 68 65 6c 70 3d 22 69 6e 73 74 61 6c 6c 20  , help="install 
4a70: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 6e  the extension in
4a80: 20 57 72 69 74 65 72 20 28 70 61 74 68 20 6f 66   Writer (path of
4a90: 20 75 6e 6f 70 6b 67 20 6d 75 73 74 20 62 65 20   unopkg must be 
4aa0: 73 65 74 20 69 6e 20 63 6f 6e 66 69 67 2e 69 6e  set in config.in
4ab0: 69 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  i)", action="sto
4ac0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 41  re_true").    xA
4ad0: 72 67 73 20 3d 20 78 50 61 72 73 65 72 2e 70 61  rgs = xParser.pa
4ae0: 72 73 65 5f 61 72 67 73 28 29 0a 0a 20 20 20 20  rse_args()..    
4af0: 69 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64  if xArgs.build_d
4b00: 61 74 61 3a 0a 20 20 20 20 20 20 20 20 78 41 72  ata:.        xAr
4b10: 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 62 65  gs.build_data_be
4b20: 66 6f 72 65 20 3d 20 54 72 75 65 0a 20 20 20 20  fore = True.    
4b30: 20 20 20 20 78 41 72 67 73 2e 62 75 69 6c 64 5f      xArgs.build_
4b40: 64 61 74 61 5f 61 66 74 65 72 20 3d 20 54 72 75  data_after = Tru
4b50: 65 0a 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e  e..    dir_util.
4b60: 6d 6b 70 61 74 68 28 22 5f 62 75 69 6c 64 22 29  mkpath("_build")
4b70: 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b  .    dir_util.mk
4b80: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
4b90: 65 22 29 0a 20 20 20 20 69 66 20 78 41 72 67 73  e").    if xArgs
4ba0: 2e 6a 61 76 61 73 63 72 69 70 74 3a 0a 20 20 20  .javascript:.   
4bb0: 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b       dir_util.mk
4bc0: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
4bd0: 65 2d 6a 73 22 29 0a 0a 20 20 20 20 63 6f 70 79  e-js")..    copy
4be0: 47 72 61 70 68 73 70 65 6c 6c 43 6f 72 65 28 78  GraphspellCore(x
4bf0: 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29  Args.javascript)
4c00: 0a 0a 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 20  ..    for sLang 
4c10: 69 6e 20 78 41 72 67 73 2e 6c 61 6e 67 3a 0a 20  in xArgs.lang:. 
4c20: 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61 74         if os.pat
4c30: 68 2e 65 78 69 73 74 73 28 22 67 63 5f 6c 61 6e  h.exists("gc_lan
4c40: 67 2f 22 2b 73 4c 61 6e 67 29 20 61 6e 64 20 6f  g/"+sLang) and o
4c50: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63  s.path.isdir("gc
4c60: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 3a 0a  _lang/"+sLang):.
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 78 43 6f 6e              xCon
4c80: 66 69 67 20 3d 20 67 65 74 43 6f 6e 66 69 67 28  fig = getConfig(
4c90: 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 20  sLang).         
4ca0: 20 20 20 64 56 61 72 73 20 3d 20 78 43 6f 6e 66     dVars = xConf
4cb0: 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 61 72  ig._sections['ar
4cc0: 67 73 27 5d 0a 0a 20 20 20 20 20 20 20 20 20 20  gs']..          
4cd0: 20 20 69 66 20 6e 6f 74 20 64 56 61 72 73 5b 22    if not dVars["
4ce0: 6c 65 78 69 63 6f 6e 5f 63 6f 6d 6d 75 6e 69 74  lexicon_communit
4cf0: 79 5f 73 72 63 22 5d 3a 0a 20 20 20 20 20 20 20  y_src"]:.       
4d00: 20 20 20 20 20 20 20 20 20 78 41 72 67 73 2e 61           xArgs.a
4d10: 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63  dd_community_dic
4d20: 74 69 6f 6e 61 72 79 20 3d 20 46 61 6c 73 65 0a  tionary = False.
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
4d40: 6f 74 20 64 56 61 72 73 5b 22 6c 65 78 69 63 6f  ot dVars["lexico
4d50: 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63 22 5d  n_personal_src"]
4d60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4d70: 20 20 78 41 72 67 73 2e 61 64 64 5f 70 65 72 73    xArgs.add_pers
4d80: 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79 20  onal_dictionary 
4d90: 3d 20 46 61 6c 73 65 0a 0a 20 20 20 20 20 20 20  = False..       
4da0: 20 20 20 20 20 23 20 62 75 69 6c 64 20 64 61 74       # build dat
4db0: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 61  a.            da
4dc0: 74 61 62 75 69 6c 64 20 3d 20 4e 6f 6e 65 0a 20  tabuild = None. 
4dd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
4de0: 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 62  rgs.build_data_b
4df0: 65 66 6f 72 65 20 6f 72 20 78 41 72 67 73 2e 62  efore or xArgs.b
4e00: 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 3a  uild_data_after:
4e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4e20: 20 23 20 6c 61 6e 67 20 64 61 74 61 0a 20 20 20   # lang data.   
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
4e40: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4e50: 20 20 20 20 20 20 64 61 74 61 62 75 69 6c 64 20        databuild 
4e60: 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d 70 6f  = importlib.impo
4e70: 72 74 5f 6d 6f 64 75 6c 65 28 22 67 63 5f 6c 61  rt_module("gc_la
4e80: 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22 2e 62 75 69  ng."+sLang+".bui
4e90: 6c 64 5f 64 61 74 61 22 29 0a 20 20 20 20 20 20  ld_data").      
4ea0: 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70 74            except
4eb0: 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20   ImportError:.  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72    print("# Error
4ee0: 2e 20 43 6f 75 6c 64 6e e2 80 99 74 20 69 6d 70  . Couldn...t imp
4ef0: 6f 72 74 20 66 69 6c 65 20 62 75 69 6c 64 5f 64  ort file build_d
4f00: 61 74 61 2e 70 79 20 69 6e 20 66 6f 6c 64 65 72  ata.py in folder
4f10: 20 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67   gc_lang/"+sLang
4f20: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ).            if
4f30: 20 64 61 74 61 62 75 69 6c 64 20 61 6e 64 20 78   databuild and x
4f40: 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f  Args.build_data_
4f50: 62 65 66 6f 72 65 3a 0a 20 20 20 20 20 20 20 20  before:.        
4f60: 20 20 20 20 20 20 20 20 64 61 74 61 62 75 69 6c          databuil
4f70: 64 2e 62 65 66 6f 72 65 28 27 67 63 5f 6c 61 6e  d.before('gc_lan
4f80: 67 2f 27 2b 73 4c 61 6e 67 2c 20 64 56 61 72 73  g/'+sLang, dVars
4f90: 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69  , xArgs.javascri
4fa0: 70 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt).            
4fb0: 69 66 20 78 41 72 67 73 2e 64 69 63 74 3a 0a 20  if xArgs.dict:. 
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
4fd0: 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79 28 64  uildDictionary(d
4fe0: 56 61 72 73 2c 20 22 6d 61 69 6e 22 2c 20 78 41  Vars, "main", xA
4ff0: 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a  rgs.javascript).
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 69 66 20 78 41 72 67 73 2e 61 64 64 5f 63 6f 6d  if xArgs.add_com
5020: 6d 75 6e 69 74 79 5f 64 69 63 74 69 6f 6e 61 72  munity_dictionar
5030: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y:.             
5040: 20 20 20 20 20 20 20 62 75 69 6c 64 44 69 63 74         buildDict
5050: 69 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 22 63  ionary(dVars, "c
5060: 6f 6d 6d 75 6e 69 74 79 22 2c 20 78 41 72 67 73  ommunity", xArgs
5070: 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20 20 20  .javascript).   
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5090: 78 41 72 67 73 2e 61 64 64 5f 70 65 72 73 6f 6e  xArgs.add_person
50a0: 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79 3a 0a 20  al_dictionary:. 
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61     buildDictiona
50d0: 72 79 28 64 56 61 72 73 2c 20 22 70 65 72 73 6f  ry(dVars, "perso
50e0: 6e 61 6c 22 2c 20 78 41 72 67 73 2e 6a 61 76 61  nal", xArgs.java
50f0: 73 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20  script).        
5100: 20 20 20 20 69 66 20 64 61 74 61 62 75 69 6c 64      if databuild
5110: 20 61 6e 64 20 78 41 72 67 73 2e 62 75 69 6c 64   and xArgs.build
5120: 5f 64 61 74 61 5f 61 66 74 65 72 3a 0a 20 20 20  _data_after:.   
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
5140: 61 62 75 69 6c 64 2e 61 66 74 65 72 28 27 67 63  abuild.after('gc
5150: 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c 20 64  _lang/'+sLang, d
5160: 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76 61  Vars, xArgs.java
5170: 73 63 72 69 70 74 29 0a 0a 20 20 20 20 20 20 20  script)..       
5180: 20 20 20 20 20 23 20 63 6f 70 79 20 64 69 63 74       # copy dict
5190: 69 6f 6e 61 72 69 65 73 20 66 72 6f 6d 20 47 72  ionaries from Gr
51a0: 61 70 68 73 70 65 6c 6c 0a 20 20 20 20 20 20 20  aphspell.       
51b0: 20 20 20 20 20 63 6f 70 79 47 72 61 70 68 73 70       copyGraphsp
51c0: 65 6c 6c 44 69 63 74 69 6f 6e 61 72 69 65 73 28  ellDictionaries(
51d0: 64 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76  dVars, xArgs.jav
51e0: 61 73 63 72 69 70 74 2c 20 78 41 72 67 73 2e 61  ascript, xArgs.a
51f0: 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63  dd_community_dic
5200: 74 69 6f 6e 61 72 79 2c 20 78 41 72 67 73 2e 61  tionary, xArgs.a
5210: 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74  dd_personal_dict
5220: 69 6f 6e 61 72 79 29 0a 0a 20 20 20 20 20 20 20  ionary)..       
5230: 20 20 20 20 20 23 20 6d 61 6b 65 0a 20 20 20 20       # make.    
5240: 20 20 20 20 20 20 20 20 73 56 65 72 73 69 6f 6e          sVersion
5250: 20 3d 20 63 72 65 61 74 65 28 73 4c 61 6e 67 2c   = create(sLang,
5260: 20 78 43 6f 6e 66 69 67 2c 20 78 41 72 67 73 2e   xConfig, xArgs.
5270: 69 6e 73 74 61 6c 6c 2c 20 78 41 72 67 73 2e 6a  install, xArgs.j
5280: 61 76 61 73 63 72 69 70 74 2c 20 78 41 72 67 73  avascript, xArgs
5290: 2e 75 73 65 5f 63 61 63 68 65 29 0a 0a 20 20 20  .use_cache)..   
52a0: 20 20 20 20 20 20 20 20 20 23 20 74 65 73 74 73           # tests
52b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
52c0: 78 41 72 67 73 2e 74 65 73 74 73 20 6f 72 20 78  xArgs.tests or x
52d0: 41 72 67 73 2e 70 65 72 66 20 6f 72 20 78 41 72  Args.perf or xAr
52e0: 67 73 2e 70 65 72 66 5f 6d 65 6d 6f 3a 0a 20 20  gs.perf_memo:.  
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
5300: 69 6e 74 28 22 3e 20 52 75 6e 6e 69 6e 67 20 74  int("> Running t
5310: 65 73 74 73 22 29 0a 20 20 20 20 20 20 20 20 20  ests").         
5320: 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20         try:.    
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 74 65 73 74 73 20 3d 20 69 6d 70 6f 72 74 6c 69  tests = importli
5350: 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c 65 28  b.import_module(
5360: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2e 22 2b 73  "grammalecte."+s
5370: 4c 61 6e 67 2b 22 2e 74 65 73 74 73 22 29 0a 20  Lang+".tests"). 
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 70 72 69 6e 74 28 74 65 73 74 73 2e 5f     print(tests._
53a0: 5f 66 69 6c 65 5f 5f 29 0a 20 20 20 20 20 20 20  _file__).       
53b0: 20 20 20 20 20 20 20 20 20 65 78 63 65 70 74 20           except 
53c0: 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20  ImportError:.   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 2e   print("# Error.
53f0: 20 49 6d 70 6f 72 74 20 66 61 69 6c 65 64 3a 22   Import failed:"
5400: 20 2b 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2e   + "grammalecte.
5410: 22 2b 73 4c 61 6e 67 2b 22 2e 74 65 73 74 73 22  "+sLang+".tests"
5420: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5430: 20 20 20 20 20 20 74 72 61 63 65 62 61 63 6b 2e        traceback.
5440: 70 72 69 6e 74 5f 65 78 63 28 29 0a 20 20 20 20  print_exc().    
5450: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
5460: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
5470: 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 74        if xArgs.t
5480: 65 73 74 73 3a 0a 20 20 20 20 20 20 20 20 20 20  ests:.          
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 54                xT
54a0: 65 73 74 53 75 69 74 65 20 3d 20 75 6e 69 74 74  estSuite = unitt
54b0: 65 73 74 2e 54 65 73 74 4c 6f 61 64 65 72 28 29  est.TestLoader()
54c0: 2e 6c 6f 61 64 54 65 73 74 73 46 72 6f 6d 4d 6f  .loadTestsFromMo
54d0: 64 75 6c 65 28 74 65 73 74 73 29 0a 20 20 20 20  dule(tests).    
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 75 6e 69 74 74 65 73 74 2e 54 65 78      unittest.Tex
5500: 74 54 65 73 74 52 75 6e 6e 65 72 28 29 2e 72 75  tTestRunner().ru
5510: 6e 28 78 54 65 73 74 53 75 69 74 65 29 0a 20 20  n(xTestSuite).  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 69 66 20 78 41 72 67 73 2e 70 65 72 66 20    if xArgs.perf 
5540: 6f 72 20 78 41 72 67 73 2e 70 65 72 66 5f 6d 65  or xArgs.perf_me
5550: 6d 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  mo:.            
5560: 20 20 20 20 20 20 20 20 20 20 20 20 68 44 73 74              hDst
5570: 20 3d 20 6f 70 65 6e 28 22 2e 2f 67 63 5f 6c 61   = open("./gc_la
5580: 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f 70 65 72  ng/"+sLang+"/per
5590: 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 22 61 22  f_memo.txt", "a"
55a0: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
55b0: 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22  8", newline="\n"
55c0: 29 20 20 69 66 20 78 41 72 67 73 2e 70 65 72 66  )  if xArgs.perf
55d0: 5f 6d 65 6d 6f 20 20 65 6c 73 65 20 4e 6f 6e 65  _memo  else None
55e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
55f0: 20 20 20 20 20 20 20 20 20 74 65 73 74 73 2e 70           tests.p
5600: 65 72 66 28 73 56 65 72 73 69 6f 6e 2c 20 68 44  erf(sVersion, hD
5610: 73 74 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20  st)..           
5620: 20 69 66 20 78 41 72 67 73 2e 77 65 62 5f 65 78   if xArgs.web_ex
5630: 74 20 6f 72 20 78 41 72 67 73 2e 66 69 72 65 66  t or xArgs.firef
5640: 6f 78 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ox:.            
5650: 20 20 20 20 77 69 74 68 20 68 65 6c 70 65 72 73      with helpers
5660: 2e 43 44 28 22 5f 62 75 69 6c 64 2f 77 65 62 65  .CD("_build/webe
5670: 78 74 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20  xt/"+sLang):.   
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 69 66 20 78 41 72 67 73 2e 6c 69 6e 74 5f 77   if xArgs.lint_w
56a0: 65 62 5f 65 78 74 3a 0a 20 20 20 20 20 20 20 20  eb_ext:.        
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 6f 73 2e 73 79 73 74 65 6d 28 72 27 77 65 62 2d  os.system(r'web-
56d0: 65 78 74 20 6c 69 6e 74 20 2d 6f 20 74 65 78 74  ext lint -o text
56e0: 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
56f0: 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e         if xArgs.
5700: 66 69 72 65 66 6f 78 3a 0a 20 20 20 20 20 20 20  firefox:.       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 23 20 46 69 72 65 66 6f 78 20 44 65 76 65 6c   # Firefox Devel
5730: 6f 70 70 65 72 20 65 64 69 74 69 6f 6e 0a 20 20  opper edition.  
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 73 70 66 46 69 72 65 66 6f 78        spfFirefox
5760: 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78   = dVars['win_fx
5770: 5f 64 65 76 5f 70 61 74 68 27 5d 20 20 69 66 20  _dev_path']  if 
5780: 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65 6d 28  platform.system(
5790: 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22 20 20  ) == "Windows"  
57a0: 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69 6e 75  else dVars['linu
57b0: 78 5f 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 0a  x_fx_dev_path'].
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 23 20 46 69 72 65 66 6f 78 20 4e 69 67 68    # Firefox Nigh
5800: 74 6c 79 20 65 64 69 74 69 6f 6e 0a 20 20 20 20  tly edition.    
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 73 70 66 46 69 72 65 66 6f 78 20 3d      spfFirefox =
5830: 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78 5f 6e   dVars['win_fx_n
5840: 69 67 68 74 6c 79 5f 70 61 74 68 27 5d 20 20 69  ightly_path']  i
5850: 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65  f platform.syste
5860: 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22  m() == "Windows"
5870: 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69    else dVars['li
5880: 6e 75 78 5f 66 78 5f 6e 69 67 68 74 6c 79 5f 70  nux_fx_nightly_p
5890: 61 74 68 27 5d 0a 20 20 20 20 20 20 20 20 20 20  ath'].          
58a0: 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73            os.sys
58b0: 74 65 6d 28 72 27 77 65 62 2d 65 78 74 20 72 75  tem(r'web-ext ru
58c0: 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22 27 20 2b  n --firefox="' +
58d0: 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20 27 22   spfFirefox + '"
58e0: 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f 6e 73 6f   --browser-conso
58f0: 6c 65 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  le').           
5900: 20 20 20 20 20 20 20 20 20 23 20 68 74 74 70 73           # https
5910: 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 6d 6f  ://github.com/mo
5920: 7a 69 6c 6c 61 2f 77 65 62 2d 65 78 74 2f 69 73  zilla/web-ext/is
5930: 73 75 65 73 2f 39 33 32 0a 20 20 20 20 20 20 20  sues/932.       
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6f               # o
5950: 73 2e 73 79 73 74 65 6d 28 72 27 77 65 62 2d 65  s.system(r'web-e
5960: 78 74 20 72 75 6e 20 2d 2d 66 69 72 65 66 6f 78  xt run --firefox
5970: 3d 22 27 20 2b 20 73 70 66 46 69 72 65 66 6f 78  ="' + spfFirefox
5980: 20 2b 20 72 27 22 20 2d 2d 62 72 6f 77 73 65 72   + r'" --browser
5990: 2d 63 6f 6e 73 6f 6c 65 20 2d 2d 66 69 72 65 66  -console --firef
59a0: 6f 78 2d 70 72 6f 66 69 6c 65 3d 43 3a 5c 55 73  ox-profile=C:\Us
59b0: 65 72 73 5c 45 41 4b 5c 41 70 70 44 61 74 61 5c  ers\EAK\AppData\
59c0: 52 6f 61 6d 69 6e 67 5c 4d 6f 7a 69 6c 6c 61 5c  Roaming\Mozilla\
59d0: 46 69 72 65 66 6f 78 5c 50 72 6f 66 69 6c 65 73  Firefox\Profiles
59e0: 5c 65 32 36 35 35 39 74 77 2e 64 65 62 75 67 20  \e26559tw.debug 
59f0: 2d 2d 6b 65 65 70 2d 70 72 6f 66 69 6c 65 2d 63  --keep-profile-c
5a00: 68 61 6e 67 65 73 27 29 0a 0a 20 20 20 20 20 20  hanges')..      
5a10: 20 20 20 20 20 20 23 20 54 68 75 6e 64 65 72 62        # Thunderb
5a20: 69 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ird.            
5a30: 69 66 20 78 41 72 67 73 2e 74 68 75 6e 64 65 72  if xArgs.thunder
5a40: 62 69 72 64 3a 0a 20 20 20 20 20 20 20 20 20 20  bird:.          
5a50: 20 20 20 20 20 20 73 70 66 54 68 75 6e 64 65 72        spfThunder
5a60: 62 69 72 64 20 3d 20 27 22 27 2b 64 56 61 72 73  bird = '"'+dVars
5a70: 5b 27 77 69 6e 5f 74 62 5f 70 61 74 68 27 5d 2b  ['win_tb_path']+
5a80: 27 22 27 20 20 69 66 20 70 6c 61 74 66 6f 72 6d  '"'  if platform
5a90: 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20 22 57 69  .system() == "Wi
5aa0: 6e 64 6f 77 73 22 20 20 65 6c 73 65 20 64 56 61  ndows"  else dVa
5ab0: 72 73 5b 27 6c 69 6e 75 78 5f 74 62 5f 70 61 74  rs['linux_tb_pat
5ac0: 68 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  h'].            
5ad0: 20 20 20 20 70 72 69 6e 74 28 73 70 66 54 68 75      print(spfThu
5ae0: 6e 64 65 72 62 69 72 64 29 0a 20 20 20 20 20 20  nderbird).      
5af0: 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73            os.sys
5b00: 74 65 6d 28 73 70 66 54 68 75 6e 64 65 72 62 69  tem(spfThunderbi
5b10: 72 64 20 2b 20 27 20 2d 6a 73 63 6f 6e 73 6f 6c  rd + ' -jsconsol
5b20: 65 20 2d 50 20 64 65 62 75 67 27 29 0a 20 20 20  e -P debug').   
5b30: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5b40: 73 2e 74 68 75 6e 64 65 72 62 69 72 64 5f 62 65  s.thunderbird_be
5b50: 74 61 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta:.            
5b60: 20 20 20 20 73 70 66 54 68 75 6e 64 65 72 62 69      spfThunderbi
5b70: 72 64 20 3d 20 27 22 27 2b 64 56 61 72 73 5b 27  rd = '"'+dVars['
5b80: 77 69 6e 5f 74 62 5f 62 65 74 61 5f 70 61 74 68  win_tb_beta_path
5b90: 27 5d 2b 27 22 27 20 20 69 66 20 70 6c 61 74 66  ']+'"'  if platf
5ba0: 6f 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20  orm.system() == 
5bb0: 22 57 69 6e 64 6f 77 73 22 20 20 65 6c 73 65 20  "Windows"  else 
5bc0: 64 56 61 72 73 5b 27 6c 69 6e 75 78 5f 74 62 5f  dVars['linux_tb_
5bd0: 62 65 74 61 5f 70 61 74 68 27 5d 0a 20 20 20 20  beta_path'].    
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
5bf0: 74 28 73 70 66 54 68 75 6e 64 65 72 62 69 72 64  t(spfThunderbird
5c00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5c10: 20 20 6f 73 2e 73 79 73 74 65 6d 28 73 70 66 54    os.system(spfT
5c20: 68 75 6e 64 65 72 62 69 72 64 20 2b 20 27 20 2d  hunderbird + ' -
5c30: 6a 73 63 6f 6e 73 6f 6c 65 20 2d 50 20 62 65 74  jsconsole -P bet
5c40: 61 27 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65  a').        else
5c50: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
5c60: 69 6e 74 28 22 46 6f 6c 64 65 72 20 6e 6f 74 20  int("Folder not 
5c70: 66 6f 75 6e 64 3a 20 67 63 5f 6c 61 6e 67 2f 22  found: gc_lang/"
5c80: 2b 73 4c 61 6e 67 29 0a 0a 20 20 20 20 6f 4e 6f  +sLang)..    oNo
5c90: 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64 61 74  w = datetime.dat
5ca0: 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20 20 20  etime.now().    
5cb0: 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d 3d  print("=========
5cc0: 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41 4d 4d  ===== MAKE GRAMM
5cd0: 41 4c 45 43 54 45 20 5b 66 69 6e 69 73 68 65 64  ALECTE [finished
5ce0: 5d 20 61 74 20 7b 30 2e 68 6f 75 72 3a 3e 32 7d  ] at {0.hour:>2}
5cf0: 20 68 20 7b 30 2e 6d 69 6e 75 74 65 3a 3e 32 7d   h {0.minute:>2}
5d00: 20 6d 69 6e 20 7b 30 2e 73 65 63 6f 6e 64 3a 3e   min {0.second:>
5d10: 32 7d 20 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  2} s ===========
5d20: 3d 3d 3d 22 2e 66 6f 72 6d 61 74 28 6f 4e 6f 77  ===".format(oNow
5d30: 29 29 0a 0a 0a 69 66 20 5f 5f 6e 61 6d 65 5f 5f  ))...if __name__
5d40: 20 3d 3d 20 27 5f 5f 6d 61 69 6e 5f 5f 27 3a 0a   == '__main__':.
5d50: 20 20 20 20 6d 61 69 6e 28 29 0a                     main().