home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import zipfile
- import re
- import xml.sax.saxutils as xml
- from cStringIO import StringIO
- from odf.namespaces import OFFICENS, DCNS, METANS
- from calibre.ebooks.metadata import MetaInformation, string_to_authors
- whitespace = re.compile('\\s+')
- fields = {
- 'title': (DCNS, u'title'),
- 'description': (DCNS, u'description'),
- 'subject': (DCNS, u'subject'),
- 'creator': (DCNS, u'creator'),
- 'date': (DCNS, u'date'),
- 'language': (DCNS, u'language'),
- 'generator': (METANS, u'generator'),
- 'initial-creator': (METANS, u'initial-creator'),
- 'keyword': (METANS, u'keyword'),
- 'editing-duration': (METANS, u'editing-duration'),
- 'editing-cycles': (METANS, u'editing-cycles'),
- 'printed-by': (METANS, u'printed-by'),
- 'print-date': (METANS, u'print-date'),
- 'creation-date': (METANS, u'creation-date'),
- 'user-defined': (METANS, u'user-defined') }
-
- def normalize(str):
- return whitespace.sub(' ', str).strip()
-
-
- class MetaCollector:
-
- def __init__(self):
- self._content = []
- self.dowrite = True
-
-
- def write(self, str):
- if self.dowrite:
- self._content.append(str)
-
-
-
- def content(self):
- return ''.join(self._content)
-
-
-
- class odfmetaparser(xml.sax.saxutils.XMLGenerator):
-
- def __init__(self, deletefields = { }, yieldfields = { }, addfields = { }):
- self.deletefields = deletefields
- self.yieldfields = yieldfields
- self.addfields = addfields
- self._mimetype = ''
- self.output = MetaCollector()
- self._data = []
- self.seenfields = { }
- xml.sax.saxutils.XMLGenerator.__init__(self, self.output, 'utf-8')
-
-
- def startElementNS(self, name, qname, attrs):
- self._data = []
- field = name
- if name == (METANS, u'user-defined'):
- field = attrs.get((METANS, u'name'))
-
- if field in self.deletefields:
- self.output.dowrite = False
- elif field in self.yieldfields:
- del self.addfields[field]
- xml.sax.saxutils.XMLGenerator.startElementNS(self, name, qname, attrs)
- else:
- xml.sax.saxutils.XMLGenerator.startElementNS(self, name, qname, attrs)
- self._tag = field
-
-
- def endElementNS(self, name, qname):
- field = name
- if name == (METANS, u'user-defined'):
- field = self._tag
-
- if name == (OFFICENS, u'meta'):
- for k, v in self.addfields.items():
- if len(v) > 0:
- if type(k) == type(''):
- xml.sax.saxutils.XMLGenerator.startElementNS(self, (METANS, u'user-defined'), None, {
- (METANS, u'name'): k })
- xml.sax.saxutils.XMLGenerator.characters(self, v)
- xml.sax.saxutils.XMLGenerator.endElementNS(self, (METANS, u'user-defined'), None)
- else:
- xml.sax.saxutils.XMLGenerator.startElementNS(self, k, None, { })
- xml.sax.saxutils.XMLGenerator.characters(self, v)
- xml.sax.saxutils.XMLGenerator.endElementNS(self, k, None)
- type(k) == type('')
-
-
- if isinstance(self._tag, tuple):
- texttag = self._tag[1]
- else:
- texttag = self._tag
- self.seenfields[texttag] = self.data()
- if field in self.deletefields:
- self.output.dowrite = True
- else:
- xml.sax.saxutils.XMLGenerator.endElementNS(self, name, qname)
-
-
- def characters(self, content):
- xml.sax.saxutils.XMLGenerator.characters(self, content)
- self._data.append(content)
-
-
- def meta(self):
- return self.output.content()
-
-
- def data(self):
- return normalize(''.join(self._data))
-
-
-
- def get_metadata(stream):
- zin = zipfile.ZipFile(stream, 'r')
- odfs = odfmetaparser()
- parser = xml.sax.make_parser()
- parser.setFeature(xml.sax.handler.feature_namespaces, 1)
- parser.setContentHandler(odfs)
- content = zin.read('meta.xml')
- parser.parse(StringIO(content))
- data = odfs.seenfields
- mi = MetaInformation(None, [])
- if data.has_key('title'):
- mi.title = data['title']
-
- if data.has_key('creator'):
- mi.authors = string_to_authors(data['creator'])
-
- if data.has_key('description'):
- mi.comments = data['description']
-
- if data.has_key('language'):
- mi.language = data['language']
-
- if data.get('keywords', ''):
- mi.tags = data['keywords'].split(',')
-
- return mi
-
-