// document.body.style.border = "5px solid red"; // https://stuk.github.io/jszip/ // https://github.com/eligrey/FileSaver.js/ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { console.log('Start saving...'); var pageSrc = document.getElementsByTagName('body')[0].innerHTML; buildEbook(pageSrc); }); var cssFileName = 'ebook.css'; var pageName = 'ebook.xhtml'; var ebookName = "ebook-" + document.title + ".epub"; var imgSrcRegex = / 0) { var range = selection.getRangeAt(0); var selectionContents = range.cloneContents(); console.log(selectionContents.children.length, selectionContents.children[0].outerHTML); } // return selection.getRangeAt(0); // return selection.createRange(); } } function getString(node) { var tagName = node.tagName.toLowerCase(); var innerText = node.innerText || node.textContent; var innerText = node.innerHTML; innerText = innerText.replace(/<[^>]*>[^<]*<[^>]*>/gi,''); innerText = innerText.replace(/<[^>]*>/gi,''); console.log(innerText); if (tagName === 'img') { allImgSrc[node.src] = 'img-' + (imageIndex++) + '.' + getFileExtension(node.src); return ''; } if (tagName === 'a') { // allExternalLinks.push(node.href); // TODO ??? return ''+innerText+''; } if (innerText === '') { return ''; } if (tagName === 'div') { if (node.hasChildNodes) { return ''; } return '

' + innerText + '

'; } return '<' + tagName + '>' + innerText + ''; } function prepareEbookContent(rawContent) { var tarr = walkDOM(document.body); var reduced = tarr.reduce(function (prev, crt, index) { return prev + getString(crt); }, ''); rawContent = reduced; alert(); return '' + '' + '' + '' + ebookName + '' + '' + '' + rawContent + ''; } // function extractImgs(rawContent) { // $(rawContent).find('img').each(function (index, elem) { // var imgsrc = $(elem).attr('src'); // try { // if (imgsrc.indexOf('http') === 0) { // allImgSrc[imgsrc] = 'img-' + index + '.' + getFileExtension(imgsrc); // } // } catch (e) { // } // }); // } // // function replaceImgs(rawContent) { // var keys = Object.keys(allImgSrc); // for (var i = 0; i < keys.length; i++) { // rawContent = rawContent.replace(keys[i], 'images/' + allImgSrc[keys[i]]); // } // return rawContent; // } function getImagesIndex() { return Object.keys(allImgSrc).reduce(function (prev, elem, index) { return prev + '\n' + ''; }, ''); } function getExternalLinksIndex() { // TODO ??? return allExternalLinks.reduce(function (prev, elem, index) { return prev + '\n' + ''; }, ''); } function getFileExtension(fileName) { var tmpFileName = fileName.split('.').pop(); if (tmpFileName.indexOf('?') > 0) { tmpFileName = tmpFileName.split('?')[0]; } if (tmpFileName.trim() === '') { return 'jpg'; //TODO } return tmpFileName; } function walkDOM(main) { var arr = []; var loop = function(main) { do { try { if (allowElements.indexOf(main.tagName.toLowerCase()) > -1) { arr.push(main); } } catch (e) { } if (main.hasChildNodes()) { loop(main.firstChild); } } while (main = main.nextSibling); } loop(main); return arr; } function deferredAddZip(url, filename, zip) { var deferred = $.Deferred(); JSZipUtils.getBinaryContent(url, function (err, data) { if(err) { deferred.reject(err); } else { zip.file(filename, data, {binary:true}); deferred.resolve(data); } }); return deferred; } // http://ebooks.stackexchange.com/questions/1183/what-is-the-minimum-required-content-for-a-valid-epub function buildEbook(ebookContent) { var zip = new JSZip(); zip.file('mimetype', 'application/epub+zip'); var metaInfFolder = zip.folder("META-INF"); metaInfFolder.file('container.xml', '' + '' + '' + '' + '' + '' ); var oebps = zip.folder("OEBPS"); oebps.file('toc.xhtml', '' + '' + '' + 'toc.xhtml' + '' + '' + '' + '' + '' + '' ); oebps.file('toc.ncx', '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + 'cover' + '' + '' + '' + '' ); oebps.file(cssFileName, ''); oebps.file(pageName, prepareEbookContent(ebookContent) ); oebps.file('content.opf', '' + '' + '' + 'Title' + 'isbn' + '2014-03-27T09:14:09Z' + 'en' + '' + '' + '' + '' + '' + '' + //properties="remote-resources" getImagesIndex() + getExternalLinksIndex() + '' + '' + '' + '' + '' ); /////////////// /////////////// var imgs = oebps.folder("images"); var imgsPromises = []; // allImgSrc.forEach(function (imgSrc, index) { Object.keys(allImgSrc).forEach(function (imgSrc, index) { var tmpDeffered = deferredAddZip(imgSrc, allImgSrc[imgSrc], imgs); imgsPromises.push(tmpDeffered); }); var done = false; $.when.apply($, imgsPromises).done(function () { done = true; zip.generateAsync({type:"blob"}) .then(function(content) { saveAs(content, ebookName); }); console.log("done !"); }).fail(function (err) { alert(err); }); setTimeout(function () { if (done) { return; } zip.generateAsync({type:"blob"}) .then(function(content) { saveAs(content, ebookName); }); }, 50000); }