mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix link updating not working
This commit is contained in:
parent
6a56d253dc
commit
b2472ea80a
@ -372,6 +372,7 @@ def merge_html(container, names, master, insert_page_breaks=False):
|
|||||||
master_body = p(master).findall('h:body', namespaces=XPNSMAP)[-1]
|
master_body = p(master).findall('h:body', namespaces=XPNSMAP)[-1]
|
||||||
master_base = os.path.dirname(master)
|
master_base = os.path.dirname(master)
|
||||||
anchor_map = {n:{} for n in names if n != master}
|
anchor_map = {n:{} for n in names if n != master}
|
||||||
|
first_anchor_map = {}
|
||||||
|
|
||||||
for name in names:
|
for name in names:
|
||||||
if name == master:
|
if name == master:
|
||||||
@ -419,6 +420,7 @@ def merge_html(container, names, master, insert_page_breaks=False):
|
|||||||
if 'id' not in first_child.attrib:
|
if 'id' not in first_child.attrib:
|
||||||
first_child.set('id', unique_anchor(seen_anchors, 'top'))
|
first_child.set('id', unique_anchor(seen_anchors, 'top'))
|
||||||
seen_anchors.add(first_child.get('id'))
|
seen_anchors.add(first_child.get('id'))
|
||||||
|
first_anchor_map[name] = first_child.get('id')
|
||||||
|
|
||||||
if insert_page_breaks:
|
if insert_page_breaks:
|
||||||
first_child.set('style', first_child.get('style', '') + '; page-break-before: always')
|
first_child.set('style', first_child.get('style', '') + '; page-break-before: always')
|
||||||
@ -444,6 +446,8 @@ def merge_html(container, names, master, insert_page_breaks=False):
|
|||||||
repl = MergeLinkReplacer(fname, anchor_map, master, container)
|
repl = MergeLinkReplacer(fname, anchor_map, master, container)
|
||||||
container.replace_links(fname, repl)
|
container.replace_links(fname, repl)
|
||||||
|
|
||||||
|
return first_anchor_map
|
||||||
|
|
||||||
|
|
||||||
def merge_css(container, names, master):
|
def merge_css(container, names, master):
|
||||||
p = container.parsed
|
p = container.parsed
|
||||||
|
@ -247,13 +247,14 @@ def add_cover(pdf_doc, cover_data, page_layout, opts):
|
|||||||
|
|
||||||
|
|
||||||
# Margin groups {{{
|
# Margin groups {{{
|
||||||
def create_margin_groups(container):
|
def create_margin_groups(container, name_anchor_map):
|
||||||
|
|
||||||
def merge_group(group):
|
def merge_group(group):
|
||||||
if len(group) > 1:
|
if len(group) > 1:
|
||||||
group_margins = group[0][1]
|
group_margins = group[0][1]
|
||||||
names = [name for (name, margins) in group]
|
names = [name for (name, margins) in group]
|
||||||
merge_html(container, names, names[0], insert_page_breaks=True)
|
first_anchor_map = merge_html(container, names, names[0], insert_page_breaks=True)
|
||||||
|
name_anchor_map.update(first_anchor_map)
|
||||||
group = [(names[0], group_margins)]
|
group = [(names[0], group_margins)]
|
||||||
return group
|
return group
|
||||||
|
|
||||||
@ -371,8 +372,11 @@ class AnchorLocation(object):
|
|||||||
self.pagenum, self.left, self.top, self.zoom = pagenum, left, top, zoom
|
self.pagenum, self.left, self.top, self.zoom = pagenum, left, top, zoom
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return 'AnchorLocation(pagenum={}, left={}, top={}, zoom={})'.format(
|
return 'AnchorLocation(pagenum={}, left={}, top={}, zoom={})'.format(self.as_tuple)
|
||||||
self.pagenum, self.left, self.top, self.zoom)
|
|
||||||
|
@property
|
||||||
|
def as_tuple(self):
|
||||||
|
return self.pagenum, self.left, self.top, self.zoom
|
||||||
|
|
||||||
|
|
||||||
def get_anchor_locations(pdf_doc, first_page_num, toc_uuid):
|
def get_anchor_locations(pdf_doc, first_page_num, toc_uuid):
|
||||||
@ -403,7 +407,7 @@ def fix_links(pdf_doc, anchor_locations, name_anchor_map, mark_links, log):
|
|||||||
loc = anchor_locations.get(name_anchor_map.get(purl.fragment))
|
loc = anchor_locations.get(name_anchor_map.get(purl.fragment))
|
||||||
if loc is None:
|
if loc is None:
|
||||||
log.warn('Anchor location for link to {} not found'.format(purl.fragment))
|
log.warn('Anchor location for link to {} not found'.format(purl.fragment))
|
||||||
return loc
|
return None if loc is None else loc.as_tuple
|
||||||
|
|
||||||
pdf_doc.alter_links(replace_link, mark_links)
|
pdf_doc.alter_links(replace_link, mark_links)
|
||||||
# }}}
|
# }}}
|
||||||
@ -520,8 +524,8 @@ def add_pagenum_toc(root, toc, opts, page_number_display_map):
|
|||||||
def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, cover_data=None, report_progress=lambda x, y: None):
|
def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, cover_data=None, report_progress=lambda x, y: None):
|
||||||
container = Container(opf_path, log)
|
container = Container(opf_path, log)
|
||||||
report_progress(0.05, _('Parsed all content for markup transformation'))
|
report_progress(0.05, _('Parsed all content for markup transformation'))
|
||||||
margin_groups = create_margin_groups(container)
|
|
||||||
name_anchor_map = make_anchors_unique(container)
|
name_anchor_map = make_anchors_unique(container)
|
||||||
|
margin_groups = create_margin_groups(container, name_anchor_map)
|
||||||
toc = get_toc(container, verify_destinations=False)
|
toc = get_toc(container, verify_destinations=False)
|
||||||
has_toc = toc and len(toc)
|
has_toc = toc and len(toc)
|
||||||
links_page_uuid = add_all_links(container, margin_groups)
|
links_page_uuid = add_all_links(container, margin_groups)
|
||||||
|
@ -453,17 +453,16 @@ PDFDoc_alter_links(PDFDoc *self, PyObject *args) {
|
|||||||
PdfObject *uo = A.GetKey("URI");
|
PdfObject *uo = A.GetKey("URI");
|
||||||
if (uo && uo->IsString()) {
|
if (uo && uo->IsString()) {
|
||||||
const std::string &uri = uo->GetString().GetStringUtf8();
|
const std::string &uri = uo->GetString().GetStringUtf8();
|
||||||
PyObject *ret = PyObject_CallObject(alter_callback, Py_BuildValue("(N)", PyUnicode_DecodeUTF8(uri.c_str(), uri.length(), "replace")));
|
pyunique_ptr ret(PyObject_CallObject(alter_callback, Py_BuildValue("(N)", PyUnicode_DecodeUTF8(uri.c_str(), uri.length(), "replace"))));
|
||||||
if (!ret) { return NULL; }
|
if (!ret) { return NULL; }
|
||||||
if (PyTuple_Check(ret) && PyTuple_GET_SIZE(ret) == 4) {
|
if (PyTuple_Check(ret.get()) && PyTuple_GET_SIZE(ret.get()) == 4) {
|
||||||
int pagenum; double left, top, zoom;
|
int pagenum; double left, top, zoom;
|
||||||
if (PyArg_ParseTuple(ret, "iddd", &pagenum, &left, &top, &zoom)) {
|
if (PyArg_ParseTuple(ret.get(), "iddd", &pagenum, &left, &top, &zoom)) {
|
||||||
PdfPage *page = NULL;
|
PdfPage *page = NULL;
|
||||||
try {
|
try {
|
||||||
page = self->doc->GetPage(pagenum - 1);
|
page = self->doc->GetPage(pagenum - 1);
|
||||||
} catch(const PdfError &err) {
|
} catch(const PdfError &err) {
|
||||||
PyErr_Format(PyExc_ValueError, "No page number %d in the PDF file", pagenum);
|
PyErr_Format(PyExc_ValueError, "No page number %d in the PDF file", pagenum);
|
||||||
Py_DECREF(ret);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (page) {
|
if (page) {
|
||||||
@ -473,7 +472,6 @@ PDFDoc_alter_links(PDFDoc *self, PyObject *args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Py_DECREF(ret);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user