mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-11 09:13:57 -04:00
DOCX Input: Fix numbering styles that inherit their id from parent styles notbeing correctly applied
This commit is contained in:
parent
53ec8c5b8e
commit
540edf6b05
@ -237,7 +237,7 @@ def read_shd(parent, dest, XPath, get):
|
|||||||
|
|
||||||
|
|
||||||
def read_numbering(parent, dest, XPath, get):
|
def read_numbering(parent, dest, XPath, get):
|
||||||
lvl = num_id = None
|
lvl = num_id = inherit
|
||||||
for np in XPath('./w:numPr')(parent):
|
for np in XPath('./w:numPr')(parent):
|
||||||
for ilvl in XPath('./w:ilvl[@w:val]')(np):
|
for ilvl in XPath('./w:ilvl[@w:val]')(np):
|
||||||
try:
|
try:
|
||||||
@ -246,8 +246,8 @@ def read_numbering(parent, dest, XPath, get):
|
|||||||
pass
|
pass
|
||||||
for num in XPath('./w:numId[@w:val]')(np):
|
for num in XPath('./w:numId[@w:val]')(np):
|
||||||
num_id = get(num, 'w:val')
|
num_id = get(num, 'w:val')
|
||||||
val = (num_id, lvl) if num_id is not None or lvl is not None else inherit
|
setattr(dest, 'numbering_id', num_id)
|
||||||
setattr(dest, 'numbering', val)
|
setattr(dest, 'numbering_level', lvl)
|
||||||
|
|
||||||
|
|
||||||
class Frame(object):
|
class Frame(object):
|
||||||
@ -355,7 +355,7 @@ class ParagraphStyle(object):
|
|||||||
|
|
||||||
# Misc.
|
# Misc.
|
||||||
'text_indent', 'text_align', 'line_height', 'background_color',
|
'text_indent', 'text_align', 'line_height', 'background_color',
|
||||||
'numbering', 'font_family', 'font_size', 'color', 'frame',
|
'numbering_id', 'numbering_level', 'font_family', 'font_size', 'color', 'frame',
|
||||||
'cs_font_size', 'cs_font_family',
|
'cs_font_size', 'cs_font_family',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -248,22 +248,24 @@ class Styles(object):
|
|||||||
if default_para.character_style is not None:
|
if default_para.character_style is not None:
|
||||||
self.para_char_cache[p] = default_para.character_style
|
self.para_char_cache[p] = default_para.character_style
|
||||||
|
|
||||||
is_numbering = direct_formatting.numbering is not inherit
|
def has_numbering(block_style):
|
||||||
|
num_id, lvl = getattr(block_style, 'numbering_id', inherit), getattr(block_style, 'numbering_level', inherit)
|
||||||
|
return num_id is not None and num_id is not inherit and lvl is not None and lvl is not inherit
|
||||||
|
|
||||||
|
is_numbering = has_numbering(direct_formatting)
|
||||||
is_section_break = is_section_break and not self.namespace.XPath('./w:r')(p)
|
is_section_break = is_section_break and not self.namespace.XPath('./w:r')(p)
|
||||||
|
|
||||||
if is_numbering and not is_section_break:
|
if is_numbering and not is_section_break:
|
||||||
num_id, lvl = direct_formatting.numbering
|
num_id, lvl = direct_formatting.numbering_id, direct_formatting.numbering_level
|
||||||
if num_id is not None:
|
p.set('calibre_num_id', '%s:%s' % (lvl, num_id))
|
||||||
p.set('calibre_num_id', '%s:%s' % (lvl, num_id))
|
ps = self.numbering.get_para_style(num_id, lvl)
|
||||||
if num_id is not None and lvl is not None:
|
if ps is not None:
|
||||||
ps = self.numbering.get_para_style(num_id, lvl)
|
parent_styles.append(ps)
|
||||||
if ps is not None:
|
|
||||||
parent_styles.append(ps)
|
|
||||||
if (
|
if (
|
||||||
not is_numbering and not is_section_break and linked_style is not None and getattr(
|
not is_numbering and not is_section_break and linked_style is not None and has_numbering(linked_style.paragraph_style)
|
||||||
linked_style.paragraph_style, 'numbering', inherit) is not inherit):
|
):
|
||||||
num_id, lvl = linked_style.paragraph_style.numbering
|
num_id, lvl = linked_style.paragraph_style.numbering_id, linked_style.paragraph_style.numbering_level
|
||||||
if num_id is not None:
|
p.set('calibre_num_id', '%s:%s' % (lvl, num_id))
|
||||||
p.set('calibre_num_id', '%s:%s' % (lvl, num_id))
|
|
||||||
is_numbering = True
|
is_numbering = True
|
||||||
ps = self.numbering.get_para_style(num_id, lvl)
|
ps = self.numbering.get_para_style(num_id, lvl)
|
||||||
if ps is not None:
|
if ps is not None:
|
||||||
@ -395,12 +397,12 @@ class Styles(object):
|
|||||||
self.numbering = numbering
|
self.numbering = numbering
|
||||||
for style in self:
|
for style in self:
|
||||||
ps = style.paragraph_style
|
ps = style.paragraph_style
|
||||||
if ps is not None and ps.numbering is not inherit:
|
if ps is not None and ps.numbering_id is not inherit:
|
||||||
lvl = numbering.get_pstyle(ps.numbering[0], style.style_id)
|
lvl = numbering.get_pstyle(ps.numbering_id, style.style_id)
|
||||||
if lvl is None:
|
if lvl is None:
|
||||||
ps.numbering = inherit
|
ps.numbering_id = ps.numbering_level = inherit
|
||||||
else:
|
else:
|
||||||
ps.numbering = (ps.numbering[0], lvl)
|
ps.numbering_level = lvl
|
||||||
|
|
||||||
def apply_contextual_spacing(self, paras):
|
def apply_contextual_spacing(self, paras):
|
||||||
last_para = None
|
last_para = None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user