misc bug fixes

This commit is contained in:
Alex Adam 2018-11-03 13:15:17 +02:00
parent 5e02b1e745
commit a7258b3c81
3 changed files with 212 additions and 226 deletions

View file

@ -162,106 +162,132 @@ function dispatch(action, justAddToBuffer, appliedStyles) {
active: true active: true
}, (tab) => { }, (tab) => {
chrome.storage.local.get('styles', (data) => { isIncludeStyles((result) =>{
let styles = defaultStyles; let isIncludeStyle = result.includeStyle
if (data && data.styles) { prepareStyles(tab, isIncludeStyle, appliedStyles, (tmpAppliedStyles) => {
styles = data.styles; applyAction(tab, action, justAddToBuffer, isIncludeStyle, tmpAppliedStyles, () => {
} alert('done')
let currentUrl = tab[0].url; })
let currentStyle = null; })
})
if (styles && styles.length > 0) {
let allMatchingStyles = [];
for (let i = 0; i < styles.length; i++) {
currentUrl = currentUrl.replace(/(http[s]?:\/\/|www\.)/i, '').toLowerCase();
let styleUrl = styles[i].url;
let styleUrlRegex = null;
try {
styleUrlRegex = new RegExp(styleUrl, 'i');
} catch (e) {
}
if (styleUrlRegex && styleUrlRegex.test(currentUrl)) {
allMatchingStyles.push({
index: i,
length: styleUrl.length
});
}
}
if (allMatchingStyles.length >= 1) {
allMatchingStyles.sort((a, b) => b.length - a.length);
let selStyle = allMatchingStyles[0];
currentStyle = styles[selStyle.index];
// setCurrentStyle(currentStyle);
if (currentStyle && currentStyle.style) {
chrome.tabs.insertCSS(tab[0].id, {code: currentStyle.style});
appliedStyles.push(currentStyle);
}
}
}
chrome.tabs.sendMessage(tab[0].id, {
type: action,
appliedStyles: appliedStyles
}, (response) => {
if (!response) {
isBusy = false;
chrome.browserAction.setBadgeText({text: ""});
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Save as eBook does not work on this web site!'}, (r) => {
console.log(r);
});
return;
}
if (response.length === 0) {
if (justAddToBuffer) {
// FIXME does not work on chrome ?
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Cannot add an empty selection as chapter!'}, (r) => {
console.log(r);
});
} else {
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Cannot generate the eBook from an empty selection!'}, (r) => {
console.log(r);
});
}
isBusy = false;
chrome.browserAction.setBadgeText({text: ""});
return;
}
if (!justAddToBuffer) {
chrome.tabs.sendMessage(tab[0].id, {'shortcut': 'build-ebook', response: [response]}, (r) => {
console.log(r);
});
isBusy = false;
chrome.browserAction.setBadgeText({text: ""});
} else {
chrome.storage.local.get('allPages', function (data) {
if (!data || !data.allPages) {
data.allPages = [];
}
data.allPages.push(response);
chrome.storage.local.set({'allPages': data.allPages});
isBusy = false;
chrome.browserAction.setBadgeText({text: ""});
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Page or selection added as chapter!'}, (r) => {
console.log(r);
});
})
}
});
// FIXME set timeout
// isBusy = false;
// chrome.browserAction.setBadgeText({text: ""});
// sendMessage(tab[0].id, action, justAddToBuffer, appliedStyles);
});
}); });
} }
function isIncludeStyles(callback) {
chrome.storage.local.get('includeStyle', (data) => {
if (!data) {
callback({includeStyle: false});
} else {
callback({includeStyle: data.includeStyle});
}
});
}
function prepareStyles(tab, includeStyle, appliedStyles, callback) {
if (!includeStyle) {
callback(appliedStyles)
return
}
chrome.storage.local.get('styles', (data) => {
let styles = defaultStyles;
if (data && data.styles) {
styles = data.styles;
}
let currentUrl = tab[0].url;
let currentStyle = null;
if (styles && styles.length > 0) {
let allMatchingStyles = [];
for (let i = 0; i < styles.length; i++) {
currentUrl = currentUrl.replace(/(http[s]?:\/\/|www\.)/i, '').toLowerCase();
let styleUrl = styles[i].url;
let styleUrlRegex = null;
try {
styleUrlRegex = new RegExp(styleUrl, 'i');
} catch (e) {
}
if (styleUrlRegex && styleUrlRegex.test(currentUrl)) {
allMatchingStyles.push({
index: i,
length: styleUrl.length
});
}
}
if (allMatchingStyles.length >= 1) {
allMatchingStyles.sort((a, b) => b.length - a.length);
let selStyle = allMatchingStyles[0];
currentStyle = styles[selStyle.index];
if (currentStyle && currentStyle.style) {
chrome.tabs.insertCSS(tab[0].id, {code: currentStyle.style});
appliedStyles.push(currentStyle);
}
}
}
callback(appliedStyles)
});
}
function applyAction(tab, action, justAddToBuffer, includeStyle, appliedStyles, callback) {
chrome.tabs.sendMessage(tab[0].id, {
type: action,
includeStyle: includeStyle,
appliedStyles: appliedStyles
}, (response) => {
if (!response) {
resetBusy()
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Save as eBook does not work on this web site!'}, (r) => {
console.log(r);
});
return;
}
if (response.content.trim() === '') {
if (justAddToBuffer) {
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Cannot add an empty selection as chapter!'}, (r) => {
console.log(r);
});
} else {
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Cannot generate the eBook from an empty selection!'}, (r) => {
console.log(r);
});
}
resetBusy()
return;
}
if (!justAddToBuffer) {
chrome.tabs.sendMessage(tab[0].id, {'shortcut': 'build-ebook', response: [response]}, (r) => {});
} else {
chrome.storage.local.get('allPages', (data) => {
if (!data || !data.allPages) {
data.allPages = [];
}
data.allPages.push(response);
chrome.storage.local.set({'allPages': data.allPages});
resetBusy()
chrome.tabs.sendMessage(tab[0].id, {'alert': 'Page or selection added as chapter!'}, (r) => {});
})
}
});
}
function resetBusy() {
isBusy = false;
chrome.browserAction.setBadgeText({text: ""});
let popups = chrome.extension.getViews({type: "popup"});
if (popups && popups.length > 0) {
popups[0].close()
}
}
chrome.runtime.onMessage.addListener(_execRequest); chrome.runtime.onMessage.addListener(_execRequest);
function _execRequest(request, sender, sendResponse) { function _execRequest(request, sender, sendResponse) {
@ -338,5 +364,8 @@ function _execRequest(request, sender, sendResponse) {
request.type === 'add-page' || request.type === 'add-selection') { request.type === 'add-page' || request.type === 'add-selection') {
executeCommand({type: request.type}) executeCommand({type: request.type})
} }
if (request.type === 'done') {
resetBusy()
}
return true; return true;
} }

