From 95afdeecb6c797348fc68a680e57351636c12328 Mon Sep 17 00:00:00 2001 From: Jaifroid Date: Mon, 28 May 2018 13:43:43 +0100 Subject: [PATCH] Fix 404 errors in http mode #376 (#378) --- www/js/app.js | 115 +++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 62 deletions(-) diff --git a/www/js/app.js b/www/js/app.js index 90a23be4..70cb9a7d 100644 --- a/www/js/app.js +++ b/www/js/app.js @@ -807,10 +807,12 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies','abstractFiles var regexpZIMUrlWithNamespace = /(?:^|\/)([-ABIJMUVWX]\/.+)/; // Pattern to match a local anchor in a href var regexpLocalAnchorHref = /^#/; - // These regular expressions match both relative and absolute URLs - // Since late 2014, all ZIM files should use relative URLs - var regexpImageUrl = /^(?:\.\.\/|\/)+(I\/.*)$/; - var regexpMetadataUrl = /^(?:\.\.\/|\/)+(-\/.*)$/; + // Regex below finds images, scripts and stylesheets with ZIM-type metadata and image namespaces [kiwix-js #378] + // It first searches for ]*?\b)(?:src|href)(\s*=\s*["']\s*)(?:\.\.\/|\/)+([-I]\/[^"']*)/ig; // Cache for CSS styles contained in ZIM. // It significantly speeds up subsequent page display. See kiwix-js issue #335 @@ -828,8 +830,9 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies','abstractFiles $("#articleContent").contents().scrollTop(0); if (contentInjectionMode === 'jquery') { - // Fast-replace img src with data-kiwixsrc [kiwix-js #272] - htmlArticle = htmlArticle.replace(/(]*\b)src(\s*=)/ig, '$1data-kiwixsrc$2'); + // Replaces ZIM-style URLs of img, script and link tags with a data-url to prevent 404 errors [kiwix-js #272 #376] + // This replacement also processes the URL to remove the path so that the URL is ready for subsequent jQuery functions + htmlArticle = htmlArticle.replace(regexpTagsWithZimUrl, "$1data-kiwixurl$2$3"); } // Compute base URL @@ -917,22 +920,18 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies','abstractFiles } function loadImagesJQuery() { - $('#articleContent').contents().find('body').find('img').each(function() { + $('#articleContent').contents().find('body').find('img[data-kiwixurl]').each(function() { var image = $(this); - // It's a standard image contained in the ZIM file - // We try to find its name (from an absolute or relative URL) - var imageMatch = image.attr("data-kiwixsrc").match(regexpImageUrl); //kiwix-js #272 - if (imageMatch) { - var title = decodeURIComponent(imageMatch[1]); - selectedArchive.getDirEntryByTitle(title).then(function(dirEntry) { - selectedArchive.readBinaryFile(dirEntry, function (fileDirEntry, content) { - // TODO : use the complete MIME-type of the image (as read from the ZIM file) - uiUtil.feedNodeWithBlob(image, 'src', content, 'image'); - }); - }).fail(function (e) { - console.error("could not find DirEntry for image:" + title, e); + var imageUrl = image.attr("data-kiwixurl"); + var title = decodeURIComponent(imageUrl); + selectedArchive.getDirEntryByTitle(title).then(function(dirEntry) { + selectedArchive.readBinaryFile(dirEntry, function (fileDirEntry, content) { + // TODO : use the complete MIME-type of the image (as read from the ZIM file) + uiUtil.feedNodeWithBlob(image, 'src', content, 'image'); }); - } + }).fail(function (e) { + console.error("could not find DirEntry for image:" + title, e); + }); }); } @@ -948,56 +947,48 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies','abstractFiles collapsedBlocks[i].classList.add('open-block'); } - $('#articleContent').contents().find('link[rel=stylesheet]').each(function() { + $('#articleContent').contents().find('link[data-kiwixurl]').each(function() { var link = $(this); - // We try to find its name (from an absolute or relative URL) - var hrefMatch = link.attr("href").match(regexpMetadataUrl); - if (hrefMatch) { - // It's a CSS file contained in the ZIM file - var title = uiUtil.removeUrlParameters(decodeURIComponent(hrefMatch[1])); - if (cssCache && cssCache.has(title)) { - var cssContent = cssCache.get(title); - uiUtil.replaceCSSLinkWithInlineCSS(link, cssContent); - } else { - selectedArchive.getDirEntryByTitle(title) - .then(function (dirEntry) { - return selectedArchive.readUtf8File(dirEntry, - function (fileDirEntry, content) { - var fullUrl = fileDirEntry.namespace + "/" + fileDirEntry.url; - if (cssCache) cssCache.set(fullUrl, content); - uiUtil.replaceCSSLinkWithInlineCSS(link, content); - } - ); - }).fail(function (e) { - console.error("could not find DirEntry for CSS : " + title, e); - }); - } + var linkUrl = link.attr("data-kiwixurl"); + var title = uiUtil.removeUrlParameters(decodeURIComponent(linkUrl)); + if (cssCache && cssCache.has(title)) { + var cssContent = cssCache.get(title); + uiUtil.replaceCSSLinkWithInlineCSS(link, cssContent); + } else { + selectedArchive.getDirEntryByTitle(title) + .then(function (dirEntry) { + return selectedArchive.readUtf8File(dirEntry, + function (fileDirEntry, content) { + var fullUrl = fileDirEntry.namespace + "/" + fileDirEntry.url; + if (cssCache) cssCache.set(fullUrl, content); + uiUtil.replaceCSSLinkWithInlineCSS(link, content); + } + ); + }).fail(function (e) { + console.error("could not find DirEntry for CSS : " + title, e); + }); } }); } function loadJavaScriptJQuery() { - $('#articleContent').contents().find('script').each(function() { + $('#articleContent').contents().find('script[data-kiwixurl]').each(function() { var script = $(this); - // We try to find its name (from an absolute or relative URL) - var srcMatch = script.attr("src") ? script.attr("src").match(regexpMetadataUrl) : null; + var scriptUrl = script.attr("data-kiwixurl"); // TODO check that the type of the script is text/javascript or application/javascript - if (srcMatch) { - // It's a Javascript file contained in the ZIM file - var title = uiUtil.removeUrlParameters(decodeURIComponent(srcMatch[1])); - selectedArchive.getDirEntryByTitle(title).then(function(dirEntry) { - if (dirEntry === null) { - console.log("Error: js file not found: " + title); - } else { - selectedArchive.readBinaryFile(dirEntry, function (fileDirEntry, content) { - // TODO : JavaScript support not yet functional [kiwix-js #152] - uiUtil.feedNodeWithBlob(script, 'src', content, 'text/javascript'); - }); - } - }).fail(function (e) { - console.error("could not find DirEntry for javascript : " + title, e); - }); - } + var title = uiUtil.removeUrlParameters(decodeURIComponent(scriptUrl)); + selectedArchive.getDirEntryByTitle(title).then(function(dirEntry) { + if (dirEntry === null) { + console.log("Error: js file not found: " + title); + } else { + selectedArchive.readBinaryFile(dirEntry, function (fileDirEntry, content) { + // TODO : JavaScript support not yet functional [kiwix-js #152] + uiUtil.feedNodeWithBlob(script, 'src', content, 'text/javascript'); + }); + } + }).fail(function (e) { + console.error("could not find DirEntry for javascript : " + title, e); + }); }); } }