Improvements to printing and styling

Former-commit-id: 475e189c55cd22e4541b1c0d8f84592210ae1828 [formerly a7502fcc94a1eb0d378f83cba90e583550c20f0f]
Former-commit-id: df8bfd9592b208e7915e0922cf3912ea9bbba886
This commit is contained in:
Jaifroid 2019-08-03 12:46:21 +01:00
parent 6f68dcad8c
commit 8fbd0fd40d
4 changed files with 57 additions and 24 deletions

View File

@ -264,13 +264,29 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
btnContinue.innerHTML = "Please wait"; btnContinue.innerHTML = "Please wait";
goToArticle(decodeURIComponent(params.lastPageVisit.replace(/@kiwixKey@.+/, ""))); goToArticle(decodeURIComponent(params.lastPageVisit.replace(/@kiwixKey@.+/, "")));
}); });
document.getElementById('printImageCheck').addEventListener('click', function (e) {
//Reload article if user wants to print images
if (e.target.checked && !params.allowHTMLExtraction) {
params.printIntercept = true;
params.printInterception = false;
params.allowHTMLExtraction = true;
var btnContinue = document.getElementById('confirm-print-continue');
var btnCancel = document.getElementById('confirm-print-cancel');
btnCancel.disabled = true;
btnContinue.disabled = true;
btnContinue.innerHTML = "Please wait";
goToArticle(decodeURIComponent(params.lastPageVisit.replace(/@kiwixKey@.+/, "")));
}
});
function printCleanup() { function printCleanup() {
params.printIntercept = false; params.printIntercept = false;
params.printInterception = false; params.printInterception = false;
// Immediately restore temporarily changed values
params.allowHTMLExtraction = cookies.getItem('allowHTMLExtraction') == "true";
goToArticle(decodeURIComponent(params.lastPageVisit.replace(/@kiwixKey@.+/, ""))); goToArticle(decodeURIComponent(params.lastPageVisit.replace(/@kiwixKey@.+/, "")));
setTimeout(function () { //Restore temporarily changed value after page has reloaded setTimeout(function () { //Restore temporarily changed value after page has reloaded
params.rememberLastPage = cookies.getItem('rememberLastPage') == "false" ? false : true; params.rememberLastPage = cookies.getItem('rememberLastPage') == "true";
if (!params.rememberLastPage) { if (!params.rememberLastPage) {
cookies.setItem('lastPageVisit', "", Infinity); cookies.setItem('lastPageVisit', "", Infinity);
if (typeof Storage !== "undefined") { if (typeof Storage !== "undefined") {
@ -301,13 +317,16 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
if (determinedTheme != "light") { if (determinedTheme != "light") {
printModalContent.classList.add('dark'); printModalContent.classList.add('dark');
} }
//If document is in wrong style, reload it //If document is in wrong style, or images are one-time BLOBs, reload it
var innerDoc = window.frames[0].frameElement.contentDocument; var innerDoc = window.frames[0].frameElement.contentDocument;
var printDesktopCheck = document.getElementById("printDesktopCheck").checked;
var printImageCheck = document.getElementById("printImageCheck").checked;
var styleIsDesktop = !/\bhref\s*=\s*["'][^"']*?(?:minerva|mobile)/i.test(innerDoc.head.innerHTML); var styleIsDesktop = !/\bhref\s*=\s*["'][^"']*?(?:minerva|mobile)/i.test(innerDoc.head.innerHTML);
if (styleIsDesktop != document.getElementById("printDesktopCheck").checked) { if (styleIsDesktop != printDesktopCheck || printImageCheck && !params.allowHTMLExtraction) {
//We need to reload the document because it doesn't match the requested style //We need to reload the document because it doesn't match the requested style or images are one-time BLOBs
params.cssSource = styleIsDesktop ? "mobile" : "desktop"; params.cssSource = printDesktopCheck ? "desktop" : "mobile";
params.rememberLastPage = true; //Re-enable caching to speed up reloading of page params.rememberLastPage = true; //Re-enable caching to speed up reloading of page
params.allowHTMLExtraction = true;
params.printIntercept = true; params.printIntercept = true;
params.printInterception = false; params.printInterception = false;
btnCancel.disabled = true; btnCancel.disabled = true;
@ -323,6 +342,7 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
//Pre-load all images in case user wants to print them //Pre-load all images in case user wants to print them
if (params.imageDisplay) { if (params.imageDisplay) {
document.getElementById("printImageCheck").disabled = false; document.getElementById("printImageCheck").disabled = false;
if (printImageCheck) {
btnCancel.disabled = true; btnCancel.disabled = true;
btnContinue.disabled = true; btnContinue.disabled = true;
btnContinue.innerHTML = "Loading images..."; btnContinue.innerHTML = "Loading images...";
@ -334,6 +354,7 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
btnContinue.innerHTML = "Continue"; btnContinue.innerHTML = "Continue";
}; };
images.prepareImagesJQuery(printIntercept); images.prepareImagesJQuery(printIntercept);
}
} else { } else {
document.getElementById("printImageCheck").checked = false; document.getElementById("printImageCheck").checked = false;
document.getElementById("printImageCheck").disabled = true; document.getElementById("printImageCheck").disabled = true;
@ -2193,7 +2214,8 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
$("#prefix").val(""); $("#prefix").val("");
iframeArticleContent.onload = function () { iframeArticleContent.onload = function () {
// The content is fully loaded by the browser : we can hide the spinner // The content is fully loaded by the browser : we can hide the spinner
$("#searchingArticles").hide(); //$("#searchingArticles").hide();
setTab();
// Deflect drag-and-drop of ZIM file on the iframe to Config // Deflect drag-and-drop of ZIM file on the iframe to Config
var doc = iframeArticleContent.contentDocument ? iframeArticleContent.contentDocument.documentElement : null; var doc = iframeArticleContent.contentDocument ? iframeArticleContent.contentDocument.documentElement : null;
var docBody = doc ? doc.getElementsByTagName('body') : null; var docBody = doc ? doc.getElementsByTagName('body') : null;
@ -2216,7 +2238,12 @@ define(['jquery', 'zimArchiveLoader', 'uiUtil', 'util', 'utf8', 'images', 'cooki
// Display the iframe content // Display the iframe content
$("#articleContent").show(); $("#articleContent").show();
}; };
iframeArticleContent.src = "article.html"; // iframeArticleContent.src = "article.html";
var articleContent = iframeArticleContent.contentDocument;
articleContent.open('text/html', 'replace');
articleContent.write("<!DOCTYPE html>"); // Ensures browsers parse iframe in Standards mode
articleContent.write("<html><body></body></html>");
articleContent.close();
} else { } else {
// In jQuery mode, we read the article content in the backend and manually insert it in the iframe // In jQuery mode, we read the article content in the backend and manually insert it in the iframe
if (dirEntry.isRedirect()) { if (dirEntry.isRedirect()) {

View File

@ -83,6 +83,9 @@ define(['util', 'uiUtil'], function (util, uiUtil) {
if (/(-\/s\/style\.css)|minerva|inserted_style_mobile/i.test(zl)) { //If it matches one of the required styles... if (/(-\/s\/style\.css)|minerva|inserted_style_mobile/i.test(zl)) { //If it matches one of the required styles...
zl = (cs == "mobile") ? "-/s/style-mobile.css" : "-/s/style.css"; zl = (cs == "mobile") ? "-/s/style-mobile.css" : "-/s/style.css";
} }
// Rename this required mobile style so that we don't trigger reading ZIM as mobile in print intercept
zl = /css_modules\/mobile_main_page\.css/.test(zl) ? "-/s/css_modules/newstyle_main_page.css" : zl;
// Replace bootstrap with own: DEV: when upgrading to Bootstrap 4, stop doing this!
zl = zl.replace(/.+(bootstrap[^\/]*?\.css)/i, "css/$1"); zl = zl.replace(/.+(bootstrap[^\/]*?\.css)/i, "css/$1");
//Make link href relative to root //Make link href relative to root
//zl = zl.replace(/[\s\S]+?\/-\//i, "-/"); //zl = zl.replace(/[\s\S]+?\/-\//i, "-/");

View File

@ -55,10 +55,9 @@ define(['util'], function(util) {
myReader.readAsDataURL(blob); myReader.readAsDataURL(blob);
} else { } else {
url = URL.createObjectURL(blob); url = URL.createObjectURL(blob);
// We cannot revoke images if we wish to print node.addEventListener('load', function () {
// node.addEventListener('load', function () { URL.revokeObjectURL(url);
// URL.revokeObjectURL(url); });
// });
node.setAttribute(nodeAttribute, url); node.setAttribute(nodeAttribute, url);
if (callback) callback(); if (callback) callback();
} }
@ -134,6 +133,9 @@ define(['util'], function(util) {
innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<h2\b[^<]+external_links(?:[^<]|<\/)+<ul\s+(?!class="externalLinks"))/i, '$1class="externalLinks" '); innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<h2\b[^<]+external_links(?:[^<]|<\/)+<ul\s+(?!class="externalLinks"))/i, '$1class="externalLinks" ');
innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<h2\b[^<]+see_also(?:[^<]|<\/)+<ul\s+(?!class="seeAlso"))/i, '$1class="seeAlso" '); innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<h2\b[^<]+see_also(?:[^<]|<\/)+<ul\s+(?!class="seeAlso"))/i, '$1class="seeAlso" ');
innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<div\s+)([^>]+>\s+This article is issued from)/i, '$1class="copyLeft" $2'); innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/(<div\s+)([^>]+>\s+This article is issued from)/i, '$1class="copyLeft" $2');
// Using @media print on images doesn't get rid of them all, so use brute force
if (!document.getElementById("printImageCheck").checked)
innerDocument.body.innerHTML = innerDocument.body.innerHTML.replace(/<img\b[^>]*>\s*/ig, '');
var printOptions = innerDocument.getElementById("printOptions"); var printOptions = innerDocument.getElementById("printOptions");
//If there is no printOptions style block in the iframe, create it //If there is no printOptions style block in the iframe, create it
if (!printOptions) { if (!printOptions) {
@ -144,11 +146,11 @@ define(['util'], function(util) {
} }
var printStyleInnerHTML = "@media print { "; var printStyleInnerHTML = "@media print { ";
printStyleInnerHTML += document.getElementById("printNavBoxCheck").checked ? "" : ".navbox, .vertical-navbox { display: none; } "; printStyleInnerHTML += document.getElementById("printNavBoxCheck").checked ? "" : ".navbox, .vertical-navbox { display: none; } ";
printStyleInnerHTML += document.getElementById("printEndNoteCheck").checked ? "" : ".reflist { display: none; } "; printStyleInnerHTML += document.getElementById("printEndNoteCheck").checked ? "" : ".reflist, div[class*=references] { display: none; } ";
printStyleInnerHTML += document.getElementById("externalLinkCheck").checked ? "" : ".externalLinks { display: none; } "; printStyleInnerHTML += document.getElementById("externalLinkCheck").checked ? "" : ".externalLinks { display: none; } ";
printStyleInnerHTML += document.getElementById("seeAlsoLinkCheck").checked ? "" : ".seeAlso { display: none; } "; printStyleInnerHTML += document.getElementById("seeAlsoLinkCheck").checked ? "" : ".seeAlso { display: none; } ";
printStyleInnerHTML += document.getElementById("printInfoboxCheck").checked ? "" : ".mw-stack, .infobox, .infobox_v2, .infobox_v3, .qbRight, .qbRightDiv, .wv-quickbar, .wikitable { display: none; } "; printStyleInnerHTML += document.getElementById("printInfoboxCheck").checked ? "" : ".mw-stack, .infobox, .infobox_v2, .infobox_v3, .qbRight, .qbRightDiv, .wv-quickbar, .wikitable { display: none; } ";
printStyleInnerHTML += document.getElementById("printImageCheck").checked ? "" : "img { display: none; } "; // printStyleInnerHTML += document.getElementById("printImageCheck").checked ? "" : "img, .gallery { display: none; } ";
printStyleInnerHTML += ".copyLeft { display: none } "; printStyleInnerHTML += ".copyLeft { display: none } ";
printStyleInnerHTML += ".map-pin { display: none } "; printStyleInnerHTML += ".map-pin { display: none } ";
printStyleInnerHTML += ".external { padding-right: 0 !important } "; printStyleInnerHTML += ".external { padding-right: 0 !important } ";
@ -158,6 +160,7 @@ define(['util'], function(util) {
printStyleInnerHTML += "body { font-size: " + sliderVal + "% !important; } "; printStyleInnerHTML += "body { font-size: " + sliderVal + "% !important; } ";
printStyleInnerHTML += "}"; printStyleInnerHTML += "}";
printOptions.innerHTML = printStyleInnerHTML; printOptions.innerHTML = printStyleInnerHTML;
} }
function downloadBlobUWP(blob, filename, message) { function downloadBlobUWP(blob, filename, message) {