/**
 * This is the documentation generator
 * Eats-up a JSON doc file previously generated, and spit out a bunch of html files
 */

(function(){
  'use strict';

  var Y = require('yuidocjs');

  var generator = function(options, json, complete){
    options.quiet = true;

    options = Y.Project.mix(json, options);

    // Instanciate a YUI builder
    var builder = new Y.DocBuilder(options, json);

    var total = 0;
    // Stack of files to return
    var stack = {
    };

    // These are NOT asynchronous, despite the callbackification of the API

    // Handle modules first
    Object.keys(builder.data.modules).forEach(function(k) {
      var v = builder.data.modules[k];
      // External? Don't.
      if (v.external)
        return;
      total++;
      // Render
      builder.renderModule(function(html/*, view*/) {
        stack['modules/' + v.name + '.html'] = html;
      }, v, 'main');
    });

    // Now, classes
    Object.keys(builder.data.classes).forEach(function(k) {
      var v = builder.data.classes[k];
      // External? Don't.
      if (v.external)
        return;
      total++;
      // Render
      builder.renderClass(function(html/*, view*/) {
        stack['classes/' + v.name + '.html'] = html;
      }, v, 'main');
    });

    // Now, files - this one is asynchronous :/
    Object.keys(builder.data.files).forEach(function(k) {
      var v = builder.data.files[k];
      // External? Don't.
      if (v.external)
        return;
      total++;
      // Render
      builder.renderFile(function(html, view, data) {
        if (!view || !data)
          return;
        stack['files/' + data.name.replace(/[\/\\]/g, '_') + '.html'] = html;
        if(Object.keys(stack).length == total)
          complete(stack);
      }, v, 'main');
    });

    // Render the index
    builder.renderIndex(function(html/*, view*/) {
      stack['index.html'] = html;
      total++;
    });

    // Render the stuff
    builder.renderAPIMeta(function(js) {
      stack['api.js'] = js;
      total++;
    });

  };

  module.exports = generator;

}());

/**
 * This is the documentation generator
 * Eats-up a JSON doc file previously generated, and spit out a bunch of html files
 */

(function(){
  'use strict';

  var Y = require('yuidocjs');

  var Generator = function(options){
    options = options || {};
    options.quiet = true;

    this.render = function(vinyl, complete){
      var json = JSON.parse(vinyl.contents.toString('utf8'));

      options = Y.Project.mix(json, options);

      // Instanciate a YUI builder
      var builder = new Y.DocBuilder(options, json);

      var total = 0;
      // Stack of files to return
      var stack = {
      };

      // These are NOT asynchronous, despite the callbackification of the API

      // Handle modules first
      Object.keys(builder.data.modules).forEach(function(k) {
        var v = builder.data.modules[k];
        // External? Don't.
        if (v.external)
          return;
        total++;
        // Render
        builder.renderModule(function(html/*, view*/) {
          stack['modules/' + v.name + '.html'] = html;
        }, v, 'main');
      });

      // Now, classes
      Object.keys(builder.data.classes).forEach(function(k) {
        var v = builder.data.classes[k];
        // External? Don't.
        if (v.external)
          return;
        total++;
        // Render
        builder.renderClass(function(html/*, view*/) {
          stack['classes/' + v.name + '.html'] = html;
        }, v, 'main');
      });

      // Now, files - this one is asynchronous :/
      Object.keys(builder.data.files).forEach(function(k) {
        var v = builder.data.files[k];
        // External? Don't.
        if (v.external)
          return;
        total++;
        // Render
        builder.renderFile(function(html, view, data) {
          if (!view || !data)
            return;
          stack['files/' + data.name.replace(/[\/\\]/g, '_') + '.html'] = html;
          if(Object.keys(stack).length == total)
            complete(stack);
        }, v, 'main');
      });

      // Render the index
      builder.renderIndex(function(html/*, view*/) {
        stack['index.html'] = html;
        total++;
      });

      // Render the stuff
      builder.renderAPIMeta(function(js) {
        stack['api.js'] = js;
        total++;
      });

    };
  };

  module.exports = Generator;

}());

Modify generator to converge with jsDoc