home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1007 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  4.4 KB  |  128 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__ = '2008, Marshall T. Vandegrift <llasram@gmail.com>'
  7. from lxml import etree
  8. from calibre.ebooks.oeb.base import XHTML, XHTML_NS
  9. from calibre.ebooks.oeb.base import CSS_MIME
  10. from calibre.ebooks.oeb.base import namespace
  11. from calibre.ebooks.oeb.stylizer import Stylizer
  12. CASE_MANGLER_CSS = '\n.calibre_lowercase {\n    font-variant: normal;\n    font-size: 0.65em;\n}\n'
  13. TEXT_TRANSFORMS = set([
  14.     'capitalize',
  15.     'uppercase',
  16.     'lowercase'])
  17.  
  18. class CaseMangler(object):
  19.     
  20.     def config(cls, cfg):
  21.         return cfg
  22.  
  23.     config = classmethod(config)
  24.     
  25.     def generate(cls, opts):
  26.         return cls()
  27.  
  28.     generate = classmethod(generate)
  29.     
  30.     def __call__(self, oeb, context):
  31.         oeb.logger.info('Applying case-transforming CSS...')
  32.         self.oeb = oeb
  33.         self.opts = context
  34.         self.profile = context.source
  35.         self.mangle_spine()
  36.  
  37.     
  38.     def mangle_spine(self):
  39.         (id, href) = self.oeb.manifest.generate('manglecase', 'manglecase.css')
  40.         self.oeb.manifest.add(id, href, CSS_MIME, data = CASE_MANGLER_CSS)
  41.         for item in self.oeb.spine:
  42.             html = item.data
  43.             relhref = item.relhref(href)
  44.             etree.SubElement(html.find(XHTML('head')), XHTML('link'), rel = 'stylesheet', href = relhref, type = CSS_MIME)
  45.             stylizer = Stylizer(html, item.href, self.oeb, self.opts, self.profile)
  46.             self.mangle_elem(html.find(XHTML('body')), stylizer)
  47.         
  48.  
  49.     
  50.     def text_transform(self, transform, text):
  51.         if transform == 'capitalize':
  52.             return text.title()
  53.         if transform == 'uppercase':
  54.             return text.upper()
  55.         if transform == 'lowercase':
  56.             return text.lower()
  57.         return text
  58.  
  59.     
  60.     def split_text(self, text):
  61.         results = [
  62.             '']
  63.         isupper = text[0].isupper()
  64.         for char in text:
  65.             if char.isupper() == isupper:
  66.                 results[-1] += char
  67.                 continue
  68.             isupper = not isupper
  69.             results.append(char)
  70.         
  71.         return results
  72.  
  73.     
  74.     def smallcaps_elem(self, elem, attr):
  75.         texts = self.split_text(getattr(elem, attr))
  76.         setattr(elem, attr, None)
  77.         last = None if attr == 'tail' else None
  78.         attrib = {
  79.             'class': 'calibre_lowercase' }
  80.         for text in texts:
  81.             if text.isupper():
  82.                 if last is None:
  83.                     elem.text = text
  84.                 else:
  85.                     last.tail = text
  86.             last is None
  87.             child = etree.Element(XHTML('span'), attrib = attrib)
  88.             child.text = text.upper()
  89.             if last is None:
  90.                 elem.insert(0, child)
  91.             else:
  92.                 tail = last.tail
  93.                 last.addnext(child)
  94.                 last.tail = tail
  95.                 child.tail = None
  96.             last = child
  97.         
  98.  
  99.     
  100.     def mangle_elem(self, elem, stylizer):
  101.         if not isinstance(elem.tag, basestring) or namespace(elem.tag) != XHTML_NS:
  102.             return None
  103.         children = list(elem)
  104.         style = stylizer.style(elem)
  105.         transform = style['text-transform']
  106.         variant = style['font-variant']
  107.         if elem.text:
  108.             if transform in TEXT_TRANSFORMS:
  109.                 elem.text = self.text_transform(transform, elem.text)
  110.             
  111.             if variant == 'small-caps':
  112.                 self.smallcaps_elem(elem, 'text')
  113.             
  114.         
  115.         for child in children:
  116.             self.mangle_elem(child, stylizer)
  117.             if child.tail:
  118.                 if transform in TEXT_TRANSFORMS:
  119.                     child.tail = self.text_transform(transform, child.tail)
  120.                 
  121.                 if variant == 'small-caps':
  122.                     self.smallcaps_elem(child, 'tail')
  123.                 
  124.             variant == 'small-caps'
  125.         
  126.  
  127.  
  128.