var fs = require('fs') var path = require('path') /** * Loads templates from the file system. * @alias swig.loaders.fs * @example * swig.setDefaults({ loader: swig.loaders.fs() }); * @example * // Load Templates from a specific directory (does not require using relative paths in your templates) * swig.setDefaults({ loader: swig.loaders.fs(__dirname + '/templates' )}); * @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. * @param {string} [encoding='utf8'] Template encoding */ module.exports = function (basepath, encoding) { var ret = {} encoding = encoding || 'utf8' 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) : process.cwd() } 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 (identifier, cb) { if (!fs || (cb && !fs.readFile) || !fs.readFileSync) { throw new Error( 'Unable to find file ' + identifier + ' because there is no filesystem to read from.' ) } identifier = ret.resolve(identifier) if (cb) { fs.readFile(identifier, encoding, cb) return } return fs.readFileSync(identifier, encoding) } return ret }