summaryrefslogtreecommitdiffstats
path: root/lib/conrefs_loader.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-09-15 12:22:54 +0200
committerSamy Pessé <samypesse@gmail.com>2015-09-15 12:22:54 +0200
commit2a52326a454a23444bd8f0395a9ab8a1f5f68831 (patch)
treecf5f447e84e3b4ac2d74d7092d8c522bd6e67b79 /lib/conrefs_loader.js
parent87e4ee1eeb9918cbf151407c66b3377014612d5d (diff)
downloadgitbook-2a52326a454a23444bd8f0395a9ab8a1f5f68831.zip
gitbook-2a52326a454a23444bd8f0395a9ab8a1f5f68831.tar.gz
gitbook-2a52326a454a23444bd8f0395a9ab8a1f5f68831.tar.bz2
Improve conrefs to handle all absolute file paths correctly
Add test for it
Diffstat (limited to 'lib/conrefs_loader.js')
-rw-r--r--lib/conrefs_loader.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/conrefs_loader.js b/lib/conrefs_loader.js
new file mode 100644
index 0000000..72dce8a
--- /dev/null
+++ b/lib/conrefs_loader.js
@@ -0,0 +1,64 @@
+var Q = require("q");
+var path = require("path");
+var nunjucks = require("nunjucks");
+
+var git = require("./utils/git");
+var fs = require("./utils/fs");
+var pathUtil = require("./utils/path");
+
+// The loader should handle relative and git url
+var BookLoader = nunjucks.Loader.extend({
+ async: true,
+
+ init: function(book) {
+ this.book = book;
+ },
+
+ getSource: function(fileurl, callback) {
+ var that = this;
+
+ git.resolveFile(fileurl)
+ .then(function(filepath) {
+ // Is local file
+ if (!filepath) filepath = path.resolve(fileurl);
+ else that.book.log.debug.ln("resolve from git", fileurl, "to", filepath);
+
+ // Read file from absolute path
+ return fs.readFile(filepath)
+ .then(function(source) {
+ return {
+ src: source.toString(),
+ path: filepath
+ }
+ });
+ })
+ .nodeify(callback);
+ },
+
+ resolve: function(from, to) {
+ // If origin is in the book, we enforce result file to be in the book
+ if (this.book.fileIsInBook(from)) {
+ return this.book.resolve(
+ this.book.relative(path.dirname(from)),
+ to
+ );
+ }
+
+ // If origin is in a git repository, we resolve file in the git repository
+ var gitRoot = git.resolveRoot(from);
+ if (gitRoot) {
+ return pathUtil.resolveInRoot(gitRoot, to);
+ }
+
+ // If origin is not in the book (include from a git content ref)
+ return path.resolve(path.dirname(from), to);
+ },
+
+ // Handle all files as relative, so that nunjucks pass responsability to "resolve"
+ // Only git urls are considered as absolute
+ isRelative: function(filename) {
+ return !git.checkUrl(filename);
+ }
+});
+
+module.exports = BookLoader;