diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-01-29 22:42:41 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-01-29 22:42:41 +0100 |
commit | 56907044443ba42eaa0faa7733d90d41cf513966 (patch) | |
tree | ebce42b47978129b499d58b00c8e11d245eb7243 /lib/utils/page.js | |
parent | 8a8ffb613442bb37570a5081bf3e1b7943c4b61e (diff) | |
download | gitbook-56907044443ba42eaa0faa7733d90d41cf513966.zip gitbook-56907044443ba42eaa0faa7733d90d41cf513966.tar.gz gitbook-56907044443ba42eaa0faa7733d90d41cf513966.tar.bz2 |
Download external images in ebook format
Diffstat (limited to 'lib/utils/page.js')
-rw-r--r-- | lib/utils/page.js | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/lib/utils/page.js b/lib/utils/page.js index 3f04e99..ac8428f 100644 --- a/lib/utils/page.js +++ b/lib/utils/page.js @@ -2,6 +2,7 @@ var Q = require('q'); var _ = require('lodash'); var path = require('path'); var cheerio = require('cheerio'); +var request = require('request'); var links = require('./links'); var imgUtils = require('./images'); @@ -81,9 +82,7 @@ function normalizeHtml(src, options) { var dest = svgId+".svg"; // Generate filename - dest = path.resolve(outputRoot, dest); - dest = fs.getUniqueFilename(dest); - dest = "/"+path.relative(outputRoot, dest); + dest = "/"+fs.getUniqueFilename(outputRoot, dest); svgContent[dest] = content; $(this).replaceWith($("<img>").attr("src", dest)); @@ -92,6 +91,7 @@ function normalizeHtml(src, options) { // Find images to normalize $("img").each(function() { + var origin = undefined; var src = $(this).attr("src"); var isExternal = links.isExternal(src); @@ -102,12 +102,19 @@ function normalizeHtml(src, options) { // Convert if needed if (options.convertImages) { + // If image is external and ebook, then downlaod the images + if (isExternal) { + origin = src; + src = "/"+fs.getUniqueFilename(outputRoot, path.basename(src)); + src = links.toAbsolute(src, options.base, options.output); + isExternal = false; + } + var ext = path.extname(src); + var srcAbs = path.join("/", options.base, src); // Test image extension if (_.contains(imgUtils.INVALID, ext)) { - var srcAbs = isExternal? src : path.join("/", options.base, src); - if (imgConversionCache[outputRoot][srcAbs]) { // Already converted src = imgConversionCache[outputRoot][srcAbs]; @@ -116,21 +123,11 @@ function normalizeHtml(src, options) { var dest = ""; // Replace extension - if (isExternal) { - dest = path.basename(srcAbs, ext)+".png"; - } else { - dest = path.join(path.dirname(srcAbs), path.basename(srcAbs, ext)+".png"); - dest = dest[0] == "/"? dest.slice(1) : dest; - } - - // Absolute with input - dest = path.resolve(outputRoot, dest); + dest = path.join(path.dirname(srcAbs), path.basename(srcAbs, ext)+".png"); + dest = dest[0] == "/"? dest.slice(1) : dest; // Get a name that doesn't exists - dest = fs.getUniqueFilename(dest); - - // Reset as relative to book - dest = path.relative(outputRoot, dest); + dest = fs.getUniqueFilename(outputRoot, dest); options.book.log.debug.ln("detect invalid image (will be converted to png):", srcAbs); @@ -139,6 +136,7 @@ function normalizeHtml(src, options) { // Push to convert toConvert.push({ + origin: origin, content: svgContent[srcAbs], source: isExternal? srcAbs : path.join("./", srcAbs), dest: path.join("./", dest) @@ -150,6 +148,14 @@ function normalizeHtml(src, options) { // Reset as relative to output src = links.toAbsolute(src, options.base, options.output); } + + else if (origin) { + // Need to downlaod image + toConvert.push({ + origin: origin, + source: path.join("./", srcAbs) + }); + } } $(this).attr("src", src); @@ -204,29 +210,29 @@ function convertImages(images, options) { options.book.log.info.ln("convert ", images.length, "images to png"); return _.reduce(images, function(prev, image) { - var imgin = links. isExternal(image.source)? image.source : path.resolve(options.book.options.output, image.source); - var imgout = path.resolve(options.book.options.output, image.dest); + var imgin = path.resolve(options.book.options.output, image.source); return prev + // Write image if need to be download + .then(function() { + if (!image.origin) return; + options.book.log.info("download image", image.origin); + return options.book.log.info.promise(fs.writeStream(imgin, request(image.origin))); + }) + // Write svg if content .then(function() { if (!image.content) return; - return fs.writeFile(imgin, image.content); }) // Convert .then(function(){ + if (!image.dest) return; + var imgout = path.resolve(options.book.options.output, image.dest); options.book.log.debug("convert image", image.source, "to", image.dest, "..."); - - return imgUtils.convertSVG(imgin, imgout) - .then(function() { - options.book.log.debug.ok(); - }, function(err) { - options.book.log.debug.fail(); - throw err; - }); + return options.book.log.debug.promise(imgUtils.convertSVG(imgin, imgout)); }); }, Q()) .then(function() { |