From 5f515131a5660700b217a35c7933b9e5206f4690 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 31 Mar 2023 14:38:38 +0530 Subject: [PATCH] Content server: Add support for link_maps Only URLs of type http(s) are allowed --- imgsrc/srv/external-link.svg | 1 + src/calibre/db/cache.py | 2 +- src/calibre/srv/metadata.py | 3 +++ src/pyj/book_list/book_details.pyj | 14 +++++++++++--- 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 imgsrc/srv/external-link.svg diff --git a/imgsrc/srv/external-link.svg b/imgsrc/srv/external-link.svg new file mode 100644 index 0000000000..7072d735b9 --- /dev/null +++ b/imgsrc/srv/external-link.svg @@ -0,0 +1 @@ + diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 76e2925973..cca798bd4a 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -2386,9 +2386,9 @@ class Cache: return cached links = {} def add_links_for_field(f): - table = self.fields[f].table field_ids = self._field_ids_for(f, book_id) if field_ids: + table = self.fields[f].table lm = table.link_map id_link_map = {fid:lm.get(fid) for fid in field_ids} vm = table.id_map diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py index 89e11ce94d..eaef505f1e 100644 --- a/src/calibre/srv/metadata.py +++ b/src/calibre/srv/metadata.py @@ -87,6 +87,9 @@ def book_as_json(db, book_id): langs = ans.get('languages') if langs: ans['lang_names'] = {l:calibre_langcode_to_name(l) for l in langs} + link_maps = db.get_all_link_maps_for_book(book_id) + if link_maps: + ans['link_maps'] = link_maps return ans diff --git a/src/pyj/book_list/book_details.pyj b/src/pyj/book_list/book_details.pyj index fd958d7961..b0187d665f 100644 --- a/src/pyj/book_list/book_details.pyj +++ b/src/pyj/book_list/book_details.pyj @@ -190,6 +190,7 @@ def render_metadata(mi, table, book_id, iframe_css): # {{{ else: fields = filter(allowed_fields, fields) comments = v'[]' + link_maps = mi.link_maps or v'{}' def add_row(field, name, val, is_searchable=False, is_html=False, join=None, search_text=None, use_quotes=True): if val is undefined or val is None: @@ -199,18 +200,25 @@ def render_metadata(mi, table, book_id, iframe_css): # {{{ def add_val(v): if not v.appendChild: v += '' + parent = table.lastChild.lastChild if is_searchable: text_rep = search_text or v - table.lastChild.lastChild.appendChild(E.a( + parent.appendChild(E.a( v, title=_('Click to see books with {0}: {1}').format(name, text_rep), class_='blue-link', href=href_for_search(is_searchable, text_rep, use_quotes=use_quotes) )) + if link_maps[field] and link_maps[field][text_rep]: + url = link_maps[field][text_rep] + if url.startswith('https://') or url.startswith('http://'): + parent.appendChild(document.createTextNode(' ')) + parent.appendChild(E.a( + svgicon('external-link'), title=_('Click to open') + ': ' + url, href=url, target='_new', class_='blue-link')) else: if v.appendChild: - table.lastChild.lastChild.appendChild(v) + parent.appendChild(v) else: - table.lastChild.lastChild.appendChild(document.createTextNode(v)) + parent.appendChild(document.createTextNode(v)) table.appendChild(E.tr(E.td(name + ':'), E.td())) if is_html and /[<>]/.test(val + ''):