diff --git a/test.js b/test.js index 29a277f..ba31237 100644 --- a/test.js +++ b/test.js @@ -7,8 +7,12 @@ var cssFileName = 'ebook.css'; var pageName = 'ebook.xhtml'; var ebookName = "ebook-" + document.title + ".epub"; +var imgSrcRegex = //gi, '

'); // rawContent = rawContent.replace(/<[^<>]+>/gi, ''); + extractImgs(rawContent); + rawContent = replaceImgs(rawContent); + + alert(); + return '' + '' + '' + @@ -101,6 +110,59 @@ function prepareEbookContent(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) { + // Object.keys(allImgSrc).forEach(function (imgsrc) { + // rawContent = rawContent.replace(new RegExp(imgsrc, 'gi'), allImgSrc[imgsrc]); + // }); + 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 getFileExtension(fileName) { + var tmpFileName = fileName.split('.').pop(); + if (tmpFileName.indexOf('?') > 0) { + tmpFileName = tmpFileName.split('?')[0]; + } + if (tmpFileName.trim() === '') { + return 'jpg'; //TODO + } + return tmpFileName; +} + +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(); @@ -119,27 +181,6 @@ function buildEbook(ebookContent) { var oebps = zip.folder("OEBPS"); - oebps.file('content.opf', - '' + - '' + - '' + - 'Title' + - 'isbn' + - '2014-03-27T09:14:09Z' + - 'en' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' - ); - oebps.file('toc.xhtml', '' + '' + @@ -183,9 +224,59 @@ function buildEbook(ebookContent) { prepareEbookContent(ebookContent) ); + oebps.file('content.opf', + '' + + '' + + '' + + 'Title' + + 'isbn' + + '2014-03-27T09:14:09Z' + + 'en' + + '' + + '' + + '' + + '' + + '' + + '' + + getImagesIndex() + + '' + + '' + + '' + + '' + + '' + ); - zip.generateAsync({type:"blob"}) - .then(function(content) { - saveAs(content, ebookName); + /////////////// + /////////////// + 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); + }); + }, 5000); + }