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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import re
  5. import datetime
  6. import decimal
  7. from generic import PdfObject
  8. from xml.dom import getDOMImplementation
  9. from xml.dom.minidom import parseString
  10. RDF_NAMESPACE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  11. DC_NAMESPACE = 'http://purl.org/dc/elements/1.1/'
  12. XMP_NAMESPACE = 'http://ns.adobe.com/xap/1.0/'
  13. PDF_NAMESPACE = 'http://ns.adobe.com/pdf/1.3/'
  14. XMPMM_NAMESPACE = 'http://ns.adobe.com/xap/1.0/mm/'
  15. PDFX_NAMESPACE = 'http://ns.adobe.com/pdfx/1.3/'
  16. iso8601 = re.compile('\n        (?P<year>[0-9]{4})\n        (-\n            (?P<month>[0-9]{2})\n            (-\n                (?P<day>[0-9]+)\n                (T\n                    (?P<hour>[0-9]{2}):\n                    (?P<minute>[0-9]{2})\n                    (:(?P<second>[0-9]{2}(.[0-9]+)?))?\n                    (?P<tzd>Z|[-+][0-9]{2}:[0-9]{2})\n                )?\n            )?\n        )?\n        ', re.VERBOSE)
  17.  
  18. class XmpInformation(PdfObject):
  19.     
  20.     def __init__(self, stream):
  21.         self.stream = stream
  22.         docRoot = parseString(self.stream.getData())
  23.         self.rdfRoot = docRoot.getElementsByTagNameNS(RDF_NAMESPACE, 'RDF')[0]
  24.         self.cache = { }
  25.  
  26.     
  27.     def writeToStream(self, stream, encryption_key):
  28.         self.stream.writeToStream(stream, encryption_key)
  29.  
  30.     
  31.     def getElement(self, aboutUri, namespace, name):
  32.         for desc in self.rdfRoot.getElementsByTagNameNS(RDF_NAMESPACE, 'Description'):
  33.             if desc.getAttributeNS(RDF_NAMESPACE, 'about') == aboutUri:
  34.                 attr = desc.getAttributeNodeNS(namespace, name)
  35.                 if attr != None:
  36.                     yield attr
  37.                 
  38.                 for element in desc.getElementsByTagNameNS(namespace, name):
  39.                     yield element
  40.                 
  41.         
  42.  
  43.     
  44.     def getNodesInNamespace(self, aboutUri, namespace):
  45.         for desc in self.rdfRoot.getElementsByTagNameNS(RDF_NAMESPACE, 'Description'):
  46.             if desc.getAttributeNS(RDF_NAMESPACE, 'about') == aboutUri:
  47.                 for i in range(desc.attributes.length):
  48.                     attr = desc.attributes.item(i)
  49.                     if attr.namespaceURI == namespace:
  50.                         yield attr
  51.                         continue
  52.                 
  53.                 for child in desc.childNodes:
  54.                     if child.namespaceURI == namespace:
  55.                         yield child
  56.                         continue
  57.                 
  58.         
  59.  
  60.     
  61.     def _getText(self, element):
  62.         text = ''
  63.         for child in element.childNodes:
  64.             if child.nodeType == child.TEXT_NODE:
  65.                 text += child.data
  66.                 continue
  67.         
  68.         return text
  69.  
  70.     
  71.     def _converter_string(value):
  72.         return value
  73.  
  74.     
  75.     def _converter_date(value):
  76.         m = iso8601.match(value)
  77.         year = int(m.group('year'))
  78.         if not m.group('month'):
  79.             pass
  80.         month = int('1')
  81.         if not m.group('day'):
  82.             pass
  83.         day = int('1')
  84.         if not m.group('hour'):
  85.             pass
  86.         hour = int('0')
  87.         if not m.group('minute'):
  88.             pass
  89.         minute = int('0')
  90.         if not m.group('second'):
  91.             pass
  92.         second = decimal.Decimal('0')
  93.         seconds = second.to_integral(decimal.ROUND_FLOOR)
  94.         milliseconds = (second - seconds) * 1000000
  95.         if not m.group('tzd'):
  96.             pass
  97.         tzd = 'Z'
  98.         dt = datetime.datetime(year, month, day, hour, minute, seconds, milliseconds)
  99.         if tzd != 'Z':
  100.             (tzd_hours, tzd_minutes) = [ int(x) for x in tzd.split(':') ]
  101.             tzd_hours *= -1
  102.             dt = dt + datetime.timedelta(hours = tzd_hours, minutes = tzd_minutes)
  103.         
  104.         return dt
  105.  
  106.     _test_converter_date = staticmethod(_converter_date)
  107.     
  108.     def _getter_bag(namespace, name, converter):
  109.         
  110.         def get(self):
  111.             cached = self.cache.get(namespace, { }).get(name)
  112.             if cached:
  113.                 return cached
  114.             retval = []
  115.             for element in self.getElement('', namespace, name):
  116.                 bags = element.getElementsByTagNameNS(RDF_NAMESPACE, 'Bag')
  117.                 if len(bags):
  118.                     for bag in bags:
  119.                         for item in bag.getElementsByTagNameNS(RDF_NAMESPACE, 'li'):
  120.                             value = self._getText(item)
  121.                             value = converter(value)
  122.                             retval.append(value)
  123.                         
  124.                     
  125.                 cached
  126.             
  127.             ns_cache = self.cache.setdefault(namespace, { })
  128.             ns_cache[name] = retval
  129.             return retval
  130.  
  131.         return get
  132.  
  133.     
  134.     def _getter_seq(namespace, name, converter):
  135.         
  136.         def get(self):
  137.             cached = self.cache.get(namespace, { }).get(name)
  138.             if cached:
  139.                 return cached
  140.             retval = []
  141.             for element in self.getElement('', namespace, name):
  142.                 seqs = element.getElementsByTagNameNS(RDF_NAMESPACE, 'Seq')
  143.                 if len(seqs):
  144.                     for seq in seqs:
  145.                         for item in seq.getElementsByTagNameNS(RDF_NAMESPACE, 'li'):
  146.                             value = self._getText(item)
  147.                             value = converter(value)
  148.                             retval.append(value)
  149.                         
  150.                     
  151.                 cached
  152.                 value = converter(self._getText(element))
  153.                 retval.append(value)
  154.             
  155.             ns_cache = self.cache.setdefault(namespace, { })
  156.             ns_cache[name] = retval
  157.             return retval
  158.  
  159.         return get
  160.  
  161.     
  162.     def _getter_langalt(namespace, name, converter):
  163.         
  164.         def get(self):
  165.             cached = self.cache.get(namespace, { }).get(name)
  166.             if cached:
  167.                 return cached
  168.             retval = { }
  169.             for element in self.getElement('', namespace, name):
  170.                 alts = element.getElementsByTagNameNS(RDF_NAMESPACE, 'Alt')
  171.                 if len(alts):
  172.                     for alt in alts:
  173.                         for item in alt.getElementsByTagNameNS(RDF_NAMESPACE, 'li'):
  174.                             value = self._getText(item)
  175.                             value = converter(value)
  176.                             retval[item.getAttribute('xml:lang')] = value
  177.                         
  178.                     
  179.                 cached
  180.                 retval['x-default'] = converter(self._getText(element))
  181.             
  182.             ns_cache = self.cache.setdefault(namespace, { })
  183.             ns_cache[name] = retval
  184.             return retval
  185.  
  186.         return get
  187.  
  188.     
  189.     def _getter_single(namespace, name, converter):
  190.         
  191.         def get(self):
  192.             cached = self.cache.get(namespace, { }).get(name)
  193.             if cached:
  194.                 return cached
  195.             value = None
  196.             for element in self.getElement('', namespace, name):
  197.                 if element.nodeType == element.ATTRIBUTE_NODE:
  198.                     value = element.nodeValue
  199.                 else:
  200.                     value = self._getText(element)
  201.             
  202.             if value != None:
  203.                 value = converter(value)
  204.             
  205.             ns_cache = self.cache.setdefault(namespace, { })
  206.             ns_cache[name] = value
  207.             return value
  208.  
  209.         return get
  210.  
  211.     dc_contributor = property(_getter_bag(DC_NAMESPACE, 'contributor', _converter_string))
  212.     dc_coverage = property(_getter_single(DC_NAMESPACE, 'coverage', _converter_string))
  213.     dc_creator = property(_getter_seq(DC_NAMESPACE, 'creator', _converter_string))
  214.     dc_date = property(_getter_seq(DC_NAMESPACE, 'date', _converter_date))
  215.     dc_description = property(_getter_langalt(DC_NAMESPACE, 'description', _converter_string))
  216.     dc_format = property(_getter_single(DC_NAMESPACE, 'format', _converter_string))
  217.     dc_identifier = property(_getter_single(DC_NAMESPACE, 'identifier', _converter_string))
  218.     dc_language = property(_getter_bag(DC_NAMESPACE, 'language', _converter_string))
  219.     dc_publisher = property(_getter_bag(DC_NAMESPACE, 'publisher', _converter_string))
  220.     dc_relation = property(_getter_bag(DC_NAMESPACE, 'relation', _converter_string))
  221.     dc_rights = property(_getter_langalt(DC_NAMESPACE, 'rights', _converter_string))
  222.     dc_source = property(_getter_single(DC_NAMESPACE, 'source', _converter_string))
  223.     dc_subject = property(_getter_bag(DC_NAMESPACE, 'subject', _converter_string))
  224.     dc_title = property(_getter_langalt(DC_NAMESPACE, 'title', _converter_string))
  225.     dc_type = property(_getter_bag(DC_NAMESPACE, 'type', _converter_string))
  226.     pdf_keywords = property(_getter_single(PDF_NAMESPACE, 'Keywords', _converter_string))
  227.     pdf_pdfversion = property(_getter_single(PDF_NAMESPACE, 'PDFVersion', _converter_string))
  228.     pdf_producer = property(_getter_single(PDF_NAMESPACE, 'Producer', _converter_string))
  229.     xmp_createDate = property(_getter_single(XMP_NAMESPACE, 'CreateDate', _converter_date))
  230.     xmp_modifyDate = property(_getter_single(XMP_NAMESPACE, 'ModifyDate', _converter_date))
  231.     xmp_metadataDate = property(_getter_single(XMP_NAMESPACE, 'MetadataDate', _converter_date))
  232.     xmp_creatorTool = property(_getter_single(XMP_NAMESPACE, 'CreatorTool', _converter_string))
  233.     xmpmm_documentId = property(_getter_single(XMPMM_NAMESPACE, 'DocumentID', _converter_string))
  234.     xmpmm_instanceId = property(_getter_single(XMPMM_NAMESPACE, 'InstanceID', _converter_string))
  235.     
  236.     def custom_properties(self):
  237.         if not hasattr(self, '_custom_properties'):
  238.             self._custom_properties = { }
  239.             for node in self.getNodesInNamespace('', PDFX_NAMESPACE):
  240.                 key = node.localName
  241.                 while True:
  242.                     idx = key.find(u'Γåé')
  243.                     if idx == -1:
  244.                         break
  245.                     
  246.                     key = key[:idx] + chr(int(key[idx + 1:idx + 5], base = 16)) + key[idx + 5:]
  247.                 if node.nodeType == node.ATTRIBUTE_NODE:
  248.                     value = node.nodeValue
  249.                 else:
  250.                     value = self._getText(node)
  251.                 self._custom_properties[key] = value
  252.             
  253.         
  254.         return self._custom_properties
  255.  
  256.     custom_properties = property(custom_properties)
  257.  
  258.