| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 
/* renderer.coffee */(function() {  var ContentTree, Stream, async, extend, fs, mkdirp, path, pump, ref, render, renderView, setImmediate, util;  fs = require('fs');  util = require('util');  async = require('async');  path = require('path');  mkdirp = require('mkdirp');  Stream = require('stream').Stream;  ContentTree = require('./content').ContentTree;  ref = require('./utils'), pump = ref.pump, extend = ref.extend;  if (typeof setImmediate === "undefined" || setImmediate === null) {    setImmediate = process.nextTick;  }  renderView = function(env, content, locals, contents, templates, callback) {    return setImmediate(function() {      var _locals, name, view;      _locals = {        env: env,        contents: contents      };      extend(_locals, locals);      view = content.view;      if (typeof view === 'string') {        name = view;        view = env.views[view];        if (view == null) {          callback(new Error("content '" + content.filename + "' specifies unknown view '" + name + "'"));          return;        }      }      return view.call(content, env, _locals, contents, templates, function(error, result) {        if (error != null) {          error.message = content.filename + ": " + error.message;        }        return callback(error, result);      });    });  };  render = function(env, outputDir, contents, templates, locals, callback) {    /* Render *contents* and *templates* using environment *env* to *outputDir*.        The output directory will be created if it does not exist.     */    var items, renderPlugin;    env.logger.info("rendering tree:\n" + (ContentTree.inspect(contents, 1)) + "\n");    env.logger.verbose("render output directory: " + outputDir);    renderPlugin = function(content, callback) {      /* render *content* plugin, calls *callback* with true if a file is written; otherwise false. */      return renderView(env, content, locals, contents, templates, function(error, result) {        var destination, writeStream;        if (error) {          return callback(error);        } else if (result instanceof Stream || result instanceof Buffer) {          destination = path.join(outputDir, content.filename);          env.logger.verbose("writing content " + content.url + " to " + destination);          mkdirp.sync(path.dirname(destination));          writeStream = fs.createWriteStream(destination);          if (result instanceof Stream) {            return pump(result, writeStream, callback);          } else {            return writeStream.end(result, callback);          }        } else {          env.logger.verbose("skipping " + content.url);          return callback();        }      });    };    items = ContentTree.flatten(contents);    return async.forEachLimit(items, env.config._fileLimit, renderPlugin, callback);  };  /* Exports */  module.exports = {    render: render,    renderView: renderView  };}).call(this);
 |