klei-dust
Version:
A helper to use dustjs-linkedin along with Express
259 lines (195 loc) • 6.68 kB
JavaScript
var dust = require('dustjs-linkedin'),
fs = require('fs');
pathlib = require('path');
var kleiDust = function () {
var self = this,
cache = {},
isInitialized = false,
settings = null,
onDustInitCallbacks = [],
originalFormat = null;
var getDefaultOptions = function () {
return {
root: null,
extension: 'dust',
relativeToFile: true,
keepWhiteSpace: false,
useHelpers: false,
cache: false
};
};
var initializeSettings = function () {
if (!settings)
self.resetOptions();
};
this.resetOptions = function () {
settings = getDefaultOptions();
};
this.setOptions = function (options) {
initializeSettings();
if (typeof options.baseContext !== 'undefined')
settings.baseContext = dust.makeBase(options.baseContext);
if (typeof options.root !== 'undefined')
settings.root = options.root;
if (typeof options.extension !== 'undefined')
settings.extension = options.extension;
if (typeof options.cache !== 'undefined')
settings.cache = !!options.cache;
if (typeof options.relativeToFile !== 'undefined')
settings.relativeToFile = !!options.relativeToFile;
if (typeof options.keepWhiteSpace !== 'undefined')
settings.keepWhiteSpace = !!options.keepWhiteSpace;
if (typeof options.useHelpers !== 'undefined')
settings.useHelpers = !!options.useHelpers;
};
this.getOptions = function () {
initializeSettings();
return settings;
};
this.resetInitialization = function () {
isInitialized = false;
};
this.getDust = function () {
initializeDust();
return dust;
}
this.getHelpers = function () {
return self.getDust().helpers;
};
this.setHelpers = function (helpers) {
self.getDust().helpers = helpers;
return self.getDust();
};
this.getFilters = function() {
return self.getDust().filters;
};
this.setFilters = function(filters) {
self.getDust().filters = filters;
return self.getDust();
};
var fileExists = function (path) {
try {
fs.lstatSync(path);
} catch (e) {
return false;
}
return true;
};
this.pathIncludesExtension = function (path) {
if (!self.getOptions().extension)
return true;
if (pathlib.extname(path) !== '')
return true;
return false;
};
this.parseContext = function (locals) {
if (settings && settings.baseContext) {
return settings.baseContext.push(locals);
}
return locals;
};
this._doResolveRelativePath = function (locals) {
return !!(self.getOptions().relativeToFile && locals && locals.filename);
};
this._doResolveExpressViewsPath = function (locals) {
return !!(locals && locals.settings && locals.settings.views);
};
this._doResolveRootSettingPath = function () {
return !!(self.getOptions().root);
};
this.getFullPath = function (path, locals) {
if (this._doResolveRelativePath(locals))
path = pathlib.resolve(pathlib.dirname(locals.filename), path);
else if (this._doResolveRootSettingPath())
path = pathlib.resolve(self.getOptions().root, path);
else if (this._doResolveExpressViewsPath(locals))
path = pathlib.resolve(locals.settings.views, path);
if (fileExists(path))
return path;
if (!self.pathIncludesExtension(path))
path += "." + self.getOptions().extension;
return path;
};
var getCachedString = function (path) {
if (!self.getOptions().cache) return;
var str = cache[path];
if (str && typeof str === 'string')
return str;
};
var setCachedString = function (path, str) {
if (!self.getOptions().cache) return;
cache[path] = str;
};
var getCachedTemplate = function (path) {
if (!self.getOptions().cache) return;
var template = cache[path];
if (template && typeof template === 'function')
return template;
};
var setCachedTemplate = function (path, template) {
if (!self.getOptions().cache) {
self.getDust().cache = {};
return;
}
cache[path] = template;
};
var loadTemplate = function (path, locals, callback) {
path = self.getFullPath(path, locals);
var str = getCachedString(path);
if (str) return callback(null, str);
try {
str = fs.readFileSync(path, 'utf8');
setCachedString(path, str);
callback(null, str);
} catch(err) {
return callback(err);
}
};
var disableWhiteSpaceCompression = function () {
dust.config.whitespace = true;
};
var enableWhiteSpaceCompression = function () {
dust.config.whitespace = false;
};
var loadHelpers = function () {
require('dustjs-helpers');
};
var initializeDust = function (locals) {
if (isInitialized)
return;
if (self.getOptions().keepWhiteSpace)
disableWhiteSpaceCompression();
else
enableWhiteSpaceCompression();
if (self.getOptions().useHelpers) {
loadHelpers();
}
isInitialized = true;
};
this.dust = function(path, locals, callback) {
self.getDust().onLoad = function (path, callback) {
loadTemplate(path, locals, callback);
};
var template = getCachedTemplate(path);
if (template) return template(self.parseContext(locals), callback);
loadTemplate(path, locals, function(err, str) {
if (err) return callback(err);
var root = self.getOptions().root;
if (root && self.getOptions().relativeToFile && path.indexOf(root) === -1)
locals.filename = pathlib.join(root, path);
else
locals.filename = path;
try {
template = self.getDust().compileFn(str);
setCachedTemplate(path, template);
template(self.parseContext(locals), callback);
} catch (e) {
callback(e);
}
});
};
};
module.exports = new kleiDust();
module.exports.create = function() {
return new kleiDust();
};