diff --git a/web-extension/background.js b/web-extension/background.js index 73b5513..3aa2ca6 100644 --- a/web-extension/background.js +++ b/web-extension/background.js @@ -120,6 +120,10 @@ display: none; ]; chrome.commands.onCommand.addListener((command) => { + executeCommand({type: command}) +}); + +function executeCommand(command) { if (isBusy) { chrome.tabs.query({ currentWindow: true, @@ -131,24 +135,24 @@ chrome.commands.onCommand.addListener((command) => { }) return; } - if (command === 'save-page') { + if (command.type === 'save-page') { dispatch('extract-page', false, []); isBusy = true; - } else if (command === 'save-selection') { + } else if (command.type === 'save-selection') { dispatch('extract-selection', false, []); isBusy = true; - } else if (command === 'add-page') { + } else if (command.type === 'add-page') { dispatch('extract-page', true, []); isBusy = true; - } else if (command === 'add-selection') { + } else if (command.type === 'add-selection') { dispatch('extract-selection', true, []); isBusy = true; } -}); +} function dispatch(action, justAddToBuffer, appliedStyles) { if (!justAddToBuffer) { - removeEbook(); + _execRequest({type: 'remove'}); } chrome.browserAction.setBadgeBackgroundColor({color:"red"}); chrome.browserAction.setBadgeText({text: "Busy"}); @@ -200,13 +204,6 @@ function dispatch(action, justAddToBuffer, appliedStyles) { } } - chrome.tabs.executeScript(tab[0].id, {file: '/jquery.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/filesaver.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip-utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/saveEbook.js'}); - chrome.tabs.sendMessage(tab[0].id, { type: action, appliedStyles: appliedStyles @@ -265,7 +262,9 @@ function dispatch(action, justAddToBuffer, appliedStyles) { }); } -chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { +chrome.runtime.onMessage.addListener(_execRequest); + +function _execRequest(request, sender, sendResponse) { if (request.type === 'get') { chrome.storage.local.get('allPages', function (data) { if (!data || !data.allPages) { @@ -296,130 +295,6 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if (request.type === 'get styles') { chrome.storage.local.get('styles', function (data) { if (!data || !data.styles) { - // TODO move defaultStyles in a different file/location ? - var defaultStyles = [ - { - title: 'Reddit Comments', - url: 'reddit\\.com\\/r\\/[^\\/]+\\/comments', - style: `.side { - display: none; -} -#header { - display: none; -} -.arrow, .expand, .score, .live-timestamp, .flat-list, .buttons, .morecomments, .footer-parent, .icon { - display: none !important; -} -` - },{ - title: 'Wikipedia Article', - url: 'wikipedia\\.org\\/wiki\\/', - style: `#mw-navigation { - display: none; -} -#footer { - display: none; -} -#mw-panel { - display: none; -} -#mw-head { - display: none; -} -` - },{ - title: 'YCombinator News Comments', - url: 'news\\.ycombinator\\.com\\/item\\?id=[0-9]+', - style: `#hnmain > tbody > tr:nth-child(1) > td > table { - display: none; -} -* { - background-color: white; -} -.title, .storylink { - text-align: left; - font-weight: bold; - font-size: 20px; -} -.score { - display: none; -} -.age { - display: none; -} -.hnpast { - display: none; -} -.togg { - display: none; -} -.votelinks, .rank { - display: none; -} -.votearrow { - display: none; -} -.yclinks { - display: none; -} -form { - display: none; -} -a.hnuser { - font-weight: bold; - color: black !important; - padding: 3px; -} -.subtext > span, .subtext > a:not(:nth-child(2)) { - display: none; -} -` - },{ - title: 'Medium Article', - url: 'medium\\.com', - style: `.metabar { - display: none !important; -} -header.container { - display: none; -} -.js-postShareWidget { - display: none; -} -footer, canvas { - display: none !important; -} -.u-fixed, .u-bottom0 { - display: none; -} -` - },{ - title: 'Twitter', - url: 'twitter\\.com\\/.+', - style: `.topbar { - display: none !important; -} -.ProfileCanopy, .ProfileCanopy-inner { - display: none; -} -.ProfileSidebar { - display: none; -} -.ProfileHeading { - display: none !important; -} -.ProfileTweet-actionList { - display: none; -} -` - } - -/* - - -*/ - - ]; sendResponse({styles: defaultStyles}); } else { sendResponse({styles: data.styles}); @@ -459,5 +334,9 @@ footer, canvas { if (request.type === 'set is busy') { isBusy = request.isBusy } + if (request.type === 'save-page' || request.type === 'save-selection' || + request.type === 'add-page' || request.type === 'add-selection') { + executeCommand({type: request.type}) + } return true; -}); +} diff --git a/web-extension/extractHtml.js b/web-extension/extractHtml.js index 5772b78..9458e39 100644 --- a/web-extension/extractHtml.js +++ b/web-extension/extractHtml.js @@ -321,54 +321,57 @@ function jsonToCss(jsonObj) { } function extractCss(appliedStyles, callback) { - getIncludeStyle(function (result) { - if (result) { - $('body').find('*').each(function (i, pre) { - var $pre = $(pre); - if (!$pre.is(':visible')) { - $pre.replaceWith(''); - } else { - if (pre.tagName.toLowerCase() === 'svg') return; - var classNames = pre.getAttribute('class'); - if (!classNames) { - classNames = pre.getAttribute('id'); + chrome.runtime.sendMessage({ + type: "get include style" + }, function(response) { + if (response.includeStyle) { + $('body').find('*').each(function (i, pre) { + var $pre = $(pre); + if (!$pre.is(':visible')) { + $pre.replaceWith(''); + } else { + if (pre.tagName.toLowerCase() === 'svg') return; + + var classNames = pre.getAttribute('class'); if (!classNames) { - classNames = pre.tagName + '-' + Math.floor(Math.random()*100000); - } - } - var tmpName = cssClassesToTmpIds[classNames]; - var tmpNewCss = tmpIdsToNewCss[tmpName]; - if (!tmpName) { - tmpName = 'class-' + Math.floor(Math.random()*100000); - cssClassesToTmpIds[classNames] = tmpName; - } - if (!tmpNewCss) { - // var style = window.getComputedStyle(pre); - tmpNewCss = {}; - for (var cssTagName of supportedCss) { - var cssValue = $pre.css(cssTagName); - if (cssValue && cssValue.length > 0) { - tmpNewCss[cssTagName] = cssValue; + classNames = pre.getAttribute('id'); + if (!classNames) { + classNames = pre.tagName + '-' + Math.floor(Math.random()*100000); } } - tmpIdsToNewCss[tmpName] = tmpNewCss; + var tmpName = cssClassesToTmpIds[classNames]; + var tmpNewCss = tmpIdsToNewCss[tmpName]; + if (!tmpName) { + tmpName = 'class-' + Math.floor(Math.random()*100000); + cssClassesToTmpIds[classNames] = tmpName; + } + if (!tmpNewCss) { + // var style = window.getComputedStyle(pre); + tmpNewCss = {}; + for (var cssTagName of supportedCss) { + var cssValue = $pre.css(cssTagName); + if (cssValue && cssValue.length > 0) { + tmpNewCss[cssTagName] = cssValue; + } + } + tmpIdsToNewCss[tmpName] = tmpNewCss; + } + pre.setAttribute('data-class', tmpName); } - pre.setAttribute('data-class', tmpName); + }); + callback(jsonToCss(tmpIdsToNewCss)); + } else { + var mergedCss = ''; + if (appliedStyles && appliedStyles.length > 0) { + for (var i = 0; i < appliedStyles.length; i++) { + mergedCss += appliedStyles[i].style; + } + callback(mergedCss); + return; } - }); - callback(jsonToCss(tmpIdsToNewCss)); - } else { - var mergedCss = ''; - if (appliedStyles && appliedStyles.length > 0) { - for (var i = 0; i < appliedStyles.length; i++) { - mergedCss += appliedStyles[i].style; - } - callback(mergedCss); - return; + callback(); } - callback(); - } }); } diff --git a/web-extension/manifest.json b/web-extension/manifest.json index 3c048c5..0974b0d 100644 --- a/web-extension/manifest.json +++ b/web-extension/manifest.json @@ -11,10 +11,10 @@ }, "content_scripts": [{ "matches": [""], - "js": ["jquery.js", "jszip.js", "jszip-utils.js", "utils.js", "pure-parser.js", "cssjson.js", "extractHtml.js"] + "js": ["jquery.js", "jszip.js", "jszip-utils.js", "pure-parser.js", "cssjson.js", "filesaver.js", "saveEbook.js", "extractHtml.js", "utils.js"] }], "background": { - "scripts": ["background.js", "utils.js"] + "scripts": ["background.js"] }, "browser_action": { "default_icon": "icons/book32.png", diff --git a/web-extension/menu.html b/web-extension/menu.html index b632bcc..0906d7b 100644 --- a/web-extension/menu.html +++ b/web-extension/menu.html @@ -157,12 +157,6 @@
- - - - - - diff --git a/web-extension/menu.js b/web-extension/menu.js index 840908f..1087a74 100644 --- a/web-extension/menu.js +++ b/web-extension/menu.js @@ -13,15 +13,27 @@ document.getElementById('selectionChapterLabel').innerHTML = chrome.i18n.getMess document.getElementById('editChapters').innerHTML = chrome.i18n.getMessage('editChapters'); document.getElementById('waitMessage').innerHTML = chrome.i18n.getMessage('waitMessage'); -checkIfBusy((result) => { - if (result.isBusy) { +function removeEbook() { + chrome.runtime.sendMessage({ + type: "remove" + }, function(response) {}); +} + +chrome.runtime.sendMessage({ + type: "is busy?" +}, function(response) { + if (response.isBusy) { document.getElementById('busy').style.display = 'block'; } else { document.getElementById('busy').style.display = 'none'; } -}) +}); -getStyles(createStyleList); +chrome.runtime.sendMessage({ + type: "get styles" +}, function(response) { + createStyleList(response.styles); +}); function createStyleList(styles) { allStyles = styles; @@ -67,7 +79,12 @@ function createStyleList(styles) { }); var selStyle = allMatchingStyles[0]; currentStyle = styles[selStyle.index]; - setCurrentStyle(currentStyle); + + chrome.runtime.sendMessage({ + type: "set current style", + currentStyle: currentStyle + }, function(response) { + }); } }); } @@ -77,7 +94,11 @@ function createIncludeStyle(data) { includeStyleCheck.checked = data; } -getIncludeStyle(createIncludeStyle); +chrome.runtime.sendMessage({ + type: "get include style" +}, function(response) { + createIncludeStyle(response.includeStyle); +}); document.getElementById('includeStyleCheck').onclick = function () { var includeStyleCheck = document.getElementById('includeStyleCheck'); @@ -95,12 +116,6 @@ document.getElementById("editStyles").onclick = function() { active: true }, function(tab) { - chrome.tabs.executeScript(tab[0].id, {file: '/jquery.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/filesaver.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip-utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/saveEbook.js'}); chrome.tabs.insertCSS(tab[0].id, {file: '/cssEditor.css'}); chrome.tabs.executeScript(tab[0].id, { @@ -122,12 +137,6 @@ document.getElementById("editChapters").onclick = function() { active: true }, function(tab) { - chrome.tabs.executeScript(tab[0].id, {file: '/jquery.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/filesaver.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip-utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/saveEbook.js'}); chrome.tabs.executeScript(tab[0].id, {file: '/jquery-sortable.js'}); chrome.tabs.insertCSS(tab[0].id, {file: '/chapterEditor.css'}); @@ -139,116 +148,33 @@ document.getElementById("editChapters").onclick = function() { }); }; -function dispatch(action, justAddToBuffer) { +function dispatch(commandType, justAddToBuffer) { document.getElementById('busy').style.display = 'block'; if (!justAddToBuffer) { removeEbook(); } - chrome.tabs.query({ - currentWindow: true, - active: true - }, function(tab) { - chrome.tabs.sendMessage(tab[0].id, { - type: 'echo' - }, function(response) { - - if (currentStyle && currentStyle.style) { - chrome.tabs.insertCSS(tab[0].id, {code: currentStyle.style}); - appliedStyles.push(currentStyle); - } - - if (!response) { - // when first invoked, response will be undefined because extractHtml.js - // was not executed yet - chrome.tabs.executeScript(tab[0].id, {file: '/jquery.js'}, - function (result) { - if (!result) { - alert('Save as eBook does not work on this web site!'); - setIsBusy(false) - document.getElementById('busy').style.display = 'none'; - } else { - chrome.tabs.executeScript(tab[0].id, {file: '/utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/filesaver.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/jszip-utils.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/pure-parser.js'}); - chrome.tabs.executeScript(tab[0].id, {file: '/cssjson.js'}); - - chrome.tabs.executeScript(tab[0].id, { - file: 'extractHtml.js' - }, function() { - sendMessage(tab[0].id, action, justAddToBuffer, appliedStyles); - }); - } - }); - // FIXME - // chrome.tabs.executeScript(tab[0].id, {file: '/utils.js'}); - // chrome.tabs.executeScript(tab[0].id, {file: '/filesaver.js'}); - // chrome.tabs.executeScript(tab[0].id, {file: '/jszip.js'}); - // chrome.tabs.executeScript(tab[0].id, {file: '/jszip-utils.js'}); - // chrome.tabs.executeScript(tab[0].id, {file: '/pure-parser.js'}); - // chrome.tabs.executeScript(tab[0].id, {file: '/cssjson.js'}); - // - // chrome.tabs.executeScript(tab[0].id, { - // file: 'extractHtml.js' - // }, function() { - // sendMessage(tab[0].id, action, justAddToBuffer, appliedStyles); - // }); - } else if (response.echo) { - sendMessage(tab[0].id, action, justAddToBuffer, appliedStyles); - } - }); - }); -} - -function sendMessage(tabId, action, justAddToBuffer, appliedStyles) { - chrome.tabs.sendMessage(tabId, { - type: action, - appliedStyles: appliedStyles + chrome.runtime.sendMessage({ + type: commandType }, function(response) { - if (!response) { - alert('Save as eBook does not work on this web site!'); - setIsBusy(false) - document.getElementById('busy').style.display = 'none'; - return - } - if (response.length === 0) { - if (justAddToBuffer) { - alert('Cannot add an empty selection as chapter!'); - } else { - alert('Cannot generate the eBook from an empty selection!'); - } - window.close(); - } - if (!justAddToBuffer) { - buildEbook([response], true); - } else { - getEbookPages(function (allPages) { - allPages.push(response); - saveEbookPages(allPages); - window.close(); - }); - } - setTimeout(function () { - document.getElementById('busy').style.display = 'none'; - }, 500); + //FIXME - hidden before done + document.getElementById('busy').style.display = 'none'; }); } document.getElementById('savePage').onclick = function() { - dispatch('extract-page', false); + dispatch('save-page', false); }; document.getElementById('saveSelection').onclick = function() { - dispatch('extract-selection', false); + dispatch('save-selection', false); }; document.getElementById('pageChapter').onclick = function() { - dispatch('extract-page', true); + dispatch('add-page', true); }; document.getElementById('selectionChapter').onclick = function() { - dispatch('extract-selection', true); + dispatch('add-selection', true); }; // get all shortcuts and display them in the menuTitle diff --git a/web-extension/saveEbook.js b/web-extension/saveEbook.js index 5ce4205..fc180a0 100644 --- a/web-extension/saveEbook.js +++ b/web-extension/saveEbook.js @@ -32,6 +32,7 @@ function buildEbookFromChapters() { }) } +// FIXME remove - keep one function function buildEbook(allPages, fromMenu=false) { _buildEbook(allPages, fromMenu); } @@ -49,10 +50,10 @@ function _buildEbook(allPages, fromMenu=false) { if (ebookTitle) { // ~TODO a pre-processing function to apply escapeXMLChars to all page.titles ebookName = escapeXMLChars(ebookTitle); - ebookFileName = getEbookFileName(ebookTitle) + '.epub'; + ebookFileName = getEbookFileName(removeSpecialChars(ebookTitle)) + '.epub'; } else { ebookName = escapeXMLChars(allPages[0].title); - ebookFileName = getEbookFileName(allPages[0].title) + '.epub'; + ebookFileName = getEbookFileName(removeSpecialChars(allPages[0].title)) + '.epub'; } var zip = new JSZip(); @@ -180,21 +181,22 @@ function _buildEbook(allPages, fromMenu=false) { var done = false; // FIXME - var saveData = (function () { - var a = document.createElement("a"); - document.body.appendChild(a); - a.style = "display: none"; - return function (data, fileName) { - var wURL = window.URL || window.mozURL; - var blob = new Blob([data], {type: "application/epub+zip"}), - url = wURL.createObjectURL(blob); - - chrome.downloads.download({ - url: url, - filename: fileName - }); - }; - }()); + // var saveData = (function () { + // var a = document.createElement("a"); + // document.body.appendChild(a); + // a.style = "display: none"; + // return function (data, fileName) { + // var wURL = window.URL || window.mozURL; + // var blob = new Blob([data], {type: "application/epub+zip"}), + // url = wURL.createObjectURL(blob); + // + // chrome.downloads.download({ + // url: url, + // filename: fileName, + // saveAs: true + // }); + // }; + // }()); zip.generateAsync({ type: "blob" @@ -202,11 +204,7 @@ function _buildEbook(allPages, fromMenu=false) { .then(function(content) { done = true; console.log("done !"); - if (!fromMenu) { - saveAs(content, ebookFileName); - } else { - saveData(content, ebookFileName); - } + saveAs(content, ebookFileName); }); // FIXME - remove or fix? diff --git a/web-extension/utils.js b/web-extension/utils.js index 389fb30..f77b2bf 100644 --- a/web-extension/utils.js +++ b/web-extension/utils.js @@ -269,7 +269,7 @@ function getBase64ImgData(srcTxt) { function getXPath(elm) { if (!elm) return '' - + var allNodes = document.getElementsByTagName('*'); for (var segs = []; elm && elm.nodeType === 1; elm = elm.parentNode) { if (elm.hasAttribute('id')) { @@ -318,6 +318,11 @@ function generateRandomTag(tagLen) { return text; } +function removeSpecialChars(text) { + // FIXME remove white spaces ? + return text.replace(/\//g, '-') +} + function escapeXMLChars(text) { return text.replace(/&/g, '&') .replace(/>/g, '>')