21from __future__
import print_function
24from defusedxml.sax
import make_parser
25from xml.sax
import handler
26from xml.sax.xmlreader
import InputSource
27import xml.sax.saxutils
29 from cStringIO
import StringIO
31 from io
import StringIO
33MANIFESTNS=
"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"
61 method = self.
elements.get(tag, (
None,
None))[0]
68 method = self.
elements.get(tag, (
None,
None))[1]
84 m = attrs.get((MANIFESTNS,
'media-type'),
"application/octet-stream")
85 p = attrs.get((MANIFESTNS,
'full-path'))
86 self.manifest[p] = {
'media-type':m,
'full-path':p }
95def manifestlist(manifestxml):
97 parser = make_parser()
98 parser.setFeature(handler.feature_namespaces, 1)
99 parser.setContentHandler(odhandler)
100 parser.setErrorHandler(handler.ErrorHandler())
102 inpsrc = InputSource()
103 if not isinstance(manifestxml, str):
104 manifestxml=manifestxml.decode(
"utf-8")
105 inpsrc.setByteStream(StringIO(manifestxml))
108 return odhandler.manifest
110def odfmanifest(odtfile):
111 z = zipfile.ZipFile(odtfile)
112 manifest = z.read(
'META-INF/manifest.xml')
114 return manifestlist(manifest)
116if __name__ ==
"__main__":
118 result = odfmanifest(sys.argv[1])
119 for file
in result.values():
120 print (
"%-40s %-40s" % (file[
'media-type'], file[
'full-path']))
The ODFManifestHandler parses a manifest file and produces a list of content.
donothing(self, tag, attrs=None)
unknown_endtag(self, tag)
handle_endtag(self, tag, method)
endElementNS(self, tag, qname)
s_file_entry(self, tag, attrs)
unknown_starttag(self, tag, attrs)
startElementNS(self, tag, qname, attrs)
handle_starttag(self, tag, method, attrs)