Grammalecte  Hex Artifact Content

Artifact 47a1201999b4f9d8f588bebf34f9fce899eb50ebf2e8b9f4b16e8135d4ffdfc3:


0000: 20 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20   #!/usr/bin/env 
0010: 70 79 74 68 6f 6e 33 0a 23 20 63 6f 64 69 6e 67  python3.# coding
0020: 3a 20 55 54 46 2d 38 0a 0a 22 22 22 0a 47 72 61  : UTF-8..""".Gra
0030: 6d 6d 61 6c 65 63 74 65 20 62 75 69 6c 64 65 72  mmalecte builder
0040: 0a 22 22 22 0a 0a 69 6d 70 6f 72 74 20 73 79 73  ."""..import sys
0050: 0a 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f 72  .import os.impor
0060: 74 20 72 65 0a 69 6d 70 6f 72 74 20 7a 69 70 66  t re.import zipf
0070: 69 6c 65 0a 69 6d 70 6f 72 74 20 74 72 61 63 65  ile.import trace
0080: 62 61 63 6b 0a 69 6d 70 6f 72 74 20 63 6f 6e 66  back.import conf
0090: 69 67 70 61 72 73 65 72 0a 69 6d 70 6f 72 74 20  igparser.import 
00a0: 64 61 74 65 74 69 6d 65 0a 69 6d 70 6f 72 74 20  datetime.import 
00b0: 61 72 67 70 61 72 73 65 0a 69 6d 70 6f 72 74 20  argparse.import 
00c0: 69 6d 70 6f 72 74 6c 69 62 0a 69 6d 70 6f 72 74  importlib.import
00d0: 20 75 6e 69 74 74 65 73 74 0a 69 6d 70 6f 72 74   unittest.import
00e0: 20 6a 73 6f 6e 0a 69 6d 70 6f 72 74 20 70 6c 61   json.import pla
00f0: 74 66 6f 72 6d 0a 0a 66 72 6f 6d 20 64 69 73 74  tform..from dist
0100: 75 74 69 6c 73 20 69 6d 70 6f 72 74 20 64 69 72  utils import dir
0110: 5f 75 74 69 6c 2c 20 66 69 6c 65 5f 75 74 69 6c  _util, file_util
0120: 0a 0a 23 69 6d 70 6f 72 74 20 64 69 61 6c 6f 67  ..#import dialog
0130: 5f 62 75 6e 64 6c 65 64 0a 69 6d 70 6f 72 74 20  _bundled.import 
0140: 63 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 0a 69 6d  compile_rules.im
0150: 70 6f 72 74 20 68 65 6c 70 65 72 73 0a 69 6d 70  port helpers.imp
0160: 6f 72 74 20 6c 65 78 5f 62 75 69 6c 64 0a 0a 0a  ort lex_build...
0170: 73 57 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 20  sWarningMessage 
0180: 3d 20 22 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  = "The content o
0190: 66 20 74 68 69 73 20 66 6f 6c 64 65 72 20 69 73  f this folder is
01a0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f   generated by co
01b0: 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 64 20  de and replaced 
01c0: 61 74 20 65 61 63 68 20 62 75 69 6c 64 2e 5c 6e  at each build.\n
01d0: 22 0a 0a 0a 64 65 66 20 67 65 74 43 6f 6e 66 69  "...def getConfi
01e0: 67 20 28 73 4c 61 6e 67 29 3a 0a 20 20 20 20 22  g (sLang):.    "
01f0: 6c 6f 61 64 20 63 6f 6e 66 69 67 2e 69 6e 69 20  load config.ini 
0200: 69 6e 20 3c 73 4c 61 6e 67 3e 20 61 74 20 67 63  in <sLang> at gc
0210: 5f 6c 61 6e 67 2f 3c 73 4c 61 6e 67 3e 2c 20 72  _lang/<sLang>, r
0220: 65 74 75 72 6e 73 20 78 43 6f 6e 66 69 67 50 61  eturns xConfigPa
0230: 72 73 65 72 20 6f 62 6a 65 63 74 22 0a 20 20 20  rser object".   
0240: 20 78 43 6f 6e 66 69 67 20 3d 20 63 6f 6e 66 69   xConfig = confi
0250: 67 70 61 72 73 65 72 2e 43 6f 6e 66 69 67 50 61  gparser.ConfigPa
0260: 72 73 65 72 28 29 0a 20 20 20 20 78 43 6f 6e 66  rser().    xConf
0270: 69 67 2e 6f 70 74 69 6f 6e 78 66 6f 72 6d 20 3d  ig.optionxform =
0280: 20 73 74 72 0a 20 20 20 20 74 72 79 3a 0a 20 20   str.    try:.  
0290: 20 20 20 20 20 20 78 43 6f 6e 66 69 67 2e 72 65        xConfig.re
02a0: 61 64 5f 66 69 6c 65 28 6f 70 65 6e 28 22 67 63  ad_file(open("gc
02b0: 5f 6c 61 6e 67 2f 22 20 2b 20 73 4c 61 6e 67 20  _lang/" + sLang 
02c0: 2b 20 22 2f 63 6f 6e 66 69 67 2e 69 6e 69 22 2c  + "/config.ini",
02d0: 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "r", encoding="
02e0: 75 74 66 2d 38 22 29 29 0a 20 20 20 20 65 78 63  utf-8")).    exc
02f0: 65 70 74 20 46 69 6c 65 4e 6f 74 46 6f 75 6e 64  ept FileNotFound
0300: 45 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20 70  Error:.        p
0310: 72 69 6e 74 28 22 23 20 45 72 72 6f 72 2e 20 43  rint("# Error. C
0320: 61 6e e2 80 99 74 20 72 65 61 64 20 63 6f 6e 66  an...t read conf
0330: 69 67 20 66 69 6c 65 20 5b 22 20 2b 20 73 4c 61  ig file [" + sLa
0340: 6e 67 20 2b 20 22 5d 22 29 0a 20 20 20 20 20 20  ng + "]").      
0350: 20 20 65 78 69 74 28 29 0a 20 20 20 20 72 65 74    exit().    ret
0360: 75 72 6e 20 78 43 6f 6e 66 69 67 0a 0a 0a 64 65  urn xConfig...de
0370: 66 20 63 72 65 61 74 65 4f 70 74 69 6f 6e 73 4c  f createOptionsL
0380: 61 62 65 6c 50 72 6f 70 65 72 74 69 65 73 20 28  abelProperties (
0390: 64 4f 70 74 4c 62 6c 29 3a 0a 20 20 20 20 22 63  dOptLbl):.    "c
03a0: 72 65 61 74 65 20 63 6f 6e 74 65 6e 74 20 66 6f  reate content fo
03b0: 72 20 2e 70 72 6f 70 65 72 74 69 65 73 20 66 69  r .properties fi
03c0: 6c 65 73 20 28 4c 69 62 72 65 4f 66 66 69 63 65  les (LibreOffice
03d0: 29 22 0a 20 20 20 20 73 43 6f 6e 74 65 6e 74 20  )".    sContent 
03e0: 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 4f 70  = "".    for sOp
03f0: 74 2c 20 74 4c 61 62 65 6c 20 69 6e 20 64 4f 70  t, tLabel in dOp
0400: 74 4c 62 6c 2e 69 74 65 6d 73 28 29 3a 0a 20 20  tLbl.items():.  
0410: 20 20 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 2b        sContent +
0420: 3d 20 73 4f 70 74 20 2b 20 22 3d 22 20 2b 20 74  = sOpt + "=" + t
0430: 4c 61 62 65 6c 5b 30 5d 20 2b 20 22 5c 6e 22 0a  Label[0] + "\n".
0440: 20 20 20 20 20 20 20 20 69 66 20 74 4c 61 62 65          if tLabe
0450: 6c 5b 31 5d 3a 0a 20 20 20 20 20 20 20 20 20 20  l[1]:.          
0460: 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 22 68    sContent += "h
0470: 6c 70 5f 22 20 2b 20 73 4f 70 74 20 2b 20 22 3d  lp_" + sOpt + "=
0480: 22 20 2b 20 74 4c 61 62 65 6c 5b 31 5d 20 2b 20  " + tLabel[1] + 
0490: 22 5c 6e 22 0a 20 20 20 20 72 65 74 75 72 6e 20  "\n".    return 
04a0: 73 43 6f 6e 74 65 6e 74 0a 0a 0a 64 65 66 20 63  sContent...def c
04b0: 72 65 61 74 65 44 69 61 6c 6f 67 4f 70 74 69 6f  reateDialogOptio
04c0: 6e 73 58 44 4c 20 28 64 56 61 72 73 29 3a 0a 20  nsXDL (dVars):. 
04d0: 20 20 20 22 63 72 65 61 74 65 20 62 75 6e 64 6c     "create bundl
04e0: 65 64 20 64 69 61 6c 6f 67 20 6f 70 74 69 6f 6e  ed dialog option
04f0: 73 20 66 69 6c 65 20 2e 78 64 6c 20 28 4c 69 62  s file .xdl (Lib
0500: 72 65 4f 66 66 69 63 65 29 22 0a 20 20 20 20 73  reOffice)".    s
0510: 46 69 78 65 64 6c 69 6e 65 20 3d 20 27 3c 64 6c  Fixedline = '<dl
0520: 67 3a 66 69 78 65 64 6c 69 6e 65 20 64 6c 67 3a  g:fixedline dlg:
0530: 69 64 3d 22 7b 30 7d 22 20 64 6c 67 3a 74 61 62  id="{0}" dlg:tab
0540: 2d 69 6e 64 65 78 3d 22 7b 31 7d 22 20 64 6c 67  -index="{1}" dlg
0550: 3a 74 6f 70 3d 22 7b 32 7d 22 20 64 6c 67 3a 6c  :top="{2}" dlg:l
0560: 65 66 74 3d 22 35 22 20 64 6c 67 3a 77 69 64 74  eft="5" dlg:widt
0570: 68 3d 22 7b 33 7d 22 20 64 6c 67 3a 68 65 69 67  h="{3}" dlg:heig
0580: 68 74 3d 22 31 30 22 20 64 6c 67 3a 76 61 6c 75  ht="10" dlg:valu
0590: 65 3d 22 26 61 6d 70 3b 7b 30 7d 22 20 2f 3e 5c  e="&amp;{0}" />\
05a0: 6e 27 0a 20 20 20 20 73 43 68 65 63 6b 62 6f 78  n'.    sCheckbox
05b0: 20 3d 20 27 3c 64 6c 67 3a 63 68 65 63 6b 62 6f   = '<dlg:checkbo
05c0: 78 20 64 6c 67 3a 69 64 3d 22 7b 30 7d 22 20 64  x dlg:id="{0}" d
05d0: 6c 67 3a 74 61 62 2d 69 6e 64 65 78 3d 22 7b 31  lg:tab-index="{1
05e0: 7d 22 20 64 6c 67 3a 74 6f 70 3d 22 7b 32 7d 22  }" dlg:top="{2}"
05f0: 20 64 6c 67 3a 6c 65 66 74 3d 22 7b 33 7d 22 20   dlg:left="{3}" 
0600: 64 6c 67 3a 77 69 64 74 68 3d 22 7b 34 7d 22 20  dlg:width="{4}" 
0610: 64 6c 67 3a 68 65 69 67 68 74 3d 22 31 30 22 20  dlg:height="10" 
0620: 64 6c 67 3a 76 61 6c 75 65 3d 22 26 61 6d 70 3b  dlg:value="&amp;
0630: 7b 30 7d 22 20 64 6c 67 3a 63 68 65 63 6b 65 64  {0}" dlg:checked
0640: 3d 22 7b 35 7d 22 20 7b 36 7d 20 2f 3e 5c 6e 27  ="{5}" {6} />\n'
0650: 0a 20 20 20 20 69 54 61 62 49 6e 64 65 78 20 3d  .    iTabIndex =
0660: 20 31 0a 20 20 20 20 6e 50 6f 73 59 20 3d 20 35   1.    nPosY = 5
0670: 0a 20 20 20 20 6e 57 69 64 74 68 20 3d 20 32 34  .    nWidth = 24
0680: 30 0a 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 3d  0.    sContent =
0690: 20 22 22 0a 20 20 20 20 64 4f 70 74 20 3d 20 64   "".    dOpt = d
06a0: 56 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e  Vars["dOptPython
06b0: 22 5d 0a 20 20 20 20 64 4f 70 74 4c 61 62 65 6c  "].    dOptLabel
06c0: 20 3d 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61   = dVars["dOptLa
06d0: 62 65 6c 22 5d 5b 64 56 61 72 73 5b 22 6c 61 6e  bel"][dVars["lan
06e0: 67 22 5d 5d 0a 20 20 20 20 66 6f 72 20 73 47 72  g"]].    for sGr
06f0: 6f 75 70 2c 20 6c 47 72 6f 75 70 4f 70 74 69 6f  oup, lGroupOptio
0700: 6e 73 20 69 6e 20 64 56 61 72 73 5b 22 6c 53 74  ns in dVars["lSt
0710: 72 75 63 74 4f 70 74 22 5d 3a 0a 20 20 20 20 20  ructOpt"]:.     
0720: 20 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d 20 73     sContent += s
0730: 46 69 78 65 64 6c 69 6e 65 2e 66 6f 72 6d 61 74  Fixedline.format
0740: 28 73 47 72 6f 75 70 2c 20 69 54 61 62 49 6e 64  (sGroup, iTabInd
0750: 65 78 2c 20 6e 50 6f 73 59 2c 20 6e 57 69 64 74  ex, nPosY, nWidt
0760: 68 29 0a 20 20 20 20 20 20 20 20 69 54 61 62 49  h).        iTabI
0770: 6e 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20 20  ndex += 1.      
0780: 20 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 69 6f    for lLineOptio
0790: 6e 73 20 69 6e 20 6c 47 72 6f 75 70 4f 70 74 69  ns in lGroupOpti
07a0: 6f 6e 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ons:.           
07b0: 20 6e 45 6c 65 6d 57 69 64 74 68 20 3d 20 6e 57   nElemWidth = nW
07c0: 69 64 74 68 20 2f 2f 20 6c 65 6e 28 6c 4c 69 6e  idth // len(lLin
07d0: 65 4f 70 74 69 6f 6e 73 29 0a 20 20 20 20 20 20  eOptions).      
07e0: 20 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20 31        nPosY += 1
07f0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  0.            nP
0800: 6f 73 58 20 3d 20 31 30 0a 20 20 20 20 20 20 20  osX = 10.       
0810: 20 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e       for sOpt in
0820: 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73 3a 0a 20   lLineOptions:. 
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0840: 48 65 6c 70 20 3d 20 27 64 6c 67 3a 68 65 6c 70  Help = 'dlg:help
0850: 2d 74 65 78 74 3d 22 26 61 6d 70 3b 68 6c 70 5f  -text="&amp;hlp_
0860: 25 73 22 27 25 73 4f 70 74 20 20 69 66 20 64 4f  %s"'%sOpt  if dO
0870: 70 74 4c 61 62 65 6c 5b 73 4f 70 74 5d 5b 31 5d  ptLabel[sOpt][1]
0880: 20 20 65 6c 73 65 20 22 22 0a 20 20 20 20 20 20    else "".      
0890: 20 20 20 20 20 20 20 20 20 20 73 43 6f 6e 74 65            sConte
08a0: 6e 74 20 2b 3d 20 73 43 68 65 63 6b 62 6f 78 2e  nt += sCheckbox.
08b0: 66 6f 72 6d 61 74 28 73 4f 70 74 2c 20 69 54 61  format(sOpt, iTa
08c0: 62 49 6e 64 65 78 2c 20 6e 50 6f 73 59 2c 20 6e  bIndex, nPosY, n
08d0: 50 6f 73 58 2c 20 6e 45 6c 65 6d 57 69 64 74 68  PosX, nElemWidth
08e0: 2c 20 22 74 72 75 65 22 20 69 66 20 64 4f 70 74  , "true" if dOpt
08f0: 5b 73 4f 70 74 5d 20 65 6c 73 65 20 22 66 61 6c  [sOpt] else "fal
0900: 73 65 22 2c 20 73 48 65 6c 70 29 0a 20 20 20 20  se", sHelp).    
0910: 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
0920: 49 6e 64 65 78 20 2b 3d 20 31 0a 20 20 20 20 20  Index += 1.     
0930: 20 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 58             nPosX
0940: 20 2b 3d 20 6e 45 6c 65 6d 57 69 64 74 68 0a 20   += nElemWidth. 
0950: 20 20 20 20 20 20 20 6e 50 6f 73 59 20 2b 3d 20         nPosY += 
0960: 31 30 0a 20 20 20 20 72 65 74 75 72 6e 20 73 43  10.    return sC
0970: 6f 6e 74 65 6e 74 0a 0a 0a 64 65 66 20 63 72 65  ontent...def cre
0980: 61 74 65 4f 58 54 20 28 73 70 4c 61 6e 67 2c 20  ateOXT (spLang, 
0990: 64 56 61 72 73 2c 20 64 4f 78 74 2c 20 73 70 4c  dVars, dOxt, spL
09a0: 61 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61 6c  angPack, bInstal
09b0: 6c 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20  l):.    "create 
09c0: 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 57 72  extension for Wr
09d0: 69 74 65 72 22 0a 20 20 20 20 70 72 69 6e 74 28  iter".    print(
09e0: 22 42 75 69 6c 64 69 6e 67 20 65 78 74 65 6e 73  "Building extens
09f0: 69 6f 6e 20 66 6f 72 20 57 72 69 74 65 72 22 29  ion for Writer")
0a00: 0a 20 20 20 20 73 70 66 5a 69 70 20 3d 20 22 5f  .    spfZip = "_
0a10: 62 75 69 6c 64 2f 22 20 2b 20 64 56 61 72 73 5b  build/" + dVars[
0a20: 27 6e 61 6d 65 27 5d 20 2b 20 22 2d 22 2b 20 64  'name'] + "-"+ d
0a30: 56 61 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 22 2d  Vars['lang'] +"-
0a40: 76 22 20 2b 20 64 56 61 72 73 5b 27 76 65 72 73  v" + dVars['vers
0a50: 69 6f 6e 27 5d 20 2b 20 27 2e 6f 78 74 27 0a 20  ion'] + '.oxt'. 
0a60: 20 20 20 68 5a 69 70 20 3d 20 7a 69 70 66 69 6c     hZip = zipfil
0a70: 65 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a 69 70  e.ZipFile(spfZip
0a80: 2c 20 6d 6f 64 65 3d 27 77 27 2c 20 63 6f 6d 70  , mode='w', comp
0a90: 72 65 73 73 69 6f 6e 3d 7a 69 70 66 69 6c 65 2e  ression=zipfile.
0aa0: 5a 49 50 5f 44 45 46 4c 41 54 45 44 29 0a 0a 20  ZIP_DEFLATED).. 
0ab0: 20 20 20 23 20 50 61 63 6b 61 67 65 20 61 6e 64     # Package and
0ac0: 20 70 61 72 73 65 72 0a 20 20 20 20 63 6f 70 79   parser.    copy
0ad0: 47 72 61 6d 6d 61 6c 65 63 74 65 50 79 50 61 63  GrammalectePyPac
0ae0: 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a  kageInZipFile(hZ
0af0: 69 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20  ip, spLangPack, 
0b00: 22 70 79 74 68 6f 6e 70 61 74 68 2f 22 29 0a 20  "pythonpath/"). 
0b10: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67     hZip.write("g
0b20: 72 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70  rammalecte-cli.p
0b30: 79 22 2c 20 22 70 79 74 68 6f 6e 70 61 74 68 2f  y", "pythonpath/
0b40: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e  grammalecte-cli.
0b50: 70 79 22 29 0a 0a 20 20 20 20 23 20 45 78 74 65  py")..    # Exte
0b60: 6e 73 69 6f 6e 20 66 69 6c 65 73 0a 20 20 20 20  nsion files.    
0b70: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 4d  hZip.writestr("M
0b80: 45 54 41 2d 49 4e 46 2f 6d 61 6e 69 66 65 73 74  ETA-INF/manifest
0b90: 2e 78 6d 6c 22 2c 20 68 65 6c 70 65 72 73 2e 66  .xml", helpers.f
0ba0: 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65  ileFile("gc_core
0bb0: 2f 70 79 2f 6f 78 74 2f 6d 61 6e 69 66 65 73 74  /py/oxt/manifest
0bc0: 2e 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20  .xml", dVars)). 
0bd0: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72     hZip.writestr
0be0: 28 22 64 65 73 63 72 69 70 74 69 6f 6e 2e 78 6d  ("description.xm
0bf0: 6c 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65  l", helpers.file
0c00: 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79  File("gc_core/py
0c10: 2f 6f 78 74 2f 64 65 73 63 72 69 70 74 69 6f 6e  /oxt/description
0c20: 2e 78 6d 6c 22 2c 20 64 56 61 72 73 29 29 0a 20  .xml", dVars)). 
0c30: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72     hZip.writestr
0c40: 28 22 4c 69 6e 67 75 69 73 74 69 63 2e 78 63 75  ("Linguistic.xcu
0c50: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
0c60: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
0c70: 6f 78 74 2f 4c 69 6e 67 75 69 73 74 69 63 2e 78  oxt/Linguistic.x
0c80: 63 75 22 2c 20 64 56 61 72 73 29 29 0a 20 20 20  cu", dVars)).   
0c90: 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22   hZip.writestr("
0ca0: 47 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22 2c  Grammalecte.py",
0cb0: 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c   helpers.fileFil
0cc0: 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78  e("gc_core/py/ox
0cd0: 74 2f 47 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79  t/Grammalecte.py
0ce0: 22 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68  ", dVars)).    h
0cf0: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 70 79  Zip.writestr("py
0d00: 74 68 6f 6e 70 61 74 68 2f 68 65 6c 70 65 72 73  thonpath/helpers
0d10: 2e 70 79 22 2c 20 68 65 6c 70 65 72 73 2e 66 69  .py", helpers.fi
0d20: 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f  leFile("gc_core/
0d30: 70 79 2f 6f 78 74 2f 68 65 6c 70 65 72 73 2e 70  py/oxt/helpers.p
0d40: 79 22 2c 20 64 56 61 72 73 29 29 0a 0a 20 20 20  y", dVars))..   
0d50: 20 66 6f 72 20 73 66 20 69 6e 20 64 56 61 72 73   for sf in dVars
0d60: 5b 22 65 78 74 72 61 73 22 5d 2e 73 70 6c 69 74  ["extras"].split
0d70: 28 22 2c 22 29 3a 0a 20 20 20 20 20 20 20 20 68  (","):.        h
0d80: 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73 66 2e  Zip.writestr(sf.
0d90: 73 74 72 69 70 28 29 2c 20 68 65 6c 70 65 72 73  strip(), helpers
0da0: 2e 66 69 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67  .fileFile(spLang
0db0: 20 2b 20 27 2f 27 20 2b 20 73 66 2e 73 74 72 69   + '/' + sf.stri
0dc0: 70 28 29 2c 20 64 56 61 72 73 29 29 0a 0a 20 20  p(), dVars))..  
0dd0: 20 20 69 66 20 22 6c 6f 67 6f 22 20 69 6e 20 64    if "logo" in d
0de0: 56 61 72 73 2e 6b 65 79 73 28 29 20 61 6e 64 20  Vars.keys() and 
0df0: 64 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74  dVars["logo"].st
0e00: 72 69 70 28 29 3a 0a 20 20 20 20 20 20 20 20 68  rip():.        h
0e10: 5a 69 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67  Zip.write(spLang
0e20: 20 2b 20 27 2f 27 20 2b 20 64 56 61 72 73 5b 22   + '/' + dVars["
0e30: 6c 6f 67 6f 22 5d 2e 73 74 72 69 70 28 29 2c 20  logo"].strip(), 
0e40: 64 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e 73 74  dVars["logo"].st
0e50: 72 69 70 28 29 29 0a 0a 20 20 20 20 23 23 20 4f  rip())..    ## O
0e60: 50 54 49 4f 4e 53 0a 20 20 20 20 23 20 6f 70 74  PTIONS.    # opt
0e70: 69 6f 6e 73 20 64 69 61 6c 6f 67 20 77 69 74 68  ions dialog with
0e80: 69 6e 20 4c 4f 2f 4f 4f 20 6f 70 74 69 6f 6e 73  in LO/OO options
0e90: 20 70 61 6e 65 6c 20 28 6c 65 67 61 63 79 29 0a   panel (legacy).
0ea0: 20 20 20 20 23 68 5a 69 70 2e 77 72 69 74 65 73      #hZip.writes
0eb0: 74 72 28 22 70 79 74 68 6f 6e 70 61 74 68 2f 6c  tr("pythonpath/l
0ec0: 69 67 68 74 70 72 6f 6f 66 5f 68 61 6e 64 6c 65  ightproof_handle
0ed0: 72 5f 67 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79  r_grammalecte.py
0ee0: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
0ef0: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
0f00: 6f 78 74 2f 6c 69 67 68 74 70 72 6f 6f 66 5f 68  oxt/lightproof_h
0f10: 61 6e 64 6c 65 72 5f 67 72 61 6d 6d 61 6c 65 63  andler_grammalec
0f20: 74 65 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a  te.py", dVars)).
0f30: 20 20 20 20 23 6c 4c 69 6e 65 4f 70 74 69 6f 6e      #lLineOption
0f40: 73 20 3d 20 6f 70 65 6e 28 73 70 4c 61 6e 67 20  s = open(spLang 
0f50: 2b 20 22 2f 6f 70 74 69 6f 6e 73 2e 74 78 74 22  + "/options.txt"
0f60: 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d  , "r", encoding=
0f70: 22 75 74 66 2d 38 22 29 2e 72 65 61 64 6c 69 6e  "utf-8").readlin
0f80: 65 73 28 29 0a 20 20 20 20 23 64 69 61 6c 6f 67  es().    #dialog
0f90: 5f 62 75 6e 64 6c 65 64 2e 63 28 64 56 61 72 73  _bundled.c(dVars
0fa0: 5b 22 69 6d 70 6c 6e 61 6d 65 22 5d 2c 20 6c 4c  ["implname"], lL
0fb0: 69 6e 65 4f 70 74 69 6f 6e 73 2c 20 68 5a 69 70  ineOptions, hZip
0fc0: 2c 20 64 56 61 72 73 5b 22 6c 61 6e 67 22 5d 29  , dVars["lang"])
0fd0: 0a 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73 20  ..    # options 
0fe0: 64 69 61 6c 6f 67 0a 20 20 20 20 68 5a 69 70 2e  dialog.    hZip.
0ff0: 77 72 69 74 65 73 74 72 28 22 70 79 74 68 6f 6e  writestr("python
1000: 70 61 74 68 2f 4f 70 74 69 6f 6e 73 2e 70 79 22  path/Options.py"
1010: 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69  , helpers.fileFi
1020: 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f  le("gc_core/py/o
1030: 78 74 2f 4f 70 74 69 6f 6e 73 2e 70 79 22 2c 20  xt/Options.py", 
1040: 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69 70  dVars)).    hZip
1050: 2e 77 72 69 74 65 28 22 67 63 5f 63 6f 72 65 2f  .write("gc_core/
1060: 70 79 2f 6f 78 74 2f 6f 70 5f 73 74 72 69 6e 67  py/oxt/op_string
1070: 73 2e 70 79 22 2c 20 22 70 79 74 68 6f 6e 70 61  s.py", "pythonpa
1080: 74 68 2f 6f 70 5f 73 74 72 69 6e 67 73 2e 70 79  th/op_strings.py
1090: 22 29 0a 20 20 20 20 23 20 6f 70 74 69 6f 6e 73  ").    # options
10a0: 20 64 69 61 6c 6f 67 20 77 69 74 68 69 6e 20 57   dialog within W
10b0: 72 69 74 65 72 20 6f 70 74 69 6f 6e 73 20 70 61  riter options pa
10c0: 6e 65 6c 0a 20 20 20 20 64 56 61 72 73 5b 22 78  nel.    dVars["x
10d0: 64 6c 5f 64 69 61 6c 6f 67 5f 6f 70 74 69 6f 6e  dl_dialog_option
10e0: 73 22 5d 20 3d 20 63 72 65 61 74 65 44 69 61 6c  s"] = createDial
10f0: 6f 67 4f 70 74 69 6f 6e 73 58 44 4c 28 64 56 61  ogOptionsXDL(dVa
1100: 72 73 29 0a 20 20 20 20 64 56 61 72 73 5b 22 78  rs).    dVars["x
1110: 63 73 5f 6f 70 74 69 6f 6e 73 22 5d 20 3d 20 22  cs_options"] = "
1120: 5c 6e 22 2e 6a 6f 69 6e 28 5b 20 27 3c 70 72 6f  \n".join([ '<pro
1130: 70 20 6f 6f 72 3a 6e 61 6d 65 3d 22 27 2b 73 4f  p oor:name="'+sO
1140: 70 74 2b 27 22 20 6f 6f 72 3a 74 79 70 65 3d 22  pt+'" oor:type="
1150: 78 73 3a 73 74 72 69 6e 67 22 3e 3c 76 61 6c 75  xs:string"><valu
1160: 65 3e 3c 2f 76 61 6c 75 65 3e 3c 2f 70 72 6f 70  e></value></prop
1170: 3e 27 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 64  >' for sOpt in d
1180: 56 61 72 73 5b 22 64 4f 70 74 50 79 74 68 6f 6e  Vars["dOptPython
1190: 22 5d 20 5d 29 0a 20 20 20 20 64 56 61 72 73 5b  "] ]).    dVars[
11a0: 22 78 63 75 5f 6c 61 62 65 6c 5f 76 61 6c 75 65  "xcu_label_value
11b0: 73 22 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28  s"] = "\n".join(
11c0: 5b 20 27 3c 76 61 6c 75 65 20 78 6d 6c 3a 6c 61  [ '<value xml:la
11d0: 6e 67 3d 22 27 2b 73 4c 61 6e 67 2b 27 22 3e 27  ng="'+sLang+'">'
11e0: 20 2b 20 64 56 61 72 73 5b 22 64 4f 70 74 4c 61   + dVars["dOptLa
11f0: 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d 5b 22 5f 5f  bel"][sLang]["__
1200: 6f 70 74 69 6f 6e 74 69 74 6c 65 5f 5f 22 5d 20  optiontitle__"] 
1210: 2b 20 27 3c 2f 76 61 6c 75 65 3e 27 20 20 66 6f  + '</value>'  fo
1220: 72 20 73 4c 61 6e 67 20 69 6e 20 64 56 61 72 73  r sLang in dVars
1230: 5b 22 64 4f 70 74 4c 61 62 65 6c 22 5d 20 5d 29  ["dOptLabel"] ])
1240: 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73  .    hZip.writes
1250: 74 72 28 22 64 69 61 6c 6f 67 2f 6f 70 74 69 6f  tr("dialog/optio
1260: 6e 73 5f 70 61 67 65 2e 78 64 6c 22 2c 20 68 65  ns_page.xdl", he
1270: 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65 28 22  lpers.fileFile("
1280: 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6f  gc_core/py/oxt/o
1290: 70 74 69 6f 6e 73 5f 70 61 67 65 2e 78 64 6c 22  ptions_page.xdl"
12a0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
12b0: 69 70 2e 77 72 69 74 65 73 74 72 28 22 64 69 61  ip.writestr("dia
12c0: 6c 6f 67 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f  log/OptionsDialo
12d0: 67 2e 78 63 73 22 2c 20 68 65 6c 70 65 72 73 2e  g.xcs", helpers.
12e0: 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72  fileFile("gc_cor
12f0: 65 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73  e/py/oxt/Options
1300: 44 69 61 6c 6f 67 2e 78 63 73 22 2c 20 64 56 61  Dialog.xcs", dVa
1310: 72 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72  rs)).    hZip.wr
1320: 69 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 4f  itestr("dialog/O
1330: 70 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 75  ptionsDialog.xcu
1340: 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65 46  ", helpers.fileF
1350: 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f  ile("gc_core/py/
1360: 6f 78 74 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f  oxt/OptionsDialo
1370: 67 2e 78 63 75 22 2c 20 64 56 61 72 73 29 29 0a  g.xcu", dVars)).
1380: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
1390: 72 28 22 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56  r("dialog/" + dV
13a0: 61 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f  ars['lang'] + "_
13b0: 65 6e 2e 64 65 66 61 75 6c 74 22 2c 20 22 22 29  en.default", "")
13c0: 0a 20 20 20 20 66 6f 72 20 73 4c 61 6e 67 4c 62  .    for sLangLb
13d0: 6c 2c 20 64 4f 70 74 4c 62 6c 20 69 6e 20 64 56  l, dOptLbl in dV
13e0: 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d  ars['dOptLabel']
13f0: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
1400: 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28    hZip.writestr(
1410: 22 64 69 61 6c 6f 67 2f 22 20 2b 20 64 56 61 72  "dialog/" + dVar
1420: 73 5b 27 6c 61 6e 67 27 5d 20 2b 20 22 5f 22 20  s['lang'] + "_" 
1430: 2b 20 73 4c 61 6e 67 4c 62 6c 20 2b 20 22 2e 70  + sLangLbl + ".p
1440: 72 6f 70 65 72 74 69 65 73 22 2c 20 63 72 65 61  roperties", crea
1450: 74 65 4f 70 74 69 6f 6e 73 4c 61 62 65 6c 50 72  teOptionsLabelPr
1460: 6f 70 65 72 74 69 65 73 28 64 4f 70 74 4c 62 6c  operties(dOptLbl
1470: 29 29 0a 0a 20 20 20 20 23 23 20 41 44 44 4f 4e  ))..    ## ADDON
1480: 53 20 4f 58 54 0a 20 20 20 20 70 72 69 6e 74 28  S OXT.    print(
1490: 22 2b 20 4f 58 54 3a 20 22 2c 20 65 6e 64 3d 22  "+ OXT: ", end="
14a0: 22 29 0a 20 20 20 20 66 6f 72 20 73 70 66 53 72  ").    for spfSr
14b0: 63 2c 20 73 70 66 44 73 74 20 69 6e 20 64 4f 78  c, spfDst in dOx
14c0: 74 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20  t.items():.     
14d0: 20 20 20 70 72 69 6e 74 28 73 70 66 53 72 63 2c     print(spfSrc,
14e0: 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 20   end=", ").     
14f0: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73     if os.path.is
1500: 64 69 72 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73  dir(spLang+'/'+s
1510: 70 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20  pfSrc):.        
1520: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
1530: 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b  .listdir(spLang+
1540: 27 2f 27 2b 73 70 66 53 72 63 29 3a 0a 20 20 20  '/'+spfSrc):.   
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69               hZi
1560: 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 2b 27  p.write(spLang+'
1570: 2f 27 2b 73 70 66 53 72 63 2b 22 2f 22 2b 73 66  /'+spfSrc+"/"+sf
1580: 2c 20 73 70 66 44 73 74 2b 22 2f 22 2b 73 66 29  , spfDst+"/"+sf)
1590: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
15a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 70             if sp
15b0: 66 53 72 63 2e 65 6e 64 73 77 69 74 68 28 28 27  fSrc.endswith(('
15c0: 2e 74 78 74 27 2c 20 27 2e 70 79 27 29 29 3a 0a  .txt', '.py')):.
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73 70  hZip.writestr(sp
15f0: 66 44 73 74 2c 20 68 65 6c 70 65 72 73 2e 66 69  fDst, helpers.fi
1600: 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67 2b 27 2f  leFile(spLang+'/
1610: 27 2b 73 70 66 53 72 63 2c 20 64 56 61 72 73 29  '+spfSrc, dVars)
1620: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
1630: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
1640: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73      hZip.write(s
1650: 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63  pLang+'/'+spfSrc
1660: 2c 20 73 70 66 44 73 74 29 0a 20 20 20 20 70 72  , spfDst).    pr
1670: 69 6e 74 28 29 0a 20 20 20 20 68 5a 69 70 2e 63  int().    hZip.c
1680: 6c 6f 73 65 28 29 0a 0a 20 20 20 20 23 20 49 6e  lose()..    # In
1690: 73 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57 72  stallation in Wr
16a0: 69 74 65 72 20 70 72 6f 66 69 6c 65 0a 20 20 20  iter profile.   
16b0: 20 69 66 20 62 49 6e 73 74 61 6c 6c 3a 0a 20 20   if bInstall:.  
16c0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 3e 20 69        print("> i
16d0: 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20 57  nstallation in W
16e0: 72 69 74 65 72 22 29 0a 20 20 20 20 20 20 20 20  riter").        
16f0: 69 66 20 64 56 61 72 73 2e 67 65 74 28 27 75 6e  if dVars.get('un
1700: 6f 70 6b 67 27 2c 20 46 61 6c 73 65 29 3a 0a 20  opkg', False):. 
1710: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 20 3d             cmd =
1720: 20 27 22 27 2b 6f 73 2e 70 61 74 68 2e 61 62 73   '"'+os.path.abs
1730: 70 61 74 68 28 64 56 61 72 73 2e 67 65 74 28 27  path(dVars.get('
1740: 75 6e 6f 70 6b 67 27 29 2b 27 22 20 61 64 64 20  unopkg')+'" add 
1750: 2d 66 20 27 2b 73 70 66 5a 69 70 29 0a 20 20 20  -f '+spfZip).   
1760: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 63           print(c
1770: 6d 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  md).            
1780: 6f 73 2e 73 79 73 74 65 6d 28 63 6d 64 29 0a 20  os.system(cmd). 
1790: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
17a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
17b0: 23 20 45 72 72 6f 72 3a 20 70 61 74 68 20 61 6e  # Error: path an
17c0: 64 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 75 6e  d filename of un
17d0: 6f 70 6b 67 20 6e 6f 74 20 73 65 74 20 69 6e 20  opkg not set in 
17e0: 63 6f 6e 66 69 67 2e 69 6e 69 22 29 0a 0a 0a 64  config.ini")...d
17f0: 65 66 20 63 72 65 61 74 65 53 65 72 76 65 72 4f  ef createServerO
1800: 70 74 69 6f 6e 73 20 28 73 4c 61 6e 67 2c 20 64  ptions (sLang, d
1810: 4f 70 74 44 61 74 61 29 3a 0a 20 20 20 20 22 63  OptData):.    "c
1820: 72 65 61 74 65 20 66 69 6c 65 20 6f 70 74 69 6f  reate file optio
1830: 6e 73 20 66 6f 72 20 47 72 61 6d 6d 61 6c 65 63  ns for Grammalec
1840: 74 65 20 73 65 72 76 65 72 22 0a 20 20 20 20 77  te server".    w
1850: 69 74 68 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61  ith open("gramma
1860: 6c 65 63 74 65 2d 73 65 72 76 65 72 2d 6f 70 74  lecte-server-opt
1870: 69 6f 6e 73 2e 22 2b 73 4c 61 6e 67 2b 22 2e 69  ions."+sLang+".i
1880: 6e 69 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69  ni", "w", encodi
1890: 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c  ng="utf-8", newl
18a0: 69 6e 65 3d 22 5c 6e 22 29 20 61 73 20 68 44 73  ine="\n") as hDs
18b0: 74 3a 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e  t:.        hDst.
18c0: 77 72 69 74 65 28 22 23 20 53 65 72 76 65 72 20  write("# Server 
18d0: 6f 70 74 69 6f 6e 73 2e 20 4c 61 6e 67 3a 20 22  options. Lang: "
18e0: 20 2b 20 73 4c 61 6e 67 20 2b 20 22 5c 6e 5c 6e   + sLang + "\n\n
18f0: 5b 67 63 5f 6f 70 74 69 6f 6e 73 5d 5c 6e 22 29  [gc_options]\n")
1900: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 53 65  .        for sSe
1910: 63 74 69 6f 6e 2c 20 6c 4f 70 74 20 69 6e 20 64  ction, lOpt in d
1920: 4f 70 74 44 61 74 61 5b 22 6c 53 74 72 75 63 74  OptData["lStruct
1930: 4f 70 74 22 5d 3a 0a 20 20 20 20 20 20 20 20 20  Opt"]:.         
1940: 20 20 20 68 44 73 74 2e 77 72 69 74 65 28 22 5c     hDst.write("\
1950: 6e 23 23 23 23 23 23 23 23 23 23 20 22 20 2b 20  n########## " + 
1960: 64 4f 70 74 44 61 74 61 5b 22 64 4f 70 74 4c 61  dOptData["dOptLa
1970: 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74  bel"][sLang].get
1980: 28 73 53 65 63 74 69 6f 6e 2c 20 73 53 65 63 74  (sSection, sSect
1990: 69 6f 6e 20 2b 20 22 5b 6e 6f 20 6c 61 62 65 6c  ion + "[no label
19a0: 20 66 6f 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22   found]")[0] + "
19b0: 20 23 23 23 23 23 23 23 23 23 23 5c 6e 22 29 0a   ##########\n").
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
19d0: 6c 4c 69 6e 65 4f 70 74 20 69 6e 20 6c 4f 70 74  lLineOpt in lOpt
19e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
19f0: 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c 4c    for sOpt in lL
1a00: 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20 20 20  ineOpt:.        
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 68 44 73 74              hDst
1a20: 2e 77 72 69 74 65 28 22 23 20 22 20 2b 20 64 4f  .write("# " + dO
1a30: 70 74 44 61 74 61 5b 22 64 4f 70 74 4c 61 62 65  ptData["dOptLabe
1a40: 6c 22 5d 5b 73 4c 61 6e 67 5d 2e 67 65 74 28 73  l"][sLang].get(s
1a50: 4f 70 74 2c 20 22 5b 6e 6f 20 6c 61 62 65 6c 20  Opt, "[no label 
1a60: 66 6f 75 6e 64 5d 22 29 5b 30 5d 20 2b 20 22 5c  found]")[0] + "\
1a70: 6e 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n").            
1a80: 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69          hDst.wri
1a90: 74 65 28 73 4f 70 74 20 2b 20 22 20 3d 20 22 20  te(sOpt + " = " 
1aa0: 2b 20 28 22 31 22 20 69 66 20 64 4f 70 74 44 61  + ("1" if dOptDa
1ab0: 74 61 5b 22 64 4f 70 74 53 65 72 76 65 72 22 5d  ta["dOptServer"]
1ac0: 2e 67 65 74 28 73 4f 70 74 2c 20 4e 6f 6e 65 29  .get(sOpt, None)
1ad0: 20 65 6c 73 65 20 22 30 22 29 20 2b 20 22 5c 6e   else "0") + "\n
1ae0: 22 29 0a 20 20 20 20 20 20 20 20 68 44 73 74 2e  ").        hDst.
1af0: 77 72 69 74 65 28 22 68 74 6d 6c 20 3d 20 31 5c  write("html = 1\
1b00: 6e 22 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65  n")...def create
1b10: 50 61 63 6b 61 67 65 5a 69 70 20 28 64 56 61 72  PackageZip (dVar
1b20: 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29 3a 0a  s, spLangPack):.
1b30: 20 20 20 20 22 63 72 65 61 74 65 20 73 65 72 76      "create serv
1b40: 65 72 20 7a 69 70 22 0a 20 20 20 20 73 70 66 5a  er zip".    spfZ
1b50: 69 70 20 3d 20 22 5f 62 75 69 6c 64 2f 22 20 2b  ip = "_build/" +
1b60: 20 64 56 61 72 73 5b 27 6e 61 6d 65 27 5d 20 2b   dVars['name'] +
1b70: 20 22 2d 22 2b 20 64 56 61 72 73 5b 27 6c 61 6e   "-"+ dVars['lan
1b80: 67 27 5d 20 2b 22 2d 76 22 20 2b 20 64 56 61 72  g'] +"-v" + dVar
1b90: 73 5b 27 76 65 72 73 69 6f 6e 27 5d 20 2b 20 27  s['version'] + '
1ba0: 2e 7a 69 70 27 0a 20 20 20 20 68 5a 69 70 20 3d  .zip'.    hZip =
1bb0: 20 7a 69 70 66 69 6c 65 2e 5a 69 70 46 69 6c 65   zipfile.ZipFile
1bc0: 28 73 70 66 5a 69 70 2c 20 6d 6f 64 65 3d 27 77  (spfZip, mode='w
1bd0: 27 2c 20 63 6f 6d 70 72 65 73 73 69 6f 6e 3d 7a  ', compression=z
1be0: 69 70 66 69 6c 65 2e 5a 49 50 5f 44 45 46 4c 41  ipfile.ZIP_DEFLA
1bf0: 54 45 44 29 0a 20 20 20 20 63 6f 70 79 47 72 61  TED).    copyGra
1c00: 6d 6d 61 6c 65 63 74 65 50 79 50 61 63 6b 61 67  mmalectePyPackag
1c10: 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a 69 70 2c  eInZipFile(hZip,
1c20: 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a 20 20 20   spLangPack).   
1c30: 20 66 6f 72 20 73 70 66 20 69 6e 20 5b 22 67 72   for spf in ["gr
1c40: 61 6d 6d 61 6c 65 63 74 65 2d 63 6c 69 2e 70 79  ammalecte-cli.py
1c50: 22 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  ", "grammalecte-
1c60: 73 65 72 76 65 72 2e 70 79 22 2c 20 5c 0a 20 20  server.py", \.  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1c80: 45 41 44 4d 45 2e 74 78 74 22 2c 20 22 4c 49 43  EADME.txt", "LIC
1c90: 45 4e 53 45 2e 74 78 74 22 2c 20 22 4c 49 43 45  ENSE.txt", "LICE
1ca0: 4e 53 45 2e 66 72 2e 74 78 74 22 5d 3a 0a 20 20  NSE.fr.txt"]:.  
1cb0: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1cc0: 28 73 70 66 29 0a 20 20 20 20 68 5a 69 70 2e 77  (spf).    hZip.w
1cd0: 72 69 74 65 73 74 72 28 22 73 65 74 75 70 2e 70  ritestr("setup.p
1ce0: 79 22 2c 20 68 65 6c 70 65 72 73 2e 66 69 6c 65  y", helpers.file
1cf0: 46 69 6c 65 28 22 67 63 5f 6c 61 6e 67 2f 66 72  File("gc_lang/fr
1d00: 2f 73 65 74 75 70 2e 70 79 22 2c 20 64 56 61 72  /setup.py", dVar
1d10: 73 29 29 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72  s))...def copyGr
1d20: 61 6d 6d 61 6c 65 63 74 65 50 79 50 61 63 6b 61  ammalectePyPacka
1d30: 67 65 49 6e 5a 69 70 46 69 6c 65 20 28 68 5a 69  geInZipFile (hZi
1d40: 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 73  p, spLangPack, s
1d50: 41 64 64 50 61 74 68 3d 22 22 29 3a 0a 20 20 20  AddPath=""):.   
1d60: 20 22 63 6f 70 79 20 47 72 61 6d 6d 61 6c 65 63   "copy Grammalec
1d70: 74 65 20 50 79 74 68 6f 6e 20 70 61 63 6b 61 67  te Python packag
1d80: 65 20 69 6e 20 7a 69 70 20 66 69 6c 65 22 0a 20  e in zip file". 
1d90: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
1da0: 6c 69 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c  listdir("grammal
1db0: 65 63 74 65 22 29 3a 0a 20 20 20 20 20 20 20 20  ecte"):.        
1dc0: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
1dd0: 73 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74  sdir("grammalect
1de0: 65 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20  e/"+sf):.       
1df0: 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28       hZip.write(
1e00: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73  "grammalecte/"+s
1e10: 66 2c 20 73 41 64 64 50 61 74 68 2b 22 67 72 61  f, sAddPath+"gra
1e20: 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66 29 0a 20  mmalecte/"+sf). 
1e30: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
1e40: 6c 69 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c  listdir("grammal
1e50: 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 22  ecte/graphspell"
1e60: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
1e70: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
1e80: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  "grammalecte/gra
1e90: 70 68 73 70 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20  phspell/"+sf):. 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e             hZip.
1eb0: 77 72 69 74 65 28 22 67 72 61 6d 6d 61 6c 65 63  write("grammalec
1ec0: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  te/graphspell/"+
1ed0: 73 66 2c 20 73 41 64 64 50 61 74 68 2b 22 67 72  sf, sAddPath+"gr
1ee0: 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73  ammalecte/graphs
1ef0: 70 65 6c 6c 2f 22 2b 73 66 29 0a 20 20 20 20 66  pell/"+sf).    f
1f00: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
1f10: 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  dir("grammalecte
1f20: 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63  /graphspell/_dic
1f30: 74 69 6f 6e 61 72 69 65 73 22 29 3a 0a 20 20 20  tionaries"):.   
1f40: 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70       if not os.p
1f50: 61 74 68 2e 69 73 64 69 72 28 22 67 72 61 6d 6d  ath.isdir("gramm
1f60: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
1f70: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  l/_dictionaries/
1f80: 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  "+sf):.         
1f90: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67     hZip.write("g
1fa0: 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68  rammalecte/graph
1fb0: 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72  spell/_dictionar
1fc0: 69 65 73 2f 22 2b 73 66 2c 20 73 41 64 64 50 61  ies/"+sf, sAddPa
1fd0: 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  th+"grammalecte/
1fe0: 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74  graphspell/_dict
1ff0: 69 6f 6e 61 72 69 65 73 2f 22 2b 73 66 29 0a 20  ionaries/"+sf). 
2000: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
2010: 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 50 61  listdir(spLangPa
2020: 63 6b 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  ck):.        if 
2030: 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69  not os.path.isdi
2040: 72 28 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22  r(spLangPack+"/"
2050: 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20  +sf):.          
2060: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 4c    hZip.write(spL
2070: 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20  angPack+"/"+sf, 
2080: 73 41 64 64 50 61 74 68 2b 73 70 4c 61 6e 67 50  sAddPath+spLangP
2090: 61 63 6b 2b 22 2f 22 2b 73 66 29 0a 0a 0a 64 65  ack+"/"+sf)...de
20a0: 66 20 63 72 65 61 74 65 20 28 73 4c 61 6e 67 2c  f create (sLang,
20b0: 20 78 43 6f 6e 66 69 67 2c 20 62 49 6e 73 74 61   xConfig, bInsta
20c0: 6c 6c 4f 58 54 2c 20 62 4a 61 76 61 53 63 72 69  llOXT, bJavaScri
20d0: 70 74 2c 20 62 55 73 65 43 61 63 68 65 29 3a 0a  pt, bUseCache):.
20e0: 20 20 20 20 22 6d 61 6b 65 20 47 72 61 6d 6d 61      "make Gramma
20f0: 6c 65 63 74 65 20 66 6f 72 20 70 72 6f 6a 65 63  lecte for projec
2100: 74 20 3c 73 4c 61 6e 67 3e 22 0a 20 20 20 20 6f  t <sLang>".    o
2110: 4e 6f 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64  Now = datetime.d
2120: 61 74 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20  atetime.now().  
2130: 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d    print("=======
2140: 3d 3d 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41  ======= MAKE GRA
2150: 4d 4d 41 4c 45 43 54 45 20 5b 7b 30 7d 5d 20 61  MMALECTE [{0}] a
2160: 74 20 7b 31 2e 68 6f 75 72 3a 3e 32 7d 20 68 20  t {1.hour:>2} h 
2170: 7b 31 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d 69  {1.minute:>2} mi
2180: 6e 20 7b 31 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20  n {1.second:>2} 
2190: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  s ==============
21a0: 22 2e 66 6f 72 6d 61 74 28 73 4c 61 6e 67 2c 20  ".format(sLang, 
21b0: 6f 4e 6f 77 29 29 0a 0a 20 20 20 20 23 23 23 23  oNow))..    ####
21c0: 20 52 45 41 44 20 43 4f 4e 46 49 47 55 52 41 54   READ CONFIGURAT
21d0: 49 4f 4e 0a 20 20 20 20 70 72 69 6e 74 28 22 3e  ION.    print(">
21e0: 20 72 65 61 64 20 63 6f 6e 66 69 67 75 72 61 74   read configurat
21f0: 69 6f 6e 2e 2e 2e 22 29 0a 20 20 20 20 73 70 4c  ion...").    spL
2200: 61 6e 67 20 3d 20 22 67 63 5f 6c 61 6e 67 2f 22  ang = "gc_lang/"
2210: 20 2b 20 73 4c 61 6e 67 0a 0a 20 20 20 20 64 56   + sLang..    dV
2220: 61 72 73 20 3d 20 78 43 6f 6e 66 69 67 2e 5f 73  ars = xConfig._s
2230: 65 63 74 69 6f 6e 73 5b 27 61 72 67 73 27 5d 0a  ections['args'].
2240: 20 20 20 20 64 56 61 72 73 5b 27 6c 6f 63 61 6c      dVars['local
2250: 65 73 27 5d 20 3d 20 64 56 61 72 73 5b 22 6c 6f  es'] = dVars["lo
2260: 63 61 6c 65 73 22 5d 2e 72 65 70 6c 61 63 65 28  cales"].replace(
2270: 22 5f 22 2c 20 22 2d 22 29 0a 20 20 20 20 64 56  "_", "-").    dV
2280: 61 72 73 5b 27 6c 6f 63 27 5d 20 3d 20 73 74 72  ars['loc'] = str
2290: 28 7b 20 73 3a 20 5b 73 5b 30 3a 32 5d 2c 20 73  ({ s: [s[0:2], s
22a0: 5b 33 3a 35 5d 2c 20 22 22 5d 20 20 66 6f 72 20  [3:5], ""]  for 
22b0: 73 20 69 6e 20 64 56 61 72 73 5b 22 6c 6f 63 61  s in dVars["loca
22c0: 6c 65 73 22 5d 2e 73 70 6c 69 74 28 22 20 22 29  les"].split(" ")
22d0: 20 7d 29 0a 0a 20 20 20 20 23 23 20 43 4f 4d 50   })..    ## COMP
22e0: 49 4c 45 20 52 55 4c 45 53 0a 20 20 20 20 64 52  ILE RULES.    dR
22f0: 65 73 75 6c 74 20 3d 20 63 6f 6d 70 69 6c 65 5f  esult = compile_
2300: 72 75 6c 65 73 2e 6d 61 6b 65 28 73 70 4c 61 6e  rules.make(spLan
2310: 67 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d  g, dVars['lang']
2320: 2c 20 62 55 73 65 43 61 63 68 65 29 0a 20 20 20  , bUseCache).   
2330: 20 64 56 61 72 73 2e 75 70 64 61 74 65 28 64 52   dVars.update(dR
2340: 65 73 75 6c 74 29 0a 0a 20 20 20 20 23 23 20 52  esult)..    ## R
2350: 45 41 44 20 47 52 41 4d 4d 41 52 20 43 48 45 43  EAD GRAMMAR CHEC
2360: 4b 45 52 20 50 4c 55 47 49 4e 53 0a 20 20 20 20  KER PLUGINS.    
2370: 70 72 69 6e 74 28 22 50 59 54 48 4f 4e 3a 22 29  print("PYTHON:")
2380: 0a 20 20 20 20 70 72 69 6e 74 28 22 2b 20 50 6c  .    print("+ Pl
2390: 75 67 69 6e 73 3a 20 22 2c 20 65 6e 64 3d 22 22  ugins: ", end=""
23a0: 29 0a 20 20 20 20 73 43 6f 64 65 50 6c 75 67 69  ).    sCodePlugi
23b0: 6e 73 20 3d 20 22 22 0a 20 20 20 20 66 6f 72 20  ns = "".    for 
23c0: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
23d0: 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65  (spLang+"/module
23e0: 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  s"):.        if 
23f0: 72 65 2e 6d 61 74 63 68 28 72 22 67 63 65 5f 5c  re.match(r"gce_\
2400: 77 2b 5b 2e 5d 70 79 24 22 2c 20 73 66 29 3a 0a  w+[.]py$", sf):.
2410: 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 64              sCod
2420: 65 50 6c 75 67 69 6e 73 20 2b 3d 20 22 5c 6e 5c  ePlugins += "\n\
2430: 6e 22 20 2b 20 6f 70 65 6e 28 73 70 4c 61 6e 67  n" + open(spLang
2440: 2b 27 2f 6d 6f 64 75 6c 65 73 2f 27 2b 73 66 2c  +'/modules/'+sf,
2450: 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22   "r", encoding="
2460: 75 74 66 2d 38 22 29 2e 72 65 61 64 28 29 0a 20  utf-8").read(). 
2470: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
2480: 28 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20  (sf, end=", "). 
2490: 20 20 20 70 72 69 6e 74 28 29 0a 20 20 20 20 64     print().    d
24a0: 56 61 72 73 5b 22 70 6c 75 67 69 6e 73 22 5d 20  Vars["plugins"] 
24b0: 3d 20 73 43 6f 64 65 50 6c 75 67 69 6e 73 0a 0a  = sCodePlugins..
24c0: 20 20 20 20 23 23 20 43 4f 50 59 20 47 43 5f 43      ## COPY GC_C
24d0: 4f 52 45 20 43 4f 4d 4d 4f 4e 20 46 49 4c 45 53  ORE COMMON FILES
24e0: 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f  .    for sf in o
24f0: 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f 63 6f  s.listdir("gc_co
2500: 72 65 2f 70 79 22 29 3a 0a 20 20 20 20 20 20 20  re/py"):.       
2510: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
2520: 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70  isdir("gc_core/p
2530: 79 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20  y/"+sf):.       
2540: 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70       helpers.cop
2550: 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65  yAndFileTemplate
2560: 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 22 2b 73  ("gc_core/py/"+s
2570: 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f  f, "grammalecte/
2580: 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20  "+sf, dVars).   
2590: 20 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f   file_util.copy_
25a0: 66 69 6c 65 28 22 33 72 64 2f 62 6f 74 74 6c 65  file("3rd/bottle
25b0: 2e 70 79 22 2c 20 22 67 72 61 6d 6d 61 6c 65 63  .py", "grammalec
25c0: 74 65 2f 62 6f 74 74 6c 65 2e 70 79 22 29 0a 20  te/bottle.py"). 
25d0: 20 20 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c     open("grammal
25e0: 65 63 74 65 2f 57 41 52 4e 49 4e 47 2e 74 78 74  ecte/WARNING.txt
25f0: 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67  ", "w", encoding
2600: 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e  ="utf-8", newlin
2610: 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 57  e="\n").write(sW
2620: 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 29 0a 0a  arningMessage)..
2630: 20 20 20 20 23 23 20 43 52 45 41 54 45 20 47 52      ## CREATE GR
2640: 41 4d 4d 41 52 20 43 48 45 43 4b 45 52 20 50 41  AMMAR CHECKER PA
2650: 43 4b 41 47 45 0a 20 20 20 20 73 70 4c 61 6e 67  CKAGE.    spLang
2660: 50 61 63 6b 20 3d 20 22 67 72 61 6d 6d 61 6c 65  Pack = "grammale
2670: 63 74 65 2f 22 2b 73 4c 61 6e 67 0a 20 20 20 20  cte/"+sLang.    
2680: 68 65 6c 70 65 72 73 2e 63 72 65 61 74 65 43 6c  helpers.createCl
2690: 65 61 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67  eanFolder(spLang
26a0: 50 61 63 6b 29 0a 20 20 20 20 66 6f 72 20 73 66  Pack).    for sf
26b0: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22   in os.listdir("
26c0: 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e 67 5f  gc_core/py/lang_
26d0: 63 6f 72 65 22 29 3a 0a 20 20 20 20 20 20 20 20  core"):.        
26e0: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
26f0: 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79  sdir("gc_core/py
2700: 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 29  /lang_core/"+sf)
2710: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65  :.            he
2720: 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c  lpers.copyAndFil
2730: 65 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f  eTemplate("gc_co
2740: 72 65 2f 70 79 2f 6c 61 6e 67 5f 63 6f 72 65 2f  re/py/lang_core/
2750: 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b  "+sf, spLangPack
2760: 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a  +"/"+sf, dVars).
2770: 20 20 20 20 70 72 69 6e 74 28 22 2b 20 4d 6f 64      print("+ Mod
2780: 75 6c 65 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29  ules: ", end="")
2790: 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f  .    for sf in o
27a0: 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67  s.listdir(spLang
27b0: 2b 22 2f 6d 6f 64 75 6c 65 73 22 29 3a 0a 20 20  +"/modules"):.  
27c0: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73 66 2e        if not sf.
27d0: 73 74 61 72 74 73 77 69 74 68 28 28 22 67 63 65  startswith(("gce
27e0: 5f 22 2c 20 22 5f 5f 70 79 63 61 63 68 65 5f 5f  _", "__pycache__
27f0: 22 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ")):.           
2800: 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64   helpers.copyAnd
2810: 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73 70 4c  FileTemplate(spL
2820: 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2f 22 2b  ang+"/modules/"+
2830: 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22  sf, spLangPack+"
2840: 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20  /"+sf, dVars).  
2850: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
2860: 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20  sf, end=", ").  
2870: 20 20 70 72 69 6e 74 28 29 0a 0a 20 20 20 20 23    print()..    #
2880: 20 54 45 53 54 20 46 49 4c 45 53 0a 20 20 20 20   TEST FILES.    
2890: 77 69 74 68 20 6f 70 65 6e 28 22 67 72 61 6d 6d  with open("gramm
28a0: 61 6c 65 63 74 65 2f 22 2b 73 4c 61 6e 67 2b 22  alecte/"+sLang+"
28b0: 2f 67 63 5f 74 65 73 74 2e 74 78 74 22 2c 20 22  /gc_test.txt", "
28c0: 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  w", encoding="ut
28d0: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
28e0: 6e 22 29 20 61 73 20 68 44 73 74 50 79 3a 0a 20  n") as hDstPy:. 
28f0: 20 20 20 20 20 20 20 68 44 73 74 50 79 2e 77 72         hDstPy.wr
2900: 69 74 65 28 22 23 20 54 45 53 54 53 20 46 4f 52  ite("# TESTS FOR
2910: 20 4c 41 4e 47 20 5b 22 20 2b 20 73 4c 61 6e 67   LANG [" + sLang
2920: 20 2b 20 22 5d 5c 6e 5c 6e 22 29 0a 20 20 20 20   + "]\n\n").    
2930: 20 20 20 20 68 44 73 74 50 79 2e 77 72 69 74 65      hDstPy.write
2940: 28 64 56 61 72 73 5b 27 67 63 74 65 73 74 73 27  (dVars['gctests'
2950: 5d 29 0a 20 20 20 20 20 20 20 20 68 44 73 74 50  ]).        hDstP
2960: 79 2e 77 72 69 74 65 28 22 5c 6e 22 29 0a 0a 20  y.write("\n").. 
2970: 20 20 20 63 72 65 61 74 65 4f 58 54 28 73 70 4c     createOXT(spL
2980: 61 6e 67 2c 20 64 56 61 72 73 2c 20 78 43 6f 6e  ang, dVars, xCon
2990: 66 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27 6f  fig._sections['o
29a0: 78 74 27 5d 2c 20 73 70 4c 61 6e 67 50 61 63 6b  xt'], spLangPack
29b0: 2c 20 62 49 6e 73 74 61 6c 6c 4f 58 54 29 0a 0a  , bInstallOXT)..
29c0: 20 20 20 20 63 72 65 61 74 65 50 61 63 6b 61 67      createPackag
29d0: 65 5a 69 70 28 64 56 61 72 73 2c 20 73 70 4c 61  eZip(dVars, spLa
29e0: 6e 67 50 61 63 6b 29 0a 0a 20 20 20 20 23 23 23  ngPack)..    ###
29f0: 23 20 4a 41 56 41 53 43 52 49 50 54 0a 20 20 20  # JAVASCRIPT.   
2a00: 20 69 66 20 62 4a 61 76 61 53 63 72 69 70 74 3a   if bJavaScript:
2a10: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
2a20: 4a 41 56 41 53 43 52 49 50 54 3a 22 29 0a 20 20  JAVASCRIPT:").  
2a30: 20 20 20 20 20 20 70 72 69 6e 74 28 22 2b 20 50        print("+ P
2a40: 6c 75 67 69 6e 73 3a 20 22 2c 20 65 6e 64 3d 22  lugins: ", end="
2a50: 22 29 0a 20 20 20 20 20 20 20 20 73 43 6f 64 65  ").        sCode
2a60: 50 6c 75 67 69 6e 73 20 3d 20 22 22 0a 20 20 20  Plugins = "".   
2a70: 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f       for sf in o
2a80: 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67  s.listdir(spLang
2a90: 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22 29 3a  +"/modules-js"):
2aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2ab0: 72 65 2e 6d 61 74 63 68 28 72 22 67 63 65 5f 5c  re.match(r"gce_\
2ac0: 77 2b 5b 2e 5d 6a 73 24 22 2c 20 73 66 29 3a 0a  w+[.]js$", sf):.
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 73 43 6f 64 65 50 6c 75 67 69 6e 73 20 2b 3d 20  sCodePlugins += 
2af0: 22 5c 6e 5c 6e 22 20 2b 20 6f 70 65 6e 28 73 70  "\n\n" + open(sp
2b00: 4c 61 6e 67 2b 27 2f 6d 6f 64 75 6c 65 73 2d 6a  Lang+'/modules-j
2b10: 73 2f 27 2b 73 66 2c 20 22 72 22 2c 20 65 6e 63  s/'+sf, "r", enc
2b20: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72  oding="utf-8").r
2b30: 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 20 20  ead().          
2b40: 20 20 20 20 20 20 70 72 69 6e 74 28 73 66 2c 20        print(sf, 
2b50: 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 20 20  end=", ").      
2b60: 20 20 70 72 69 6e 74 28 29 0a 20 20 20 20 20 20    print().      
2b70: 20 20 64 56 61 72 73 5b 22 70 6c 75 67 69 6e 73    dVars["plugins
2b80: 4a 53 22 5d 20 3d 20 73 43 6f 64 65 50 6c 75 67  JS"] = sCodePlug
2b90: 69 6e 73 0a 0a 20 20 20 20 20 20 20 20 23 20 6f  ins..        # o
2ba0: 70 74 69 6f 6e 73 20 64 61 74 61 20 73 74 72 75  ptions data stru
2bb0: 63 74 0a 20 20 20 20 20 20 20 20 64 56 61 72 73  ct.        dVars
2bc0: 5b 22 64 4f 70 74 4a 61 76 61 53 63 72 69 70 74  ["dOptJavaScript
2bd0: 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28  "] = json.dumps(
2be0: 6c 69 73 74 28 64 56 61 72 73 5b 22 64 4f 70 74  list(dVars["dOpt
2bf0: 4a 61 76 61 53 63 72 69 70 74 22 5d 2e 69 74 65  JavaScript"].ite
2c00: 6d 73 28 29 29 29 0a 20 20 20 20 20 20 20 20 64  ms())).        d
2c10: 56 61 72 73 5b 22 64 4f 70 74 46 69 72 65 66 6f  Vars["dOptFirefo
2c20: 78 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73  x"] = json.dumps
2c30: 28 6c 69 73 74 28 64 56 61 72 73 5b 22 64 4f 70  (list(dVars["dOp
2c40: 74 46 69 72 65 66 6f 78 22 5d 2e 69 74 65 6d 73  tFirefox"].items
2c50: 28 29 29 29 0a 20 20 20 20 20 20 20 20 64 56 61  ())).        dVa
2c60: 72 73 5b 22 64 4f 70 74 54 68 75 6e 64 65 72 62  rs["dOptThunderb
2c70: 69 72 64 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d  ird"] = json.dum
2c80: 70 73 28 6c 69 73 74 28 64 56 61 72 73 5b 22 64  ps(list(dVars["d
2c90: 4f 70 74 54 68 75 6e 64 65 72 62 69 72 64 22 5d  OptThunderbird"]
2ca0: 2e 69 74 65 6d 73 28 29 29 29 0a 0a 20 20 20 20  .items()))..    
2cb0: 20 20 20 20 23 20 63 72 65 61 74 65 20 66 6f 6c      # create fol
2cc0: 64 65 72 0a 20 20 20 20 20 20 20 20 73 70 4c 61  der.        spLa
2cd0: 6e 67 50 61 63 6b 20 3d 20 22 67 72 61 6d 6d 61  ngPack = "gramma
2ce0: 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 4c 61 6e 67  lecte-js/"+sLang
2cf0: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73  .        helpers
2d00: 2e 63 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64  .createCleanFold
2d10: 65 72 28 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a  er(spLangPack)..
2d20: 20 20 20 20 20 20 20 20 23 20 63 72 65 61 74 65          # create
2d30: 20 66 69 6c 65 73 0a 20 20 20 20 20 20 20 20 66   files.        f
2d40: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
2d50: 64 69 72 28 22 6a 73 5f 65 78 74 65 6e 73 69 6f  dir("js_extensio
2d60: 6e 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  n"):.           
2d70: 20 64 56 61 72 73 5b 73 66 5b 3a 2d 33 5d 5d 20   dVars[sf[:-3]] 
2d80: 3d 20 6f 70 65 6e 28 22 6a 73 5f 65 78 74 65 6e  = open("js_exten
2d90: 73 69 6f 6e 2f 22 2b 73 66 2c 20 22 72 22 2c 20  sion/"+sf, "r", 
2da0: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
2db0: 29 2e 72 65 61 64 28 29 0a 20 20 20 20 20 20 20  ).read().       
2dc0: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
2dd0: 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a  stdir("gc_core/j
2de0: 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s"):.           
2df0: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
2e00: 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a  isdir("gc_core/j
2e10: 73 2f 22 2b 73 66 29 20 61 6e 64 20 6e 6f 74 20  s/"+sf) and not 
2e20: 73 66 2e 73 74 61 72 74 73 77 69 74 68 28 22 6a  sf.startswith("j
2e30: 73 65 78 5f 22 29 3a 0a 20 20 20 20 20 20 20 20  sex_"):.        
2e40: 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e          helpers.
2e50: 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c  copyAndFileTempl
2e60: 61 74 65 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f  ate("gc_core/js/
2e70: 22 2b 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65 63  "+sf, "grammalec
2e80: 74 65 2d 6a 73 2f 22 2b 73 66 2c 20 64 56 61 72  te-js/"+sf, dVar
2e90: 73 29 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 28  s).        open(
2ea0: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
2eb0: 57 41 52 4e 49 4e 47 2e 74 78 74 22 2c 20 22 77  WARNING.txt", "w
2ec0: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
2ed0: 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e  -8", newline="\n
2ee0: 22 29 2e 77 72 69 74 65 28 73 57 61 72 6e 69 6e  ").write(sWarnin
2ef0: 67 4d 65 73 73 61 67 65 29 0a 20 20 20 20 20 20  gMessage).      
2f00: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
2f10: 69 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f  istdir("gc_core/
2f20: 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 22 29 3a 0a  js/lang_core"):.
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
2f40: 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72  ot os.path.isdir
2f50: 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e  ("gc_core/js/lan
2f60: 67 5f 63 6f 72 65 2f 22 2b 73 66 29 20 61 6e 64  g_core/"+sf) and
2f70: 20 73 66 2e 73 74 61 72 74 73 77 69 74 68 28 22   sf.startswith("
2f80: 67 63 5f 22 29 3a 0a 20 20 20 20 20 20 20 20 20  gc_"):.         
2f90: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63         helpers.c
2fa0: 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61  opyAndFileTempla
2fb0: 74 65 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 6c  te("gc_core/js/l
2fc0: 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73  ang_core/"+sf, s
2fd0: 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66  pLangPack+"/"+sf
2fe0: 2c 20 64 56 61 72 73 29 0a 20 20 20 20 20 20 20  , dVars).       
2ff0: 20 70 72 69 6e 74 28 22 2b 20 4d 6f 64 75 6c 65   print("+ Module
3000: 73 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20  s: ", end="").  
3010: 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20        for sf in 
3020: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e  os.listdir(spLan
3030: 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22 29  g+"/modules-js")
3040: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
3050: 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69   not sf.startswi
3060: 74 68 28 22 67 63 65 5f 22 29 3a 0a 20 20 20 20  th("gce_"):.    
3070: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
3080: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
3090: 65 6d 70 6c 61 74 65 28 73 70 4c 61 6e 67 2b 22  emplate(spLang+"
30a0: 2f 6d 6f 64 75 6c 65 73 2d 6a 73 2f 22 2b 73 66  /modules-js/"+sf
30b0: 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22  , spLangPack+"/"
30c0: 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20  +sf, dVars).    
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
30e0: 74 28 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a  t(sf, end=", ").
30f0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 29 0a          print().
3100: 0a 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20  .        try:.  
3110: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 6a            buildj
3120: 73 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d  s = importlib.im
3130: 70 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67 63 5f  port_module("gc_
3140: 6c 61 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22 2e 62  lang."+sLang+".b
3150: 75 69 6c 64 22 29 0a 20 20 20 20 20 20 20 20 65  uild").        e
3160: 78 63 65 70 74 20 49 6d 70 6f 72 74 45 72 72 6f  xcept ImportErro
3170: 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r:.            p
3180: 72 69 6e 74 28 22 23 20 4e 6f 20 63 6f 6d 70 6c  rint("# No compl
3190: 65 6d 65 6e 74 61 72 79 20 62 75 69 6c 64 65 72  ementary builder
31a0: 20 3c 62 75 69 6c 64 2e 70 79 3e 20 69 6e 20 66   <build.py> in f
31b0: 6f 6c 64 65 72 20 67 63 5f 6c 61 6e 67 2f 22 2b  older gc_lang/"+
31c0: 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 65  sLang).        e
31d0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
31e0: 20 62 75 69 6c 64 6a 73 2e 62 75 69 6c 64 28 73   buildjs.build(s
31f0: 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70 4c  Lang, dVars, spL
3200: 61 6e 67 50 61 63 6b 29 0a 0a 20 20 20 20 72 65  angPack)..    re
3210: 74 75 72 6e 20 64 56 61 72 73 5b 27 76 65 72 73  turn dVars['vers
3220: 69 6f 6e 27 5d 0a 0a 0a 64 65 66 20 63 6f 70 79  ion']...def copy
3230: 47 72 61 70 68 73 70 65 6c 6c 43 6f 72 65 20 28  GraphspellCore (
3240: 62 4a 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73  bJavaScript=Fals
3250: 65 29 3a 0a 20 20 20 20 22 63 6f 70 79 20 47 72  e):.    "copy Gr
3260: 61 70 68 73 70 65 6c 6c 20 70 61 63 6b 61 67 65  aphspell package
3270: 20 69 6e 20 47 72 61 6d 6d 61 6c 65 63 74 65 20   in Grammalecte 
3280: 70 61 63 6b 61 67 65 22 0a 20 20 20 20 68 65 6c  package".    hel
3290: 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e  pers.createClean
32a0: 46 6f 6c 64 65 72 28 22 67 72 61 6d 6d 61 6c 65  Folder("grammale
32b0: 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 22 29  cte/graphspell")
32c0: 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b  .    dir_util.mk
32d0: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
32e0: 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69  e/graphspell/_di
32f0: 63 74 69 6f 6e 61 72 69 65 73 22 29 0a 20 20 20  ctionaries").   
3300: 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69   for sf in os.li
3310: 73 74 64 69 72 28 22 67 72 61 70 68 73 70 65 6c  stdir("graphspel
3320: 6c 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  l"):.        if 
3330: 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69  not os.path.isdi
3340: 72 28 22 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  r("graphspell/"+
3350: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
3360: 20 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f   file_util.copy_
3370: 66 69 6c 65 28 22 67 72 61 70 68 73 70 65 6c 6c  file("graphspell
3380: 2f 22 2b 73 66 2c 20 22 67 72 61 6d 6d 61 6c 65  /"+sf, "grammale
3390: 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 22 29  cte/graphspell")
33a0: 0a 20 20 20 20 69 66 20 62 4a 61 76 61 53 63 72  .    if bJavaScr
33b0: 69 70 74 3a 0a 20 20 20 20 20 20 20 20 68 65 6c  ipt:.        hel
33c0: 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e  pers.createClean
33d0: 46 6f 6c 64 65 72 28 22 67 72 61 6d 6d 61 6c 65  Folder("grammale
33e0: 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c  cte-js/graphspel
33f0: 6c 22 29 0a 20 20 20 20 20 20 20 20 64 69 72 5f  l").        dir_
3400: 75 74 69 6c 2e 6d 6b 70 61 74 68 28 22 67 72 61  util.mkpath("gra
3410: 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70  mmalecte-js/grap
3420: 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61  hspell/_dictiona
3430: 72 69 65 73 22 29 0a 20 20 20 20 20 20 20 20 64  ries").        d
3440: 56 61 72 73 20 3d 20 7b 7d 0a 20 20 20 20 20 20  Vars = {}.      
3450: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
3460: 69 73 74 64 69 72 28 22 6a 73 5f 65 78 74 65 6e  istdir("js_exten
3470: 73 69 6f 6e 22 29 3a 0a 20 20 20 20 20 20 20 20  sion"):.        
3480: 20 20 20 20 64 56 61 72 73 5b 73 66 5b 3a 2d 33      dVars[sf[:-3
3490: 5d 5d 20 3d 20 6f 70 65 6e 28 22 6a 73 5f 65 78  ]] = open("js_ex
34a0: 74 65 6e 73 69 6f 6e 2f 22 2b 73 66 2c 20 22 72  tension/"+sf, "r
34b0: 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66  ", encoding="utf
34c0: 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20 20 20  -8").read().    
34d0: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
34e0: 2e 6c 69 73 74 64 69 72 28 22 67 72 61 70 68 73  .listdir("graphs
34f0: 70 65 6c 6c 2d 6a 73 22 29 3a 0a 20 20 20 20 20  pell-js"):.     
3500: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
3510: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61  .path.isdir("gra
3520: 70 68 73 70 65 6c 6c 2d 6a 73 2f 22 2b 73 66 29  phspell-js/"+sf)
3530: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3540: 20 20 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79    file_util.copy
3550: 5f 66 69 6c 65 28 22 67 72 61 70 68 73 70 65 6c  _file("graphspel
3560: 6c 2d 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61 6d  l-js/"+sf, "gram
3570: 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68  malecte-js/graph
3580: 73 70 65 6c 6c 22 29 0a 20 20 20 20 20 20 20 20  spell").        
3590: 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e          helpers.
35a0: 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c  copyAndFileTempl
35b0: 61 74 65 28 22 67 72 61 70 68 73 70 65 6c 6c 2d  ate("graphspell-
35c0: 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61 6d 6d 61  js/"+sf, "gramma
35d0: 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70  lecte-js/graphsp
35e0: 65 6c 6c 2f 22 2b 73 66 2c 20 64 56 61 72 73 29  ell/"+sf, dVars)
35f0: 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72 61 70 68  ...def copyGraph
3600: 73 70 65 6c 6c 44 69 63 74 69 6f 6e 61 72 69 65  spellDictionarie
3610: 73 20 28 64 56 61 72 73 2c 20 62 4a 61 76 61 53  s (dVars, bJavaS
3620: 63 72 69 70 74 3d 46 61 6c 73 65 2c 20 62 43 6f  cript=False, bCo
3630: 6d 6d 75 6e 69 74 79 44 69 63 74 3d 46 61 6c 73  mmunityDict=Fals
3640: 65 2c 20 62 50 65 72 73 6f 6e 61 6c 44 69 63 74  e, bPersonalDict
3650: 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22 63 6f  =False):.    "co
3660: 70 79 20 72 65 71 75 65 73 74 65 64 20 47 72 61  py requested Gra
3670: 70 68 73 70 65 6c 6c 20 64 69 63 74 69 6f 6e 61  phspell dictiona
3680: 72 69 65 73 20 69 6e 20 47 72 61 6d 6d 61 6c 65  ries in Grammale
3690: 63 74 65 20 70 61 63 6b 61 67 65 22 0a 20 20 20  cte package".   
36a0: 20 64 56 61 72 73 5b 22 64 69 63 5f 6d 61 69 6e   dVars["dic_main
36b0: 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 22 5d 20 3d  _filename_py"] =
36c0: 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64   "".    dVars["d
36d0: 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65  ic_main_filename
36e0: 5f 6a 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 64  _js"] = "".    d
36f0: 56 61 72 73 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e  Vars["dic_commun
3700: 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 22  ity_filename_py"
3710: 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73  ] = "".    dVars
3720: 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f  ["dic_community_
3730: 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20  filename_js"] = 
3740: 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69  "".    dVars["di
3750: 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e  c_personal_filen
3760: 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20  ame_py"] = "".  
3770: 20 20 64 56 61 72 73 5b 22 64 69 63 5f 70 65 72    dVars["dic_per
3780: 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a  sonal_filename_j
3790: 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 6c 44 69  s"] = "".    lDi
37a0: 63 74 20 3d 20 5b 20 28 22 6d 61 69 6e 22 2c 20  ct = [ ("main", 
37b0: 73 29 20 20 66 6f 72 20 73 20 69 6e 20 64 56 61  s)  for s in dVa
37c0: 72 73 5b 27 64 69 63 5f 66 69 6c 65 6e 61 6d 65  rs['dic_filename
37d0: 73 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29 20 5d  s'].split(",") ]
37e0: 0a 20 20 20 20 69 66 20 62 43 6f 6d 6d 75 6e 69  .    if bCommuni
37f0: 74 79 44 69 63 74 3a 0a 20 20 20 20 20 20 20 20  tyDict:.        
3800: 6c 44 69 63 74 2e 61 70 70 65 6e 64 28 28 22 63  lDict.append(("c
3810: 6f 6d 6d 75 6e 69 74 79 22 2c 20 64 56 61 72 73  ommunity", dVars
3820: 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f  ['dic_community_
3830: 66 69 6c 65 6e 61 6d 65 27 5d 29 29 0a 20 20 20  filename'])).   
3840: 20 69 66 20 62 50 65 72 73 6f 6e 61 6c 44 69 63   if bPersonalDic
3850: 74 3a 0a 20 20 20 20 20 20 20 20 6c 44 69 63 74  t:.        lDict
3860: 2e 61 70 70 65 6e 64 28 28 22 70 65 72 73 6f 6e  .append(("person
3870: 61 6c 22 2c 20 64 56 61 72 73 5b 27 64 69 63 5f  al", dVars['dic_
3880: 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d  personal_filenam
3890: 65 27 5d 29 29 0a 20 20 20 20 66 6f 72 20 73 54  e'])).    for sT
38a0: 79 70 65 2c 20 73 46 69 6c 65 4e 61 6d 65 20 69  ype, sFileName i
38b0: 6e 20 6c 44 69 63 74 3a 0a 20 20 20 20 20 20 20  n lDict:.       
38c0: 20 73 70 66 50 79 44 69 63 20 3d 20 22 67 72 61   spfPyDic = "gra
38d0: 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e  phspell/_diction
38e0: 61 72 69 65 73 2f 22 20 2b 20 73 46 69 6c 65 4e  aries/" + sFileN
38f0: 61 6d 65 20 2b 20 22 2e 62 64 69 63 22 0a 20 20  ame + ".bdic".  
3900: 20 20 20 20 20 20 73 70 66 4a 53 44 69 63 20 3d        spfJSDic =
3910: 20 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f   "graphspell-js/
3920: 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 20  _dictionaries/" 
3930: 2b 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 22 2e  + sFileName + ".
3940: 6a 73 6f 6e 22 0a 20 20 20 20 20 20 20 20 69 66  json".        if
3950: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 66   not os.path.isf
3960: 69 6c 65 28 73 70 66 50 79 44 69 63 29 20 6f 72  ile(spfPyDic) or
3970: 20 28 62 4a 61 76 61 53 63 72 69 70 74 20 61 6e   (bJavaScript an
3980: 64 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73  d not os.path.is
3990: 66 69 6c 65 28 73 70 66 4a 53 44 69 63 29 29 3a  file(spfJSDic)):
39a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69  .            bui
39b0: 6c 64 44 69 63 74 69 6f 6e 61 72 79 28 64 56 61  ldDictionary(dVa
39c0: 72 73 2c 20 73 54 79 70 65 2c 20 62 4a 61 76 61  rs, sType, bJava
39d0: 53 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20  Script).        
39e0: 70 72 69 6e 74 28 73 70 66 50 79 44 69 63 29 0a  print(spfPyDic).
39f0: 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69          file_uti
3a00: 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73 70 66 50  l.copy_file(spfP
3a10: 79 44 69 63 2c 20 22 67 72 61 6d 6d 61 6c 65 63  yDic, "grammalec
3a20: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64  te/graphspell/_d
3a30: 69 63 74 69 6f 6e 61 72 69 65 73 22 29 0a 20 20  ictionaries").  
3a40: 20 20 20 20 20 20 64 56 61 72 73 5b 27 64 69 63        dVars['dic
3a50: 5f 27 2b 73 54 79 70 65 2b 27 5f 66 69 6c 65 6e  _'+sType+'_filen
3a60: 61 6d 65 5f 70 79 27 5d 20 3d 20 73 46 69 6c 65  ame_py'] = sFile
3a70: 4e 61 6d 65 20 2b 20 27 2e 62 64 69 63 27 0a 20  Name + '.bdic'. 
3a80: 20 20 20 20 20 20 20 69 66 20 62 4a 61 76 61 53         if bJavaS
3a90: 63 72 69 70 74 3a 0a 20 20 20 20 20 20 20 20 20  cript:.         
3aa0: 20 20 20 70 72 69 6e 74 28 73 70 66 4a 53 44 69     print(spfJSDi
3ab0: 63 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  c).            f
3ac0: 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f 66 69  ile_util.copy_fi
3ad0: 6c 65 28 73 70 66 4a 53 44 69 63 2c 20 22 67 72  le(spfJSDic, "gr
3ae0: 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61  ammalecte-js/gra
3af0: 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e  phspell/_diction
3b00: 61 72 69 65 73 22 29 0a 20 20 20 20 20 20 20 20  aries").        
3b10: 20 20 20 20 64 56 61 72 73 5b 27 64 69 63 5f 27      dVars['dic_'
3b20: 2b 73 54 79 70 65 2b 27 5f 66 69 6c 65 6e 61 6d  +sType+'_filenam
3b30: 65 5f 6a 73 27 5d 20 3d 20 73 46 69 6c 65 4e 61  e_js'] = sFileNa
3b40: 6d 65 20 2b 20 27 2e 6a 73 6f 6e 27 0a 20 20 20  me + '.json'.   
3b50: 20 64 56 61 72 73 5b 27 64 69 63 5f 6d 61 69 6e   dVars['dic_main
3b60: 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 27 5d 20 3d  _filename_py'] =
3b70: 20 64 56 61 72 73 5b 27 64 69 63 5f 64 65 66 61   dVars['dic_defa
3b80: 75 6c 74 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 27  ult_filename_py'
3b90: 5d 20 2b 20 22 2e 62 64 69 63 22 0a 20 20 20 20  ] + ".bdic".    
3ba0: 64 56 61 72 73 5b 27 64 69 63 5f 6d 61 69 6e 5f  dVars['dic_main_
3bb0: 66 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d 20 3d 20  filename_js'] = 
3bc0: 64 56 61 72 73 5b 27 64 69 63 5f 64 65 66 61 75  dVars['dic_defau
3bd0: 6c 74 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d  lt_filename_js']
3be0: 20 2b 20 22 2e 6a 73 6f 6e 22 0a 0a 0a 64 65 66   + ".json"...def
3bf0: 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79   buildDictionary
3c00: 20 28 64 56 61 72 73 2c 20 73 54 79 70 65 2c 20   (dVars, sType, 
3c10: 62 4a 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73  bJavaScript=Fals
3c20: 65 29 3a 0a 20 20 20 20 22 62 75 69 6c 64 20 62  e):.    "build b
3c30: 69 6e 61 72 79 20 64 69 63 74 69 6f 6e 61 72 79  inary dictionary
3c40: 20 66 6f 72 20 47 72 61 70 68 73 70 65 6c 6c 20   for Graphspell 
3c50: 66 72 6f 6d 20 6c 65 78 69 63 6f 6e 73 22 0a 20  from lexicons". 
3c60: 20 20 20 69 66 20 73 54 79 70 65 20 3d 3d 20 22     if sType == "
3c70: 6d 61 69 6e 22 3a 0a 20 20 20 20 20 20 20 20 73  main":.        s
3c80: 70 66 4c 65 78 53 72 63 20 3d 20 64 56 61 72 73  pfLexSrc = dVars
3c90: 5b 27 6c 65 78 69 63 6f 6e 5f 73 72 63 27 5d 0a  ['lexicon_src'].
3ca0: 20 20 20 20 20 20 20 20 6c 53 66 44 69 63 74 44          lSfDictD
3cb0: 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f  st = dVars['dic_
3cc0: 66 69 6c 65 6e 61 6d 65 73 27 5d 2e 73 70 6c 69  filenames'].spli
3cd0: 74 28 22 2c 22 29 0a 20 20 20 20 20 20 20 20 6c  t(",").        l
3ce0: 44 69 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b  DicName = dVars[
3cf0: 27 64 69 63 5f 6e 61 6d 65 27 5d 2e 73 70 6c 69  'dic_name'].spli
3d00: 74 28 22 2c 22 29 0a 20 20 20 20 20 20 20 20 6c  t(",").        l
3d10: 44 65 73 63 72 69 70 74 69 6f 6e 20 3d 20 64 56  Description = dV
3d20: 61 72 73 5b 27 64 69 63 5f 64 65 73 63 72 69 70  ars['dic_descrip
3d30: 74 69 6f 6e 27 5d 2e 73 70 6c 69 74 28 22 2c 22  tion'].split(","
3d40: 29 0a 20 20 20 20 20 20 20 20 6c 46 69 6c 74 65  ).        lFilte
3d50: 72 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 66  r = dVars['dic_f
3d60: 69 6c 74 65 72 27 5d 2e 73 70 6c 69 74 28 22 2c  ilter'].split(",
3d70: 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73  ").        for s
3d80: 66 44 69 63 74 44 73 74 2c 20 73 44 69 63 4e 61  fDictDst, sDicNa
3d90: 6d 65 2c 20 73 44 65 73 63 72 69 70 74 69 6f 6e  me, sDescription
3da0: 2c 20 73 46 69 6c 74 65 72 20 69 6e 20 7a 69 70  , sFilter in zip
3db0: 28 6c 53 66 44 69 63 74 44 73 74 2c 20 6c 44 69  (lSfDictDst, lDi
3dc0: 63 4e 61 6d 65 2c 20 6c 44 65 73 63 72 69 70 74  cName, lDescript
3dd0: 69 6f 6e 2c 20 6c 46 69 6c 74 65 72 29 3a 0a 20  ion, lFilter):. 
3de0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 78 5f 62             lex_b
3df0: 75 69 6c 64 2e 62 75 69 6c 64 28 73 70 66 4c 65  uild.build(spfLe
3e00: 78 53 72 63 2c 20 64 56 61 72 73 5b 27 6c 61 6e  xSrc, dVars['lan
3e10: 67 27 5d 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67  g'], dVars['lang
3e20: 5f 6e 61 6d 65 27 5d 2c 20 73 66 44 69 63 74 44  _name'], sfDictD
3e30: 73 74 2c 20 62 4a 61 76 61 53 63 72 69 70 74 2c  st, bJavaScript,
3e40: 20 73 44 69 63 4e 61 6d 65 2c 20 73 44 65 73 63   sDicName, sDesc
3e50: 72 69 70 74 69 6f 6e 2c 20 73 46 69 6c 74 65 72  ription, sFilter
3e60: 2c 20 64 56 61 72 73 5b 27 73 74 65 6d 6d 69 6e  , dVars['stemmin
3e70: 67 5f 6d 65 74 68 6f 64 27 5d 2c 20 69 6e 74 28  g_method'], int(
3e80: 64 56 61 72 73 5b 27 66 73 61 5f 6d 65 74 68 6f  dVars['fsa_metho
3e90: 64 27 5d 29 29 0a 20 20 20 20 65 6c 73 65 3a 0a  d'])).    else:.
3ea0: 20 20 20 20 20 20 20 20 69 66 20 73 54 79 70 65          if sType
3eb0: 20 3d 3d 20 22 63 6f 6d 6d 75 6e 69 74 79 22 3a   == "community":
3ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70 66  .            spf
3ed0: 4c 65 78 53 72 63 20 3d 20 64 56 61 72 73 5b 27  LexSrc = dVars['
3ee0: 6c 65 78 69 63 6f 6e 5f 63 6f 6d 6d 75 6e 69 74  lexicon_communit
3ef0: 79 5f 73 72 63 27 5d 0a 20 20 20 20 20 20 20 20  y_src'].        
3f00: 20 20 20 20 73 66 44 69 63 74 44 73 74 20 3d 20      sfDictDst = 
3f10: 64 56 61 72 73 5b 27 64 69 63 5f 63 6f 6d 6d 75  dVars['dic_commu
3f20: 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a  nity_filename'].
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 63              sDic
3f40: 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64 69  Name = dVars['di
3f50: 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 6e 61 6d 65  c_community_name
3f60: 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  '].            s
3f70: 44 65 73 63 72 69 70 74 69 6f 6e 20 3d 20 64 56  Description = dV
3f80: 61 72 73 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69  ars['dic_communi
3f90: 74 79 5f 64 65 73 63 72 69 70 74 69 6f 6e 27 5d  ty_description']
3fa0: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 54  .        elif sT
3fb0: 79 70 65 20 3d 3d 20 22 70 65 72 73 6f 6e 61 6c  ype == "personal
3fc0: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ":.            s
3fd0: 70 66 4c 65 78 53 72 63 20 3d 20 64 56 61 72 73  pfLexSrc = dVars
3fe0: 5b 27 6c 65 78 69 63 6f 6e 5f 70 65 72 73 6f 6e  ['lexicon_person
3ff0: 61 6c 5f 73 72 63 27 5d 0a 20 20 20 20 20 20 20  al_src'].       
4000: 20 20 20 20 20 73 66 44 69 63 74 44 73 74 20 3d       sfDictDst =
4010: 20 64 56 61 72 73 5b 27 64 69 63 5f 70 65 72 73   dVars['dic_pers
4020: 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 27 5d 0a  onal_filename'].
4030: 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 63              sDic
4040: 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64 69  Name = dVars['di
4050: 63 5f 70 65 72 73 6f 6e 61 6c 5f 6e 61 6d 65 27  c_personal_name'
4060: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 44  ].            sD
4070: 65 73 63 72 69 70 74 69 6f 6e 20 3d 20 64 56 61  escription = dVa
4080: 72 73 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61 6c  rs['dic_personal
4090: 5f 64 65 73 63 72 69 70 74 69 6f 6e 27 5d 0a 20  _description']. 
40a0: 20 20 20 20 20 20 20 6c 65 78 5f 62 75 69 6c 64         lex_build
40b0: 2e 62 75 69 6c 64 28 73 70 66 4c 65 78 53 72 63  .build(spfLexSrc
40c0: 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c  , dVars['lang'],
40d0: 20 64 56 61 72 73 5b 27 6c 61 6e 67 5f 6e 61 6d   dVars['lang_nam
40e0: 65 27 5d 2c 20 73 66 44 69 63 74 44 73 74 2c 20  e'], sfDictDst, 
40f0: 62 4a 61 76 61 53 63 72 69 70 74 2c 20 73 44 69  bJavaScript, sDi
4100: 63 4e 61 6d 65 2c 20 73 44 65 73 63 72 69 70 74  cName, sDescript
4110: 69 6f 6e 2c 20 22 22 2c 20 64 56 61 72 73 5b 27  ion, "", dVars['
4120: 73 74 65 6d 6d 69 6e 67 5f 6d 65 74 68 6f 64 27  stemming_method'
4130: 5d 2c 20 69 6e 74 28 64 56 61 72 73 5b 27 66 73  ], int(dVars['fs
4140: 61 5f 6d 65 74 68 6f 64 27 5d 29 29 0a 0a 0a 64  a_method']))...d
4150: 65 66 20 6d 61 69 6e 20 28 29 3a 0a 20 20 20 20  ef main ():.    
4160: 22 62 75 69 6c 64 20 47 72 61 6d 6d 61 6c 65 63  "build Grammalec
4170: 74 65 20 77 69 74 68 20 72 65 71 75 65 73 74 65  te with requeste
4180: 64 20 6f 70 74 69 6f 6e 73 22 0a 20 20 20 20 70  d options".    p
4190: 72 69 6e 74 28 22 50 79 74 68 6f 6e 3a 20 22 20  rint("Python: " 
41a0: 2b 20 73 79 73 2e 76 65 72 73 69 6f 6e 29 0a 20  + sys.version). 
41b0: 20 20 20 78 50 61 72 73 65 72 20 3d 20 61 72 67     xParser = arg
41c0: 70 61 72 73 65 2e 41 72 67 75 6d 65 6e 74 50 61  parse.ArgumentPa
41d0: 72 73 65 72 28 29 0a 20 20 20 20 78 50 61 72 73  rser().    xPars
41e0: 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28  er.add_argument(
41f0: 22 6c 61 6e 67 22 2c 20 74 79 70 65 3d 73 74 72  "lang", type=str
4200: 2c 20 6e 61 72 67 73 3d 27 2b 27 2c 20 68 65 6c  , nargs='+', hel
4210: 70 3d 22 6c 61 6e 67 20 70 72 6f 6a 65 63 74 20  p="lang project 
4220: 74 6f 20 67 65 6e 65 72 61 74 65 20 28 6e 61 6d  to generate (nam
4230: 65 20 6f 66 20 66 6f 6c 64 65 72 20 69 6e 20 2f  e of folder in /
4240: 6c 61 6e 67 29 22 29 0a 20 20 20 20 78 50 61 72  lang)").    xPar
4250: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4260: 28 22 2d 75 63 22 2c 20 22 2d 2d 75 73 65 5f 63  ("-uc", "--use_c
4270: 61 63 68 65 22 2c 20 68 65 6c 70 3d 22 75 73 65  ache", help="use
4280: 20 64 61 74 61 20 63 61 63 68 65 20 69 6e 73 74   data cache inst
4290: 65 61 64 20 6f 66 20 72 65 62 75 69 6c 64 69 6e  ead of rebuildin
42a0: 67 20 72 75 6c 65 73 22 2c 20 61 63 74 69 6f 6e  g rules", action
42b0: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
42c0: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
42d0: 72 67 75 6d 65 6e 74 28 22 2d 62 22 2c 20 22 2d  rgument("-b", "-
42e0: 2d 62 75 69 6c 64 5f 64 61 74 61 22 2c 20 68 65  -build_data", he
42f0: 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75 69 6c 64  lp="launch build
4300: 5f 64 61 74 61 2e 70 79 20 28 70 61 72 74 20 31  _data.py (part 1
4310: 20 61 6e 64 20 32 29 22 2c 20 61 63 74 69 6f 6e   and 2)", action
4320: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4330: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
4340: 72 67 75 6d 65 6e 74 28 22 2d 62 62 22 2c 20 22  rgument("-bb", "
4350: 2d 2d 62 75 69 6c 64 5f 64 61 74 61 5f 62 65 66  --build_data_bef
4360: 6f 72 65 22 2c 20 68 65 6c 70 3d 22 6c 61 75 6e  ore", help="laun
4370: 63 68 20 62 75 69 6c 64 5f 64 61 74 61 2e 70 79  ch build_data.py
4380: 20 28 6f 6e 6c 79 20 70 61 72 74 20 31 3a 20 62   (only part 1: b
4390: 65 66 6f 72 65 20 64 69 63 74 69 6f 6e 61 72 79  efore dictionary
43a0: 20 62 75 69 6c 64 69 6e 67 29 22 2c 20 61 63 74   building)", act
43b0: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
43c0: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
43d0: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 62 61 22  d_argument("-ba"
43e0: 2c 20 22 2d 2d 62 75 69 6c 64 5f 64 61 74 61 5f  , "--build_data_
43f0: 61 66 74 65 72 22 2c 20 68 65 6c 70 3d 22 6c 61  after", help="la
4400: 75 6e 63 68 20 62 75 69 6c 64 5f 64 61 74 61 2e  unch build_data.
4410: 70 79 20 28 6f 6e 6c 79 20 70 61 72 74 20 32 3a  py (only part 2:
4420: 20 62 65 66 6f 72 65 20 64 69 63 74 69 6f 6e 61   before dictiona
4430: 72 79 20 62 75 69 6c 64 69 6e 67 29 22 2c 20 61  ry building)", a
4440: 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75  ction="store_tru
4450: 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e  e").    xParser.
4460: 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 64  add_argument("-d
4470: 22 2c 20 22 2d 2d 64 69 63 74 22 2c 20 68 65 6c  ", "--dict", hel
4480: 70 3d 22 67 65 6e 65 72 61 74 65 20 46 53 41 20  p="generate FSA 
4490: 64 69 63 74 69 6f 6e 61 72 79 22 2c 20 61 63 74  dictionary", act
44a0: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
44b0: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
44c0: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 74 22 2c  d_argument("-t",
44d0: 20 22 2d 2d 74 65 73 74 73 22 2c 20 68 65 6c 70   "--tests", help
44e0: 3d 22 72 75 6e 20 75 6e 69 74 20 74 65 73 74 73  ="run unit tests
44f0: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4500: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
4510: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4520: 28 22 2d 70 22 2c 20 22 2d 2d 70 65 72 66 22 2c  ("-p", "--perf",
4530: 20 68 65 6c 70 3d 22 72 75 6e 20 70 65 72 66 6f   help="run perfo
4540: 72 6d 61 6e 63 65 20 74 65 73 74 73 22 2c 20 61  rmance tests", a
4550: 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75  ction="store_tru
4560: 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e  e").    xParser.
4570: 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 70  add_argument("-p
4580: 6d 22 2c 20 22 2d 2d 70 65 72 66 5f 6d 65 6d 6f  m", "--perf_memo
4590: 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20 70 65 72  ", help="run per
45a0: 66 6f 72 6d 61 6e 63 65 20 74 65 73 74 73 20 61  formance tests a
45b0: 6e 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  nd store results
45c0: 20 69 6e 20 70 65 72 66 5f 6d 65 6d 6f 2e 74 78   in perf_memo.tx
45d0: 74 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  t", action="stor
45e0: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
45f0: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
4600: 74 28 22 2d 6a 73 22 2c 20 22 2d 2d 6a 61 76 61  t("-js", "--java
4610: 73 63 72 69 70 74 22 2c 20 68 65 6c 70 3d 22 4a  script", help="J
4620: 61 76 61 53 63 72 69 70 74 20 62 75 69 6c 64 20  avaScript build 
4630: 66 6f 72 20 46 69 72 65 66 6f 78 22 2c 20 61 63  for Firefox", ac
4640: 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65  tion="store_true
4650: 22 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  ").    xParser.a
4660: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 61 63  dd_argument("-ac
4670: 64 22 2c 20 22 2d 2d 61 64 64 5f 63 6f 6d 6d 75  d", "--add_commu
4680: 6e 69 74 79 5f 64 69 63 74 69 6f 6e 61 72 79 22  nity_dictionary"
4690: 2c 20 68 65 6c 70 3d 22 61 64 64 20 63 6f 6d 6d  , help="add comm
46a0: 75 6e 69 74 79 20 64 69 63 74 69 6f 6e 61 72 79  unity dictionary
46b0: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 22 2c 20   to the build", 
46c0: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
46d0: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
46e0: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
46f0: 61 70 64 22 2c 20 22 2d 2d 61 64 64 5f 70 65 72  apd", "--add_per
4700: 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79  sonal_dictionary
4710: 22 2c 20 68 65 6c 70 3d 22 61 64 64 20 70 65 72  ", help="add per
4720: 73 6f 6e 61 6c 20 64 69 63 74 69 6f 6e 61 72 79  sonal dictionary
4730: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 22 2c 20   to the build", 
4740: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
4750: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
4760: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
4770: 66 78 22 2c 20 22 2d 2d 66 69 72 65 66 6f 78 22  fx", "--firefox"
4780: 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20 46  , help="Launch F
4790: 69 72 65 66 6f 78 20 44 65 76 65 6c 6f 70 70 65  irefox Developpe
47a0: 72 20 66 6f 72 20 57 65 62 45 78 74 65 6e 73 69  r for WebExtensi
47b0: 6f 6e 20 74 65 73 74 69 6e 67 22 2c 20 61 63 74  on testing", act
47c0: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
47d0: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
47e0: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 77 65 22  d_argument("-we"
47f0: 2c 20 22 2d 2d 77 65 62 5f 65 78 74 22 2c 20 68  , "--web_ext", h
4800: 65 6c 70 3d 22 4c 61 75 6e 63 68 20 46 69 72 65  elp="Launch Fire
4810: 66 6f 78 20 4e 69 67 68 74 6c 79 20 66 6f 72 20  fox Nightly for 
4820: 57 65 62 45 78 74 65 6e 73 69 6f 6e 20 74 65 73  WebExtension tes
4830: 74 69 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73  ting", action="s
4840: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4850: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4860: 6d 65 6e 74 28 22 2d 6c 22 2c 20 22 2d 2d 6c 69  ment("-l", "--li
4870: 6e 74 5f 77 65 62 5f 65 78 74 22 2c 20 68 65 6c  nt_web_ext", hel
4880: 70 3d 22 77 65 62 2d 65 78 74 20 6c 69 6e 74 20  p="web-ext lint 
4890: 6f 6e 20 74 68 65 20 57 65 62 45 78 74 65 6e 73  on the WebExtens
48a0: 69 6f 6e 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ion", action="st
48b0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
48c0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
48d0: 65 6e 74 28 22 2d 74 62 22 2c 20 22 2d 2d 74 68  ent("-tb", "--th
48e0: 75 6e 64 65 72 62 69 72 64 22 2c 20 68 65 6c 70  underbird", help
48f0: 3d 22 4c 61 75 6e 63 68 20 54 68 75 6e 64 65 72  ="Launch Thunder
4900: 62 69 72 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73  bird", action="s
4910: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4920: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4930: 6d 65 6e 74 28 22 2d 74 62 62 22 2c 20 22 2d 2d  ment("-tbb", "--
4940: 74 68 75 6e 64 65 72 62 69 72 64 5f 62 65 74 61  thunderbird_beta
4950: 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20  ", help="Launch 
4960: 54 68 75 6e 64 65 72 62 69 72 64 20 42 65 74 61  Thunderbird Beta
4970: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4980: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
4990: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
49a0: 28 22 2d 69 22 2c 20 22 2d 2d 69 6e 73 74 61 6c  ("-i", "--instal
49b0: 6c 22 2c 20 68 65 6c 70 3d 22 69 6e 73 74 61 6c  l", help="instal
49c0: 6c 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  l the extension 
49d0: 69 6e 20 57 72 69 74 65 72 20 28 70 61 74 68 20  in Writer (path 
49e0: 6f 66 20 75 6e 6f 70 6b 67 20 6d 75 73 74 20 62  of unopkg must b
49f0: 65 20 73 65 74 20 69 6e 20 63 6f 6e 66 69 67 2e  e set in config.
4a00: 69 6e 69 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73  ini)", action="s
4a10: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4a20: 78 41 72 67 73 20 3d 20 78 50 61 72 73 65 72 2e  xArgs = xParser.
4a30: 70 61 72 73 65 5f 61 72 67 73 28 29 0a 0a 20 20  parse_args()..  
4a40: 20 20 69 66 20 78 41 72 67 73 2e 62 75 69 6c 64    if xArgs.build
4a50: 5f 64 61 74 61 3a 0a 20 20 20 20 20 20 20 20 78  _data:.        x
4a60: 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f  Args.build_data_
4a70: 62 65 66 6f 72 65 20 3d 20 54 72 75 65 0a 20 20  before = True.  
4a80: 20 20 20 20 20 20 78 41 72 67 73 2e 62 75 69 6c        xArgs.buil
4a90: 64 5f 64 61 74 61 5f 61 66 74 65 72 20 3d 20 54  d_data_after = T
4aa0: 72 75 65 0a 0a 20 20 20 20 64 69 72 5f 75 74 69  rue..    dir_uti
4ab0: 6c 2e 6d 6b 70 61 74 68 28 22 5f 62 75 69 6c 64  l.mkpath("_build
4ac0: 22 29 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e  ").    dir_util.
4ad0: 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65  mkpath("grammale
4ae0: 63 74 65 22 29 0a 20 20 20 20 69 66 20 78 41 72  cte").    if xAr
4af0: 67 73 2e 6a 61 76 61 73 63 72 69 70 74 3a 0a 20  gs.javascript:. 
4b00: 20 20 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e         dir_util.
4b10: 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65  mkpath("grammale
4b20: 63 74 65 2d 6a 73 22 29 0a 0a 20 20 20 20 63 6f  cte-js")..    co
4b30: 70 79 47 72 61 70 68 73 70 65 6c 6c 43 6f 72 65  pyGraphspellCore
4b40: 28 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70  (xArgs.javascrip
4b50: 74 29 0a 0a 20 20 20 20 66 6f 72 20 73 4c 61 6e  t)..    for sLan
4b60: 67 20 69 6e 20 78 41 72 67 73 2e 6c 61 6e 67 3a  g in xArgs.lang:
4b70: 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70  .        if os.p
4b80: 61 74 68 2e 65 78 69 73 74 73 28 22 67 63 5f 6c  ath.exists("gc_l
4b90: 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 20 61 6e 64  ang/"+sLang) and
4ba0: 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22   os.path.isdir("
4bb0: 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29  gc_lang/"+sLang)
4bc0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 43  :.            xC
4bd0: 6f 6e 66 69 67 20 3d 20 67 65 74 43 6f 6e 66 69  onfig = getConfi
4be0: 67 28 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20  g(sLang).       
4bf0: 20 20 20 20 20 64 56 61 72 73 20 3d 20 78 43 6f       dVars = xCo
4c00: 6e 66 69 67 2e 5f 73 65 63 74 69 6f 6e 73 5b 27  nfig._sections['
4c10: 61 72 67 73 27 5d 0a 0a 20 20 20 20 20 20 20 20  args']..        
4c20: 20 20 20 20 69 66 20 6e 6f 74 20 64 56 61 72 73      if not dVars
4c30: 5b 22 6c 65 78 69 63 6f 6e 5f 63 6f 6d 6d 75 6e  ["lexicon_commun
4c40: 69 74 79 5f 73 72 63 22 5d 3a 0a 20 20 20 20 20  ity_src"]:.     
4c50: 20 20 20 20 20 20 20 20 20 20 20 78 41 72 67 73             xArgs
4c60: 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64  .add_community_d
4c70: 69 63 74 69 6f 6e 61 72 79 20 3d 20 46 61 6c 73  ictionary = Fals
4c80: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  e.            if
4c90: 20 6e 6f 74 20 64 56 61 72 73 5b 22 6c 65 78 69   not dVars["lexi
4ca0: 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63  con_personal_src
4cb0: 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]:.            
4cc0: 20 20 20 20 78 41 72 67 73 2e 61 64 64 5f 70 65      xArgs.add_pe
4cd0: 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72  rsonal_dictionar
4ce0: 79 20 3d 20 46 61 6c 73 65 0a 0a 20 20 20 20 20  y = False..     
4cf0: 20 20 20 20 20 20 20 23 20 62 75 69 6c 64 20 64         # build d
4d00: 61 74 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  ata.            
4d10: 64 61 74 61 62 75 69 6c 64 20 3d 20 4e 6f 6e 65  databuild = None
4d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4d30: 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61  xArgs.build_data
4d40: 5f 62 65 66 6f 72 65 20 6f 72 20 78 41 72 67 73  _before or xArgs
4d50: 2e 62 75 69 6c 64 5f 64 61 74 61 5f 61 66 74 65  .build_data_afte
4d60: 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r:.             
4d70: 20 20 20 23 20 6c 61 6e 67 20 64 61 74 61 0a 20     # lang data. 
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
4d90: 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry:.            
4da0: 20 20 20 20 20 20 20 20 64 61 74 61 62 75 69 6c          databuil
4db0: 64 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d  d = importlib.im
4dc0: 70 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67 63 5f  port_module("gc_
4dd0: 6c 61 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22 2e 62  lang."+sLang+".b
4de0: 75 69 6c 64 5f 64 61 74 61 22 29 0a 20 20 20 20  uild_data").    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65              exce
4e00: 70 74 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a  pt ImportError:.
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72      print("# Err
4e30: 6f 72 2e 20 43 6f 75 6c 64 6e e2 80 99 74 20 69  or. Couldn...t i
4e40: 6d 70 6f 72 74 20 66 69 6c 65 20 62 75 69 6c 64  mport file build
4e50: 5f 64 61 74 61 2e 70 79 20 69 6e 20 66 6f 6c 64  _data.py in fold
4e60: 65 72 20 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61  er gc_lang/"+sLa
4e70: 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng).            
4e80: 69 66 20 64 61 74 61 62 75 69 6c 64 20 61 6e 64  if databuild and
4e90: 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74   xArgs.build_dat
4ea0: 61 5f 62 65 66 6f 72 65 3a 0a 20 20 20 20 20 20  a_before:.      
4eb0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 75            databu
4ec0: 69 6c 64 2e 62 65 66 6f 72 65 28 27 67 63 5f 6c  ild.before('gc_l
4ed0: 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c 20 64 56 61  ang/'+sLang, dVa
4ee0: 72 73 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63  rs, xArgs.javasc
4ef0: 72 69 70 74 29 0a 20 20 20 20 20 20 20 20 20 20  ript).          
4f00: 20 20 69 66 20 78 41 72 67 73 2e 64 69 63 74 3a    if xArgs.dict:
4f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f20: 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61 72 79   buildDictionary
4f30: 28 64 56 61 72 73 2c 20 22 6d 61 69 6e 22 2c 20  (dVars, "main", 
4f40: 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74  xArgs.javascript
4f50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4f60: 20 20 69 66 20 78 41 72 67 73 2e 61 64 64 5f 63    if xArgs.add_c
4f70: 6f 6d 6d 75 6e 69 74 79 5f 64 69 63 74 69 6f 6e  ommunity_diction
4f80: 61 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ary:.           
4f90: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 44 69           buildDi
4fa0: 63 74 69 6f 6e 61 72 79 28 64 56 61 72 73 2c 20  ctionary(dVars, 
4fb0: 22 63 6f 6d 6d 75 6e 69 74 79 22 2c 20 78 41 72  "community", xAr
4fc0: 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20  gs.javascript). 
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4fe0: 66 20 78 41 72 67 73 2e 61 64 64 5f 70 65 72 73  f xArgs.add_pers
4ff0: 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e 61 72 79 3a  onal_dictionary:
5000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5010: 20 20 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f       buildDictio
5020: 6e 61 72 79 28 64 56 61 72 73 2c 20 22 70 65 72  nary(dVars, "per
5030: 73 6f 6e 61 6c 22 2c 20 78 41 72 67 73 2e 6a 61  sonal", xArgs.ja
5040: 76 61 73 63 72 69 70 74 29 0a 20 20 20 20 20 20  vascript).      
5050: 20 20 20 20 20 20 69 66 20 64 61 74 61 62 75 69        if databui
5060: 6c 64 20 61 6e 64 20 78 41 72 67 73 2e 62 75 69  ld and xArgs.bui
5070: 6c 64 5f 64 61 74 61 5f 61 66 74 65 72 3a 0a 20  ld_data_after:. 
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5090: 61 74 61 62 75 69 6c 64 2e 61 66 74 65 72 28 27  atabuild.after('
50a0: 67 63 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c  gc_lang/'+sLang,
50b0: 20 64 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61   dVars, xArgs.ja
50c0: 76 61 73 63 72 69 70 74 29 0a 0a 20 20 20 20 20  vascript)..     
50d0: 20 20 20 20 20 20 20 23 20 63 6f 70 79 20 64 69         # copy di
50e0: 63 74 69 6f 6e 61 72 69 65 73 20 66 72 6f 6d 20  ctionaries from 
50f0: 47 72 61 70 68 73 70 65 6c 6c 0a 20 20 20 20 20  Graphspell.     
5100: 20 20 20 20 20 20 20 63 6f 70 79 47 72 61 70 68         copyGraph
5110: 73 70 65 6c 6c 44 69 63 74 69 6f 6e 61 72 69 65  spellDictionarie
5120: 73 28 64 56 61 72 73 2c 20 78 41 72 67 73 2e 6a  s(dVars, xArgs.j
5130: 61 76 61 73 63 72 69 70 74 2c 20 78 41 72 67 73  avascript, xArgs
5140: 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64  .add_community_d
5150: 69 63 74 69 6f 6e 61 72 79 2c 20 78 41 72 67 73  ictionary, xArgs
5160: 2e 61 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69  .add_personal_di
5170: 63 74 69 6f 6e 61 72 79 29 0a 0a 20 20 20 20 20  ctionary)..     
5180: 20 20 20 20 20 20 20 23 20 6d 61 6b 65 0a 20 20         # make.  
5190: 20 20 20 20 20 20 20 20 20 20 73 56 65 72 73 69            sVersi
51a0: 6f 6e 20 3d 20 63 72 65 61 74 65 28 73 4c 61 6e  on = create(sLan
51b0: 67 2c 20 78 43 6f 6e 66 69 67 2c 20 78 41 72 67  g, xConfig, xArg
51c0: 73 2e 69 6e 73 74 61 6c 6c 2c 20 78 41 72 67 73  s.install, xArgs
51d0: 2e 6a 61 76 61 73 63 72 69 70 74 2c 20 78 41 72  .javascript, xAr
51e0: 67 73 2e 75 73 65 5f 63 61 63 68 65 29 0a 0a 20  gs.use_cache).. 
51f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 74 65 73             # tes
5200: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ts.            i
5210: 66 20 78 41 72 67 73 2e 74 65 73 74 73 20 6f 72  f xArgs.tests or
5220: 20 78 41 72 67 73 2e 70 65 72 66 20 6f 72 20 78   xArgs.perf or x
5230: 41 72 67 73 2e 70 65 72 66 5f 6d 65 6d 6f 3a 0a  Args.perf_memo:.
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 70 72 69 6e 74 28 22 3e 20 52 75 6e 6e 69 6e 67  print("> Running
5260: 20 74 65 73 74 73 22 29 0a 20 20 20 20 20 20 20   tests").       
5270: 20 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20           try:.  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 74 65 73 74 73 20 3d 20 69 6d 70 6f 72 74    tests = import
52a0: 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c  lib.import_modul
52b0: 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2e 22  e("grammalecte."
52c0: 2b 73 4c 61 6e 67 2b 22 2e 74 65 73 74 73 22 29  +sLang+".tests")
52d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52e0: 20 20 20 20 20 70 72 69 6e 74 28 74 65 73 74 73       print(tests
52f0: 2e 5f 5f 66 69 6c 65 5f 5f 29 0a 20 20 20 20 20  .__file__).     
5300: 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70             excep
5310: 74 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20  t ImportError:. 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f     print("# Erro
5340: 72 2e 20 49 6d 70 6f 72 74 20 66 61 69 6c 65 64  r. Import failed
5350: 3a 22 20 2b 20 22 67 72 61 6d 6d 61 6c 65 63 74  :" + "grammalect
5360: 65 2e 22 2b 73 4c 61 6e 67 2b 22 2e 74 65 73 74  e."+sLang+".test
5370: 73 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s").            
5380: 20 20 20 20 20 20 20 20 74 72 61 63 65 62 61 63          tracebac
5390: 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a 20 20  k.print_exc().  
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
53b0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
53c0: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
53d0: 2e 74 65 73 74 73 3a 0a 20 20 20 20 20 20 20 20  .tests:.        
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 78 54 65 73 74 53 75 69 74 65 20 3d 20 75 6e 69  xTestSuite = uni
5400: 74 74 65 73 74 2e 54 65 73 74 4c 6f 61 64 65 72  ttest.TestLoader
5410: 28 29 2e 6c 6f 61 64 54 65 73 74 73 46 72 6f 6d  ().loadTestsFrom
5420: 4d 6f 64 75 6c 65 28 74 65 73 74 73 29 0a 20 20  Module(tests).  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 20 20 75 6e 69 74 74 65 73 74 2e 54        unittest.T
5450: 65 78 74 54 65 73 74 52 75 6e 6e 65 72 28 29 2e  extTestRunner().
5460: 72 75 6e 28 78 54 65 73 74 53 75 69 74 65 29 0a  run(xTestSuite).
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 69 66 20 78 41 72 67 73 2e 70 65 72      if xArgs.per
5490: 66 20 6f 72 20 78 41 72 67 73 2e 70 65 72 66 5f  f or xArgs.perf_
54a0: 6d 65 6d 6f 3a 0a 20 20 20 20 20 20 20 20 20 20  memo:.          
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 44                hD
54c0: 73 74 20 3d 20 6f 70 65 6e 28 22 2e 2f 67 63 5f  st = open("./gc_
54d0: 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f 70  lang/"+sLang+"/p
54e0: 65 72 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 22  erf_memo.txt", "
54f0: 61 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  a", encoding="ut
5500: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
5510: 6e 22 29 20 20 69 66 20 78 41 72 67 73 2e 70 65  n")  if xArgs.pe
5520: 72 66 5f 6d 65 6d 6f 20 20 65 6c 73 65 20 4e 6f  rf_memo  else No
5530: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ne.             
5540: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 73             tests
5550: 2e 70 65 72 66 28 73 56 65 72 73 69 6f 6e 2c 20  .perf(sVersion, 
5560: 68 44 73 74 29 0a 0a 20 20 20 20 20 20 20 20 20  hDst)..         
5570: 20 20 20 69 66 20 78 41 72 67 73 2e 77 65 62 5f     if xArgs.web_
5580: 65 78 74 20 6f 72 20 78 41 72 67 73 2e 66 69 72  ext or xArgs.fir
5590: 65 66 6f 78 3a 0a 20 20 20 20 20 20 20 20 20 20  efox:.          
55a0: 20 20 20 20 20 20 77 69 74 68 20 68 65 6c 70 65        with helpe
55b0: 72 73 2e 43 44 28 22 5f 62 75 69 6c 64 2f 77 65  rs.CD("_build/we
55c0: 62 65 78 74 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20  bext/"+sLang):. 
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 69 66 20 78 41 72 67 73 2e 6c 69 6e 74     if xArgs.lint
55f0: 5f 77 65 62 5f 65 78 74 3a 0a 20 20 20 20 20 20  _web_ext:.      
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 6f 73 2e 73 79 73 74 65 6d 28 72 27 77 65    os.system(r'we
5620: 62 2d 65 78 74 20 6c 69 6e 74 20 2d 6f 20 74 65  b-ext lint -o te
5630: 78 74 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  xt').           
5640: 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67           if xArg
5650: 73 2e 66 69 72 65 66 6f 78 3a 0a 20 20 20 20 20  s.firefox:.     
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 23 20 46 69 72 65 66 6f 78 20 44 65 76     # Firefox Dev
5680: 65 6c 6f 70 70 65 72 20 65 64 69 74 69 6f 6e 0a  elopper edition.
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 20 20 20 20 20 73 70 66 46 69 72 65 66          spfFiref
56b0: 6f 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f  ox = dVars['win_
56c0: 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 20 20 69  fx_dev_path']  i
56d0: 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65  f platform.syste
56e0: 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22  m() == "Windows"
56f0: 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69    else dVars['li
5700: 6e 75 78 5f 66 78 5f 64 65 76 5f 70 61 74 68 27  nux_fx_dev_path'
5710: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
5720: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 23 20 46 69 72 65 66 6f 78 20 4e 69      # Firefox Ni
5750: 67 68 74 6c 79 20 65 64 69 74 69 6f 6e 0a 20 20  ghtly edition.  
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 73 70 66 46 69 72 65 66 6f 78        spfFirefox
5780: 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78   = dVars['win_fx
5790: 5f 6e 69 67 68 74 6c 79 5f 70 61 74 68 27 5d 20  _nightly_path'] 
57a0: 20 69 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73   if platform.sys
57b0: 74 65 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77  tem() == "Window
57c0: 73 22 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27  s"  else dVars['
57d0: 6c 69 6e 75 78 5f 66 78 5f 6e 69 67 68 74 6c 79  linux_fx_nightly
57e0: 5f 70 61 74 68 27 5d 0a 20 20 20 20 20 20 20 20  _path'].        
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73              os.s
5800: 79 73 74 65 6d 28 72 27 77 65 62 2d 65 78 74 20  ystem(r'web-ext 
5810: 72 75 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22 27  run --firefox="'
5820: 20 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20   + spfFirefox + 
5830: 27 22 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f 6e  '" --browser-con
5840: 73 6f 6c 65 27 29 0a 20 20 20 20 20 20 20 20 20  sole').         
5850: 20 20 20 20 20 20 20 20 20 20 20 23 20 68 74 74             # htt
5860: 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f  ps://github.com/
5870: 6d 6f 7a 69 6c 6c 61 2f 77 65 62 2d 65 78 74 2f  mozilla/web-ext/
5880: 69 73 73 75 65 73 2f 39 33 32 0a 20 20 20 20 20  issues/932.     
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
58a0: 20 6f 73 2e 73 79 73 74 65 6d 28 72 27 77 65 62   os.system(r'web
58b0: 2d 65 78 74 20 72 75 6e 20 2d 2d 66 69 72 65 66  -ext run --firef
58c0: 6f 78 3d 22 27 20 2b 20 73 70 66 46 69 72 65 66  ox="' + spfFiref
58d0: 6f 78 20 2b 20 72 27 22 20 2d 2d 62 72 6f 77 73  ox + r'" --brows
58e0: 65 72 2d 63 6f 6e 73 6f 6c 65 20 2d 2d 66 69 72  er-console --fir
58f0: 65 66 6f 78 2d 70 72 6f 66 69 6c 65 3d 43 3a 5c  efox-profile=C:\
5900: 55 73 65 72 73 5c 45 41 4b 5c 41 70 70 44 61 74  Users\EAK\AppDat
5910: 61 5c 52 6f 61 6d 69 6e 67 5c 4d 6f 7a 69 6c 6c  a\Roaming\Mozill
5920: 61 5c 46 69 72 65 66 6f 78 5c 50 72 6f 66 69 6c  a\Firefox\Profil
5930: 65 73 5c 65 32 36 35 35 39 74 77 2e 64 65 62 75  es\e26559tw.debu
5940: 67 20 2d 2d 6b 65 65 70 2d 70 72 6f 66 69 6c 65  g --keep-profile
5950: 2d 63 68 61 6e 67 65 73 27 29 0a 0a 20 20 20 20  -changes')..    
5960: 20 20 20 20 20 20 20 20 23 20 54 68 75 6e 64 65          # Thunde
5970: 72 62 69 72 64 0a 20 20 20 20 20 20 20 20 20 20  rbird.          
5980: 20 20 69 66 20 78 41 72 67 73 2e 74 68 75 6e 64    if xArgs.thund
5990: 65 72 62 69 72 64 3a 0a 20 20 20 20 20 20 20 20  erbird:.        
59a0: 20 20 20 20 20 20 20 20 73 70 66 54 68 75 6e 64          spfThund
59b0: 65 72 62 69 72 64 20 3d 20 27 22 27 2b 64 56 61  erbird = '"'+dVa
59c0: 72 73 5b 27 77 69 6e 5f 74 62 5f 70 61 74 68 27  rs['win_tb_path'
59d0: 5d 2b 27 22 27 20 20 69 66 20 70 6c 61 74 66 6f  ]+'"'  if platfo
59e0: 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d 3d 20 22  rm.system() == "
59f0: 57 69 6e 64 6f 77 73 22 20 20 65 6c 73 65 20 64  Windows"  else d
5a00: 56 61 72 73 5b 27 6c 69 6e 75 78 5f 74 62 5f 70  Vars['linux_tb_p
5a10: 61 74 68 27 5d 0a 20 20 20 20 20 20 20 20 20 20  ath'].          
5a20: 20 20 20 20 20 20 70 72 69 6e 74 28 73 70 66 54        print(spfT
5a30: 68 75 6e 64 65 72 62 69 72 64 29 0a 20 20 20 20  hunderbird).    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73              os.s
5a50: 79 73 74 65 6d 28 73 70 66 54 68 75 6e 64 65 72  ystem(spfThunder
5a60: 62 69 72 64 20 2b 20 27 20 2d 6a 73 63 6f 6e 73  bird + ' -jscons
5a70: 6f 6c 65 20 2d 50 20 64 65 62 75 67 27 29 0a 20  ole -P debug'). 
5a80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
5a90: 72 67 73 2e 74 68 75 6e 64 65 72 62 69 72 64 5f  rgs.thunderbird_
5aa0: 62 65 74 61 3a 0a 20 20 20 20 20 20 20 20 20 20  beta:.          
5ab0: 20 20 20 20 20 20 73 70 66 54 68 75 6e 64 65 72        spfThunder
5ac0: 62 69 72 64 20 3d 20 27 22 27 2b 64 56 61 72 73  bird = '"'+dVars
5ad0: 5b 27 77 69 6e 5f 74 62 5f 62 65 74 61 5f 70 61  ['win_tb_beta_pa
5ae0: 74 68 27 5d 2b 27 22 27 20 20 69 66 20 70 6c 61  th']+'"'  if pla
5af0: 74 66 6f 72 6d 2e 73 79 73 74 65 6d 28 29 20 3d  tform.system() =
5b00: 3d 20 22 57 69 6e 64 6f 77 73 22 20 20 65 6c 73  = "Windows"  els
5b10: 65 20 64 56 61 72 73 5b 27 6c 69 6e 75 78 5f 74  e dVars['linux_t
5b20: 62 5f 62 65 74 61 5f 70 61 74 68 27 5d 0a 20 20  b_beta_path'].  
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
5b40: 69 6e 74 28 73 70 66 54 68 75 6e 64 65 72 62 69  int(spfThunderbi
5b50: 72 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd).            
5b60: 20 20 20 20 6f 73 2e 73 79 73 74 65 6d 28 73 70      os.system(sp
5b70: 66 54 68 75 6e 64 65 72 62 69 72 64 20 2b 20 27  fThunderbird + '
5b80: 20 2d 6a 73 63 6f 6e 73 6f 6c 65 20 2d 50 20 62   -jsconsole -P b
5b90: 65 74 61 27 29 0a 20 20 20 20 20 20 20 20 65 6c  eta').        el
5ba0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
5bb0: 70 72 69 6e 74 28 22 46 6f 6c 64 65 72 20 6e 6f  print("Folder no
5bc0: 74 20 66 6f 75 6e 64 3a 20 67 63 5f 6c 61 6e 67  t found: gc_lang
5bd0: 2f 22 2b 73 4c 61 6e 67 29 0a 0a 20 20 20 20 6f  /"+sLang)..    o
5be0: 4e 6f 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64  Now = datetime.d
5bf0: 61 74 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20  atetime.now().  
5c00: 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d    print("=======
5c10: 3d 3d 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41  ======= MAKE GRA
5c20: 4d 4d 41 4c 45 43 54 45 20 5b 66 69 6e 69 73 68  MMALECTE [finish
5c30: 65 64 5d 20 61 74 20 7b 30 2e 68 6f 75 72 3a 3e  ed] at {0.hour:>
5c40: 32 7d 20 68 20 7b 30 2e 6d 69 6e 75 74 65 3a 3e  2} h {0.minute:>
5c50: 32 7d 20 6d 69 6e 20 7b 30 2e 73 65 63 6f 6e 64  2} min {0.second
5c60: 3a 3e 32 7d 20 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d  :>2} s =========
5c70: 3d 3d 3d 3d 3d 22 2e 66 6f 72 6d 61 74 28 6f 4e  =====".format(oN
5c80: 6f 77 29 29 0a 0a 0a 69 66 20 5f 5f 6e 61 6d 65  ow))...if __name
5c90: 5f 5f 20 3d 3d 20 27 5f 5f 6d 61 69 6e 5f 5f 27  __ == '__main__'
5ca0: 3a 0a 20 20 20 20 6d 61 69 6e 28 29 0a           :.    main().