Grammalecte  Hex Artifact Content

Artifact 871d0d42386ea2f3d9621796265bf11c650830c5002a5f191a0d33bea8d772bf:


0000: 22 22 22 0a 54 6f 6f 6c 73 20 66 6f 72 20 68 61  """.Tools for ha
0010: 6e 64 6c 69 6e 67 20 66 69 6c 65 73 0a 22 22 22  ndling files."""
0020: 0a 0a 69 6d 70 6f 72 74 20 6f 73 0a 69 6d 70 6f  ..import os.impo
0030: 72 74 20 73 68 75 74 69 6c 0a 69 6d 70 6f 72 74  rt shutil.import
0040: 20 65 72 72 6e 6f 0a 69 6d 70 6f 72 74 20 7a 69   errno.import zi
0050: 70 66 69 6c 65 0a 0a 66 72 6f 6d 20 73 74 72 69  pfile..from stri
0060: 6e 67 20 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61  ng import Templa
0070: 74 65 0a 0a 0a 63 6c 61 73 73 20 43 44 3a 0a 20  te...class CD:. 
0080: 20 20 20 22 43 6f 6e 74 65 78 74 20 6d 61 6e 61     "Context mana
0090: 67 65 72 20 66 6f 72 20 63 68 61 6e 67 69 6e 67  ger for changing
00a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72   the current wor
00b0: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 22 0a  king directory".
00c0: 20 20 20 20 64 65 66 20 5f 5f 69 6e 69 74 5f 5f      def __init__
00d0: 20 28 73 65 6c 66 2c 20 6e 65 77 50 61 74 68 29   (self, newPath)
00e0: 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e  :.        self.n
00f0: 65 77 50 61 74 68 20 3d 20 6f 73 2e 70 61 74 68  ewPath = os.path
0100: 2e 65 78 70 61 6e 64 75 73 65 72 28 6e 65 77 50  .expanduser(newP
0110: 61 74 68 29 0a 20 20 20 20 20 20 20 20 73 65 6c  ath).        sel
0120: 66 2e 73 61 76 65 64 50 61 74 68 20 3d 20 22 22  f.savedPath = ""
0130: 0a 0a 20 20 20 20 64 65 66 20 5f 5f 65 6e 74 65  ..    def __ente
0140: 72 5f 5f 20 28 73 65 6c 66 29 3a 0a 20 20 20 20  r__ (self):.    
0150: 20 20 20 20 73 65 6c 66 2e 73 61 76 65 64 50 61      self.savedPa
0160: 74 68 20 3d 20 6f 73 2e 67 65 74 63 77 64 28 29  th = os.getcwd()
0170: 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68 64 69  .        os.chdi
0180: 72 28 73 65 6c 66 2e 6e 65 77 50 61 74 68 29 0a  r(self.newPath).
0190: 0a 20 20 20 20 64 65 66 20 5f 5f 65 78 69 74 5f  .    def __exit_
01a0: 5f 20 28 73 65 6c 66 2c 20 65 74 79 70 65 2c 20  _ (self, etype, 
01b0: 76 61 6c 75 65 2c 20 74 72 61 63 65 62 61 63 6b  value, traceback
01c0: 29 3a 0a 20 20 20 20 20 20 20 20 6f 73 2e 63 68  ):.        os.ch
01d0: 64 69 72 28 73 65 6c 66 2e 73 61 76 65 64 50 61  dir(self.savedPa
01e0: 74 68 29 0a 0a 0a 64 65 66 20 75 6e 7a 69 70 20  th)...def unzip 
01f0: 28 73 70 66 5a 69 70 2c 20 73 70 44 65 73 74 2c  (spfZip, spDest,
0200: 20 62 43 72 65 61 74 65 50 61 74 68 3d 46 61 6c   bCreatePath=Fal
0210: 73 65 29 3a 0a 20 20 20 20 22 75 6e 7a 69 70 20  se):.    "unzip 
0220: 66 69 6c 65 20 3c 73 70 66 5a 69 70 3e 20 61 74  file <spfZip> at
0230: 20 3c 73 70 66 44 65 73 74 3e 22 0a 20 20 20 20   <spfDest>".    
0240: 69 66 20 73 70 44 65 73 74 3a 0a 20 20 20 20 20  if spDest:.     
0250: 20 20 20 69 66 20 62 43 72 65 61 74 65 50 61 74     if bCreatePat
0260: 68 20 61 6e 64 20 6e 6f 74 20 6f 73 2e 70 61 74  h and not os.pat
0270: 68 2e 65 78 69 73 74 73 28 73 70 44 65 73 74 29  h.exists(spDest)
0280: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  :.            os
0290: 2e 6d 61 6b 65 64 69 72 73 28 73 70 44 65 73 74  .makedirs(spDest
02a0: 2c 20 65 78 69 73 74 5f 6f 6b 3d 54 72 75 65 29  , exist_ok=True)
02b0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
02c0: 3e 20 75 6e 7a 69 70 20 69 6e 3a 20 22 2b 20 73  > unzip in: "+ s
02d0: 70 44 65 73 74 29 0a 20 20 20 20 20 20 20 20 73  pDest).        s
02e0: 70 49 6e 73 74 61 6c 6c 20 3d 20 6f 73 2e 70 61  pInstall = os.pa
02f0: 74 68 2e 61 62 73 70 61 74 68 28 73 70 44 65 73  th.abspath(spDes
0300: 74 29 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73  t).        if os
0310: 2e 70 61 74 68 2e 69 73 64 69 72 28 73 70 49 6e  .path.isdir(spIn
0320: 73 74 61 6c 6c 29 3a 0a 20 20 20 20 20 20 20 20  stall):.        
0330: 20 20 20 20 65 72 61 73 65 46 6f 6c 64 65 72 28      eraseFolder(
0340: 73 70 49 6e 73 74 61 6c 6c 29 0a 20 20 20 20 20  spInstall).     
0350: 20 20 20 20 20 20 20 77 69 74 68 20 7a 69 70 66         with zipf
0360: 69 6c 65 2e 5a 69 70 46 69 6c 65 28 73 70 66 5a  ile.ZipFile(spfZ
0370: 69 70 29 20 61 73 20 68 5a 69 70 3a 0a 20 20 20  ip) as hZip:.   
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a 69               hZi
0390: 70 2e 65 78 74 72 61 63 74 61 6c 6c 28 73 70 44  p.extractall(spD
03a0: 65 73 74 29 0a 20 20 20 20 20 20 20 20 65 6c 73  est).        els
03b0: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e:.            p
03c0: 72 69 6e 74 28 22 23 20 66 6f 6c 64 65 72 20 3c  rint("# folder <
03d0: 22 20 2b 20 73 70 44 65 73 74 20 2b 20 22 3e 20  " + spDest + "> 
03e0: 6e 6f 74 20 66 6f 75 6e 64 22 29 0a 20 20 20 20  not found").    
03f0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 70 72  else:.        pr
0400: 69 6e 74 28 22 70 61 74 68 20 64 65 73 74 69 6e  int("path destin
0410: 61 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 22 29  ation is empty")
0420: 0a 0a 0a 64 65 66 20 65 72 61 73 65 46 6f 6c 64  ...def eraseFold
0430: 65 72 20 28 73 70 29 3a 0a 20 20 20 20 22 65 72  er (sp):.    "er
0440: 61 73 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ase content of a
0450: 20 66 6f 6c 64 65 72 22 0a 20 20 20 20 66 6f 72   folder".    for
0460: 20 73 66 20 69 6e 20 6f 73 2e 6c 69 73 74 64 69   sf in os.listdi
0470: 72 28 73 70 29 3a 0a 20 20 20 20 20 20 20 20 73  r(sp):.        s
0480: 70 66 20 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69  pf = os.path.joi
0490: 6e 28 73 70 2c 20 73 66 29 0a 20 20 20 20 20 20  n(sp, sf).      
04a0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
04b0: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73     if os.path.is
04c0: 66 69 6c 65 28 73 70 66 29 3a 0a 20 20 20 20 20  file(spf):.     
04d0: 20 20 20 20 20 20 20 20 20 20 20 6f 73 2e 75 6e             os.un
04e0: 6c 69 6e 6b 28 73 70 66 29 0a 20 20 20 20 20 20  link(spf).      
04f0: 20 20 20 20 20 20 65 6c 69 66 20 6f 73 2e 70 61        elif os.pa
0500: 74 68 2e 69 73 64 69 72 28 73 70 66 29 3a 0a 20  th.isdir(spf):. 
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0520: 68 75 74 69 6c 2e 72 6d 74 72 65 65 28 73 70 66  hutil.rmtree(spf
0530: 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  ).        except
0540: 20 28 4f 53 45 72 72 6f 72 2c 20 73 68 75 74 69   (OSError, shuti
0550: 6c 2e 45 72 72 6f 72 29 20 61 73 20 65 3a 0a 20  l.Error) as e:. 
0560: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
0570: 28 65 29 0a 0a 0a 64 65 66 20 63 72 65 61 74 65  (e)...def create
0580: 43 6c 65 61 6e 46 6f 6c 64 65 72 20 28 73 70 29  CleanFolder (sp)
0590: 3a 0a 20 20 20 20 22 6d 61 6b 65 20 61 6e 20 65  :.    "make an e
05a0: 6d 70 74 79 20 66 6f 6c 64 65 72 20 6f 72 20 65  mpty folder or e
05b0: 72 61 73 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  rase its content
05c0: 20 69 66 20 6e 6f 74 20 65 6d 70 74 79 22 0a 20   if not empty". 
05d0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
05e0: 68 2e 65 78 69 73 74 73 28 73 70 29 3a 0a 20 20  h.exists(sp):.  
05f0: 20 20 20 20 20 20 6f 73 2e 6d 61 6b 65 64 69 72        os.makedir
0600: 73 28 73 70 2c 20 65 78 69 73 74 5f 6f 6b 3d 54  s(sp, exist_ok=T
0610: 72 75 65 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20  rue).    else:. 
0620: 20 20 20 20 20 20 20 65 72 61 73 65 46 6f 6c 64         eraseFold
0630: 65 72 28 73 70 29 0a 0a 0a 64 65 66 20 63 6f 70  er(sp)...def cop
0640: 79 46 6f 6c 64 65 72 43 6f 6e 74 65 6e 74 20 28  yFolderContent (
0650: 73 70 53 72 63 2c 20 73 70 44 73 74 29 3a 0a 20  spSrc, spDst):. 
0660: 20 20 20 22 63 6f 70 79 20 66 6f 6c 64 65 72 20     "copy folder 
0670: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 73 72 63  content from src
0680: 20 74 6f 20 64 73 74 22 0a 20 20 20 20 74 72 79   to dst".    try
0690: 3a 0a 20 20 20 20 20 20 20 20 73 68 75 74 69 6c  :.        shutil
06a0: 2e 63 6f 70 79 74 72 65 65 28 73 70 53 72 63 2c  .copytree(spSrc,
06b0: 20 73 70 44 73 74 29 0a 20 20 20 20 65 78 63 65   spDst).    exce
06c0: 70 74 20 4f 53 45 72 72 6f 72 20 61 73 20 65 3a  pt OSError as e:
06d0: 0a 20 20 20 20 20 20 20 20 69 66 20 65 2e 65 72  .        if e.er
06e0: 72 6e 6f 20 3d 3d 20 65 72 72 6e 6f 2e 45 4e 4f  rno == errno.ENO
06f0: 54 44 49 52 3a 0a 20 20 20 20 20 20 20 20 20 20  TDIR:.          
0700: 20 20 73 68 75 74 69 6c 2e 63 6f 70 79 28 73 70    shutil.copy(sp
0710: 53 72 63 2c 20 73 70 44 73 74 29 0a 20 20 20 20  Src, spDst).    
0720: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
0730: 20 20 20 20 20 20 72 61 69 73 65 0a 0a 0a 64 65        raise...de
0740: 66 20 6d 6f 76 65 46 6f 6c 64 65 72 43 6f 6e 74  f moveFolderCont
0750: 65 6e 74 20 28 73 70 53 72 63 2c 20 73 70 44 73  ent (spSrc, spDs
0760: 74 2c 20 73 50 72 65 66 69 78 3d 22 22 2c 20 62  t, sPrefix="", b
0770: 4c 6f 67 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20  Log=False):.    
0780: 22 6d 6f 76 65 20 66 6f 6c 64 65 72 20 63 6f 6e  "move folder con
0790: 74 65 6e 74 20 66 72 6f 6d 20 3c 73 70 53 72 63  tent from <spSrc
07a0: 3e 20 74 6f 20 3c 73 70 44 73 74 3e 3a 20 69 66  > to <spDst>: if
07b0: 20 66 69 6c 65 73 20 61 6c 72 65 61 64 79 20 65   files already e
07c0: 78 69 73 74 20 69 6e 20 3c 73 70 44 73 74 3e 2c  xist in <spDst>,
07d0: 20 74 68 65 79 20 61 72 65 20 72 65 70 6c 61 63   they are replac
07e0: 65 64 2e 20 28 6e 6f 74 20 72 65 63 75 72 73 69  ed. (not recursi
07f0: 76 65 29 22 0a 20 20 20 20 74 72 79 3a 0a 20 20  ve)".    try:.  
0800: 20 20 20 20 20 20 66 6f 72 20 73 66 20 69 6e 20        for sf in 
0810: 6f 73 2e 6c 69 73 74 64 69 72 28 73 70 53 72 63  os.listdir(spSrc
0820: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ):.            s
0830: 70 66 53 72 63 20 3d 20 6f 73 2e 70 61 74 68 2e  pfSrc = os.path.
0840: 6a 6f 69 6e 28 73 70 53 72 63 2c 20 73 66 29 0a  join(spSrc, sf).
0850: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6f              if o
0860: 73 2e 70 61 74 68 2e 69 73 66 69 6c 65 28 73 70  s.path.isfile(sp
0870: 66 53 72 63 29 3a 0a 20 20 20 20 20 20 20 20 20  fSrc):.         
0880: 20 20 20 20 20 20 20 73 70 66 44 73 74 20 3d 20         spfDst = 
0890: 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73 70 44  os.path.join(spD
08a0: 73 74 2c 20 73 50 72 65 66 69 78 20 2b 20 73 66  st, sPrefix + sf
08b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
08c0: 20 20 73 68 75 74 69 6c 2e 6d 6f 76 65 28 73 70    shutil.move(sp
08d0: 66 53 72 63 2c 20 73 70 66 44 73 74 29 0a 20 20  fSrc, spfDst).  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
08f0: 20 62 4c 6f 67 3a 0a 20 20 20 20 20 20 20 20 20   bLog:.         
0900: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
0910: 28 22 66 69 6c 65 20 3c 22 20 2b 20 73 70 66 53  ("file <" + spfS
0920: 72 63 20 2b 20 22 3e 20 6d 6f 76 65 64 20 74 6f  rc + "> moved to
0930: 20 3c 22 2b 73 70 66 44 73 74 2b 22 3e 22 29 0a   <"+spfDst+">").
0940: 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20      except:.    
0950: 20 20 20 20 72 61 69 73 65 0a 0a 0a 64 65 66 20      raise...def 
0960: 66 69 6c 65 46 69 6c 65 20 28 73 70 66 2c 20 64  fileFile (spf, d
0970: 56 61 72 73 29 3a 0a 20 20 20 20 22 72 65 74 75  Vars):.    "retu
0980: 72 6e 20 66 69 6c 65 20 3c 73 70 66 3e 20 61 73  rn file <spf> as
0990: 20 61 20 74 65 78 74 20 66 69 6c 65 64 20 77 69   a text filed wi
09a0: 74 68 20 76 61 72 69 61 62 6c 65 73 20 66 72 6f  th variables fro
09b0: 6d 20 3c 64 56 61 72 73 3e 22 0a 20 20 20 20 72  m <dVars>".    r
09c0: 65 74 75 72 6e 20 54 65 6d 70 6c 61 74 65 28 6f  eturn Template(o
09d0: 70 65 6e 28 73 70 66 2c 20 22 72 22 2c 20 65 6e  pen(spf, "r", en
09e0: 63 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e  coding="utf-8").
09f0: 72 65 61 64 28 29 29 2e 73 61 66 65 5f 73 75 62  read()).safe_sub
0a00: 73 74 69 74 75 74 65 28 64 56 61 72 73 29 0a 0a  stitute(dVars)..
0a10: 0a 64 65 66 20 63 6f 70 79 41 6e 64 46 69 6c 65  .def copyAndFile
0a20: 54 65 6d 70 6c 61 74 65 20 28 73 70 66 53 72 63  Template (spfSrc
0a30: 2c 20 73 70 66 44 73 74 2c 20 64 56 61 72 73 29  , spfDst, dVars)
0a40: 3a 0a 20 20 20 20 22 77 72 69 74 65 20 66 69 6c  :.    "write fil
0a50: 65 20 3c 73 70 66 53 72 63 3e 20 61 73 20 3c 73  e <spfSrc> as <s
0a60: 70 66 44 73 74 3e 20 77 69 74 68 20 76 61 72 69  pfDst> with vari
0a70: 61 62 6c 65 73 20 66 69 6c 65 64 20 77 69 74 68  ables filed with
0a80: 20 3c 64 56 61 72 73 3e 22 0a 20 20 20 20 73 20   <dVars>".    s 
0a90: 3d 20 54 65 6d 70 6c 61 74 65 28 6f 70 65 6e 28  = Template(open(
0aa0: 73 70 66 53 72 63 2c 20 22 72 22 2c 20 65 6e 63  spfSrc, "r", enc
0ab0: 6f 64 69 6e 67 3d 22 75 74 66 2d 38 22 29 2e 72  oding="utf-8").r
0ac0: 65 61 64 28 29 29 2e 73 61 66 65 5f 73 75 62 73  ead()).safe_subs
0ad0: 74 69 74 75 74 65 28 64 56 61 72 73 29 0a 20 20  titute(dVars).  
0ae0: 20 20 6f 70 65 6e 28 73 70 66 44 73 74 2c 20 22    open(spfDst, "
0af0: 77 22 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74  w", encoding="ut
0b00: 66 2d 38 22 2c 20 6e 65 77 6c 69 6e 65 3d 22 5c  f-8", newline="\
0b10: 6e 22 29 2e 77 72 69 74 65 28 73 29 0a 0a 0a 64  n").write(s)...d
0b20: 65 66 20 61 64 64 46 6f 6c 64 65 72 54 6f 5a 69  ef addFolderToZi
0b30: 70 41 6e 64 46 69 6c 65 46 69 6c 65 20 28 68 5a  pAndFileFile (hZ
0b40: 69 70 2c 20 73 70 53 72 63 2c 20 73 70 44 73 74  ip, spSrc, spDst
0b50: 2c 20 64 56 61 72 73 2c 20 62 52 65 63 75 72 73  , dVars, bRecurs
0b60: 69 76 65 29 3a 0a 20 20 20 20 22 61 64 64 20 66  ive):.    "add f
0b70: 6f 6c 64 65 72 20 63 6f 6e 74 65 6e 74 20 74 6f  older content to
0b80: 20 7a 69 70 20 61 72 63 68 69 76 65 20 61 6e 64   zip archive and
0b90: 20 66 69 6c 65 20 66 69 6c 65 73 20 77 69 74 68   file files with
0ba0: 20 3c 64 56 61 72 73 3e 22 0a 20 20 20 20 23 20   <dVars>".    # 
0bb0: 72 65 63 75 72 73 69 76 65 20 66 75 6e 63 74 69  recursive functi
0bc0: 6f 6e 0a 20 20 20 20 73 70 53 72 63 20 3d 20 73  on.    spSrc = s
0bd0: 70 53 72 63 2e 73 74 72 69 70 28 22 2f 20 22 29  pSrc.strip("/ ")
0be0: 0a 20 20 20 20 73 70 44 73 74 20 3d 20 73 70 44  .    spDst = spD
0bf0: 73 74 2e 73 74 72 69 70 28 22 2f 20 22 29 0a 20  st.strip("/ "). 
0c00: 20 20 20 66 6f 72 20 73 66 20 69 6e 20 6f 73 2e     for sf in os.
0c10: 6c 69 73 74 64 69 72 28 73 70 53 72 63 29 3a 0a  listdir(spSrc):.
0c20: 20 20 20 20 20 20 20 20 73 70 66 53 72 63 20 3d          spfSrc =
0c30: 20 28 73 70 53 72 63 20 2b 20 22 2f 22 20 2b 20   (spSrc + "/" + 
0c40: 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22 29 0a  sf).strip("/ ").
0c50: 20 20 20 20 20 20 20 20 73 70 66 44 73 74 20 3d          spfDst =
0c60: 20 28 73 70 44 73 74 20 2b 20 22 2f 22 20 2b 20   (spDst + "/" + 
0c70: 73 66 29 2e 73 74 72 69 70 28 22 2f 20 22 29 0a  sf).strip("/ ").
0c80: 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61          if os.pa
0c90: 74 68 2e 69 73 64 69 72 28 73 70 66 53 72 63 29  th.isdir(spfSrc)
0ca0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
0cb0: 20 62 52 65 63 75 72 73 69 76 65 3a 0a 20 20 20   bRecursive:.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
0cd0: 46 6f 6c 64 65 72 54 6f 5a 69 70 41 6e 64 46 69  FolderToZipAndFi
0ce0: 6c 65 46 69 6c 65 28 68 5a 69 70 2c 20 73 70 66  leFile(hZip, spf
0cf0: 53 72 63 2c 20 73 70 66 44 73 74 2c 20 64 56 61  Src, spfDst, dVa
0d00: 72 73 2c 20 62 52 65 63 75 72 73 69 76 65 29 0a  rs, bRecursive).
0d10: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
0d20: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 70 66            if spf
0d30: 53 72 63 2e 65 6e 64 73 77 69 74 68 28 28 22 2e  Src.endswith((".
0d40: 70 79 22 2c 20 22 2e 6a 73 22 2c 20 22 2e 6a 73  py", ".js", ".js
0d50: 6f 6e 22 2c 20 22 2e 63 73 73 22 2c 20 22 2e 78  on", ".css", ".x
0d60: 63 75 22 2c 20 22 2e 78 75 6c 22 2c 20 22 2e 72  cu", ".xul", ".r
0d70: 64 66 22 2c 20 22 2e 64 74 64 22 2c 20 22 2e 70  df", ".dtd", ".p
0d80: 72 6f 70 65 72 74 69 65 73 22 29 29 3a 0a 20 20  roperties")):.  
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 5a                hZ
0da0: 69 70 2e 77 72 69 74 65 73 74 72 28 73 70 66 44  ip.writestr(spfD
0db0: 73 74 2c 20 66 69 6c 65 46 69 6c 65 28 73 70 66  st, fileFile(spf
0dc0: 53 72 63 2c 20 64 56 61 72 73 29 29 0a 20 20 20  Src, dVars)).   
0dd0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20           else:. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0df0: 5a 69 70 2e 77 72 69 74 65 28 73 70 66 53 72 63  Zip.write(spfSrc
0e00: 2c 20 73 70 66 44 73 74 29 0a                    , spfDst).