View file

@ -345,63 +345,57 @@ function jsonToCss(jsonObj) {
return result; return result;
} }
function extractCss(appliedStyles, callback) { function extractCss(includeStyle, appliedStyles) {
if (includeStyle) {
$('body').find('*').each((i, pre) => {
let $pre = $(pre);
chrome.runtime.sendMessage({ if (allowedTags.indexOf(pre.tagName.toLowerCase()) < 0) return;
type: "get include style" if (mathMLTags.indexOf(pre.tagName.toLowerCase()) > -1) return;
}, function(response) {
if (response.includeStyle) {
$('body').find('*').each(function (i, pre) {
var $pre = $(pre);
if (allowedTags.indexOf(pre.tagName.toLowerCase()) < 0) return; if (!$pre.is(':visible')) {
if (mathMLTags.indexOf(pre.tagName.toLowerCase()) > -1) return; $pre.replaceWith('');
if (!$pre.is(':visible')) {
$pre.replaceWith('');
} else {
if (pre.tagName.toLowerCase() === 'svg') return;
var classNames = pre.getAttribute('class');
if (!classNames) {
classNames = pre.getAttribute('id');
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;
}
}
tmpIdsToNewCss[tmpName] = tmpNewCss;
}
pre.setAttribute('data-class', tmpName);
}
});
callback(jsonToCss(tmpIdsToNewCss));
} else { } else {
var mergedCss = ''; if (pre.tagName.toLowerCase() === 'svg') return;
if (appliedStyles && appliedStyles.length > 0) {
for (var i = 0; i < appliedStyles.length; i++) { let classNames = pre.getAttribute('class');
mergedCss += appliedStyles[i].style; if (!classNames) {
classNames = pre.getAttribute('id');
if (!classNames) {
classNames = pre.tagName + '-' + Math.floor(Math.random()*100000);
} }
callback(mergedCss);
return;
} }
callback(); let tmpName = cssClassesToTmpIds[classNames];
let tmpNewCss = tmpIdsToNewCss[tmpName];
if (!tmpName) {
tmpName = 'class-' + Math.floor(Math.random()*100000);
cssClassesToTmpIds[classNames] = tmpName;
}
if (!tmpNewCss) {
// var style = window.getComputedStyle(pre);
tmpNewCss = {};
for (let cssTagName of supportedCss) {
let cssValue = $pre.css(cssTagName);
if (cssValue && cssValue.length > 0) {
tmpNewCss[cssTagName] = cssValue;
}
}
tmpIdsToNewCss[tmpName] = tmpNewCss;
}
pre.setAttribute('data-class', tmpName);
} }
}); });
return jsonToCss(tmpIdsToNewCss);
} else {
let mergedCss = '';
if (appliedStyles && appliedStyles.length > 0) {
for (let i = 0; i < appliedStyles.length; i++) {
mergedCss += appliedStyles[i].style;
}
return mergedCss;
}
}
return null
} }
///// /////
@ -424,52 +418,44 @@ function deferredAddZip(url, filename) {
return deferred; return deferred;
} }
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
var imgsPromises = []; let imgsPromises = [];
var result = {}; let result = {};
var pageSrc = ''; let pageSrc = '';
var tmpContent = ''; let tmpContent = '';
let styleFile = null;
extractCss(request.appliedStyles, function (styleFile) { if (request.type === 'extract-page') {
if (request.type === 'extract-page') { styleFile = extractCss(request.includeStyle, request.appliedStyles)
pageSrc = document.getElementsByTagName('body')[0]; pageSrc = document.getElementsByTagName('body')[0];
tmpContent = getContent(pageSrc); tmpContent = getContent(pageSrc);
} else if (request.type === 'extract-selection') { } else if (request.type === 'extract-selection') {
pageSrc = getSelectedNodes(); styleFile = extractCss(request.includeStyle, request.appliedStyles)
pageSrc.forEach(function (page) { pageSrc = getSelectedNodes();
tmpContent += getContent(page); pageSrc.forEach((page) => {
}); tmpContent += getContent(page);
} else if (request.type === 'echo') {
sendResponse({
echo: true
});
return;
}
if (tmpContent.trim() === '') {
sendResponse('');
return;
}
allImages.forEach(function (tmpImg) {
imgsPromises.push(deferredAddZip(tmpImg.originalUrl, tmpImg.filename));
}); });
}
$.when.apply($, imgsPromises).done(function() { allImages.forEach((tmpImg) => {
var tmpTitle = getPageTitle(document.title); imgsPromises.push(deferredAddZip(tmpImg.originalUrl, tmpImg.filename));
result = { });
url: getPageUrl(tmpTitle),
title: tmpTitle, $.when.apply($, imgsPromises).done(() => {
baseUrl: getCurrentUrl(), let tmpTitle = getPageTitle(document.title);
styleFileContent: styleFile, result = {
styleFileName: 'style'+Math.floor(Math.random()*100000)+'.css', url: getPageUrl(tmpTitle),
images: extractedImages, title: tmpTitle,
content: tmpContent baseUrl: getCurrentUrl(),
}; styleFileContent: styleFile,
sendResponse(result); styleFileName: 'style' + Math.floor(Math.random() * 100000) + '.css',
}).fail(function(e) { images: extractedImages,
console.log('Error:', e); content: tmpContent
}); };
sendResponse(result);
}).fail((e) => {
console.log('Error:', e);
sendResponse(null)
}); });
return true; return true;

