diff options
author | Walter Bender <walter@sugarlabs.org> | 2013-12-31 14:54:14 (GMT) |
---|---|---|
committer | Walter Bender <walter@sugarlabs.org> | 2013-12-31 14:54:14 (GMT) |
commit | d77092d54685380c851e3587ddaf65a319f35b8e (patch) | |
tree | b496dc2015dd34b1808a0c8225fdf532e42aadf2 /util/odf/odfmanifest.py | |
parent | 264d888e7b14b59e10d109a6ee9ba357c0e85120 (diff) |
ODF export
Diffstat (limited to 'util/odf/odfmanifest.py')
-rw-r--r-- | util/odf/odfmanifest.py | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/util/odf/odfmanifest.py b/util/odf/odfmanifest.py new file mode 100644 index 0000000..07754fd --- /dev/null +++ b/util/odf/odfmanifest.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# This script lists the content of the manifest.xml file +import zipfile +from xml.sax import make_parser,handler +from xml.sax.xmlreader import InputSource +import xml.sax.saxutils +from cStringIO import StringIO + +MANIFESTNS="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" + +#----------------------------------------------------------------------------- +# +# ODFMANIFESTHANDLER +# +#----------------------------------------------------------------------------- + +class ODFManifestHandler(handler.ContentHandler): + """ The ODFManifestHandler parses a manifest file and produces a list of + content """ + + def __init__(self): + self.manifest = {} + + # Tags + # FIXME: Also handle encryption data + self.elements = { + (MANIFESTNS, 'file-entry'): (self.s_file_entry, self.donothing), + } + + def handle_starttag(self, tag, method, attrs): + method(tag,attrs) + + def handle_endtag(self, tag, method): + method(tag) + + def startElementNS(self, tag, qname, attrs): + method = self.elements.get(tag, (None, None))[0] + if method: + self.handle_starttag(tag, method, attrs) + else: + self.unknown_starttag(tag,attrs) + + def endElementNS(self, tag, qname): + method = self.elements.get(tag, (None, None))[1] + if method: + self.handle_endtag(tag, method) + else: + self.unknown_endtag(tag) + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag): + pass + + def donothing(self, tag, attrs=None): + pass + + def s_file_entry(self, tag, attrs): + m = attrs.get((MANIFESTNS, 'media-type'),"application/octet-stream") + p = attrs.get((MANIFESTNS, 'full-path')) + self.manifest[p] = { 'media-type':m, 'full-path':p } + + +#----------------------------------------------------------------------------- +# +# Reading the file +# +#----------------------------------------------------------------------------- + +def manifestlist(manifestxml): + odhandler = ODFManifestHandler() + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(odhandler) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(manifestxml)) + parser.parse(inpsrc) + + return odhandler.manifest + +def odfmanifest(odtfile): + z = zipfile.ZipFile(odtfile) + manifest = z.read('META-INF/manifest.xml') + z.close() + return manifestlist(manifest) + +if __name__ == "__main__": + import sys + result = odfmanifest(sys.argv[1]) + for file in result.values(): + print "%-40s %-40s" % (file['media-type'], file['full-path']) + |