Grammalecte  Hex Artifact Content

Artifact cf1490b4f0ec67b444929e3519de38e0eaa665607636f4bafc34ca426643d093:


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 73 4c 61 6e  PackageZip (sLan
1b20: 67 2c 20 64 56 61 72 73 2c 20 73 70 4c 61 6e 67  g, dVars, spLang
1b30: 50 61 63 6b 29 3a 0a 20 20 20 20 22 63 72 65 61  Pack):.    "crea
1b40: 74 65 20 73 65 72 76 65 72 20 7a 69 70 22 0a 20  te server zip". 
1b50: 20 20 20 73 70 66 5a 69 70 20 3d 20 22 5f 62 75     spfZip = "_bu
1b60: 69 6c 64 2f 22 20 2b 20 64 56 61 72 73 5b 27 6e  ild/" + dVars['n
1b70: 61 6d 65 27 5d 20 2b 20 22 2d 22 2b 20 64 56 61  ame'] + "-"+ dVa
1b80: 72 73 5b 27 6c 61 6e 67 27 5d 20 2b 22 2d 76 22  rs['lang'] +"-v"
1b90: 20 2b 20 64 56 61 72 73 5b 27 76 65 72 73 69 6f   + dVars['versio
1ba0: 6e 27 5d 20 2b 20 27 2e 7a 69 70 27 0a 20 20 20  n'] + '.zip'.   
1bb0: 20 68 5a 69 70 20 3d 20 7a 69 70 66 69 6c 65 2e   hZip = zipfile.
1bc0: 5a 69 70 46 69 6c 65 28 73 70 66 5a 69 70 2c 20  ZipFile(spfZip, 
1bd0: 6d 6f 64 65 3d 27 77 27 2c 20 63 6f 6d 70 72 65  mode='w', compre
1be0: 73 73 69 6f 6e 3d 7a 69 70 66 69 6c 65 2e 5a 49  ssion=zipfile.ZI
1bf0: 50 5f 44 45 46 4c 41 54 45 44 29 0a 20 20 20 20  P_DEFLATED).    
1c00: 63 6f 70 79 47 72 61 6d 6d 61 6c 65 63 74 65 50  copyGrammalecteP
1c10: 79 50 61 63 6b 61 67 65 49 6e 5a 69 70 46 69 6c  yPackageInZipFil
1c20: 65 28 68 5a 69 70 2c 20 73 70 4c 61 6e 67 50 61  e(hZip, spLangPa
1c30: 63 6b 29 0a 20 20 20 20 66 6f 72 20 73 70 66 20  ck).    for spf 
1c40: 69 6e 20 5b 22 67 72 61 6d 6d 61 6c 65 63 74 65  in ["grammalecte
1c50: 2d 63 6c 69 2e 70 79 22 2c 20 22 67 72 61 6d 6d  -cli.py", "gramm
1c60: 61 6c 65 63 74 65 2d 73 65 72 76 65 72 2e 70 79  alecte-server.py
1c70: 22 2c 20 22 62 6f 74 74 6c 65 2e 70 79 22 2c 20  ", "bottle.py", 
1c80: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1c90: 20 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 73    "grammalecte-s
1ca0: 65 72 76 65 72 2d 6f 70 74 69 6f 6e 73 2e 5f 67  erver-options._g
1cb0: 6c 6f 62 61 6c 2e 69 6e 69 22 2c 20 22 67 72 61  lobal.ini", "gra
1cc0: 6d 6d 61 6c 65 63 74 65 2d 73 65 72 76 65 72 2d  mmalecte-server-
1cd0: 6f 70 74 69 6f 6e 73 2e 22 2b 73 4c 61 6e 67 2b  options."+sLang+
1ce0: 22 2e 69 6e 69 22 2c 20 5c 0a 20 20 20 20 20 20  ".ini", \.      
1cf0: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 4d            "READM
1d00: 45 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45  E.txt", "LICENSE
1d10: 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45 2e  .txt", "LICENSE.
1d20: 66 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20 20 20  fr.txt"]:.      
1d30: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66    hZip.write(spf
1d40: 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65  ).    hZip.write
1d50: 73 74 72 28 22 73 65 74 75 70 2e 70 79 22 2c 20  str("setup.py", 
1d60: 68 65 6c 70 65 72 73 2e 66 69 6c 65 46 69 6c 65  helpers.fileFile
1d70: 28 22 67 63 5f 6c 61 6e 67 2f 66 72 2f 73 65 74  ("gc_lang/fr/set
1d80: 75 70 2e 70 79 22 2c 20 64 56 61 72 73 29 29 0a  up.py", dVars)).
1d90: 0a 0a 64 65 66 20 63 6f 70 79 47 72 61 6d 6d 61  ..def copyGramma
1da0: 6c 65 63 74 65 50 79 50 61 63 6b 61 67 65 49 6e  lectePyPackageIn
1db0: 5a 69 70 46 69 6c 65 20 28 68 5a 69 70 2c 20 73  ZipFile (hZip, s
1dc0: 70 4c 61 6e 67 50 61 63 6b 2c 20 73 41 64 64 50  pLangPack, sAddP
1dd0: 61 74 68 3d 22 22 29 3a 0a 20 20 20 20 22 63 6f  ath=""):.    "co
1de0: 70 79 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 50  py Grammalecte P
1df0: 79 74 68 6f 6e 20 70 61 63 6b 61 67 65 20 69 6e  ython package in
1e00: 20 7a 69 70 20 66 69 6c 65 22 0a 20 20 20 20 66   zip file".    f
1e10: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
1e20: 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  dir("grammalecte
1e30: 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e  "):.        if n
1e40: 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72  ot os.path.isdir
1e50: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b  ("grammalecte/"+
1e60: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
1e70: 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 72 61   hZip.write("gra
1e80: 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66 2c 20 73  mmalecte/"+sf, s
1e90: 41 64 64 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c  AddPath+"grammal
1ea0: 65 63 74 65 2f 22 2b 73 66 29 0a 20 20 20 20 66  ecte/"+sf).    f
1eb0: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
1ec0: 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  dir("grammalecte
1ed0: 2f 67 72 61 70 68 73 70 65 6c 6c 22 29 3a 0a 20  /graphspell"):. 
1ee0: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
1ef0: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61  .path.isdir("gra
1f00: 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70  mmalecte/graphsp
1f10: 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20  ell/"+sf):.     
1f20: 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74         hZip.writ
1f30: 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67  e("grammalecte/g
1f40: 72 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66 2c 20  raphspell/"+sf, 
1f50: 73 41 64 64 50 61 74 68 2b 22 67 72 61 6d 6d 61  sAddPath+"gramma
1f60: 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c  lecte/graphspell
1f70: 2f 22 2b 73 66 29 0a 20 20 20 20 66 6f 72 20 73  /"+sf).    for s
1f80: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
1f90: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  "grammalecte/gra
1fa0: 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e  phspell/_diction
1fb0: 61 72 69 65 73 22 29 3a 0a 20 20 20 20 20 20 20  aries"):.       
1fc0: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
1fd0: 69 73 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63  isdir("grammalec
1fe0: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64  te/graphspell/_d
1ff0: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73 66  ictionaries/"+sf
2000: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ):.            h
2010: 5a 69 70 2e 77 72 69 74 65 28 22 67 72 61 6d 6d  Zip.write("gramm
2020: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
2030: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  l/_dictionaries/
2040: 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b 22  "+sf, sAddPath+"
2050: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70  grammalecte/grap
2060: 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61  hspell/_dictiona
2070: 72 69 65 73 2f 22 2b 73 66 29 0a 20 20 20 20 66  ries/"+sf).    f
2080: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
2090: 64 69 72 28 73 70 4c 61 6e 67 50 61 63 6b 29 3a  dir(spLangPack):
20a0: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
20b0: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70  os.path.isdir(sp
20c0: 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 29  LangPack+"/"+sf)
20d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 5a  :.            hZ
20e0: 69 70 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 50  ip.write(spLangP
20f0: 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 73 41 64 64  ack+"/"+sf, sAdd
2100: 50 61 74 68 2b 73 70 4c 61 6e 67 50 61 63 6b 2b  Path+spLangPack+
2110: 22 2f 22 2b 73 66 29 0a 0a 0a 64 65 66 20 63 72  "/"+sf)...def cr
2120: 65 61 74 65 20 28 73 4c 61 6e 67 2c 20 78 43 6f  eate (sLang, xCo
2130: 6e 66 69 67 2c 20 62 49 6e 73 74 61 6c 6c 4f 58  nfig, bInstallOX
2140: 54 2c 20 62 4a 61 76 61 53 63 72 69 70 74 29 3a  T, bJavaScript):
2150: 0a 20 20 20 20 22 6d 61 6b 65 20 47 72 61 6d 6d  .    "make Gramm
2160: 61 6c 65 63 74 65 20 66 6f 72 20 70 72 6f 6a 65  alecte for proje
2170: 63 74 20 3c 73 4c 61 6e 67 3e 22 0a 20 20 20 20  ct <sLang>".    
2180: 6f 4e 6f 77 20 3d 20 64 61 74 65 74 69 6d 65 2e  oNow = datetime.
2190: 64 61 74 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20  datetime.now(). 
21a0: 20 20 20 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d     print("======
21b0: 3d 3d 3d 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52  ======== MAKE GR
21c0: 41 4d 4d 41 4c 45 43 54 45 20 5b 7b 30 7d 5d 20  AMMALECTE [{0}] 
21d0: 61 74 20 7b 31 2e 68 6f 75 72 3a 3e 32 7d 20 68  at {1.hour:>2} h
21e0: 20 7b 31 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d   {1.minute:>2} m
21f0: 69 6e 20 7b 31 2e 73 65 63 6f 6e 64 3a 3e 32 7d  in {1.second:>2}
2200: 20 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   s =============
2210: 3d 22 2e 66 6f 72 6d 61 74 28 73 4c 61 6e 67 2c  =".format(sLang,
2220: 20 6f 4e 6f 77 29 29 0a 0a 20 20 20 20 23 23 23   oNow))..    ###
2230: 23 20 52 45 41 44 20 43 4f 4e 46 49 47 55 52 41  # READ CONFIGURA
2240: 54 49 4f 4e 0a 20 20 20 20 70 72 69 6e 74 28 22  TION.    print("
2250: 3e 20 72 65 61 64 20 63 6f 6e 66 69 67 75 72 61  > read configura
2260: 74 69 6f 6e 2e 2e 2e 22 29 0a 20 20 20 20 73 70  tion...").    sp
2270: 4c 61 6e 67 20 3d 20 22 67 63 5f 6c 61 6e 67 2f  Lang = "gc_lang/
2280: 22 20 2b 20 73 4c 61 6e 67 0a 0a 20 20 20 20 64  " + sLang..    d
2290: 56 61 72 73 20 3d 20 78 43 6f 6e 66 69 67 2e 5f  Vars = xConfig._
22a0: 73 65 63 74 69 6f 6e 73 5b 27 61 72 67 73 27 5d  sections['args']
22b0: 0a 20 20 20 20 64 56 61 72 73 5b 27 6c 6f 63 61  .    dVars['loca
22c0: 6c 65 73 27 5d 20 3d 20 64 56 61 72 73 5b 22 6c  les'] = dVars["l
22d0: 6f 63 61 6c 65 73 22 5d 2e 72 65 70 6c 61 63 65  ocales"].replace
22e0: 28 22 5f 22 2c 20 22 2d 22 29 0a 20 20 20 20 64  ("_", "-").    d
22f0: 56 61 72 73 5b 27 6c 6f 63 27 5d 20 3d 20 73 74  Vars['loc'] = st
2300: 72 28 64 69 63 74 28 5b 20 5b 73 2c 20 5b 73 5b  r(dict([ [s, [s[
2310: 30 3a 32 5d 2c 20 73 5b 33 3a 35 5d 2c 20 22 22  0:2], s[3:5], ""
2320: 5d 5d 20 66 6f 72 20 73 20 69 6e 20 64 56 61 72  ]] for s in dVar
2330: 73 5b 22 6c 6f 63 61 6c 65 73 22 5d 2e 73 70 6c  s["locales"].spl
2340: 69 74 28 22 20 22 29 20 5d 29 29 0a 0a 20 20 20  it(" ") ]))..   
2350: 20 23 23 20 43 4f 4d 50 49 4c 45 20 52 55 4c 45   ## COMPILE RULE
2360: 53 0a 20 20 20 20 64 52 65 73 75 6c 74 20 3d 20  S.    dResult = 
2370: 63 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 2e 6d 61  compile_rules.ma
2380: 6b 65 28 73 70 4c 61 6e 67 2c 20 64 56 61 72 73  ke(spLang, dVars
2390: 5b 27 6c 61 6e 67 27 5d 2c 20 62 4a 61 76 61 53  ['lang'], bJavaS
23a0: 63 72 69 70 74 29 0a 20 20 20 20 64 56 61 72 73  cript).    dVars
23b0: 2e 75 70 64 61 74 65 28 64 52 65 73 75 6c 74 29  .update(dResult)
23c0: 0a 0a 20 20 20 20 23 23 20 52 45 41 44 20 47 52  ..    ## READ GR
23d0: 41 4d 4d 41 52 20 43 48 45 43 4b 45 52 20 50 4c  AMMAR CHECKER PL
23e0: 55 47 49 4e 53 0a 20 20 20 20 70 72 69 6e 74 28  UGINS.    print(
23f0: 22 50 59 54 48 4f 4e 3a 22 29 0a 20 20 20 20 70  "PYTHON:").    p
2400: 72 69 6e 74 28 22 2b 20 50 6c 75 67 69 6e 73 3a  rint("+ Plugins:
2410: 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20   ", end="").    
2420: 73 43 6f 64 65 50 6c 75 67 69 6e 73 20 3d 20 22  sCodePlugins = "
2430: 22 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ".    for sf in 
2440: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e  os.listdir(spLan
2450: 67 2b 22 2f 6d 6f 64 75 6c 65 73 22 29 3a 0a 20  g+"/modules"):. 
2460: 20 20 20 20 20 20 20 69 66 20 72 65 2e 6d 61 74         if re.mat
2470: 63 68 28 72 22 67 63 65 5f 5c 77 2b 5b 2e 5d 70  ch(r"gce_\w+[.]p
2480: 79 24 22 2c 20 73 66 29 3a 0a 20 20 20 20 20 20  y$", sf):.      
2490: 20 20 20 20 20 20 73 43 6f 64 65 50 6c 75 67 69        sCodePlugi
24a0: 6e 73 20 2b 3d 20 22 5c 6e 5c 6e 22 20 2b 20 6f  ns += "\n\n" + o
24b0: 70 65 6e 28 73 70 4c 61 6e 67 2b 27 2f 6d 6f 64  pen(spLang+'/mod
24c0: 75 6c 65 73 2f 27 2b 73 66 2c 20 22 72 22 2c 20  ules/'+sf, "r", 
24d0: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
24e0: 29 2e 72 65 61 64 28 29 0a 20 20 20 20 20 20 20  ).read().       
24f0: 20 20 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65       print(sf, e
2500: 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20 70 72 69  nd=", ").    pri
2510: 6e 74 28 29 0a 20 20 20 20 64 56 61 72 73 5b 22  nt().    dVars["
2520: 70 6c 75 67 69 6e 73 22 5d 20 3d 20 73 43 6f 64  plugins"] = sCod
2530: 65 50 6c 75 67 69 6e 73 0a 0a 20 20 20 20 23 23  ePlugins..    ##
2540: 20 43 4f 50 59 20 47 43 5f 43 4f 52 45 20 43 4f   COPY GC_CORE CO
2550: 4d 4d 4f 4e 20 46 49 4c 45 53 0a 20 20 20 20 66  MMON FILES.    f
2560: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
2570: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79 22  dir("gc_core/py"
2580: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
2590: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
25a0: 22 67 63 5f 63 6f 72 65 2f 70 79 2f 22 2b 73 66  "gc_core/py/"+sf
25b0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ):.            h
25c0: 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69  elpers.copyAndFi
25d0: 6c 65 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63  leTemplate("gc_c
25e0: 6f 72 65 2f 70 79 2f 22 2b 73 66 2c 20 22 67 72  ore/py/"+sf, "gr
25f0: 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 66 2c 20  ammalecte/"+sf, 
2600: 64 56 61 72 73 29 0a 20 20 20 20 6f 70 65 6e 28  dVars).    open(
2610: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 57 41 52  "grammalecte/WAR
2620: 4e 49 4e 47 2e 74 78 74 22 2c 20 22 77 22 2c 20  NING.txt", "w", 
2630: 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22  encoding="utf-8"
2640: 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e  , newline="\n").
2650: 77 72 69 74 65 28 73 57 61 72 6e 69 6e 67 4d 65  write(sWarningMe
2660: 73 73 61 67 65 29 0a 0a 20 20 20 20 23 23 20 43  ssage)..    ## C
2670: 52 45 41 54 45 20 47 52 41 4d 4d 41 52 20 43 48  REATE GRAMMAR CH
2680: 45 43 4b 45 52 20 50 41 43 4b 41 47 45 0a 20 20  ECKER PACKAGE.  
2690: 20 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22    spLangPack = "
26a0: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 4c  grammalecte/"+sL
26b0: 61 6e 67 0a 20 20 20 20 68 65 6c 70 65 72 73 2e  ang.    helpers.
26c0: 63 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65  createCleanFolde
26d0: 72 28 73 70 4c 61 6e 67 50 61 63 6b 29 0a 20 20  r(spLangPack).  
26e0: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
26f0: 69 73 74 64 69 72 28 22 67 63 5f 63 6f 72 65 2f  istdir("gc_core/
2700: 70 79 2f 6c 61 6e 67 5f 63 6f 72 65 22 29 3a 0a  py/lang_core"):.
2710: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f          if not o
2720: 73 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 63  s.path.isdir("gc
2730: 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e 67 5f 63 6f  _core/py/lang_co
2740: 72 65 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20  re/"+sf):.      
2750: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f        helpers.co
2760: 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74  pyAndFileTemplat
2770: 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61  e("gc_core/py/la
2780: 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73 70  ng_core/"+sf, sp
2790: 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c  LangPack+"/"+sf,
27a0: 20 64 56 61 72 73 29 0a 20 20 20 20 70 72 69 6e   dVars).    prin
27b0: 74 28 22 2b 20 4d 6f 64 75 6c 65 73 3a 20 22 2c  t("+ Modules: ",
27c0: 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 66 6f 72   end="").    for
27d0: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
27e0: 72 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c  r(spLang+"/modul
27f0: 65 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  es"):.        if
2800: 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69   not sf.startswi
2810: 74 68 28 28 22 67 63 65 5f 22 2c 20 22 5f 5f 70  th(("gce_", "__p
2820: 79 63 61 63 68 65 5f 5f 22 29 29 3a 0a 20 20 20  ycache__")):.   
2830: 20 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73           helpers
2840: 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54 65 6d 70  .copyAndFileTemp
2850: 6c 61 74 65 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f  late(spLang+"/mo
2860: 64 75 6c 65 73 2f 22 2b 73 66 2c 20 73 70 4c 61  dules/"+sf, spLa
2870: 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 64  ngPack+"/"+sf, d
2880: 56 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20  Vars).          
2890: 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d    print(sf, end=
28a0: 22 2c 20 22 29 0a 20 20 20 20 70 72 69 6e 74 28  ", ").    print(
28b0: 29 0a 0a 20 20 20 20 23 20 54 45 53 54 20 46 49  )..    # TEST FI
28c0: 4c 45 53 0a 20 20 20 20 77 69 74 68 20 6f 70 65  LES.    with ope
28d0: 6e 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22  n("grammalecte/"
28e0: 2b 73 4c 61 6e 67 2b 22 2f 67 63 5f 74 65 73 74  +sLang+"/gc_test
28f0: 2e 74 78 74 22 2c 20 22 77 22 2c 20 65 6e 63 6f  .txt", "w", enco
2900: 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65  ding="utf-8", ne
2910: 77 6c 69 6e 65 3d 22 5c 6e 22 29 20 61 73 20 68  wline="\n") as h
2920: 44 73 74 50 79 3a 0a 20 20 20 20 20 20 20 20 68  DstPy:.        h
2930: 44 73 74 50 79 2e 77 72 69 74 65 28 22 23 20 54  DstPy.write("# T
2940: 45 53 54 53 20 46 4f 52 20 4c 41 4e 47 20 5b 22  ESTS FOR LANG ["
2950: 20 2b 20 73 4c 61 6e 67 20 2b 20 22 5d 5c 6e 5c   + sLang + "]\n\
2960: 6e 22 29 0a 20 20 20 20 20 20 20 20 68 44 73 74  n").        hDst
2970: 50 79 2e 77 72 69 74 65 28 64 56 61 72 73 5b 27  Py.write(dVars['
2980: 67 63 74 65 73 74 73 27 5d 29 0a 20 20 20 20 20  gctests']).     
2990: 20 20 20 68 44 73 74 50 79 2e 77 72 69 74 65 28     hDstPy.write(
29a0: 22 5c 6e 22 29 0a 0a 20 20 20 20 63 72 65 61 74  "\n")..    creat
29b0: 65 4f 58 54 28 73 70 4c 61 6e 67 2c 20 64 56 61  eOXT(spLang, dVa
29c0: 72 73 2c 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63  rs, xConfig._sec
29d0: 74 69 6f 6e 73 5b 27 6f 78 74 27 5d 2c 20 73 70  tions['oxt'], sp
29e0: 4c 61 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61  LangPack, bInsta
29f0: 6c 6c 4f 58 54 29 0a 0a 20 20 20 20 63 72 65 61  llOXT)..    crea
2a00: 74 65 53 65 72 76 65 72 4f 70 74 69 6f 6e 73 28  teServerOptions(
2a10: 73 4c 61 6e 67 2c 20 64 56 61 72 73 29 0a 20 20  sLang, dVars).  
2a20: 20 20 63 72 65 61 74 65 50 61 63 6b 61 67 65 5a    createPackageZ
2a30: 69 70 28 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c  ip(sLang, dVars,
2a40: 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a 20 20   spLangPack)..  
2a50: 20 20 23 23 23 23 20 4a 41 56 41 53 43 52 49 50    #### JAVASCRIP
2a60: 54 0a 20 20 20 20 69 66 20 62 4a 61 76 61 53 63  T.    if bJavaSc
2a70: 72 69 70 74 3a 0a 20 20 20 20 20 20 20 20 70 72  ript:.        pr
2a80: 69 6e 74 28 22 4a 41 56 41 53 43 52 49 50 54 3a  int("JAVASCRIPT:
2a90: 22 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ").        print
2aa0: 28 22 2b 20 50 6c 75 67 69 6e 73 3a 20 22 2c 20  ("+ Plugins: ", 
2ab0: 65 6e 64 3d 22 22 29 0a 20 20 20 20 20 20 20 20  end="").        
2ac0: 73 43 6f 64 65 50 6c 75 67 69 6e 73 20 3d 20 22  sCodePlugins = "
2ad0: 22 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 66  ".        for sf
2ae0: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 73   in os.listdir(s
2af0: 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d  pLang+"/modules-
2b00: 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  js"):.          
2b10: 20 20 69 66 20 72 65 2e 6d 61 74 63 68 28 72 22    if re.match(r"
2b20: 67 63 65 5f 5c 77 2b 5b 2e 5d 6a 73 24 22 2c 20  gce_\w+[.]js$", 
2b30: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
2b40: 20 20 20 20 20 73 43 6f 64 65 50 6c 75 67 69 6e       sCodePlugin
2b50: 73 20 2b 3d 20 22 5c 6e 5c 6e 22 20 2b 20 6f 70  s += "\n\n" + op
2b60: 65 6e 28 73 70 4c 61 6e 67 2b 27 2f 6d 6f 64 75  en(spLang+'/modu
2b70: 6c 65 73 2d 6a 73 2f 27 2b 73 66 2c 20 22 72 22  les-js/'+sf, "r"
2b80: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
2b90: 38 22 29 2e 72 65 61 64 28 29 0a 20 20 20 20 20  8").read().     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
2bb0: 28 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20  (sf, end=", "). 
2bc0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 29 0a 20         print(). 
2bd0: 20 20 20 20 20 20 20 64 56 61 72 73 5b 22 70 6c         dVars["pl
2be0: 75 67 69 6e 73 4a 53 22 5d 20 3d 20 73 43 6f 64  uginsJS"] = sCod
2bf0: 65 50 6c 75 67 69 6e 73 0a 0a 20 20 20 20 20 20  ePlugins..      
2c00: 20 20 23 20 6f 70 74 69 6f 6e 73 20 64 61 74 61    # options data
2c10: 20 73 74 72 75 63 74 0a 20 20 20 20 20 20 20 20   struct.        
2c20: 64 56 61 72 73 5b 22 64 4f 70 74 4a 61 76 61 53  dVars["dOptJavaS
2c30: 63 72 69 70 74 22 5d 20 3d 20 6a 73 6f 6e 2e 64  cript"] = json.d
2c40: 75 6d 70 73 28 6c 69 73 74 28 64 56 61 72 73 5b  umps(list(dVars[
2c50: 22 64 4f 70 74 4a 61 76 61 53 63 72 69 70 74 22  "dOptJavaScript"
2c60: 5d 2e 69 74 65 6d 73 28 29 29 29 0a 20 20 20 20  ].items())).    
2c70: 20 20 20 20 64 56 61 72 73 5b 22 64 4f 70 74 46      dVars["dOptF
2c80: 69 72 65 66 6f 78 22 5d 20 3d 20 6a 73 6f 6e 2e  irefox"] = json.
2c90: 64 75 6d 70 73 28 6c 69 73 74 28 64 56 61 72 73  dumps(list(dVars
2ca0: 5b 22 64 4f 70 74 46 69 72 65 66 6f 78 22 5d 2e  ["dOptFirefox"].
2cb0: 69 74 65 6d 73 28 29 29 29 0a 20 20 20 20 20 20  items())).      
2cc0: 20 20 64 56 61 72 73 5b 22 64 4f 70 74 54 68 75    dVars["dOptThu
2cd0: 6e 64 65 72 62 69 72 64 22 5d 20 3d 20 6a 73 6f  nderbird"] = jso
2ce0: 6e 2e 64 75 6d 70 73 28 6c 69 73 74 28 64 56 61  n.dumps(list(dVa
2cf0: 72 73 5b 22 64 4f 70 74 54 68 75 6e 64 65 72 62  rs["dOptThunderb
2d00: 69 72 64 22 5d 2e 69 74 65 6d 73 28 29 29 29 0a  ird"].items())).
2d10: 0a 20 20 20 20 20 20 20 20 23 20 63 72 65 61 74  .        # creat
2d20: 65 20 66 6f 6c 64 65 72 0a 20 20 20 20 20 20 20  e folder.       
2d30: 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22 67   spLangPack = "g
2d40: 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b  rammalecte-js/"+
2d50: 73 4c 61 6e 67 0a 20 20 20 20 20 20 20 20 68 65  sLang.        he
2d60: 6c 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61  lpers.createClea
2d70: 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67 50 61  nFolder(spLangPa
2d80: 63 6b 29 0a 0a 20 20 20 20 20 20 20 20 23 20 63  ck)..        # c
2d90: 72 65 61 74 65 20 66 69 6c 65 73 0a 20 20 20 20  reate files.    
2da0: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
2db0: 2e 6c 69 73 74 64 69 72 28 22 6a 73 5f 65 78 74  .listdir("js_ext
2dc0: 65 6e 73 69 6f 6e 22 29 3a 0a 20 20 20 20 20 20  ension"):.      
2dd0: 20 20 20 20 20 20 64 56 61 72 73 5b 73 66 5b 3a        dVars[sf[:
2de0: 2d 33 5d 5d 20 3d 20 6f 70 65 6e 28 22 6a 73 5f  -3]] = open("js_
2df0: 65 78 74 65 6e 73 69 6f 6e 2f 22 2b 73 66 2c 20  extension/"+sf, 
2e00: 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "r", encoding="u
2e10: 74 66 2d 38 22 29 2e 72 65 61 64 28 29 0a 20 20  tf-8").read().  
2e20: 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20        for sf in 
2e30: 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f 63  os.listdir("gc_c
2e40: 6f 72 65 2f 6a 73 22 29 3a 0a 20 20 20 20 20 20  ore/js"):.      
2e50: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
2e60: 70 61 74 68 2e 69 73 64 69 72 28 22 67 63 5f 63  path.isdir("gc_c
2e70: 6f 72 65 2f 6a 73 2f 22 2b 73 66 29 20 61 6e 64  ore/js/"+sf) and
2e80: 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69   not sf.startswi
2e90: 74 68 28 22 6a 73 65 78 5f 22 29 3a 0a 20 20 20  th("jsex_"):.   
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
2eb0: 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65  pers.copyAndFile
2ec0: 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72  Template("gc_cor
2ed0: 65 2f 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61 6d  e/js/"+sf, "gram
2ee0: 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66 2c  malecte-js/"+sf,
2ef0: 20 64 56 61 72 73 29 0a 20 20 20 20 20 20 20 20   dVars).        
2f00: 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63 74  open("grammalect
2f10: 65 2d 6a 73 2f 57 41 52 4e 49 4e 47 2e 74 78 74  e-js/WARNING.txt
2f20: 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67  ", "w", encoding
2f30: 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e  ="utf-8", newlin
2f40: 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73 57  e="\n").write(sW
2f50: 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 29 0a 20  arningMessage). 
2f60: 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e         for sf in
2f70: 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63 5f   os.listdir("gc_
2f80: 63 6f 72 65 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72  core/js/lang_cor
2f90: 65 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e"):.           
2fa0: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
2fb0: 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a  isdir("gc_core/j
2fc0: 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66  s/lang_core/"+sf
2fd0: 29 20 61 6e 64 20 73 66 2e 73 74 61 72 74 73 77  ) and sf.startsw
2fe0: 69 74 68 28 22 67 63 5f 22 29 3a 0a 20 20 20 20  ith("gc_"):.    
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
3000: 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65 54  ers.copyAndFileT
3010: 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f 72 65  emplate("gc_core
3020: 2f 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b  /js/lang_core/"+
3030: 73 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2b 22  sf, spLangPack+"
3040: 2f 22 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20  /"+sf, dVars).  
3050: 20 20 20 20 20 20 70 72 69 6e 74 28 22 2b 20 4d        print("+ M
3060: 6f 64 75 6c 65 73 3a 20 22 2c 20 65 6e 64 3d 22  odules: ", end="
3070: 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73  ").        for s
3080: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
3090: 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73  spLang+"/modules
30a0: 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20 20  -js"):.         
30b0: 20 20 20 69 66 20 6e 6f 74 20 73 66 2e 73 74 61     if not sf.sta
30c0: 72 74 73 77 69 74 68 28 22 67 63 65 5f 22 29 3a  rtswith("gce_"):
30d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30e0: 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e 64   helpers.copyAnd
30f0: 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73 70 4c  FileTemplate(spL
3100: 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73  ang+"/modules-js
3110: 2f 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50 61 63  /"+sf, spLangPac
3120: 6b 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73 29  k+"/"+sf, dVars)
3130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3140: 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d 22   print(sf, end="
3150: 2c 20 22 29 0a 20 20 20 20 20 20 20 20 70 72 69  , ").        pri
3160: 6e 74 28 29 0a 0a 20 20 20 20 20 20 20 20 74 72  nt()..        tr
3170: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  y:.            b
3180: 75 69 6c 64 6a 73 20 3d 20 69 6d 70 6f 72 74 6c  uildjs = importl
3190: 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c 65  ib.import_module
31a0: 28 22 67 63 5f 6c 61 6e 67 2e 22 2b 73 4c 61 6e  ("gc_lang."+sLan
31b0: 67 2b 22 2e 62 75 69 6c 64 22 29 0a 20 20 20 20  g+".build").    
31c0: 20 20 20 20 65 78 63 65 70 74 20 49 6d 70 6f 72      except Impor
31d0: 74 45 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20  tError:.        
31e0: 20 20 20 20 70 72 69 6e 74 28 22 23 20 4e 6f 20      print("# No 
31f0: 63 6f 6d 70 6c 65 6d 65 6e 74 61 72 79 20 62 75  complementary bu
3200: 69 6c 64 65 72 20 3c 62 75 69 6c 64 2e 70 79 3e  ilder <build.py>
3210: 20 69 6e 20 66 6f 6c 64 65 72 20 67 63 5f 6c 61   in folder gc_la
3220: 6e 67 2f 22 2b 73 4c 61 6e 67 29 0a 20 20 20 20  ng/"+sLang).    
3230: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
3240: 20 20 20 20 20 20 62 75 69 6c 64 6a 73 2e 62 75        buildjs.bu
3250: 69 6c 64 28 73 4c 61 6e 67 2c 20 64 56 61 72 73  ild(sLang, dVars
3260: 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a 20  , spLangPack).. 
3270: 20 20 20 72 65 74 75 72 6e 20 64 56 61 72 73 5b     return dVars[
3280: 27 76 65 72 73 69 6f 6e 27 5d 0a 0a 0a 64 65 66  'version']...def
3290: 20 63 6f 70 79 47 72 61 70 68 73 70 65 6c 6c 43   copyGraphspellC
32a0: 6f 72 65 20 28 62 4a 61 76 61 53 63 72 69 70 74  ore (bJavaScript
32b0: 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22 63 6f  =False):.    "co
32c0: 70 79 20 47 72 61 70 68 73 70 65 6c 6c 20 70 61  py Graphspell pa
32d0: 63 6b 61 67 65 20 69 6e 20 47 72 61 6d 6d 61 6c  ckage in Grammal
32e0: 65 63 74 65 20 70 61 63 6b 61 67 65 22 0a 20 20  ecte package".  
32f0: 20 20 68 65 6c 70 65 72 73 2e 63 72 65 61 74 65    helpers.create
3300: 43 6c 65 61 6e 46 6f 6c 64 65 72 28 22 67 72 61  CleanFolder("gra
3310: 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70  mmalecte/graphsp
3320: 65 6c 6c 22 29 0a 20 20 20 20 64 69 72 5f 75 74  ell").    dir_ut
3330: 69 6c 2e 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d  il.mkpath("gramm
3340: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
3350: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22  l/_dictionaries"
3360: 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ).    for sf in 
3370: 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 72 61 70  os.listdir("grap
3380: 68 73 70 65 6c 6c 22 29 3a 0a 20 20 20 20 20 20  hspell"):.      
3390: 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68    if not os.path
33a0: 2e 69 73 64 69 72 28 22 67 72 61 70 68 73 70 65  .isdir("graphspe
33b0: 6c 6c 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20  ll/"+sf):.      
33c0: 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69 6c 2e        file_util.
33d0: 63 6f 70 79 5f 66 69 6c 65 28 22 67 72 61 70 68  copy_file("graph
33e0: 73 70 65 6c 6c 2f 22 2b 73 66 2c 20 22 67 72 61  spell/"+sf, "gra
33f0: 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70  mmalecte/graphsp
3400: 65 6c 6c 22 29 0a 20 20 20 20 69 66 20 62 4a 61  ell").    if bJa
3410: 76 61 53 63 72 69 70 74 3a 0a 20 20 20 20 20 20  vaScript:.      
3420: 20 20 68 65 6c 70 65 72 73 2e 63 72 65 61 74 65    helpers.create
3430: 43 6c 65 61 6e 46 6f 6c 64 65 72 28 22 67 72 61  CleanFolder("gra
3440: 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70  mmalecte-js/grap
3450: 68 73 70 65 6c 6c 22 29 0a 20 20 20 20 20 20 20  hspell").       
3460: 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68   dir_util.mkpath
3470: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73  ("grammalecte-js
3480: 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63  /graphspell/_dic
3490: 74 69 6f 6e 61 72 69 65 73 22 29 0a 20 20 20 20  tionaries").    
34a0: 20 20 20 20 64 56 61 72 73 20 3d 20 7b 7d 0a 20      dVars = {}. 
34b0: 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e         for sf in
34c0: 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 6a 73 5f   os.listdir("js_
34d0: 65 78 74 65 6e 73 69 6f 6e 22 29 3a 0a 20 20 20  extension"):.   
34e0: 20 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 73           dVars[s
34f0: 66 5b 3a 2d 33 5d 5d 20 3d 20 6f 70 65 6e 28 22  f[:-3]] = open("
3500: 6a 73 5f 65 78 74 65 6e 73 69 6f 6e 2f 22 2b 73  js_extension/"+s
3510: 66 2c 20 22 72 22 2c 20 65 6e 63 6f 64 69 6e 67  f, "r", encoding
3520: 3d 22 75 74 66 2d 38 22 29 2e 72 65 61 64 28 29  ="utf-8").read()
3530: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 20  .        for sf 
3540: 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67  in os.listdir("g
3550: 72 61 70 68 73 70 65 6c 6c 2d 6a 73 22 29 3a 0a  raphspell-js"):.
3560: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
3570: 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72  ot os.path.isdir
3580: 28 22 67 72 61 70 68 73 70 65 6c 6c 2d 6a 73 2f  ("graphspell-js/
3590: 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20  "+sf):.         
35a0: 20 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69 6c         file_util
35b0: 2e 63 6f 70 79 5f 66 69 6c 65 28 22 67 72 61 70  .copy_file("grap
35c0: 68 73 70 65 6c 6c 2d 6a 73 2f 22 2b 73 66 2c 20  hspell-js/"+sf, 
35d0: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
35e0: 67 72 61 70 68 73 70 65 6c 6c 22 29 0a 20 20 20  graphspell").   
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
3600: 70 65 72 73 2e 63 6f 70 79 41 6e 64 46 69 6c 65  pers.copyAndFile
3610: 54 65 6d 70 6c 61 74 65 28 22 67 72 61 70 68 73  Template("graphs
3620: 70 65 6c 6c 2d 6a 73 2f 22 2b 73 66 2c 20 22 67  pell-js/"+sf, "g
3630: 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72  rammalecte-js/gr
3640: 61 70 68 73 70 65 6c 6c 2f 22 2b 73 66 2c 20 64  aphspell/"+sf, d
3650: 56 61 72 73 29 0a 0a 0a 64 65 66 20 63 6f 70 79  Vars)...def copy
3660: 47 72 61 70 68 73 70 65 6c 6c 44 69 63 74 69 6f  GraphspellDictio
3670: 6e 61 72 69 65 73 20 28 64 56 61 72 73 2c 20 62  naries (dVars, b
3680: 4a 61 76 61 53 63 72 69 70 74 3d 46 61 6c 73 65  JavaScript=False
3690: 2c 20 62 45 78 74 65 6e 64 65 64 44 69 63 74 3d  , bExtendedDict=
36a0: 46 61 6c 73 65 2c 20 62 43 6f 6d 6d 75 6e 69 74  False, bCommunit
36b0: 79 44 69 63 74 3d 46 61 6c 73 65 2c 20 62 50 65  yDict=False, bPe
36c0: 72 73 6f 6e 61 6c 44 69 63 74 3d 46 61 6c 73 65  rsonalDict=False
36d0: 29 3a 0a 20 20 20 20 22 63 6f 70 79 20 72 65 71  ):.    "copy req
36e0: 75 65 73 74 65 64 20 47 72 61 70 68 73 70 65 6c  uested Graphspel
36f0: 6c 20 64 69 63 74 69 6f 6e 61 72 69 65 73 20 69  l dictionaries i
3700: 6e 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 70 61  n Grammalecte pa
3710: 63 6b 61 67 65 22 0a 20 20 20 20 64 56 61 72 73  ckage".    dVars
3720: 5b 22 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e  ["dic_main_filen
3730: 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20  ame_py"] = "".  
3740: 20 20 64 56 61 72 73 5b 22 64 69 63 5f 6d 61 69    dVars["dic_mai
3750: 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20  n_filename_js"] 
3760: 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22  = "".    dVars["
3770: 64 69 63 5f 65 78 74 65 6e 64 65 64 5f 66 69 6c  dic_extended_fil
3780: 65 6e 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a  ename_py"] = "".
3790: 20 20 20 20 64 56 61 72 73 5b 22 64 69 63 5f 65      dVars["dic_e
37a0: 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65  xtended_filename
37b0: 5f 6a 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 64  _js"] = "".    d
37c0: 56 61 72 73 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e  Vars["dic_commun
37d0: 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 22  ity_filename_py"
37e0: 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72 73  ] = "".    dVars
37f0: 5b 22 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f  ["dic_community_
3800: 66 69 6c 65 6e 61 6d 65 5f 6a 73 22 5d 20 3d 20  filename_js"] = 
3810: 22 22 0a 20 20 20 20 64 56 61 72 73 5b 22 64 69  "".    dVars["di
3820: 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e  c_personal_filen
3830: 61 6d 65 5f 70 79 22 5d 20 3d 20 22 22 0a 20 20  ame_py"] = "".  
3840: 20 20 64 56 61 72 73 5b 22 64 69 63 5f 70 65 72    dVars["dic_per
3850: 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a  sonal_filename_j
3860: 73 22 5d 20 3d 20 22 22 0a 20 20 20 20 6c 44 69  s"] = "".    lDi
3870: 63 74 20 3d 20 5b 20 28 22 6d 61 69 6e 22 2c 20  ct = [ ("main", 
3880: 73 29 20 20 66 6f 72 20 73 20 69 6e 20 64 56 61  s)  for s in dVa
3890: 72 73 5b 27 64 69 63 5f 66 69 6c 65 6e 61 6d 65  rs['dic_filename
38a0: 73 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29 20 5d  s'].split(",") ]
38b0: 0a 20 20 20 20 69 66 20 62 45 78 74 65 6e 64 65  .    if bExtende
38c0: 64 44 69 63 74 3a 0a 20 20 20 20 20 20 20 20 6c  dDict:.        l
38d0: 44 69 63 74 2e 61 70 70 65 6e 64 28 28 22 65 78  Dict.append(("ex
38e0: 74 65 6e 64 65 64 22 2c 20 64 56 61 72 73 5b 27  tended", dVars['
38f0: 64 69 63 5f 65 78 74 65 6e 64 65 64 5f 66 69 6c  dic_extended_fil
3900: 65 6e 61 6d 65 27 5d 29 29 0a 20 20 20 20 69 66  ename'])).    if
3910: 20 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63 74 3a   bCommunityDict:
3920: 0a 20 20 20 20 20 20 20 20 6c 44 69 63 74 2e 61  .        lDict.a
3930: 70 70 65 6e 64 28 28 22 63 6f 6d 6d 75 6e 69 74  ppend(("communit
3940: 79 22 2c 20 64 56 61 72 73 5b 27 64 69 63 5f 63  y", dVars['dic_c
3950: 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d  ommunity_filenam
3960: 65 27 5d 29 29 0a 20 20 20 20 69 66 20 62 50 65  e'])).    if bPe
3970: 72 73 6f 6e 61 6c 44 69 63 74 3a 0a 20 20 20 20  rsonalDict:.    
3980: 20 20 20 20 6c 44 69 63 74 2e 61 70 70 65 6e 64      lDict.append
3990: 28 28 22 70 65 72 73 6f 6e 61 6c 22 2c 20 64 56  (("personal", dV
39a0: 61 72 73 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61  ars['dic_persona
39b0: 6c 5f 66 69 6c 65 6e 61 6d 65 27 5d 29 29 0a 20  l_filename'])). 
39c0: 20 20 20 66 6f 72 20 73 54 79 70 65 2c 20 73 46     for sType, sF
39d0: 69 6c 65 4e 61 6d 65 20 69 6e 20 6c 44 69 63 74  ileName in lDict
39e0: 3a 0a 20 20 20 20 20 20 20 20 73 70 66 50 79 44  :.        spfPyD
39f0: 69 63 20 3d 20 22 67 72 61 70 68 73 70 65 6c 6c  ic = "graphspell
3a00: 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22  /_dictionaries/"
3a10: 20 2b 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 22   + sFileName + "
3a20: 2e 62 64 69 63 22 0a 20 20 20 20 20 20 20 20 73  .bdic".        s
3a30: 70 66 4a 53 44 69 63 20 3d 20 22 67 72 61 70 68  pfJSDic = "graph
3a40: 73 70 65 6c 6c 2d 6a 73 2f 5f 64 69 63 74 69 6f  spell-js/_dictio
3a50: 6e 61 72 69 65 73 2f 22 20 2b 20 73 46 69 6c 65  naries/" + sFile
3a60: 4e 61 6d 65 20 2b 20 22 2e 6a 73 6f 6e 22 0a 20  Name + ".json". 
3a70: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
3a80: 2e 70 61 74 68 2e 69 73 66 69 6c 65 28 73 70 66  .path.isfile(spf
3a90: 50 79 44 69 63 29 20 6f 72 20 28 62 4a 61 76 61  PyDic) or (bJava
3aa0: 53 63 72 69 70 74 20 61 6e 64 20 6e 6f 74 20 6f  Script and not o
3ab0: 73 2e 70 61 74 68 2e 69 73 66 69 6c 65 28 73 70  s.path.isfile(sp
3ac0: 66 4a 53 44 69 63 29 29 3a 0a 20 20 20 20 20 20  fJSDic)):.      
3ad0: 20 20 20 20 20 20 62 75 69 6c 64 44 69 63 74 69        buildDicti
3ae0: 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 73 54 79  onary(dVars, sTy
3af0: 70 65 2c 20 62 4a 61 76 61 53 63 72 69 70 74 29  pe, bJavaScript)
3b00: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73  .        print(s
3b10: 70 66 50 79 44 69 63 29 0a 20 20 20 20 20 20 20  pfPyDic).       
3b20: 20 66 69 6c 65 5f 75 74 69 6c 2e 63 6f 70 79 5f   file_util.copy_
3b30: 66 69 6c 65 28 73 70 66 50 79 44 69 63 2c 20 22  file(spfPyDic, "
3b40: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70  grammalecte/grap
3b50: 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61  hspell/_dictiona
3b60: 72 69 65 73 22 29 0a 20 20 20 20 20 20 20 20 64  ries").        d
3b70: 56 61 72 73 5b 27 64 69 63 5f 27 2b 73 54 79 70  Vars['dic_'+sTyp
3b80: 65 2b 27 5f 66 69 6c 65 6e 61 6d 65 5f 70 79 27  e+'_filename_py'
3b90: 5d 20 3d 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20  ] = sFileName + 
3ba0: 27 2e 62 64 69 63 27 0a 20 20 20 20 20 20 20 20  '.bdic'.        
3bb0: 69 66 20 62 4a 61 76 61 53 63 72 69 70 74 3a 0a  if bJavaScript:.
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
3bd0: 74 28 73 70 66 4a 53 44 69 63 29 0a 20 20 20 20  t(spfJSDic).    
3be0: 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69          file_uti
3bf0: 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73 70 66 4a  l.copy_file(spfJ
3c00: 53 44 69 63 2c 20 22 67 72 61 6d 6d 61 6c 65 63  SDic, "grammalec
3c10: 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c  te-js/graphspell
3c20: 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 29  /_dictionaries")
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 56 61  .            dVa
3c40: 72 73 5b 27 64 69 63 5f 27 2b 73 54 79 70 65 2b  rs['dic_'+sType+
3c50: 27 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 27 5d 20  '_filename_js'] 
3c60: 3d 20 73 46 69 6c 65 4e 61 6d 65 20 2b 20 27 2e  = sFileName + '.
3c70: 6a 73 6f 6e 27 0a 20 20 20 20 64 56 61 72 73 5b  json'.    dVars[
3c80: 27 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61  'dic_main_filena
3c90: 6d 65 5f 70 79 27 5d 20 3d 20 64 56 61 72 73 5b  me_py'] = dVars[
3ca0: 27 64 69 63 5f 64 65 66 61 75 6c 74 5f 66 69 6c  'dic_default_fil
3cb0: 65 6e 61 6d 65 5f 70 79 27 5d 20 2b 20 22 2e 62  ename_py'] + ".b
3cc0: 64 69 63 22 0a 20 20 20 20 64 56 61 72 73 5b 27  dic".    dVars['
3cd0: 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d  dic_main_filenam
3ce0: 65 5f 6a 73 27 5d 20 3d 20 64 56 61 72 73 5b 27  e_js'] = dVars['
3cf0: 64 69 63 5f 64 65 66 61 75 6c 74 5f 66 69 6c 65  dic_default_file
3d00: 6e 61 6d 65 5f 6a 73 27 5d 20 2b 20 22 2e 6a 73  name_js'] + ".js
3d10: 6f 6e 22 0a 0a 0a 64 65 66 20 62 75 69 6c 64 44  on"...def buildD
3d20: 69 63 74 69 6f 6e 61 72 79 20 28 64 56 61 72 73  ictionary (dVars
3d30: 2c 20 73 54 79 70 65 2c 20 62 4a 61 76 61 53 63  , sType, bJavaSc
3d40: 72 69 70 74 3d 46 61 6c 73 65 29 3a 0a 20 20 20  ript=False):.   
3d50: 20 22 62 75 69 6c 64 20 62 69 6e 61 72 79 20 64   "build binary d
3d60: 69 63 74 69 6f 6e 61 72 79 20 66 6f 72 20 47 72  ictionary for Gr
3d70: 61 70 68 73 70 65 6c 6c 20 66 72 6f 6d 20 6c 65  aphspell from le
3d80: 78 69 63 6f 6e 73 22 0a 20 20 20 20 69 66 20 73  xicons".    if s
3d90: 54 79 70 65 20 3d 3d 20 22 6d 61 69 6e 22 3a 0a  Type == "main":.
3da0: 20 20 20 20 20 20 20 20 73 70 66 4c 65 78 53 72          spfLexSr
3db0: 63 20 3d 20 64 56 61 72 73 5b 27 6c 65 78 69 63  c = dVars['lexic
3dc0: 6f 6e 5f 73 72 63 27 5d 0a 20 20 20 20 20 20 20  on_src'].       
3dd0: 20 6c 53 66 44 69 63 74 44 73 74 20 3d 20 64 56   lSfDictDst = dV
3de0: 61 72 73 5b 27 64 69 63 5f 66 69 6c 65 6e 61 6d  ars['dic_filenam
3df0: 65 73 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29 0a  es'].split(",").
3e00: 20 20 20 20 20 20 20 20 6c 44 69 63 4e 61 6d 65          lDicName
3e10: 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 6e 61   = dVars['dic_na
3e20: 6d 65 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29 0a  me'].split(",").
3e30: 20 20 20 20 20 20 20 20 6c 46 69 6c 74 65 72 20          lFilter 
3e40: 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 66 69 6c  = dVars['dic_fil
3e50: 74 65 72 27 5d 2e 73 70 6c 69 74 28 22 2c 22 29  ter'].split(",")
3e60: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 44  .        for sfD
3e70: 69 63 74 44 73 74 2c 20 73 44 69 63 4e 61 6d 65  ictDst, sDicName
3e80: 2c 20 73 46 69 6c 74 65 72 20 69 6e 20 7a 69 70  , sFilter in zip
3e90: 28 6c 53 66 44 69 63 74 44 73 74 2c 20 6c 44 69  (lSfDictDst, lDi
3ea0: 63 4e 61 6d 65 2c 20 6c 46 69 6c 74 65 72 29 3a  cName, lFilter):
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 78  .            lex
3ec0: 5f 62 75 69 6c 64 2e 62 75 69 6c 64 28 73 70 66  _build.build(spf
3ed0: 4c 65 78 53 72 63 2c 20 64 56 61 72 73 5b 27 6c  LexSrc, dVars['l
3ee0: 61 6e 67 27 5d 2c 20 64 56 61 72 73 5b 27 6c 61  ang'], dVars['la
3ef0: 6e 67 5f 6e 61 6d 65 27 5d 2c 20 73 66 44 69 63  ng_name'], sfDic
3f00: 74 44 73 74 2c 20 62 4a 61 76 61 53 63 72 69 70  tDst, bJavaScrip
3f10: 74 2c 20 73 44 69 63 4e 61 6d 65 2c 20 73 46 69  t, sDicName, sFi
3f20: 6c 74 65 72 2c 20 64 56 61 72 73 5b 27 73 74 65  lter, dVars['ste
3f30: 6d 6d 69 6e 67 5f 6d 65 74 68 6f 64 27 5d 2c 20  mming_method'], 
3f40: 69 6e 74 28 64 56 61 72 73 5b 27 66 73 61 5f 6d  int(dVars['fsa_m
3f50: 65 74 68 6f 64 27 5d 29 29 0a 20 20 20 20 65 6c  ethod'])).    el
3f60: 73 65 3a 0a 20 20 20 20 20 20 20 20 69 66 20 73  se:.        if s
3f70: 54 79 70 65 20 3d 3d 20 22 65 78 74 65 6e 64 65  Type == "extende
3f80: 64 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  d":.            
3f90: 73 70 66 4c 65 78 53 72 63 20 3d 20 64 56 61 72  spfLexSrc = dVar
3fa0: 73 5b 27 6c 65 78 69 63 6f 6e 5f 65 78 74 65 6e  s['lexicon_exten
3fb0: 64 65 64 5f 73 72 63 27 5d 0a 20 20 20 20 20 20  ded_src'].      
3fc0: 20 20 20 20 20 20 73 66 44 69 63 74 44 73 74 20        sfDictDst 
3fd0: 3d 20 64 56 61 72 73 5b 27 64 69 63 5f 65 78 74  = dVars['dic_ext
3fe0: 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65 27 5d  ended_filename']
3ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69  .            sDi
4000: 63 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 64  cName = dVars['d
4010: 69 63 5f 65 78 74 65 6e 64 65 64 5f 6e 61 6d 65  ic_extended_name
4020: 27 5d 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  '].        elif 
4030: 73 54 79 70 65 20 3d 3d 20 22 63 6f 6d 6d 75 6e  sType == "commun
4040: 69 74 79 22 3a 0a 20 20 20 20 20 20 20 20 20 20  ity":.          
4050: 20 20 73 70 66 4c 65 78 53 72 63 20 3d 20 64 56    spfLexSrc = dV
4060: 61 72 73 5b 27 6c 65 78 69 63 6f 6e 5f 63 6f 6d  ars['lexicon_com
4070: 6d 75 6e 69 74 79 5f 73 72 63 27 5d 0a 20 20 20  munity_src'].   
4080: 20 20 20 20 20 20 20 20 20 73 66 44 69 63 74 44           sfDictD
4090: 73 74 20 3d 20 64 56 61 72 73 5b 27 64 69 63 5f  st = dVars['dic_
40a0: 63 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61  community_filena
40b0: 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 20 20 20  me'].           
40c0: 20 73 44 69 63 4e 61 6d 65 20 3d 20 64 56 61 72   sDicName = dVar
40d0: 73 5b 27 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79  s['dic_community
40e0: 5f 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20 20 20  _name'].        
40f0: 65 6c 69 66 20 73 54 79 70 65 20 3d 3d 20 22 70  elif sType == "p
4100: 65 72 73 6f 6e 61 6c 22 3a 0a 20 20 20 20 20 20  ersonal":.      
4110: 20 20 20 20 20 20 73 70 66 4c 65 78 53 72 63 20        spfLexSrc 
4120: 3d 20 64 56 61 72 73 5b 27 6c 65 78 69 63 6f 6e  = dVars['lexicon
4130: 5f 70 65 72 73 6f 6e 61 6c 5f 73 72 63 27 5d 0a  _personal_src'].
4140: 20 20 20 20 20 20 20 20 20 20 20 20 73 66 44 69              sfDi
4150: 63 74 44 73 74 20 3d 20 64 56 61 72 73 5b 27 64  ctDst = dVars['d
4160: 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65  ic_personal_file
4170: 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20 20 20 20  name'].         
4180: 20 20 20 73 44 69 63 4e 61 6d 65 20 3d 20 64 56     sDicName = dV
4190: 61 72 73 5b 27 64 69 63 5f 70 65 72 73 6f 6e 61  ars['dic_persona
41a0: 6c 5f 6e 61 6d 65 27 5d 0a 20 20 20 20 20 20 20  l_name'].       
41b0: 20 6c 65 78 5f 62 75 69 6c 64 2e 62 75 69 6c 64   lex_build.build
41c0: 28 73 70 66 4c 65 78 53 72 63 2c 20 64 56 61 72  (spfLexSrc, dVar
41d0: 73 5b 27 6c 61 6e 67 27 5d 2c 20 64 56 61 72 73  s['lang'], dVars
41e0: 5b 27 6c 61 6e 67 5f 6e 61 6d 65 27 5d 2c 20 73  ['lang_name'], s
41f0: 66 44 69 63 74 44 73 74 2c 20 62 4a 61 76 61 53  fDictDst, bJavaS
4200: 63 72 69 70 74 2c 20 73 44 69 63 4e 61 6d 65 2c  cript, sDicName,
4210: 20 22 22 2c 20 64 56 61 72 73 5b 27 73 74 65 6d   "", dVars['stem
4220: 6d 69 6e 67 5f 6d 65 74 68 6f 64 27 5d 2c 20 69  ming_method'], i
4230: 6e 74 28 64 56 61 72 73 5b 27 66 73 61 5f 6d 65  nt(dVars['fsa_me
4240: 74 68 6f 64 27 5d 29 29 0a 0a 0a 0a 64 65 66 20  thod']))....def 
4250: 6d 61 69 6e 20 28 29 3a 0a 20 20 20 20 22 62 75  main ():.    "bu
4260: 69 6c 64 20 47 72 61 6d 6d 61 6c 65 63 74 65 20  ild Grammalecte 
4270: 77 69 74 68 20 72 65 71 75 65 73 74 65 64 20 6f  with requested o
4280: 70 74 69 6f 6e 73 22 0a 20 20 20 20 70 72 69 6e  ptions".    prin
4290: 74 28 22 50 79 74 68 6f 6e 3a 20 22 20 2b 20 73  t("Python: " + s
42a0: 79 73 2e 76 65 72 73 69 6f 6e 29 0a 20 20 20 20  ys.version).    
42b0: 78 50 61 72 73 65 72 20 3d 20 61 72 67 70 61 72  xParser = argpar
42c0: 73 65 2e 41 72 67 75 6d 65 6e 74 50 61 72 73 65  se.ArgumentParse
42d0: 72 28 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e  r().    xParser.
42e0: 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 6c 61  add_argument("la
42f0: 6e 67 22 2c 20 74 79 70 65 3d 73 74 72 2c 20 6e  ng", type=str, n
4300: 61 72 67 73 3d 27 2b 27 2c 20 68 65 6c 70 3d 22  args='+', help="
4310: 6c 61 6e 67 20 70 72 6f 6a 65 63 74 20 74 6f 20  lang project to 
4320: 67 65 6e 65 72 61 74 65 20 28 6e 61 6d 65 20 6f  generate (name o
4330: 66 20 66 6f 6c 64 65 72 20 69 6e 20 2f 6c 61 6e  f folder in /lan
4340: 67 29 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  g)").    xParser
4350: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
4360: 62 22 2c 20 22 2d 2d 62 75 69 6c 64 5f 64 61 74  b", "--build_dat
4370: 61 22 2c 20 68 65 6c 70 3d 22 6c 61 75 6e 63 68  a", help="launch
4380: 20 62 75 69 6c 64 5f 64 61 74 61 2e 70 79 20 28   build_data.py (
4390: 70 61 72 74 20 31 20 61 6e 64 20 32 29 22 2c 20  part 1 and 2)", 
43a0: 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72  action="store_tr
43b0: 75 65 22 29 0a 20 20 20 20 78 50 61 72 73 65 72  ue").    xParser
43c0: 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d  .add_argument("-
43d0: 62 62 22 2c 20 22 2d 2d 62 75 69 6c 64 5f 64 61  bb", "--build_da
43e0: 74 61 5f 62 65 66 6f 72 65 22 2c 20 68 65 6c 70  ta_before", help
43f0: 3d 22 6c 61 75 6e 63 68 20 62 75 69 6c 64 5f 64  ="launch build_d
4400: 61 74 61 2e 70 79 20 28 6f 6e 6c 79 20 70 61 72  ata.py (only par
4410: 74 20 31 3a 20 62 65 66 6f 72 65 20 64 69 63 74  t 1: before dict
4420: 69 6f 6e 61 72 79 20 62 75 69 6c 64 69 6e 67 29  ionary building)
4430: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4440: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
4450: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4460: 28 22 2d 62 61 22 2c 20 22 2d 2d 62 75 69 6c 64  ("-ba", "--build
4470: 5f 64 61 74 61 5f 61 66 74 65 72 22 2c 20 68 65  _data_after", he
4480: 6c 70 3d 22 6c 61 75 6e 63 68 20 62 75 69 6c 64  lp="launch build
4490: 5f 64 61 74 61 2e 70 79 20 28 6f 6e 6c 79 20 70  _data.py (only p
44a0: 61 72 74 20 32 3a 20 62 65 66 6f 72 65 20 64 69  art 2: before di
44b0: 63 74 69 6f 6e 61 72 79 20 62 75 69 6c 64 69 6e  ctionary buildin
44c0: 67 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  g)", action="sto
44d0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
44e0: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
44f0: 6e 74 28 22 2d 64 22 2c 20 22 2d 2d 64 69 63 74  nt("-d", "--dict
4500: 22 2c 20 68 65 6c 70 3d 22 67 65 6e 65 72 61 74  ", help="generat
4510: 65 20 46 53 41 20 64 69 63 74 69 6f 6e 61 72 79  e FSA dictionary
4520: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
4530: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
4540: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4550: 28 22 2d 74 22 2c 20 22 2d 2d 74 65 73 74 73 22  ("-t", "--tests"
4560: 2c 20 68 65 6c 70 3d 22 72 75 6e 20 75 6e 69 74  , help="run unit
4570: 20 74 65 73 74 73 22 2c 20 61 63 74 69 6f 6e 3d   tests", action=
4580: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
4590: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
45a0: 67 75 6d 65 6e 74 28 22 2d 70 22 2c 20 22 2d 2d  gument("-p", "--
45b0: 70 65 72 66 22 2c 20 68 65 6c 70 3d 22 72 75 6e  perf", help="run
45c0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65 73   performance tes
45d0: 74 73 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  ts", action="sto
45e0: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
45f0: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
4600: 6e 74 28 22 2d 70 6d 22 2c 20 22 2d 2d 70 65 72  nt("-pm", "--per
4610: 66 5f 6d 65 6d 6f 22 2c 20 68 65 6c 70 3d 22 72  f_memo", help="r
4620: 75 6e 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  un performance t
4630: 65 73 74 73 20 61 6e 64 20 73 74 6f 72 65 20 72  ests and store r
4640: 65 73 75 6c 74 73 20 69 6e 20 70 65 72 66 5f 6d  esults in perf_m
4650: 65 6d 6f 2e 74 78 74 22 2c 20 61 63 74 69 6f 6e  emo.txt", action
4660: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4670: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
4680: 72 67 75 6d 65 6e 74 28 22 2d 6a 73 22 2c 20 22  rgument("-js", "
4690: 2d 2d 6a 61 76 61 73 63 72 69 70 74 22 2c 20 68  --javascript", h
46a0: 65 6c 70 3d 22 4a 61 76 61 53 63 72 69 70 74 20  elp="JavaScript 
46b0: 62 75 69 6c 64 20 66 6f 72 20 46 69 72 65 66 6f  build for Firefo
46c0: 78 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  x", action="stor
46d0: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
46e0: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
46f0: 74 28 22 2d 61 65 64 22 2c 20 22 2d 2d 61 64 64  t("-aed", "--add
4700: 5f 65 78 74 65 6e 64 65 64 5f 64 69 63 74 69 6f  _extended_dictio
4710: 6e 61 72 79 22 2c 20 68 65 6c 70 3d 22 61 64 64  nary", help="add
4720: 20 65 78 74 65 6e 64 65 64 20 64 69 63 74 69 6f   extended dictio
4730: 6e 61 72 79 20 74 6f 20 74 68 65 20 62 75 69 6c  nary to the buil
4740: 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  d", action="stor
4750: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
4760: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
4770: 74 28 22 2d 61 63 64 22 2c 20 22 2d 2d 61 64 64  t("-acd", "--add
4780: 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63 74 69  _community_dicti
4790: 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d 22 61 64  onary", help="ad
47a0: 64 20 63 6f 6d 6d 75 6e 69 74 79 20 64 69 63 74  d community dict
47b0: 69 6f 6e 61 72 79 20 74 6f 20 74 68 65 20 62 75  ionary to the bu
47c0: 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ild", action="st
47d0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
47e0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
47f0: 65 6e 74 28 22 2d 61 70 64 22 2c 20 22 2d 2d 61  ent("-apd", "--a
4800: 64 64 5f 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74  dd_personal_dict
4810: 69 6f 6e 61 72 79 22 2c 20 68 65 6c 70 3d 22 61  ionary", help="a
4820: 64 64 20 70 65 72 73 6f 6e 61 6c 20 64 69 63 74  dd personal dict
4830: 69 6f 6e 61 72 79 20 74 6f 20 74 68 65 20 62 75  ionary to the bu
4840: 69 6c 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ild", action="st
4850: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
4860: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
4870: 65 6e 74 28 22 2d 66 78 22 2c 20 22 2d 2d 66 69  ent("-fx", "--fi
4880: 72 65 66 6f 78 22 2c 20 68 65 6c 70 3d 22 4c 61  refox", help="La
4890: 75 6e 63 68 20 46 69 72 65 66 6f 78 20 44 65 76  unch Firefox Dev
48a0: 65 6c 6f 70 70 65 72 20 66 6f 72 20 57 65 62 45  elopper for WebE
48b0: 78 74 65 6e 73 69 6f 6e 20 74 65 73 74 69 6e 67  xtension testing
48c0: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
48d0: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
48e0: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
48f0: 28 22 2d 77 65 22 2c 20 22 2d 2d 77 65 62 5f 65  ("-we", "--web_e
4900: 78 74 22 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63  xt", help="Launc
4910: 68 20 46 69 72 65 66 6f 78 20 4e 69 67 68 74 6c  h Firefox Nightl
4920: 79 20 66 6f 72 20 57 65 62 45 78 74 65 6e 73 69  y for WebExtensi
4930: 6f 6e 20 74 65 73 74 69 6e 67 22 2c 20 61 63 74  on testing", act
4940: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4950: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4960: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 6c 22 2c  d_argument("-l",
4970: 20 22 2d 2d 6c 69 6e 74 5f 77 65 62 5f 65 78 74   "--lint_web_ext
4980: 22 2c 20 68 65 6c 70 3d 22 77 65 62 2d 65 78 74  ", help="web-ext
4990: 20 6c 69 6e 74 20 6f 6e 20 74 68 65 20 57 65 62   lint on the Web
49a0: 45 78 74 65 6e 73 69 6f 6e 22 2c 20 61 63 74 69  Extension", acti
49b0: 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29  on="store_true")
49c0: 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64  .    xParser.add
49d0: 5f 61 72 67 75 6d 65 6e 74 28 22 2d 74 62 22 2c  _argument("-tb",
49e0: 20 22 2d 2d 74 68 75 6e 64 65 72 62 69 72 64 22   "--thunderbird"
49f0: 2c 20 68 65 6c 70 3d 22 4c 61 75 6e 63 68 20 54  , help="Launch T
4a00: 68 75 6e 64 65 72 62 69 72 64 22 2c 20 61 63 74  hunderbird", act
4a10: 69 6f 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22  ion="store_true"
4a20: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
4a30: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 69 22 2c  d_argument("-i",
4a40: 20 22 2d 2d 69 6e 73 74 61 6c 6c 22 2c 20 68 65   "--install", he
4a50: 6c 70 3d 22 69 6e 73 74 61 6c 6c 20 74 68 65 20  lp="install the 
4a60: 65 78 74 65 6e 73 69 6f 6e 20 69 6e 20 57 72 69  extension in Wri
4a70: 74 65 72 20 28 70 61 74 68 20 6f 66 20 75 6e 6f  ter (path of uno
4a80: 70 6b 67 20 6d 75 73 74 20 62 65 20 73 65 74 20  pkg must be set 
4a90: 69 6e 20 63 6f 6e 66 69 67 2e 69 6e 69 29 22 2c  in config.ini)",
4aa0: 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65 5f 74   action="store_t
4ab0: 72 75 65 22 29 0a 20 20 20 20 78 41 72 67 73 20  rue").    xArgs 
4ac0: 3d 20 78 50 61 72 73 65 72 2e 70 61 72 73 65 5f  = xParser.parse_
4ad0: 61 72 67 73 28 29 0a 0a 20 20 20 20 69 66 20 78  args()..    if x
4ae0: 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 3a  Args.build_data:
4af0: 0a 20 20 20 20 20 20 20 20 78 41 72 67 73 2e 62  .        xArgs.b
4b00: 75 69 6c 64 5f 64 61 74 61 5f 62 65 66 6f 72 65  uild_data_before
4b10: 20 3d 20 54 72 75 65 0a 20 20 20 20 20 20 20 20   = True.        
4b20: 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61 74 61  xArgs.build_data
4b30: 5f 61 66 74 65 72 20 3d 20 54 72 75 65 0a 0a 20  _after = True.. 
4b40: 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61     dir_util.mkpa
4b50: 74 68 28 22 5f 62 75 69 6c 64 22 29 0a 20 20 20  th("_build").   
4b60: 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68   dir_util.mkpath
4b70: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 22 29 0a  ("grammalecte").
4b80: 20 20 20 20 69 66 20 78 41 72 67 73 2e 6a 61 76      if xArgs.jav
4b90: 61 73 63 72 69 70 74 3a 0a 20 20 20 20 20 20 20  ascript:.       
4ba0: 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68   dir_util.mkpath
4bb0: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73  ("grammalecte-js
4bc0: 22 29 0a 0a 20 20 20 20 63 6f 70 79 47 72 61 70  ")..    copyGrap
4bd0: 68 73 70 65 6c 6c 43 6f 72 65 28 78 41 72 67 73  hspellCore(xArgs
4be0: 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 0a 20 20  .javascript)..  
4bf0: 20 20 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20 78    for sLang in x
4c00: 41 72 67 73 2e 6c 61 6e 67 3a 0a 20 20 20 20 20  Args.lang:.     
4c10: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 65 78     if os.path.ex
4c20: 69 73 74 73 28 22 67 63 5f 6c 61 6e 67 2f 22 2b  ists("gc_lang/"+
4c30: 73 4c 61 6e 67 29 20 61 6e 64 20 6f 73 2e 70 61  sLang) and os.pa
4c40: 74 68 2e 69 73 64 69 72 28 22 67 63 5f 6c 61 6e  th.isdir("gc_lan
4c50: 67 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20 20  g/"+sLang):.    
4c60: 20 20 20 20 20 20 20 20 78 43 6f 6e 66 69 67 20          xConfig 
4c70: 3d 20 67 65 74 43 6f 6e 66 69 67 28 73 4c 61 6e  = getConfig(sLan
4c80: 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  g).            d
4c90: 56 61 72 73 20 3d 20 78 43 6f 6e 66 69 67 2e 5f  Vars = xConfig._
4ca0: 73 65 63 74 69 6f 6e 73 5b 27 61 72 67 73 27 5d  sections['args']
4cb0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
4cc0: 20 6e 6f 74 20 64 56 61 72 73 5b 22 6c 65 78 69   not dVars["lexi
4cd0: 63 6f 6e 5f 65 78 74 65 6e 64 65 64 5f 73 72 63  con_extended_src
4ce0: 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]:.            
4cf0: 20 20 20 20 78 41 72 67 73 2e 61 64 64 5f 65 78      xArgs.add_ex
4d00: 74 65 6e 64 65 64 5f 64 69 63 74 69 6f 6e 61 72  tended_dictionar
4d10: 79 20 3d 20 46 61 6c 73 65 0a 20 20 20 20 20 20  y = False.      
4d20: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 64 56 61        if not dVa
4d30: 72 73 5b 22 6c 65 78 69 63 6f 6e 5f 63 6f 6d 6d  rs["lexicon_comm
4d40: 75 6e 69 74 79 5f 73 72 63 22 5d 3a 0a 20 20 20  unity_src"]:.   
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 72               xAr
4d60: 67 73 2e 61 64 64 5f 63 6f 6d 6d 75 6e 69 74 79  gs.add_community
4d70: 5f 64 69 63 74 69 6f 6e 61 72 79 20 3d 20 46 61  _dictionary = Fa
4d80: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
4d90: 69 66 20 6e 6f 74 20 64 56 61 72 73 5b 22 6c 65  if not dVars["le
4da0: 78 69 63 6f 6e 5f 70 65 72 73 6f 6e 61 6c 5f 73  xicon_personal_s
4db0: 72 63 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20  rc"]:.          
4dc0: 20 20 20 20 20 20 78 41 72 67 73 2e 61 64 64 5f        xArgs.add_
4dd0: 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f 6e  personal_diction
4de0: 61 72 79 20 3d 20 46 61 6c 73 65 0a 0a 20 20 20  ary = False..   
4df0: 20 20 20 20 20 20 20 20 20 23 20 62 75 69 6c 64           # build
4e00: 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 20 20   data.          
4e10: 20 20 64 61 74 61 62 75 69 6c 64 20 3d 20 4e 6f    databuild = No
4e20: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ne.            i
4e30: 66 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64 61  f xArgs.build_da
4e40: 74 61 5f 62 65 66 6f 72 65 20 6f 72 20 78 41 72  ta_before or xAr
4e50: 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 5f 61 66  gs.build_data_af
4e60: 74 65 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ter:.           
4e70: 20 20 20 20 20 23 20 6c 61 6e 67 20 64 61 74 61       # lang data
4e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4e90: 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20   try:.          
4ea0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 75            databu
4eb0: 69 6c 64 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e  ild = importlib.
4ec0: 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67  import_module("g
4ed0: 63 5f 6c 61 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22  c_lang."+sLang+"
4ee0: 2e 62 75 69 6c 64 5f 64 61 74 61 22 29 0a 20 20  .build_data").  
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
4f00: 63 65 70 74 20 49 6d 70 6f 72 74 45 72 72 6f 72  cept ImportError
4f10: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4f20: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
4f30: 72 72 6f 72 2e 20 43 6f 75 6c 64 6e e2 80 99 74  rror. Couldn...t
4f40: 20 69 6d 70 6f 72 74 20 66 69 6c 65 20 62 75 69   import file bui
4f50: 6c 64 5f 64 61 74 61 2e 70 79 20 69 6e 20 66 6f  ld_data.py in fo
4f60: 6c 64 65 72 20 67 63 5f 6c 61 6e 67 2f 22 2b 73  lder gc_lang/"+s
4f70: 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20  Lang).          
4f80: 20 20 69 66 20 64 61 74 61 62 75 69 6c 64 20 61    if databuild a
4f90: 6e 64 20 78 41 72 67 73 2e 62 75 69 6c 64 5f 64  nd xArgs.build_d
4fa0: 61 74 61 5f 62 65 66 6f 72 65 3a 0a 20 20 20 20  ata_before:.    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
4fc0: 62 75 69 6c 64 2e 62 65 66 6f 72 65 28 27 67 63  build.before('gc
4fd0: 5f 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c 20 64  _lang/'+sLang, d
4fe0: 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76 61  Vars, xArgs.java
4ff0: 73 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20  script).        
5000: 20 20 20 20 69 66 20 78 41 72 67 73 2e 64 69 63      if xArgs.dic
5010: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t:.             
5020: 20 20 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61     buildDictiona
5030: 72 79 28 64 56 61 72 73 2c 20 22 6d 61 69 6e 22  ry(dVars, "main"
5040: 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69  , xArgs.javascri
5050: 70 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt).            
5060: 20 20 20 20 69 66 20 78 41 72 67 73 2e 61 64 64      if xArgs.add
5070: 5f 65 78 74 65 6e 64 65 64 5f 64 69 63 74 69 6f  _extended_dictio
5080: 6e 61 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20  nary:.          
5090: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 44            buildD
50a0: 69 63 74 69 6f 6e 61 72 79 28 64 56 61 72 73 2c  ictionary(dVars,
50b0: 20 22 65 78 74 65 6e 64 65 64 22 2c 20 78 41 72   "extended", xAr
50c0: 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20  gs.javascript). 
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
50e0: 66 20 78 41 72 67 73 2e 61 64 64 5f 63 6f 6d 6d  f xArgs.add_comm
50f0: 75 6e 69 74 79 5f 64 69 63 74 69 6f 6e 61 72 79  unity_dictionary
5100: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
5110: 20 20 20 20 20 20 62 75 69 6c 64 44 69 63 74 69        buildDicti
5120: 6f 6e 61 72 79 28 64 56 61 72 73 2c 20 22 63 6f  onary(dVars, "co
5130: 6d 6d 75 6e 69 74 79 22 2c 20 78 41 72 67 73 2e  mmunity", xArgs.
5140: 6a 61 76 61 73 63 72 69 70 74 29 0a 20 20 20 20  javascript).    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78              if x
5160: 41 72 67 73 2e 61 64 64 5f 70 65 72 73 6f 6e 61  Args.add_persona
5170: 6c 5f 64 69 63 74 69 6f 6e 61 72 79 3a 0a 20 20  l_dictionary:.  
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 62 75 69 6c 64 44 69 63 74 69 6f 6e 61 72    buildDictionar
51a0: 79 28 64 56 61 72 73 2c 20 22 70 65 72 73 6f 6e  y(dVars, "person
51b0: 61 6c 22 2c 20 78 41 72 67 73 2e 6a 61 76 61 73  al", xArgs.javas
51c0: 63 72 69 70 74 29 0a 20 20 20 20 20 20 20 20 20  cript).         
51d0: 20 20 20 69 66 20 64 61 74 61 62 75 69 6c 64 20     if databuild 
51e0: 61 6e 64 20 78 41 72 67 73 2e 62 75 69 6c 64 5f  and xArgs.build_
51f0: 64 61 74 61 5f 61 66 74 65 72 3a 0a 20 20 20 20  data_after:.    
5200: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
5210: 62 75 69 6c 64 2e 61 66 74 65 72 28 27 67 63 5f  build.after('gc_
5220: 6c 61 6e 67 2f 27 2b 73 4c 61 6e 67 2c 20 64 56  lang/'+sLang, dV
5230: 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76 61 73  ars, xArgs.javas
5240: 63 72 69 70 74 29 0a 0a 20 20 20 20 20 20 20 20  cript)..        
5250: 20 20 20 20 23 20 63 6f 70 79 20 64 69 63 74 69      # copy dicti
5260: 6f 6e 61 72 69 65 73 20 66 72 6f 6d 20 47 72 61  onaries from Gra
5270: 70 68 73 70 65 6c 6c 0a 20 20 20 20 20 20 20 20  phspell.        
5280: 20 20 20 20 63 6f 70 79 47 72 61 70 68 73 70 65      copyGraphspe
5290: 6c 6c 44 69 63 74 69 6f 6e 61 72 69 65 73 28 64  llDictionaries(d
52a0: 56 61 72 73 2c 20 78 41 72 67 73 2e 6a 61 76 61  Vars, xArgs.java
52b0: 73 63 72 69 70 74 2c 20 78 41 72 67 73 2e 61 64  script, xArgs.ad
52c0: 64 5f 65 78 74 65 6e 64 65 64 5f 64 69 63 74 69  d_extended_dicti
52d0: 6f 6e 61 72 79 2c 20 78 41 72 67 73 2e 61 64 64  onary, xArgs.add
52e0: 5f 63 6f 6d 6d 75 6e 69 74 79 5f 64 69 63 74 69  _community_dicti
52f0: 6f 6e 61 72 79 2c 20 78 41 72 67 73 2e 61 64 64  onary, xArgs.add
5300: 5f 70 65 72 73 6f 6e 61 6c 5f 64 69 63 74 69 6f  _personal_dictio
5310: 6e 61 72 79 29 0a 0a 20 20 20 20 20 20 20 20 20  nary)..         
5320: 20 20 20 23 20 6d 61 6b 65 0a 20 20 20 20 20 20     # make.      
5330: 20 20 20 20 20 20 73 56 65 72 73 69 6f 6e 20 3d        sVersion =
5340: 20 63 72 65 61 74 65 28 73 4c 61 6e 67 2c 20 78   create(sLang, x
5350: 43 6f 6e 66 69 67 2c 20 78 41 72 67 73 2e 69 6e  Config, xArgs.in
5360: 73 74 61 6c 6c 2c 20 78 41 72 67 73 2e 6a 61 76  stall, xArgs.jav
5370: 61 73 63 72 69 70 74 2c 20 29 0a 0a 20 20 20 20  ascript, )..    
5380: 20 20 20 20 20 20 20 20 23 20 74 65 73 74 73 0a          # tests.
5390: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78              if x
53a0: 41 72 67 73 2e 74 65 73 74 73 20 6f 72 20 78 41  Args.tests or xA
53b0: 72 67 73 2e 70 65 72 66 20 6f 72 20 78 41 72 67  rgs.perf or xArg
53c0: 73 2e 70 65 72 66 5f 6d 65 6d 6f 3a 0a 20 20 20  s.perf_memo:.   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
53e0: 6e 74 28 22 3e 20 52 75 6e 6e 69 6e 67 20 74 65  nt("> Running te
53f0: 73 74 73 22 29 0a 20 20 20 20 20 20 20 20 20 20  sts").          
5400: 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20        try:.     
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5420: 65 73 74 73 20 3d 20 69 6d 70 6f 72 74 6c 69 62  ests = importlib
5430: 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c 65 28 22  .import_module("
5440: 67 72 61 6d 6d 61 6c 65 63 74 65 2e 22 2b 73 4c  grammalecte."+sL
5450: 61 6e 67 2b 22 2e 74 65 73 74 73 22 29 0a 20 20  ang+".tests").  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 70 72 69 6e 74 28 74 65 73 74 73 2e 5f 5f    print(tests.__
5480: 66 69 6c 65 5f 5f 29 0a 20 20 20 20 20 20 20 20  file__).        
5490: 20 20 20 20 20 20 20 20 65 78 63 65 70 74 20 49          except I
54a0: 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20 20  mportError:.    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 2e 20  print("# Error. 
54d0: 49 6d 70 6f 72 74 20 66 61 69 6c 65 64 3a 22 20  Import failed:" 
54e0: 2b 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2e 22  + "grammalecte."
54f0: 2b 73 4c 61 6e 67 2b 22 2e 74 65 73 74 73 22 29  +sLang+".tests")
5500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5510: 20 20 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70       traceback.p
5520: 72 69 6e 74 5f 65 78 63 28 29 0a 20 20 20 20 20  rint_exc().     
5530: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
5540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5550: 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 74 65       if xArgs.te
5560: 73 74 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sts:.           
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 54 65               xTe
5580: 73 74 53 75 69 74 65 20 3d 20 75 6e 69 74 74 65  stSuite = unitte
5590: 73 74 2e 54 65 73 74 4c 6f 61 64 65 72 28 29 2e  st.TestLoader().
55a0: 6c 6f 61 64 54 65 73 74 73 46 72 6f 6d 4d 6f 64  loadTestsFromMod
55b0: 75 6c 65 28 74 65 73 74 73 29 0a 20 20 20 20 20  ule(tests).     
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 75 6e 69 74 74 65 73 74 2e 54 65 78 74     unittest.Text
55e0: 54 65 73 74 52 75 6e 6e 65 72 28 29 2e 72 75 6e  TestRunner().run
55f0: 28 78 54 65 73 74 53 75 69 74 65 29 0a 20 20 20  (xTestSuite).   
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 69 66 20 78 41 72 67 73 2e 70 65 72 66 20 6f   if xArgs.perf o
5620: 72 20 78 41 72 67 73 2e 70 65 72 66 5f 6d 65 6d  r xArgs.perf_mem
5630: 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o:.             
5640: 20 20 20 20 20 20 20 20 20 20 20 68 44 73 74 20             hDst 
5650: 3d 20 6f 70 65 6e 28 22 2e 2f 67 63 5f 6c 61 6e  = open("./gc_lan
5660: 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f 70 65 72 66  g/"+sLang+"/perf
5670: 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 22 61 22 2c  _memo.txt", "a",
5680: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
5690: 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29  ", newline="\n")
56a0: 20 20 69 66 20 78 41 72 67 73 2e 70 65 72 66 5f    if xArgs.perf_
56b0: 6d 65 6d 6f 20 20 65 6c 73 65 20 4e 6f 6e 65 0a  memo  else None.
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 20 20 20 20 20 74 65 73 74 73 2e 70 65          tests.pe
56e0: 72 66 28 73 56 65 72 73 69 6f 6e 2c 20 68 44 73  rf(sVersion, hDs
56f0: 74 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
5700: 23 20 46 69 72 65 66 6f 78 20 28 6f 62 73 6f 6c  # Firefox (obsol
5710: 65 74 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ete).           
5720: 20 23 69 66 20 46 61 6c 73 65 3a 0a 20 20 20 20   #if False:.    
5730: 20 20 20 20 20 20 20 20 23 20 20 20 20 77 69 74          #    wit
5740: 68 20 68 65 6c 70 65 72 73 2e 63 64 28 22 5f 62  h helpers.cd("_b
5750: 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67  uild/xpi/"+sLang
5760: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ):.            #
5770: 20 20 20 20 20 20 20 20 73 70 66 46 69 72 65 66          spfFiref
5780: 6f 78 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f  ox = dVars['win_
5790: 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 20 20 69  fx_dev_path']  i
57a0: 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65  f platform.syste
57b0: 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22  m() == "Windows"
57c0: 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69    else dVars['li
57d0: 6e 75 78 5f 66 78 5f 64 65 76 5f 70 61 74 68 27  nux_fx_dev_path'
57e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ].            # 
57f0: 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65 6d         os.system
5800: 28 27 6a 70 6d 20 72 75 6e 20 2d 62 20 22 27 20  ('jpm run -b "' 
5810: 2b 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20 27  + spfFirefox + '
5820: 22 27 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20  "')..           
5830: 20 69 66 20 78 41 72 67 73 2e 77 65 62 5f 65 78   if xArgs.web_ex
5840: 74 20 6f 72 20 78 41 72 67 73 2e 66 69 72 65 66  t or xArgs.firef
5850: 6f 78 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ox:.            
5860: 20 20 20 20 77 69 74 68 20 68 65 6c 70 65 72 73      with helpers
5870: 2e 63 64 28 22 5f 62 75 69 6c 64 2f 77 65 62 65  .cd("_build/webe
5880: 78 74 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20  xt/"+sLang):.   
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 69 66 20 78 41 72 67 73 2e 6c 69 6e 74 5f 77   if xArgs.lint_w
58b0: 65 62 5f 65 78 74 3a 0a 20 20 20 20 20 20 20 20  eb_ext:.        
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 6f 73 2e 73 79 73 74 65 6d 28 72 27 77 65 62 2d  os.system(r'web-
58e0: 65 78 74 20 6c 69 6e 74 20 2d 6f 20 74 65 78 74  ext lint -o text
58f0: 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
5900: 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e         if xArgs.
5910: 66 69 72 65 66 6f 78 3a 0a 20 20 20 20 20 20 20  firefox:.       
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 23 20 46 69 72 65 66 6f 78 20 44 65 76 65 6c   # Firefox Devel
5940: 6f 70 70 65 72 20 65 64 69 74 69 6f 6e 0a 20 20  opper edition.  
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 73 70 66 46 69 72 65 66 6f 78        spfFirefox
5970: 20 3d 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78   = dVars['win_fx
5980: 5f 64 65 76 5f 70 61 74 68 27 5d 20 20 69 66 20  _dev_path']  if 
5990: 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65 6d 28  platform.system(
59a0: 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22 20 20  ) == "Windows"  
59b0: 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69 6e 75  else dVars['linu
59c0: 78 5f 66 78 5f 64 65 76 5f 70 61 74 68 27 5d 0a  x_fx_dev_path'].
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 23 20 46 69 72 65 66 6f 78 20 4e 69 67 68    # Firefox Nigh
5a10: 74 6c 79 20 65 64 69 74 69 6f 6e 0a 20 20 20 20  tly edition.    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 73 70 66 46 69 72 65 66 6f 78 20 3d      spfFirefox =
5a40: 20 64 56 61 72 73 5b 27 77 69 6e 5f 66 78 5f 6e   dVars['win_fx_n
5a50: 69 67 68 74 6c 79 5f 70 61 74 68 27 5d 20 20 69  ightly_path']  i
5a60: 66 20 70 6c 61 74 66 6f 72 6d 2e 73 79 73 74 65  f platform.syste
5a70: 6d 28 29 20 3d 3d 20 22 57 69 6e 64 6f 77 73 22  m() == "Windows"
5a80: 20 20 65 6c 73 65 20 64 56 61 72 73 5b 27 6c 69    else dVars['li
5a90: 6e 75 78 5f 66 78 5f 6e 69 67 68 74 6c 79 5f 70  nux_fx_nightly_p
5aa0: 61 74 68 27 5d 0a 20 20 20 20 20 20 20 20 20 20  ath'].          
5ab0: 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73            os.sys
5ac0: 74 65 6d 28 72 27 77 65 62 2d 65 78 74 20 72 75  tem(r'web-ext ru
5ad0: 6e 20 2d 2d 66 69 72 65 66 6f 78 3d 22 27 20 2b  n --firefox="' +
5ae0: 20 73 70 66 46 69 72 65 66 6f 78 20 2b 20 27 22   spfFirefox + '"
5af0: 20 2d 2d 62 72 6f 77 73 65 72 2d 63 6f 6e 73 6f   --browser-conso
5b00: 6c 65 20 2d 2d 66 69 72 65 66 6f 78 2d 70 72 6f  le --firefox-pro
5b10: 66 69 6c 65 3d 64 65 62 75 67 27 29 0a 20 20 20  file=debug').   
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 23 20 68 74 74 70 73 3a 2f 2f 67 69 74 68 75   # https://githu
5b40: 62 2e 63 6f 6d 2f 6d 6f 7a 69 6c 6c 61 2f 77 65  b.com/mozilla/we
5b50: 62 2d 65 78 74 2f 69 73 73 75 65 73 2f 39 33 32  b-ext/issues/932
5b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5b70: 20 20 20 20 20 23 20 6f 73 2e 73 79 73 74 65 6d       # os.system
5b80: 28 72 27 77 65 62 2d 65 78 74 20 72 75 6e 20 2d  (r'web-ext run -
5b90: 2d 66 69 72 65 66 6f 78 3d 22 27 20 2b 20 73 70  -firefox="' + sp
5ba0: 66 46 69 72 65 66 6f 78 20 2b 20 72 27 22 20 2d  fFirefox + r'" -
5bb0: 2d 62 72 6f 77 73 65 72 2d 63 6f 6e 73 6f 6c 65  -browser-console
5bc0: 20 2d 2d 66 69 72 65 66 6f 78 2d 70 72 6f 66 69   --firefox-profi
5bd0: 6c 65 3d 43 3a 5c 55 73 65 72 73 5c 45 41 4b 5c  le=C:\Users\EAK\
5be0: 41 70 70 44 61 74 61 5c 52 6f 61 6d 69 6e 67 5c  AppData\Roaming\
5bf0: 4d 6f 7a 69 6c 6c 61 5c 46 69 72 65 66 6f 78 5c  Mozilla\Firefox\
5c00: 50 72 6f 66 69 6c 65 73 5c 65 32 36 35 35 39 74  Profiles\e26559t
5c10: 77 2e 64 65 62 75 67 20 2d 2d 6b 65 65 70 2d 70  w.debug --keep-p
5c20: 72 6f 66 69 6c 65 2d 63 68 61 6e 67 65 73 27 29  rofile-changes')
5c30: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
5c40: 54 68 75 6e 64 65 72 62 69 72 64 0a 20 20 20 20  Thunderbird.    
5c50: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
5c60: 2e 74 68 75 6e 64 65 72 62 69 72 64 3a 0a 20 20  .thunderbird:.  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
5c80: 2e 73 79 73 74 65 6d 28 22 74 68 75 6e 64 65 72  .system("thunder
5c90: 62 69 72 64 20 2d 6a 73 63 6f 6e 73 6f 6c 65 20  bird -jsconsole 
5ca0: 2d 50 20 64 65 62 75 67 22 29 0a 20 20 20 20 20  -P debug").     
5cb0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
5cc0: 20 20 20 20 20 70 72 69 6e 74 28 22 46 6f 6c 64       print("Fold
5cd0: 65 72 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 67 63  er not found: gc
5ce0: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 29 0a 0a  _lang/"+sLang)..
5cf0: 20 20 20 20 6f 4e 6f 77 20 3d 20 64 61 74 65 74      oNow = datet
5d00: 69 6d 65 2e 64 61 74 65 74 69 6d 65 2e 6e 6f 77  ime.datetime.now
5d10: 28 29 0a 20 20 20 20 70 72 69 6e 74 28 22 3d 3d  ().    print("==
5d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 4d 41 4b  ============ MAK
5d30: 45 20 47 52 41 4d 4d 41 4c 45 43 54 45 20 5b 66  E GRAMMALECTE [f
5d40: 69 6e 69 73 68 65 64 5d 20 61 74 20 7b 30 2e 68  inished] at {0.h
5d50: 6f 75 72 3a 3e 32 7d 20 68 20 7b 30 2e 6d 69 6e  our:>2} h {0.min
5d60: 75 74 65 3a 3e 32 7d 20 6d 69 6e 20 7b 30 2e 73  ute:>2} min {0.s
5d70: 65 63 6f 6e 64 3a 3e 32 7d 20 73 20 3d 3d 3d 3d  econd:>2} s ====
5d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 2e 66 6f 72 6d  ==========".form
5d90: 61 74 28 6f 4e 6f 77 29 29 0a 0a 0a 69 66 20 5f  at(oNow))...if _
5da0: 5f 6e 61 6d 65 5f 5f 20 3d 3d 20 27 5f 5f 6d 61  _name__ == '__ma
5db0: 69 6e 5f 5f 27 3a 0a 20 20 20 20 6d 61 69 6e 28  in__':.    main(
5dc0: 29 0a                                            ).