Grammalecte  Hex Artifact Content

Artifact 56ef7e8bd16fb1ca7f30f1db35d26366a89273376719b317fbf24398b4026ce9:


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 66 22 67 63  d_file(open(f"gc
02b0: 5f 6c 61 6e 67 2f 7b 73 4c 61 6e 67 7d 2f 63 6f  _lang/{sLang}/co
02c0: 6e 66 69 67 2e 69 6e 69 22 2c 20 22 72 22 2c 20  nfig.ini", "r", 
02d0: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
02e0: 29 29 0a 20 20 20 20 65 78 63 65 70 74 20 46 69  )).    except Fi
02f0: 6c 65 4e 6f 74 46 6f 75 6e 64 45 72 72 6f 72 3a  leNotFoundError:
0300: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 66  .        print(f
0310: 22 23 20 45 72 72 6f 72 2e 20 43 61 6e e2 80 99  "# Error. Can...
0320: 74 20 72 65 61 64 20 63 6f 6e 66 69 67 20 66 69  t read config fi
0330: 6c 65 20 3c 7b 73 4c 61 6e 67 7d 3e 22 29 0a 20  le <{sLang}>"). 
0340: 20 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20         exit().  
0350: 20 20 72 65 74 75 72 6e 20 78 43 6f 6e 66 69 67    return xConfig
0360: 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 4f 70 74  ...def createOpt
0370: 69 6f 6e 73 4c 61 62 65 6c 50 72 6f 70 65 72 74  ionsLabelPropert
0380: 69 65 73 20 28 64 4f 70 74 4c 62 6c 29 3a 0a 20  ies (dOptLbl):. 
0390: 20 20 20 22 63 72 65 61 74 65 20 63 6f 6e 74 65     "create conte
03a0: 6e 74 20 66 6f 72 20 2e 70 72 6f 70 65 72 74 69  nt for .properti
03b0: 65 73 20 66 69 6c 65 73 20 28 4c 69 62 72 65 4f  es files (LibreO
03c0: 66 66 69 63 65 29 22 0a 20 20 20 20 73 43 6f 6e  ffice)".    sCon
03d0: 74 65 6e 74 20 3d 20 22 22 0a 20 20 20 20 66 6f  tent = "".    fo
03e0: 72 20 73 4f 70 74 2c 20 74 4c 61 62 65 6c 20 69  r sOpt, tLabel i
03f0: 6e 20 64 4f 70 74 4c 62 6c 2e 69 74 65 6d 73 28  n dOptLbl.items(
0400: 29 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e 74  ):.        sCont
0410: 65 6e 74 20 2b 3d 20 66 22 7b 73 4f 70 74 7d 3d  ent += f"{sOpt}=
0420: 7b 74 4c 61 62 65 6c 5b 30 5d 7d 5c 6e 22 0a 20  {tLabel[0]}\n". 
0430: 20 20 20 20 20 20 20 69 66 20 74 4c 61 62 65 6c         if tLabel
0440: 5b 31 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  [1]:.           
0450: 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 66 22 68   sContent += f"h
0460: 6c 70 5f 7b 73 4f 70 74 7d 3d 7b 74 4c 61 62 65  lp_{sOpt}={tLabe
0470: 6c 5b 31 5d 7d 5c 6e 22 0a 20 20 20 20 72 65 74  l[1]}\n".    ret
0480: 75 72 6e 20 73 43 6f 6e 74 65 6e 74 0a 0a 0a 64  urn sContent...d
0490: 65 66 20 63 72 65 61 74 65 44 69 61 6c 6f 67 4f  ef createDialogO
04a0: 70 74 69 6f 6e 73 58 44 4c 20 28 64 56 61 72 73  ptionsXDL (dVars
04b0: 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 62  ):.    "create b
04c0: 75 6e 64 6c 65 64 20 64 69 61 6c 6f 67 20 6f 70  undled dialog op
04d0: 74 69 6f 6e 73 20 66 69 6c 65 20 2e 78 64 6c 20  tions file .xdl 
04e0: 28 4c 69 62 72 65 4f 66 66 69 63 65 29 22 0a 20  (LibreOffice)". 
04f0: 20 20 20 69 54 61 62 20 3d 20 31 0a 20 20 20 20     iTab = 1.    
0500: 6e 50 6f 73 59 20 3d 20 35 0a 20 20 20 20 6e 57  nPosY = 5.    nW
0510: 69 64 74 68 20 3d 20 32 34 30 0a 20 20 20 20 73  idth = 240.    s
0520: 43 6f 6e 74 65 6e 74 20 3d 20 22 22 0a 20 20 20  Content = "".   
0530: 20 64 4f 70 74 20 3d 20 64 56 61 72 73 5b 22 64   dOpt = dVars["d
0540: 4f 70 74 57 72 69 74 65 72 22 5d 0a 20 20 20 20  OptWriter"].    
0550: 64 4f 70 74 4c 61 62 65 6c 20 3d 20 64 56 61 72  dOptLabel = dVar
0560: 73 5b 22 64 4f 70 74 4c 61 62 65 6c 22 5d 5b 64  s["dOptLabel"][d
0570: 56 61 72 73 5b 22 6c 61 6e 67 22 5d 5d 0a 20 20  Vars["lang"]].  
0580: 20 20 66 6f 72 20 73 47 72 6f 75 70 2c 20 6c 47    for sGroup, lG
0590: 72 6f 75 70 4f 70 74 69 6f 6e 73 20 69 6e 20 64  roupOptions in d
05a0: 56 61 72 73 5b 22 6c 53 74 72 75 63 74 4f 70 74  Vars["lStructOpt
05b0: 22 5d 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e  "]:.        sCon
05c0: 74 65 6e 74 20 2b 3d 20 66 27 3c 64 6c 67 3a 66  tent += f'<dlg:f
05d0: 69 78 65 64 6c 69 6e 65 20 64 6c 67 3a 69 64 3d  ixedline dlg:id=
05e0: 22 7b 73 47 72 6f 75 70 7d 22 20 64 6c 67 3a 74  "{sGroup}" dlg:t
05f0: 61 62 2d 69 6e 64 65 78 3d 22 7b 69 54 61 62 7d  ab-index="{iTab}
0600: 22 20 64 6c 67 3a 74 6f 70 3d 22 7b 6e 50 6f 73  " dlg:top="{nPos
0610: 59 7d 22 20 64 6c 67 3a 6c 65 66 74 3d 22 35 22  Y}" dlg:left="5"
0620: 20 64 6c 67 3a 77 69 64 74 68 3d 22 7b 6e 57 69   dlg:width="{nWi
0630: 64 74 68 7d 22 20 64 6c 67 3a 68 65 69 67 68 74  dth}" dlg:height
0640: 3d 22 31 30 22 20 64 6c 67 3a 76 61 6c 75 65 3d  ="10" dlg:value=
0650: 22 26 61 6d 70 3b 7b 73 47 72 6f 75 70 7d 22 20  "&amp;{sGroup}" 
0660: 2f 3e 5c 6e 27 0a 20 20 20 20 20 20 20 20 69 54  />\n'.        iT
0670: 61 62 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20  ab += 1.        
0680: 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73  for lLineOptions
0690: 20 69 6e 20 6c 47 72 6f 75 70 4f 70 74 69 6f 6e   in lGroupOption
06a0: 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  s:.            n
06b0: 45 6c 65 6d 57 69 64 74 68 20 3d 20 6e 57 69 64  ElemWidth = nWid
06c0: 74 68 20 2f 2f 20 6c 65 6e 28 6c 4c 69 6e 65 4f  th // len(lLineO
06d0: 70 74 69 6f 6e 73 29 0a 20 20 20 20 20 20 20 20  ptions).        
06e0: 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31 30 0a      nPosY += 10.
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73              nPos
0700: 58 20 3d 20 31 30 0a 20 20 20 20 20 20 20 20 20  X = 10.         
0710: 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c     for sOpt in l
0720: 4c 69 6e 65 4f 70 74 69 6f 6e 73 3a 0a 20 20 20  LineOptions:.   
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 48 65               sHe
0740: 6c 70 20 3d 20 66 27 64 6c 67 3a 68 65 6c 70 2d  lp = f'dlg:help-
0750: 74 65 78 74 3d 22 26 61 6d 70 3b 68 6c 70 5f 7b  text="&amp;hlp_{
0760: 73 4f 70 74 7d 22 27 20 20 69 66 20 64 4f 70 74  sOpt}"'  if dOpt
0770: 4c 61 62 65 6c 5b 73 4f 70 74 5d 5b 31 5d 20 20  Label[sOpt][1]  
0780: 65 6c 73 65 20 22 22 0a 20 20 20 20 20 20 20 20  else "".        
0790: 20 20 20 20 20 20 20 20 73 43 68 65 63 6b 65 64          sChecked
07a0: 20 3d 20 22 74 72 75 65 22 20 69 66 20 64 4f 70   = "true" if dOp
07b0: 74 5b 73 4f 70 74 5d 20 65 6c 73 65 20 22 66 61  t[sOpt] else "fa
07c0: 6c 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  lse".           
07d0: 20 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d       sContent +=
07e0: 20 66 27 3c 64 6c 67 3a 63 68 65 63 6b 62 6f 78   f'<dlg:checkbox
07f0: 20 64 6c 67 3a 69 64 3d 22 7b 73 4f 70 74 7d 22   dlg:id="{sOpt}"
0800: 20 64 6c 67 3a 74 61 62 2d 69 6e 64 65 78 3d 22   dlg:tab-index="
0810: 7b 69 54 61 62 7d 22 20 64 6c 67 3a 74 6f 70 3d  {iTab}" dlg:top=
0820: 22 7b 6e 50 6f 73 59 7d 22 20 64 6c 67 3a 6c 65  "{nPosY}" dlg:le
0830: 66 74 3d 22 7b 6e 50 6f 73 58 7d 22 20 64 6c 67  ft="{nPosX}" dlg
0840: 3a 77 69 64 74 68 3d 22 7b 6e 45 6c 65 6d 57 69  :width="{nElemWi
0850: 64 74 68 7d 22 20 64 6c 67 3a 68 65 69 67 68 74  dth}" dlg:height
0860: 3d 22 31 30 22 20 64 6c 67 3a 76 61 6c 75 65 3d  ="10" dlg:value=
0870: 22 26 61 6d 70 3b 7b 73 4f 70 74 7d 22 20 64 6c  "&amp;{sOpt}" dl
0880: 67 3a 63 68 65 63 6b 65 64 3d 22 7b 73 43 68 65  g:checked="{sChe
0890: 63 6b 65 64 7d 22 20 7b 73 48 65 6c 70 7d 20 2f  cked}" {sHelp} /
08a0: 3e 5c 6e 27 0a 20 20 20 20 20 20 20 20 20 20 20  >\n'.           
08b0: 20 20 20 20 20 69 54 61 62 20 2b 3d 20 31 0a 20       iTab += 1. 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
08d0: 50 6f 73 58 20 2b 3d 20 6e 45 6c 65 6d 57 69 64  PosX += nElemWid
08e0: 74 68 0a 20 20 20 20 20 20 20 20 6e 50 6f 73 59  th.        nPosY
08f0: 20 2b 3d 20 31 30 0a 20 20 20 20 72 65 74 75 72   += 10.    retur
0900: 6e 20 73 43 6f 6e 74 65 6e 74 0a 0a 0a 64 65 66  n sContent...def
0910: 20 63 72 65 61 74 65 4f 58 54 20 28 73 70 4c 61   createOXT (spLa
0920: 6e 67 2c 20 64 56 61 72 73 2c 20 64 4f 78 74 2c  ng, dVars, dOxt,
0930: 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 62 49 6e   spLangPack, bIn
0940: 73 74 61 6c 6c 29 3a 0a 20 20 20 20 22 63 72 65  stall):.    "cre
0950: 61 74 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f  ate extension fo
0960: 72 20 57 72 69 74 65 72 22 0a 20 20 20 20 70 72  r Writer".    pr
0970: 69 6e 74 28 22 42 75 69 6c 64 69 6e 67 20 65 78  int("Building ex
0980: 74 65 6e 73 69 6f 6e 20 66 6f 72 20 57 72 69 74  tension for Writ
0990: 65 72 22 29 0a 20 20 20 20 73 70 66 5a 69 70 20  er").    spfZip 
09a0: 3d 20 66 22 5f 62 75 69 6c 64 2f 7b 64 56 61 72  = f"_build/{dVar
09b0: 73 5b 27 6e 61 6d 65 27 5d 7d 2d 7b 64 56 61 72  s['name']}-{dVar
09c0: 73 5b 27 6c 61 6e 67 27 5d 7d 2d 76 7b 64 56 61  s['lang']}-v{dVa
09d0: 72 73 5b 27 76 65 72 73 69 6f 6e 27 5d 7d 2e 6f  rs['version']}.o
09e0: 78 74 22 0a 20 20 20 20 68 5a 69 70 20 3d 20 7a  xt".    hZip = z
09f0: 69 70 66 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73  ipfile.ZipFile(s
0a00: 70 66 5a 69 70 2c 20 6d 6f 64 65 3d 27 77 27 2c  pfZip, mode='w',
0a10: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 3d 7a 69 70   compression=zip
0a20: 66 69 6c 65 2e 5a 49 50 5f 44 45 46 4c 41 54 45  file.ZIP_DEFLATE
0a30: 44 29 0a 0a 20 20 20 20 23 20 50 61 63 6b 61 67  D)..    # Packag
0a40: 65 20 61 6e 64 20 70 61 72 73 65 72 0a 20 20 20  e and parser.   
0a50: 20 63 6f 70 79 47 72 61 6d 6d 61 6c 65 63 74 65   copyGrammalecte
0a60: 50 79 50 61 63 6b 61 67 65 49 6e 5a 69 70 46 69  PyPackageInZipFi
0a70: 6c 65 28 68 5a 69 70 2c 20 73 70 4c 61 6e 67 50  le(hZip, spLangP
0a80: 61 63 6b 2c 20 22 70 79 74 68 6f 6e 70 61 74 68  ack, "pythonpath
0a90: 2f 22 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  /").    hZip.wri
0aa0: 74 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  te("grammalecte-
0ab0: 63 6c 69 2e 70 79 22 2c 20 22 70 79 74 68 6f 6e  cli.py", "python
0ac0: 70 61 74 68 2f 67 72 61 6d 6d 61 6c 65 63 74 65  path/grammalecte
0ad0: 2d 63 6c 69 2e 70 79 22 29 0a 0a 20 20 20 20 23  -cli.py")..    #
0ae0: 20 45 78 74 65 6e 73 69 6f 6e 20 66 69 6c 65 73   Extension files
0af0: 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73  .    hZip.writes
0b00: 74 72 28 22 4d 45 54 41 2d 49 4e 46 2f 6d 61 6e  tr("META-INF/man
0b10: 69 66 65 73 74 2e 78 6d 6c 22 2c 20 68 65 6c 70  ifest.xml", help
0b20: 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 22 67 63  ers.fileFile("gc
0b30: 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6d 61 6e  _core/py/oxt/man
0b40: 69 66 65 73 74 2e 78 6d 6c 22 2c 20 64 56 61 72  ifest.xml", dVar
0b50: 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  s)).    hZip.wri
0b60: 74 65 73 74 72 28 22 64 65 73 63 72 69 70 74 69  testr("descripti
0b70: 6f 6e 2e 78 6d 6c 22 2c 20 68 65 6c 70 65 72 73  on.xml", helpers
0b80: 2e 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f  .fileFile("gc_co
0b90: 72 65 2f 70 79 2f 6f 78 74 2f 64 65 73 63 72 69  re/py/oxt/descri
0ba0: 70 74 69 6f 6e 2e 78 6d 6c 22 2c 20 64 56 61 72  ption.xml", dVar
0bb0: 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  s)).    hZip.wri
0bc0: 74 65 73 74 72 28 22 4c 69 6e 67 75 69 73 74 69  testr("Linguisti
0bd0: 63 2e 78 63 75 22 2c 20 68 65 6c 70 65 72 73 2e  c.xcu", helpers.
0be0: 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72  fileFile("gc_cor
0bf0: 65 2f 70 79 2f 6f 78 74 2f 4c 69 6e 67 75 69 73  e/py/oxt/Linguis
0c00: 74 69 63 2e 78 63 75 22 2c 20 64 56 61 72 73 29  tic.xcu", dVars)
0c10: 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65  ).    hZip.write
0c20: 73 74 72 28 22 47 72 61 6d 6d 61 6c 65 63 74 65  str("Grammalecte
0c30: 2e 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66 69  .py", helpers.fi
0c40: 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f  leFile("gc_core/
0c50: 70 79 2f 6f 78 74 2f 47 72 61 6d 6d 61 6c 65 63  py/oxt/Grammalec
0c60: 74 65 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a  te.py", dVars)).
0c70: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
0c80: 72 28 22 70 79 74 68 6f 6e 70 61 74 68 2f 68 65  r("pythonpath/he
0c90: 6c 70 65 72 73 2e 70 79 22 2c 20 68 65 6c 70 65  lpers.py", helpe
0ca0: 72 73 2e 66 69 6c 65 46 69 6c 65 28 22 67 63 5f  rs.fileFile("gc_
0cb0: 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 68 65 6c 70  core/py/oxt/help
0cc0: 65 72 73 2e 70 79 22 2c 20 64 56 61 72 73 29 29  ers.py", dVars))
0cd0: 0a 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ..    for sf in 
0ce0: 64 56 61 72 73 5b 22 65 78 74 72 61 73 22 5d 2e  dVars["extras"].
0cf0: 73 70 6c 69 74 28 22 2c 22 29 3a 0a 20 20 20 20  split(","):.    
0d00: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
0d10: 72 28 73 66 2e 73 74 72 69 70 28 29 2c 20 68 65  r(sf.strip(), he
0d20: 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 73  lpers.fileFile(s
0d30: 70 4c 61 6e 67 20 2b 20 27 2f 27 20 2b 20 73 66  pLang + '/' + sf
0d40: 2e 73 74 72 69 70 28 29 2c 20 64 56 61 72 73 29  .strip(), dVars)
0d50: 29 0a 0a 20 20 20 20 69 66 20 22 6c 6f 67 6f 22  )..    if "logo"
0d60: 20 69 6e 20 64 56 61 72 73 2e 6b 65 79 73 28 29   in dVars.keys()
0d70: 20 61 6e 64 20 64 56 61 72 73 5b 22 6c 6f 67 6f   and dVars["logo
0d80: 22 5d 2e 73 74 72 69 70 28 29 3a 0a 20 20 20 20  "].strip():.    
0d90: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73      hZip.write(s
0da0: 70 4c 61 6e 67 20 2b 20 27 2f 27 20 2b 20 64 56  pLang + '/' + dV
0db0: 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72 69  ars["logo"].stri
0dc0: 70 28 29 2c 20 64 56 61 72 73 5b 22 6c 6f 67 6f  p(), dVars["logo
0dd0: 22 5d 2e 73 74 72 69 70 28 29 29 0a 0a 20 20 20  "].strip())..   
0de0: 20 23 23 20 4f 50 54 49 4f 4e 53 0a 20 20 20 20   ## OPTIONS.    
0df0: 23 20 6f 70 74 69 6f 6e 73 20 64 69 61 6c 6f 67  # options dialog
0e00: 20 77 69 74 68 69 6e 20 4c 4f 2f 4f 4f 20 6f 70   within LO/OO op
0e10: 74 69 6f 6e 73 20 70 61 6e 65 6c 20 28 6c 65 67  tions panel (leg
0e20: 61 63 79 29 0a 20 20 20 20 23 68 5a 69 70 2e 77  acy).    #hZip.w
0e30: 72 69 74 65 73 74 72 28 22 70 79 74 68 6f 6e 70  ritestr("pythonp
0e40: 61 74 68 2f 6c 69 67 68 74 70 72 6f 6f 66 5f 68  ath/lightproof_h
0e50: 61 6e 64 6c 65 72 5f 67 72 61 6d 6d 61 6c 65 63  andler_grammalec
0e60: 74 65 2e 70 79 22 2c 20 68 65 6c 70 65 72 73 2e  te.py", helpers.
0e70: 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72  fileFile("gc_cor
0e80: 65 2f 70 79 2f 6f 78 74 2f 6c 69 67 68 74 70 72  e/py/oxt/lightpr
0e90: 6f 6f 66 5f 68 61 6e 64 6c 65 72 5f 67 72 61 6d  oof_handler_gram
0ea0: 6d 61 6c 65 63 74 65 2e 70 79 22 2c 20 64 56 61  malecte.py", dVa
0eb0: 72 73 29 29 0a 20 20 20 20 23 6c 4c 69 6e 65 4f  rs)).    #lLineO
0ec0: 70 74 69 6f 6e 73 20 3d 20 6f 70 65 6e 28 73 70  ptions = open(sp
0ed0: 4c 61 6e 67 20 2b 20 22 2f 6f 70 74 69 6f 6e 73  Lang + "/options
0ee0: 2e 74 78 74 22 2c 20 22 72 22 2c 20 65 6e 63 6f  .txt", "r", enco
0ef0: 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72 65  ding="utf-8").re
0f00: 61 64 6c 69 6e 65 73 28 29 0a 20 20 20 20 23 64  adlines().    #d
0f10: 69 61 6c 6f 67 5f 62 75 6e 64 6c 65 64 2e 63 28  ialog_bundled.c(
0f20: 64 56 61 72 73 5b 22 69 6d 70 6c 6e 61 6d 65 22  dVars["implname"
0f30: 5d 2c 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73 2c  ], lLineOptions,
0f40: 20 68 5a 69 70 2c 20 64 56 61 72 73 5b 22 6c 61   hZip, dVars["la
0f50: 6e 67 22 5d 29 0a 0a 20 20 20 20 23 20 6f 70 74  ng"])..    # opt
0f60: 69 6f 6e 73 20 64 69 61 6c 6f 67 0a 20 20 20 20  ions dialog.    
0f70: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 70  hZip.writestr("p
0f80: 79 74 68 6f 6e 70 61 74 68 2f 4f 70 74 69 6f 6e  ythonpath/Option
0f90: 73 2e 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66  s.py", helpers.f
0fa0: 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65  ileFile("gc_core
0fb0: 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73 2e  /py/oxt/Options.
0fc0: 70 79 22 2c 20 64 56 61 72 73 29 29 0a 20 20 20  py", dVars)).   
0fd0: 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 63 5f   hZip.write("gc_
0fe0: 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6f 70 5f 73  core/py/oxt/op_s
0ff0: 74 72 69 6e 67 73 2e 70 79 22 2c 20 22 70 79 74  trings.py", "pyt
1000: 68 6f 6e 70 61 74 68 2f 6f 70 5f 73 74 72 69 6e  honpath/op_strin
1010: 67 73 2e 70 79 22 29 0a 20 20 20 20 23 20 6f 70  gs.py").    # op
1020: 74 69 6f 6e 73 20 64 69 61 6c 6f 67 20 77 69 74  tions dialog wit
1030: 68 69 6e 20 57 72 69 74 65 72 20 6f 70 74 69 6f  hin Writer optio
1040: 6e 73 20 70 61 6e 65 6c 0a 20 20 20 20 64 56 61  ns panel.    dVa
1050: 72 73 5b 22 78 64 6c 5f 64 69 61 6c 6f 67 5f 6f  rs["xdl_dialog_o
1060: 70 74 69 6f 6e 73 22 5d 20 3d 20 63 72 65 61 74  ptions"] = creat
1070: 65 44 69 61 6c 6f 67 4f 70 74 69 6f 6e 73 58 44  eDialogOptionsXD
1080: 4c 28 64 56 61 72 73 29 0a 20 20 20 20 64 56 61  L(dVars).    dVa
1090: 72 73 5b 22 78 63 73 5f 6f 70 74 69 6f 6e 73 22  rs["xcs_options"
10a0: 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 5b 20  ] = "\n".join([ 
10b0: 27 3c 70 72 6f 70 20 6f 6f 72 3a 6e 61 6d 65 3d  '<prop oor:name=
10c0: 22 27 2b 73 4f 70 74 2b 27 22 20 6f 6f 72 3a 74  "'+sOpt+'" oor:t
10d0: 79 70 65 3d 22 78 73 3a 73 74 72 69 6e 67 22 3e  ype="xs:string">
10e0: 3c 76 61 6c 75 65 3e 3c 2f 76 61 6c 75 65 3e 3c  <value></value><
10f0: 2f 70 72 6f 70 3e 27 20 66 6f 72 20 73 4f 70 74  /prop>' for sOpt
1100: 20 69 6e 20 64 56 61 72 73 5b 22 64 4f 70 74 50   in dVars["dOptP
1110: 79 74 68 6f 6e 22 5d 20 5d 29 0a 20 20 20 20 64  ython"] ]).    d
1120: 56 61 72 73 5b 22 78 63 75 5f 6c 61 62 65 6c 5f  Vars["xcu_label_
1130: 76 61 6c 75 65 73 22 5d 20 3d 20 22 5c 6e 22 2e  values"] = "\n".
1140: 6a 6f 69 6e 28 5b 20 27 3c 76 61 6c 75 65 20 78  join([ '<value x
1150: 6d 6c 3a 6c 61 6e 67 3d 22 27 2b 73 4c 61 6e 67  ml:lang="'+sLang
1160: 2b 27 22 3e 27 20 2b 20 64 56 61 72 73 5b 22 64  +'">' + dVars["d
1170: 4f 70 74 4c 61 62 65 6c 22 5d 5b 73 4c 61 6e 67  OptLabel"][sLang
1180: 5d 5b 22 5f 5f 6f 70 74 69 6f 6e 74 69 74 6c 65  ]["__optiontitle
1190: 5f 5f 22 5d 20 2b 20 27 3c 2f 76 61 6c 75 65 3e  __"] + '</value>
11a0: 27 20 20 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20  '  for sLang in 
11b0: 64 56 61 72 73 5b 22 64 4f 70 74 4c 61 62 65 6c  dVars["dOptLabel
11c0: 22 5d 20 5d 29 0a 20 20 20 20 68 5a 69 70 2e 77  "] ]).    hZip.w
11d0: 72 69 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f  ritestr("dialog/
11e0: 6f 70 74 69 6f 6e 73 5f 70 61 67 65 2e 78 64 6c  options_page.xdl
11f0: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
1200: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
1210: 6f 78 74 2f 6f 70 74 69 6f 6e 73 5f 70 61 67 65  oxt/options_page
1220: 2e 78 64 6c 22 2c 20 64 56 61 72 73 29 29 0a 20  .xdl", dVars)). 
1230: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72     hZip.writestr
1240: 28 22 64 69 61 6c 6f 67 2f 4f 70 74 69 6f 6e 73  ("dialog/Options
1250: 44 69 61 6c 6f 67 2e 78 63 73 22 2c 20 68 65 6c  Dialog.xcs", hel
1260: 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 22 67  pers.fileFile("g
1270: 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 4f 70  c_core/py/oxt/Op
1280: 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 73 22  tionsDialog.xcs"
1290: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
12a0: 69 70 2e 77 72 69 74 65 73 74 72 28 22 64 69 61  ip.writestr("dia
12b0: 6c 6f 67 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f  log/OptionsDialo
12c0: 67 2e 78 63 75 22 2c 20 68 65 6c 70 65 72 73 2e  g.xcu", helpers.
12d0: 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72  fileFile("gc_cor
12e0: 65 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73  e/py/oxt/Options
12f0: 44 69 61 6c 6f 67 2e 78 63 75 22 2c 20 64 56 61  Dialog.xcu", dVa
1300: 72 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72  rs)).    hZip.wr
1310: 69 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 22  itestr("dialog/"
1320: 20 2b 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d   + dVars['lang']
1330: 20 2b 20 22 5f 65 6e 2e 64 65 66 61 75 6c 74 22   + "_en.default"
1340: 2c 20 22 22 29 0a 20 20 20 20 66 6f 72 20 73 4c  , "").    for sL
1350: 61 6e 67 4c 62 6c 2c 20 64 4f 70 74 4c 62 6c 20  angLbl, dOptLbl 
1360: 69 6e 20 64 56 61 72 73 5b 27 64 4f 70 74 4c 61  in dVars['dOptLa
1370: 62 65 6c 27 5d 2e 69 74 65 6d 73 28 29 3a 0a 20  bel'].items():. 
1380: 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74         hZip.writ
1390: 65 73 74 72 28 66 22 64 69 61 6c 6f 67 2f 7b 64  estr(f"dialog/{d
13a0: 56 61 72 73 5b 27 6c 61 6e 67 27 5d 7d 5f 7b 73  Vars['lang']}_{s
13b0: 4c 61 6e 67 4c 62 6c 7d 2e 70 72 6f 70 65 72 74  LangLbl}.propert
13c0: 69 65 73 22 2c 20 63 72 65 61 74 65 4f 70 74 69  ies", createOpti
13d0: 6f 6e 73 4c 61 62 65 6c 50 72 6f 70 65 72 74 69  onsLabelProperti
13e0: 65 73 28 64 4f 70 74 4c 62 6c 29 29 0a 0a 20 20  es(dOptLbl))..  
13f0: 20 20 23 23 20 41 44 44 4f 4e 53 20 4f 58 54 0a    ## ADDONS OXT.
1400: 20 20 20 20 70 72 69 6e 74 28 22 2b 20 4f 58 54      print("+ OXT
1410: 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20  : ", end="").   
1420: 20 66 6f 72 20 73 70 66 53 72 63 2c 20 73 70 66   for spfSrc, spf
1430: 44 73 74 20 69 6e 20 64 4f 78 74 2e 69 74 65 6d  Dst in dOxt.item
1440: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 70 72 69  s():.        pri
1450: 6e 74 28 73 70 66 53 72 63 2c 20 65 6e 64 3d 22  nt(spfSrc, end="
1460: 2c 20 22 29 0a 20 20 20 20 20 20 20 20 69 66 20  , ").        if 
1470: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70  os.path.isdir(sp
1480: 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63 29  Lang+'/'+spfSrc)
1490: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  :.            fo
14a0: 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64  r sf in os.listd
14b0: 69 72 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70  ir(spLang+'/'+sp
14c0: 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20  fSrc):.         
14d0: 20 20 20 20 20 20 20 69 66 20 73 66 2e 65 6e 64         if sf.end
14e0: 73 77 69 74 68 28 28 27 2e 74 78 74 27 2c 20 27  swith(('.txt', '
14f0: 2e 70 79 27 29 29 3a 0a 20 20 20 20 20 20 20 20  .py')):.        
1500: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
1510: 2e 77 72 69 74 65 73 74 72 28 73 70 66 44 73 74  .writestr(spfDst
1520: 2b 22 2f 22 2b 73 66 2c 20 68 65 6c 70 65 72 73  +"/"+sf, helpers
1530: 2e 66 69 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67  .fileFile(spLang
1540: 2b 27 2f 27 2b 73 70 66 53 72 63 2b 22 2f 22 2b  +'/'+spfSrc+"/"+
1550: 73 66 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20  sf, dVars)).    
1560: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
1570: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1580: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1590: 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53  (spLang+'/'+spfS
15a0: 72 63 2b 22 2f 22 2b 73 66 2c 20 73 70 66 44 73  rc+"/"+sf, spfDs
15b0: 74 2b 22 2f 22 2b 73 66 29 0a 20 20 20 20 20 20  t+"/"+sf).      
15c0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
15d0: 20 20 20 20 69 66 20 73 70 66 53 72 63 2e 65 6e      if spfSrc.en
15e0: 64 73 77 69 74 68 28 28 27 2e 74 78 74 27 2c 20  dswith(('.txt', 
15f0: 27 2e 70 79 27 29 29 3a 0a 20 20 20 20 20 20 20  '.py')):.       
1600: 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72           hZip.wr
1610: 69 74 65 73 74 72 28 73 70 66 44 73 74 2c 20 68  itestr(spfDst, h
1620: 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28  elpers.fileFile(
1630: 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72  spLang+'/'+spfSr
1640: 63 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 20  c, dVars)).     
1650: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69               hZi
1670: 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 2b 27  p.write(spLang+'
1680: 2f 27 2b 73 70 66 53 72 63 2c 20 73 70 66 44 73  /'+spfSrc, spfDs
1690: 74 29 0a 20 20 20 20 70 72 69 6e 74 28 29 0a 20  t).    print(). 
16a0: 20 20 20 68 5a 69 70 2e 63 6c 6f 73 65 28 29 0a     hZip.close().
16b0: 0a 20 20 20 20 23 20 49 6e 73 74 61 6c 6c 61 74  .    # Installat
16c0: 69 6f 6e 20 69 6e 20 57 72 69 74 65 72 20 70 72  ion in Writer pr
16d0: 6f 66 69 6c 65 0a 20 20 20 20 69 66 20 62 49 6e  ofile.    if bIn
16e0: 73 74 61 6c 6c 3a 0a 20 20 20 20 20 20 20 20 70  stall:.        p
16f0: 72 69 6e 74 28 22 3e 20 69 6e 73 74 61 6c 6c 61  rint("> installa
1700: 74 69 6f 6e 20 69 6e 20 57 72 69 74 65 72 22 29  tion in Writer")
1710: 0a 20 20 20 20 20 20 20 20 69 66 20 64 56 61 72  .        if dVar
1720: 73 2e 67 65 74 28 27 75 6e 6f 70 6b 67 27 2c 20  s.get('unopkg', 
1730: 46 61 6c 73 65 29 3a 0a 20 20 20 20 20 20 20 20  False):.        
1740: 20 20 20 20 63 6d 64 20 3d 20 27 22 27 2b 6f 73      cmd = '"'+os
1750: 2e 70 61 74 68 2e 61 62 73 70 61 74 68 28 64 56  .path.abspath(dV
1760: 61 72 73 2e 67 65 74 28 27 75 6e 6f 70 6b 67 27  ars.get('unopkg'
1770: 29 2b 27 22 20 61 64 64 20 2d 66 20 27 2b 73 70  )+'" add -f '+sp
1780: 66 5a 69 70 29 0a 20 20 20 20 20 20 20 20 20 20  fZip).          
1790: 20 20 70 72 69 6e 74 28 63 6d 64 29 0a 20 20 20    print(cmd).   
17a0: 20 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74           os.syst
17b0: 65 6d 28 63 6d 64 29 0a 20 20 20 20 20 20 20 20  em(cmd).        
17c0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
17d0: 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72    print("# Error
17e0: 3a 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 6e  : path and filen
17f0: 61 6d 65 20 6f 66 20 75 6e 6f 70 6b 67 20 6e 6f  ame of unopkg no
1800: 74 20 73 65 74 20 69 6e 20 63 6f 6e 66 69 67 2e  t set in config.
1810: 69 6e 69 22 29 0a 0a 0a 64 65 66 20 63 72 65 61  ini")...def crea
1820: 74 65 50 61 63 6b 61 67 65 5a 69 70 20 28 64 56  tePackageZip (dV
1830: 61 72 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29  ars, spLangPack)
1840: 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 73 65  :.    "create se
1850: 72 76 65 72 20 7a 69 70 22 0a 20 20 20 20 73 70  rver zip".    sp
1860: 66 5a 69 70 20 3d 20 66 22 5f 62 75 69 6c 64 2f  fZip = f"_build/
1870: 7b 64 56 61 72 73 5b 27 6e 61 6d 65 27 5d 7d 2d  {dVars['name']}-
1880: 7b 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 7d 2d  {dVars['lang']}-
1890: 76 7b 64 56 61 72 73 5b 27 76 65 72 73 69 6f 6e  v{dVars['version
18a0: 27 5d 7d 2e 7a 69 70 22 0a 20 20 20 20 68 5a 69  ']}.zip".    hZi
18b0: 70 20 3d 20 7a 69 70 66 69 6c 65 2e 5a 69 70 46  p = zipfile.ZipF
18c0: 69 6c 65 28 73 70 66 5a 69 70 2c 20 6d 6f 64 65  ile(spfZip, mode
18d0: 3d 27 77 27 2c 20 63 6f 6d 70 72 65 73 73 69 6f  ='w', compressio
18e0: 6e 3d 7a 69 70 66 69 6c 65 2e 5a 49 50 5f 44 45  n=zipfile.ZIP_DE
18f0: 46 4c 41 54 45 44 29 0a 20 20 20 20 63 6f 70 79  FLATED).    copy
1900: 47 72 61 6d 6d 61 6c 65 63 74 65 50 79 50 61 63  GrammalectePyPac
1910: 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a  kageInZipFile(hZ
1920: 69 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a  ip, spLangPack).
1930: 20 20 20 20 66 6f 72 20 73 70 66 20 69 6e 20 5b      for spf in [
1940: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69  "grammalecte-cli
1950: 2e 70 79 22 2c 20 22 67 72 61 6d 6d 61 6c 65 63  .py", "grammalec
1960: 74 65 2d 73 65 72 76 65 72 2e 70 79 22 2c 20 5c  te-server.py", \
1970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1980: 20 22 52 45 41 44 4d 45 2e 74 78 74 22 2c 20 22   "README.txt", "
1990: 4c 49 43 45 4e 53 45 2e 74 78 74 22 2c 20 22 4c  LICENSE.txt", "L
19a0: 49 43 45 4e 53 45 2e 66 72 2e 74 78 74 22 5d 3a  ICENSE.fr.txt"]:
19b0: 0a 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72  .        hZip.wr
19c0: 69 74 65 28 73 70 66 29 0a 20 20 20 20 68 5a 69  ite(spf).    hZi
19d0: 70 2e 77 72 69 74 65 73 74 72 28 22 73 65 74 75  p.writestr("setu
19e0: 70 2e 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66  p.py", helpers.f
19f0: 69 6c 65 46 69 6c 65 28 22 67 63 5f 6c 61 6e 67  ileFile("gc_lang
1a00: 2f 66 72 2f 73 65 74 75 70 2e 70 79 22 2c 20 64  /fr/setup.py", d
1a10: 56 61 72 73 29 29 0a 0a 0a 64 65 66 20 63 6f 70  Vars))...def cop
1a20: 79 47 72 61 6d 6d 61 6c 65 63 74 65 50 79 50 61  yGrammalectePyPa
1a30: 63 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65 20 28  ckageInZipFile (
1a40: 68 5a 69 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b  hZip, spLangPack
1a50: 2c 20 73 41 64 64 50 61 74 68 3d 22 22 29 3a 0a  , sAddPath=""):.
1a60: 20 20 20 20 22 63 6f 70 79 20 47 72 61 6d 6d 61      "copy Gramma
1a70: 6c 65 63 74 65 20 50 79 74 68 6f 6e 20 70 61 63  lecte Python pac
1a80: 6b 61 67 65 20 69 6e 20 7a 69 70 20 66 69 6c 65  kage in zip file
1a90: 22 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ".    for sf in 
1aa0: 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 72 61 6d  os.listdir("gram
1ab0: 6d 61 6c 65 63 74 65 22 29 3a 0a 20 20 20 20 20  malecte"):.     
1ac0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
1ad0: 68 2e 69 73 64 69 72 28 22 67 72 61 6d 6d 61 6c  h.isdir("grammal
1ae0: 65 63 74 65 2f 22 2b 73 66 29 3a 0a 20 20 20 20  ecte/"+sf):.    
1af0: 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69          hZip.wri
1b00: 74 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  te("grammalecte/
1b10: 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b 22  "+sf, sAddPath+"
1b20: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66  grammalecte/"+sf
1b30: 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ).    for sf in 
1b40: 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 72 61 6d  os.listdir("gram
1b50: 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65  malecte/graphspe
1b60: 6c 6c 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  ll"):.        if
1b70: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
1b80: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  ir("grammalecte/
1b90: 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66 29  graphspell/"+sf)
1ba0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 5a  :.            hZ
1bb0: 69 70 2e 77 72 69 74 65 28 22 67 72 61 6d 6d 61  ip.write("gramma
1bc0: 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c  lecte/graphspell
1bd0: 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b  /"+sf, sAddPath+
1be0: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  "grammalecte/gra
1bf0: 70 68 73 70 65 6c 6c 2f 22 2b 73 66 29 0a 20 20  phspell/"+sf).  
1c00: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
1c10: 69 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c 65  istdir("grammale
1c20: 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f  cte/graphspell/_
1c30: 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29 3a 0a  dictionaries"):.
1c40: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f          if not o
1c50: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 72  s.path.isdir("gr
1c60: 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73  ammalecte/graphs
1c70: 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69  pell/_dictionari
1c80: 65 73 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20  es/"+sf):.      
1c90: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1ca0: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72  ("grammalecte/gr
1cb0: 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f  aphspell/_dictio
1cc0: 6e 61 72 69 65 73 2f 22 2b 73 66 2c 20 73 41 64  naries/"+sf, sAd
1cd0: 64 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63  dPath+"grammalec
1ce0: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64  te/graphspell/_d
1cf0: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73 66  ictionaries/"+sf
1d00: 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ).    for sf in 
1d10: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e  os.listdir(spLan
1d20: 67 50 61 63 6b 29 3a 0a 20 20 20 20 20 20 20 20  gPack):.        
1d30: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
1d40: 73 64 69 72 28 73 70 4c 61 6e 67 50 61 63 6b 2b  sdir(spLangPack+
1d50: 22 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20  "/"+sf):.       
1d60: 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28       hZip.write(
1d70: 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73  spLangPack+"/"+s
1d80: 66 2c 20 73 41 64 64 50 61 74 68 2b 73 70 4c 61  f, sAddPath+spLa
1d90: 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 29 0a 0a  ngPack+"/"+sf)..
1da0: 0a 64 65 66 20 63 72 65 61 74 65 20 28 73 4c 61  .def create (sLa
1db0: 6e 67 2c 20 78 43 6f 6e 66 69 67 2c 20 62 49 6e  ng, xConfig, bIn
1dc0: 73 74 61 6c 6c 4f 58 54 2c 20 62 4a 61 76 61 53  stallOXT, bJavaS
1dd0: 63 72 69 70 74 2c 20 62 55 73 65 43 61 63 68 65  cript, bUseCache
1de0: 29 3a 0a 20 20 20 20 22 6d 61 6b 65 20 47 72 61  ):.    "make Gra
1df0: 6d 6d 61 6c 65 63 74 65 20 66 6f 72 20 70 72 6f  mmalecte for pro
1e00: 6a 65 63 74 20 3c 73 4c 61 6e 67 3e 22 0a 20 20  ject <sLang>".  
1e10: 20 20 70 72 69 6e 74 28 66 22 3e 3e 3e 3e 20 4d    print(f">>>> M
1e20: 41 4b 45 20 47 43 20 45 4e 47 49 4e 45 3a 20 7b  AKE GC ENGINE: {
1e30: 73 4c 61 6e 67 7d 20 3c 3c 3c 3c 22 29 0a 0a 20  sLang} <<<<").. 
1e40: 20 20 20 23 23 23 23 20 52 45 41 44 20 43 4f 4e     #### READ CON
1e50: 46 49 47 55 52 41 54 49 4f 4e 0a 20 20 20 20 70  FIGURATION.    p
1e60: 72 69 6e 74 28 22 3e 20 72 65 61 64 20 63 6f 6e  rint("> read con
1e70: 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 22 29 0a  figuration...").
1e80: 20 20 20 20 73 70 4c 61 6e 67 20 3d 20 22 67 63      spLang = "gc
1e90: 5f 6c 61 6e 67 2f 22 20 2b 20 73 4c 61 6e 67 0a  _lang/" + sLang.
1ea0: 0a 20 20 20 20 64 56 61 72 73 20 3d 20 78 43 6f  .    dVars = xCo
1eb0: 6e 66 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27  nfig._sections['
1ec0: 61 72 67 73 27 5d 0a 20 20 20 20 64 56 61 72 73  args'].    dVars
1ed0: 5b 27 6c 6f 63 61 6c 65 73 27 5d 20 3d 20 64 56  ['locales'] = dV
1ee0: 61 72 73 5b 22 6c 6f 63 61 6c 65 73 22 5d 2e 72  ars["locales"].r
1ef0: 65 70 6c 61 63 65 28 22 5f 22 2c 20 22 2d 22 29  eplace("_", "-")
1f00: 0a 20 20 20 20 64 56 61 72 73 5b 27 6c 6f 63 27  .    dVars['loc'
1f10: 5d 20 3d 20 73 74 72 28 7b 20 73 3a 20 5b 73 5b  ] = str({ s: [s[
1f20: 30 3a 32 5d 2c 20 73 5b 33 3a 35 5d 2c 20 22 22  0:2], s[3:5], ""
1f30: 5d 20 20 66 6f 72 20 73 20 69 6e 20 64 56 61 72  ]  for s in dVar
1f40: 73 5b 22 6c 6f 63 61 6c 65 73 22 5d 2e 73 70 6c  s["locales"].spl
1f50: 69 74 28 22 20 22 29 20 7d 29 0a 0a 20 20 20 20  it(" ") })..    
1f60: 23 23 20 43 4f 4d 50 49 4c 45 20 52 55 4c 45 53  ## COMPILE RULES
1f70: 0a 20 20 20 20 64 52 65 73 75 6c 74 20 3d 20 63  .    dResult = c
1f80: 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 2e 6d 61 6b  ompile_rules.mak
1f90: 65 28 73 70 4c 61 6e 67 2c 20 64 56 61 72 73 5b  e(spLang, dVars[
1fa0: 27 6c 61 6e 67 27 5d 2c 20 62 55 73 65 43 61 63  'lang'], bUseCac
1fb0: 68 65 29 0a 20 20 20 20 64 56 61 72 73 2e 75 70  he).    dVars.up
1fc0: 64 61 74 65 28 64 52 65 73 75 6c 74 29 0a 0a 20  date(dResult).. 
1fd0: 20 20 20 23 23 20 52 45 41 44 20 47 52 41 4d 4d     ## READ GRAMM
1fe0: 41 52 20 43 48 45 43 4b 45 52 20 50 4c 55 47 49  AR CHECKER PLUGI
1ff0: 4e 53 0a 20 20 20 20 70 72 69 6e 74 28 22 50 59  NS.    print("PY
2000: 54 48 4f 4e 3a 22 29 0a 20 20 20 20 70 72 69 6e  THON:").    prin
2010: 74 28 22 2b 20 50 6c 75 67 69 6e 73 3a 20 22 2c  t("+ Plugins: ",
2020: 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 73 43 6f   end="").    sCo
2030: 64 65 50 6c 75 67 69 6e 73 20 3d 20 22 22 0a 20  dePlugins = "". 
2040: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
2050: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b 22  listdir(spLang+"
2060: 2f 6d 6f 64 75 6c 65 73 22 29 3a 0a 20 20 20 20  /modules"):.    
2070: 20 20 20 20 69 66 20 72 65 2e 6d 61 74 63 68 28      if re.match(
2080: 72 22 67 63 65 5f 5c 77 2b 5b 2e 5d 70 79 24 22  r"gce_\w+[.]py$"
2090: 2c 20 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  , sf):.         
20a0: 20 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73 20     sCodePlugins 
20b0: 2b 3d 20 22 5c 6e 5c 6e 22 20 2b 20 6f 70 65 6e  += "\n\n" + open
20c0: 28 73 70 4c 61 6e 67 2b 27 2f 6d 6f 64 75 6c 65  (spLang+'/module
20d0: 73 2f 27 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63  s/'+sf, "r", enc
20e0: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72  oding="utf-8").r
20f0: 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 20 20  ead().          
2100: 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d    print(sf, end=
2110: 22 2c 20 22 29 0a 20 20 20 20 70 72 69 6e 74 28  ", ").    print(
2120: 29 0a 20 20 20 20 64 56 61 72 73 5b 22 70 6c 75  ).    dVars["plu
2130: 67 69 6e 73 22 5d 20 3d 20 73 43 6f 64 65 50 6c  gins"] = sCodePl
2140: 75 67 69 6e 73 0a 0a 20 20 20 20 23 23 20 43 4f  ugins..    ## CO
2150: 50 59 20 47 43 5f 43 4f 52 45 20 43 4f 4d 4d 4f  PY GC_CORE COMMO
2160: 4e 20 46 49 4c 45 53 0a 20 20 20 20 66 6f 72 20  N FILES.    for 
2170: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
2180: 28 22 67 63 5f 63 6f 72 65 2f 70 79 22 29 3a 0a  ("gc_core/py"):.
2190: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f          if not o
21a0: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63  s.path.isdir("gc
21b0: 5f 63 6f 72 65 2f 70 79 2f 22 2b 73 66 29 3a 0a  _core/py/"+sf):.
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
21d0: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
21e0: 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72 65  emplate("gc_core
21f0: 2f 70 79 2f 22 2b 73 66 2c 20 22 67 72 61 6d 6d  /py/"+sf, "gramm
2200: 61 6c 65 63 74 65 2f 22 2b 73 66 2c 20 64 56 61  alecte/"+sf, dVa
2210: 72 73 29 0a 20 20 20 20 66 69 6c 65 5f 75 74 69  rs).    file_uti
2220: 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 22 33 72 64  l.copy_file("3rd
2230: 2f 62 6f 74 74 6c 65 2e 70 79 22 2c 20 22 67 72  /bottle.py", "gr
2240: 61 6d 6d 61 6c 65 63 74 65 2f 62 6f 74 74 6c 65  ammalecte/bottle
2250: 2e 70 79 22 29 0a 20 20 20 20 6f 70 65 6e 28 22  .py").    open("
2260: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 57 41 52 4e  grammalecte/WARN
2270: 49 4e 47 2e 74 78 74 22 2c 20 22 77 22 2c 20 65  ING.txt", "w", e
2280: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c  ncoding="utf-8",
2290: 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77   newline="\n").w
22a0: 72 69 74 65 28 73 57 61 72 6e 69 6e 67 4d 65 73  rite(sWarningMes
22b0: 73 61 67 65 29 0a 0a 20 20 20 20 23 23 20 43 52  sage)..    ## CR
22c0: 45 41 54 45 20 47 52 41 4d 4d 41 52 20 43 48 45  EATE GRAMMAR CHE
22d0: 43 4b 45 52 20 50 41 43 4b 41 47 45 0a 20 20 20  CKER PACKAGE.   
22e0: 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22 67   spLangPack = "g
22f0: 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 4c 61  rammalecte/"+sLa
2300: 6e 67 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 63  ng.    helpers.c
2310: 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72  reateCleanFolder
2320: 28 73 70 4c 61 6e 67 50 61 63 6b 29 0a 20 20 20  (spLangPack).   
2330: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
2340: 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70  stdir("gc_core/p
2350: 79 2f 6c 61 6e 67 5f 63 6f 72 65 22 29 3a 0a 20  y/lang_core"):. 
2360: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
2370: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63 5f  .path.isdir("gc_
2380: 63 6f 72 65 2f 70 79 2f 6c 61 6e 67 5f 63 6f 72  core/py/lang_cor
2390: 65 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20  e/"+sf):.       
23a0: 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70       helpers.cop
23b0: 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65  yAndFileTemplate
23c0: 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e  ("gc_core/py/lan
23d0: 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73 70 4c  g_core/"+sf, spL
23e0: 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20  angPack+"/"+sf, 
23f0: 64 56 61 72 73 29 0a 20 20 20 20 70 72 69 6e 74  dVars).    print
2400: 28 22 2b 20 4d 6f 64 75 6c 65 73 3a 20 22 2c 20  ("+ Modules: ", 
2410: 65 6e 64 3d 22 22 29 0a 20 20 20 20 66 6f 72 20  end="").    for 
2420: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
2430: 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65  (spLang+"/module
2440: 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  s"):.        if 
2450: 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69 74  not sf.startswit
2460: 68 28 28 22 67 63 65 5f 22 2c 20 22 5f 5f 70 79  h(("gce_", "__py
2470: 63 61 63 68 65 5f 5f 22 29 29 3a 0a 20 20 20 20  cache__")):.    
2480: 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e          helpers.
2490: 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c  copyAndFileTempl
24a0: 61 74 65 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64  ate(spLang+"/mod
24b0: 75 6c 65 73 2f 22 2b 73 66 2c 20 73 70 4c 61 6e  ules/"+sf, spLan
24c0: 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 64 56  gPack+"/"+sf, dV
24d0: 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ars).           
24e0: 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d 22   print(sf, end="
24f0: 2c 20 22 29 0a 20 20 20 20 70 72 69 6e 74 28 29  , ").    print()
2500: 0a 0a 20 20 20 20 23 20 54 45 53 54 20 46 49 4c  ..    # TEST FIL
2510: 45 53 0a 20 20 20 20 77 69 74 68 20 6f 70 65 6e  ES.    with open
2520: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b  ("grammalecte/"+
2530: 73 4c 61 6e 67 2b 22 2f 67 63 5f 74 65 73 74 2e  sLang+"/gc_test.
2540: 74 78 74 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64  txt", "w", encod
2550: 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77  ing="utf-8", new
2560: 6c 69 6e 65 3d 22 5c 6e 22 29 20 61 73 20 68 44  line="\n") as hD
2570: 73 74 50 79 3a 0a 20 20 20 20 20 20 20 20 68 44  stPy:.        hD
2580: 73 74 50 79 2e 77 72 69 74 65 28 22 23 20 54 45  stPy.write("# TE
2590: 53 54 53 20 46 4f 52 20 4c 41 4e 47 20 5b 22 20  STS FOR LANG [" 
25a0: 2b 20 73 4c 61 6e 67 20 2b 20 22 5d 5c 6e 5c 6e  + sLang + "]\n\n
25b0: 22 29 0a 20 20 20 20 20 20 20 20 68 44 73 74 50  ").        hDstP
25c0: 79 2e 77 72 69 74 65 28 64 56 61 72 73 5b 27 67  y.write(dVars['g
25d0: 63 74 65 73 74 73 27 5d 29 0a 20 20 20 20 20 20  ctests']).      
25e0: 20 20 68 44 73 74 50 79 2e 77 72 69 74 65 28 22    hDstPy.write("
25f0: 5c 6e 22 29 0a 0a 20 20 20 20 63 72 65 61 74 65  \n")..    create
2600: 4f 58 54 28 73 70 4c 61 6e 67 2c 20 64 56 61 72  OXT(spLang, dVar
2610: 73 2c 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63 74  s, xConfig._sect
2620: 69 6f 6e 73 5b 27 6f 78 74 27 5d 2c 20 73 70 4c  ions['oxt'], spL
2630: 61 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61 6c  angPack, bInstal
2640: 6c 4f 58 54 29 0a 0a 20 20 20 20 63 72 65 61 74  lOXT)..    creat
2650: 65 50 61 63 6b 61 67 65 5a 69 70 28 64 56 61 72  ePackageZip(dVar
2660: 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a  s, spLangPack)..
2670: 20 20 20 20 23 23 23 23 20 4a 41 56 41 53 43 52      #### JAVASCR
2680: 49 50 54 0a 20 20 20 20 69 66 20 62 4a 61 76 61  IPT.    if bJava
2690: 53 63 72 69 70 74 3a 0a 20 20 20 20 20 20 20 20  Script:.        
26a0: 70 72 69 6e 74 28 22 4a 41 56 41 53 43 52 49 50  print("JAVASCRIP
26b0: 54 3a 22 29 0a 20 20 20 20 20 20 20 20 70 72 69  T:").        pri
26c0: 6e 74 28 22 2b 20 50 6c 75 67 69 6e 73 3a 20 22  nt("+ Plugins: "
26d0: 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 20 20  , end="").      
26e0: 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73 20 3d    sCodePlugins =
26f0: 20 22 22 0a 20 20 20 20 20 20 20 20 66 6f 72 20   "".        for 
2700: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
2710: 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65  (spLang+"/module
2720: 73 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20  s-js"):.        
2730: 20 20 20 20 69 66 20 72 65 2e 6d 61 74 63 68 28      if re.match(
2740: 72 22 67 63 65 5f 5c 77 2b 5b 2e 5d 6a 73 24 22  r"gce_\w+[.]js$"
2750: 2c 20 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  , sf):.         
2760: 20 20 20 20 20 20 20 73 43 6f 64 65 50 6c 75 67         sCodePlug
2770: 69 6e 73 20 2b 3d 20 22 5c 6e 5c 6e 22 20 2b 20  ins += "\n\n" + 
2780: 6f 70 65 6e 28 73 70 4c 61 6e 67 2b 27 2f 6d 6f  open(spLang+'/mo
2790: 64 75 6c 65 73 2d 6a 73 2f 27 2b 73 66 2c 20 22  dules-js/'+sf, "
27a0: 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  r", encoding="ut
27b0: 66 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20 20  f-8").read().   
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
27d0: 6e 74 28 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29  nt(sf, end=", ")
27e0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 29  .        print()
27f0: 0a 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 22  .        dVars["
2800: 70 6c 75 67 69 6e 73 4a 53 22 5d 20 3d 20 73 43  pluginsJS"] = sC
2810: 6f 64 65 50 6c 75 67 69 6e 73 0a 0a 20 20 20 20  odePlugins..    
2820: 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20 64 61      # options da
2830: 74 61 20 73 74 72 75 63 74 0a 20 20 20 20 20 20  ta struct.      
2840: 20 20 64 56 61 72 73 5b 22 64 4f 70 74 4a 61 76    dVars["dOptJav
2850: 61 53 63 72 69 70 74 22 5d 20 3d 20 6a 73 6f 6e  aScript"] = json
2860: 2e 64 75 6d 70 73 28 6c 69 73 74 28 64 56 61 72  .dumps(list(dVar
2870: 73 5b 22 64 4f 70 74 4a 61 76 61 53 63 72 69 70  s["dOptJavaScrip
2880: 74 22 5d 2e 69 74 65 6d 73 28 29 29 29 0a 20 20  t"].items())).  
2890: 20 20 20 20 20 20 64 56 61 72 73 5b 22 64 4f 70        dVars["dOp
28a0: 74 46 69 72 65 66 6f 78 22 5d 20 3d 20 6a 73 6f  tFirefox"] = jso
28b0: 6e 2e 64 75 6d 70 73 28 6c 69 73 74 28 64 56 61  n.dumps(list(dVa
28c0: 72 73 5b 22 64 4f 70 74 46 69 72 65 66 6f 78 22  rs["dOptFirefox"
28d0: 5d 2e 69 74 65 6d 73 28 29 29 29 0a 20 20 20 20  ].items())).    
28e0: 20 20 20 20 64 56 61 72 73 5b 22 64 4f 70 74 54      dVars["dOptT
28f0: 68 75 6e 64 65 72 62 69 72 64 22 5d 20 3d 20 6a  hunderbird"] = j
2900: 73 6f 6e 2e 64 75 6d 70 73 28 6c 69 73 74 28 64  son.dumps(list(d
2910: 56 61 72 73 5b 22 64 4f 70 74 54 68 75 6e 64 65  Vars["dOptThunde
2920: 72 62 69 72 64 22 5d 2e 69 74 65 6d 73 28 29 29  rbird"].items())
2930: 29 0a 0a 20 20 20 20 20 20 20 20 23 20 63 72 65  )..        # cre
2940: 61 74 65 20 66 6f 6c 64 65 72 0a 20 20 20 20 20  ate folder.     
2950: 20 20 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20     spLangPack = 
2960: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
2970: 22 2b 73 4c 61 6e 67 0a 20 20 20 20 20 20 20 20  "+sLang.        
2980: 68 65 6c 70 65 72 73 2e 63 72 65 61 74 65 43 6c  helpers.createCl
2990: 65 61 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67  eanFolder(spLang
29a0: 50 61 63 6b 29 0a 0a 20 20 20 20 20 20 20 20 23  Pack)..        #
29b0: 20 63 72 65 61 74 65 20 66 69 6c 65 73 0a 20 20   create files.  
29c0: 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20        for sf in 
29d0: 6f 73 2e 6c 69 73 74 64 69 72 28 22 6a 73 5f 65  os.listdir("js_e
29e0: 78 74 65 6e 73 69 6f 6e 22 29 3a 0a 20 20 20 20  xtension"):.    
29f0: 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 73 66          dVars[sf
2a00: 5b 3a 2d 33 5d 5d 20 3d 20 6f 70 65 6e 28 22 6a  [:-3]] = open("j
2a10: 73 5f 65 78 74 65 6e 73 69 6f 6e 2f 22 2b 73 66  s_extension/"+sf
2a20: 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d  , "r", encoding=
2a30: 22 75 74 66 2d 38 22 29 2e 72 65 61 64 28 29 0a  "utf-8").read().
2a40: 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69          for sf i
2a50: 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63  n os.listdir("gc
2a60: 5f 63 6f 72 65 2f 6a 73 22 29 3a 0a 20 20 20 20  _core/js"):.    
2a70: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f          if not o
2a80: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63  s.path.isdir("gc
2a90: 5f 63 6f 72 65 2f 6a 73 2f 22 2b 73 66 29 20 61  _core/js/"+sf) a
2aa0: 6e 64 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73  nd not sf.starts
2ab0: 77 69 74 68 28 22 6a 73 65 78 5f 22 29 3a 0a 20  with("jsex_"):. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
2ad0: 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69  elpers.copyAndFi
2ae0: 6c 65 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63  leTemplate("gc_c
2af0: 6f 72 65 2f 6a 73 2f 22 2b 73 66 2c 20 22 67 72  ore/js/"+sf, "gr
2b00: 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73  ammalecte-js/"+s
2b10: 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20 20 20  f, dVars).      
2b20: 20 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65    open("grammale
2b30: 63 74 65 2d 6a 73 2f 57 41 52 4e 49 4e 47 2e 74  cte-js/WARNING.t
2b40: 78 74 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69  xt", "w", encodi
2b50: 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c  ng="utf-8", newl
2b60: 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28  ine="\n").write(
2b70: 73 57 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 29  sWarningMessage)
2b80: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 20  .        for sf 
2b90: 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67  in os.listdir("g
2ba0: 63 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e 67 5f 63  c_core/js/lang_c
2bb0: 6f 72 65 22 29 3a 0a 20 20 20 20 20 20 20 20 20  ore"):.         
2bc0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
2bd0: 68 2e 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65  h.isdir("gc_core
2be0: 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b  /js/lang_core/"+
2bf0: 73 66 29 20 61 6e 64 20 73 66 2e 73 74 61 72 74  sf) and sf.start
2c00: 73 77 69 74 68 28 22 67 63 5f 22 29 3a 0a 20 20  swith("gc_"):.  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65                he
2c20: 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c  lpers.copyAndFil
2c30: 65 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f  eTemplate("gc_co
2c40: 72 65 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f  re/js/lang_core/
2c50: 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b  "+sf, spLangPack
2c60: 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a  +"/"+sf, dVars).
2c70: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 2b          print("+
2c80: 20 4d 6f 64 75 6c 65 73 3a 20 22 2c 20 65 6e 64   Modules: ", end
2c90: 3d 22 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72  ="").        for
2ca0: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
2cb0: 72 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c  r(spLang+"/modul
2cc0: 65 73 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20  es-js"):.       
2cd0: 20 20 20 20 20 69 66 20 6e 6f 74 20 73 66 2e 73       if not sf.s
2ce0: 74 61 72 74 73 77 69 74 68 28 22 67 63 65 5f 22  tartswith("gce_"
2cf0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
2d00: 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41     helpers.copyA
2d10: 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73  ndFileTemplate(s
2d20: 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d  pLang+"/modules-
2d30: 6a 73 2f 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50  js/"+sf, spLangP
2d40: 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72  ack+"/"+sf, dVar
2d50: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
2d60: 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64     print(sf, end
2d70: 3d 22 2c 20 22 29 0a 20 20 20 20 20 20 20 20 70  =", ").        p
2d80: 72 69 6e 74 28 29 0a 0a 20 20 20 20 20 20 20 20  rint()..        
2d90: 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20  try:.           
2da0: 20 62 75 69 6c 64 6a 73 20 3d 20 69 6d 70 6f 72   buildjs = impor
2db0: 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75  tlib.import_modu
2dc0: 6c 65 28 22 67 63 5f 6c 61 6e 67 2e 22 2b 73 4c  le("gc_lang."+sL
2dd0: 61 6e 67 2b 22 2e 62 75 69 6c 64 22 29 0a 20 20  ang+".build").  
2de0: 20 20 20 20 20 20 65 78 63 65 70 74 20 49 6d 70        except Imp
2df0: 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20 20 20 20  ortError:.      
2e00: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 4e        print("# N
2e10: 6f 20 63 6f 6d 70 6c 65 6d 65 6e 74 61 72 79 20  o complementary 
2e20: 62 75 69 6c 64 65 72 20 3c 62 75 69 6c 64 2e 70  builder <build.p
2e30: 79 3e 20 69 6e 20 66 6f 6c 64 65 72 20 67 63 5f  y> in folder gc_
2e40: 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 0a 20 20  lang/"+sLang).  
2e50: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
2e60: 20 20 20 20 20 20 20 20 62 75 69 6c 64 6a 73 2e          buildjs.
2e70: 62 75 69 6c 64 28 73 4c 61 6e 67 2c 20 64 56 61  build(sLang, dVa
2e80: 72 73 29 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  rs)..    return 
2e90: 64 56 61 72 73 5b 27 76 65 72 73 69 6f 6e 27 5d  dVars['version']
2ea0: 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72 61 70 68  ...def copyGraph
2eb0: 73 70 65 6c 6c 43 6f 72 65 20 28 62 4a 61 76 61  spellCore (bJava
2ec0: 53 63 72 69 70 74 3d 46 61 6c 73 65 29 3a 0a 20  Script=False):. 
2ed0: 20 20 20 22 63 6f 70 79 20 47 72 61 70 68 73 70     "copy Graphsp
2ee0: 65 6c 6c 20 70 61 63 6b 61 67 65 20 69 6e 20 47  ell package in G
2ef0: 72 61 6d 6d 61 6c 65 63 74 65 20 70 61 63 6b 61  rammalecte packa
2f00: 67 65 22 0a 20 20 20 20 70 72 69 6e 74 28 22 3e  ge".    print(">
2f10: 20 43 6f 70 79 20 47 72 61 70 68 73 70 65 6c 6c   Copy Graphspell
2f20: 20 70 61 63 6b 61 67 65 20 69 6e 20 47 72 61 6d   package in Gram
2f30: 6d 61 6c 65 63 74 65 20 70 61 63 6b 61 67 65 22  malecte package"
2f40: 29 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 63 72  ).    helpers.cr
2f50: 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72 28  eateCleanFolder(
2f60: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  "grammalecte/gra
2f70: 70 68 73 70 65 6c 6c 22 29 0a 20 20 20 20 64 69  phspell").    di
2f80: 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68 28 22 67  r_util.mkpath("g
2f90: 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68  rammalecte/graph
2fa0: 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72  spell/_dictionar
2fb0: 69 65 73 22 29 0a 20 20 20 20 66 6f 72 20 73 66  ies").    for sf
2fc0: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22   in os.listdir("
2fd0: 67 72 61 70 68 73 70 65 6c 6c 22 29 3a 0a 20 20  graphspell"):.  
2fe0: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
2ff0: 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61 70  path.isdir("grap
3000: 68 73 70 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20 20  hspell/"+sf):.  
3010: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75            file_u
3020: 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 22 67  til.copy_file("g
3030: 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66 2c 20  raphspell/"+sf, 
3040: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  "grammalecte/gra
3050: 70 68 73 70 65 6c 6c 22 29 0a 20 20 20 20 69 66  phspell").    if
3060: 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a 20 20   bJavaScript:.  
3070: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 72        helpers.cr
3080: 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72 28  eateCleanFolder(
3090: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
30a0: 67 72 61 70 68 73 70 65 6c 6c 22 29 0a 20 20 20  graphspell").   
30b0: 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b       dir_util.mk
30c0: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
30d0: 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f  e-js/graphspell/
30e0: 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29 0a  _dictionaries").
30f0: 20 20 20 20 20 20 20 20 64 56 61 72 73 20 3d 20          dVars = 
3100: 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73  {}.        for s
3110: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
3120: 22 6a 73 5f 65 78 74 65 6e 73 69 6f 6e 22 29 3a  "js_extension"):
3130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 56 61  .            dVa
3140: 72 73 5b 73 66 5b 3a 2d 33 5d 5d 20 3d 20 6f 70  rs[sf[:-3]] = op
3150: 65 6e 28 22 6a 73 5f 65 78 74 65 6e 73 69 6f 6e  en("js_extension
3160: 2f 22 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63 6f  /"+sf, "r", enco
3170: 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72 65  ding="utf-8").re
3180: 61 64 28 29 0a 20 20 20 20 20 20 20 20 66 6f 72  ad().        for
3190: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
31a0: 72 28 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73  r("graphspell-js
31b0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
31c0: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
31d0: 73 64 69 72 28 22 67 72 61 70 68 73 70 65 6c 6c  sdir("graphspell
31e0: 2d 6a 73 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20  -js/"+sf):.     
31f0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f             file_
3200: 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 22  util.copy_file("
3210: 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f 22 2b  graphspell-js/"+
3220: 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65  sf, "grammalecte
3230: 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 22 29  -js/graphspell")
3240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3250: 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64   helpers.copyAnd
3260: 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 22 67 72  FileTemplate("gr
3270: 61 70 68 73 70 65 6c 6c 2d 6a 73 2f 22 2b 73 66  aphspell-js/"+sf
3280: 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a  , "grammalecte-j
3290: 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73  s/graphspell/"+s
32a0: 66 2c 20 64 56 61 72 73 29 0a 0a 0a 64 65 66 20  f, dVars)...def 
32b0: 63 6f 70 79 47 72 61 70 68 73 70 65 6c 6c 44 69  copyGraphspellDi
32c0: 63 74 69 6f 6e 61 72 69 65 73 20 28 64 56 61 72  ctionaries (dVar
32d0: 73 2c 20 62 4a 61 76 61 53 63 72 69 70 74 3d 46  s, bJavaScript=F
32e0: 61 6c 73 65 2c 20 62 43 6f 6d 6d 75 6e 69 74 79  alse, bCommunity
32f0: 44 69 63 74 3d 46 61 6c 73 65 2c 20 62 50 65 72  Dict=False, bPer
3300: 73 6f 6e 61 6c 44 69 63 74 3d 46 61 6c 73 65 29  sonalDict=False)
3310: 3a 0a 20 20 20 20 22 63 6f 70 79 20 72 65 71 75  :.    "copy requ
3320: 65 73 74 65 64 20 47 72 61 70 68 73 70 65 6c 6c  ested Graphspell
3330: 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 69 6e   dictionaries in
3340: 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 70 61 63   Grammalecte pac
3350: 6b 61 67 65 22 0a 20 20 20 20 70 72 69 6e 74 28  kage".    print(
3360: 22 3e 20 43 6f 70 79 20 72 65 71 75 65 73 74 65  "> Copy requeste
3370: 64 20 47 72 61 70 68 73 70 65 6c 6c 20 64 69 63  d Graphspell dic
3380: 74 69 6f 6e 61 72 69 65 73 20 69 6e 20 47 72 61  tionaries in Gra
3390: 6d 6d 61 6c 65 63 74 65 20 70 61 63 6b 61 67 65  mmalecte package
33a0: 22 29 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69  ").    dVars["di
33b0: 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f  c_main_filename_
33c0: 70 79 22 5d 20 3d 20 22 22 0a 20 20 20 20 64 56  py"] = "".    dV
33d0: 61 72 73 5b 22 64 69 63 5f 6d 61 69 6e 5f 66 69  ars["dic_main_fi
33e0: 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20 22 22  lename_js"] = ""
33f0: 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f  .    dVars["dic_
3400: 63 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61  community_filena
3410: 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20 20  me_py"] = "".   
3420: 20 64 56 61 72 73 5b 22 64 69 63 5f 63 6f 6d 6d   dVars["dic_comm
3430: 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a  unity_filename_j
3440: 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61  s"] = "".    dVa
3450: 72 73 5b 22 64 69 63 5f 70 65 72 73 6f 6e 61 6c  rs["dic_personal
3460: 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 22 5d 20 3d  _filename_py"] =
3470: 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64   "".    dVars["d
3480: 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65  ic_personal_file
3490: 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20 22 22 0a 20  name_js"] = "". 
34a0: 20 20 20 6c 44 69 63 74 20 3d 20 5b 20 28 22 6d     lDict = [ ("m
34b0: 61 69 6e 22 2c 20 73 29 20 20 66 6f 72 20 73 20  ain", s)  for s 
34c0: 69 6e 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69  in dVars['dic_fi
34d0: 6c 65 6e 61 6d 65 73 27 5d 2e 73 70 6c 69 74 28  lenames'].split(
34e0: 22 2c 22 29 20 5d 0a 20 20 20 20 69 66 20 62 43  ",") ].    if bC
34f0: 6f 6d 6d 75 6e 69 74 79 44 69 63 74 3a 0a 20 20  ommunityDict:.  
3500: 20 20 20 20 20 20 6c 44 69 63 74 2e 61 70 70 65        lDict.appe
3510: 6e 64 28 28 22 63 6f 6d 6d 75 6e 69 74 79 22 2c  nd(("community",
3520: 20 64 56 61 72 73 5b 27 64 69 63 5f 63 6f 6d 6d   dVars['dic_comm
3530: 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 27 5d  unity_filename']
3540: 29 29 0a 20 20 20 20 69 66 20 62 50 65 72 73 6f  )).    if bPerso
3550: 6e 61 6c 44 69 63 74 3a 0a 20 20 20 20 20 20 20  nalDict:.       
3560: 20 6c 44 69 63 74 2e 61 70 70 65 6e 64 28 28 22   lDict.append(("
3570: 70 65 72 73 6f 6e 61 6c 22 2c 20 64 56 61 72 73  personal", dVars
3580: 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66  ['dic_personal_f
3590: 69 6c 65 6e 61 6d 65 27 5d 29 29 0a 20 20 20 20  ilename'])).    
35a0: 66 6f 72 20 73 54 79 70 65 2c 20 73 46 69 6c 65  for sType, sFile
35b0: 4e 61 6d 65 20 69 6e 20 6c 44 69 63 74 3a 0a 20  Name in lDict:. 
35c0: 20 20 20 20 20 20 20 73 70 66 50 79 44 69 63 20         spfPyDic 
35d0: 3d 20 66 22 67 72 61 70 68 73 70 65 6c 6c 2f 5f  = f"graphspell/_
35e0: 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 7b 73 46  dictionaries/{sF
35f0: 69 6c 65 4e 61 6d 65 7d 2e 62 64 69 63 22 0a 20  ileName}.bdic". 
3600: 20 20 20 20 20 20 20 73 70 66 4a 53 44 69 63 20         spfJSDic 
3610: 3d 20 66 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a  = f"graphspell-j
3620: 73 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  s/_dictionaries/
3630: 7b 73 46 69 6c 65 4e 61 6d 65 7d 2e 6a 73 6f 6e  {sFileName}.json
3640: 22 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74  ".        if not
3650: 20 6f 73 2e 70 61 74 68 2e 69 73 66 69 6c 65 28   os.path.isfile(
3660: 73 70 66 50 79 44 69 63 29 20 6f 72 20 28 62 4a  spfPyDic) or (bJ
3670: 61 76 61 53 63 72 69 70 74 20 61 6e 64 20 6e 6f  avaScript and no
3680: 74 20 6f 73 2e 70 61 74 68 2e 69 73 66 69 6c 65  t os.path.isfile
3690: 28 73 70 66 4a 53 44 69 63 29 29 3a 0a 20 20 20  (spfJSDic)):.   
36a0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 44 69           buildDi
36b0: 63 74 69 6f 6e 61 72 79 28 64 56 61 72 73 2c 20  ctionary(dVars, 
36c0: 73 54 79 70 65 2c 20 62 4a 61 76 61 53 63 72 69  sType, bJavaScri
36d0: 70 74 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e  pt).        prin
36e0: 74 28 22 20 20 2b 22 2c 20 73 70 66 50 79 44 69  t("  +", spfPyDi
36f0: 63 29 0a 20 20 20 20 20 20 20 20 66 69 6c 65 5f  c).        file_
3700: 75 74 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73  util.copy_file(s
3710: 70 66 50 79 44 69 63 2c 20 22 67 72 61 6d 6d 61  pfPyDic, "gramma
3720: 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c  lecte/graphspell
3730: 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29  /_dictionaries")
3740: 0a 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 27  .        dVars['
3750: 64 69 63 5f 27 2b 73 54 79 70 65 2b 27 5f 66 69  dic_'+sType+'_fi
3760: 6c 65 6e 61 6d 65 5f 70 79 27 5d 20 3d 20 73 46  lename_py'] = sF
3770: 69 6c 65 4e 61 6d 65 20 2b 20 27 2e 62 64 69 63  ileName + '.bdic
3780: 27 0a 20 20 20 20 20 20 20 20 69 66 20 62 4a 61  '.        if bJa
3790: 76 61 53 63 72 69 70 74 3a 0a 20 20 20 20 20 20  vaScript:.      
37a0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 20 20 2b        print("  +
37b0: 22 2c 20 73 70 66 4a 53 44 69 63 29 0a 20 20 20  ", spfJSDic).   
37c0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75 74           file_ut
37d0: 69 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73 70 66  il.copy_file(spf
37e0: 4a 53 44 69 63 2c 20 22 67 72 61 6d 6d 61 6c 65  JSDic, "grammale
37f0: 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c  cte-js/graphspel
3800: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22  l/_dictionaries"
3810: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 56  ).            dV
3820: 61 72 73 5b 27 64 69 63 5f 27 2b 73 54 79 70 65  ars['dic_'+sType
3830: 2b 27 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d  +'_filename_js']
3840: 20 3d 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 27   = sFileName + '
3850: 2e 6a 73 6f 6e 27 0a 20 20 20 20 64 56 61 72 73  .json'.    dVars
3860: 5b 27 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e  ['dic_main_filen
3870: 61 6d 65 5f 70 79 27 5d 20 3d 20 64 56 61 72 73  ame_py'] = dVars
3880: 5b 27 64 69 63 5f 64 65 66 61 75 6c 74 5f 66 69  ['dic_default_fi
3890: 6c 65 6e 61 6d 65 5f 70 79 27 5d 20 2b 20 22 2e  lename_py'] + ".
38a0: 62 64 69 63 22 0a 20 20 20 20 64 56 61 72 73 5b  bdic".    dVars[
38b0: 27 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61  'dic_main_filena
38c0: 6d 65 5f 6a 73 27 5d 20 3d 20 64 56 61 72 73 5b  me_js'] = dVars[
38d0: 27 64 69 63 5f 64 65 66 61 75 6c 74 5f 66 69 6c  'dic_default_fil
38e0: 65 6e 61 6d 65 5f 6a 73 27 5d 20 2b 20 22 2e 6a  ename_js'] + ".j
38f0: 73 6f 6e 22 0a 0a 0a 64 65 66 20 62 75 69 6c 64  son"...def build
3900: 44 69 63 74 69 6f 6e 61 72 79 20 28 64 56 61 72  Dictionary (dVar
3910: 73 2c 20 73 54 79 70 65 2c 20 62 4a 61 76 61 53  s, sType, bJavaS
3920: 63 72 69 70 74 3d 46 61 6c 73 65 29 3a 0a 20 20  cript=False):.  
3930: 20 20 22 62 75 69 6c 64 20 62 69 6e 61 72 79 20    "build binary 
3940: 64 69 63 74 69 6f 6e 61 72 79 20 66 6f 72 20 47  dictionary for G
3950: 72 61 70 68 73 70 65 6c 6c 20 66 72 6f 6d 20 6c  raphspell from l
3960: 65 78 69 63 6f 6e 73 22 0a 20 20 20 20 69 66 20  exicons".    if 
3970: 73 54 79 70 65 20 3d 3d 20 22 6d 61 69 6e 22 3a  sType == "main":
3980: 0a 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53  .        spfLexS
3990: 72 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69  rc = dVars['lexi
39a0: 63 6f 6e 5f 73 72 63 27 5d 0a 20 20 20 20 20 20  con_src'].      
39b0: 20 20 6c 53 66 44 69 63 74 44 73 74 20 3d 20 64    lSfDictDst = d
39c0: 56 61 72 73 5b 27 64 69 63 5f 66 69 6c 65 6e 61  Vars['dic_filena
39d0: 6d 65 73 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29  mes'].split(",")
39e0: 0a 20 20 20 20 20 20 20 20 6c 44 69 63 4e 61 6d  .        lDicNam
39f0: 65 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 6e  e = dVars['dic_n
3a00: 61 6d 65 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29  ame'].split(",")
3a10: 0a 20 20 20 20 20 20 20 20 6c 44 65 73 63 72 69  .        lDescri
3a20: 70 74 69 6f 6e 20 3d 20 64 56 61 72 73 5b 27 64  ption = dVars['d
3a30: 69 63 5f 64 65 73 63 72 69 70 74 69 6f 6e 27 5d  ic_description']
3a40: 2e 73 70 6c 69 74 28 22 2c 22 29 0a 20 20 20 20  .split(",").    
3a50: 20 20 20 20 6c 46 69 6c 74 65 72 20 3d 20 64 56      lFilter = dV
3a60: 61 72 73 5b 27 64 69 63 5f 66 69 6c 74 65 72 27  ars['dic_filter'
3a70: 5d 2e 73 70 6c 69 74 28 22 2c 22 29 0a 20 20 20  ].split(",").   
3a80: 20 20 20 20 20 66 6f 72 20 73 66 44 69 63 74 44       for sfDictD
3a90: 73 74 2c 20 73 44 69 63 4e 61 6d 65 2c 20 73 44  st, sDicName, sD
3aa0: 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 46 69 6c  escription, sFil
3ab0: 74 65 72 20 69 6e 20 7a 69 70 28 6c 53 66 44 69  ter in zip(lSfDi
3ac0: 63 74 44 73 74 2c 20 6c 44 69 63 4e 61 6d 65 2c  ctDst, lDicName,
3ad0: 20 6c 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c   lDescription, l
3ae0: 46 69 6c 74 65 72 29 3a 0a 20 20 20 20 20 20 20  Filter):.       
3af0: 20 20 20 20 20 6c 65 78 5f 62 75 69 6c 64 2e 62       lex_build.b
3b00: 75 69 6c 64 28 73 70 66 4c 65 78 53 72 63 2c 20  uild(spfLexSrc, 
3b10: 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c 20 64  dVars['lang'], d
3b20: 56 61 72 73 5b 27 6c 61 6e 67 5f 6e 61 6d 65 27  Vars['lang_name'
3b30: 5d 2c 20 73 66 44 69 63 74 44 73 74 2c 20 62 4a  ], sfDictDst, bJ
3b40: 61 76 61 53 63 72 69 70 74 2c 20 73 44 69 63 4e  avaScript, sDicN
3b50: 61 6d 65 2c 20 73 44 65 73 63 72 69 70 74 69 6f  ame, sDescriptio
3b60: 6e 2c 20 73 46 69 6c 74 65 72 2c 20 64 56 61 72  n, sFilter, dVar
3b70: 73 5b 27 73 74 65 6d 6d 69 6e 67 5f 6d 65 74 68  s['stemming_meth
3b80: 6f 64 27 5d 2c 20 69 6e 74 28 64 56 61 72 73 5b  od'], int(dVars[
3b90: 27 66 73 61 5f 6d 65 74 68 6f 64 27 5d 29 29 0a  'fsa_method'])).
3ba0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
3bb0: 20 20 69 66 20 73 54 79 70 65 20 3d 3d 20 22 63    if sType == "c
3bc0: 6f 6d 6d 75 6e 69 74 79 22 3a 0a 20 20 20 20 20  ommunity":.     
3bd0: 20 20 20 20 20 20 20 73 70 66 4c 65 78 53 72 63         spfLexSrc
3be0: 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69 63 6f   = dVars['lexico
3bf0: 6e 5f 63 6f 6d 6d 75 6e 69 74 79 5f 73 72 63 27  n_community_src'
3c00: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 66  ].            sf
3c10: 44 69 63 74 44 73 74 20 3d 20 64 56 61 72 73 5b  DictDst = dVars[
3c20: 27 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 66  'dic_community_f
3c30: 69 6c 65 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20  ilename'].      
3c40: 20 20 20 20 20 20 73 44 69 63 4e 61 6d 65 20 3d        sDicName =
3c50: 20 64 56 61 72 73 5b 27 64 69 63 5f 63 6f 6d 6d   dVars['dic_comm
3c60: 75 6e 69 74 79 5f 6e 61 6d 65 27 5d 0a 20 20 20  unity_name'].   
3c70: 20 20 20 20 20 20 20 20 20 73 44 65 73 63 72 69           sDescri
3c80: 70 74 69 6f 6e 20 3d 20 64 56 61 72 73 5b 27 64  ption = dVars['d
3c90: 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 65 73  ic_community_des
3ca0: 63 72 69 70 74 69 6f 6e 27 5d 0a 20 20 20 20 20  cription'].     
3cb0: 20 20 20 65 6c 69 66 20 73 54 79 70 65 20 3d 3d     elif sType ==
3cc0: 20 22 70 65 72 73 6f 6e 61 6c 22 3a 0a 20 20 20   "personal":.   
3cd0: 20 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53           spfLexS
3ce0: 72 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69  rc = dVars['lexi
3cf0: 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63  con_personal_src
3d00: 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  '].            s
3d10: 66 44 69 63 74 44 73 74 20 3d 20 64 56 61 72 73  fDictDst = dVars
3d20: 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66  ['dic_personal_f
3d30: 69 6c 65 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20  ilename'].      
3d40: 20 20 20 20 20 20 73 44 69 63 4e 61 6d 65 20 3d        sDicName =
3d50: 20 64 56 61 72 73 5b 27 64 69 63 5f 70 65 72 73   dVars['dic_pers
3d60: 6f 6e 61 6c 5f 6e 61 6d 65 27 5d 0a 20 20 20 20  onal_name'].    
3d70: 20 20 20 20 20 20 20 20 73 44 65 73 63 72 69 70          sDescrip
3d80: 74 69 6f 6e 20 3d 20 64 56 61 72 73 5b 27 64 69  tion = dVars['di
3d90: 63 5f 70 65 72 73 6f 6e 61 6c 5f 64 65 73 63 72  c_personal_descr
3da0: 69 70 74 69 6f 6e 27 5d 0a 20 20 20 20 20 20 20  iption'].       
3db0: 20 6c 65 78 5f 62 75 69 6c 64 2e 62 75 69 6c 64   lex_build.build
3dc0: 28 73 70 66 4c 65 78 53 72 63 2c 20 64 56 61 72  (spfLexSrc, dVar
3dd0: 73 5b 27 6c 61 6e 67 27 5d 2c 20 64 56 61 72 73  s['lang'], dVars
3de0: 5b 27 6c 61 6e 67 5f 6e 61 6d 65 27 5d 2c 20 73  ['lang_name'], s
3df0: 66 44 69 63 74 44 73 74 2c 20 62 4a 61 76 61 53  fDictDst, bJavaS
3e00: 63 72 69 70 74 2c 20 73 44 69 63 4e 61 6d 65 2c  cript, sDicName,
3e10: 20 73 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 22   sDescription, "
3e20: 22 2c 20 64 56 61 72 73 5b 27 73 74 65 6d 6d 69  ", dVars['stemmi
3e30: 6e 67 5f 6d 65 74 68 6f 64 27 5d 2c 20 69 6e 74  ng_method'], int
3e40: 28 64 56 61 72 73 5b 27 66 73 61 5f 6d 65 74 68  (dVars['fsa_meth
3e50: 6f 64 27 5d 29 29 0a 0a 0a 64 65 66 20 6d 61 69  od']))...def mai
3e60: 6e 20 28 29 3a 0a 20 20 20 20 22 62 75 69 6c 64  n ():.    "build
3e70: 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 77 69 74   Grammalecte wit
3e80: 68 20 72 65 71 75 65 73 74 65 64 20 6f 70 74 69  h requested opti
3e90: 6f 6e 73 22 0a 20 20 20 20 70 72 69 6e 74 28 22  ons".    print("
3ea0: 50 79 74 68 6f 6e 3a 20 22 20 2b 20 73 79 73 2e  Python: " + sys.
3eb0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 69 66 20  version).    if 
3ec0: 73 79 73 2e 76 65 72 73 69 6f 6e 20 3c 20 22 33  sys.version < "3
3ed0: 2e 37 22 3a 0a 20 20 20 20 20 20 20 20 70 72 69  .7":.        pri
3ee0: 6e 74 28 22 50 79 74 68 6f 6e 20 33 2e 37 2b 20  nt("Python 3.7+ 
3ef0: 72 65 71 75 69 72 65 64 22 29 0a 20 20 20 20 20  required").     
3f00: 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 78 50     return.    xP
3f10: 61 72 73 65 72 20 3d 20 61 72 67 70 61 72 73 65  arser = argparse
3f20: 2e 41 72 67 75 6d 65 6e 74 50 61 72 73 65 72 28  .ArgumentParser(
3f30: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
3f40: 64 5f 61 72 67 75 6d 65 6e 74 28 22 6c 61 6e 67  d_argument("lang
3f50: 22 2c 20 74 79 70 65 3d 73 74 72 2c 20 6e 61 72  ", type=str, nar
3f60: 67 73 3d 27 2b 27 2c 20 68 65 6c 70 3d 22 6c 61  gs='+', help="la
3f70: 6e 67 20 70 72 6f 6a 65 63 74 20 74 6f 20 67 65  ng project to ge
3f80: 6e 65 72 61 74 65 20 28 6e 61 6d 65 20 6f 66 20  nerate (name of 
3f90: 66 6f 6c 64 65 72 20 69 6e 20 2f 6c 61 6e 67 29  folder in /lang)
3fa0: 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  ").    xParser.a
3fb0: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 75 63  dd_argument("-uc
3fc0: 22 2c 20 22 2d 2d 75 73 65 5f 63 61 63 68 65 22  ", "--use_cache"
3fd0: 2c 20 68 65 6c 70 3d 22 75 73 65 20 64 61 74 61  , help="use data
3fe0: 20 63 61 63 68 65 20 69 6e 73 74 65 61 64 20 6f   cache instead o
3ff0: 66 20 72 65 62 75 69 6c 64 69 6e 67 20 72 75 6c  f rebuilding rul
4000: 65 73 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  es", action="sto
4010: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
4020: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
4030: 6e 74 28 22 2d 66 72 62 22 2c 20 22 2d 2d 66 6f  nt("-frb", "--fo
4040: 72 63 65 5f 72 65 62 75 69 6c 64 22 2c 20 68 65  rce_rebuild", he
4050: 6c 70 3d 22 66 6f 72 63 65 20 72 65 62 75 69 6c  lp="force rebuil
4060: 64 69 6e 67 20 72 75 6c 65 73 22 2c 20 61 63 74  ding rules", act
4070: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4080: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4090: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 62 22 2c  d_argument("-b",
40a0: 20 22 2d 2d 62 75 69 6c 64 5f 64 61 74 61 22 2c   "--build_data",
40b0: 20 68 65 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75   help="launch bu
40c0: 69 6c 64 5f 64 61 74 61 2e 70 79 20 28 70 61 72  ild_data.py (par
40d0: 74 20 31 20 61 6e 64 20 32 29 22 2c 20 61 63 74  t 1 and 2)", act
40e0: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
40f0: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4100: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 62 62 22  d_argument("-bb"
4110: 2c 20 22 2d 2d 62 75 69 6c 64 5f 64 61 74 61 5f  , "--build_data_
4120: 62 65 66 6f 72 65 22 2c 20 68 65 6c 70 3d 22 6c  before", help="l
4130: 61 75 6e 63 68 20 62 75 69 6c 64 5f 64 61 74 61  aunch build_data
4140: 2e 70 79 20 28 6f 6e 6c 79 20 70 61 72 74 20 31  .py (only part 1
4150: 3a 20 62 65 66 6f 72 65 20 64 69 63 74 69 6f 6e  : before diction
4160: 61 72 79 20 62 75 69 6c 64 69 6e 67 29 22 2c 20  ary building)", 
4170: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
4180: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
4190: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
41a0: 62 61 22 2c 20 22 2d 2d 62 75 69 6c 64 5f 64 61  ba", "--build_da
41b0: 74 61 5f 61 66 74 65 72 22 2c 20 68 65 6c 70 3d  ta_after", help=
41c0: 22 6c 61 75 6e 63 68 20 62 75 69 6c 64 5f 64 61  "launch build_da
41d0: 74 61 2e 70 79 20 28 6f 6e 6c 79 20 70 61 72 74  ta.py (only part
41e0: 20 32 3a 20 62 65 66 6f 72 65 20 64 69 63 74 69   2: before dicti
41f0: 6f 6e 61 72 79 20 62 75 69 6c 64 69 6e 67 29 22  onary building)"
4200: 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f  , action="store_
4210: 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73  true").    xPars
4220: 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28  er.add_argument(
4230: 22 2d 64 22 2c 20 22 2d 2d 64 69 63 74 22 2c 20  "-d", "--dict", 
4240: 68 65 6c 70 3d 22 67 65 6e 65 72 61 74 65 20 46  help="generate F
4250: 53 41 20 64 69 63 74 69 6f 6e 61 72 79 22 2c 20  SA dictionary", 
4260: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
4270: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
4280: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
4290: 74 22 2c 20 22 2d 2d 74 65 73 74 73 22 2c 20 68  t", "--tests", h
42a0: 65 6c 70 3d 22 72 75 6e 20 75 6e 69 74 20 74 65  elp="run unit te
42b0: 73 74 73 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  sts", action="st
42c0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
42d0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
42e0: 65 6e 74 28 22 2d 70 22 2c 20 22 2d 2d 70 65 72  ent("-p", "--per
42f0: 66 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20 70 65  f", help="run pe
4300: 72 66 6f 72 6d 61 6e 63 65 20 74 65 73 74 73 22  rformance tests"
4310: 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f  , action="store_
4320: 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73  true").    xPars
4330: 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28  er.add_argument(
4340: 22 2d 70 6d 22 2c 20 22 2d 2d 70 65 72 66 5f 6d  "-pm", "--perf_m
4350: 65 6d 6f 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20  emo", help="run 
4360: 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65 73 74  performance test
4370: 73 20 61 6e 64 20 73 74 6f 72 65 20 72 65 73 75  s and store resu
4380: 6c 74 73 20 69 6e 20 70 65 72 66 5f 6d 65 6d 6f  lts in perf_memo
4390: 2e 74 78 74 22 2c 20 61 63 74 69 6f 6e 3d 22 73  .txt", action="s
43a0: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
43b0: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
43c0: 6d 65 6e 74 28 22 2d 6a 73 22 2c 20 22 2d 2d 6a  ment("-js", "--j
43d0: 61 76 61 73 63 72 69 70 74 22 2c 20 68 65 6c 70  avascript", help
43e0: 3d 22 4a 61 76 61 53 63 72 69 70 74 20 62 75 69  ="JavaScript bui
43f0: 6c 64 20 66 6f 72 20 46 69 72 65 66 6f 78 22 2c  ld for Firefox",
4400: 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74   action="store_t
4410: 72 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65  rue").    xParse
4420: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
4430: 2d 61 63 64 22 2c 20 22 2d 2d 61 64 64 5f 63 6f  -acd", "--add_co
4440: 6d 6d 75 6e 69 74 79 5f 64 69 63 74 69 6f 6e 61  mmunity_dictiona
4450: 72 79 22 2c 20 68 65 6c 70 3d 22 61 64 64 20 63  ry", help="add c
4460: 6f 6d 6d 75 6e 69 74 79 20 64 69 63 74 69 6f 6e  ommunity diction
4470: 61 72 79 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ary to the build
4480: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4490: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
44a0: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
44b0: 28 22 2d 61 70 64 22 2c 20 22 2d 2d 61 64 64 5f  ("-apd", "--add_
44c0: 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e  personal_diction
44d0: 61 72 79 22 2c 20 68 65 6c 70 3d 22 61 64 64 20  ary", help="add 
44e0: 70 65 72 73 6f 6e 61 6c 20 64 69 63 74 69 6f 6e  personal diction
44f0: 61 72 79 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ary to the build
4500: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4510: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
4520: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4530: 28 22 2d 66 78 22 2c 20 22 2d 2d 66 69 72 65 66  ("-fx", "--firef
4540: 6f 78 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63  ox", help="Launc
4550: 68 20 46 69 72 65 66 6f 78 20 66 6f 72 20 57 65  h Firefox for We
4560: 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73 74 69  bExtension testi
4570: 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  ng", action="sto
4580: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
4590: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
45a0: 6e 74 28 22 2d 66 78 64 22 2c 20 22 2d 2d 66 69  nt("-fxd", "--fi
45b0: 72 65 66 6f 78 5f 64 65 76 22 2c 20 68 65 6c 70  refox_dev", help
45c0: 3d 22 4c 61 75 6e 63 68 20 46 69 72 65 66 6f 78  ="Launch Firefox
45d0: 20 44 65 76 65 6c 6f 70 70 65 72 20 66 6f 72 20   Developper for 
45e0: 57 65 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73  WebExtension tes
45f0: 74 69 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73  ting", action="s
4600: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4610: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4620: 6d 65 6e 74 28 22 2d 66 78 6e 22 2c 20 22 2d 2d  ment("-fxn", "--
4630: 66 69 72 65 66 6f 78 5f 6e 69 67 68 74 6c 79 22  firefox_nightly"
4640: 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20 46  , help="Launch F
4650: 69 72 65 66 6f 78 20 4e 69 67 68 74 6c 79 20 66  irefox Nightly f
4660: 6f 72 20 57 65 62 45 78 74 65 6e 73 69 6f 6e 20  or WebExtension 
4670: 74 65 73 74 69 6e 67 22 2c 20 61 63 74 69 6f 6e  testing", action
4680: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4690: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
46a0: 72 67 75 6d 65 6e 74 28 22 2d 6c 22 2c 20 22 2d  rgument("-l", "-
46b0: 2d 6c 69 6e 74 5f 77 65 62 5f 65 78 74 22 2c 20  -lint_web_ext", 
46c0: 68 65 6c 70 3d 22 77 65 62 2d 65 78 74 20 6c 69  help="web-ext li
46d0: 6e 74 20 6f 6e 20 74 68 65 20 57 65 62 45 78 74  nt on the WebExt
46e0: 65 6e 73 69 6f 6e 22 2c 20 61 63 74 69 6f 6e 3d  ension", action=
46f0: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
4700: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
4710: 67 75 6d 65 6e 74 28 22 2d 74 62 22 2c 20 22 2d  gument("-tb", "-
4720: 2d 74 68 75 6e 64 65 72 62 69 72 64 22 2c 20 68  -thunderbird", h
4730: 65 6c 70 3d 22 4c 61 75 6e 63 68 20 54 68 75 6e  elp="Launch Thun
4740: 64 65 72 62 69 72 64 22 2c 20 61 63 74 69 6f 6e  derbird", action
4750: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4760: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
4770: 72 67 75 6d 65 6e 74 28 22 2d 74 62 62 22 2c 20  rgument("-tbb", 
4780: 22 2d 2d 74 68 75 6e 64 65 72 62 69 72 64 5f 62  "--thunderbird_b
4790: 65 74 61 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e  eta", help="Laun
47a0: 63 68 20 54 68 75 6e 64 65 72 62 69 72 64 20 42  ch Thunderbird B
47b0: 65 74 61 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  eta", action="st
47c0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
47d0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
47e0: 65 6e 74 28 22 2d 69 22 2c 20 22 2d 2d 69 6e 73  ent("-i", "--ins
47f0: 74 61 6c 6c 22 2c 20 68 65 6c 70 3d 22 69 6e 73  tall", help="ins
4800: 74 61 6c 6c 20 74 68 65 20 65 78 74 65 6e 73 69  tall the extensi
4810: 6f 6e 20 69 6e 20 57 72 69 74 65 72 20 28 70 61  on in Writer (pa
4820: 74 68 20 6f 66 20 75 6e 6f 70 6b 67 20 6d 75 73  th of unopkg mus
4830: 74 20 62 65 20 73 65 74 20 69 6e 20 63 6f 6e 66  t be set in conf
4840: 69 67 2e 69 6e 69 29 22 2c 20 61 63 74 69 6f 6e  ig.ini)", action
4850: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4860: 20 20 20 78 41 72 67 73 20 3d 20 78 50 61 72 73     xArgs = xPars
4870: 65 72 2e 70 61 72 73 65 5f 61 72 67 73 28 29 0a  er.parse_args().
4880: 0a 20 20 20 20 6f 4e 6f 77 20 3d 20 64 61 74 65  .    oNow = date
4890: 74 69 6d 65 2e 64 61 74 65 74 69 6d 65 2e 6e 6f  time.datetime.no
48a0: 77 28 29 0a 20 20 20 20 70 72 69 6e 74 28 22 3d  w().    print("=
48b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 4d 41  ============= MA
48c0: 4b 45 20 47 52 41 4d 4d 41 4c 45 43 54 45 20 61  KE GRAMMALECTE a
48d0: 74 20 7b 30 2e 68 6f 75 72 3a 3e 32 7d 20 68 20  t {0.hour:>2} h 
48e0: 7b 30 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d 69  {0.minute:>2} mi
48f0: 6e 20 7b 30 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20  n {0.second:>2} 
4900: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  s ==============
4910: 22 2e 66 6f 72 6d 61 74 28 6f 4e 6f 77 29 29 0a  ".format(oNow)).
4920: 0a 20 20 20 20 69 66 20 78 41 72 67 73 2e 62 75  .    if xArgs.bu
4930: 69 6c 64 5f 64 61 74 61 3a 0a 20 20 20 20 20 20  ild_data:.      
4940: 20 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61    xArgs.build_da
4950: 74 61 5f 62 65 66 6f 72 65 20 3d 20 54 72 75 65  ta_before = True
4960: 0a 20 20 20 20 20 20 20 20 78 41 72 67 73 2e 62  .        xArgs.b
4970: 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 20  uild_data_after 
4980: 3d 20 54 72 75 65 0a 0a 20 20 20 20 64 69 72 5f  = True..    dir_
4990: 75 74 69 6c 2e 6d 6b 70 61 74 68 28 22 5f 62 75  util.mkpath("_bu
49a0: 69 6c 64 22 29 0a 20 20 20 20 64 69 72 5f 75 74  ild").    dir_ut
49b0: 69 6c 2e 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d  il.mkpath("gramm
49c0: 61 6c 65 63 74 65 22 29 0a 20 20 20 20 69 66 20  alecte").    if 
49d0: 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74  xArgs.javascript
49e0: 3a 0a 20 20 20 20 20 20 20 20 64 69 72 5f 75 74  :.        dir_ut
49f0: 69 6c 2e 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d  il.mkpath("gramm
4a00: 61 6c 65 63 74 65 2d 6a 73 22 29 0a 0a 20 20 20  alecte-js")..   
4a10: 20 63 6f 70 79 47 72 61 70 68 73 70 65 6c 6c 43   copyGraphspellC
4a20: 6f 72 65 28 78 41 72 67 73 2e 6a 61 76 61 73 63  ore(xArgs.javasc
4a30: 72 69 70 74 29 0a 0a 20 20 20 20 66 6f 72 20 73  ript)..    for s
4a40: 4c 61 6e 67 20 69 6e 20 78 41 72 67 73 2e 6c 61  Lang in xArgs.la
4a50: 6e 67 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6f  ng:.        if o
4a60: 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28 22 67  s.path.exists("g
4a70: 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 20  c_lang/"+sLang) 
4a80: 61 6e 64 20 6f 73 2e 70 61 74 68 2e 69 73 64 69  and os.path.isdi
4a90: 72 28 22 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61  r("gc_lang/"+sLa
4aa0: 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ng):.           
4ab0: 20 78 43 6f 6e 66 69 67 20 3d 20 67 65 74 43 6f   xConfig = getCo
4ac0: 6e 66 69 67 28 73 4c 61 6e 67 29 0a 20 20 20 20  nfig(sLang).    
4ad0: 20 20 20 20 20 20 20 20 64 56 61 72 73 20 3d 20          dVars = 
4ae0: 78 43 6f 6e 66 69 67 2e 5f 73 65 63 74 69 6f 6e  xConfig._section
4af0: 73 5b 27 61 72 67 73 27 5d 0a 0a 20 20 20 20 20  s['args']..     
4b00: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 64 56         if not dV
4b10: 61 72 73 5b 22 6c 65 78 69 63 6f 6e 5f 63 6f 6d  ars["lexicon_com
4b20: 6d 75 6e 69 74 79 5f 73 72 63 22 5d 3a 0a 20 20  munity_src"]:.  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41                xA
4b40: 72 67 73 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74  rgs.add_communit
4b50: 79 5f 64 69 63 74 69 6f 6e 61 72 79 20 3d 20 46  y_dictionary = F
4b60: 61 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  alse.           
4b70: 20 69 66 20 6e 6f 74 20 64 56 61 72 73 5b 22 6c   if not dVars["l
4b80: 65 78 69 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f  exicon_personal_
4b90: 73 72 63 22 5d 3a 0a 20 20 20 20 20 20 20 20 20  src"]:.         
4ba0: 20 20 20 20 20 20 20 78 41 72 67 73 2e 61 64 64         xArgs.add
4bb0: 5f 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f  _personal_dictio
4bc0: 6e 61 72 79 20 3d 20 46 61 6c 73 65 0a 0a 20 20  nary = False..  
4bd0: 20 20 20 20 20 20 20 20 20 20 23 20 62 75 69 6c            # buil
4be0: 64 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 20  d data.         
4bf0: 20 20 20 64 61 74 61 62 75 69 6c 64 20 3d 20 4e     databuild = N
4c00: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
4c10: 69 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64  if xArgs.build_d
4c20: 61 74 61 5f 62 65 66 6f 72 65 20 6f 72 20 78 41  ata_before or xA
4c30: 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 61  rgs.build_data_a
4c40: 66 74 65 72 3a 0a 20 20 20 20 20 20 20 20 20 20  fter:.          
4c50: 20 20 20 20 20 20 23 20 6c 61 6e 67 20 64 61 74        # lang dat
4c60: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
4c70: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
4c80: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
4c90: 75 69 6c 64 20 3d 20 69 6d 70 6f 72 74 6c 69 62  uild = importlib
4ca0: 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c 65 28 22  .import_module("
4cb0: 67 63 5f 6c 61 6e 67 2e 22 2b 73 4c 61 6e 67 2b  gc_lang."+sLang+
4cc0: 22 2e 62 75 69 6c 64 5f 64 61 74 61 22 29 0a 20  ".build_data"). 
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
4ce0: 78 63 65 70 74 20 49 6d 70 6f 72 74 45 72 72 6f  xcept ImportErro
4cf0: 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r:.             
4d00: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
4d10: 45 72 72 6f 72 2e 20 43 6f 75 6c 64 6e e2 80 99  Error. Couldn...
4d20: 74 20 69 6d 70 6f 72 74 20 66 69 6c 65 20 62 75  t import file bu
4d30: 69 6c 64 5f 64 61 74 61 2e 70 79 20 69 6e 20 66  ild_data.py in f
4d40: 6f 6c 64 65 72 20 67 63 5f 6c 61 6e 67 2f 22 2b  older gc_lang/"+
4d50: 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 20  sLang).         
4d60: 20 20 20 69 66 20 64 61 74 61 62 75 69 6c 64 20     if databuild 
4d70: 61 6e 64 20 78 41 72 67 73 2e 62 75 69 6c 64 5f  and xArgs.build_
4d80: 64 61 74 61 5f 62 65 66 6f 72 65 3a 0a 20 20 20  data_before:.   
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
4da0: 61 62 75 69 6c 64 2e 62 65 66 6f 72 65 28 27 67  abuild.before('g
4db0: 63 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c 20  c_lang/'+sLang, 
4dc0: 64 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76  dVars, xArgs.jav
4dd0: 61 73 63 72 69 70 74 29 0a 20 20 20 20 20 20 20  ascript).       
4de0: 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 64 69       if xArgs.di
4df0: 63 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct:.            
4e00: 20 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f 6e      buildDiction
4e10: 61 72 79 28 64 56 61 72 73 2c 20 22 6d 61 69 6e  ary(dVars, "main
4e20: 22 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72  ", xArgs.javascr
4e30: 69 70 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  ipt).           
4e40: 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 61 64       if xArgs.ad
4e50: 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63 74  d_community_dict
4e60: 69 6f 6e 61 72 79 3a 0a 20 20 20 20 20 20 20 20  ionary:.        
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c              buil
4e80: 64 44 69 63 74 69 6f 6e 61 72 79 28 64 56 61 72  dDictionary(dVar
4e90: 73 2c 20 22 63 6f 6d 6d 75 6e 69 74 79 22 2c 20  s, "community", 
4ea0: 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74  xArgs.javascript
4eb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4ec0: 20 20 69 66 20 78 41 72 67 73 2e 61 64 64 5f 70    if xArgs.add_p
4ed0: 65 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61  ersonal_dictiona
4ee0: 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry:.            
4ef0: 20 20 20 20 20 20 20 20 62 75 69 6c 64 44 69 63          buildDic
4f00: 74 69 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 22  tionary(dVars, "
4f10: 70 65 72 73 6f 6e 61 6c 22 2c 20 78 41 72 67 73  personal", xArgs
4f20: 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20 20 20  .javascript).   
4f30: 20 20 20 20 20 20 20 20 20 69 66 20 64 61 74 61           if data
4f40: 62 75 69 6c 64 20 61 6e 64 20 78 41 72 67 73 2e  build and xArgs.
4f50: 62 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65 72  build_data_after
4f60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4f70: 20 20 64 61 74 61 62 75 69 6c 64 2e 61 66 74 65    databuild.afte
4f80: 72 28 27 67 63 5f 6c 61 6e 67 2f 27 2b 73 4c 61  r('gc_lang/'+sLa
4f90: 6e 67 2c 20 64 56 61 72 73 2c 20 78 41 72 67 73  ng, dVars, xArgs
4fa0: 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 0a 20 20  .javascript)..  
4fb0: 20 20 20 20 20 20 20 20 20 20 23 20 63 6f 70 79            # copy
4fc0: 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 66 72   dictionaries fr
4fd0: 6f 6d 20 47 72 61 70 68 73 70 65 6c 6c 0a 20 20  om Graphspell.  
4fe0: 20 20 20 20 20 20 20 20 20 20 63 6f 70 79 47 72            copyGr
4ff0: 61 70 68 73 70 65 6c 6c 44 69 63 74 69 6f 6e 61  aphspellDictiona
5000: 72 69 65 73 28 64 56 61 72 73 2c 20 78 41 72 67  ries(dVars, xArg
5010: 73 2e 6a 61 76 61 73 63 72 69 70 74 2c 20 78 41  s.javascript, xA
5020: 72 67 73 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74  rgs.add_communit
5030: 79 5f 64 69 63 74 69 6f 6e 61 72 79 2c 20 78 41  y_dictionary, xA
5040: 72 67 73 2e 61 64 64 5f 70 65 72 73 6f 6e 61 6c  rgs.add_personal
5050: 5f 64 69 63 74 69 6f 6e 61 72 79 29 0a 0a 20 20  _dictionary)..  
5060: 20 20 20 20 20 20 20 20 20 20 23 20 6d 61 6b 65            # make
5070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 55 73  .            bUs
5080: 65 43 61 63 68 65 20 3d 20 4e 6f 6e 65 20 20 20  eCache = None   
5090: 20 20 20 20 20 20 20 20 20 23 20 77 65 20 6d 61           # we ma
50a0: 79 20 72 65 62 75 69 6c 64 20 69 66 20 69 74 e2  y rebuild if it.
50b0: 80 99 73 20 6e 65 63 65 73 73 61 72 79 0a 20 20  ..s necessary.  
50c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
50d0: 67 73 2e 75 73 65 5f 63 61 63 68 65 3a 0a 20 20  gs.use_cache:.  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 55                bU
50f0: 73 65 43 61 63 68 65 20 3d 20 54 72 75 65 20 20  seCache = True  
5100: 20 20 20 20 20 20 23 20 77 65 20 75 73 65 20 74        # we use t
5110: 68 65 20 63 61 63 68 65 20 69 66 20 69 74 20 65  he cache if it e
5120: 78 69 73 74 73 0a 20 20 20 20 20 20 20 20 20 20  xists.          
5130: 20 20 69 66 20 78 41 72 67 73 2e 66 6f 72 63 65    if xArgs.force
5140: 5f 72 65 62 75 69 6c 64 3a 0a 20 20 20 20 20 20  _rebuild:.      
5150: 20 20 20 20 20 20 20 20 20 20 62 55 73 65 43 61            bUseCa
5160: 63 68 65 20 3d 20 46 61 6c 73 65 20 20 20 20 20  che = False     
5170: 20 20 23 20 77 65 20 72 65 62 75 69 6c 64 0a 20    # we rebuild. 
5180: 20 20 20 20 20 20 20 20 20 20 20 73 56 65 72 73             sVers
5190: 69 6f 6e 20 3d 20 63 72 65 61 74 65 28 73 4c 61  ion = create(sLa
51a0: 6e 67 2c 20 78 43 6f 6e 66 69 67 2c 20 78 41 72  ng, xConfig, xAr
51b0: 67 73 2e 69 6e 73 74 61 6c 6c 2c 20 78 41 72 67  gs.install, xArg
51c0: 73 2e 6a 61 76 61 73 63 72 69 70 74 2c 20 62 55  s.javascript, bU
51d0: 73 65 43 61 63 68 65 29 0a 0a 20 20 20 20 20 20  seCache)..      
51e0: 20 20 20 20 20 20 23 20 54 65 73 74 73 0a 20 20        # Tests.  
51f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
5200: 67 73 2e 74 65 73 74 73 3a 0a 20 20 20 20 20 20  gs.tests:.      
5210: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
5220: 22 3e 20 52 75 6e 6e 69 6e 67 20 74 65 73 74 73  "> Running tests
5230: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
5240: 20 20 20 6c 54 65 73 74 4d 6f 64 75 6c 65 73 20     lTestModules 
5250: 3d 20 5b 66 22 67 72 61 6d 6d 61 6c 65 63 74 65  = [f"grammalecte
5260: 2e 7b 73 4c 61 6e 67 7d 2e 74 65 73 74 73 5f 63  .{sLang}.tests_c
5270: 6f 72 65 22 2c 20 5c 0a 20 20 20 20 20 20 20 20  ore", \.        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 20 20 20 20 20 20 66 22 67 72 61 6d 6d 61          f"gramma
52a0: 6c 65 63 74 65 2e 7b 73 4c 61 6e 67 7d 2e 74 65  lecte.{sLang}.te
52b0: 73 74 73 5f 6d 6f 64 75 6c 65 73 22 5d 0a 20 20  sts_modules"].  
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 54                xT
52d0: 65 73 74 53 75 69 74 65 20 3d 20 75 6e 69 74 74  estSuite = unitt
52e0: 65 73 74 2e 54 65 73 74 4c 6f 61 64 65 72 28 29  est.TestLoader()
52f0: 2e 6c 6f 61 64 54 65 73 74 73 46 72 6f 6d 4e 61  .loadTestsFromNa
5300: 6d 65 73 28 6c 54 65 73 74 4d 6f 64 75 6c 65 73  mes(lTestModules
5310: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5320: 20 20 75 6e 69 74 74 65 73 74 2e 54 65 78 74 54    unittest.TextT
5330: 65 73 74 52 75 6e 6e 65 72 28 29 2e 72 75 6e 28  estRunner().run(
5340: 78 54 65 73 74 53 75 69 74 65 29 0a 0a 20 20 20  xTestSuite)..   
5350: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5360: 73 2e 70 65 72 66 20 6f 72 20 78 41 72 67 73 2e  s.perf or xArgs.
5370: 70 65 72 66 5f 6d 65 6d 6f 3a 0a 20 20 20 20 20  perf_memo:.     
5380: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 3a 0a             try:.
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 74 65 73 74 73 20 3d 20 69 6d 70 6f      tests = impo
53b0: 72 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64  rtlib.import_mod
53c0: 75 6c 65 28 66 22 67 72 61 6d 6d 61 6c 65 63 74  ule(f"grammalect
53d0: 65 2e 7b 73 4c 61 6e 67 7d 2e 74 65 73 74 73 5f  e.{sLang}.tests_
53e0: 63 6f 72 65 22 29 0a 20 20 20 20 20 20 20 20 20  core").         
53f0: 20 20 20 20 20 20 20 65 78 63 65 70 74 20 49 6d         except Im
5400: 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20 20 20  portError:.     
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5420: 72 69 6e 74 28 66 22 23 20 45 72 72 6f 72 2e 20  rint(f"# Error. 
5430: 49 6d 70 6f 72 74 20 66 61 69 6c 65 64 3a 20 67  Import failed: g
5440: 72 61 6d 6d 61 6c 65 63 74 65 2e 7b 73 4c 61 6e  rammalecte.{sLan
5450: 67 7d 2e 74 65 73 74 73 5f 63 6f 72 65 22 29 0a  g}.tests_core").
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
5480: 20 20 20 20 20 20 20 20 20 20 73 52 65 73 75 6c            sResul
5490: 74 46 69 6c 65 20 3d 20 66 22 67 63 5f 6c 61 6e  tFile = f"gc_lan
54a0: 67 2f 7b 73 4c 61 6e 67 7d 2f 70 65 72 66 5f 6d  g/{sLang}/perf_m
54b0: 65 6d 6f 2e 74 65 78 74 22 20 20 69 66 20 78 41  emo.text"  if xA
54c0: 72 67 73 2e 70 65 72 66 5f 6d 65 6d 6f 20 20 65  rgs.perf_memo  e
54d0: 6c 73 65 20 22 22 0a 20 20 20 20 20 20 20 20 20  lse "".         
54e0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 73             tests
54f0: 2e 70 65 72 66 28 73 56 65 72 73 69 6f 6e 2c 20  .perf(sVersion, 
5500: 73 52 65 73 75 6c 74 46 69 6c 65 29 0a 0a 20 20  sResultFile)..  
5510: 20 20 20 20 20 20 20 20 20 20 23 20 4a 61 76 61            # Java
5520: 53 63 72 69 70 74 20 6c 69 6e 74 65 72 0a 20 20  Script linter.  
5530: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
5540: 67 73 2e 6c 69 6e 74 5f 77 65 62 5f 65 78 74 3a  gs.lint_web_ext:
5550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5560: 20 77 69 74 68 20 68 65 6c 70 65 72 73 2e 43 44   with helpers.CD
5570: 28 22 5f 62 75 69 6c 64 2f 77 65 62 65 78 74 2f  ("_build/webext/
5580: 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20 20 20 20  "+sLang):.      
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
55a0: 2e 73 79 73 74 65 6d 28 72 27 77 65 62 2d 65 78  .system(r'web-ex
55b0: 74 20 6c 69 6e 74 20 2d 6f 20 74 65 78 74 27 29  t lint -o text')
55c0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
55d0: 46 69 72 65 66 6f 78 0a 20 20 20 20 20 20 20 20  Firefox.        
55e0: 20 20 20 20 69 66 20 78 41 72 67 73 2e 66 69 72      if xArgs.fir
55f0: 65 66 6f 78 3a 20 20 20 20 20 20 20 20 20 20 20  efox:           
5600: 23 20 46 69 72 65 66 6f 78 0a 20 20 20 20 20 20  # Firefox.      
5610: 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20 68            with h
5620: 65 6c 70 65 72 73 2e 43 44 28 22 5f 62 75 69 6c  elpers.CD("_buil
5630: 64 2f 77 65 62 65 78 74 2f 22 2b 73 4c 61 6e 67  d/webext/"+sLang
5640: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
5650: 20 20 20 20 20 20 20 73 70 66 46 69 72 65 66 6f         spfFirefo
5660: 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f 66  x = dVars['win_f
5670: 78 5f 70 61 74 68 27 5d 20 20 69 66 20 70 6c 61  x_path']  if pla
5680: 74 66 6f 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d  tform.system() =
5690: 3d 20 22 57 69 6e 64 6f 77 73 22 20 20 65 6c 73  = "Windows"  els
56a0: 65 20 64 56 61 72 73 5b 27 6c 69 6e 75 78 5f 66  e dVars['linux_f
56b0: 78 5f 70 61 74 68 27 5d 0a 20 20 20 20 20 20 20  x_path'].       
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e               os.
56d0: 73 79 73 74 65 6d 28 72 27 77 65 62 2d 65 78 74  system(r'web-ext
56e0: 20 72 75 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22   run --firefox="
56f0: 27 20 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b  ' + spfFirefox +
5700: 20 27 22 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f   '" --browser-co
5710: 6e 73 6f 6c 65 27 29 0a 20 20 20 20 20 20 20 20  nsole').        
5720: 20 20 20 20 69 66 20 78 41 72 67 73 2e 66 69 72      if xArgs.fir
5730: 65 66 6f 78 5f 64 65 76 3a 20 20 20 20 20 20 20  efox_dev:       
5740: 23 20 46 69 72 65 66 6f 78 20 44 65 76 65 6c 6f  # Firefox Develo
5750: 70 65 72 20 65 64 69 74 69 6f 6e 0a 20 20 20 20  per edition.    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68              with
5770: 20 68 65 6c 70 65 72 73 2e 43 44 28 22 5f 62 75   helpers.CD("_bu
5780: 69 6c 64 2f 77 65 62 65 78 74 2f 22 2b 73 4c 61  ild/webext/"+sLa
5790: 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ng):.           
57a0: 20 20 20 20 20 20 20 20 20 73 70 66 46 69 72 65           spfFire
57b0: 66 6f 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e  fox = dVars['win
57c0: 5f 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 20 20  _fx_dev_path']  
57d0: 69 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74  if platform.syst
57e0: 65 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73  em() == "Windows
57f0: 22 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c  "  else dVars['l
5800: 69 6e 75 78 5f 66 78 5f 64 65 76 5f 70 61 74 68  inux_fx_dev_path
5810: 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '].             
5820: 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65 6d         os.system
5830: 28 72 27 77 65 62 2d 65 78 74 20 72 75 6e 20 2d  (r'web-ext run -
5840: 2d 66 69 72 65 66 6f 78 3d 22 27 20 2b 20 73 70  -firefox="' + sp
5850: 66 46 69 72 65 66 6f 78 20 2b 20 27 22 20 2d 2d  fFirefox + '" --
5860: 62 72 6f 77 73 65 72 2d 63 6f 6e 73 6f 6c 65 27  browser-console'
5870: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ).            if
5880: 20 78 41 72 67 73 2e 66 69 72 65 66 6f 78 5f 6e   xArgs.firefox_n
5890: 69 67 68 74 6c 79 3a 20 20 20 23 20 46 69 72 65  ightly:   # Fire
58a0: 66 6f 78 20 4e 69 67 68 74 6c 79 20 65 64 69 74  fox Nightly edit
58b0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
58c0: 20 20 20 20 77 69 74 68 20 68 65 6c 70 65 72 73      with helpers
58d0: 2e 43 44 28 22 5f 62 75 69 6c 64 2f 77 65 62 65  .CD("_build/webe
58e0: 78 74 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20  xt/"+sLang):.   
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 73 70 66 46 69 72 65 66 6f 78 20 3d 20 64 56   spfFirefox = dV
5910: 61 72 73 5b 27 77 69 6e 5f 66 78 5f 6e 69 67 68  ars['win_fx_nigh
5920: 74 6c 79 5f 70 61 74 68 27 5d 20 20 69 66 20 70  tly_path']  if p
5930: 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65 6d 28 29  latform.system()
5940: 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22 20 20 65   == "Windows"  e
5950: 6c 73 65 20 64 56 61 72 73 5b 27 6c 69 6e 75 78  lse dVars['linux
5960: 5f 66 78 5f 6e 69 67 68 74 6c 79 5f 70 61 74 68  _fx_nightly_path
5970: 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '].             
5980: 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65 6d         os.system
5990: 28 72 27 77 65 62 2d 65 78 74 20 72 75 6e 20 2d  (r'web-ext run -
59a0: 2d 66 69 72 65 66 6f 78 3d 22 27 20 2b 20 73 70  -firefox="' + sp
59b0: 66 46 69 72 65 66 6f 78 20 2b 20 27 22 20 2d 2d  fFirefox + '" --
59c0: 62 72 6f 77 73 65 72 2d 63 6f 6e 73 6f 6c 65 27  browser-console'
59d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
59e0: 20 20 20 20 20 20 23 20 68 74 74 70 73 3a 2f 2f        # https://
59f0: 67 69 74 68 75 62 2e 63 6f 6d 2f 6d 6f 7a 69 6c  github.com/mozil
5a00: 6c 61 2f 77 65 62 2d 65 78 74 2f 69 73 73 75 65  la/web-ext/issue
5a10: 73 2f 39 33 32 0a 20 20 20 20 20 20 20 20 20 20  s/932.          
5a20: 20 20 20 20 20 20 20 20 20 20 23 20 6f 73 2e 73            # os.s
5a30: 79 73 74 65 6d 28 72 27 77 65 62 2d 65 78 74 20  ystem(r'web-ext 
5a40: 72 75 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22 27  run --firefox="'
5a50: 20 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20   + spfFirefox + 
5a60: 72 27 22 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f  r'" --browser-co
5a70: 6e 73 6f 6c 65 20 2d 2d 66 69 72 65 66 6f 78 2d  nsole --firefox-
5a80: 70 72 6f 66 69 6c 65 3d 43 3a 5c 55 73 65 72 73  profile=C:\Users
5a90: 5c 45 41 4b 5c 41 70 70 44 61 74 61 5c 52 6f 61  \EAK\AppData\Roa
5aa0: 6d 69 6e 67 5c 4d 6f 7a 69 6c 6c 61 5c 46 69 72  ming\Mozilla\Fir
5ab0: 65 66 6f 78 5c 50 72 6f 66 69 6c 65 73 5c 65 32  efox\Profiles\e2
5ac0: 36 35 35 39 74 77 2e 64 65 62 75 67 20 2d 2d 6b  6559tw.debug --k
5ad0: 65 65 70 2d 70 72 6f 66 69 6c 65 2d 63 68 61 6e  eep-profile-chan
5ae0: 67 65 73 27 29 0a 0a 20 20 20 20 20 20 20 20 20  ges')..         
5af0: 20 20 20 23 20 54 68 75 6e 64 65 72 62 69 72 64     # Thunderbird
5b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
5b10: 78 41 72 67 73 2e 74 68 75 6e 64 65 72 62 69 72  xArgs.thunderbir
5b20: 64 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d:.             
5b30: 20 20 20 73 70 66 54 68 75 6e 64 65 72 62 69 72     spfThunderbir
5b40: 64 20 3d 20 27 22 27 2b 64 56 61 72 73 5b 27 77  d = '"'+dVars['w
5b50: 69 6e 5f 74 62 5f 70 61 74 68 27 5d 2b 27 22 27  in_tb_path']+'"'
5b60: 20 20 69 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79    if platform.sy
5b70: 73 74 65 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f  stem() == "Windo
5b80: 77 73 22 20 20 65 6c 73 65 20 64 56 61 72 73 5b  ws"  else dVars[
5b90: 27 6c 69 6e 75 78 5f 74 62 5f 70 61 74 68 27 5d  'linux_tb_path']
5ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5bb0: 20 70 72 69 6e 74 28 73 70 66 54 68 75 6e 64 65   print(spfThunde
5bc0: 72 62 69 72 64 29 0a 20 20 20 20 20 20 20 20 20  rbird).         
5bd0: 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65 6d         os.system
5be0: 28 73 70 66 54 68 75 6e 64 65 72 62 69 72 64 20  (spfThunderbird 
5bf0: 2b 20 27 20 2d 6a 73 63 6f 6e 73 6f 6c 65 20 2d  + ' -jsconsole -
5c00: 50 20 64 65 62 75 67 27 29 0a 20 20 20 20 20 20  P debug').      
5c10: 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 74        if xArgs.t
5c20: 68 75 6e 64 65 72 62 69 72 64 5f 62 65 74 61 3a  hunderbird_beta:
5c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5c40: 20 73 70 66 54 68 75 6e 64 65 72 62 69 72 64 20   spfThunderbird 
5c50: 3d 20 27 22 27 2b 64 56 61 72 73 5b 27 77 69 6e  = '"'+dVars['win
5c60: 5f 74 62 5f 62 65 74 61 5f 70 61 74 68 27 5d 2b  _tb_beta_path']+
5c70: 27 22 27 20 20 69 66 20 70 6c 61 74 66 6f 72 6d  '"'  if platform
5c80: 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20 22 57 69  .system() == "Wi
5c90: 6e 64 6f 77 73 22 20 20 65 6c 73 65 20 64 56 61  ndows"  else dVa
5ca0: 72 73 5b 27 6c 69 6e 75 78 5f 74 62 5f 62 65 74  rs['linux_tb_bet
5cb0: 61 5f 70 61 74 68 27 5d 0a 20 20 20 20 20 20 20  a_path'].       
5cc0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73           print(s
5cd0: 70 66 54 68 75 6e 64 65 72 62 69 72 64 29 0a 20  pfThunderbird). 
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5cf0: 73 2e 73 79 73 74 65 6d 28 73 70 66 54 68 75 6e  s.system(spfThun
5d00: 64 65 72 62 69 72 64 20 2b 20 27 20 2d 6a 73 63  derbird + ' -jsc
5d10: 6f 6e 73 6f 6c 65 20 2d 50 20 62 65 74 61 27 29  onsole -P beta')
5d20: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
5d30: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
5d40: 28 22 46 6f 6c 64 65 72 20 6e 6f 74 20 66 6f 75  ("Folder not fou
5d50: 6e 64 3a 20 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c  nd: gc_lang/"+sL
5d60: 61 6e 67 29 0a 0a 20 20 20 20 6f 4e 6f 77 20 3d  ang)..    oNow =
5d70: 20 64 61 74 65 74 69 6d 65 2e 64 61 74 65 74 69   datetime.dateti
5d80: 6d 65 2e 6e 6f 77 28 29 0a 20 20 20 20 70 72 69  me.now().    pri
5d90: 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  nt("============
5da0: 3d 3d 20 4d 41 4b 45 20 47 52 41 4d 4d 41 4c 45  == MAKE GRAMMALE
5db0: 43 54 45 20 5b 66 69 6e 69 73 68 65 64 5d 20 61  CTE [finished] a
5dc0: 74 20 7b 30 2e 68 6f 75 72 3a 3e 32 7d 20 68 20  t {0.hour:>2} h 
5dd0: 7b 30 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d 69  {0.minute:>2} mi
5de0: 6e 20 7b 30 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20  n {0.second:>2} 
5df0: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  s ==============
5e00: 22 2e 66 6f 72 6d 61 74 28 6f 4e 6f 77 29 29 0a  ".format(oNow)).
5e10: 0a 0a 69 66 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d  ..if __name__ ==
5e20: 20 27 5f 5f 6d 61 69 6e 5f 5f 27 3a 0a 20 20 20   '__main__':.   
5e30: 20 6d 61 69 6e 28 29 0a                           main().