View file

@ -1,13 +1,14 @@
var cssFileName = 'ebook.css'; var cssFileName = 'ebook.css';
var ebookTitle = null; var ebookTitle = null;
chrome.runtime.onMessage.addListener((obj) => { chrome.runtime.onMessage.addListener((obj, sender, sendResponse) => {
if (obj.shortcut && obj.shortcut === 'build-ebook') { if (obj.shortcut && obj.shortcut === 'build-ebook') {
buildEbook(obj.response); buildEbook(obj.response);
} else if (obj.alert) { } else if (obj.alert) {
console.log(obj.alert); console.log(obj.alert);
alert(obj.alert); alert(obj.alert);
} }
return true;
}) })
function getImagesIndex(allImages) { function getImagesIndex(allImages) {
@ -178,46 +179,16 @@ 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,
// saveAs: true
// });
// };
// }());
zip.generateAsync({ zip.generateAsync({
type: "blob" type: "blob"
}) })
.then(function(content) { .then(function(content) {
done = true;
console.log("done !"); console.log("done !");
saveAs(content, ebookFileName); saveAs(content, ebookFileName);
chrome.runtime.sendMessage({
type: "done"
}, (response) => {});
}); });
// FIXME - remove or fix?
setTimeout(function() {
if (done) {
return;
}
zip.generateAsync({
type: "blob"
})
.then(function(content) {
saveAs(content, ebookFileName);
});
}, 60000);
} }