mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Handle default para and char styles
This commit is contained in:
parent
9136a8cc6a
commit
a2d82df26a
@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import,
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
|
||||
import textwrap
|
||||
from collections import OrderedDict, Counter
|
||||
|
||||
from calibre.ebooks.docx.block_styles import ParagraphStyle, inherit
|
||||
@ -31,6 +32,7 @@ class Style(object):
|
||||
self.based_on = get(based_on[0], 'w:val') if based_on else None
|
||||
if self.style_type == 'numbering':
|
||||
self.based_on = None
|
||||
self.is_default = get(elem, 'w:default') in {'1', 'on', 'true'}
|
||||
|
||||
self.paragraph_style = self.character_style = None
|
||||
|
||||
@ -74,6 +76,7 @@ class Styles(object):
|
||||
self.run_cache = {}
|
||||
self.classes = {}
|
||||
self.counter = Counter()
|
||||
self.default_styles = {}
|
||||
|
||||
def __iter__(self):
|
||||
for s in self.id_map.itervalues():
|
||||
@ -93,6 +96,8 @@ class Styles(object):
|
||||
s = Style(s)
|
||||
if s.style_id:
|
||||
self.id_map[s.style_id] = s
|
||||
if s.is_default:
|
||||
self.default_styles[s.style_type] = s
|
||||
|
||||
self.default_paragraph_style = self.default_character_style = None
|
||||
|
||||
@ -168,6 +173,8 @@ class Styles(object):
|
||||
parent_styles = []
|
||||
if self.default_paragraph_style is not None:
|
||||
parent_styles.append(self.default_paragraph_style)
|
||||
|
||||
default_para = self.default_styles.get('paragraph', None)
|
||||
if direct_formatting.linked_style is not None:
|
||||
ls = self.get(direct_formatting.linked_style)
|
||||
if ls is not None:
|
||||
@ -177,6 +184,11 @@ class Styles(object):
|
||||
parent_styles.append(ps)
|
||||
if ls.character_style is not None:
|
||||
self.para_char_cache[p] = ls.character_style
|
||||
elif default_para is not None:
|
||||
if default_para.paragraph_style is not None:
|
||||
parent_styles.append(default_para.paragraph_style)
|
||||
if default_para.character_style is not None:
|
||||
self.para_char_cache[p] = default_para.character_style
|
||||
|
||||
for attr in ans.all_properties:
|
||||
setattr(ans, attr, self.para_val(parent_styles, direct_formatting, attr))
|
||||
@ -199,6 +211,7 @@ class Styles(object):
|
||||
direct_formatting = RunStyle()
|
||||
|
||||
parent_styles = []
|
||||
default_char = self.default_styles.get('character', None)
|
||||
if self.default_character_style is not None:
|
||||
parent_styles.append(self.default_character_style)
|
||||
pstyle = self.para_char_cache.get(p, None)
|
||||
@ -208,6 +221,8 @@ class Styles(object):
|
||||
ls = self.get(direct_formatting.linked_style).character_style
|
||||
if ls is not None:
|
||||
parent_styles.append(ls)
|
||||
elif default_char is not None and default_char.character_style is not None:
|
||||
parent_styles.append(default_char.character_style)
|
||||
|
||||
for attr in ans.all_properties:
|
||||
setattr(ans, attr, self.run_val(parent_styles, direct_formatting, attr))
|
||||
@ -244,10 +259,15 @@ class Styles(object):
|
||||
return self.classes.get(h, (None, None))[0]
|
||||
|
||||
def generate_css(self):
|
||||
prefix = textwrap.dedent(
|
||||
'''\
|
||||
p { margin: 0; padding: 0; text-indent: 1.5em }
|
||||
''')
|
||||
|
||||
ans = []
|
||||
for (cls, css) in sorted(self.classes.itervalues(), key=lambda x:x[0]):
|
||||
b = ('\t%s: %s;' % (k, v) for k, v in css.iteritems())
|
||||
b = '\n'.join(b)
|
||||
ans.append('.%s {\n%s\n}\n' % (cls, b.rstrip(';')))
|
||||
return '\n'.join(ans)
|
||||
return prefix + '\n' + '\n'.join(ans)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user