var cssFileName = 'ebook.css'; 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() { getEbookPages(_buildEbook); } function buildEbook(allPages) { _buildEbook(allPages); } // http://ebooks.stackexchange.com/questions/1183/what-is-the-minimum-required-content-for-a-valid-epub function _buildEbook(allPages) { allPages = allPages.filter(function(page) { return page !== null; }); console.log('Prepare Content...'); ebookName = allPages[0].title + '.epub'; if (allPages[0].type === 'title') { allPages.shift(); } 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) { return prev + '\n' + '' + '' + page.title + '' + '' + ''; }, '') + '' + '' ); oebps.file(cssFileName, ''); var pagesFolder = oebps.folder('pages'); allPages.forEach(function(page) { pagesFolder.file(page.url, '' + '' + '' + '' + page.title + '' + '' + '' + page.content + '' ); }); oebps.file('content.opf', '' + '' + '' + ''+ ebookName + '' + 'isbn' + '' + new Date().toISOString() + '' + 'en' + '' + '' + '' + '' + '' + allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + allPages.reduce(function(prev, page, index) { return prev + '\n' + getImagesIndex(page.images); }, '') + // getExternalLinksIndex() + '' + '' + allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + '' + '' ); /////////////// var imgsFolder = oebps.folder("images"); allPages.forEach(function(page) { for (var i = 0; i < page.images.length; i++) { var tmpImg = page.images[i]; imgsFolder.file(tmpImg.filename, tmpImg.data, { base64: true }); } }); var done = false; zip.generateAsync({ type: "blob" }) .then(function(content) { done = true; console.log("done !"); saveAs(content, ebookName); }); setTimeout(function() { if (done) { return; } zip.generateAsync({ type: "blob" }) .then(function(content) { saveAs(content, ebookName); }); }, 60000); removeEbook(); }