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):
|
class Note(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent, rels):
|
||||||
self.type = get(parent, 'w:type', 'normal')
|
self.type = get(parent, 'w:type', 'normal')
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
self.rels = rels
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
for p in descendants(self.parent, 'w:p', 'w:tbl'):
|
for p in descendants(self.parent, 'w:p', 'w:tbl'):
|
||||||
@ -28,18 +29,18 @@ class Footnotes(object):
|
|||||||
self.counter = 0
|
self.counter = 0
|
||||||
self.notes = OrderedDict()
|
self.notes = OrderedDict()
|
||||||
|
|
||||||
def __call__(self, footnotes, endnotes):
|
def __call__(self, footnotes, footnotes_rels, endnotes, endnotes_rels):
|
||||||
if footnotes is not None:
|
if footnotes is not None:
|
||||||
for footnote in XPath('./w:footnote[@w:id]')(footnotes):
|
for footnote in XPath('./w:footnote[@w:id]')(footnotes):
|
||||||
fid = get(footnote, 'w:id')
|
fid = get(footnote, 'w:id')
|
||||||
if fid:
|
if fid:
|
||||||
self.footnotes[fid] = Note(footnote)
|
self.footnotes[fid] = Note(footnote, footnotes_rels)
|
||||||
|
|
||||||
if endnotes is not None:
|
if endnotes is not None:
|
||||||
for endnote in XPath('./w:endnote[@w:id]')(endnotes):
|
for endnote in XPath('./w:endnote[@w:id]')(endnotes):
|
||||||
fid = get(endnote, 'w:id')
|
fid = get(endnote, 'w:id')
|
||||||
if fid:
|
if fid:
|
||||||
self.endnotes[fid] = Note(endnote)
|
self.endnotes[fid] = Note(endnote, endnotes_rels)
|
||||||
|
|
||||||
def get_ref(self, ref):
|
def get_ref(self, ref):
|
||||||
fid = get(ref, 'w:id')
|
fid = get(ref, 'w:id')
|
||||||
|
@ -106,6 +106,7 @@ class Convert(object):
|
|||||||
self.styles.apply_section_page_breaks(self.section_starts[1:])
|
self.styles.apply_section_page_breaks(self.section_starts[1:])
|
||||||
|
|
||||||
notes_header = None
|
notes_header = None
|
||||||
|
orig_rid_map = self.images.rid_map
|
||||||
if self.footnotes.has_notes:
|
if self.footnotes.has_notes:
|
||||||
dl = DL()
|
dl = DL()
|
||||||
dl.set('class', 'notes')
|
dl.set('class', 'notes')
|
||||||
@ -118,6 +119,7 @@ class Convert(object):
|
|||||||
dl[-1][0].tail = ']'
|
dl[-1][0].tail = ']'
|
||||||
dl.append(DD())
|
dl.append(DD())
|
||||||
paras = []
|
paras = []
|
||||||
|
self.images.rid_map = note.rels[0]
|
||||||
for wp in note:
|
for wp in note:
|
||||||
if wp.tag.endswith('}tbl'):
|
if wp.tag.endswith('}tbl'):
|
||||||
self.tables.register(wp, self.styles)
|
self.tables.register(wp, self.styles)
|
||||||
@ -127,6 +129,7 @@ class Convert(object):
|
|||||||
dl[-1].append(p)
|
dl[-1].append(p)
|
||||||
paras.append(wp)
|
paras.append(wp)
|
||||||
self.styles.apply_contextual_spacing(paras)
|
self.styles.apply_contextual_spacing(paras)
|
||||||
|
self.images.rid_map = orig_rid_map
|
||||||
|
|
||||||
self.resolve_links(relationships_by_id)
|
self.resolve_links(relationships_by_id)
|
||||||
|
|
||||||
@ -231,17 +234,22 @@ class Convert(object):
|
|||||||
fonts = self.fonts = Fonts()
|
fonts = self.fonts = Fonts()
|
||||||
|
|
||||||
foraw = enraw = None
|
foraw = enraw = None
|
||||||
|
forel, enrel = ({}, {}), ({}, {})
|
||||||
if foname is not None:
|
if foname is not None:
|
||||||
try:
|
try:
|
||||||
foraw = self.docx.read(foname)
|
foraw = self.docx.read(foname)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.log.warn('Footnotes %s do not exist' % foname)
|
self.log.warn('Footnotes %s do not exist' % foname)
|
||||||
|
else:
|
||||||
|
forel = self.docx.get_relationships(foname)
|
||||||
if enname is not None:
|
if enname is not None:
|
||||||
try:
|
try:
|
||||||
enraw = self.docx.read(enname)
|
enraw = self.docx.read(enname)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.log.warn('Endnotes %s do not exist' % enname)
|
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:
|
if fname is not None:
|
||||||
embed_relationships = self.docx.get_relationships(fname)[0]
|
embed_relationships = self.docx.get_relationships(fname)[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user