var cssFileName = 'ebook.css'; var pageName = 'ebook.xhtml'; var ebookName = "ebook-" + document.title + ".epub"; function getImgDownloadUrl(baseUrl, imgSrc) { if (imgSrc.indexOf('//') === 0) { return baseUrl.split('//')[0] + imgSrc; } if (imgSrc.indexOf('http') !== 0) { return baseUrl + '/' + imgSrc; } return imgSrc; } function getImagesIndex(allImgSrc) { 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; } function buildEbook() { getEbookPages(_buildEbook); } // http://ebooks.stackexchange.com/questions/1183/what-is-the-minimum-required-content-for-a-valid-epub function _buildEbook(allPages) { console.log('Prepare Content...'); 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', '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + // '' + // TODO remove 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', '' + '' + '' + 'Title' + 'isbn' + '2014-03-27T09:14:09Z' + 'en' + '' + '' + '' + '' + '' + // '' + //properties="remote-resources" // TODO remove allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + allPages.reduce(function(prev, page, index) { return prev + '\n' + getImagesIndex(page.imgs); }, '') + // getExternalLinksIndex() + '' + '' + // '' + // TODO remove allPages.reduce(function(prev, page, index) { return prev + '\n' + ''; }, '') + '' + '' ); /////////////// /////////////// var imgs = oebps.folder("images"); var imgsPromises = []; allPages.forEach(function(page) { Object.keys(page.imgs).forEach(function(imgSrc, index) { var tmpDeffered = deferredAddZip(getImgDownloadUrl(page.baseUrl, imgSrc), page.imgs[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); }); }, 60000); ///////////// clean removeEbook(); imageIndex = 0; }