2 # -*- coding: utf-8 -*-
4 # Copyright 2007 Zuza Software Foundation
6 # This file is part of translate.
8 # translate is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 """This module provides functionality to work with zip files."""
24 # Perhaps all methods should work with a wildcard to limit searches in some
25 # way (examples: *.po, base.xlf, pootle-terminology.tbx)
27 #TODO: consider also providing directories as we currently provide files
29 #TODO: refactor with existing zip code (xpi.py, etc.)
31 from translate
.storage
import factory
32 from translate
.storage
import directory
33 from translate
.misc
import wStringIO
35 from zipfile
import ZipFile
37 class ZIPFile(directory
.Directory
):
38 """This class represents a ZIP file like a directory."""
39 def __init__(self
, filename
=None):
40 self
.filename
= filename
44 """Iterator over all the units in all the files in this zip file."""
45 for dirname
, filename
in self
.file_iter():
46 strfile
= wStringIO
.StringIO(self
.archive
.read(path
.join(dirname
, filename
)))
47 strfile
.filename
= filename
48 store
= factory
.getobject(strfile
)
49 #TODO: don't regenerate all the storage objects
50 for unit
in store
.unit_iter():
54 """Populate the internal file data."""
56 self
.archive
= ZipFile(self
.filename
)
57 for completename
in self
.archive
.namelist():
58 dir, name
= path
.split(completename
)
59 self
.filedata
.append((dir, name
))