Fix various regressions

This commit is contained in:
Kovid Goyal 2009-04-24 20:21:37 -07:00
parent 1f6737eeb0
commit 7a6afe4ee4
5 changed files with 27 additions and 16 deletions

View File

@ -118,9 +118,9 @@ cpalmdoc_do_compress(buffer *b, char *output) {
found = false; found = false;
for (chunk_len = 10; chunk_len > 2; chunk_len--) { for (chunk_len = 10; chunk_len > 2; chunk_len--) {
j = cpalmdoc_rfind(b->data, i, chunk_len); j = cpalmdoc_rfind(b->data, i, chunk_len);
if (j < i) { dist = i - j;
if (j < i && dist <= 2047) {
found = true; found = true;
dist = i - j;
compound = (dist << 3) + chunk_len-3; compound = (dist << 3) + chunk_len-3;
*(output++) = CHAR(0x80 + (compound >> 8 )); *(output++) = CHAR(0x80 + (compound >> 8 ));
*(output++) = CHAR(compound & 0xFF); *(output++) = CHAR(compound & 0xFF);

View File

@ -226,7 +226,7 @@ class MobiReader(object):
page-break-after: always; margin: 0; display: block page-break-after: always; margin: 0; display: block
} }
''') ''')
self.tag_css_rules = [] self.tag_css_rules = {}
if hasattr(filename_or_stream, 'read'): if hasattr(filename_or_stream, 'read'):
stream = filename_or_stream stream = filename_or_stream
@ -328,10 +328,10 @@ class MobiReader(object):
with open('styles.css', 'wb') as s: with open('styles.css', 'wb') as s:
s.write(self.base_css_rules+'\n\n') s.write(self.base_css_rules+'\n\n')
for rule in self.tag_css_rules: for cls, rule in self.tag_css_rules.items():
if isinstance(rule, unicode): if isinstance(rule, unicode):
rule = rule.encode('utf-8') rule = rule.encode('utf-8')
s.write(rule+'\n\n') s.write('.%s { %s }\n\n'%(cls, rule))
if self.book_header.exth is not None or self.embedded_mi is not None: if self.book_header.exth is not None or self.embedded_mi is not None:
@ -389,6 +389,7 @@ class MobiReader(object):
'xx-large' : '6', 'xx-large' : '6',
} }
mobi_version = self.book_header.mobi_version mobi_version = self.book_header.mobi_version
style_map = {}
for i, tag in enumerate(root.iter(etree.Element)): for i, tag in enumerate(root.iter(etree.Element)):
if tag.tag in ('country-region', 'place', 'placetype', 'placename', if tag.tag in ('country-region', 'place', 'placetype', 'placename',
'state', 'city', 'street', 'address', 'content'): 'state', 'city', 'street', 'address', 'content'):
@ -455,9 +456,18 @@ class MobiReader(object):
except ValueError: except ValueError:
pass pass
if styles: if styles:
attrib['id'] = attrib.get('id', 'calibre_mr_gid%d'%i) cls = None
self.tag_css_rules.append('#%s {%s}'%(attrib['id'], rule = '; '.join(styles)
'; '.join(styles))) for sel, srule in self.tag_css_rules.items():
if srule == rule:
cls = sel
break
if cls is None:
ncls = 'calibre_%d'%i
self.tag_css_rules[ncls] = rule
cls = attrib.get('class', '')
cls = cls + (' ' if cls else '') + ncls
attrib['class'] = cls
def create_opf(self, htmlfile, guide=None, root=None): def create_opf(self, htmlfile, guide=None, root=None):
mi = getattr(self.book_header.exth, 'mi', self.embedded_mi) mi = getattr(self.book_header.exth, 'mi', self.embedded_mi)

View File

@ -726,6 +726,7 @@ class Manifest(object):
% (self.id, self.href, self.media_type) % (self.id, self.href, self.media_type)
def _parse_xhtml(self, data): def _parse_xhtml(self, data):
self.oeb.log.debug('Parsing', self.href, '...')
# Convert to Unicode and normalize line endings # Convert to Unicode and normalize line endings
data = self.oeb.decode(data) data = self.oeb.decode(data)
data = self.oeb.html_preprocessor(data) data = self.oeb.html_preprocessor(data)
@ -804,6 +805,7 @@ class Manifest(object):
return data return data
def _parse_css(self, data): def _parse_css(self, data):
self.oeb.log.debug('Parsing', self.href, '...')
data = self.oeb.decode(data) data = self.oeb.decode(data)
data = self.oeb.css_preprocessor(data) data = self.oeb.css_preprocessor(data)
data = XHTML_CSS_NAMESPACE + data data = XHTML_CSS_NAMESPACE + data

View File

@ -41,10 +41,12 @@ class Clean(object):
for x in list(self.oeb.guide): for x in list(self.oeb.guide):
href = urldefrag(self.oeb.guide[x].href)[0] href = urldefrag(self.oeb.guide[x].href)[0]
if x.lower() != ('cover', 'titlepage'): if x.lower() not in ('cover', 'titlepage'):
try: try:
if href not in protected_hrefs: if href not in protected_hrefs:
self.oeb.manifest.remove(self.oeb.manifest.hrefs[href]) item = self.oeb.manifest.hrefs[href]
if item not in self.oeb.spine:
self.oeb.manifest.remove(self.oeb.manifest.hrefs[href])
except KeyError: except KeyError:
pass pass
self.oeb.guide.remove(x) self.oeb.guide.remove(x)

View File

@ -44,14 +44,14 @@ class Split(object):
self.split_on_page_breaks = split_on_page_breaks self.split_on_page_breaks = split_on_page_breaks
self.page_breaks_xpath = page_breaks_xpath self.page_breaks_xpath = page_breaks_xpath
self.max_flow_size = max_flow_size self.max_flow_size = max_flow_size
self.page_break_selectors = None
if self.page_breaks_xpath is not None: if self.page_breaks_xpath is not None:
self.page_breaks_xpath = XPath(self.page_breaks_xpath) self.page_break_selectors = [(XPath(self.page_breaks_xpath), False)]
def __call__(self, oeb, context): def __call__(self, oeb, context):
self.oeb = oeb self.oeb = oeb
self.log = oeb.log self.log = oeb.log
self.map = {} self.map = {}
self.page_break_selectors = None
for item in list(self.oeb.manifest.items): for item in list(self.oeb.manifest.items):
if item.spine_position is not None and etree.iselement(item.data): if item.spine_position is not None and etree.iselement(item.data):
self.split_item(item) self.split_item(item)
@ -60,10 +60,7 @@ class Split(object):
def split_item(self, item): def split_item(self, item):
if self.split_on_page_breaks: if self.split_on_page_breaks:
if self.page_breaks_xpath is None: page_breaks, page_break_ids = self.find_page_breaks(item)
page_breaks, page_break_ids = self.find_page_breaks(item)
else:
page_breaks, page_break_ids = self.page_breaks_xpath(item.data)
splitter = FlowSplitter(item, page_breaks, page_break_ids, splitter = FlowSplitter(item, page_breaks, page_break_ids,
self.max_flow_size, self.oeb) self.max_flow_size, self.oeb)