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);
|