var cssFileName = 'ebook.css'; var ebookTitle = null; chrome.runtime.onMessage.addListener((obj, sender, sendResponse) => { if (obj.shortcut && obj.shortcut === 'build-ebook') { buildEbook(obj.response); } else if (obj.alert) { console.log(obj.alert); alert(obj.alert); } return true; }) function getImagesIndex(allImages) { return allImages.reduce(function(prev, elem, index) { return prev + '\n' + ''; }, ''); } function getExternalLinksIndex() { // TODO return allExternalLinks.reduce(function(prev, elem, index) { return prev + '\n' + ''; }, ''); } function buildEbookFromChapters() { getEbookTitle(function (title) { ebookTitle = title; if (!ebookTitle || ebookTitle.trim().length === 0) { ebookTitle = 'eBook'; } getEbookPages(_buildEbook); }) } // FIXME remove - keep one function function buildEbook(allPages, fromMenu=false) { _buildEbook(allPages, fromMenu); } // http://ebooks.stackexchange.com/questions/1183/what-is-the-minimum-required-content-for-a-valid-epub function _buildEbook(allPages, fromMenu=false) { allPages = allPages.filter(function(page) { return page !== null; }); console.log('Prepare Content...'); var ebookFileName = 'eBook.epub'; if (ebookTitle) { // ~TODO a pre-processing function to apply escapeXMLChars to all page.titles ebookName = escapeXMLChars(ebookTitle); ebookFileName = getEbookFileName(removeSpecialChars(ebookTitle)) + '.epub'; } else { ebookName = escapeXMLChars(allPages[0].title); ebookFileName = getEbookFileName(removeSpecialChars(allPages[0].title)) + '.epub'; } 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', '' + '' + '' + '' + '' + '' + '' + '' + ebookName + '' + '' + '' + allPages.reduce(function(prev, page, index) { var tmpPageTitle = escapeXMLChars(page.title); return prev + '\n' + '' + '' + tmpPageTitle + '' + '' + ''; }, '') + '' + '' ); oebps.file(cssFileName, ''); //TODO var styleFolder = oebps.folder('style'); allPages.forEach(function(page) { styleFolder.file(page.styleFileName, page.styleFileContent); }); var pagesFolder = oebps.folder('pages'); allPages.forEach(function(page) { var tmpPageTitle = escapeXMLChars(page.title); pagesFolder.file(page.url, '' + '' + '' + '' + tmpPageTitle+ '' + '' + '' + page.content + '' ); }); oebps.file('content.opf', '' + '' + '' + ''+ ebookName + '' + 'isbn' + '' + new Date().toISOString().replace(/\.[0-9]+Z/i, 'Z') + '' + 'en' + '' + '' + '' + '' + '' + allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + allPages.reduce(function(prev, page, index) { return prev + '\n' + getImagesIndex(page.images); }, '') + '' + '' + allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + '' + '' ); /////////////// try { let imgsFolder = oebps.folder("images"); allPages.forEach(function(page) { for (let i = 0; i < page.images.length; i++) { let tmpImg = page.images[i] // TODO - Must be JSON serializable - see the same comment in extractHtml.js // if (tmpImg.isBinary) { // imgsFolder.file(tmpImg.filename, tmpImg.data, {binary: true}) // } else { imgsFolder.file(tmpImg.filename, tmpImg.data, {base64: true}) // } } }); } catch (error) { console.log(error); } zip.generateAsync({ type: "blob", mimeType: "application/epub+zip" }) .then(function(content) { console.log("done !"); saveAs(content, ebookFileName); chrome.runtime.sendMessage({ type: "done" }, (response) => {}); }); }