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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. __license__ = 'GPL v3'
  6. __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
  7. __docformat__ = 'restructuredtext en'
  8. import re
  9. from calibre.ebooks.BeautifulSoup import BeautifulSoup
  10. from calibre.ebooks.chardet import xml_to_unicode
  11. from calibre.ebooks.metadata import string_to_authors, MetaInformation
  12. from calibre.utils.logging import default_log
  13. from calibre.ptempfile import TemporaryFile
  14.  
  15. def _clean(s):
  16.     return s.replace(u'┬á', u' ')
  17.  
  18.  
  19. def _detag(tag):
  20.     str = u''
  21.     if tag is None:
  22.         return str
  23.     for elem in tag:
  24.         if hasattr(elem, 'contents'):
  25.             str += _detag(elem)
  26.             continue
  27.         tag is None
  28.         str += _clean(elem)
  29.     
  30.     return str
  31.  
  32.  
  33. def _metadata_from_table(soup, searchfor):
  34.     td = soup.find('td', text = re.compile(searchfor, flags = re.I))
  35.     if td is None:
  36.         return None
  37.     td = td.parent
  38.     if re.match('^\\s*' + searchfor + '\\s*$', td.renderContents(None), flags = re.I):
  39.         meta = _detag(td.findNextSibling('td'))
  40.         return re.sub('^:', '', meta).strip()
  41.     meta = _detag(td)
  42.     return re.sub('^[^:]+:', '', meta).strip()
  43.  
  44.  
  45. def _metadata_from_span(soup, searchfor):
  46.     span = soup.find('span', {
  47.         'class': re.compile(searchfor, flags = re.I) })
  48.     if span is None:
  49.         return None
  50.     return _detag(span.renderContents(None).strip())
  51.  
  52.  
  53. def _get_authors(soup):
  54.     if not _metadata_from_span(soup, 'author'):
  55.         pass
  56.     aut = _metadata_from_table(soup, '^\\s*by\\s*:?\\s+')
  57.     ans = [
  58.         _('Unknown')]
  59.     if aut is not None:
  60.         ans = string_to_authors(aut)
  61.     
  62.     return ans
  63.  
  64.  
  65. def _get_publisher(soup):
  66.     if not _metadata_from_span(soup, 'imprint'):
  67.         pass
  68.     return _metadata_from_table(soup, 'publisher')
  69.  
  70.  
  71. def _get_isbn(soup):
  72.     if not _metadata_from_span(soup, 'isbn'):
  73.         pass
  74.     return _metadata_from_table(soup, 'isbn')
  75.  
  76.  
  77. def _get_comments(soup):
  78.     if not _metadata_from_span(soup, 'cwdate'):
  79.         pass
  80.     date = _metadata_from_table(soup, 'pub date')
  81.     if not _metadata_from_span(soup, 'pages'):
  82.         pass
  83.     pages = _metadata_from_table(soup, 'pages')
  84.     
  85.     try:
  86.         date = date.replace(u'┬⌐', '').strip()
  87.         pages = re.search('\\d+', pages).group(0)
  88.         return u'Published %s, %s pages.' % (date, pages)
  89.     except:
  90.         pass
  91.  
  92.  
  93.  
  94. def _get_cover(soup, rdr):
  95.     ans = None
  96.     
  97.     try:
  98.         ans = soup.find('img', alt = re.compile('cover', flags = re.I))['src']
  99.     except TypeError:
  100.         r = { }
  101.         for img in soup('img'):
  102.             
  103.             try:
  104.                 r[abs(float(re.search('[0-9.]+', img['height']).group()) / float(re.search('[0-9.]+', img['width']).group()) - 1.25)] = img['src']
  105.             continue
  106.             except KeyError:
  107.                 r[0] = img['src']
  108.                 continue
  109.                 continue
  110.                 continue
  111.             
  112.  
  113.         
  114.         l = r.keys()
  115.         l.sort()
  116.         if l:
  117.             ans = r[l[0]]
  118.         
  119.     except:
  120.         None<EXCEPTION MATCH>KeyError
  121.  
  122.     if ans is not None:
  123.         
  124.         try:
  125.             ans = rdr.GetFile(ans)
  126.         except:
  127.             ans = rdr.root + '/' + ans
  128.             
  129.             try:
  130.                 ans = rdr.GetFile(ans)
  131.             ans = None
  132.  
  133.  
  134.         if ans is not None:
  135.             Image = Image
  136.             import PIL
  137.             StringIO = StringIO
  138.             import cStringIO
  139.             buf = StringIO()
  140.             
  141.             try:
  142.                 Image.open(StringIO(ans)).convert('RGB').save(buf, 'JPEG')
  143.                 ans = buf.getvalue()
  144.             ans = None
  145.  
  146.         
  147.     
  148.     return ans
  149.  
  150.  
  151. def get_metadata_from_reader(rdr):
  152.     raw = rdr.GetFile(rdr.home)
  153.     home = BeautifulSoup(xml_to_unicode(raw, strip_encoding_pats = True, resolve_entities = True)[0])
  154.     title = rdr.title
  155.     authors = _get_authors(home)
  156.     mi = MetaInformation(title, authors)
  157.     publisher = _get_publisher(home)
  158.     if publisher:
  159.         mi.publisher = publisher
  160.     
  161.     isbn = _get_isbn(home)
  162.     if isbn:
  163.         mi.isbn = isbn
  164.     
  165.     comments = _get_comments(home)
  166.     if comments:
  167.         mi.comments = comments
  168.     
  169.     cdata = _get_cover(home, rdr)
  170.     if cdata is not None:
  171.         mi.cover_data = ('jpg', cdata)
  172.     
  173.     return mi
  174.  
  175.  
  176. def get_metadata(stream):
  177.     
  178.     try:
  179.         fname = _[1]
  180.         
  181.         try:
  182.             f = _[2]
  183.             f.write(stream.read())
  184.         finally:
  185.             pass
  186.  
  187.         CHMReader = CHMReader
  188.         import calibre.ebooks.chm.reader
  189.         rdr = CHMReader(fname, default_log)
  190.         return get_metadata_from_reader(rdr)
  191.     finally:
  192.         pass
  193.  
  194.  
  195.