Grammalecte  Hex Artifact Content

Artifact a4db34e05564eb89a6c832f4db197246a86a7d9378a2814d9e33c8365772d413:


0000: 23 21 70 79 74 68 6f 6e 33 0a 23 20 63 6f 64 69  #!python3.# codi
0010: 6e 67 3a 20 55 54 46 2d 38 0a 0a 69 6d 70 6f 72  ng: UTF-8..impor
0020: 74 20 73 79 73 0a 69 6d 70 6f 72 74 20 6f 73 0a  t sys.import os.
0030: 69 6d 70 6f 72 74 20 73 75 62 70 72 6f 63 65 73  import subproces
0040: 73 0a 69 6d 70 6f 72 74 20 72 65 0a 69 6d 70 6f  s.import re.impo
0050: 72 74 20 7a 69 70 66 69 6c 65 0a 69 6d 70 6f 72  rt zipfile.impor
0060: 74 20 74 72 61 63 65 62 61 63 6b 0a 69 6d 70 6f  t traceback.impo
0070: 72 74 20 63 6f 6e 66 69 67 70 61 72 73 65 72 0a  rt configparser.
0080: 69 6d 70 6f 72 74 20 64 61 74 65 74 69 6d 65 0a  import datetime.
0090: 69 6d 70 6f 72 74 20 61 72 67 70 61 72 73 65 0a  import argparse.
00a0: 69 6d 70 6f 72 74 20 69 6d 70 6f 72 74 6c 69 62  import importlib
00b0: 0a 69 6d 70 6f 72 74 20 75 6e 69 74 74 65 73 74  .import unittest
00c0: 0a 69 6d 70 6f 72 74 20 6a 73 6f 6e 0a 0a 66 72  .import json..fr
00d0: 6f 6d 20 73 74 72 69 6e 67 20 69 6d 70 6f 72 74  om string import
00e0: 20 54 65 6d 70 6c 61 74 65 0a 66 72 6f 6d 20 64   Template.from d
00f0: 69 73 74 75 74 69 6c 73 20 69 6d 70 6f 72 74 20  istutils import 
0100: 64 69 72 5f 75 74 69 6c 2c 20 66 69 6c 65 5f 75  dir_util, file_u
0110: 74 69 6c 0a 0a 69 6d 70 6f 72 74 20 64 69 61 6c  til..import dial
0120: 6f 67 5f 62 75 6e 64 6c 65 64 0a 69 6d 70 6f 72  og_bundled.impor
0130: 74 20 63 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 0a  t compile_rules.
0140: 0a 0a 73 57 61 72 6e 69 6e 67 4d 65 73 73 61 67  ..sWarningMessag
0150: 65 20 3d 20 22 54 68 65 20 63 6f 6e 74 65 6e 74  e = "The content
0160: 20 6f 66 20 74 68 69 73 20 66 6f 6c 64 65 72 20   of this folder 
0170: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
0180: 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
0190: 64 20 61 74 20 65 61 63 68 20 62 75 69 6c 64 2e  d at each build.
01a0: 5c 6e 22 0a 0a 0a 63 6c 61 73 73 20 63 64 3a 0a  \n"...class cd:.
01b0: 20 20 20 20 22 22 22 43 6f 6e 74 65 78 74 20 6d      """Context m
01c0: 61 6e 61 67 65 72 20 66 6f 72 20 63 68 61 6e 67  anager for chang
01d0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
01e0: 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
01f0: 79 22 22 22 0a 20 20 20 20 64 65 66 20 5f 5f 69  y""".    def __i
0200: 6e 69 74 5f 5f 20 28 73 65 6c 66 2c 20 6e 65 77  nit__ (self, new
0210: 50 61 74 68 29 3a 0a 20 20 20 20 20 20 20 20 73  Path):.        s
0220: 65 6c 66 2e 6e 65 77 50 61 74 68 20 3d 20 6f 73  elf.newPath = os
0230: 2e 70 61 74 68 2e 65 78 70 61 6e 64 75 73 65 72  .path.expanduser
0240: 28 6e 65 77 50 61 74 68 29 0a 0a 20 20 20 20 64  (newPath)..    d
0250: 65 66 20 5f 5f 65 6e 74 65 72 5f 5f 20 28 73 65  ef __enter__ (se
0260: 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 73 65 6c  lf):.        sel
0270: 66 2e 73 61 76 65 64 50 61 74 68 20 3d 20 6f 73  f.savedPath = os
0280: 2e 67 65 74 63 77 64 28 29 0a 20 20 20 20 20 20  .getcwd().      
0290: 20 20 6f 73 2e 63 68 64 69 72 28 73 65 6c 66 2e    os.chdir(self.
02a0: 6e 65 77 50 61 74 68 29 0a 0a 20 20 20 20 64 65  newPath)..    de
02b0: 66 20 5f 5f 65 78 69 74 5f 5f 20 28 73 65 6c 66  f __exit__ (self
02c0: 2c 20 65 74 79 70 65 2c 20 76 61 6c 75 65 2c 20  , etype, value, 
02d0: 74 72 61 63 65 62 61 63 6b 29 3a 0a 20 20 20 20  traceback):.    
02e0: 20 20 20 20 6f 73 2e 63 68 64 69 72 28 73 65 6c      os.chdir(sel
02f0: 66 2e 73 61 76 65 64 50 61 74 68 29 0a 0a 0a 64  f.savedPath)...d
0300: 65 66 20 66 69 6c 65 46 69 6c 65 20 28 73 70 66  ef fileFile (spf
0310: 2c 20 64 56 61 72 73 29 3a 0a 20 20 20 20 72 65  , dVars):.    re
0320: 74 75 72 6e 20 54 65 6d 70 6c 61 74 65 28 6f 70  turn Template(op
0330: 65 6e 28 73 70 66 2c 20 22 72 22 2c 20 65 6e 63  en(spf, "r", enc
0340: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72  oding="utf-8").r
0350: 65 61 64 28 29 29 2e 73 61 66 65 5f 73 75 62 73  ead()).safe_subs
0360: 74 69 74 75 74 65 28 64 56 61 72 73 29 0a 0a 0a  titute(dVars)...
0370: 64 65 66 20 63 6f 70 79 41 6e 64 46 69 6c 65 54  def copyAndFileT
0380: 65 6d 70 6c 61 74 65 20 28 73 70 66 53 72 63 2c  emplate (spfSrc,
0390: 20 73 70 66 44 73 74 2c 20 64 56 61 72 73 29 3a   spfDst, dVars):
03a0: 0a 20 20 20 20 73 20 3d 20 54 65 6d 70 6c 61 74  .    s = Templat
03b0: 65 28 6f 70 65 6e 28 73 70 66 53 72 63 2c 20 22  e(open(spfSrc, "
03c0: 72 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  r", encoding="ut
03d0: 66 2d 38 22 29 2e 72 65 61 64 28 29 29 2e 73 61  f-8").read()).sa
03e0: 66 65 5f 73 75 62 73 74 69 74 75 74 65 28 64 56  fe_substitute(dV
03f0: 61 72 73 29 0a 20 20 20 20 6f 70 65 6e 28 73 70  ars).    open(sp
0400: 66 44 73 74 2c 20 22 77 22 2c 20 65 6e 63 6f 64  fDst, "w", encod
0410: 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77  ing="utf-8", new
0420: 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65  line="\n").write
0430: 28 73 29 0a 0a 0a 64 65 66 20 61 64 64 46 6f 6c  (s)...def addFol
0440: 64 65 72 54 6f 5a 69 70 41 6e 64 46 69 6c 65 46  derToZipAndFileF
0450: 69 6c 65 20 28 68 5a 69 70 2c 20 73 70 53 72 63  ile (hZip, spSrc
0460: 2c 20 73 70 44 73 74 2c 20 64 56 61 72 73 2c 20  , spDst, dVars, 
0470: 62 52 65 63 75 72 73 69 76 65 29 3a 0a 20 20 20  bRecursive):.   
0480: 20 23 20 72 65 63 75 72 73 69 76 65 20 66 75 6e   # recursive fun
0490: 63 74 69 6f 6e 0a 20 20 20 20 73 70 53 72 63 20  ction.    spSrc 
04a0: 3d 20 73 70 53 72 63 2e 73 74 72 69 70 28 22 2f  = spSrc.strip("/
04b0: 20 22 29 0a 20 20 20 20 73 70 44 73 74 20 3d 20   ").    spDst = 
04c0: 73 70 44 73 74 2e 73 74 72 69 70 28 22 2f 20 22  spDst.strip("/ "
04d0: 29 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  ).    for sf in 
04e0: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 53 72 63  os.listdir(spSrc
04f0: 29 3a 0a 20 20 20 20 20 20 20 20 73 70 66 53 72  ):.        spfSr
0500: 63 20 3d 20 28 73 70 53 72 63 20 2b 20 22 2f 22  c = (spSrc + "/"
0510: 20 2b 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20   + sf).strip("/ 
0520: 22 29 0a 20 20 20 20 20 20 20 20 73 70 66 44 73  ").        spfDs
0530: 74 20 3d 20 28 73 70 44 73 74 20 2b 20 22 2f 22  t = (spDst + "/"
0540: 20 2b 20 73 66 29 2e 73 74 72 69 70 28 22 2f 20   + sf).strip("/ 
0550: 22 29 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73  ").        if os
0560: 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70 66 53  .path.isdir(spfS
0570: 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  rc):.           
0580: 20 69 66 20 62 52 65 63 75 72 73 69 76 65 3a 0a   if bRecursive:.
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 61 64 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e  addFolderToZipAn
05b0: 64 46 69 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20  dFileFile(hZip, 
05c0: 73 70 66 53 72 63 2c 20 73 70 66 44 73 74 2c 20  spfSrc, spfDst, 
05d0: 64 56 61 72 73 2c 20 62 52 65 63 75 72 73 69 76  dVars, bRecursiv
05e0: 65 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a  e).        else:
05f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0600: 73 70 66 53 72 63 2e 65 6e 64 73 77 69 74 68 28  spfSrc.endswith(
0610: 28 22 2e 63 73 73 22 2c 20 22 2e 6a 73 22 2c 20  (".css", ".js", 
0620: 22 2e 78 63 75 22 2c 20 22 2e 78 75 6c 22 2c 20  ".xcu", ".xul", 
0630: 22 2e 72 64 66 22 2c 20 22 2e 64 74 64 22 2c 20  ".rdf", ".dtd", 
0640: 22 2e 70 72 6f 70 65 72 74 69 65 73 22 29 29 3a  ".properties")):
0650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0660: 20 23 70 72 69 6e 74 28 73 70 66 53 72 63 20 2b   #print(spfSrc +
0670: 20 22 20 3e 20 22 20 2b 20 73 70 66 44 73 74 29   " > " + spfDst)
0680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0690: 20 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 73   hZip.writestr(s
06a0: 70 66 44 73 74 2c 20 66 69 6c 65 46 69 6c 65 28  pfDst, fileFile(
06b0: 73 70 66 53 72 63 2c 20 64 56 61 72 73 29 29 0a  spfSrc, dVars)).
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
06d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
06e0: 20 20 23 70 72 69 6e 74 28 73 70 66 53 72 63 20    #print(spfSrc 
06f0: 2b 20 22 20 3e 20 22 20 2b 20 73 70 66 44 73 74  + " > " + spfDst
0700: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0710: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66    hZip.write(spf
0720: 53 72 63 2c 20 73 70 66 44 73 74 29 0a 0a 0a 64  Src, spfDst)...d
0730: 65 66 20 75 6e 7a 69 70 20 28 73 70 66 5a 69 70  ef unzip (spfZip
0740: 2c 20 73 70 44 65 73 74 2c 20 62 43 72 65 61 74  , spDest, bCreat
0750: 65 50 61 74 68 3d 46 61 6c 73 65 29 3a 0a 20 20  ePath=False):.  
0760: 20 20 69 66 20 73 70 44 65 73 74 3a 0a 20 20 20    if spDest:.   
0770: 20 20 20 20 20 69 66 20 62 43 72 65 61 74 65 50       if bCreateP
0780: 61 74 68 20 61 6e 64 20 6e 6f 74 20 6f 73 2e 70  ath and not os.p
0790: 61 74 68 2e 65 78 69 73 74 73 28 73 70 44 65 73  ath.exists(spDes
07a0: 74 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  t):.            
07b0: 64 69 72 5f 75 74 69 6c 2e 6d 6b 70 61 74 68 28  dir_util.mkpath(
07c0: 73 70 44 65 73 74 29 0a 20 20 20 20 20 20 20 20  spDest).        
07d0: 70 72 69 6e 74 28 22 3e 20 75 6e 7a 69 70 20 69  print("> unzip i
07e0: 6e 3a 20 22 2b 20 73 70 44 65 73 74 29 0a 20 20  n: "+ spDest).  
07f0: 20 20 20 20 20 20 73 70 49 6e 73 74 61 6c 6c 20        spInstall 
0800: 3d 20 6f 73 2e 70 61 74 68 2e 61 62 73 70 61 74  = os.path.abspat
0810: 68 28 73 70 44 65 73 74 29 0a 20 20 20 20 20 20  h(spDest).      
0820: 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73 64    if os.path.isd
0830: 69 72 28 73 70 49 6e 73 74 61 6c 6c 29 3a 0a 20  ir(spInstall):. 
0840: 20 20 20 20 20 20 20 20 20 20 20 65 72 61 73 65             erase
0850: 46 6f 6c 64 65 72 28 73 70 49 6e 73 74 61 6c 6c  Folder(spInstall
0860: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ).            wi
0870: 74 68 20 7a 69 70 66 69 6c 65 2e 5a 69 70 46 69  th zipfile.ZipFi
0880: 6c 65 28 73 70 66 5a 69 70 29 20 61 73 20 68 5a  le(spfZip) as hZ
0890: 69 70 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ip:.            
08a0: 20 20 20 20 68 5a 69 70 2e 65 78 74 72 61 63 74      hZip.extract
08b0: 61 6c 6c 28 73 70 44 65 73 74 29 0a 20 20 20 20  all(spDest).    
08c0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
08d0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 66        print("# f
08e0: 6f 6c 64 65 72 20 6e 6f 74 20 66 6f 75 6e 64 22  older not found"
08f0: 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ).    else:.    
0900: 20 20 20 20 70 72 69 6e 74 28 22 70 61 74 68 20      print("path 
0910: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65  destination is e
0920: 6d 70 74 79 22 29 0a 0a 0a 64 65 66 20 65 72 61  mpty")...def era
0930: 73 65 46 6f 6c 64 65 72 20 28 73 70 29 3a 0a 20  seFolder (sp):. 
0940: 20 20 20 23 20 72 65 63 75 72 73 69 76 65 21 21     # recursive!!
0950: 21 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20  !.    for sf in 
0960: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 29 3a 0a  os.listdir(sp):.
0970: 20 20 20 20 20 20 20 20 73 70 66 20 3d 20 73 70          spf = sp
0980: 20 2b 20 22 2f 22 20 2b 20 73 66 0a 20 20 20 20   + "/" + sf.    
0990: 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69      if os.path.i
09a0: 73 64 69 72 28 73 70 66 29 3a 0a 20 20 20 20 20  sdir(spf):.     
09b0: 20 20 20 20 20 20 20 65 72 61 73 65 46 6f 6c 64         eraseFold
09c0: 65 72 28 73 70 66 29 0a 20 20 20 20 20 20 20 20  er(spf).        
09d0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
09e0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
09f0: 20 20 20 20 20 20 20 6f 73 2e 72 65 6d 6f 76 65         os.remove
0a00: 28 73 70 66 29 0a 20 20 20 20 20 20 20 20 20 20  (spf).          
0a10: 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20    except:.      
0a20: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
0a30: 22 25 73 20 6e 6f 74 20 72 65 6d 6f 76 65 64 22  "%s not removed"
0a40: 20 25 20 73 70 66 29 0a 0a 0a 64 65 66 20 63 72   % spf)...def cr
0a50: 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72 20  eateCleanFolder 
0a60: 28 73 70 29 3a 0a 20 20 20 20 69 66 20 6e 6f 74  (sp):.    if not
0a70: 20 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28   os.path.exists(
0a80: 73 70 29 3a 0a 20 20 20 20 20 20 20 20 64 69 72  sp):.        dir
0a90: 5f 75 74 69 6c 2e 6d 6b 70 61 74 68 28 73 70 29  _util.mkpath(sp)
0aa0: 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20  .    else:.     
0ab0: 20 20 20 65 72 61 73 65 46 6f 6c 64 65 72 28 73     eraseFolder(s
0ac0: 70 29 0a 0a 0a 64 65 66 20 67 65 74 43 6f 6e 66  p)...def getConf
0ad0: 69 67 20 28 73 4c 61 6e 67 29 3a 0a 20 20 20 20  ig (sLang):.    
0ae0: 78 43 6f 6e 66 69 67 20 3d 20 63 6f 6e 66 69 67  xConfig = config
0af0: 70 61 72 73 65 72 2e 53 61 66 65 43 6f 6e 66 69  parser.SafeConfi
0b00: 67 50 61 72 73 65 72 28 29 0a 20 20 20 20 78 43  gParser().    xC
0b10: 6f 6e 66 69 67 2e 6f 70 74 69 6f 6e 78 66 6f 72  onfig.optionxfor
0b20: 6d 20 3d 20 73 74 72 0a 20 20 20 20 74 72 79 3a  m = str.    try:
0b30: 0a 20 20 20 20 20 20 20 20 78 43 6f 6e 66 69 67  .        xConfig
0b40: 2e 72 65 61 64 28 22 67 63 5f 6c 61 6e 67 2f 22  .read("gc_lang/"
0b50: 20 2b 20 73 4c 61 6e 67 20 2b 20 22 2f 63 6f 6e   + sLang + "/con
0b60: 66 69 67 2e 69 6e 69 22 2c 20 65 6e 63 6f 64 69  fig.ini", encodi
0b70: 6e 67 3d 22 75 74 66 2d 38 22 29 0a 20 20 20 20  ng="utf-8").    
0b80: 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20  except:.        
0b90: 70 72 69 6e 74 28 22 43 6f 6e 66 69 67 20 66 69  print("Config fi
0ba0: 6c 65 20 69 6e 20 70 72 6f 6a 65 63 74 20 5b 22  le in project ["
0bb0: 20 2b 20 73 4c 61 6e 67 20 2b 20 22 5d 20 6e 6f   + sLang + "] no
0bc0: 74 20 66 6f 75 6e 64 22 29 0a 20 20 20 20 20 20  t found").      
0bd0: 20 20 65 78 69 74 28 29 0a 20 20 20 20 72 65 74    exit().    ret
0be0: 75 72 6e 20 78 43 6f 6e 66 69 67 0a 0a 0a 64 65  urn xConfig...de
0bf0: 66 20 63 72 65 61 74 65 4f 70 74 69 6f 6e 73 4c  f createOptionsL
0c00: 61 62 65 6c 50 72 6f 70 65 72 74 69 65 73 20 28  abelProperties (
0c10: 64 4f 70 74 4c 62 6c 29 3a 0a 20 20 20 20 73 43  dOptLbl):.    sC
0c20: 6f 6e 74 65 6e 74 20 3d 20 22 22 0a 20 20 20 20  ontent = "".    
0c30: 66 6f 72 20 73 4f 70 74 2c 20 74 4c 61 62 65 6c  for sOpt, tLabel
0c40: 20 69 6e 20 64 4f 70 74 4c 62 6c 2e 69 74 65 6d   in dOptLbl.item
0c50: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 73 43 6f  s():.        sCo
0c60: 6e 74 65 6e 74 20 2b 3d 20 73 4f 70 74 20 2b 20  ntent += sOpt + 
0c70: 22 3d 22 20 2b 20 74 4c 61 62 65 6c 5b 30 5d 20  "=" + tLabel[0] 
0c80: 2b 20 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 69  + "\n".        i
0c90: 66 20 74 4c 61 62 65 6c 5b 31 5d 3a 0a 20 20 20  f tLabel[1]:.   
0ca0: 20 20 20 20 20 20 20 20 20 73 43 6f 6e 74 65 6e           sConten
0cb0: 74 20 2b 3d 20 22 68 6c 70 5f 22 20 2b 20 73 4f  t += "hlp_" + sO
0cc0: 70 74 20 2b 20 22 3d 22 20 2b 20 74 4c 61 62 65  pt + "=" + tLabe
0cd0: 6c 5b 31 5d 20 2b 20 22 5c 6e 22 0a 20 20 20 20  l[1] + "\n".    
0ce0: 72 65 74 75 72 6e 20 73 43 6f 6e 74 65 6e 74 0a  return sContent.
0cf0: 0a 0a 64 65 66 20 63 72 65 61 74 65 44 69 61 6c  ..def createDial
0d00: 6f 67 4f 70 74 69 6f 6e 73 58 44 4c 20 28 64 56  ogOptionsXDL (dV
0d10: 61 72 73 29 3a 0a 20 20 20 20 73 46 69 78 65 64  ars):.    sFixed
0d20: 6c 69 6e 65 20 3d 20 27 3c 64 6c 67 3a 66 69 78  line = '<dlg:fix
0d30: 65 64 6c 69 6e 65 20 64 6c 67 3a 69 64 3d 22 7b  edline dlg:id="{
0d40: 30 7d 22 20 64 6c 67 3a 74 61 62 2d 69 6e 64 65  0}" dlg:tab-inde
0d50: 78 3d 22 7b 31 7d 22 20 64 6c 67 3a 74 6f 70 3d  x="{1}" dlg:top=
0d60: 22 7b 32 7d 22 20 64 6c 67 3a 6c 65 66 74 3d 22  "{2}" dlg:left="
0d70: 35 22 20 64 6c 67 3a 77 69 64 74 68 3d 22 7b 33  5" dlg:width="{3
0d80: 7d 22 20 64 6c 67 3a 68 65 69 67 68 74 3d 22 31  }" dlg:height="1
0d90: 30 22 20 64 6c 67 3a 76 61 6c 75 65 3d 22 26 61  0" dlg:value="&a
0da0: 6d 70 3b 7b 30 7d 22 20 2f 3e 5c 6e 27 0a 20 20  mp;{0}" />\n'.  
0db0: 20 20 73 43 68 65 63 6b 62 6f 78 20 3d 20 27 3c    sCheckbox = '<
0dc0: 64 6c 67 3a 63 68 65 63 6b 62 6f 78 20 64 6c 67  dlg:checkbox dlg
0dd0: 3a 69 64 3d 22 7b 30 7d 22 20 64 6c 67 3a 74 61  :id="{0}" dlg:ta
0de0: 62 2d 69 6e 64 65 78 3d 22 7b 31 7d 22 20 64 6c  b-index="{1}" dl
0df0: 67 3a 74 6f 70 3d 22 7b 32 7d 22 20 64 6c 67 3a  g:top="{2}" dlg:
0e00: 6c 65 66 74 3d 22 7b 33 7d 22 20 64 6c 67 3a 77  left="{3}" dlg:w
0e10: 69 64 74 68 3d 22 7b 34 7d 22 20 64 6c 67 3a 68  idth="{4}" dlg:h
0e20: 65 69 67 68 74 3d 22 31 30 22 20 64 6c 67 3a 76  eight="10" dlg:v
0e30: 61 6c 75 65 3d 22 26 61 6d 70 3b 7b 30 7d 22 20  alue="&amp;{0}" 
0e40: 64 6c 67 3a 63 68 65 63 6b 65 64 3d 22 7b 35 7d  dlg:checked="{5}
0e50: 22 20 7b 36 7d 20 2f 3e 5c 6e 27 0a 20 20 20 20  " {6} />\n'.    
0e60: 69 54 61 62 49 6e 64 65 78 20 3d 20 31 0a 20 20  iTabIndex = 1.  
0e70: 20 20 6e 50 6f 73 59 20 3d 20 35 0a 20 20 20 20    nPosY = 5.    
0e80: 6e 57 69 64 74 68 20 3d 20 32 34 30 0a 20 20 20  nWidth = 240.   
0e90: 20 73 43 6f 6e 74 65 6e 74 20 3d 20 22 22 0a 20   sContent = "". 
0ea0: 20 20 20 64 4f 70 74 20 3d 20 64 56 61 72 73 5b     dOpt = dVars[
0eb0: 22 64 4f 70 74 50 79 74 68 6f 6e 22 5d 0a 20 20  "dOptPython"].  
0ec0: 20 20 64 4f 70 74 4c 61 62 65 6c 20 3d 20 64 56    dOptLabel = dV
0ed0: 61 72 73 5b 22 64 4f 70 74 4c 61 62 65 6c 22 5d  ars["dOptLabel"]
0ee0: 5b 64 56 61 72 73 5b 22 6c 61 6e 67 22 5d 5d 0a  [dVars["lang"]].
0ef0: 20 20 20 20 66 6f 72 20 73 47 72 6f 75 70 2c 20      for sGroup, 
0f00: 6c 47 72 6f 75 70 4f 70 74 69 6f 6e 73 20 69 6e  lGroupOptions in
0f10: 20 64 56 61 72 73 5b 22 6c 53 74 72 75 63 74 4f   dVars["lStructO
0f20: 70 74 22 5d 3a 0a 20 20 20 20 20 20 20 20 73 43  pt"]:.        sC
0f30: 6f 6e 74 65 6e 74 20 2b 3d 20 73 46 69 78 65 64  ontent += sFixed
0f40: 6c 69 6e 65 2e 66 6f 72 6d 61 74 28 73 47 72 6f  line.format(sGro
0f50: 75 70 2c 20 69 54 61 62 49 6e 64 65 78 2c 20 6e  up, iTabIndex, n
0f60: 50 6f 73 59 2c 20 6e 57 69 64 74 68 29 0a 20 20  PosY, nWidth).  
0f70: 20 20 20 20 20 20 69 54 61 62 49 6e 64 65 78 20        iTabIndex 
0f80: 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 66 6f 72  += 1.        for
0f90: 20 6c 4c 69 6e 65 4f 70 74 69 6f 6e 73 20 69 6e   lLineOptions in
0fa0: 20 6c 47 72 6f 75 70 4f 70 74 69 6f 6e 73 3a 0a   lGroupOptions:.
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 6c 65              nEle
0fc0: 6d 57 69 64 74 68 20 3d 20 6e 57 69 64 74 68 20  mWidth = nWidth 
0fd0: 2f 2f 20 6c 65 6e 28 6c 4c 69 6e 65 4f 70 74 69  // len(lLineOpti
0fe0: 6f 6e 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ons).           
0ff0: 20 6e 50 6f 73 59 20 2b 3d 20 31 30 0a 20 20 20   nPosY += 10.   
1000: 20 20 20 20 20 20 20 20 20 6e 50 6f 73 58 20 3d           nPosX =
1010: 20 31 30 0a 20 20 20 20 20 20 20 20 20 20 20 20   10.            
1020: 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c 4c 69 6e  for sOpt in lLin
1030: 65 4f 70 74 69 6f 6e 73 3a 0a 20 20 20 20 20 20  eOptions:.      
1040: 20 20 20 20 20 20 20 20 20 20 73 48 65 6c 70 20            sHelp 
1050: 3d 20 27 64 6c 67 3a 68 65 6c 70 2d 74 65 78 74  = 'dlg:help-text
1060: 3d 22 26 61 6d 70 3b 68 6c 70 5f 25 73 22 27 25  ="&amp;hlp_%s"'%
1070: 73 4f 70 74 20 20 69 66 20 64 4f 70 74 4c 61 62  sOpt  if dOptLab
1080: 65 6c 5b 73 4f 70 74 5d 5b 31 5d 20 20 65 6c 73  el[sOpt][1]  els
1090: 65 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  e "".           
10a0: 20 20 20 20 20 73 43 6f 6e 74 65 6e 74 20 2b 3d       sContent +=
10b0: 20 73 43 68 65 63 6b 62 6f 78 2e 66 6f 72 6d 61   sCheckbox.forma
10c0: 74 28 73 4f 70 74 2c 20 69 54 61 62 49 6e 64 65  t(sOpt, iTabInde
10d0: 78 2c 20 6e 50 6f 73 59 2c 20 6e 50 6f 73 58 2c  x, nPosY, nPosX,
10e0: 20 6e 45 6c 65 6d 57 69 64 74 68 2c 20 22 74 72   nElemWidth, "tr
10f0: 75 65 22 20 69 66 20 64 4f 70 74 5b 73 4f 70 74  ue" if dOpt[sOpt
1100: 5d 20 65 6c 73 65 20 22 66 61 6c 73 65 22 2c 20  ] else "false", 
1110: 73 48 65 6c 70 29 0a 20 20 20 20 20 20 20 20 20  sHelp).         
1120: 20 20 20 20 20 20 20 69 54 61 62 49 6e 64 65 78         iTabIndex
1130: 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20   += 1.          
1140: 20 20 20 20 20 20 6e 50 6f 73 58 20 2b 3d 20 6e        nPosX += n
1150: 45 6c 65 6d 57 69 64 74 68 0a 20 20 20 20 20 20  ElemWidth.      
1160: 20 20 6e 50 6f 73 59 20 2b 3d 20 31 30 0a 20 20    nPosY += 10.  
1170: 20 20 72 65 74 75 72 6e 20 73 43 6f 6e 74 65 6e    return sConten
1180: 74 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 4f 58  t...def createOX
1190: 54 20 28 73 70 4c 61 6e 67 2c 20 64 56 61 72 73  T (spLang, dVars
11a0: 2c 20 64 4f 78 74 2c 20 73 70 4c 61 6e 67 50 61  , dOxt, spLangPa
11b0: 63 6b 2c 20 62 49 6e 73 74 61 6c 6c 29 3a 0a 20  ck, bInstall):. 
11c0: 20 20 20 22 63 72 65 61 74 65 20 65 78 74 65 6e     "create exten
11d0: 73 69 6f 6e 20 66 6f 72 20 57 72 69 74 65 72 22  sion for Writer"
11e0: 0a 20 20 20 20 70 72 69 6e 74 28 22 42 75 69 6c  .    print("Buil
11f0: 64 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 20 66  ding extension f
1200: 6f 72 20 57 72 69 74 65 72 22 29 0a 20 20 20 20  or Writer").    
1210: 73 70 66 5a 69 70 20 3d 20 22 5f 62 75 69 6c 64  spfZip = "_build
1220: 2f 22 20 2b 20 64 56 61 72 73 5b 27 6e 61 6d 65  /" + dVars['name
1230: 27 5d 20 2b 20 22 2d 22 2b 20 64 56 61 72 73 5b  '] + "-"+ dVars[
1240: 27 6c 61 6e 67 27 5d 20 2b 22 2d 76 22 20 2b 20  'lang'] +"-v" + 
1250: 64 56 61 72 73 5b 27 76 65 72 73 69 6f 6e 27 5d  dVars['version']
1260: 20 2b 20 27 2e 6f 78 74 27 0a 20 20 20 20 68 5a   + '.oxt'.    hZ
1270: 69 70 20 3d 20 7a 69 70 66 69 6c 65 2e 5a 69 70  ip = zipfile.Zip
1280: 46 69 6c 65 28 73 70 66 5a 69 70 2c 20 6d 6f 64  File(spfZip, mod
1290: 65 3d 27 77 27 2c 20 63 6f 6d 70 72 65 73 73 69  e='w', compressi
12a0: 6f 6e 3d 7a 69 70 66 69 6c 65 2e 5a 49 50 5f 44  on=zipfile.ZIP_D
12b0: 45 46 4c 41 54 45 44 29 0a 0a 20 20 20 20 23 20  EFLATED)..    # 
12c0: 50 61 63 6b 61 67 65 20 61 6e 64 20 70 61 72 73  Package and pars
12d0: 65 72 0a 20 20 20 20 63 6f 70 79 47 72 61 6d 6d  er.    copyGramm
12e0: 61 6c 65 63 74 65 50 79 50 61 63 6b 61 67 65 49  alectePyPackageI
12f0: 6e 5a 69 70 46 69 6c 65 28 68 5a 69 70 2c 20 73  nZipFile(hZip, s
1300: 70 4c 61 6e 67 50 61 63 6b 2c 20 64 56 61 72 73  pLangPack, dVars
1310: 5b 27 70 79 5f 62 69 6e 61 72 79 5f 64 69 63 27  ['py_binary_dic'
1320: 5d 2c 20 22 70 79 74 68 6f 6e 70 61 74 68 2f 22  ], "pythonpath/"
1330: 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65  ).    hZip.write
1340: 28 22 63 6c 69 2e 70 79 22 2c 20 22 70 79 74 68  ("cli.py", "pyth
1350: 6f 6e 70 61 74 68 2f 63 6c 69 2e 70 79 22 29 0a  onpath/cli.py").
1360: 0a 20 20 20 20 23 20 45 78 74 65 6e 73 69 6f 6e  .    # Extension
1370: 20 66 69 6c 65 73 0a 20 20 20 20 68 5a 69 70 2e   files.    hZip.
1380: 77 72 69 74 65 73 74 72 28 22 4d 45 54 41 2d 49  writestr("META-I
1390: 4e 46 2f 6d 61 6e 69 66 65 73 74 2e 78 6d 6c 22  NF/manifest.xml"
13a0: 2c 20 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63  , fileFile("gc_c
13b0: 6f 72 65 2f 70 79 2f 6f 78 74 2f 6d 61 6e 69 66  ore/py/oxt/manif
13c0: 65 73 74 2e 78 6d 6c 22 2c 20 64 56 61 72 73 29  est.xml", dVars)
13d0: 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65  ).    hZip.write
13e0: 73 74 72 28 22 64 65 73 63 72 69 70 74 69 6f 6e  str("description
13f0: 2e 78 6d 6c 22 2c 20 66 69 6c 65 46 69 6c 65 28  .xml", fileFile(
1400: 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f  "gc_core/py/oxt/
1410: 64 65 73 63 72 69 70 74 69 6f 6e 2e 78 6d 6c 22  description.xml"
1420: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
1430: 69 70 2e 77 72 69 74 65 73 74 72 28 22 4c 69 6e  ip.writestr("Lin
1440: 67 75 69 73 74 69 63 2e 78 63 75 22 2c 20 66 69  guistic.xcu", fi
1450: 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f  leFile("gc_core/
1460: 70 79 2f 6f 78 74 2f 4c 69 6e 67 75 69 73 74 69  py/oxt/Linguisti
1470: 63 2e 78 63 75 22 2c 20 64 56 61 72 73 29 29 0a  c.xcu", dVars)).
1480: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73 74      hZip.writest
1490: 72 28 22 47 72 61 6d 6d 61 6c 65 63 74 65 2e 70  r("Grammalecte.p
14a0: 79 22 2c 20 66 69 6c 65 46 69 6c 65 28 22 67 63  y", fileFile("gc
14b0: 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 47 72 61  _core/py/oxt/Gra
14c0: 6d 6d 61 6c 65 63 74 65 2e 70 79 22 2c 20 64 56  mmalecte.py", dV
14d0: 61 72 73 29 29 0a 0a 20 20 20 20 66 6f 72 20 73  ars))..    for s
14e0: 66 20 69 6e 20 64 56 61 72 73 5b 22 65 78 74 72  f in dVars["extr
14f0: 61 73 22 5d 2e 73 70 6c 69 74 28 22 2c 22 29 3a  as"].split(","):
1500: 0a 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72  .        hZip.wr
1510: 69 74 65 73 74 72 28 73 66 2e 73 74 72 69 70 28  itestr(sf.strip(
1520: 29 2c 20 66 69 6c 65 46 69 6c 65 28 73 70 4c 61  ), fileFile(spLa
1530: 6e 67 20 2b 20 27 2f 27 20 2b 20 73 66 2e 73 74  ng + '/' + sf.st
1540: 72 69 70 28 29 2c 20 64 56 61 72 73 29 29 0a 0a  rip(), dVars))..
1550: 20 20 20 20 69 66 20 22 6c 6f 67 6f 22 20 69 6e      if "logo" in
1560: 20 64 56 61 72 73 2e 6b 65 79 73 28 29 20 61 6e   dVars.keys() an
1570: 64 20 64 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e  d dVars["logo"].
1580: 73 74 72 69 70 28 29 3a 0a 20 20 20 20 20 20 20  strip():.       
1590: 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 4c 61   hZip.write(spLa
15a0: 6e 67 20 2b 20 27 2f 27 20 2b 20 64 56 61 72 73  ng + '/' + dVars
15b0: 5b 22 6c 6f 67 6f 22 5d 2e 73 74 72 69 70 28 29  ["logo"].strip()
15c0: 2c 20 64 56 61 72 73 5b 22 6c 6f 67 6f 22 5d 2e  , dVars["logo"].
15d0: 73 74 72 69 70 28 29 29 0a 0a 20 20 20 20 23 23  strip())..    ##
15e0: 20 4f 50 54 49 4f 4e 53 0a 20 20 20 20 23 20 6f   OPTIONS.    # o
15f0: 70 74 69 6f 6e 73 20 64 69 61 6c 6f 67 20 77 69  ptions dialog wi
1600: 74 68 69 6e 20 4c 4f 2f 4f 4f 20 6f 70 74 69 6f  thin LO/OO optio
1610: 6e 73 20 70 61 6e 65 6c 20 28 6c 65 67 61 63 79  ns panel (legacy
1620: 29 0a 20 20 20 20 23 68 5a 69 70 2e 77 72 69 74  ).    #hZip.writ
1630: 65 73 74 72 28 22 70 79 74 68 6f 6e 70 61 74 68  estr("pythonpath
1640: 2f 6c 69 67 68 74 70 72 6f 6f 66 5f 68 61 6e 64  /lightproof_hand
1650: 6c 65 72 5f 67 72 61 6d 6d 61 6c 65 63 74 65 2e  ler_grammalecte.
1660: 70 79 22 2c 20 66 69 6c 65 46 69 6c 65 28 22 67  py", fileFile("g
1670: 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 6c 69  c_core/py/oxt/li
1680: 67 68 74 70 72 6f 6f 66 5f 68 61 6e 64 6c 65 72  ghtproof_handler
1690: 5f 67 72 61 6d 6d 61 6c 65 63 74 65 2e 70 79 22  _grammalecte.py"
16a0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 23 6c  , dVars)).    #l
16b0: 4c 69 6e 65 4f 70 74 69 6f 6e 73 20 3d 20 6f 70  LineOptions = op
16c0: 65 6e 28 73 70 4c 61 6e 67 20 2b 20 22 2f 6f 70  en(spLang + "/op
16d0: 74 69 6f 6e 73 2e 74 78 74 22 2c 20 22 72 22 2c  tions.txt", "r",
16e0: 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38   encoding="utf-8
16f0: 22 29 2e 72 65 61 64 6c 69 6e 65 73 28 29 0a 20  ").readlines(). 
1700: 20 20 20 23 64 69 61 6c 6f 67 5f 62 75 6e 64 6c     #dialog_bundl
1710: 65 64 2e 63 28 64 56 61 72 73 5b 22 69 6d 70 6c  ed.c(dVars["impl
1720: 6e 61 6d 65 22 5d 2c 20 6c 4c 69 6e 65 4f 70 74  name"], lLineOpt
1730: 69 6f 6e 73 2c 20 68 5a 69 70 2c 20 64 56 61 72  ions, hZip, dVar
1740: 73 5b 22 6c 61 6e 67 22 5d 29 0a 0a 20 20 20 20  s["lang"])..    
1750: 23 20 6f 70 74 69 6f 6e 73 20 64 69 61 6c 6f 67  # options dialog
1760: 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 73  .    hZip.writes
1770: 74 72 28 22 70 79 74 68 6f 6e 70 61 74 68 2f 4f  tr("pythonpath/O
1780: 70 74 69 6f 6e 73 2e 70 79 22 2c 20 66 69 6c 65  ptions.py", file
1790: 46 69 6c 65 28 22 67 63 5f 63 6f 72 65 2f 70 79  File("gc_core/py
17a0: 2f 6f 78 74 2f 4f 70 74 69 6f 6e 73 2e 70 79 22  /oxt/Options.py"
17b0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
17c0: 69 70 2e 77 72 69 74 65 28 22 67 63 5f 63 6f 72  ip.write("gc_cor
17d0: 65 2f 70 79 2f 6f 78 74 2f 6f 70 5f 73 74 72 69  e/py/oxt/op_stri
17e0: 6e 67 73 2e 70 79 22 2c 20 22 70 79 74 68 6f 6e  ngs.py", "python
17f0: 70 61 74 68 2f 6f 70 5f 73 74 72 69 6e 67 73 2e  path/op_strings.
1800: 70 79 22 29 0a 20 20 20 20 23 20 6f 70 74 69 6f  py").    # optio
1810: 6e 73 20 64 69 61 6c 6f 67 20 77 69 74 68 69 6e  ns dialog within
1820: 20 57 72 69 74 65 72 20 6f 70 74 69 6f 6e 73 20   Writer options 
1830: 70 61 6e 65 6c 0a 20 20 20 20 64 56 61 72 73 5b  panel.    dVars[
1840: 22 78 64 6c 5f 64 69 61 6c 6f 67 5f 6f 70 74 69  "xdl_dialog_opti
1850: 6f 6e 73 22 5d 20 3d 20 63 72 65 61 74 65 44 69  ons"] = createDi
1860: 61 6c 6f 67 4f 70 74 69 6f 6e 73 58 44 4c 28 64  alogOptionsXDL(d
1870: 56 61 72 73 29 0a 20 20 20 20 64 56 61 72 73 5b  Vars).    dVars[
1880: 22 78 63 73 5f 6f 70 74 69 6f 6e 73 22 5d 20 3d  "xcs_options"] =
1890: 20 22 5c 6e 22 2e 6a 6f 69 6e 28 5b 20 27 3c 70   "\n".join([ '<p
18a0: 72 6f 70 20 6f 6f 72 3a 6e 61 6d 65 3d 22 27 2b  rop oor:name="'+
18b0: 73 4f 70 74 2b 27 22 20 6f 6f 72 3a 74 79 70 65  sOpt+'" oor:type
18c0: 3d 22 78 73 3a 73 74 72 69 6e 67 22 3e 3c 76 61  ="xs:string"><va
18d0: 6c 75 65 3e 3c 2f 76 61 6c 75 65 3e 3c 2f 70 72  lue></value></pr
18e0: 6f 70 3e 27 20 66 6f 72 20 73 4f 70 74 20 69 6e  op>' for sOpt in
18f0: 20 64 56 61 72 73 5b 22 64 4f 70 74 50 79 74 68   dVars["dOptPyth
1900: 6f 6e 22 5d 20 5d 29 0a 20 20 20 20 64 56 61 72  on"] ]).    dVar
1910: 73 5b 22 78 63 75 5f 6c 61 62 65 6c 5f 76 61 6c  s["xcu_label_val
1920: 75 65 73 22 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69  ues"] = "\n".joi
1930: 6e 28 5b 20 27 3c 76 61 6c 75 65 20 78 6d 6c 3a  n([ '<value xml:
1940: 6c 61 6e 67 3d 22 27 2b 73 4c 61 6e 67 2b 27 22  lang="'+sLang+'"
1950: 3e 27 20 2b 20 64 56 61 72 73 5b 22 64 4f 70 74  >' + dVars["dOpt
1960: 4c 61 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d 5b 22  Label"][sLang]["
1970: 5f 5f 6f 70 74 69 6f 6e 74 69 74 6c 65 5f 5f 22  __optiontitle__"
1980: 5d 20 2b 20 27 3c 2f 76 61 6c 75 65 3e 27 20 20  ] + '</value>'  
1990: 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20 64 56 61  for sLang in dVa
19a0: 72 73 5b 22 64 4f 70 74 4c 61 62 65 6c 22 5d 20  rs["dOptLabel"] 
19b0: 5d 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74  ]).    hZip.writ
19c0: 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 6f 70 74  estr("dialog/opt
19d0: 69 6f 6e 73 5f 70 61 67 65 2e 78 64 6c 22 2c 20  ions_page.xdl", 
19e0: 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63 6f 72  fileFile("gc_cor
19f0: 65 2f 70 79 2f 6f 78 74 2f 6f 70 74 69 6f 6e 73  e/py/oxt/options
1a00: 5f 70 61 67 65 2e 78 64 6c 22 2c 20 64 56 61 72  _page.xdl", dVar
1a10: 73 29 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  s)).    hZip.wri
1a20: 74 65 73 74 72 28 22 64 69 61 6c 6f 67 2f 4f 70  testr("dialog/Op
1a30: 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 73 22  tionsDialog.xcs"
1a40: 2c 20 66 69 6c 65 46 69 6c 65 28 22 67 63 5f 63  , fileFile("gc_c
1a50: 6f 72 65 2f 70 79 2f 6f 78 74 2f 4f 70 74 69 6f  ore/py/oxt/Optio
1a60: 6e 73 44 69 61 6c 6f 67 2e 78 63 73 22 2c 20 64  nsDialog.xcs", d
1a70: 56 61 72 73 29 29 0a 20 20 20 20 68 5a 69 70 2e  Vars)).    hZip.
1a80: 77 72 69 74 65 73 74 72 28 22 64 69 61 6c 6f 67  writestr("dialog
1a90: 2f 4f 70 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78  /OptionsDialog.x
1aa0: 63 75 22 2c 20 66 69 6c 65 46 69 6c 65 28 22 67  cu", fileFile("g
1ab0: 63 5f 63 6f 72 65 2f 70 79 2f 6f 78 74 2f 4f 70  c_core/py/oxt/Op
1ac0: 74 69 6f 6e 73 44 69 61 6c 6f 67 2e 78 63 75 22  tionsDialog.xcu"
1ad0: 2c 20 64 56 61 72 73 29 29 0a 20 20 20 20 68 5a  , dVars)).    hZ
1ae0: 69 70 2e 77 72 69 74 65 73 74 72 28 22 64 69 61  ip.writestr("dia
1af0: 6c 6f 67 2f 22 20 2b 20 64 56 61 72 73 5b 27 6c  log/" + dVars['l
1b00: 61 6e 67 27 5d 20 2b 20 22 5f 65 6e 2e 64 65 66  ang'] + "_en.def
1b10: 61 75 6c 74 22 2c 20 22 22 29 0a 20 20 20 20 66  ault", "").    f
1b20: 6f 72 20 73 4c 61 6e 67 4c 62 6c 2c 20 64 4f 70  or sLangLbl, dOp
1b30: 74 4c 62 6c 20 69 6e 20 64 56 61 72 73 5b 27 64  tLbl in dVars['d
1b40: 4f 70 74 4c 61 62 65 6c 27 5d 2e 69 74 65 6d 73  OptLabel'].items
1b50: 28 29 3a 0a 20 20 20 20 20 20 20 20 68 5a 69 70  ():.        hZip
1b60: 2e 77 72 69 74 65 73 74 72 28 22 64 69 61 6c 6f  .writestr("dialo
1b70: 67 2f 22 20 2b 20 64 56 61 72 73 5b 27 6c 61 6e  g/" + dVars['lan
1b80: 67 27 5d 20 2b 20 22 5f 22 20 2b 20 73 4c 61 6e  g'] + "_" + sLan
1b90: 67 4c 62 6c 20 2b 20 22 2e 70 72 6f 70 65 72 74  gLbl + ".propert
1ba0: 69 65 73 22 2c 20 63 72 65 61 74 65 4f 70 74 69  ies", createOpti
1bb0: 6f 6e 73 4c 61 62 65 6c 50 72 6f 70 65 72 74 69  onsLabelProperti
1bc0: 65 73 28 64 4f 70 74 4c 62 6c 29 29 0a 0a 20 20  es(dOptLbl))..  
1bd0: 20 20 23 23 20 41 44 44 4f 4e 53 20 4f 58 54 0a    ## ADDONS OXT.
1be0: 20 20 20 20 70 72 69 6e 74 28 22 2b 20 4f 58 54      print("+ OXT
1bf0: 3a 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20  : ", end="").   
1c00: 20 66 6f 72 20 73 70 66 53 72 63 2c 20 73 70 66   for spfSrc, spf
1c10: 44 73 74 20 69 6e 20 64 4f 78 74 2e 69 74 65 6d  Dst in dOxt.item
1c20: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 70 72 69  s():.        pri
1c30: 6e 74 28 73 70 66 53 72 63 2c 20 65 6e 64 3d 22  nt(spfSrc, end="
1c40: 2c 20 22 29 0a 20 20 20 20 20 20 20 20 69 66 20  , ").        if 
1c50: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70  os.path.isdir(sp
1c60: 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53 72 63 29  Lang+'/'+spfSrc)
1c70: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  :.            fo
1c80: 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64  r sf in os.listd
1c90: 69 72 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70  ir(spLang+'/'+sp
1ca0: 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20  fSrc):.         
1cb0: 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74         hZip.writ
1cc0: 65 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66  e(spLang+'/'+spf
1cd0: 53 72 63 2b 22 2f 22 2b 73 66 2c 20 73 70 66 44  Src+"/"+sf, spfD
1ce0: 73 74 2b 22 2f 22 2b 73 66 29 0a 20 20 20 20 20  st+"/"+sf).     
1cf0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
1d00: 20 20 20 20 20 69 66 20 73 70 66 53 72 63 2e 65       if spfSrc.e
1d10: 6e 64 73 77 69 74 68 28 28 27 2e 74 78 74 27 2c  ndswith(('.txt',
1d20: 20 27 2e 70 79 27 29 29 3a 0a 20 20 20 20 20 20   '.py')):.      
1d30: 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77            hZip.w
1d40: 72 69 74 65 73 74 72 28 73 70 66 44 73 74 2c 20  ritestr(spfDst, 
1d50: 66 69 6c 65 46 69 6c 65 28 73 70 4c 61 6e 67 2b  fileFile(spLang+
1d60: 27 2f 27 2b 73 70 66 53 72 63 2c 20 64 56 61 72  '/'+spfSrc, dVar
1d70: 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)).            
1d80: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
1d90: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1da0: 28 73 70 4c 61 6e 67 2b 27 2f 27 2b 73 70 66 53  (spLang+'/'+spfS
1db0: 72 63 2c 20 73 70 66 44 73 74 29 0a 20 20 20 20  rc, spfDst).    
1dc0: 70 72 69 6e 74 28 29 0a 20 20 20 20 68 5a 69 70  print().    hZip
1dd0: 2e 63 6c 6f 73 65 28 29 0a 0a 20 20 20 20 23 20  .close()..    # 
1de0: 49 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 69 6e 20  Installation in 
1df0: 57 72 69 74 65 72 20 70 72 6f 66 69 6c 65 0a 20  Writer profile. 
1e00: 20 20 20 69 66 20 62 49 6e 73 74 61 6c 6c 3a 0a     if bInstall:.
1e10: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 3e          print(">
1e20: 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 69 6e   installation in
1e30: 20 57 72 69 74 65 72 22 29 0a 20 20 20 20 20 20   Writer").      
1e40: 20 20 69 66 20 64 56 61 72 73 2e 67 65 74 28 27    if dVars.get('
1e50: 75 6e 6f 70 6b 67 27 2c 20 46 61 6c 73 65 29 3a  unopkg', False):
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
1e70: 20 3d 20 27 22 27 2b 6f 73 2e 70 61 74 68 2e 61   = '"'+os.path.a
1e80: 62 73 70 61 74 68 28 64 56 61 72 73 2e 67 65 74  bspath(dVars.get
1e90: 28 27 75 6e 6f 70 6b 67 27 29 2b 27 22 20 61 64  ('unopkg')+'" ad
1ea0: 64 20 2d 66 20 27 2b 73 70 66 5a 69 70 29 0a 20  d -f '+spfZip). 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1ec0: 28 63 6d 64 29 0a 20 20 20 20 20 20 20 20 20 20  (cmd).          
1ed0: 20 20 23 73 75 62 70 72 6f 63 65 73 73 2e 72 75    #subprocess.ru
1ee0: 6e 28 63 6d 64 29 0a 20 20 20 20 20 20 20 20 20  n(cmd).         
1ef0: 20 20 20 6f 73 2e 73 79 73 74 65 6d 28 63 6d 64     os.system(cmd
1f00: 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a  ).        else:.
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
1f20: 74 28 22 23 20 45 72 72 6f 72 3a 20 70 61 74 68  t("# Error: path
1f30: 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 6f 66   and filename of
1f40: 20 75 6e 6f 70 6b 67 20 6e 6f 74 20 73 65 74 20   unopkg not set 
1f50: 69 6e 20 63 6f 6e 66 69 67 2e 69 6e 69 22 29 0a  in config.ini").
1f60: 0a 0a 64 65 66 20 63 72 65 61 74 65 4f 70 74 69  ..def createOpti
1f70: 6f 6e 73 46 6f 72 46 69 72 65 66 6f 78 20 28 64  onsForFirefox (d
1f80: 56 61 72 73 29 3a 0a 20 20 20 20 73 48 54 4d 4c  Vars):.    sHTML
1f90: 20 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 53   = "".    for sS
1fa0: 65 63 74 69 6f 6e 2c 20 6c 4f 70 74 20 69 6e 20  ection, lOpt in 
1fb0: 64 56 61 72 73 5b 27 6c 53 74 72 75 63 74 4f 70  dVars['lStructOp
1fc0: 74 27 5d 3a 0a 20 20 20 20 20 20 20 20 73 48 54  t']:.        sHT
1fd0: 4d 4c 20 2b 3d 20 27 5c 6e 3c 64 69 76 20 69 64  ML += '\n<div id
1fe0: 3d 22 73 75 62 73 65 63 74 69 6f 6e 5f 27 20 2b  ="subsection_' +
1ff0: 20 73 53 65 63 74 69 6f 6e 20 2b 20 27 22 20 63   sSection + '" c
2000: 6c 61 73 73 3d 22 6f 70 74 5f 73 75 62 73 65 63  lass="opt_subsec
2010: 74 69 6f 6e 22 3e 5c 6e 20 20 3c 68 32 20 64 61  tion">\n  <h2 da
2020: 74 61 2d 6c 31 30 6e 2d 69 64 3d 22 6f 70 74 69  ta-l10n-id="opti
2030: 6f 6e 5f 27 2b 73 53 65 63 74 69 6f 6e 2b 27 22  on_'+sSection+'"
2040: 3e 3c 2f 68 32 3e 5c 6e 27 0a 20 20 20 20 20 20  ></h2>\n'.      
2050: 20 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69    for lLineOpt i
2060: 6e 20 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20  n lOpt:.        
2070: 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20      for sOpt in 
2080: 6c 4c 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20  lLineOpt:.      
2090: 20 20 20 20 20 20 20 20 20 20 73 48 54 4d 4c 20            sHTML 
20a0: 2b 3d 20 27 20 20 3c 70 3e 3c 69 6e 70 75 74 20  += '  <p><input 
20b0: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
20c0: 69 64 3d 22 6f 70 74 69 6f 6e 5f 27 2b 73 4f 70  id="option_'+sOp
20d0: 74 2b 27 22 20 2f 3e 3c 6c 61 62 65 6c 20 69 64  t+'" /><label id
20e0: 3d 22 6f 70 74 69 6f 6e 5f 6c 61 62 65 6c 5f 27  ="option_label_'
20f0: 2b 73 4f 70 74 2b 27 22 20 66 6f 72 3d 22 6f 70  +sOpt+'" for="op
2100: 74 69 6f 6e 5f 27 2b 73 4f 70 74 2b 27 22 20 64  tion_'+sOpt+'" d
2110: 61 74 61 2d 6c 31 30 6e 2d 69 64 3d 22 6f 70 74  ata-l10n-id="opt
2120: 69 6f 6e 5f 27 2b 73 4f 70 74 2b 27 22 3e 3c 2f  ion_'+sOpt+'"></
2130: 6c 61 62 65 6c 3e 3c 2f 70 3e 5c 6e 27 0a 20 20  label></p>\n'.  
2140: 20 20 20 20 20 20 73 48 54 4d 4c 20 2b 3d 20 27        sHTML += '
2150: 3c 2f 64 69 76 3e 5c 6e 27 0a 20 20 20 20 23 20  </div>\n'.    # 
2160: 43 72 65 61 74 69 6e 67 20 74 72 61 6e 73 6c 61  Creating transla
2170: 74 69 6f 6e 20 64 61 74 61 0a 20 20 20 20 64 50  tion data.    dP
2180: 72 6f 70 65 72 74 69 65 73 20 3d 20 7b 7d 0a 20  roperties = {}. 
2190: 20 20 20 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20     for sLang in 
21a0: 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c  dVars['dOptLabel
21b0: 27 5d 2e 6b 65 79 73 28 29 3a 0a 20 20 20 20 20  '].keys():.     
21c0: 20 20 20 64 50 72 6f 70 65 72 74 69 65 73 5b 73     dProperties[s
21d0: 4c 61 6e 67 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69  Lang] = "\n".joi
21e0: 6e 28 20 5b 20 22 6f 70 74 69 6f 6e 5f 22 20 2b  n( [ "option_" +
21f0: 20 73 4f 70 74 20 2b 20 22 20 3d 20 22 20 2b 20   sOpt + " = " + 
2200: 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c  dVars['dOptLabel
2210: 27 5d 5b 73 4c 61 6e 67 5d 5b 73 4f 70 74 5d 5b  '][sLang][sOpt][
2220: 30 5d 2e 72 65 70 6c 61 63 65 28 22 20 5b 21 5d  0].replace(" [!]
2230: 22 2c 20 22 c2 a0 5b 21 5d 22 29 20 20 66 6f 72  ", "..[!]")  for
2240: 20 73 4f 70 74 20 69 6e 20 64 56 61 72 73 5b 27   sOpt in dVars['
2250: 64 4f 70 74 4c 61 62 65 6c 27 5d 5b 73 4c 61 6e  dOptLabel'][sLan
2260: 67 5d 20 5d 20 29 0a 20 20 20 20 72 65 74 75 72  g] ] ).    retur
2270: 6e 20 73 48 54 4d 4c 2c 20 64 50 72 6f 70 65 72  n sHTML, dProper
2280: 74 69 65 73 0a 0a 0a 64 65 66 20 63 72 65 61 74  ties...def creat
2290: 65 46 69 72 65 66 6f 78 45 78 74 65 6e 73 69 6f  eFirefoxExtensio
22a0: 6e 20 28 73 4c 61 6e 67 2c 20 64 56 61 72 73 29  n (sLang, dVars)
22b0: 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 65 78  :.    "create ex
22c0: 74 65 6e 73 69 6f 6e 20 66 6f 72 20 46 69 72 65  tension for Fire
22d0: 66 6f 78 22 0a 20 20 20 20 70 72 69 6e 74 28 22  fox".    print("
22e0: 42 75 69 6c 64 69 6e 67 20 65 78 74 65 6e 73 69  Building extensi
22f0: 6f 6e 20 66 6f 72 20 46 69 72 65 66 6f 78 22 29  on for Firefox")
2300: 0a 20 20 20 20 63 72 65 61 74 65 43 6c 65 61 6e  .    createClean
2310: 46 6f 6c 64 65 72 28 22 5f 62 75 69 6c 64 2f 78  Folder("_build/x
2320: 70 69 2f 22 2b 73 4c 61 6e 67 29 0a 20 20 20 20  pi/"+sLang).    
2330: 64 69 72 5f 75 74 69 6c 2e 63 6f 70 79 5f 74 72  dir_util.copy_tr
2340: 65 65 28 22 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c  ee("gc_lang/"+sL
2350: 61 6e 67 2b 22 2f 78 70 69 2f 22 2c 20 22 5f 62  ang+"/xpi/", "_b
2360: 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67  uild/xpi/"+sLang
2370: 29 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 63  ).    dir_util.c
2380: 6f 70 79 5f 74 72 65 65 28 22 67 72 61 6d 6d 61  opy_tree("gramma
2390: 6c 65 63 74 65 2d 6a 73 22 2c 20 22 5f 62 75 69  lecte-js", "_bui
23a0: 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67 2b 22  ld/xpi/"+sLang+"
23b0: 2f 67 72 61 6d 6d 61 6c 65 63 74 65 22 29 0a 20  /grammalecte"). 
23c0: 20 20 20 73 48 54 4d 4c 2c 20 64 50 72 6f 70 65     sHTML, dPrope
23d0: 72 74 69 65 73 20 3d 20 63 72 65 61 74 65 4f 70  rties = createOp
23e0: 74 69 6f 6e 73 46 6f 72 46 69 72 65 66 6f 78 28  tionsForFirefox(
23f0: 64 56 61 72 73 29 0a 20 20 20 20 64 56 61 72 73  dVars).    dVars
2400: 5b 27 6f 70 74 69 6f 6e 73 48 54 4d 4c 27 5d 20  ['optionsHTML'] 
2410: 3d 20 73 48 54 4d 4c 0a 20 20 20 20 63 6f 70 79  = sHTML.    copy
2420: 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28  AndFileTemplate(
2430: 22 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c  "_build/xpi/"+sL
2440: 61 6e 67 2b 22 2f 64 61 74 61 2f 61 62 6f 75 74  ang+"/data/about
2450: 5f 70 61 6e 65 6c 2e 68 74 6d 6c 22 2c 20 22 5f  _panel.html", "_
2460: 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e  build/xpi/"+sLan
2470: 67 2b 22 2f 64 61 74 61 2f 61 62 6f 75 74 5f 70  g+"/data/about_p
2480: 61 6e 65 6c 2e 68 74 6d 6c 22 2c 20 64 56 61 72  anel.html", dVar
2490: 73 29 0a 20 20 20 20 66 6f 72 20 73 4c 6f 63 61  s).    for sLoca
24a0: 6c 65 20 69 6e 20 64 50 72 6f 70 65 72 74 69 65  le in dPropertie
24b0: 73 2e 6b 65 79 73 28 29 3a 0a 20 20 20 20 20 20  s.keys():.      
24c0: 20 20 73 70 66 4c 6f 63 61 6c 65 20 3d 20 22 5f    spfLocale = "_
24d0: 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e  build/xpi/"+sLan
24e0: 67 2b 22 2f 6c 6f 63 61 6c 65 2f 22 2b 73 4c 6f  g+"/locale/"+sLo
24f0: 63 61 6c 65 2b 22 2e 70 72 6f 70 65 72 74 69 65  cale+".propertie
2500: 73 22 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73  s".        if os
2510: 2e 70 61 74 68 2e 65 78 69 73 74 73 28 73 70 66  .path.exists(spf
2520: 4c 6f 63 61 6c 65 29 3a 0a 20 20 20 20 20 20 20  Locale):.       
2530: 20 20 20 20 20 63 6f 70 79 41 6e 64 46 69 6c 65       copyAndFile
2540: 54 65 6d 70 6c 61 74 65 28 73 70 66 4c 6f 63 61  Template(spfLoca
2550: 6c 65 2c 20 73 70 66 4c 6f 63 61 6c 65 2c 20 64  le, spfLocale, d
2560: 50 72 6f 70 65 72 74 69 65 73 29 0a 20 20 20 20  Properties).    
2570: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
2580: 20 20 20 20 20 20 70 72 69 6e 74 28 22 4c 6f 63        print("Loc
2590: 61 6c 65 20 66 69 6c 65 20 6e 6f 74 20 66 6f 75  ale file not fou
25a0: 6e 64 3a 20 22 20 2b 20 73 70 66 4c 6f 63 61 6c  nd: " + spfLocal
25b0: 65 29 0a 20 20 20 20 77 69 74 68 20 63 64 28 22  e).    with cd("
25c0: 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61  _build/xpi/"+sLa
25d0: 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e  ng):.        os.
25e0: 73 79 73 74 65 6d 28 22 6a 70 6d 20 78 70 69 22  system("jpm xpi"
25f0: 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 4f 70  )...def createOp
2600: 74 69 6f 6e 73 46 6f 72 54 68 75 6e 64 65 72 62  tionsForThunderb
2610: 69 72 64 20 28 64 56 61 72 73 29 3a 0a 20 20 20  ird (dVars):.   
2620: 20 64 56 61 72 73 5b 27 73 58 55 4c 54 61 62 73   dVars['sXULTabs
2630: 27 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61 72  '] = "".    dVar
2640: 73 5b 27 73 58 55 4c 54 61 62 50 61 6e 65 6c 73  s['sXULTabPanels
2650: 27 5d 20 3d 20 22 22 0a 20 20 20 20 23 20 64 69  '] = "".    # di
2660: 61 6c 6f 67 20 6f 70 74 69 6f 6e 73 0a 20 20 20  alog options.   
2670: 20 66 6f 72 20 73 53 65 63 74 69 6f 6e 2c 20 6c   for sSection, l
2680: 4f 70 74 20 69 6e 20 64 56 61 72 73 5b 27 6c 53  Opt in dVars['lS
2690: 74 72 75 63 74 4f 70 74 27 5d 3a 0a 20 20 20 20  tructOpt']:.    
26a0: 20 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c 54      dVars['sXULT
26b0: 61 62 73 27 5d 20 2b 3d 20 27 20 20 20 20 3c 74  abs'] += '    <t
26c0: 61 62 20 6c 61 62 65 6c 3d 22 26 6f 70 74 69 6f  ab label="&optio
26d0: 6e 2e 6c 61 62 65 6c 2e 27 2b 73 53 65 63 74 69  n.label.'+sSecti
26e0: 6f 6e 2b 27 3b 22 2f 3e 5c 6e 27 0a 20 20 20 20  on+';"/>\n'.    
26f0: 20 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c 54      dVars['sXULT
2700: 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d 20 27 20  abPanels'] += ' 
2710: 20 20 20 3c 74 61 62 70 61 6e 65 6c 20 6f 72 69     <tabpanel ori
2720: 65 6e 74 3d 22 76 65 72 74 69 63 61 6c 22 3e 5c  ent="vertical">\
2730: 6e 20 20 20 20 20 20 3c 6c 61 62 65 6c 20 63 6c  n      <label cl
2740: 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 20 76 61  ass="section" va
2750: 6c 75 65 3d 22 26 6f 70 74 69 6f 6e 2e 6c 61 62  lue="&option.lab
2760: 65 6c 2e 27 2b 73 53 65 63 74 69 6f 6e 2b 27 3b  el.'+sSection+';
2770: 22 20 2f 3e 5c 6e 27 0a 20 20 20 20 20 20 20 20  " />\n'.        
2780: 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69 6e 20  for lLineOpt in 
2790: 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20 20 20  lOpt:.          
27a0: 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c 4c    for sOpt in lL
27b0: 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20 20 20  ineOpt:.        
27c0: 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 27 73          dVars['s
27d0: 58 55 4c 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b  XULTabPanels'] +
27e0: 3d 20 27 20 20 20 20 20 20 3c 63 68 65 63 6b 62  = '      <checkb
27f0: 6f 78 20 69 64 3d 22 6f 70 74 69 6f 6e 5f 27 2b  ox id="option_'+
2800: 73 4f 70 74 2b 27 22 20 63 6c 61 73 73 3d 22 6f  sOpt+'" class="o
2810: 70 74 69 6f 6e 22 20 6c 61 62 65 6c 3d 22 26 6f  ption" label="&o
2820: 70 74 69 6f 6e 2e 6c 61 62 65 6c 2e 27 2b 73 4f  ption.label.'+sO
2830: 70 74 2b 27 3b 22 20 2f 3e 5c 6e 27 0a 20 20 20  pt+';" />\n'.   
2840: 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c       dVars['sXUL
2850: 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d 20 27  TabPanels'] += '
2860: 20 20 20 20 3c 2f 74 61 62 70 61 6e 65 6c 3e 5c      </tabpanel>\
2870: 6e 27 0a 20 20 20 20 23 20 74 72 61 6e 73 6c 61  n'.    # transla
2880: 74 69 6f 6e 20 64 61 74 61 0a 20 20 20 20 66 6f  tion data.    fo
2890: 72 20 73 4c 61 6e 67 20 69 6e 20 64 56 61 72 73  r sLang in dVars
28a0: 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d 2e 6b 65  ['dOptLabel'].ke
28b0: 79 73 28 29 3a 0a 20 20 20 20 20 20 20 20 64 56  ys():.        dV
28c0: 61 72 73 5b 27 67 63 5f 6f 70 74 69 6f 6e 73 5f  ars['gc_options_
28d0: 6c 61 62 65 6c 73 5f 27 2b 73 4c 61 6e 67 5d 20  labels_'+sLang] 
28e0: 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 20 5b 20 22  = "\n".join( [ "
28f0: 3c 21 45 4e 54 49 54 59 20 6f 70 74 69 6f 6e 2e  <!ENTITY option.
2900: 6c 61 62 65 6c 2e 22 20 2b 20 73 4f 70 74 20 2b  label." + sOpt +
2910: 20 27 20 22 27 20 2b 20 64 56 61 72 73 5b 27 64   ' "' + dVars['d
2920: 4f 70 74 4c 61 62 65 6c 27 5d 5b 73 4c 61 6e 67  OptLabel'][sLang
2930: 5d 5b 73 4f 70 74 5d 5b 30 5d 20 2b 20 27 22 3e  ][sOpt][0] + '">
2940: 27 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 64  '  for sOpt in d
2950: 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27  Vars['dOptLabel'
2960: 5d 5b 73 4c 61 6e 67 5d 20 5d 20 29 0a 20 20 20  ][sLang] ] ).   
2970: 20 72 65 74 75 72 6e 20 64 56 61 72 73 0a 0a 0a   return dVars...
2980: 64 65 66 20 63 72 65 61 74 65 54 68 75 6e 64 65  def createThunde
2990: 72 62 69 72 64 45 78 74 65 6e 73 69 6f 6e 20 28  rbirdExtension (
29a0: 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70  sLang, dVars, sp
29b0: 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20 20 20 22  LangPack):.    "
29c0: 63 72 65 61 74 65 20 65 78 74 65 6e 73 69 6f 6e  create extension
29d0: 20 66 6f 72 20 54 68 75 6e 64 65 72 62 69 72 64   for Thunderbird
29e0: 22 0a 20 20 20 20 70 72 69 6e 74 28 22 42 75 69  ".    print("Bui
29f0: 6c 64 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 20  lding extension 
2a00: 66 6f 72 20 54 68 75 6e 64 65 72 62 69 72 64 22  for Thunderbird"
2a10: 29 0a 20 20 20 20 73 45 78 74 65 6e 73 69 6f 6e  ).    sExtension
2a20: 4e 61 6d 65 20 3d 20 64 56 61 72 73 5b 27 74 62  Name = dVars['tb
2a30: 5f 69 64 65 6e 74 69 66 69 65 72 27 5d 20 2b 20  _identifier'] + 
2a40: 22 2d 76 22 20 2b 20 64 56 61 72 73 5b 27 76 65  "-v" + dVars['ve
2a50: 72 73 69 6f 6e 27 5d 20 2b 20 27 2e 78 70 69 27  rsion'] + '.xpi'
2a60: 0a 20 20 20 20 73 70 66 5a 69 70 20 3d 20 22 5f  .    spfZip = "_
2a70: 62 75 69 6c 64 2f 22 20 2b 20 73 45 78 74 65 6e  build/" + sExten
2a80: 73 69 6f 6e 4e 61 6d 65 0a 20 20 20 20 68 5a 69  sionName.    hZi
2a90: 70 20 3d 20 7a 69 70 66 69 6c 65 2e 5a 69 70 46  p = zipfile.ZipF
2aa0: 69 6c 65 28 73 70 66 5a 69 70 2c 20 6d 6f 64 65  ile(spfZip, mode
2ab0: 3d 27 77 27 2c 20 63 6f 6d 70 72 65 73 73 69 6f  ='w', compressio
2ac0: 6e 3d 7a 69 70 66 69 6c 65 2e 5a 49 50 5f 44 45  n=zipfile.ZIP_DE
2ad0: 46 4c 41 54 45 44 29 0a 20 20 20 20 63 6f 70 79  FLATED).    copy
2ae0: 47 72 61 6d 6d 61 6c 65 63 74 65 4a 53 50 61 63  GrammalecteJSPac
2af0: 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65 28 68 5a  kageInZipFile(hZ
2b00: 69 70 2c 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20  ip, spLangPack, 
2b10: 64 56 61 72 73 5b 27 6a 73 5f 62 69 6e 61 72 79  dVars['js_binary
2b20: 5f 64 69 63 27 5d 29 0a 20 20 20 20 66 6f 72 20  _dic']).    for 
2b30: 73 70 66 20 69 6e 20 5b 22 4c 49 43 45 4e 53 45  spf in ["LICENSE
2b40: 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45 2e  .txt", "LICENSE.
2b50: 66 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20 20 20  fr.txt"]:.      
2b60: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66    hZip.write(spf
2b70: 29 0a 20 20 20 20 64 56 61 72 73 20 3d 20 63 72  ).    dVars = cr
2b80: 65 61 74 65 4f 70 74 69 6f 6e 73 46 6f 72 54 68  eateOptionsForTh
2b90: 75 6e 64 65 72 62 69 72 64 28 64 56 61 72 73 29  underbird(dVars)
2ba0: 0a 20 20 20 20 61 64 64 46 6f 6c 64 65 72 54 6f  .    addFolderTo
2bb0: 5a 69 70 41 6e 64 46 69 6c 65 46 69 6c 65 28 68  ZipAndFileFile(h
2bc0: 5a 69 70 2c 20 22 67 63 5f 6c 61 6e 67 2f 22 2b  Zip, "gc_lang/"+
2bd0: 73 4c 61 6e 67 2b 22 2f 74 62 22 2c 20 22 22 2c  sLang+"/tb", "",
2be0: 20 64 56 61 72 73 2c 20 54 72 75 65 29 0a 20 20   dVars, True).  
2bf0: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 63    hZip.write("gc
2c00: 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f  _lang/"+sLang+"/
2c10: 78 70 69 2f 67 63 65 5f 77 6f 72 6b 65 72 2e 6a  xpi/gce_worker.j
2c20: 73 22 2c 20 22 77 6f 72 6b 65 72 2f 67 63 65 5f  s", "worker/gce_
2c30: 77 6f 72 6b 65 72 2e 6a 73 22 29 0a 20 20 20 20  worker.js").    
2c40: 73 70 44 69 63 74 20 3d 20 22 67 63 5f 6c 61 6e  spDict = "gc_lan
2c50: 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f 78 70 69 2f  g/"+sLang+"/xpi/
2c60: 64 61 74 61 2f 64 69 63 74 69 6f 6e 61 72 69 65  data/dictionarie
2c70: 73 22 0a 20 20 20 20 66 6f 72 20 73 70 20 69 6e  s".    for sp in
2c80: 20 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 44 69   os.listdir(spDi
2c90: 63 74 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20  ct):.        if 
2ca0: 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70  os.path.isdir(sp
2cb0: 44 69 63 74 2b 22 2f 22 2b 73 70 29 3a 0a 20 20  Dict+"/"+sp):.  
2cc0: 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77            hZip.w
2cd0: 72 69 74 65 28 73 70 44 69 63 74 2b 22 2f 22 2b  rite(spDict+"/"+
2ce0: 73 70 2b 22 2f 22 2b 73 70 2b 22 2e 64 69 63 22  sp+"/"+sp+".dic"
2cf0: 2c 20 22 63 6f 6e 74 65 6e 74 2f 64 69 63 74 69  , "content/dicti
2d00: 6f 6e 61 72 69 65 73 2f 22 2b 73 70 2b 22 2f 22  onaries/"+sp+"/"
2d10: 2b 73 70 2b 22 2e 64 69 63 22 29 0a 20 20 20 20  +sp+".dic").    
2d20: 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69          hZip.wri
2d30: 74 65 28 73 70 44 69 63 74 2b 22 2f 22 2b 73 70  te(spDict+"/"+sp
2d40: 2b 22 2f 22 2b 73 70 2b 22 2e 61 66 66 22 2c 20  +"/"+sp+".aff", 
2d50: 22 63 6f 6e 74 65 6e 74 2f 64 69 63 74 69 6f 6e  "content/diction
2d60: 61 72 69 65 73 2f 22 2b 73 70 2b 22 2f 22 2b 73  aries/"+sp+"/"+s
2d70: 70 2b 22 2e 61 66 66 22 29 0a 20 20 20 20 68 5a  p+".aff").    hZ
2d80: 69 70 2e 63 6c 6f 73 65 28 29 0a 20 20 20 20 75  ip.close().    u
2d90: 6e 7a 69 70 28 73 70 66 5a 69 70 2c 20 64 56 61  nzip(spfZip, dVa
2da0: 72 73 5b 27 74 62 5f 64 65 62 75 67 5f 65 78 74  rs['tb_debug_ext
2db0: 65 6e 73 69 6f 6e 5f 70 61 74 68 27 5d 29 0a 0a  ension_path'])..
2dc0: 0a 64 65 66 20 63 72 65 61 74 65 53 65 72 76 65  .def createServe
2dd0: 72 4f 70 74 69 6f 6e 73 20 28 73 4c 61 6e 67 2c  rOptions (sLang,
2de0: 20 64 4f 70 74 44 61 74 61 29 3a 0a 20 20 20 20   dOptData):.    
2df0: 77 69 74 68 20 6f 70 65 6e 28 22 73 65 72 76 65  with open("serve
2e00: 72 5f 6f 70 74 69 6f 6e 73 2e 22 2b 73 4c 61 6e  r_options."+sLan
2e10: 67 2b 22 2e 69 6e 69 22 2c 20 22 77 22 2c 20 65  g+".ini", "w", e
2e20: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c  ncoding="utf-8",
2e30: 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 20 61   newline="\n") a
2e40: 73 20 68 44 73 74 3a 0a 20 20 20 20 20 20 20 20  s hDst:.        
2e50: 68 44 73 74 2e 77 72 69 74 65 28 22 23 20 53 65  hDst.write("# Se
2e60: 72 76 65 72 20 6f 70 74 69 6f 6e 73 2e 20 4c 61  rver options. La
2e70: 6e 67 3a 20 22 20 2b 20 73 4c 61 6e 67 20 2b 20  ng: " + sLang + 
2e80: 22 5c 6e 5c 6e 5b 67 63 5f 6f 70 74 69 6f 6e 73  "\n\n[gc_options
2e90: 5d 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 66 6f  ]\n").        fo
2ea0: 72 20 73 53 65 63 74 69 6f 6e 2c 20 6c 4f 70 74  r sSection, lOpt
2eb0: 20 69 6e 20 64 4f 70 74 44 61 74 61 5b 22 6c 53   in dOptData["lS
2ec0: 74 72 75 63 74 4f 70 74 22 5d 3a 0a 20 20 20 20  tructOpt"]:.    
2ed0: 20 20 20 20 20 20 20 20 68 44 73 74 2e 77 72 69          hDst.wri
2ee0: 74 65 28 22 5c 6e 23 23 23 23 23 23 23 23 23 23  te("\n##########
2ef0: 20 22 20 2b 20 64 4f 70 74 44 61 74 61 5b 22 64   " + dOptData["d
2f00: 4f 70 74 4c 61 62 65 6c 22 5d 5b 73 4c 61 6e 67  OptLabel"][sLang
2f10: 5d 2e 67 65 74 28 73 53 65 63 74 69 6f 6e 2c 20  ].get(sSection, 
2f20: 73 53 65 63 74 69 6f 6e 20 2b 20 22 5b 6e 6f 20  sSection + "[no 
2f30: 6c 61 62 65 6c 20 66 6f 75 6e 64 5d 22 29 5b 30  label found]")[0
2f40: 5d 20 2b 20 22 20 23 23 23 23 23 23 23 23 23 23  ] + " ##########
2f50: 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  \n").           
2f60: 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69 6e   for lLineOpt in
2f70: 20 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20 20   lOpt:.         
2f80: 20 20 20 20 20 20 20 66 6f 72 20 73 4f 70 74 20         for sOpt 
2f90: 69 6e 20 6c 4c 69 6e 65 4f 70 74 3a 0a 20 20 20  in lLineOpt:.   
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 68 44 73 74 2e 77 72 69 74 65 28 22 23 20 22   hDst.write("# "
2fc0: 20 2b 20 64 4f 70 74 44 61 74 61 5b 22 64 4f 70   + dOptData["dOp
2fd0: 74 4c 61 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d 2e  tLabel"][sLang].
2fe0: 67 65 74 28 73 4f 70 74 2c 20 22 5b 6e 6f 20 6c  get(sOpt, "[no l
2ff0: 61 62 65 6c 20 66 6f 75 6e 64 5d 22 29 5b 30 5d  abel found]")[0]
3000: 20 2b 20 22 5c 6e 22 29 0a 20 20 20 20 20 20 20   + "\n").       
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 44 73               hDs
3020: 74 2e 77 72 69 74 65 28 73 4f 70 74 20 2b 20 22  t.write(sOpt + "
3030: 20 3d 20 22 20 2b 20 28 22 31 22 20 69 66 20 64   = " + ("1" if d
3040: 4f 70 74 44 61 74 61 5b 22 64 4f 70 74 50 79 74  OptData["dOptPyt
3050: 68 6f 6e 22 5d 2e 67 65 74 28 73 4f 70 74 2c 20  hon"].get(sOpt, 
3060: 4e 6f 6e 65 29 20 65 6c 73 65 20 22 30 22 29 20  None) else "0") 
3070: 2b 20 22 5c 6e 22 29 0a 20 20 20 20 20 20 20 20  + "\n").        
3080: 68 44 73 74 2e 77 72 69 74 65 28 22 68 74 6d 6c  hDst.write("html
3090: 20 3d 20 31 5c 6e 22 29 0a 0a 0a 64 65 66 20 63   = 1\n")...def c
30a0: 72 65 61 74 65 53 65 72 76 65 72 5a 69 70 20 28  reateServerZip (
30b0: 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70  sLang, dVars, sp
30c0: 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20 20 20 22  LangPack):.    "
30d0: 63 72 65 61 74 65 20 73 65 72 76 65 72 20 7a 69  create server zi
30e0: 70 22 0a 20 20 20 20 73 70 66 5a 69 70 20 3d 20  p".    spfZip = 
30f0: 22 5f 62 75 69 6c 64 2f 22 20 2b 20 64 56 61 72  "_build/" + dVar
3100: 73 5b 27 6e 61 6d 65 27 5d 20 2b 20 22 2d 22 2b  s['name'] + "-"+
3110: 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 20 2b   dVars['lang'] +
3120: 22 2d 76 22 20 2b 20 64 56 61 72 73 5b 27 76 65  "-v" + dVars['ve
3130: 72 73 69 6f 6e 27 5d 20 2b 20 27 2e 7a 69 70 27  rsion'] + '.zip'
3140: 0a 20 20 20 20 68 5a 69 70 20 3d 20 7a 69 70 66  .    hZip = zipf
3150: 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a  ile.ZipFile(spfZ
3160: 69 70 2c 20 6d 6f 64 65 3d 27 77 27 2c 20 63 6f  ip, mode='w', co
3170: 6d 70 72 65 73 73 69 6f 6e 3d 7a 69 70 66 69 6c  mpression=zipfil
3180: 65 2e 5a 49 50 5f 44 45 46 4c 41 54 45 44 29 0a  e.ZIP_DEFLATED).
3190: 20 20 20 20 63 6f 70 79 47 72 61 6d 6d 61 6c 65      copyGrammale
31a0: 63 74 65 50 79 50 61 63 6b 61 67 65 49 6e 5a 69  ctePyPackageInZi
31b0: 70 46 69 6c 65 28 68 5a 69 70 2c 20 73 70 4c 61  pFile(hZip, spLa
31c0: 6e 67 50 61 63 6b 2c 20 64 56 61 72 73 5b 27 70  ngPack, dVars['p
31d0: 79 5f 62 69 6e 61 72 79 5f 64 69 63 27 5d 29 0a  y_binary_dic']).
31e0: 20 20 20 20 66 6f 72 20 73 70 66 20 69 6e 20 5b      for spf in [
31f0: 22 63 6c 69 2e 70 79 22 2c 20 22 73 65 72 76 65  "cli.py", "serve
3200: 72 2e 70 79 22 2c 20 22 62 6f 74 74 6c 65 2e 70  r.py", "bottle.p
3210: 79 22 2c 20 22 73 65 72 76 65 72 5f 6f 70 74 69  y", "server_opti
3220: 6f 6e 73 2e 5f 67 6c 6f 62 61 6c 2e 69 6e 69 22  ons._global.ini"
3230: 2c 20 22 73 65 72 76 65 72 5f 6f 70 74 69 6f 6e  , "server_option
3240: 73 2e 22 2b 73 4c 61 6e 67 2b 22 2e 69 6e 69 22  s."+sLang+".ini"
3250: 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  , \.            
3260: 20 20 20 20 22 52 45 41 44 4d 45 2e 74 78 74 22      "README.txt"
3270: 2c 20 22 4c 49 43 45 4e 53 45 2e 74 78 74 22 2c  , "LICENSE.txt",
3280: 20 22 4c 49 43 45 4e 53 45 2e 66 72 2e 74 78 74   "LICENSE.fr.txt
3290: 22 5d 3a 0a 20 20 20 20 20 20 20 20 68 5a 69 70  "]:.        hZip
32a0: 2e 77 72 69 74 65 28 73 70 66 29 0a 20 20 20 20  .write(spf).    
32b0: 68 5a 69 70 2e 77 72 69 74 65 73 74 72 28 22 73  hZip.writestr("s
32c0: 65 74 75 70 2e 70 79 22 2c 20 66 69 6c 65 46 69  etup.py", fileFi
32d0: 6c 65 28 22 67 63 5f 6c 61 6e 67 2f 66 72 2f 73  le("gc_lang/fr/s
32e0: 65 74 75 70 2e 70 79 22 2c 20 64 56 61 72 73 29  etup.py", dVars)
32f0: 29 0a 0a 0a 64 65 66 20 63 6f 70 79 47 72 61 6d  )...def copyGram
3300: 6d 61 6c 65 63 74 65 50 79 50 61 63 6b 61 67 65  malectePyPackage
3310: 49 6e 5a 69 70 46 69 6c 65 20 28 68 5a 69 70 2c  InZipFile (hZip,
3320: 20 73 70 4c 61 6e 67 50 61 63 6b 2c 20 73 44 69   spLangPack, sDi
3330: 63 4e 61 6d 65 2c 20 73 41 64 64 50 61 74 68 3d  cName, sAddPath=
3340: 22 22 29 3a 0a 20 20 20 20 66 6f 72 20 73 66 20  ""):.    for sf 
3350: 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67  in os.listdir("g
3360: 72 61 6d 6d 61 6c 65 63 74 65 22 29 3a 0a 20 20  rammalecte"):.  
3370: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e        if not os.
3380: 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61 6d  path.isdir("gram
3390: 6d 61 6c 65 63 74 65 2f 22 2b 73 66 29 3a 0a 20  malecte/"+sf):. 
33a0: 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e             hZip.
33b0: 77 72 69 74 65 28 22 67 72 61 6d 6d 61 6c 65 63  write("grammalec
33c0: 74 65 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74  te/"+sf, sAddPat
33d0: 68 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22  h+"grammalecte/"
33e0: 2b 73 66 29 0a 20 20 20 20 66 6f 72 20 73 66 20  +sf).    for sf 
33f0: 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 73 70  in os.listdir(sp
3400: 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20 20 20 20  LangPack):.     
3410: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
3420: 68 2e 69 73 64 69 72 28 73 70 4c 61 6e 67 50 61  h.isdir(spLangPa
3430: 63 6b 2b 22 2f 22 2b 73 66 29 3a 0a 20 20 20 20  ck+"/"+sf):.    
3440: 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69          hZip.wri
3450: 74 65 28 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f  te(spLangPack+"/
3460: 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b 73  "+sf, sAddPath+s
3470: 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66  pLangPack+"/"+sf
3480: 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65  ).    hZip.write
3490: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 5f 64  ("grammalecte/_d
34a0: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73 44  ictionaries/"+sD
34b0: 69 63 4e 61 6d 65 2c 20 73 41 64 64 50 61 74 68  icName, sAddPath
34c0: 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 5f 64  +"grammalecte/_d
34d0: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73 44  ictionaries/"+sD
34e0: 69 63 4e 61 6d 65 29 0a 0a 0a 64 65 66 20 63 6f  icName)...def co
34f0: 70 79 47 72 61 6d 6d 61 6c 65 63 74 65 4a 53 50  pyGrammalecteJSP
3500: 61 63 6b 61 67 65 49 6e 5a 69 70 46 69 6c 65 20  ackageInZipFile 
3510: 28 68 5a 69 70 2c 20 73 70 4c 61 6e 67 50 61 63  (hZip, spLangPac
3520: 6b 2c 20 73 44 69 63 4e 61 6d 65 2c 20 73 41 64  k, sDicName, sAd
3530: 64 50 61 74 68 3d 22 22 29 3a 0a 20 20 20 20 66  dPath=""):.    f
3540: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
3550: 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  dir("grammalecte
3560: 2d 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69  -js"):.        i
3570: 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73  f not os.path.is
3580: 64 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  dir("grammalecte
3590: 2d 6a 73 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20  -js/"+sf):.     
35a0: 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74         hZip.writ
35b0: 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a  e("grammalecte-j
35c0: 73 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68  s/"+sf, sAddPath
35d0: 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73  +"grammalecte-js
35e0: 2f 22 2b 73 66 29 0a 20 20 20 20 66 6f 72 20 73  /"+sf).    for s
35f0: 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28  f in os.listdir(
3600: 73 70 4c 61 6e 67 50 61 63 6b 29 3a 0a 20 20 20  spLangPack):.   
3610: 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70       if not os.p
3620: 61 74 68 2e 69 73 64 69 72 28 73 70 4c 61 6e 67  ath.isdir(spLang
3630: 50 61 63 6b 2b 22 2f 22 2b 73 66 29 3a 0a 20 20  Pack+"/"+sf):.  
3640: 20 20 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77            hZip.w
3650: 72 69 74 65 28 73 70 4c 61 6e 67 50 61 63 6b 2b  rite(spLangPack+
3660: 22 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68  "/"+sf, sAddPath
3670: 2b 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b  +spLangPack+"/"+
3680: 73 66 29 0a 20 20 20 20 68 5a 69 70 2e 77 72 69  sf).    hZip.wri
3690: 74 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  te("grammalecte-
36a0: 6a 73 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73  js/_dictionaries
36b0: 2f 22 2b 73 44 69 63 4e 61 6d 65 2c 20 73 41 64  /"+sDicName, sAd
36c0: 64 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63  dPath+"grammalec
36d0: 74 65 2d 6a 73 2f 5f 64 69 63 74 69 6f 6e 61 72  te-js/_dictionar
36e0: 69 65 73 2f 22 2b 73 44 69 63 4e 61 6d 65 29 0a  ies/"+sDicName).
36f0: 0a 0a 64 65 66 20 63 72 65 61 74 65 20 28 73 4c  ..def create (sL
3700: 61 6e 67 2c 20 78 43 6f 6e 66 69 67 2c 20 62 49  ang, xConfig, bI
3710: 6e 73 74 61 6c 6c 4f 58 54 2c 20 62 4a 61 76 61  nstallOXT, bJava
3720: 53 63 72 69 70 74 29 3a 0a 20 20 20 20 6f 4e 6f  Script):.    oNo
3730: 77 20 3d 20 64 61 74 65 74 69 6d 65 2e 64 61 74  w = datetime.dat
3740: 65 74 69 6d 65 2e 6e 6f 77 28 29 0a 20 20 20 20  etime.now().    
3750: 70 72 69 6e 74 28 22 3d 3d 3d 3d 3d 3d 3d 3d 3d  print("=========
3760: 3d 3d 3d 3d 3d 20 4d 41 4b 45 20 47 52 41 4d 4d  ===== MAKE GRAMM
3770: 41 4c 45 43 54 45 20 5b 7b 30 7d 5d 20 61 74 20  ALECTE [{0}] at 
3780: 7b 31 2e 68 6f 75 72 3a 3e 32 7d 20 68 20 7b 31  {1.hour:>2} h {1
3790: 2e 6d 69 6e 75 74 65 3a 3e 32 7d 20 6d 69 6e 20  .minute:>2} min 
37a0: 7b 31 2e 73 65 63 6f 6e 64 3a 3e 32 7d 20 73 20  {1.second:>2} s 
37b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 2e  ==============".
37c0: 66 6f 72 6d 61 74 28 73 4c 61 6e 67 2c 20 6f 4e  format(sLang, oN
37d0: 6f 77 29 29 0a 0a 20 20 20 20 23 23 23 23 20 52  ow))..    #### R
37e0: 45 41 44 20 43 4f 4e 46 49 47 55 52 41 54 49 4f  EAD CONFIGURATIO
37f0: 4e 0a 20 20 20 20 70 72 69 6e 74 28 22 3e 20 72  N.    print("> r
3800: 65 61 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ead configuratio
3810: 6e 2e 2e 2e 22 29 0a 20 20 20 20 73 70 4c 61 6e  n...").    spLan
3820: 67 20 3d 20 22 67 63 5f 6c 61 6e 67 2f 22 20 2b  g = "gc_lang/" +
3830: 20 73 4c 61 6e 67 0a 0a 20 20 20 20 64 56 61 72   sLang..    dVar
3840: 73 20 3d 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63  s = xConfig._sec
3850: 74 69 6f 6e 73 5b 27 61 72 67 73 27 5d 0a 20 20  tions['args'].  
3860: 20 20 64 56 61 72 73 5b 27 6c 6f 63 61 6c 65 73    dVars['locales
3870: 27 5d 20 3d 20 64 56 61 72 73 5b 22 6c 6f 63 61  '] = dVars["loca
3880: 6c 65 73 22 5d 2e 72 65 70 6c 61 63 65 28 22 5f  les"].replace("_
3890: 22 2c 20 22 2d 22 29 0a 20 20 20 20 64 56 61 72  ", "-").    dVar
38a0: 73 5b 27 6c 6f 63 27 5d 20 3d 20 73 74 72 28 64  s['loc'] = str(d
38b0: 69 63 74 28 5b 20 5b 73 2c 20 5b 73 5b 30 3a 32  ict([ [s, [s[0:2
38c0: 5d 2c 20 73 5b 33 3a 35 5d 2c 20 22 22 5d 5d 20  ], s[3:5], ""]] 
38d0: 66 6f 72 20 73 20 69 6e 20 64 56 61 72 73 5b 22  for s in dVars["
38e0: 6c 6f 63 61 6c 65 73 22 5d 2e 73 70 6c 69 74 28  locales"].split(
38f0: 22 20 22 29 20 5d 29 29 0a 0a 20 20 20 20 23 23  " ") ]))..    ##
3900: 20 43 4f 4d 50 49 4c 45 20 52 55 4c 45 53 0a 20   COMPILE RULES. 
3910: 20 20 20 70 72 69 6e 74 28 22 3e 20 72 65 61 64     print("> read
3920: 20 72 75 6c 65 73 20 66 69 6c 65 2e 2e 2e 22 29   rules file...")
3930: 0a 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20  .    try:.      
3940: 20 20 6c 52 75 6c 65 73 20 3d 20 6f 70 65 6e 28    lRules = open(
3950: 73 70 4c 61 6e 67 20 2b 20 22 2f 72 75 6c 65 73  spLang + "/rules
3960: 2e 67 72 78 22 2c 20 27 72 27 2c 20 65 6e 63 6f  .grx", 'r', enco
3970: 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72 65  ding="utf-8").re
3980: 61 64 6c 69 6e 65 73 28 29 0a 20 20 20 20 65 78  adlines().    ex
3990: 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 70 72  cept:.        pr
39a0: 69 6e 74 28 22 52 75 6c 65 73 20 66 69 6c 65 20  int("Rules file 
39b0: 69 6e 20 70 72 6f 6a 65 63 74 20 5b 22 20 2b 20  in project [" + 
39c0: 73 4c 61 6e 67 20 2b 20 22 5d 20 6e 6f 74 20 66  sLang + "] not f
39d0: 6f 75 6e 64 22 29 0a 20 20 20 20 20 20 20 20 72  ound").        r
39e0: 65 74 75 72 6e 0a 20 20 20 20 64 56 61 72 73 2e  eturn.    dVars.
39f0: 75 70 64 61 74 65 28 63 6f 6d 70 69 6c 65 5f 72  update(compile_r
3a00: 75 6c 65 73 2e 6d 61 6b 65 28 6c 52 75 6c 65 73  ules.make(lRules
3a10: 2c 20 64 56 61 72 73 5b 27 6c 61 6e 67 27 5d 2c  , dVars['lang'],
3a20: 20 62 4a 61 76 61 53 63 72 69 70 74 29 29 0a 0a   bJavaScript))..
3a30: 20 20 20 20 23 23 20 52 45 41 44 20 47 52 41 4d      ## READ GRAM
3a40: 4d 41 52 20 43 48 45 43 4b 45 52 20 50 4c 55 47  MAR CHECKER PLUG
3a50: 49 4e 53 0a 20 20 20 20 70 72 69 6e 74 28 22 50  INS.    print("P
3a60: 59 54 48 4f 4e 3a 22 29 0a 20 20 20 20 70 72 69  YTHON:").    pri
3a70: 6e 74 28 22 2b 20 50 6c 75 67 69 6e 73 3a 20 22  nt("+ Plugins: "
3a80: 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 73 43  , end="").    sC
3a90: 6f 64 65 50 6c 75 67 69 6e 73 20 3d 20 22 22 0a  odePlugins = "".
3aa0: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
3ab0: 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b  .listdir(spLang+
3ac0: 22 2f 6d 6f 64 75 6c 65 73 22 29 3a 0a 20 20 20  "/modules"):.   
3ad0: 20 20 20 20 20 69 66 20 72 65 2e 6d 61 74 63 68       if re.match
3ae0: 28 72 22 67 63 65 5f 5c 77 2b 5b 2e 5d 70 79 24  (r"gce_\w+[.]py$
3af0: 22 2c 20 73 66 29 3a 0a 20 20 20 20 20 20 20 20  ", sf):.        
3b00: 20 20 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73      sCodePlugins
3b10: 20 2b 3d 20 22 5c 6e 5c 6e 22 20 2b 20 6f 70 65   += "\n\n" + ope
3b20: 6e 28 73 70 4c 61 6e 67 2b 27 2f 6d 6f 64 75 6c  n(spLang+'/modul
3b30: 65 73 2f 27 2b 73 66 2c 20 22 72 22 2c 20 65 6e  es/'+sf, "r", en
3b40: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e  coding="utf-8").
3b50: 72 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 20  read().         
3b60: 20 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64     print(sf, end
3b70: 3d 22 2c 20 22 29 0a 20 20 20 20 70 72 69 6e 74  =", ").    print
3b80: 28 29 0a 20 20 20 20 64 56 61 72 73 5b 22 70 6c  ().    dVars["pl
3b90: 75 67 69 6e 73 22 5d 20 3d 20 73 43 6f 64 65 50  ugins"] = sCodeP
3ba0: 6c 75 67 69 6e 73 0a 0a 20 20 20 20 23 23 20 43  lugins..    ## C
3bb0: 52 45 41 54 45 20 47 52 41 4d 4d 41 52 20 43 48  REATE GRAMMAR CH
3bc0: 45 43 4b 45 52 20 50 41 43 4b 41 47 45 0a 20 20  ECKER PACKAGE.  
3bd0: 20 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22    spLangPack = "
3be0: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22 2b 73 4c  grammalecte/"+sL
3bf0: 61 6e 67 0a 20 20 20 20 63 72 65 61 74 65 43 6c  ang.    createCl
3c00: 65 61 6e 46 6f 6c 64 65 72 28 73 70 4c 61 6e 67  eanFolder(spLang
3c10: 50 61 63 6b 29 0a 20 20 20 20 66 6f 72 20 73 66  Pack).    for sf
3c20: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22   in os.listdir("
3c30: 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61 6e 67 5f  gc_core/py/lang_
3c40: 63 6f 72 65 22 29 3a 0a 20 20 20 20 20 20 20 20  core"):.        
3c50: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
3c60: 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79  sdir("gc_core/py
3c70: 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 29  /lang_core/"+sf)
3c80: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  :.            co
3c90: 70 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74  pyAndFileTemplat
3ca0: 65 28 22 67 63 5f 63 6f 72 65 2f 70 79 2f 6c 61  e("gc_core/py/la
3cb0: 6e 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73 70  ng_core/"+sf, sp
3cc0: 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c  LangPack+"/"+sf,
3cd0: 20 64 56 61 72 73 29 0a 20 20 20 20 70 72 69 6e   dVars).    prin
3ce0: 74 28 22 2b 20 4d 6f 64 75 6c 65 73 3a 20 22 2c  t("+ Modules: ",
3cf0: 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 66 6f 72   end="").    for
3d00: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
3d10: 72 28 73 70 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c  r(spLang+"/modul
3d20: 65 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  es"):.        if
3d30: 20 6e 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69   not sf.startswi
3d40: 74 68 28 22 67 63 65 5f 22 29 3a 0a 20 20 20 20  th("gce_"):.    
3d50: 20 20 20 20 20 20 20 20 66 69 6c 65 5f 75 74 69          file_uti
3d60: 6c 2e 63 6f 70 79 5f 66 69 6c 65 28 73 70 4c 61  l.copy_file(spLa
3d70: 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2f 22 2b 73  ng+"/modules/"+s
3d80: 66 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29 0a 20  f, spLangPack). 
3d90: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
3da0: 28 73 66 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20  (sf, end=", "). 
3db0: 20 20 20 70 72 69 6e 74 28 29 0a 0a 20 20 20 20     print()..    
3dc0: 23 20 54 45 53 54 20 46 49 4c 45 53 0a 20 20 20  # TEST FILES.   
3dd0: 20 77 69 74 68 20 6f 70 65 6e 28 22 67 72 61 6d   with open("gram
3de0: 6d 61 6c 65 63 74 65 2f 22 2b 73 4c 61 6e 67 2b  malecte/"+sLang+
3df0: 22 2f 67 63 5f 74 65 73 74 2e 74 78 74 22 2c 20  "/gc_test.txt", 
3e00: 22 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75  "w", encoding="u
3e10: 74 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22  tf-8", newline="
3e20: 5c 6e 22 29 20 61 73 20 68 44 73 74 50 79 3a 0a  \n") as hDstPy:.
3e30: 20 20 20 20 20 20 20 20 68 44 73 74 50 79 2e 77          hDstPy.w
3e40: 72 69 74 65 28 22 23 20 54 45 53 54 53 20 46 4f  rite("# TESTS FO
3e50: 52 20 4c 41 4e 47 20 5b 22 20 2b 20 73 4c 61 6e  R LANG [" + sLan
3e60: 67 20 2b 20 22 5d 5c 6e 5c 6e 22 29 0a 20 20 20  g + "]\n\n").   
3e70: 20 20 20 20 20 68 44 73 74 50 79 2e 77 72 69 74       hDstPy.writ
3e80: 65 28 64 56 61 72 73 5b 27 67 63 74 65 73 74 73  e(dVars['gctests
3e90: 27 5d 29 0a 0a 20 20 20 20 63 72 65 61 74 65 4f  '])..    createO
3ea0: 58 54 28 73 70 4c 61 6e 67 2c 20 64 56 61 72 73  XT(spLang, dVars
3eb0: 2c 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63 74 69  , xConfig._secti
3ec0: 6f 6e 73 5b 27 6f 78 74 27 5d 2c 20 73 70 4c 61  ons['oxt'], spLa
3ed0: 6e 67 50 61 63 6b 2c 20 62 49 6e 73 74 61 6c 6c  ngPack, bInstall
3ee0: 4f 58 54 29 0a 0a 20 20 20 20 63 72 65 61 74 65  OXT)..    create
3ef0: 53 65 72 76 65 72 4f 70 74 69 6f 6e 73 28 73 4c  ServerOptions(sL
3f00: 61 6e 67 2c 20 64 56 61 72 73 29 0a 20 20 20 20  ang, dVars).    
3f10: 63 72 65 61 74 65 53 65 72 76 65 72 5a 69 70 28  createServerZip(
3f20: 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70  sLang, dVars, sp
3f30: 4c 61 6e 67 50 61 63 6b 29 0a 0a 20 20 20 20 23  LangPack)..    #
3f40: 23 23 23 20 4a 41 56 41 53 43 52 49 50 54 0a 20  ### JAVASCRIPT. 
3f50: 20 20 20 69 66 20 62 4a 61 76 61 53 63 72 69 70     if bJavaScrip
3f60: 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  t:.        print
3f70: 28 22 4a 41 56 41 53 43 52 49 50 54 3a 22 29 0a  ("JAVASCRIPT:").
3f80: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 2b          print("+
3f90: 20 50 6c 75 67 69 6e 73 3a 20 22 2c 20 65 6e 64   Plugins: ", end
3fa0: 3d 22 22 29 0a 20 20 20 20 20 20 20 20 73 43 6f  ="").        sCo
3fb0: 64 65 50 6c 75 67 69 6e 73 20 3d 20 22 22 0a 20  dePlugins = "". 
3fc0: 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e         for sf in
3fd0: 20 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 4c 61   os.listdir(spLa
3fe0: 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22  ng+"/modules-js"
3ff0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
4000: 66 20 72 65 2e 6d 61 74 63 68 28 72 22 67 63 65  f re.match(r"gce
4010: 5f 5c 77 2b 5b 2e 5d 6a 73 24 22 2c 20 73 66 29  _\w+[.]js$", sf)
4020: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4030: 20 20 73 43 6f 64 65 50 6c 75 67 69 6e 73 20 2b    sCodePlugins +
4040: 3d 20 22 5c 6e 5c 6e 22 20 2b 20 6f 70 65 6e 28  = "\n\n" + open(
4050: 73 70 4c 61 6e 67 2b 27 2f 6d 6f 64 75 6c 65 73  spLang+'/modules
4060: 2d 6a 73 2f 27 2b 73 66 2c 20 22 72 22 2c 20 65  -js/'+sf, "r", e
4070: 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29  ncoding="utf-8")
4080: 2e 72 65 61 64 28 29 0a 20 20 20 20 20 20 20 20  .read().        
4090: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 66          print(sf
40a0: 2c 20 65 6e 64 3d 22 2c 20 22 29 0a 20 20 20 20  , end=", ").    
40b0: 20 20 20 20 70 72 69 6e 74 28 29 0a 20 20 20 20      print().    
40c0: 20 20 20 20 64 56 61 72 73 5b 22 70 6c 75 67 69      dVars["plugi
40d0: 6e 73 4a 53 22 5d 20 3d 20 73 43 6f 64 65 50 6c  nsJS"] = sCodePl
40e0: 75 67 69 6e 73 0a 0a 20 20 20 20 20 20 20 20 23  ugins..        #
40f0: 20 6f 70 74 69 6f 6e 73 20 64 61 74 61 20 73 74   options data st
4100: 72 75 63 74 0a 20 20 20 20 20 20 20 20 64 56 61  ruct.        dVa
4110: 72 73 5b 22 64 4f 70 74 4a 61 76 61 53 63 72 69  rs["dOptJavaScri
4120: 70 74 22 5d 20 3d 20 6a 73 6f 6e 2e 64 75 6d 70  pt"] = json.dump
4130: 73 28 6c 69 73 74 28 64 56 61 72 73 5b 22 64 4f  s(list(dVars["dO
4140: 70 74 4a 61 76 61 53 63 72 69 70 74 22 5d 2e 69  ptJavaScript"].i
4150: 74 65 6d 73 28 29 29 29 0a 20 20 20 20 20 20 20  tems())).       
4160: 20 0a 20 20 20 20 20 20 20 20 23 20 63 72 65 61   .        # crea
4170: 74 65 20 66 6f 6c 64 65 72 0a 20 20 20 20 20 20  te folder.      
4180: 20 20 73 70 4c 61 6e 67 50 61 63 6b 20 3d 20 22    spLangPack = "
4190: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22  grammalecte-js/"
41a0: 2b 73 4c 61 6e 67 0a 20 20 20 20 20 20 20 20 63  +sLang.        c
41b0: 72 65 61 74 65 43 6c 65 61 6e 46 6f 6c 64 65 72  reateCleanFolder
41c0: 28 73 70 4c 61 6e 67 50 61 63 6b 29 0a 0a 20 20  (spLangPack)..  
41d0: 20 20 20 20 20 20 23 20 63 72 65 61 74 65 20 66        # create f
41e0: 69 6c 65 73 0a 20 20 20 20 20 20 20 20 66 6f 72  iles.        for
41f0: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
4200: 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 22 29 3a  r("gc_core/js"):
4210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4220: 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69  not os.path.isdi
4230: 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 22 2b  r("gc_core/js/"+
4240: 73 66 29 20 61 6e 64 20 73 66 2e 73 74 61 72 74  sf) and sf.start
4250: 73 77 69 74 68 28 22 6a 73 65 78 5f 22 29 3a 0a  swith("jsex_"):.
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 64 56 61 72 73 5b 73 66 5b 35 3a 2d 33 5d 5d 20  dVars[sf[5:-3]] 
4280: 3d 20 6f 70 65 6e 28 22 67 63 5f 63 6f 72 65 2f  = open("gc_core/
4290: 6a 73 2f 22 2b 73 66 2c 20 22 72 22 2c 20 65 6e  js/"+sf, "r", en
42a0: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e  coding="utf-8").
42b0: 72 65 61 64 28 29 0a 20 20 20 20 20 20 20 20 66  read().        f
42c0: 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74  or sf in os.list
42d0: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 22  dir("gc_core/js"
42e0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
42f0: 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73  f not os.path.is
4300: 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f  dir("gc_core/js/
4310: 22 2b 73 66 29 20 61 6e 64 20 6e 6f 74 20 73 66  "+sf) and not sf
4320: 2e 73 74 61 72 74 73 77 69 74 68 28 22 6a 73 65  .startswith("jse
4330: 78 5f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  x_"):.          
4340: 20 20 20 20 20 20 63 6f 70 79 41 6e 64 46 69 6c        copyAndFil
4350: 65 54 65 6d 70 6c 61 74 65 28 22 67 63 5f 63 6f  eTemplate("gc_co
4360: 72 65 2f 6a 73 2f 22 2b 73 66 2c 20 22 67 72 61  re/js/"+sf, "gra
4370: 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66  mmalecte-js/"+sf
4380: 2c 20 64 56 61 72 73 29 0a 20 20 20 20 20 20 20  , dVars).       
4390: 20 6f 70 65 6e 28 22 67 72 61 6d 6d 61 6c 65 63   open("grammalec
43a0: 74 65 2d 6a 73 2f 57 41 52 4e 49 4e 47 2e 74 78  te-js/WARNING.tx
43b0: 74 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64 69 6e  t", "w", encodin
43c0: 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77 6c 69  g="utf-8", newli
43d0: 6e 65 3d 22 5c 6e 22 29 2e 77 72 69 74 65 28 73  ne="\n").write(s
43e0: 57 61 72 6e 69 6e 67 4d 65 73 73 61 67 65 29 0a  WarningMessage).
43f0: 20 20 20 20 20 20 20 20 66 6f 72 20 73 66 20 69          for sf i
4400: 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 63  n os.listdir("gc
4410: 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e 67 5f 63 6f  _core/js/lang_co
4420: 72 65 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  re"):.          
4430: 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68    if not os.path
4440: 2e 69 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f  .isdir("gc_core/
4450: 6a 73 2f 6c 61 6e 67 5f 63 6f 72 65 2f 22 2b 73  js/lang_core/"+s
4460: 66 29 20 61 6e 64 20 73 66 2e 73 74 61 72 74 73  f) and sf.starts
4470: 77 69 74 68 28 22 67 63 5f 22 29 3a 0a 20 20 20  with("gc_"):.   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 70               cop
4490: 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65  yAndFileTemplate
44a0: 28 22 67 63 5f 63 6f 72 65 2f 6a 73 2f 6c 61 6e  ("gc_core/js/lan
44b0: 67 5f 63 6f 72 65 2f 22 2b 73 66 2c 20 73 70 4c  g_core/"+sf, spL
44c0: 61 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20  angPack+"/"+sf, 
44d0: 64 56 61 72 73 29 0a 20 20 20 20 20 20 20 20 70  dVars).        p
44e0: 72 69 6e 74 28 22 2b 20 4d 6f 64 75 6c 65 73 3a  rint("+ Modules:
44f0: 20 22 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20   ", end="").    
4500: 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73      for sf in os
4510: 2e 6c 69 73 74 64 69 72 28 73 70 4c 61 6e 67 2b  .listdir(spLang+
4520: 22 2f 6d 6f 64 75 6c 65 73 2d 6a 73 22 29 3a 0a  "/modules-js"):.
4530: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
4540: 6f 74 20 73 66 2e 73 74 61 72 74 73 77 69 74 68  ot sf.startswith
4550: 28 22 67 63 65 5f 22 29 3a 0a 20 20 20 20 20 20  ("gce_"):.      
4560: 20 20 20 20 20 20 20 20 20 20 63 6f 70 79 41 6e            copyAn
4570: 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73 70  dFileTemplate(sp
4580: 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c 65 73 2d 6a  Lang+"/modules-j
4590: 73 2f 22 2b 73 66 2c 20 73 70 4c 61 6e 67 50 61  s/"+sf, spLangPa
45a0: 63 6b 2b 22 2f 22 2b 73 66 2c 20 64 56 61 72 73  ck+"/"+sf, dVars
45b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
45c0: 20 20 70 72 69 6e 74 28 73 66 2c 20 65 6e 64 3d    print(sf, end=
45d0: 22 2c 20 22 29 0a 20 20 20 20 20 20 20 20 70 72  ", ").        pr
45e0: 69 6e 74 28 29 0a 0a 20 20 20 20 20 20 20 20 63  int()..        c
45f0: 72 65 61 74 65 46 69 72 65 66 6f 78 45 78 74 65  reateFirefoxExte
4600: 6e 73 69 6f 6e 28 73 4c 61 6e 67 2c 20 64 56 61  nsion(sLang, dVa
4610: 72 73 29 0a 20 20 20 20 20 20 20 20 63 72 65 61  rs).        crea
4620: 74 65 54 68 75 6e 64 65 72 62 69 72 64 45 78 74  teThunderbirdExt
4630: 65 6e 73 69 6f 6e 28 73 4c 61 6e 67 2c 20 64 56  ension(sLang, dV
4640: 61 72 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b 29  ars, spLangPack)
4650: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 64 56 61  ..    return dVa
4660: 72 73 5b 27 76 65 72 73 69 6f 6e 27 5d 0a 0a 0a  rs['version']...
4670: 64 65 66 20 6d 61 69 6e 20 28 29 3a 0a 20 20 20  def main ():.   
4680: 20 70 72 69 6e 74 28 22 50 79 74 68 6f 6e 3a 20   print("Python: 
4690: 22 20 2b 20 73 79 73 2e 76 65 72 73 69 6f 6e 29  " + sys.version)
46a0: 0a 20 20 20 20 78 50 61 72 73 65 72 20 3d 20 61  .    xParser = a
46b0: 72 67 70 61 72 73 65 2e 41 72 67 75 6d 65 6e 74  rgparse.Argument
46c0: 50 61 72 73 65 72 28 29 0a 20 20 20 20 78 50 61  Parser().    xPa
46d0: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
46e0: 74 28 22 6c 61 6e 67 22 2c 20 74 79 70 65 3d 73  t("lang", type=s
46f0: 74 72 2c 20 6e 61 72 67 73 3d 27 2b 27 2c 20 68  tr, nargs='+', h
4700: 65 6c 70 3d 22 6c 61 6e 67 20 70 72 6f 6a 65 63  elp="lang projec
4710: 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 28 6e  t to generate (n
4720: 61 6d 65 20 6f 66 20 66 6f 6c 64 65 72 20 69 6e  ame of folder in
4730: 20 2f 6c 61 6e 67 29 22 29 0a 20 20 20 20 78 50   /lang)").    xP
4740: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
4750: 6e 74 28 22 2d 62 22 2c 20 22 2d 2d 62 75 69 6c  nt("-b", "--buil
4760: 64 5f 64 61 74 61 22 2c 20 68 65 6c 70 3d 22 6c  d_data", help="l
4770: 61 75 6e 63 68 20 62 75 69 6c 64 5f 64 61 74 61  aunch build_data
4780: 2e 70 79 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  .py", action="st
4790: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
47a0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
47b0: 65 6e 74 28 22 2d 64 22 2c 20 22 2d 2d 64 69 63  ent("-d", "--dic
47c0: 74 22 2c 20 68 65 6c 70 3d 22 67 65 6e 65 72 61  t", help="genera
47d0: 74 65 20 46 53 41 20 64 69 63 74 69 6f 6e 61 72  te FSA dictionar
47e0: 79 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  y", action="stor
47f0: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
4800: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
4810: 74 28 22 2d 74 22 2c 20 22 2d 2d 74 65 73 74 73  t("-t", "--tests
4820: 22 2c 20 68 65 6c 70 3d 22 72 75 6e 20 75 6e 69  ", help="run uni
4830: 74 20 74 65 73 74 73 22 2c 20 61 63 74 69 6f 6e  t tests", action
4840: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
4850: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
4860: 72 67 75 6d 65 6e 74 28 22 2d 70 22 2c 20 22 2d  rgument("-p", "-
4870: 2d 70 65 72 66 22 2c 20 68 65 6c 70 3d 22 72 75  -perf", help="ru
4880: 6e 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65  n performance te
4890: 73 74 73 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  sts", action="st
48a0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
48b0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
48c0: 65 6e 74 28 22 2d 70 6d 22 2c 20 22 2d 2d 70 65  ent("-pm", "--pe
48d0: 72 66 5f 6d 65 6d 6f 22 2c 20 68 65 6c 70 3d 22  rf_memo", help="
48e0: 72 75 6e 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  run performance 
48f0: 74 65 73 74 73 20 61 6e 64 20 73 74 6f 72 65 20  tests and store 
4900: 72 65 73 75 6c 74 73 20 69 6e 20 70 65 72 66 5f  results in perf_
4910: 6d 65 6d 6f 2e 74 78 74 22 2c 20 61 63 74 69 6f  memo.txt", actio
4920: 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a  n="store_true").
4930: 20 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f      xParser.add_
4940: 61 72 67 75 6d 65 6e 74 28 22 2d 6a 73 22 2c 20  argument("-js", 
4950: 22 2d 2d 6a 61 76 61 73 63 72 69 70 74 22 2c 20  "--javascript", 
4960: 68 65 6c 70 3d 22 4a 61 76 61 53 63 72 69 70 74  help="JavaScript
4970: 20 62 75 69 6c 64 20 66 6f 72 20 46 69 72 65 66   build for Firef
4980: 6f 78 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f  ox", action="sto
4990: 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50  re_true").    xP
49a0: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
49b0: 6e 74 28 22 2d 66 78 22 2c 20 22 2d 2d 66 69 72  nt("-fx", "--fir
49c0: 65 66 6f 78 22 2c 20 68 65 6c 70 3d 22 4c 61 75  efox", help="Lau
49d0: 6e 63 68 20 46 69 72 65 66 6f 78 20 4e 69 67 68  nch Firefox Nigh
49e0: 74 6c 79 20 66 6f 72 20 58 50 49 20 74 65 73 74  tly for XPI test
49f0: 69 6e 67 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ing", action="st
4a00: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
4a10: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
4a20: 65 6e 74 28 22 2d 74 62 22 2c 20 22 2d 2d 74 68  ent("-tb", "--th
4a30: 75 6e 64 65 72 62 69 72 64 22 2c 20 68 65 6c 70  underbird", help
4a40: 3d 22 4c 61 75 6e 63 68 20 54 68 75 6e 64 65 72  ="Launch Thunder
4a50: 62 69 72 64 22 2c 20 61 63 74 69 6f 6e 3d 22 73  bird", action="s
4a60: 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20  tore_true").    
4a70: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
4a80: 6d 65 6e 74 28 22 2d 69 22 2c 20 22 2d 2d 69 6e  ment("-i", "--in
4a90: 73 74 61 6c 6c 22 2c 20 68 65 6c 70 3d 22 69 6e  stall", help="in
4aa0: 73 74 61 6c 6c 20 74 68 65 20 65 78 74 65 6e 73  stall the extens
4ab0: 69 6f 6e 20 69 6e 20 57 72 69 74 65 72 20 28 70  ion in Writer (p
4ac0: 61 74 68 20 6f 66 20 75 6e 6f 70 6b 67 20 6d 75  ath of unopkg mu
4ad0: 73 74 20 62 65 20 73 65 74 20 69 6e 20 63 6f 6e  st be set in con
4ae0: 66 69 67 2e 69 6e 69 29 22 2c 20 61 63 74 69 6f  fig.ini)", actio
4af0: 6e 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a  n="store_true").
4b00: 20 20 20 20 78 41 72 67 73 20 3d 20 78 50 61 72      xArgs = xPar
4b10: 73 65 72 2e 70 61 72 73 65 5f 61 72 67 73 28 29  ser.parse_args()
4b20: 0a 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d  ..    dir_util.m
4b30: 6b 70 61 74 68 28 22 5f 62 75 69 6c 64 22 29 0a  kpath("_build").
4b40: 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70      dir_util.mkp
4b50: 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  ath("grammalecte
4b60: 22 29 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e  ").    dir_util.
4b70: 6d 6b 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65  mkpath("grammale
4b80: 63 74 65 2d 6a 73 22 29 0a 0a 20 20 20 20 66 6f  cte-js")..    fo
4b90: 72 20 73 4c 61 6e 67 20 69 6e 20 78 41 72 67 73  r sLang in xArgs
4ba0: 2e 6c 61 6e 67 3a 0a 20 20 20 20 20 20 20 20 69  .lang:.        i
4bb0: 66 20 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73  f os.path.exists
4bc0: 28 22 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e  ("gc_lang/"+sLan
4bd0: 67 29 20 61 6e 64 20 6f 73 2e 70 61 74 68 2e 69  g) and os.path.i
4be0: 73 64 69 72 28 22 67 63 5f 6c 61 6e 67 2f 22 2b  sdir("gc_lang/"+
4bf0: 73 4c 61 6e 67 29 3a 0a 20 20 20 20 20 20 20 20  sLang):.        
4c00: 20 20 20 20 78 43 6f 6e 66 69 67 20 3d 20 67 65      xConfig = ge
4c10: 74 43 6f 6e 66 69 67 28 73 4c 61 6e 67 29 0a 20  tConfig(sLang). 
4c20: 20 20 20 20 20 20 20 20 20 20 20 64 56 61 72 73             dVars
4c30: 20 3d 20 78 43 6f 6e 66 69 67 2e 5f 73 65 63 74   = xConfig._sect
4c40: 69 6f 6e 73 5b 27 61 72 67 73 27 5d 0a 0a 20 20  ions['args']..  
4c50: 20 20 20 20 20 20 20 20 20 20 23 20 63 6f 70 79            # copy
4c60: 20 67 63 5f 63 6f 72 65 20 63 6f 6d 6d 6f 6e 20   gc_core common 
4c70: 66 69 6c 65 20 69 6e 20 50 79 74 68 6f 6e 20 6e  file in Python n
4c80: 6f 77 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ow to be able to
4c90: 20 63 6f 6d 70 69 6c 65 20 64 69 63 74 69 6f 6e   compile diction
4ca0: 61 72 79 20 69 66 20 72 65 71 75 69 72 65 64 0a  ary if required.
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
4cc0: 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72  sf in os.listdir
4cd0: 28 22 67 63 5f 63 6f 72 65 2f 70 79 22 29 3a 0a  ("gc_core/py"):.
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69  if not os.path.i
4d00: 73 64 69 72 28 22 67 63 5f 63 6f 72 65 2f 70 79  sdir("gc_core/py
4d10: 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20 20 20  /"+sf):.        
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 70 79              copy
4d30: 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28  AndFileTemplate(
4d40: 22 67 63 5f 63 6f 72 65 2f 70 79 2f 22 2b 73 66  "gc_core/py/"+sf
4d50: 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 22  , "grammalecte/"
4d60: 2b 73 66 2c 20 64 56 61 72 73 29 0a 20 20 20 20  +sf, dVars).    
4d70: 20 20 20 20 20 20 20 20 6f 70 65 6e 28 22 67 72          open("gr
4d80: 61 6d 6d 61 6c 65 63 74 65 2f 57 41 52 4e 49 4e  ammalecte/WARNIN
4d90: 47 2e 74 78 74 22 2c 20 22 77 22 2c 20 65 6e 63  G.txt", "w", enc
4da0: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e  oding="utf-8", n
4db0: 65 77 6c 69 6e 65 3d 22 5c 6e 22 29 2e 77 72 69  ewline="\n").wri
4dc0: 74 65 28 73 57 61 72 6e 69 6e 67 4d 65 73 73 61  te(sWarningMessa
4dd0: 67 65 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ge)..           
4de0: 20 23 20 62 75 69 6c 64 20 64 61 74 61 0a 20 20   # build data.  
4df0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 5f            build_
4e00: 6d 6f 64 75 6c 65 20 3d 20 4e 6f 6e 65 0a 20 20  module = None.  
4e10: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
4e20: 67 73 2e 62 75 69 6c 64 5f 64 61 74 61 3a 0a 20  gs.build_data:. 
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
4e40: 20 6c 61 6e 67 20 64 61 74 61 0a 20 20 20 20 20   lang data.     
4e50: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 3a 0a             try:.
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 62 75 69 6c 64 5f 6d 6f 64 75 6c 65      build_module
4e80: 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d 70   = importlib.imp
4e90: 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67 63 5f 6c  ort_module("gc_l
4ea0: 61 6e 67 2e 22 2b 73 4c 61 6e 67 2b 22 2e 62 75  ang."+sLang+".bu
4eb0: 69 6c 64 5f 64 61 74 61 22 29 0a 20 20 20 20 20  ild_data").     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70             excep
4ed0: 74 20 49 6d 70 6f 72 74 45 72 72 6f 72 3a 0a 20  t ImportError:. 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f     print("# Erro
4f00: 72 2e 20 43 6f 75 6c 64 6e e2 80 99 74 20 69 6d  r. Couldn...t im
4f10: 70 6f 72 74 20 66 69 6c 65 20 62 75 69 6c 64 5f  port file build_
4f20: 64 61 74 61 2e 70 79 20 69 6e 20 66 6f 6c 64 65  data.py in folde
4f30: 72 20 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e  r gc_lang/"+sLan
4f40: 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g).            i
4f50: 66 20 62 75 69 6c 64 5f 6d 6f 64 75 6c 65 3a 0a  f build_module:.
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 62 75 69 6c 64 5f 6d 6f 64 75 6c 65 2e 62 65 66  build_module.bef
4f80: 6f 72 65 28 27 67 63 5f 6c 61 6e 67 2f 27 2b 73  ore('gc_lang/'+s
4f90: 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 78 41 72  Lang, dVars, xAr
4fa0: 67 73 2e 6a 61 76 61 73 63 72 69 70 74 29 0a 20  gs.javascript). 
4fb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
4fc0: 72 67 73 2e 64 69 63 74 20 6f 72 20 6e 6f 74 20  rgs.dict or not 
4fd0: 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28 22  os.path.exists("
4fe0: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 5f 64 69 63  grammalecte/_dic
4ff0: 74 69 6f 6e 61 72 69 65 73 22 29 3a 0a 20 20 20  tionaries"):.   
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
5010: 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e  ort grammalecte.
5020: 64 61 77 67 20 61 73 20 66 73 61 0a 20 20 20 20  dawg as fsa.    
5030: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
5040: 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e 69 62 64   grammalecte.ibd
5050: 61 77 67 20 69 6d 70 6f 72 74 20 49 42 44 41 57  awg import IBDAW
5060: 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  G.              
5070: 20 20 23 20 66 73 61 20 62 75 69 6c 64 65 72 0a    # fsa builder.
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 6f 44 41 57 47 20 3d 20 66 73 61 2e 44 41 57 47  oDAWG = fsa.DAWG
50a0: 28 64 56 61 72 73 5b 27 6c 65 78 69 63 6f 6e 5f  (dVars['lexicon_
50b0: 73 72 63 27 5d 2c 20 64 56 61 72 73 5b 27 6c 61  src'], dVars['la
50c0: 6e 67 5f 6e 61 6d 65 27 5d 2c 20 64 56 61 72 73  ng_name'], dVars
50d0: 5b 27 73 74 65 6d 6d 69 6e 67 5f 6d 65 74 68 6f  ['stemming_metho
50e0: 64 27 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  d']).           
50f0: 20 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b       dir_util.mk
5100: 70 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74  path("grammalect
5110: 65 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22  e/_dictionaries"
5120: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5130: 20 20 6f 44 41 57 47 2e 77 72 69 74 65 49 6e 66    oDAWG.writeInf
5140: 6f 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2f 5f  o("grammalecte/_
5150: 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 20 2b  dictionaries/" +
5160: 20 64 56 61 72 73 5b 27 70 79 5f 62 69 6e 61 72   dVars['py_binar
5170: 79 5f 64 69 63 27 5d 20 2b 20 22 2e 69 6e 66 6f  y_dic'] + ".info
5180: 2e 74 78 74 22 29 0a 20 20 20 20 20 20 20 20 20  .txt").         
5190: 20 20 20 20 20 20 20 6f 44 41 57 47 2e 63 72 65         oDAWG.cre
51a0: 61 74 65 42 69 6e 61 72 79 28 22 67 72 61 6d 6d  ateBinary("gramm
51b0: 61 6c 65 63 74 65 2f 5f 64 69 63 74 69 6f 6e 61  alecte/_dictiona
51c0: 72 69 65 73 2f 22 20 2b 20 64 56 61 72 73 5b 27  ries/" + dVars['
51d0: 70 79 5f 62 69 6e 61 72 79 5f 64 69 63 27 5d 2c  py_binary_dic'],
51e0: 20 69 6e 74 28 64 56 61 72 73 5b 27 66 73 61 5f   int(dVars['fsa_
51f0: 6d 65 74 68 6f 64 27 5d 29 29 0a 20 20 20 20 20  method'])).     
5200: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
5210: 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74 3a 0a  rgs.javascript:.
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 6d 6b 70      dir_util.mkp
5240: 61 74 68 28 22 67 72 61 6d 6d 61 6c 65 63 74 65  ath("grammalecte
5250: 2d 6a 73 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65  -js/_dictionarie
5260: 73 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s").            
5270: 20 20 20 20 20 20 20 20 6f 44 69 63 20 3d 20 49          oDic = I
5280: 42 44 41 57 47 28 64 56 61 72 73 5b 27 70 79 5f  BDAWG(dVars['py_
5290: 62 69 6e 61 72 79 5f 64 69 63 27 5d 29 0a 20 20  binary_dic']).  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 23 6f 44 69 63 2e 77 72 69 74 65 41 73 4a    #oDic.writeAsJ
52c0: 53 4f 62 6a 65 63 74 28 22 67 63 5f 6c 61 6e 67  SObject("gc_lang
52d0: 2f 22 2b 73 4c 61 6e 67 2b 22 2f 6d 6f 64 75 6c  /"+sLang+"/modul
52e0: 65 73 2d 6a 73 2f 64 69 63 74 69 6f 6e 61 72 79  es-js/dictionary
52f0: 2e 6a 73 22 29 0a 20 20 20 20 20 20 20 20 20 20  .js").          
5300: 20 20 20 20 20 20 20 20 20 20 6f 44 69 63 2e 77            oDic.w
5310: 72 69 74 65 41 73 4a 53 4f 62 6a 65 63 74 28 22  riteAsJSObject("
5320: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 5f  grammalecte-js/_
5330: 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 64  dictionaries/"+d
5340: 56 61 72 73 5b 27 6a 73 5f 62 69 6e 61 72 79 5f  Vars['js_binary_
5350: 64 69 63 27 5d 29 0a 20 20 20 20 20 20 20 20 20  dic']).         
5360: 20 20 20 69 66 20 62 75 69 6c 64 5f 6d 6f 64 75     if build_modu
5370: 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  le:.            
5380: 20 20 20 20 62 75 69 6c 64 5f 6d 6f 64 75 6c 65      build_module
5390: 2e 61 66 74 65 72 28 27 67 63 5f 6c 61 6e 67 2f  .after('gc_lang/
53a0: 27 2b 73 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20  '+sLang, dVars, 
53b0: 78 41 72 67 73 2e 6a 61 76 61 73 63 72 69 70 74  xArgs.javascript
53c0: 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  )..            #
53d0: 20 6d 61 6b 65 0a 20 20 20 20 20 20 20 20 20 20   make.          
53e0: 20 20 73 56 65 72 73 69 6f 6e 20 3d 20 63 72 65    sVersion = cre
53f0: 61 74 65 28 73 4c 61 6e 67 2c 20 78 43 6f 6e 66  ate(sLang, xConf
5400: 69 67 2c 20 78 41 72 67 73 2e 69 6e 73 74 61 6c  ig, xArgs.instal
5410: 6c 2c 20 78 41 72 67 73 2e 6a 61 76 61 73 63 72  l, xArgs.javascr
5420: 69 70 74 2c 20 29 0a 0a 20 20 20 20 20 20 20 20  ipt, )..        
5430: 20 20 20 20 23 20 74 65 73 74 73 0a 20 20 20 20      # tests.    
5440: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
5450: 2e 74 65 73 74 73 20 6f 72 20 78 41 72 67 73 2e  .tests or xArgs.
5460: 70 65 72 66 20 6f 72 20 78 41 72 67 73 2e 70 65  perf or xArgs.pe
5470: 72 66 5f 6d 65 6d 6f 3a 0a 20 20 20 20 20 20 20  rf_memo:.       
5480: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
5490: 3e 20 52 75 6e 6e 69 6e 67 20 74 65 73 74 73 22  > Running tests"
54a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
54b0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
54c0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 73             tests
54d0: 20 3d 20 69 6d 70 6f 72 74 6c 69 62 2e 69 6d 70   = importlib.imp
54e0: 6f 72 74 5f 6d 6f 64 75 6c 65 28 22 67 72 61 6d  ort_module("gram
54f0: 6d 61 6c 65 63 74 65 2e 22 2b 73 4c 61 6e 67 2b  malecte."+sLang+
5500: 22 2e 74 65 73 74 73 22 29 0a 20 20 20 20 20 20  ".tests").      
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
5520: 69 6e 74 28 74 65 73 74 73 2e 5f 5f 66 69 6c 65  int(tests.__file
5530: 5f 5f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  __).            
5540: 20 20 20 20 65 78 63 65 70 74 20 49 6d 70 6f 72      except Impor
5550: 74 45 72 72 6f 72 3a 0a 20 20 20 20 20 20 20 20  tError:.        
5560: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
5570: 74 28 22 23 20 45 72 72 6f 72 2e 20 43 6f 75 6c  t("# Error. Coul
5580: 64 6e 27 74 20 69 6d 70 6f 72 74 20 66 69 6c 65  dn't import file
5590: 20 7b 7d 5f 74 65 73 74 2e 70 79 20 69 6e 20 66   {}_test.py in f
55a0: 6f 6c 64 65 72 20 74 65 73 74 73 22 2e 66 6f 72  older tests".for
55b0: 6d 61 74 28 73 4c 61 6e 67 29 29 0a 20 20 20 20  mat(sLang)).    
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
55d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
55e0: 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e 74        if xArgs.t
55f0: 65 73 74 73 3a 0a 20 20 20 20 20 20 20 20 20 20  ests:.          
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 54                xT
5610: 65 73 74 53 75 69 74 65 20 3d 20 75 6e 69 74 74  estSuite = unitt
5620: 65 73 74 2e 54 65 73 74 4c 6f 61 64 65 72 28 29  est.TestLoader()
5630: 2e 6c 6f 61 64 54 65 73 74 73 46 72 6f 6d 4d 6f  .loadTestsFromMo
5640: 64 75 6c 65 28 74 65 73 74 73 29 0a 20 20 20 20  dule(tests).    
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 75 6e 69 74 74 65 73 74 2e 54 65 78      unittest.Tex
5670: 74 54 65 73 74 52 75 6e 6e 65 72 28 29 2e 72 75  tTestRunner().ru
5680: 6e 28 78 54 65 73 74 53 75 69 74 65 29 0a 20 20  n(xTestSuite).  
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 69 66 20 78 41 72 67 73 2e 70 65 72 66 20    if xArgs.perf 
56b0: 6f 72 20 78 41 72 67 73 2e 70 65 72 66 5f 6d 65  or xArgs.perf_me
56c0: 6d 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  mo:.            
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 68 44 73 74              hDst
56e0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 67 63 5f 6c 61   = open("./gc_la
56f0: 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22 2f 70 65 72  ng/"+sLang+"/per
5700: 66 5f 6d 65 6d 6f 2e 74 78 74 22 2c 20 22 61 22  f_memo.txt", "a"
5710: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
5720: 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c 6e 22  8", newline="\n"
5730: 29 20 20 69 66 20 78 41 72 67 73 2e 70 65 72 66  )  if xArgs.perf
5740: 5f 6d 65 6d 6f 20 20 65 6c 73 65 20 4e 6f 6e 65  _memo  else None
5750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5760: 20 20 20 20 20 20 20 20 20 74 65 73 74 73 2e 70           tests.p
5770: 65 72 66 28 73 56 65 72 73 69 6f 6e 2c 20 68 44  erf(sVersion, hD
5780: 73 74 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20  st)..           
5790: 20 23 20 46 69 72 65 66 6f 78 0a 20 20 20 20 20   # Firefox.     
57a0: 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e         if xArgs.
57b0: 66 69 72 65 66 6f 78 3a 0a 20 20 20 20 20 20 20  firefox:.       
57c0: 20 20 20 20 20 20 20 20 20 77 69 74 68 20 63 64           with cd
57d0: 28 22 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73  ("_build/xpi/"+s
57e0: 4c 61 6e 67 29 3a 0a 20 20 20 20 20 20 20 20 20  Lang):.         
57f0: 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 73 79             os.sy
5800: 73 74 65 6d 28 22 6a 70 6d 20 72 75 6e 20 2d 62  stem("jpm run -b
5810: 20 6e 69 67 68 74 6c 79 22 29 0a 0a 20 20 20 20   nightly")..    
5820: 20 20 20 20 20 20 20 20 23 20 54 68 75 6e 64 65          # Thunde
5830: 72 62 69 72 64 0a 20 20 20 20 20 20 20 20 20 20  rbird.          
5840: 20 20 69 66 20 78 41 72 67 73 2e 74 68 75 6e 64    if xArgs.thund
5850: 65 72 62 69 72 64 3a 0a 20 20 20 20 20 20 20 20  erbird:.        
5860: 20 20 20 20 20 20 20 20 6f 73 2e 73 79 73 74 65          os.syste
5870: 6d 28 22 74 68 75 6e 64 65 72 62 69 72 64 20 2d  m("thunderbird -
5880: 6a 73 63 6f 6e 73 6f 6c 65 20 2d 50 20 64 65 62  jsconsole -P deb
5890: 75 67 22 29 0a 20 20 20 20 20 20 20 20 65 6c 73  ug").        els
58a0: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e:.            p
58b0: 72 69 6e 74 28 22 46 6f 6c 64 65 72 20 6e 6f 74  rint("Folder not
58c0: 20 66 6f 75 6e 64 3a 20 67 63 5f 6c 61 6e 67 2f   found: gc_lang/
58d0: 22 2b 73 4c 61 6e 67 29 0a 0a 0a 69 66 20 5f 5f  "+sLang)...if __
58e0: 6e 61 6d 65 5f 5f 20 3d 3d 20 27 5f 5f 6d 61 69  name__ == '__mai
58f0: 6e 5f 5f 27 3a 0a 20 20 20 20 6d 61 69 6e 28 29  n__':.    main()
5900: 0a                                               .