var path = require('path') var utils = require('../utils') /** * Loads templates from a provided object mapping. * @alias swig.loaders.memory * @example * var templates = { * "layout": "{% block content %}{% endblock %}", * "home.html": "{% extends 'layout.html' %}{% block content %}...{% endblock %}" * }; * swig.setDefaults({ loader: swig.loaders.memory(templates) }); * * @param {object} mapping Hash object with template paths as keys and template sources as values. * @param {string} [basepath] Path to the templates as string. Assigning this value allows you to use semi-absolute paths to templates instead of relative paths. */ module.exports = function (mapping, basepath) { var ret = {} basepath = basepath ? path.resolve(basepath) : null /** * Resolves to to an absolute path or unique identifier. This is used for building correct, normalized, and absolute paths to a given template. * @alias resolve * @param {string} to Non-absolute identifier or pathname to a file. * @param {string} [from] If given, should attempt to find the to path in relation to this given, known path. * @return {string} */ ret.resolve = function (to, from) { if (basepath) { from = basepath } else { from = from ? path.dirname(from) : '/' } return path.resolve(from, to) } /** * Loads a single template. Given a unique identifier found by the resolve method this should return the given template. * @alias load * @param {string} identifier Unique identifier of a template (possibly an absolute path). * @param {function} [cb] Asynchronous callback function. If not provided, this method should run synchronously. * @return {string} Template source string. */ ret.load = function (pathname, cb) { var src, paths paths = [pathname, pathname.replace(/^(\/|\\)/, '')] src = mapping[paths[0]] || mapping[paths[1]] if (!src) { utils.throwError('Unable to find template "' + pathname + '".') } if (cb) { cb(null, src) return } return src } return ret }