Grammalecte  Hex Artifact Content

Artifact 248d1906b2624acfc17815d015b0e7a1d1177a39f91d7db1cd5ab9bbc364311c:


0000: 23 20 42 75 69 6c 64 65 72 20 66 6f 72 20 46 72  # Builder for Fr
0010: 65 6e 63 68 20 6c 61 6e 67 75 61 67 65 0a 0a 69  ench language..i
0020: 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f 72 74 20  mport os.import 
0030: 7a 69 70 66 69 6c 65 0a 66 72 6f 6d 20 64 69 73  zipfile.from dis
0040: 74 75 74 69 6c 73 20 69 6d 70 6f 72 74 20 64 69  tutils import di
0050: 72 5f 75 74 69 6c 2c 20 66 69 6c 65 5f 75 74 69  r_util, file_uti
0060: 6c 0a 0a 69 6d 70 6f 72 74 20 68 65 6c 70 65 72  l..import helper
0070: 73 0a 0a 0a 64 65 66 20 62 75 69 6c 64 20 28 73  s...def build (s
0080: 4c 61 6e 67 2c 20 64 56 61 72 73 2c 20 73 70 4c  Lang, dVars, spL
0090: 61 6e 67 50 61 63 6b 29 3a 0a 20 20 20 20 22 63  angPack):.    "c
00a0: 6f 6d 70 6c 65 6d 65 6e 74 61 72 79 20 62 75 69  omplementary bui
00b0: 6c 64 20 6c 61 75 6e 63 68 65 64 20 66 72 6f 6d  ld launched from
00c0: 20 6d 61 6b 65 2e 70 79 22 0a 20 20 20 20 23 63   make.py".    #c
00d0: 72 65 61 74 65 46 69 72 65 66 6f 78 45 78 74 65  reateFirefoxExte
00e0: 6e 73 69 6f 6e 28 73 4c 61 6e 67 2c 20 64 56 61  nsion(sLang, dVa
00f0: 72 73 29 0a 20 20 20 20 63 72 65 61 74 65 57 65  rs).    createWe
0100: 62 45 78 74 65 6e 73 69 6f 6e 28 73 4c 61 6e 67  bExtension(sLang
0110: 2c 20 64 56 61 72 73 29 0a 20 20 20 20 63 72 65  , dVars).    cre
0120: 61 74 65 54 68 75 6e 64 65 72 62 69 72 64 45 78  ateThunderbirdEx
0130: 74 65 6e 73 69 6f 6e 28 73 4c 61 6e 67 2c 20 64  tension(sLang, d
0140: 56 61 72 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b  Vars, spLangPack
0150: 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 57 65  )...def createWe
0160: 62 45 78 74 65 6e 73 69 6f 6e 20 28 73 4c 61 6e  bExtension (sLan
0170: 67 2c 20 64 56 61 72 73 29 3a 0a 20 20 20 20 22  g, dVars):.    "
0180: 63 72 65 61 74 65 20 57 65 62 2d 65 78 74 65 6e  create Web-exten
0190: 73 69 6f 6e 22 0a 20 20 20 20 70 72 69 6e 74 28  sion".    print(
01a0: 22 42 75 69 6c 64 69 6e 67 20 57 65 62 45 78 74  "Building WebExt
01b0: 65 6e 73 69 6f 6e 22 29 0a 20 20 20 20 68 65 6c  ension").    hel
01c0: 70 65 72 73 2e 63 72 65 61 74 65 43 6c 65 61 6e  pers.createClean
01d0: 46 6f 6c 64 65 72 28 22 5f 62 75 69 6c 64 2f 77  Folder("_build/w
01e0: 65 62 65 78 74 2f 22 2b 73 4c 61 6e 67 29 0a 20  ebext/"+sLang). 
01f0: 20 20 20 64 69 72 5f 75 74 69 6c 2e 63 6f 70 79     dir_util.copy
0200: 5f 74 72 65 65 28 22 67 63 5f 6c 61 6e 67 2f 22  _tree("gc_lang/"
0210: 2b 73 4c 61 6e 67 2b 22 2f 77 65 62 65 78 74 2f  +sLang+"/webext/
0220: 22 2c 20 22 5f 62 75 69 6c 64 2f 77 65 62 65 78  ", "_build/webex
0230: 74 2f 22 2b 73 4c 61 6e 67 29 0a 20 20 20 20 64  t/"+sLang).    d
0240: 69 72 5f 75 74 69 6c 2e 63 6f 70 79 5f 74 72 65  ir_util.copy_tre
0250: 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a  e("grammalecte-j
0260: 73 22 2c 20 22 5f 62 75 69 6c 64 2f 77 65 62 65  s", "_build/webe
0270: 78 74 2f 22 2b 73 4c 61 6e 67 2b 22 2f 67 72 61  xt/"+sLang+"/gra
0280: 6d 6d 61 6c 65 63 74 65 22 29 0a 20 20 20 20 64  mmalecte").    d
0290: 56 61 72 73 5b 27 77 65 62 65 78 74 4f 70 74 69  Vars['webextOpti
02a0: 6f 6e 73 48 54 4d 4c 27 5d 20 3d 20 5f 63 72 65  onsHTML'] = _cre
02b0: 61 74 65 4f 70 74 69 6f 6e 73 46 6f 72 57 65 62  ateOptionsForWeb
02c0: 45 78 74 65 6e 73 69 6f 6e 28 64 56 61 72 73 29  Extension(dVars)
02d0: 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70  .    helpers.cop
02e0: 79 41 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65  yAndFileTemplate
02f0: 28 22 5f 62 75 69 6c 64 2f 77 65 62 65 78 74 2f  ("_build/webext/
0300: 22 2b 73 4c 61 6e 67 2b 22 2f 70 61 6e 65 6c 2f  "+sLang+"/panel/
0310: 6d 61 69 6e 2e 68 74 6d 6c 22 2c 20 22 5f 62 75  main.html", "_bu
0320: 69 6c 64 2f 77 65 62 65 78 74 2f 22 2b 73 4c 61  ild/webext/"+sLa
0330: 6e 67 2b 22 2f 70 61 6e 65 6c 2f 6d 61 69 6e 2e  ng+"/panel/main.
0340: 68 74 6d 6c 22 2c 20 64 56 61 72 73 29 0a 20 20  html", dVars).  
0350: 20 20 77 69 74 68 20 68 65 6c 70 65 72 73 2e 63    with helpers.c
0360: 64 28 22 5f 62 75 69 6c 64 2f 77 65 62 65 78 74  d("_build/webext
0370: 2f 22 2b 73 4c 61 6e 67 29 3a 0a 20 20 20 20 20  /"+sLang):.     
0380: 20 20 20 6f 73 2e 73 79 73 74 65 6d 28 22 77 65     os.system("we
0390: 62 2d 65 78 74 20 62 75 69 6c 64 22 29 0a 0a 0a  b-ext build")...
03a0: 64 65 66 20 5f 63 72 65 61 74 65 4f 70 74 69 6f  def _createOptio
03b0: 6e 73 46 6f 72 57 65 62 45 78 74 65 6e 73 69 6f  nsForWebExtensio
03c0: 6e 20 28 64 56 61 72 73 29 3a 0a 20 20 20 20 73  n (dVars):.    s
03d0: 48 54 4d 4c 20 3d 20 22 22 0a 20 20 20 20 73 4c  HTML = "".    sL
03e0: 61 6e 67 20 3d 20 64 56 61 72 73 5b 27 73 44 65  ang = dVars['sDe
03f0: 66 61 75 6c 74 55 49 4c 61 6e 67 27 5d 0a 20 20  faultUILang'].  
0400: 20 20 66 6f 72 20 73 53 65 63 74 69 6f 6e 2c 20    for sSection, 
0410: 6c 4f 70 74 20 69 6e 20 64 56 61 72 73 5b 27 6c  lOpt in dVars['l
0420: 53 74 72 75 63 74 4f 70 74 27 5d 3a 0a 20 20 20  StructOpt']:.   
0430: 20 20 20 20 20 73 48 54 4d 4c 20 2b 3d 20 66 27       sHTML += f'
0440: 5c 6e 3c 64 69 76 20 69 64 3d 22 73 75 62 73 65  \n<div id="subse
0450: 63 74 69 6f 6e 5f 7b 73 53 65 63 74 69 6f 6e 7d  ction_{sSection}
0460: 22 20 63 6c 61 73 73 3d 22 6f 70 74 5f 73 75 62  " class="opt_sub
0470: 73 65 63 74 69 6f 6e 22 3e 5c 6e 20 20 3c 68 32  section">\n  <h2
0480: 20 64 61 74 61 2d 6c 31 30 6e 2d 69 64 3d 22 6f   data-l10n-id="o
0490: 70 74 69 6f 6e 5f 7b 73 53 65 63 74 69 6f 6e 7d  ption_{sSection}
04a0: 22 3e 7b 64 56 61 72 73 5b 22 64 4f 70 74 4c 61  ">{dVars["dOptLa
04b0: 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d 5b 73 53 65  bel"][sLang][sSe
04c0: 63 74 69 6f 6e 5d 5b 30 5d 7d 3c 2f 68 32 3e 5c  ction][0]}</h2>\
04d0: 6e 27 0a 20 20 20 20 20 20 20 20 66 6f 72 20 6c  n'.        for l
04e0: 4c 69 6e 65 4f 70 74 20 69 6e 20 6c 4f 70 74 3a  LineOpt in lOpt:
04f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
0500: 20 73 4f 70 74 20 69 6e 20 6c 4c 69 6e 65 4f 70   sOpt in lLineOp
0510: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t:.             
0520: 20 20 20 73 48 54 4d 4c 20 2b 3d 20 66 27 20 20     sHTML += f'  
0530: 3c 70 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22  <p><input type="
0540: 63 68 65 63 6b 62 6f 78 22 20 69 64 3d 22 6f 70  checkbox" id="op
0550: 74 69 6f 6e 5f 7b 73 4f 70 74 7d 22 20 63 6c 61  tion_{sOpt}" cla
0560: 73 73 3d 22 67 63 5f 6f 70 74 69 6f 6e 22 20 64  ss="gc_option" d
0570: 61 74 61 2d 6f 70 74 69 6f 6e 3d 22 7b 73 4f 70  ata-option="{sOp
0580: 74 7d 22 2f 3e 3c 6c 61 62 65 6c 20 69 64 3d 22  t}"/><label id="
0590: 6f 70 74 69 6f 6e 5f 6c 61 62 65 6c 5f 7b 73 4f  option_label_{sO
05a0: 70 74 7d 22 20 66 6f 72 3d 22 6f 70 74 69 6f 6e  pt}" for="option
05b0: 5f 7b 73 4f 70 74 7d 22 20 64 61 74 61 2d 6c 31  _{sOpt}" data-l1
05c0: 30 6e 2d 69 64 3d 22 6f 70 74 69 6f 6e 5f 7b 73  0n-id="option_{s
05d0: 4f 70 74 7d 22 3e 7b 64 56 61 72 73 5b 22 64 4f  Opt}">{dVars["dO
05e0: 70 74 4c 61 62 65 6c 22 5d 5b 73 4c 61 6e 67 5d  ptLabel"][sLang]
05f0: 5b 73 4f 70 74 5d 5b 30 5d 7d 3c 2f 6c 61 62 65  [sOpt][0]}</labe
0600: 6c 3e 3c 2f 70 3e 5c 6e 27 0a 20 20 20 20 20 20  l></p>\n'.      
0610: 20 20 73 48 54 4d 4c 20 2b 3d 20 27 3c 2f 64 69    sHTML += '</di
0620: 76 3e 5c 6e 27 0a 20 20 20 20 72 65 74 75 72 6e  v>\n'.    return
0630: 20 73 48 54 4d 4c 0a 0a 0a 64 65 66 20 63 72 65   sHTML...def cre
0640: 61 74 65 46 69 72 65 66 6f 78 45 78 74 65 6e 73  ateFirefoxExtens
0650: 69 6f 6e 20 28 73 4c 61 6e 67 2c 20 64 56 61 72  ion (sLang, dVar
0660: 73 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20  s):.    "create 
0670: 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 46 69  extension for Fi
0680: 72 65 66 6f 78 20 28 6f 62 73 6f 6c 65 74 65 29  refox (obsolete)
0690: 22 0a 20 20 20 20 70 72 69 6e 74 28 22 42 75 69  ".    print("Bui
06a0: 6c 64 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 20  lding extension 
06b0: 66 6f 72 20 46 69 72 65 66 6f 78 22 29 0a 20 20  for Firefox").  
06c0: 20 20 68 65 6c 70 65 72 73 2e 63 72 65 61 74 65    helpers.create
06d0: 43 6c 65 61 6e 46 6f 6c 64 65 72 28 22 5f 62 75  CleanFolder("_bu
06e0: 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67 29  ild/xpi/"+sLang)
06f0: 0a 20 20 20 20 64 69 72 5f 75 74 69 6c 2e 63 6f  .    dir_util.co
0700: 70 79 5f 74 72 65 65 28 22 67 63 5f 6c 61 6e 67  py_tree("gc_lang
0710: 2f 22 2b 73 4c 61 6e 67 2b 22 2f 78 70 69 2f 22  /"+sLang+"/xpi/"
0720: 2c 20 22 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b  , "_build/xpi/"+
0730: 73 4c 61 6e 67 29 0a 20 20 20 20 64 69 72 5f 75  sLang).    dir_u
0740: 74 69 6c 2e 63 6f 70 79 5f 74 72 65 65 28 22 67  til.copy_tree("g
0750: 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 22 2c 20  rammalecte-js", 
0760: 22 5f 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c  "_build/xpi/"+sL
0770: 61 6e 67 2b 22 2f 67 72 61 6d 6d 61 6c 65 63 74  ang+"/grammalect
0780: 65 22 29 0a 20 20 20 20 73 48 54 4d 4c 2c 20 64  e").    sHTML, d
0790: 50 72 6f 70 65 72 74 69 65 73 20 3d 20 5f 63 72  Properties = _cr
07a0: 65 61 74 65 4f 70 74 69 6f 6e 73 46 6f 72 46 69  eateOptionsForFi
07b0: 72 65 66 6f 78 28 64 56 61 72 73 29 0a 20 20 20  refox(dVars).   
07c0: 20 64 56 61 72 73 5b 27 6f 70 74 69 6f 6e 73 48   dVars['optionsH
07d0: 54 4d 4c 27 5d 20 3d 20 73 48 54 4d 4c 0a 20 20  TML'] = sHTML.  
07e0: 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41 6e    helpers.copyAn
07f0: 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 22 5f  dFileTemplate("_
0800: 62 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e  build/xpi/"+sLan
0810: 67 2b 22 2f 64 61 74 61 2f 61 62 6f 75 74 5f 70  g+"/data/about_p
0820: 61 6e 65 6c 2e 68 74 6d 6c 22 2c 20 22 5f 62 75  anel.html", "_bu
0830: 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67 2b  ild/xpi/"+sLang+
0840: 22 2f 64 61 74 61 2f 61 62 6f 75 74 5f 70 61 6e  "/data/about_pan
0850: 65 6c 2e 68 74 6d 6c 22 2c 20 64 56 61 72 73 29  el.html", dVars)
0860: 0a 20 20 20 20 66 6f 72 20 73 4c 6f 63 61 6c 65  .    for sLocale
0870: 20 69 6e 20 64 50 72 6f 70 65 72 74 69 65 73 2e   in dProperties.
0880: 6b 65 79 73 28 29 3a 0a 20 20 20 20 20 20 20 20  keys():.        
0890: 73 70 66 4c 6f 63 61 6c 65 20 3d 20 22 5f 62 75  spfLocale = "_bu
08a0: 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67 2b  ild/xpi/"+sLang+
08b0: 22 2f 6c 6f 63 61 6c 65 2f 22 2b 73 4c 6f 63 61  "/locale/"+sLoca
08c0: 6c 65 2b 22 2e 70 72 6f 70 65 72 74 69 65 73 22  le+".properties"
08d0: 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70  .        if os.p
08e0: 61 74 68 2e 65 78 69 73 74 73 28 73 70 66 4c 6f  ath.exists(spfLo
08f0: 63 61 6c 65 29 3a 0a 20 20 20 20 20 20 20 20 20  cale):.         
0900: 20 20 20 68 65 6c 70 65 72 73 2e 63 6f 70 79 41     helpers.copyA
0910: 6e 64 46 69 6c 65 54 65 6d 70 6c 61 74 65 28 73  ndFileTemplate(s
0920: 70 66 4c 6f 63 61 6c 65 2c 20 73 70 66 4c 6f 63  pfLocale, spfLoc
0930: 61 6c 65 2c 20 64 50 72 6f 70 65 72 74 69 65 73  ale, dProperties
0940: 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a  ).        else:.
0950: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
0960: 74 28 22 4c 6f 63 61 6c 65 20 66 69 6c 65 20 6e  t("Locale file n
0970: 6f 74 20 66 6f 75 6e 64 3a 20 22 20 2b 20 73 70  ot found: " + sp
0980: 66 4c 6f 63 61 6c 65 29 0a 20 20 20 20 77 69 74  fLocale).    wit
0990: 68 20 68 65 6c 70 65 72 73 2e 63 64 28 22 5f 62  h helpers.cd("_b
09a0: 75 69 6c 64 2f 78 70 69 2f 22 2b 73 4c 61 6e 67  uild/xpi/"+sLang
09b0: 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e 73 79  ):.        os.sy
09c0: 73 74 65 6d 28 22 6a 70 6d 20 78 70 69 22 29 0a  stem("jpm xpi").
09d0: 0a 0a 64 65 66 20 5f 63 72 65 61 74 65 4f 70 74  ..def _createOpt
09e0: 69 6f 6e 73 46 6f 72 46 69 72 65 66 6f 78 20 28  ionsForFirefox (
09f0: 64 56 61 72 73 29 3a 0a 20 20 20 20 23 20 6f 62  dVars):.    # ob
0a00: 73 6f 6c 65 74 65 0a 20 20 20 20 73 48 54 4d 4c  solete.    sHTML
0a10: 20 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 53   = "".    for sS
0a20: 65 63 74 69 6f 6e 2c 20 6c 4f 70 74 20 69 6e 20  ection, lOpt in 
0a30: 64 56 61 72 73 5b 27 6c 53 74 72 75 63 74 4f 70  dVars['lStructOp
0a40: 74 27 5d 3a 0a 20 20 20 20 20 20 20 20 73 48 54  t']:.        sHT
0a50: 4d 4c 20 2b 3d 20 27 5c 6e 3c 64 69 76 20 69 64  ML += '\n<div id
0a60: 3d 22 73 75 62 73 65 63 74 69 6f 6e 5f 27 20 2b  ="subsection_' +
0a70: 20 73 53 65 63 74 69 6f 6e 20 2b 20 27 22 20 63   sSection + '" c
0a80: 6c 61 73 73 3d 22 6f 70 74 5f 73 75 62 73 65 63  lass="opt_subsec
0a90: 74 69 6f 6e 22 3e 5c 6e 20 20 3c 68 32 20 64 61  tion">\n  <h2 da
0aa0: 74 61 2d 6c 31 30 6e 2d 69 64 3d 22 6f 70 74 69  ta-l10n-id="opti
0ab0: 6f 6e 5f 27 2b 73 53 65 63 74 69 6f 6e 2b 27 22  on_'+sSection+'"
0ac0: 3e 3c 2f 68 32 3e 5c 6e 27 0a 20 20 20 20 20 20  ></h2>\n'.      
0ad0: 20 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69    for lLineOpt i
0ae0: 6e 20 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20  n lOpt:.        
0af0: 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20      for sOpt in 
0b00: 6c 4c 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20  lLineOpt:.      
0b10: 20 20 20 20 20 20 20 20 20 20 73 48 54 4d 4c 20            sHTML 
0b20: 2b 3d 20 27 20 20 3c 70 3e 3c 69 6e 70 75 74 20  += '  <p><input 
0b30: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
0b40: 69 64 3d 22 6f 70 74 69 6f 6e 5f 27 2b 73 4f 70  id="option_'+sOp
0b50: 74 2b 27 22 20 2f 3e 3c 6c 61 62 65 6c 20 69 64  t+'" /><label id
0b60: 3d 22 6f 70 74 69 6f 6e 5f 6c 61 62 65 6c 5f 27  ="option_label_'
0b70: 2b 73 4f 70 74 2b 27 22 20 66 6f 72 3d 22 6f 70  +sOpt+'" for="op
0b80: 74 69 6f 6e 5f 27 2b 73 4f 70 74 2b 27 22 20 64  tion_'+sOpt+'" d
0b90: 61 74 61 2d 6c 31 30 6e 2d 69 64 3d 22 6f 70 74  ata-l10n-id="opt
0ba0: 69 6f 6e 5f 27 2b 73 4f 70 74 2b 27 22 3e 3c 2f  ion_'+sOpt+'"></
0bb0: 6c 61 62 65 6c 3e 3c 2f 70 3e 5c 6e 27 0a 20 20  label></p>\n'.  
0bc0: 20 20 20 20 20 20 73 48 54 4d 4c 20 2b 3d 20 27        sHTML += '
0bd0: 3c 2f 64 69 76 3e 5c 6e 27 0a 20 20 20 20 23 20  </div>\n'.    # 
0be0: 43 72 65 61 74 69 6e 67 20 74 72 61 6e 73 6c 61  Creating transla
0bf0: 74 69 6f 6e 20 64 61 74 61 0a 20 20 20 20 64 50  tion data.    dP
0c00: 72 6f 70 65 72 74 69 65 73 20 3d 20 7b 7d 0a 20  roperties = {}. 
0c10: 20 20 20 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20     for sLang in 
0c20: 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c  dVars['dOptLabel
0c30: 27 5d 2e 6b 65 79 73 28 29 3a 0a 20 20 20 20 20  '].keys():.     
0c40: 20 20 20 64 50 72 6f 70 65 72 74 69 65 73 5b 73     dProperties[s
0c50: 4c 61 6e 67 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69  Lang] = "\n".joi
0c60: 6e 28 20 5b 20 22 6f 70 74 69 6f 6e 5f 22 20 2b  n( [ "option_" +
0c70: 20 73 4f 70 74 20 2b 20 22 20 3d 20 22 20 2b 20   sOpt + " = " + 
0c80: 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c  dVars['dOptLabel
0c90: 27 5d 5b 73 4c 61 6e 67 5d 5b 73 4f 70 74 5d 5b  '][sLang][sOpt][
0ca0: 30 5d 2e 72 65 70 6c 61 63 65 28 22 20 5b 21 5d  0].replace(" [!]
0cb0: 22 2c 20 22 e2 80 af 5b 21 5d 22 29 20 20 66 6f  ", "...[!]")  fo
0cc0: 72 20 73 4f 70 74 20 69 6e 20 64 56 61 72 73 5b  r sOpt in dVars[
0cd0: 27 64 4f 70 74 4c 61 62 65 6c 27 5d 5b 73 4c 61  'dOptLabel'][sLa
0ce0: 6e 67 5d 20 5d 20 29 0a 20 20 20 20 72 65 74 75  ng] ] ).    retu
0cf0: 72 6e 20 73 48 54 4d 4c 2c 20 64 50 72 6f 70 65  rn sHTML, dPrope
0d00: 72 74 69 65 73 0a 0a 0a 64 65 66 20 63 72 65 61  rties...def crea
0d10: 74 65 54 68 75 6e 64 65 72 62 69 72 64 45 78 74  teThunderbirdExt
0d20: 65 6e 73 69 6f 6e 20 28 73 4c 61 6e 67 2c 20 64  ension (sLang, d
0d30: 56 61 72 73 2c 20 73 70 4c 61 6e 67 50 61 63 6b  Vars, spLangPack
0d40: 29 3a 0a 20 20 20 20 22 63 72 65 61 74 65 20 65  ):.    "create e
0d50: 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 54 68 75  xtension for Thu
0d60: 6e 64 65 72 62 69 72 64 22 0a 20 20 20 20 70 72  nderbird".    pr
0d70: 69 6e 74 28 22 42 75 69 6c 64 69 6e 67 20 65 78  int("Building ex
0d80: 74 65 6e 73 69 6f 6e 20 66 6f 72 20 54 68 75 6e  tension for Thun
0d90: 64 65 72 62 69 72 64 22 29 0a 20 20 20 20 73 45  derbird").    sE
0da0: 78 74 65 6e 73 69 6f 6e 4e 61 6d 65 20 3d 20 64  xtensionName = d
0db0: 56 61 72 73 5b 27 74 62 5f 69 64 65 6e 74 69 66  Vars['tb_identif
0dc0: 69 65 72 27 5d 20 2b 20 22 2d 76 22 20 2b 20 64  ier'] + "-v" + d
0dd0: 56 61 72 73 5b 27 76 65 72 73 69 6f 6e 27 5d 20  Vars['version'] 
0de0: 2b 20 27 2e 78 70 69 27 0a 20 20 20 20 73 70 66  + '.xpi'.    spf
0df0: 5a 69 70 20 3d 20 22 5f 62 75 69 6c 64 2f 22 20  Zip = "_build/" 
0e00: 2b 20 73 45 78 74 65 6e 73 69 6f 6e 4e 61 6d 65  + sExtensionName
0e10: 0a 20 20 20 20 68 5a 69 70 20 3d 20 7a 69 70 66  .    hZip = zipf
0e20: 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a  ile.ZipFile(spfZ
0e30: 69 70 2c 20 6d 6f 64 65 3d 27 77 27 2c 20 63 6f  ip, mode='w', co
0e40: 6d 70 72 65 73 73 69 6f 6e 3d 7a 69 70 66 69 6c  mpression=zipfil
0e50: 65 2e 5a 49 50 5f 44 45 46 4c 41 54 45 44 29 0a  e.ZIP_DEFLATED).
0e60: 20 20 20 20 5f 63 6f 70 79 47 72 61 6d 6d 61 6c      _copyGrammal
0e70: 65 63 74 65 4a 53 50 61 63 6b 61 67 65 49 6e 5a  ecteJSPackageInZ
0e80: 69 70 46 69 6c 65 28 68 5a 69 70 2c 20 73 70 4c  ipFile(hZip, spL
0e90: 61 6e 67 50 61 63 6b 2c 20 64 56 61 72 73 5b 27  angPack, dVars['
0ea0: 64 69 63 5f 66 69 6c 65 6e 61 6d 65 27 5d 2b 22  dic_filename']+"
0eb0: 2e 6a 73 6f 6e 22 29 0a 20 20 20 20 66 6f 72 20  .json").    for 
0ec0: 73 70 66 20 69 6e 20 5b 22 4c 49 43 45 4e 53 45  spf in ["LICENSE
0ed0: 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45 2e  .txt", "LICENSE.
0ee0: 66 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20 20 20  fr.txt"]:.      
0ef0: 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 66    hZip.write(spf
0f00: 29 0a 20 20 20 20 64 56 61 72 73 20 3d 20 5f 63  ).    dVars = _c
0f10: 72 65 61 74 65 4f 70 74 69 6f 6e 73 46 6f 72 54  reateOptionsForT
0f20: 68 75 6e 64 65 72 62 69 72 64 28 64 56 61 72 73  hunderbird(dVars
0f30: 29 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 61 64  ).    helpers.ad
0f40: 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64 46  dFolderToZipAndF
0f50: 69 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20 22 67  ileFile(hZip, "g
0f60: 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 2b 22  c_lang/"+sLang+"
0f70: 2f 74 62 22 2c 20 22 22 2c 20 64 56 61 72 73 2c  /tb", "", dVars,
0f80: 20 54 72 75 65 29 0a 20 20 20 20 73 70 44 69 63   True).    spDic
0f90: 74 20 3d 20 22 67 63 5f 6c 61 6e 67 2f 22 2b 73  t = "gc_lang/"+s
0fa0: 4c 61 6e 67 2b 22 2f 78 70 69 2f 64 61 74 61 2f  Lang+"/xpi/data/
0fb0: 64 69 63 74 69 6f 6e 61 72 69 65 73 22 0a 20 20  dictionaries".  
0fc0: 20 20 66 6f 72 20 73 70 20 69 6e 20 6f 73 2e 6c    for sp in os.l
0fd0: 69 73 74 64 69 72 28 73 70 44 69 63 74 29 3a 0a  istdir(spDict):.
0fe0: 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61          if os.pa
0ff0: 74 68 2e 69 73 64 69 72 28 73 70 44 69 63 74 2b  th.isdir(spDict+
1000: 22 2f 22 2b 73 70 29 3a 0a 20 20 20 20 20 20 20  "/"+sp):.       
1010: 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28       hZip.write(
1020: 73 70 44 69 63 74 2b 22 2f 22 2b 73 70 2b 22 2f  spDict+"/"+sp+"/
1030: 22 2b 73 70 2b 22 2e 64 69 63 22 2c 20 22 63 6f  "+sp+".dic", "co
1040: 6e 74 65 6e 74 2f 64 69 63 74 69 6f 6e 61 72 69  ntent/dictionari
1050: 65 73 2f 22 2b 73 70 2b 22 2f 22 2b 73 70 2b 22  es/"+sp+"/"+sp+"
1060: 2e 64 69 63 22 29 0a 20 20 20 20 20 20 20 20 20  .dic").         
1070: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70     hZip.write(sp
1080: 44 69 63 74 2b 22 2f 22 2b 73 70 2b 22 2f 22 2b  Dict+"/"+sp+"/"+
1090: 73 70 2b 22 2e 61 66 66 22 2c 20 22 63 6f 6e 74  sp+".aff", "cont
10a0: 65 6e 74 2f 64 69 63 74 69 6f 6e 61 72 69 65 73  ent/dictionaries
10b0: 2f 22 2b 73 70 2b 22 2f 22 2b 73 70 2b 22 2e 61  /"+sp+"/"+sp+".a
10c0: 66 66 22 29 0a 20 20 20 20 68 5a 69 70 2e 63 6c  ff").    hZip.cl
10d0: 6f 73 65 28 29 0a 20 20 20 20 68 65 6c 70 65 72  ose().    helper
10e0: 73 2e 75 6e 7a 69 70 28 73 70 66 5a 69 70 2c 20  s.unzip(spfZip, 
10f0: 64 56 61 72 73 5b 27 74 62 5f 64 65 62 75 67 5f  dVars['tb_debug_
1100: 65 78 74 65 6e 73 69 6f 6e 5f 70 61 74 68 27 5d  extension_path']
1110: 29 0a 0a 0a 64 65 66 20 5f 63 72 65 61 74 65 4f  )...def _createO
1120: 70 74 69 6f 6e 73 46 6f 72 54 68 75 6e 64 65 72  ptionsForThunder
1130: 62 69 72 64 20 28 64 56 61 72 73 29 3a 0a 20 20  bird (dVars):.  
1140: 20 20 64 56 61 72 73 5b 27 73 58 55 4c 54 61 62    dVars['sXULTab
1150: 73 27 5d 20 3d 20 22 22 0a 20 20 20 20 64 56 61  s'] = "".    dVa
1160: 72 73 5b 27 73 58 55 4c 54 61 62 50 61 6e 65 6c  rs['sXULTabPanel
1170: 73 27 5d 20 3d 20 22 22 0a 20 20 20 20 23 20 64  s'] = "".    # d
1180: 69 61 6c 6f 67 20 6f 70 74 69 6f 6e 73 0a 20 20  ialog options.  
1190: 20 20 66 6f 72 20 73 53 65 63 74 69 6f 6e 2c 20    for sSection, 
11a0: 6c 4f 70 74 20 69 6e 20 64 56 61 72 73 5b 27 6c  lOpt in dVars['l
11b0: 53 74 72 75 63 74 4f 70 74 27 5d 3a 0a 20 20 20  StructOpt']:.   
11c0: 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c       dVars['sXUL
11d0: 54 61 62 73 27 5d 20 2b 3d 20 27 20 20 20 20 3c  Tabs'] += '    <
11e0: 74 61 62 20 6c 61 62 65 6c 3d 22 26 6f 70 74 69  tab label="&opti
11f0: 6f 6e 2e 6c 61 62 65 6c 2e 27 2b 73 53 65 63 74  on.label.'+sSect
1200: 69 6f 6e 2b 27 3b 22 2f 3e 5c 6e 27 0a 20 20 20  ion+';"/>\n'.   
1210: 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c       dVars['sXUL
1220: 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d 20 27  TabPanels'] += '
1230: 20 20 20 20 3c 74 61 62 70 61 6e 65 6c 20 6f 72      <tabpanel or
1240: 69 65 6e 74 3d 22 76 65 72 74 69 63 61 6c 22 3e  ient="vertical">
1250: 5c 6e 20 20 20 20 20 20 3c 6c 61 62 65 6c 20 63  \n      <label c
1260: 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 20 76  lass="section" v
1270: 61 6c 75 65 3d 22 26 6f 70 74 69 6f 6e 2e 6c 61  alue="&option.la
1280: 62 65 6c 2e 27 2b 73 53 65 63 74 69 6f 6e 2b 27  bel.'+sSection+'
1290: 3b 22 20 2f 3e 5c 6e 27 0a 20 20 20 20 20 20 20  ;" />\n'.       
12a0: 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69 6e   for lLineOpt in
12b0: 20 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20 20   lOpt:.         
12c0: 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20 6c     for sOpt in l
12d0: 4c 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20 20  LineOpt:.       
12e0: 20 20 20 20 20 20 20 20 20 64 56 61 72 73 5b 27           dVars['
12f0: 73 58 55 4c 54 61 62 50 61 6e 65 6c 73 27 5d 20  sXULTabPanels'] 
1300: 2b 3d 20 27 20 20 20 20 20 20 3c 63 68 65 63 6b  += '      <check
1310: 62 6f 78 20 69 64 3d 22 6f 70 74 69 6f 6e 5f 27  box id="option_'
1320: 2b 73 4f 70 74 2b 27 22 20 63 6c 61 73 73 3d 22  +sOpt+'" class="
1330: 6f 70 74 69 6f 6e 22 20 6c 61 62 65 6c 3d 22 26  option" label="&
1340: 6f 70 74 69 6f 6e 2e 6c 61 62 65 6c 2e 27 2b 73  option.label.'+s
1350: 4f 70 74 2b 27 3b 22 20 2f 3e 5c 6e 27 0a 20 20  Opt+';" />\n'.  
1360: 20 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55        dVars['sXU
1370: 4c 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d 20  LTabPanels'] += 
1380: 27 20 20 20 20 3c 2f 74 61 62 70 61 6e 65 6c 3e  '    </tabpanel>
1390: 5c 6e 27 0a 20 20 20 20 23 20 74 72 61 6e 73 6c  \n'.    # transl
13a0: 61 74 69 6f 6e 20 64 61 74 61 0a 20 20 20 20 66  ation data.    f
13b0: 6f 72 20 73 4c 61 6e 67 20 69 6e 20 64 56 61 72  or sLang in dVar
13c0: 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d 2e 6b  s['dOptLabel'].k
13d0: 65 79 73 28 29 3a 0a 20 20 20 20 20 20 20 20 64  eys():.        d
13e0: 56 61 72 73 5b 27 67 63 5f 6f 70 74 69 6f 6e 73  Vars['gc_options
13f0: 5f 6c 61 62 65 6c 73 5f 27 2b 73 4c 61 6e 67 5d  _labels_'+sLang]
1400: 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 20 5b 20   = "\n".join( [ 
1410: 22 3c 21 45 4e 54 49 54 59 20 6f 70 74 69 6f 6e  "<!ENTITY option
1420: 2e 6c 61 62 65 6c 2e 22 20 2b 20 73 4f 70 74 20  .label." + sOpt 
1430: 2b 20 27 20 22 27 20 2b 20 64 56 61 72 73 5b 27  + ' "' + dVars['
1440: 64 4f 70 74 4c 61 62 65 6c 27 5d 5b 73 4c 61 6e  dOptLabel'][sLan
1450: 67 5d 5b 73 4f 70 74 5d 5b 30 5d 20 2b 20 27 22  g][sOpt][0] + '"
1460: 3e 27 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20  >'  for sOpt in 
1470: 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c  dVars['dOptLabel
1480: 27 5d 5b 73 4c 61 6e 67 5d 20 5d 20 29 0a 20 20  '][sLang] ] ).  
1490: 20 20 72 65 74 75 72 6e 20 64 56 61 72 73 0a 0a    return dVars..
14a0: 0a 64 65 66 20 5f 63 6f 70 79 47 72 61 6d 6d 61  .def _copyGramma
14b0: 6c 65 63 74 65 4a 53 50 61 63 6b 61 67 65 49 6e  lecteJSPackageIn
14c0: 5a 69 70 46 69 6c 65 20 28 68 5a 69 70 2c 20 73  ZipFile (hZip, s
14d0: 70 4c 61 6e 67 50 61 63 6b 2c 20 73 44 69 63 4e  pLangPack, sDicN
14e0: 61 6d 65 2c 20 73 41 64 64 50 61 74 68 3d 22 22  ame, sAddPath=""
14f0: 29 3a 0a 20 20 20 20 66 6f 72 20 73 66 20 69 6e  ):.    for sf in
1500: 20 6f 73 2e 6c 69 73 74 64 69 72 28 22 67 72 61   os.listdir("gra
1510: 6d 6d 61 6c 65 63 74 65 2d 6a 73 22 29 3a 0a 20  mmalecte-js"):. 
1520: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
1530: 2e 70 61 74 68 2e 69 73 64 69 72 28 22 67 72 61  .path.isdir("gra
1540: 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66  mmalecte-js/"+sf
1550: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ):.            h
1560: 5a 69 70 2e 77 72 69 74 65 28 22 67 72 61 6d 6d  Zip.write("gramm
1570: 61 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66 2c 20  alecte-js/"+sf, 
1580: 73 41 64 64 50 61 74 68 2b 22 67 72 61 6d 6d 61  sAddPath+"gramma
1590: 6c 65 63 74 65 2d 6a 73 2f 22 2b 73 66 29 0a 20  lecte-js/"+sf). 
15a0: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
15b0: 6c 69 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c  listdir("grammal
15c0: 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65  ecte-js/graphspe
15d0: 6c 6c 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  ll"):.        if
15e0: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
15f0: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  ir("grammalecte-
1600: 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  js/graphspell/"+
1610: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
1620: 20 68 5a 69 70 2e 77 72 69 74 65 28 22 67 72 61   hZip.write("gra
1630: 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70  mmalecte-js/grap
1640: 68 73 70 65 6c 6c 2f 22 2b 73 66 2c 20 73 41 64  hspell/"+sf, sAd
1650: 64 50 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63  dPath+"grammalec
1660: 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c  te-js/graphspell
1670: 2f 22 2b 73 66 29 0a 20 20 20 20 68 5a 69 70 2e  /"+sf).    hZip.
1680: 77 72 69 74 65 28 22 67 72 61 6d 6d 61 6c 65 63  write("grammalec
1690: 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c  te-js/graphspell
16a0: 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22  /_dictionaries/"
16b0: 2b 73 44 69 63 4e 61 6d 65 2c 20 73 41 64 64 50  +sDicName, sAddP
16c0: 61 74 68 2b 22 67 72 61 6d 6d 61 6c 65 63 74 65  ath+"grammalecte
16d0: 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 5f  -js/graphspell/_
16e0: 64 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73  dictionaries/"+s
16f0: 44 69 63 4e 61 6d 65 29 0a 20 20 20 20 66 6f 72  DicName).    for
1700: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
1710: 72 28 73 70 4c 61 6e 67 50 61 63 6b 29 3a 0a 20  r(spLangPack):. 
1720: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
1730: 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70 4c 61  .path.isdir(spLa
1740: 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 29 3a 0a  ngPack+"/"+sf):.
1750: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
1760: 2e 77 72 69 74 65 28 73 70 4c 61 6e 67 50 61 63  .write(spLangPac
1770: 6b 2b 22 2f 22 2b 73 66 2c 20 73 41 64 64 50 61  k+"/"+sf, sAddPa
1780: 74 68 2b 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f  th+spLangPack+"/
1790: 22 2b 73 66 29 0a                                "+sf).