mirror of
https://github.com/alexadam/save-as-ebook.git
synced 2025-09-10 17:34:47 +00:00
misc bug fixes
This commit is contained in:
parent
5e02b1e745
commit
a7258b3c81
3 changed files with 212 additions and 226 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue