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:
Kovid Goyal 2013-09-07 13:51:10 +05:30
parent f0d61014ab
commit 7d9081a4e4
2 changed files with 14 additions and 5 deletions

View File

@ -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')

View File

@ -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]