diff options
Diffstat (limited to 'lib/output2/conrefs.js')
-rw-r--r-- | lib/output2/conrefs.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/output2/conrefs.js b/lib/output2/conrefs.js new file mode 100644 index 0000000..e58f836 --- /dev/null +++ b/lib/output2/conrefs.js @@ -0,0 +1,67 @@ +var path = require('path'); +var util = require('util'); + +var folderOutput = require('./folder'); +var Git = require('../utils/git'); +var fs = require('../utils/fs'); +var pathUtil = require('../utils/path'); +var location = require('../utils/location'); + +/* +Mixin for output to resolve git conrefs +*/ + +module.exports = function conrefsLoader(Base) { + Base = folderOutput(Base); + + function ConrefsLoader() { + Base.apply(this, arguments); + + this.git = new Git(); + } + util.inherits(ConrefsLoader, Base); + + // Read a template by its source URL + ConrefsLoader.prototype.onGetTemplate = function(sourceURL) { + var that = this; + + return this.git.resolve(sourceURL) + .then(function(filepath) { + // Is local file + if (!filepath) { + filepath = that.book.resolve(sourceURL); + } else { + that.book.log.debug.ln('resolve from git', sourceURL, 'to', filepath); + } + + // Read file from absolute path + return fs.readFile(filepath) + .then(function(source) { + return { + src: source.toString('utf8'), + path: filepath + }; + }); + }); + }; + + // Generate a source URL for a template + ConrefsLoader.prototype.onResolveTemplate = function(from, to) { + // If origin is in the book, we enforce result file to be in the book + if (this.book.isInBook(from)) { + var href = location.toAbsolute(to, path.dirname(from), ''); + return this.book.resolve(href); + } + + // If origin is in a git repository, we resolve file in the git repository + var gitRoot = this.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); + }; + + return ConrefsLoader; +}; |