summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pesse <samypesse@gmail.com>2016-02-13 13:56:04 +0100
committerSamy Pesse <samypesse@gmail.com>2016-02-13 13:56:04 +0100
commitd8ed34beba05bde85af420cc4e42a065021653dc (patch)
tree14a98389f20ef6cf768db851d46267701fa3d4d8
parent3154d37e41da68a16ef29ec69d8896acd9da336a (diff)
downloadgitbook-d8ed34beba05bde85af420cc4e42a065021653dc.zip
gitbook-d8ed34beba05bde85af420cc4e42a065021653dc.tar.gz
gitbook-d8ed34beba05bde85af420cc4e42a065021653dc.tar.bz2
Add method to fetch remote image with AssetsInliner
-rw-r--r--lib/output/assets-inliner.js51
-rw-r--r--lib/output/base.js4
-rw-r--r--lib/output/folder.js6
-rw-r--r--lib/utils/fs.js28
-rw-r--r--package.json2
-rw-r--r--test/assets-inliner.js4
6 files changed, 81 insertions, 14 deletions
diff --git a/lib/output/assets-inliner.js b/lib/output/assets-inliner.js
index 65ecbfa..2156bef 100644
--- a/lib/output/assets-inliner.js
+++ b/lib/output/assets-inliner.js
@@ -3,7 +3,12 @@ var util = require('util');
var path = require('path');
var FolderOutput = require('./folder');
+var Promise = require('../utils/promise');
+var fs = require('../utils/fs');
var imagesUtil = require('../utils/images');
+var location = require('../utils/location');
+
+var DEFAULT_ASSETS_FOLDER = 'assets';
/*
Utility mixin to inline all the assets in a book:
@@ -32,19 +37,45 @@ AssetsInliner.prototype.onOutputSVG = function(page, svg) {
};
// Output an image as a file
-AssetsInliner.prototype.onOutputImage = function(page, imgFile) {
- if (path.extname(imgFile).toLowerCase() != '.svg') {
- return imgFile;
+AssetsInliner.prototype.onOutputImage = function(page, src) {
+ var that = this;
+ var isSVG = false;
+ var ext = path.extname(src).toLowerCase();
+ if (ext == '.svg') {
+ isSVG = false;
+ ext = '.png';
}
- // Convert SVG to PNG
- var filename = _.uniqueId('svg_') + '.png';
- return imagesUtil.convertSVGToPNG(page.resolve(imgFile), this.resolve(filename))
+ return Promise()
- // Return relative path from the page
- .thenResolve(function() {
- return page.relative('/' + filename);
- });
+ // Allocate a new file
+ .then(function() {
+
+ return that.
+ })
+
+ // Download file if external
+ .then(function() {
+ if (!location.isExternal(src)) return;
+
+ return fs.download(src, )
+
+ })
+ .then(function() {
+ if (path.extname(src).toLowerCase() != '.svg') {
+ return src;
+ }
+
+ // Convert SVG to PNG
+ var filename = _.uniqueId('svg_') + '.png';
+ return imagesUtil.convertSVGToPNG(page.resolve(src), this.resolve(filename))
+ .thenResolve('/' + filename);
+ })
+
+ // Return relative path from the page
+ .thenResolve(function(filename) {
+ return page.relative('/' + filename);
+ });
};
diff --git a/lib/output/base.js b/lib/output/base.js
index dd62cff..688ecb7 100644
--- a/lib/output/base.js
+++ b/lib/output/base.js
@@ -106,9 +106,9 @@ Output.prototype.onOutputSVG = function(page, svg) {
};
// Output an image as a file
+// Normalize the relative link
Output.prototype.onOutputImage = function(page, imgFile) {
- // Don't replace it
- return imgFile;
+ return page.relative(imgFile);
};
// Finish the generation
diff --git a/lib/output/folder.js b/lib/output/folder.js
index 4b1d9fa..aabdcc4 100644
--- a/lib/output/folder.js
+++ b/lib/output/folder.js
@@ -74,5 +74,11 @@ FolderOutput.prototype.writeFile = function(filename, buf) {
});
};
+// Create a new unique file
+// Returns its filename
+FolderOutput.prototype.createNewFile = function(base, filename) {
+
+};
+
module.exports = FolderOutput;
diff --git a/lib/utils/fs.js b/lib/utils/fs.js
index ea9546b..bf5e51d 100644
--- a/lib/utils/fs.js
+++ b/lib/utils/fs.js
@@ -2,6 +2,8 @@ var fs = require('graceful-fs');
var mkdirp = require('mkdirp');
var destroy = require('destroy');
var tmp = require('tmp');
+var request = require('request');
+var path = require('path');
var Promise = require('./promise');
@@ -59,6 +61,28 @@ function genTmpFile(opts) {
.get(0);
}
+// Download an image
+function download(uri, dest) {
+ return writeStream(dest, request(uri));
+}
+
+// Find a filename available in a folder
+function uniqueFilename(base, filename) {
+ var ext = path.extname(filename);
+ filename = path.resolve(base, filename);
+ filename = path.join(path.dirname(filename), path.basename(filename, ext));
+
+ var _filename = filename+ext;
+
+ var i = 0;
+ while (fs.existsSync(filename)) {
+ _filename = filename + '_' + i + ext;
+ i = i + 1;
+ }
+
+ return path.relative(base, _filename);
+}
+
module.exports = {
exists: fileExists,
existsSync: fs.existsSync,
@@ -70,5 +94,7 @@ module.exports = {
readdir: Promise.nfbind(fs.readdir),
writeStream: writeStream,
copy: copyFile,
- tmpFile: genTmpFile
+ tmpFile: genTmpFile,
+ download: download,
+ uniqueFilename: uniqueFilename
};
diff --git a/package.json b/package.json
index 4bd629a..1d0b520 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"crc": "3.2.1",
"bash-color": "0.0.3",
"urijs": "1.17.0",
- "request": "2.51.0",
+ "request": "2.69.0",
"npm": "2.4.1",
"dom-serializer": "0.1.0",
"spawn-cmd": "0.0.2",
diff --git a/test/assets-inliner.js b/test/assets-inliner.js
index dd63b41..cb02e42 100644
--- a/test/assets-inliner.js
+++ b/test/assets-inliner.js
@@ -47,5 +47,9 @@ describe('Assets Inliner Output', function() {
output.should.have.file(src);
});
});
+
+ describe('Remote Assets', function() {
+
+ });
});