68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
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;
|
|
};
|