Grammalecte  Hex Artifact Content

Artifact ea0f7f998ef466f42129a15ab7e079c051ab82090536bb5e6d239f4521843563:


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 29 0a 20 20 20 20 66 6f 72  angPack).    for
0ea0: 20 73 70 66 20 69 6e 20 5b 22 4c 49 43 45 4e 53   spf in ["LICENS
0eb0: 45 2e 74 78 74 22 2c 20 22 4c 49 43 45 4e 53 45  E.txt", "LICENSE
0ec0: 2e 66 72 2e 74 78 74 22 5d 3a 0a 20 20 20 20 20  .fr.txt"]:.     
0ed0: 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70     hZip.write(sp
0ee0: 66 29 0a 20 20 20 20 64 56 61 72 73 20 3d 20 5f  f).    dVars = _
0ef0: 63 72 65 61 74 65 4f 70 74 69 6f 6e 73 46 6f 72  createOptionsFor
0f00: 54 68 75 6e 64 65 72 62 69 72 64 28 64 56 61 72  Thunderbird(dVar
0f10: 73 29 0a 20 20 20 20 68 65 6c 70 65 72 73 2e 61  s).    helpers.a
0f20: 64 64 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64  ddFolderToZipAnd
0f30: 46 69 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20 22  FileFile(hZip, "
0f40: 67 63 5f 6c 61 6e 67 2f 22 2b 73 4c 61 6e 67 2b  gc_lang/"+sLang+
0f50: 22 2f 74 62 22 2c 20 22 22 2c 20 64 56 61 72 73  "/tb", "", dVars
0f60: 2c 20 54 72 75 65 29 0a 20 20 20 20 73 70 44 69  , True).    spDi
0f70: 63 74 20 3d 20 22 67 63 5f 6c 61 6e 67 2f 22 2b  ct = "gc_lang/"+
0f80: 73 4c 61 6e 67 2b 22 2f 78 70 69 2f 64 61 74 61  sLang+"/xpi/data
0f90: 2f 64 69 63 74 69 6f 6e 61 72 69 65 73 22 0a 20  /dictionaries". 
0fa0: 20 20 20 66 6f 72 20 73 70 20 69 6e 20 6f 73 2e     for sp in os.
0fb0: 6c 69 73 74 64 69 72 28 73 70 44 69 63 74 29 3a  listdir(spDict):
0fc0: 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70  .        if os.p
0fd0: 61 74 68 2e 69 73 64 69 72 28 73 70 44 69 63 74  ath.isdir(spDict
0fe0: 2b 22 2f 22 2b 73 70 29 3a 0a 20 20 20 20 20 20  +"/"+sp):.      
0ff0: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1000: 28 73 70 44 69 63 74 2b 22 2f 22 2b 73 70 2b 22  (spDict+"/"+sp+"
1010: 2f 22 2b 73 70 2b 22 2e 64 69 63 22 2c 20 22 63  /"+sp+".dic", "c
1020: 6f 6e 74 65 6e 74 2f 64 69 63 74 69 6f 6e 61 72  ontent/dictionar
1030: 69 65 73 2f 22 2b 73 70 2b 22 2f 22 2b 73 70 2b  ies/"+sp+"/"+sp+
1040: 22 2e 64 69 63 22 29 0a 20 20 20 20 20 20 20 20  ".dic").        
1050: 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65 28 73      hZip.write(s
1060: 70 44 69 63 74 2b 22 2f 22 2b 73 70 2b 22 2f 22  pDict+"/"+sp+"/"
1070: 2b 73 70 2b 22 2e 61 66 66 22 2c 20 22 63 6f 6e  +sp+".aff", "con
1080: 74 65 6e 74 2f 64 69 63 74 69 6f 6e 61 72 69 65  tent/dictionarie
1090: 73 2f 22 2b 73 70 2b 22 2f 22 2b 73 70 2b 22 2e  s/"+sp+"/"+sp+".
10a0: 61 66 66 22 29 0a 20 20 20 20 68 5a 69 70 2e 63  aff").    hZip.c
10b0: 6c 6f 73 65 28 29 0a 20 20 20 20 68 65 6c 70 65  lose().    helpe
10c0: 72 73 2e 75 6e 7a 69 70 28 73 70 66 5a 69 70 2c  rs.unzip(spfZip,
10d0: 20 64 56 61 72 73 5b 27 74 62 5f 64 65 62 75 67   dVars['tb_debug
10e0: 5f 65 78 74 65 6e 73 69 6f 6e 5f 70 61 74 68 27  _extension_path'
10f0: 5d 29 0a 0a 0a 64 65 66 20 5f 63 72 65 61 74 65  ])...def _create
1100: 4f 70 74 69 6f 6e 73 46 6f 72 54 68 75 6e 64 65  OptionsForThunde
1110: 72 62 69 72 64 20 28 64 56 61 72 73 29 3a 0a 20  rbird (dVars):. 
1120: 20 20 20 64 56 61 72 73 5b 27 73 58 55 4c 54 61     dVars['sXULTa
1130: 62 73 27 5d 20 3d 20 22 22 0a 20 20 20 20 64 56  bs'] = "".    dV
1140: 61 72 73 5b 27 73 58 55 4c 54 61 62 50 61 6e 65  ars['sXULTabPane
1150: 6c 73 27 5d 20 3d 20 22 22 0a 20 20 20 20 23 20  ls'] = "".    # 
1160: 64 69 61 6c 6f 67 20 6f 70 74 69 6f 6e 73 0a 20  dialog options. 
1170: 20 20 20 66 6f 72 20 73 53 65 63 74 69 6f 6e 2c     for sSection,
1180: 20 6c 4f 70 74 20 69 6e 20 64 56 61 72 73 5b 27   lOpt in dVars['
1190: 6c 53 74 72 75 63 74 4f 70 74 27 5d 3a 0a 20 20  lStructOpt']:.  
11a0: 20 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55        dVars['sXU
11b0: 4c 54 61 62 73 27 5d 20 2b 3d 20 27 20 20 20 20  LTabs'] += '    
11c0: 3c 74 61 62 20 6c 61 62 65 6c 3d 22 26 6f 70 74  <tab label="&opt
11d0: 69 6f 6e 2e 6c 61 62 65 6c 2e 27 2b 73 53 65 63  ion.label.'+sSec
11e0: 74 69 6f 6e 2b 27 3b 22 2f 3e 5c 6e 27 0a 20 20  tion+';"/>\n'.  
11f0: 20 20 20 20 20 20 64 56 61 72 73 5b 27 73 58 55        dVars['sXU
1200: 4c 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d 20  LTabPanels'] += 
1210: 27 20 20 20 20 3c 74 61 62 70 61 6e 65 6c 20 6f  '    <tabpanel o
1220: 72 69 65 6e 74 3d 22 76 65 72 74 69 63 61 6c 22  rient="vertical"
1230: 3e 5c 6e 20 20 20 20 20 20 3c 6c 61 62 65 6c 20  >\n      <label 
1240: 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 20  class="section" 
1250: 76 61 6c 75 65 3d 22 26 6f 70 74 69 6f 6e 2e 6c  value="&option.l
1260: 61 62 65 6c 2e 27 2b 73 53 65 63 74 69 6f 6e 2b  abel.'+sSection+
1270: 27 3b 22 20 2f 3e 5c 6e 27 0a 20 20 20 20 20 20  ';" />\n'.      
1280: 20 20 66 6f 72 20 6c 4c 69 6e 65 4f 70 74 20 69    for lLineOpt i
1290: 6e 20 6c 4f 70 74 3a 0a 20 20 20 20 20 20 20 20  n lOpt:.        
12a0: 20 20 20 20 66 6f 72 20 73 4f 70 74 20 69 6e 20      for sOpt in 
12b0: 6c 4c 69 6e 65 4f 70 74 3a 0a 20 20 20 20 20 20  lLineOpt:.      
12c0: 20 20 20 20 20 20 20 20 20 20 64 56 61 72 73 5b            dVars[
12d0: 27 73 58 55 4c 54 61 62 50 61 6e 65 6c 73 27 5d  'sXULTabPanels']
12e0: 20 2b 3d 20 27 20 20 20 20 20 20 3c 63 68 65 63   += '      <chec
12f0: 6b 62 6f 78 20 69 64 3d 22 6f 70 74 69 6f 6e 5f  kbox id="option_
1300: 27 2b 73 4f 70 74 2b 27 22 20 63 6c 61 73 73 3d  '+sOpt+'" class=
1310: 22 6f 70 74 69 6f 6e 22 20 6c 61 62 65 6c 3d 22  "option" label="
1320: 26 6f 70 74 69 6f 6e 2e 6c 61 62 65 6c 2e 27 2b  &option.label.'+
1330: 73 4f 70 74 2b 27 3b 22 20 2f 3e 5c 6e 27 0a 20  sOpt+';" />\n'. 
1340: 20 20 20 20 20 20 20 64 56 61 72 73 5b 27 73 58         dVars['sX
1350: 55 4c 54 61 62 50 61 6e 65 6c 73 27 5d 20 2b 3d  ULTabPanels'] +=
1360: 20 27 20 20 20 20 3c 2f 74 61 62 70 61 6e 65 6c   '    </tabpanel
1370: 3e 5c 6e 27 0a 20 20 20 20 23 20 74 72 61 6e 73  >\n'.    # trans
1380: 6c 61 74 69 6f 6e 20 64 61 74 61 0a 20 20 20 20  lation data.    
1390: 66 6f 72 20 73 4c 61 6e 67 20 69 6e 20 64 56 61  for sLang in dVa
13a0: 72 73 5b 27 64 4f 70 74 4c 61 62 65 6c 27 5d 2e  rs['dOptLabel'].
13b0: 6b 65 79 73 28 29 3a 0a 20 20 20 20 20 20 20 20  keys():.        
13c0: 64 56 61 72 73 5b 27 67 63 5f 6f 70 74 69 6f 6e  dVars['gc_option
13d0: 73 5f 6c 61 62 65 6c 73 5f 27 2b 73 4c 61 6e 67  s_labels_'+sLang
13e0: 5d 20 3d 20 22 5c 6e 22 2e 6a 6f 69 6e 28 20 5b  ] = "\n".join( [
13f0: 20 22 3c 21 45 4e 54 49 54 59 20 6f 70 74 69 6f   "<!ENTITY optio
1400: 6e 2e 6c 61 62 65 6c 2e 22 20 2b 20 73 4f 70 74  n.label." + sOpt
1410: 20 2b 20 27 20 22 27 20 2b 20 64 56 61 72 73 5b   + ' "' + dVars[
1420: 27 64 4f 70 74 4c 61 62 65 6c 27 5d 5b 73 4c 61  'dOptLabel'][sLa
1430: 6e 67 5d 5b 73 4f 70 74 5d 5b 30 5d 20 2b 20 27  ng][sOpt][0] + '
1440: 22 3e 27 20 20 66 6f 72 20 73 4f 70 74 20 69 6e  ">'  for sOpt in
1450: 20 64 56 61 72 73 5b 27 64 4f 70 74 4c 61 62 65   dVars['dOptLabe
1460: 6c 27 5d 5b 73 4c 61 6e 67 5d 20 5d 20 29 0a 20  l'][sLang] ] ). 
1470: 20 20 20 72 65 74 75 72 6e 20 64 56 61 72 73 0a     return dVars.
1480: 0a 0a 64 65 66 20 5f 63 6f 70 79 47 72 61 6d 6d  ..def _copyGramm
1490: 61 6c 65 63 74 65 4a 53 50 61 63 6b 61 67 65 49  alecteJSPackageI
14a0: 6e 5a 69 70 46 69 6c 65 20 28 68 5a 69 70 2c 20  nZipFile (hZip, 
14b0: 73 70 4c 61 6e 67 50 61 63 6b 2c 20 73 41 64 64  spLangPack, sAdd
14c0: 50 61 74 68 3d 22 22 29 3a 0a 20 20 20 20 66 6f  Path=""):.    fo
14d0: 72 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64  r sf in os.listd
14e0: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  ir("grammalecte-
14f0: 6a 73 22 29 3a 0a 20 20 20 20 20 20 20 20 69 66  js"):.        if
1500: 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64   not os.path.isd
1510: 69 72 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  ir("grammalecte-
1520: 6a 73 2f 22 2b 73 66 29 3a 0a 20 20 20 20 20 20  js/"+sf):.      
1530: 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69 74 65        hZip.write
1540: 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73  ("grammalecte-js
1550: 2f 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b  /"+sf, sAddPath+
1560: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
1570: 22 2b 73 66 29 0a 20 20 20 20 66 6f 72 20 73 66  "+sf).    for sf
1580: 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69 72 28 22   in os.listdir("
1590: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67  grammalecte-js/g
15a0: 72 61 70 68 73 70 65 6c 6c 22 29 3a 0a 20 20 20  raphspell"):.   
15b0: 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70       if not os.p
15c0: 61 74 68 2e 69 73 64 69 72 28 22 67 72 61 6d 6d  ath.isdir("gramm
15d0: 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61 70 68 73  alecte-js/graphs
15e0: 70 65 6c 6c 2f 22 2b 73 66 29 3a 0a 20 20 20 20  pell/"+sf):.    
15f0: 20 20 20 20 20 20 20 20 68 5a 69 70 2e 77 72 69          hZip.wri
1600: 74 65 28 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d  te("grammalecte-
1610: 6a 73 2f 67 72 61 70 68 73 70 65 6c 6c 2f 22 2b  js/graphspell/"+
1620: 73 66 2c 20 73 41 64 64 50 61 74 68 2b 22 67 72  sf, sAddPath+"gr
1630: 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67 72 61  ammalecte-js/gra
1640: 70 68 73 70 65 6c 6c 2f 22 2b 73 66 29 0a 20 20  phspell/"+sf).  
1650: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
1660: 69 73 74 64 69 72 28 22 67 72 61 6d 6d 61 6c 65  istdir("grammale
1670: 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c  cte-js/graphspel
1680: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 22  l/_dictionaries"
1690: 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  ):.        if no
16a0: 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72 28  t os.path.isdir(
16b0: 22 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f  "grammalecte-js/
16c0: 67 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74  graphspell/_dict
16d0: 69 6f 6e 61 72 69 65 73 2f 22 2b 73 66 29 3a 0a  ionaries/"+sf):.
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69 70              hZip
16f0: 2e 77 72 69 74 65 28 22 67 72 61 6d 6d 61 6c 65  .write("grammale
1700: 63 74 65 2d 6a 73 2f 67 72 61 70 68 73 70 65 6c  cte-js/graphspel
1710: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  l/_dictionaries/
1720: 22 2b 73 66 2c 20 73 41 64 64 50 61 74 68 2b 22  "+sf, sAddPath+"
1730: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 6a 73 2f 67  grammalecte-js/g
1740: 72 61 70 68 73 70 65 6c 6c 2f 5f 64 69 63 74 69  raphspell/_dicti
1750: 6f 6e 61 72 69 65 73 2f 22 2b 73 66 29 0a 20 20  onaries/"+sf).  
1760: 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e 6c    for sf in os.l
1770: 69 73 74 64 69 72 28 73 70 4c 61 6e 67 50 61 63  istdir(spLangPac
1780: 6b 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e  k):.        if n
1790: 6f 74 20 6f 73 2e 70 61 74 68 2e 69 73 64 69 72  ot os.path.isdir
17a0: 28 73 70 4c 61 6e 67 50 61 63 6b 2b 22 2f 22 2b  (spLangPack+"/"+
17b0: 73 66 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  sf):.           
17c0: 20 68 5a 69 70 2e 77 72 69 74 65 28 73 70 4c 61   hZip.write(spLa
17d0: 6e 67 50 61 63 6b 2b 22 2f 22 2b 73 66 2c 20 73  ngPack+"/"+sf, s
17e0: 41 64 64 50 61 74 68 2b 73 70 4c 61 6e 67 50 61  AddPath+spLangPa
17f0: 63 6b 2b 22 2f 22 2b 73 66 29 0a                 ck+"/"+sf).