summaryrefslogtreecommitdiffstats
path: root/lib/utils/page.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-01-29 22:42:41 +0100
committerSamy Pessé <samypesse@gmail.com>2015-01-29 22:42:41 +0100
commit56907044443ba42eaa0faa7733d90d41cf513966 (patch)
treeebce42b47978129b499d58b00c8e11d245eb7243 /lib/utils/page.js
parent8a8ffb613442bb37570a5081bf3e1b7943c4b61e (diff)
downloadgitbook-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.js64
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() {