From 7d9081a4e458af5d3df78b1590ebf36456dc1345 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 7 Sep 2013 13:51:10 +0530 Subject: [PATCH] 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) --- src/calibre/ebooks/docx/footnotes.py | 9 +++++---- src/calibre/ebooks/docx/to_html.py | 10 +++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/docx/footnotes.py b/src/calibre/ebooks/docx/footnotes.py index ff2613cbb1..704edc88d7 100644 --- a/src/calibre/ebooks/docx/footnotes.py +++ b/src/calibre/ebooks/docx/footnotes.py @@ -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') diff --git a/src/calibre/ebooks/docx/to_html.py b/src/calibre/ebooks/docx/to_html.py index 05b4b7e9d3..103cf03e20 100644 --- a/src/calibre/ebooks/docx/to_html.py +++ b/src/calibre/ebooks/docx/to_html.py @@ -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]