mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
DOCX Input: Handle images in footnotes and endnotes
Fixes #1221686 [conversion from docx cannot handle images in footnotes](https://bugs.launchpad.net/calibre/+bug/1221686)
This commit is contained in:
parent
f0d61014ab
commit
7d9081a4e4
@ -12,9 +12,10 @@ from calibre.ebooks.docx.names import get, XPath, descendants
|
||||
|
||||
class Note(object):
|
||||
|
||||
def __init__(self, parent):
|
||||
def __init__(self, parent, rels):
|
||||
self.type = get(parent, 'w:type', 'normal')
|
||||
self.parent = parent
|
||||
self.rels = rels
|
||||
|
||||
def __iter__(self):
|
||||
for p in descendants(self.parent, 'w:p', 'w:tbl'):
|
||||
@ -28,18 +29,18 @@ class Footnotes(object):
|
||||
self.counter = 0
|
||||
self.notes = OrderedDict()
|
||||
|
||||
def __call__(self, footnotes, endnotes):
|
||||
def __call__(self, footnotes, footnotes_rels, endnotes, endnotes_rels):
|
||||
if footnotes is not None:
|
||||
for footnote in XPath('./w:footnote[@w:id]')(footnotes):
|
||||
fid = get(footnote, 'w:id')
|
||||
if fid:
|
||||
self.footnotes[fid] = Note(footnote)
|
||||
self.footnotes[fid] = Note(footnote, footnotes_rels)
|
||||
|
||||
if endnotes is not None:
|
||||
for endnote in XPath('./w:endnote[@w:id]')(endnotes):
|
||||
fid = get(endnote, 'w:id')
|
||||
if fid:
|
||||
self.endnotes[fid] = Note(endnote)
|
||||
self.endnotes[fid] = Note(endnote, endnotes_rels)
|
||||
|
||||
def get_ref(self, ref):
|
||||
fid = get(ref, 'w:id')
|
||||
|
@ -106,6 +106,7 @@ class Convert(object):
|
||||
self.styles.apply_section_page_breaks(self.section_starts[1:])
|
||||
|
||||
notes_header = None
|
||||
orig_rid_map = self.images.rid_map
|
||||
if self.footnotes.has_notes:
|
||||
dl = DL()
|
||||
dl.set('class', 'notes')
|
||||
@ -118,6 +119,7 @@ class Convert(object):
|
||||
dl[-1][0].tail = ']'
|
||||
dl.append(DD())
|
||||
paras = []
|
||||
self.images.rid_map = note.rels[0]
|
||||
for wp in note:
|
||||
if wp.tag.endswith('}tbl'):
|
||||
self.tables.register(wp, self.styles)
|
||||
@ -127,6 +129,7 @@ class Convert(object):
|
||||
dl[-1].append(p)
|
||||
paras.append(wp)
|
||||
self.styles.apply_contextual_spacing(paras)
|
||||
self.images.rid_map = orig_rid_map
|
||||
|
||||
self.resolve_links(relationships_by_id)
|
||||
|
||||
@ -231,17 +234,22 @@ class Convert(object):
|
||||
fonts = self.fonts = Fonts()
|
||||
|
||||
foraw = enraw = None
|
||||
forel, enrel = ({}, {}), ({}, {})
|
||||
if foname is not None:
|
||||
try:
|
||||
foraw = self.docx.read(foname)
|
||||
except KeyError:
|
||||
self.log.warn('Footnotes %s do not exist' % foname)
|
||||
else:
|
||||
forel = self.docx.get_relationships(foname)
|
||||
if enname is not None:
|
||||
try:
|
||||
enraw = self.docx.read(enname)
|
||||
except KeyError:
|
||||
self.log.warn('Endnotes %s do not exist' % enname)
|
||||
footnotes(fromstring(foraw) if foraw else None, fromstring(enraw) if enraw else None)
|
||||
else:
|
||||
enrel = self.docx.get_relationships(enname)
|
||||
footnotes(fromstring(foraw) if foraw else None, forel, fromstring(enraw) if enraw else None, enrel)
|
||||
|
||||
if fname is not None:
|
||||
embed_relationships = self.docx.get_relationships(fname)[0]
|
||||
|
Loading…
x
Reference in New Issue
Block a user