github.com/cloudcredo/cloudrocker@v0.0.0-20160108110610-1320f8cc2dfd/sample-apps/node/node_modules/express/lib/view.js (about)

     1  /**
     2   * Module dependencies.
     3   */
     4  
     5  var path = require('path');
     6  var fs = require('fs');
     7  var utils = require('./utils');
     8  var dirname = path.dirname;
     9  var basename = path.basename;
    10  var extname = path.extname;
    11  var exists = fs.existsSync || path.existsSync;
    12  var join = path.join;
    13  
    14  /**
    15   * Expose `View`.
    16   */
    17  
    18  module.exports = View;
    19  
    20  /**
    21   * Initialize a new `View` with the given `name`.
    22   *
    23   * Options:
    24   *
    25   *   - `defaultEngine` the default template engine name
    26   *   - `engines` template engine require() cache
    27   *   - `root` root path for view lookup
    28   *
    29   * @param {String} name
    30   * @param {Object} options
    31   * @api private
    32   */
    33  
    34  function View(name, options) {
    35    options = options || {};
    36    this.name = name;
    37    this.root = options.root;
    38    var engines = options.engines;
    39    this.defaultEngine = options.defaultEngine;
    40    var ext = this.ext = extname(name);
    41    if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.');
    42    if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine);
    43    this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
    44    this.path = this.lookup(name);
    45  }
    46  
    47  /**
    48   * Lookup view by the given `path`
    49   *
    50   * @param {String} path
    51   * @return {String}
    52   * @api private
    53   */
    54  
    55  View.prototype.lookup = function(path){
    56    var ext = this.ext;
    57  
    58    // <path>.<engine>
    59    if (!utils.isAbsolute(path)) path = join(this.root, path);
    60    if (exists(path)) return path;
    61  
    62    // <path>/index.<engine>
    63    path = join(dirname(path), basename(path, ext), 'index' + ext);
    64    if (exists(path)) return path;
    65  };
    66  
    67  /**
    68   * Render with the given `options` and callback `fn(err, str)`.
    69   *
    70   * @param {Object} options
    71   * @param {Function} fn
    72   * @api private
    73   */
    74  
    75  View.prototype.render = function(options, fn){
    76    this.engine(this.path, options, fn);
    77  };