mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix various regressions
This commit is contained in:
parent
1f6737eeb0
commit
7a6afe4ee4
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user