mirror of https://github.com/kiwix/libkiwix.git
Viewer settings
Made the viewer respect the `--blockexternal` and `--nolibrarybutton` options of `kiwix-serve`. Those options are passed to the viewer via the dynamically generated resource `/viewer_settings.js`.
This commit is contained in:
parent
b81cb3a8e9
commit
369406fb5d
|
@ -556,6 +556,9 @@ std::unique_ptr<Response> InternalServer::handle_request(const RequestContext& r
|
||||||
if (isEndpointUrl(url, "viewer") || isEndpointUrl(url, "skin"))
|
if (isEndpointUrl(url, "viewer") || isEndpointUrl(url, "skin"))
|
||||||
return handle_skin(request);
|
return handle_skin(request);
|
||||||
|
|
||||||
|
if (url == "/viewer_settings.js")
|
||||||
|
return handle_viewer_settings(request);
|
||||||
|
|
||||||
if (isEndpointUrl(url, "content"))
|
if (isEndpointUrl(url, "content"))
|
||||||
return handle_content(request);
|
return handle_content(request);
|
||||||
|
|
||||||
|
@ -713,6 +716,19 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
|
||||||
return std::move(response);
|
return std::move(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Response> InternalServer::handle_viewer_settings(const RequestContext& request)
|
||||||
|
{
|
||||||
|
if (m_verbose.load()) {
|
||||||
|
printf("** running handle_viewer_settings\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
const kainjow::mustache::object data{
|
||||||
|
{"enable_link_blocking", m_blockExternalLinks ? "true" : "false" },
|
||||||
|
{"enable_library_button", m_withLibraryButton ? "true" : "false" }
|
||||||
|
};
|
||||||
|
return ContentResponse::build(*this, RESOURCE::templates::viewer_settings_js, data, "application/javascript; charset=utf-8");
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<Response> InternalServer::handle_skin(const RequestContext& request)
|
std::unique_ptr<Response> InternalServer::handle_skin(const RequestContext& request)
|
||||||
{
|
{
|
||||||
if (m_verbose.load()) {
|
if (m_verbose.load()) {
|
||||||
|
|
|
@ -126,6 +126,7 @@ class InternalServer {
|
||||||
std::unique_ptr<Response> handle_request(const RequestContext& request);
|
std::unique_ptr<Response> handle_request(const RequestContext& request);
|
||||||
std::unique_ptr<Response> build_redirect(const std::string& bookName, const zim::Item& item) const;
|
std::unique_ptr<Response> build_redirect(const std::string& bookName, const zim::Item& item) const;
|
||||||
std::unique_ptr<Response> build_homepage(const RequestContext& request);
|
std::unique_ptr<Response> build_homepage(const RequestContext& request);
|
||||||
|
std::unique_ptr<Response> handle_viewer_settings(const RequestContext& request);
|
||||||
std::unique_ptr<Response> handle_skin(const RequestContext& request);
|
std::unique_ptr<Response> handle_skin(const RequestContext& request);
|
||||||
std::unique_ptr<Response> handle_catalog(const RequestContext& request);
|
std::unique_ptr<Response> handle_catalog(const RequestContext& request);
|
||||||
std::unique_ptr<Response> handle_catalog_v2(const RequestContext& request);
|
std::unique_ptr<Response> handle_catalog_v2(const RequestContext& request);
|
||||||
|
|
|
@ -30,6 +30,7 @@ templates/catalog_v2_entry.xml
|
||||||
templates/catalog_v2_categories.xml
|
templates/catalog_v2_categories.xml
|
||||||
templates/catalog_v2_languages.xml
|
templates/catalog_v2_languages.xml
|
||||||
templates/url_of_search_results_css
|
templates/url_of_search_results_css
|
||||||
|
templates/viewer_settings.js
|
||||||
opensearchdescription.xml
|
opensearchdescription.xml
|
||||||
ft_opensearchdescription.xml
|
ft_opensearchdescription.xml
|
||||||
catalog_v2_searchdescription.xml
|
catalog_v2_searchdescription.xml
|
||||||
|
|
|
@ -197,7 +197,6 @@ const block_path = `${root}/catch/external`;
|
||||||
function blockLink(target) {
|
function blockLink(target) {
|
||||||
const encodedHref = encodeURIComponent(target.href);
|
const encodedHref = encodeURIComponent(target.href);
|
||||||
target.setAttribute("href", block_path + "?source=" + encodedHref);
|
target.setAttribute("href", block_path + "?source=" + encodedHref);
|
||||||
target.setAttribute("target", "_top");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function isExternalUrl(url) {
|
function isExternalUrl(url) {
|
||||||
|
@ -213,8 +212,12 @@ function onClickEvent(e) {
|
||||||
const iframeDocument = contentIframe.contentDocument;
|
const iframeDocument = contentIframe.contentDocument;
|
||||||
const target = matchingAncestorElement(e.target, iframeDocument, "a");
|
const target = matchingAncestorElement(e.target, iframeDocument, "a");
|
||||||
if (target !== null && "href" in target) {
|
if (target !== null && "href" in target) {
|
||||||
if ( isExternalUrl(target.href) )
|
if ( isExternalUrl(target.href) ) {
|
||||||
return blockLink(target);
|
target.setAttribute("target", "_top");
|
||||||
|
if ( viewerSettings.linkBlockingEnabled ) {
|
||||||
|
return blockLink(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,6 +267,10 @@ function on_content_load() {
|
||||||
window.onresize = handle_visual_viewport_change;
|
window.onresize = handle_visual_viewport_change;
|
||||||
window.onhashchange = handle_location_hash_change;
|
window.onhashchange = handle_location_hash_change;
|
||||||
|
|
||||||
|
if ( ! viewerSettings.libraryButtonEnabled ) {
|
||||||
|
document.getElementById("kiwix_serve_taskbar_library_button").remove();
|
||||||
|
}
|
||||||
|
|
||||||
updateCurrentBook(currentBook);
|
updateCurrentBook(currentBook);
|
||||||
handle_location_hash_change();
|
handle_location_hash_change();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
const viewerSettings = {
|
||||||
|
linkBlockingEnabled: {{enable_link_blocking}},
|
||||||
|
libraryButtonEnabled: {{enable_library_button}}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link type="text/css" href="./skin/taskbar.css?KIWIXCACHEID" rel="Stylesheet" />
|
<link type="text/css" href="./skin/taskbar.css?KIWIXCACHEID" rel="Stylesheet" />
|
||||||
<link type="text/css" href="./skin/css/autoComplete.css?KIWIXCACHEID" rel="Stylesheet" />
|
<link type="text/css" href="./skin/css/autoComplete.css?KIWIXCACHEID" rel="Stylesheet" />
|
||||||
|
<script type="text/javascript" src="./viewer_settings.js"></script>
|
||||||
<script type="text/javascript" src="./skin/viewer.js?KIWIXCACHEID" defer></script>
|
<script type="text/javascript" src="./skin/viewer.js?KIWIXCACHEID" defer></script>
|
||||||
<script type="text/javascript" src="./skin/autoComplete.min.js?KIWIXCACHEID"></script>
|
<script type="text/javascript" src="./skin/autoComplete.min.js?KIWIXCACHEID"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -199,7 +199,7 @@ R"EXPECTEDRESULT( <img src="../skin/download.png?
|
||||||
/* url */ "/ROOT/viewer",
|
/* url */ "/ROOT/viewer",
|
||||||
R"EXPECTEDRESULT( <link type="text/css" href="./skin/taskbar.css?cacheid=26082885" rel="Stylesheet" />
|
R"EXPECTEDRESULT( <link type="text/css" href="./skin/taskbar.css?cacheid=26082885" rel="Stylesheet" />
|
||||||
<link type="text/css" href="./skin/css/autoComplete.css?cacheid=08951e06" rel="Stylesheet" />
|
<link type="text/css" href="./skin/css/autoComplete.css?cacheid=08951e06" rel="Stylesheet" />
|
||||||
<script type="text/javascript" src="./skin/viewer.js?cacheid=775a48fa" defer></script>
|
<script type="text/javascript" src="./skin/viewer.js?cacheid=9ec149c0" defer></script>
|
||||||
<script type="text/javascript" src="./skin/autoComplete.min.js?cacheid=1191aaaf"></script>
|
<script type="text/javascript" src="./skin/autoComplete.min.js?cacheid=1191aaaf"></script>
|
||||||
const blankPageUrl = `${root}/skin/blank.html`;
|
const blankPageUrl = `${root}/skin/blank.html`;
|
||||||
<label for="kiwix_button_show_toggle"><img src="./skin/caret.png?cacheid=22b942b4" alt=""></label>
|
<label for="kiwix_button_show_toggle"><img src="./skin/caret.png?cacheid=22b942b4" alt=""></label>
|
||||||
|
|
Loading…
Reference in New Issue