home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_966 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.5 KB  |  151 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import zipfile
  5. import re
  6. import xml.sax.saxutils as xml
  7. from cStringIO import StringIO
  8. from odf.namespaces import OFFICENS, DCNS, METANS
  9. from calibre.ebooks.metadata import MetaInformation, string_to_authors
  10. whitespace = re.compile('\\s+')
  11. fields = {
  12.     'title': (DCNS, u'title'),
  13.     'description': (DCNS, u'description'),
  14.     'subject': (DCNS, u'subject'),
  15.     'creator': (DCNS, u'creator'),
  16.     'date': (DCNS, u'date'),
  17.     'language': (DCNS, u'language'),
  18.     'generator': (METANS, u'generator'),
  19.     'initial-creator': (METANS, u'initial-creator'),
  20.     'keyword': (METANS, u'keyword'),
  21.     'editing-duration': (METANS, u'editing-duration'),
  22.     'editing-cycles': (METANS, u'editing-cycles'),
  23.     'printed-by': (METANS, u'printed-by'),
  24.     'print-date': (METANS, u'print-date'),
  25.     'creation-date': (METANS, u'creation-date'),
  26.     'user-defined': (METANS, u'user-defined') }
  27.  
  28. def normalize(str):
  29.     return whitespace.sub(' ', str).strip()
  30.  
  31.  
  32. class MetaCollector:
  33.     
  34.     def __init__(self):
  35.         self._content = []
  36.         self.dowrite = True
  37.  
  38.     
  39.     def write(self, str):
  40.         if self.dowrite:
  41.             self._content.append(str)
  42.         
  43.  
  44.     
  45.     def content(self):
  46.         return ''.join(self._content)
  47.  
  48.  
  49.  
  50. class odfmetaparser(xml.sax.saxutils.XMLGenerator):
  51.     
  52.     def __init__(self, deletefields = { }, yieldfields = { }, addfields = { }):
  53.         self.deletefields = deletefields
  54.         self.yieldfields = yieldfields
  55.         self.addfields = addfields
  56.         self._mimetype = ''
  57.         self.output = MetaCollector()
  58.         self._data = []
  59.         self.seenfields = { }
  60.         xml.sax.saxutils.XMLGenerator.__init__(self, self.output, 'utf-8')
  61.  
  62.     
  63.     def startElementNS(self, name, qname, attrs):
  64.         self._data = []
  65.         field = name
  66.         if name == (METANS, u'user-defined'):
  67.             field = attrs.get((METANS, u'name'))
  68.         
  69.         if field in self.deletefields:
  70.             self.output.dowrite = False
  71.         elif field in self.yieldfields:
  72.             del self.addfields[field]
  73.             xml.sax.saxutils.XMLGenerator.startElementNS(self, name, qname, attrs)
  74.         else:
  75.             xml.sax.saxutils.XMLGenerator.startElementNS(self, name, qname, attrs)
  76.         self._tag = field
  77.  
  78.     
  79.     def endElementNS(self, name, qname):
  80.         field = name
  81.         if name == (METANS, u'user-defined'):
  82.             field = self._tag
  83.         
  84.         if name == (OFFICENS, u'meta'):
  85.             for k, v in self.addfields.items():
  86.                 if len(v) > 0:
  87.                     if type(k) == type(''):
  88.                         xml.sax.saxutils.XMLGenerator.startElementNS(self, (METANS, u'user-defined'), None, {
  89.                             (METANS, u'name'): k })
  90.                         xml.sax.saxutils.XMLGenerator.characters(self, v)
  91.                         xml.sax.saxutils.XMLGenerator.endElementNS(self, (METANS, u'user-defined'), None)
  92.                     else:
  93.                         xml.sax.saxutils.XMLGenerator.startElementNS(self, k, None, { })
  94.                         xml.sax.saxutils.XMLGenerator.characters(self, v)
  95.                         xml.sax.saxutils.XMLGenerator.endElementNS(self, k, None)
  96.                 type(k) == type('')
  97.             
  98.         
  99.         if isinstance(self._tag, tuple):
  100.             texttag = self._tag[1]
  101.         else:
  102.             texttag = self._tag
  103.         self.seenfields[texttag] = self.data()
  104.         if field in self.deletefields:
  105.             self.output.dowrite = True
  106.         else:
  107.             xml.sax.saxutils.XMLGenerator.endElementNS(self, name, qname)
  108.  
  109.     
  110.     def characters(self, content):
  111.         xml.sax.saxutils.XMLGenerator.characters(self, content)
  112.         self._data.append(content)
  113.  
  114.     
  115.     def meta(self):
  116.         return self.output.content()
  117.  
  118.     
  119.     def data(self):
  120.         return normalize(''.join(self._data))
  121.  
  122.  
  123.  
  124. def get_metadata(stream):
  125.     zin = zipfile.ZipFile(stream, 'r')
  126.     odfs = odfmetaparser()
  127.     parser = xml.sax.make_parser()
  128.     parser.setFeature(xml.sax.handler.feature_namespaces, 1)
  129.     parser.setContentHandler(odfs)
  130.     content = zin.read('meta.xml')
  131.     parser.parse(StringIO(content))
  132.     data = odfs.seenfields
  133.     mi = MetaInformation(None, [])
  134.     if data.has_key('title'):
  135.         mi.title = data['title']
  136.     
  137.     if data.has_key('creator'):
  138.         mi.authors = string_to_authors(data['creator'])
  139.     
  140.     if data.has_key('description'):
  141.         mi.comments = data['description']
  142.     
  143.     if data.has_key('language'):
  144.         mi.language = data['language']
  145.     
  146.     if data.get('keywords', ''):
  147.         mi.tags = data['keywords'].split(',')
  148.     
  149.     return mi
  150.  
  151.