text: /*==============================================================================
    Demo template, showing how documentation can be generated for `vis.js`.
  
    ------------------------------------------------------------------------------
    ## Notes on `jsdoc` code
  
    // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness
    // doesn't try to hand them out later
    indexUrl = helper.getUniqueFilename('index');
    // don't call registerLink() on this one! 'index' is also a valid longname
  
    globalUrl = helper.getUniqueFilename('global');
    helper.registerLink('global', globalUrl);
  
    ============================================================================== */
  'use strict';
  //var taffy = require('taffydb').taffy;  // not really required here, left for reference
  
  // Internal modules of `jsdoc` are available here.
  // This is not the complete list, there may be more useful stuff in jsdoc
  // For all modules scan in: '/usr/lib/node_modules/jsdoc/lib/jsdoc/' (or similar on your system)
  var fs = require('jsdoc/fs');
  var path = require('jsdoc/path');
  var template = require('jsdoc/template');
  
  
  /**
   * Set up the template rendering engine.
   */
  function createRenderer(fromDir, data) {
    var renderer = new template.Template(fromDir);  // Param is the template source directory.
                                                    // All template files are relative to this directory!
    /**
     * Example helper method
     * 
     * This can be called from within a template as follows:
     * 
     * ```
     * <?js
     *  var self = this;
     * ?>
     * ... 
     * <?js= self.helper('hello!') ?>
     * ```
     * 
     * /
    renderer.helper = function(val) {
      return 'this is a helper! ' + val;
  	};
    */
  
    /**
     * Retrieves jsdoc info for the passed instance method.
     */
    renderer.getComment = function(methodName) {
      var tmp = data().filter({longname: methodName}).get()[0];
  
      if (tmp === undefined) {
        throw new Error('Could not find jsdoc for: ' + methodName);
      }
  
      // NOTE: Following does not show up with `gulp docs`, need to do call directly
  	  // console.log(JSON.stringify(tmp, null, 2));
  
      // Some restructuring, to adapt it to the docs layout
      // This needs some work to make it handle 0 and > 1 parameters
      var paramText = "";
      if (tmp.params !== undefined && tmp.params.length > 0) {
        let param = tmp.params[0];
        let tmpText = param.type.names.join('|') + ' ' + param.name;
        if (param.optional === true) {
          tmpText = '[' + tmpText + ']';
        }
        paramText = '<code>' + tmpText + '</code>';
      }
      var prototype = tmp.name + '(' + paramText + ')';
  
      var returns = 'none';
      if (tmp.returns !== undefined && tmp.returns.length > 0) {
        let name = tmp.returns[0].type.names[0];
        if (name !== "undefined") {
          returns = name;
        }
      }
  
      return {
        name: tmp.name,
        prototype: prototype,
        returns: returns,
        description: tmp.description
      }
  	};
  
    return renderer;
  }
  
  
  /**
    Entry point for the template.
  
    This is called from `jsdoc` during execution
  
      @param {TAFFY} taffyData See <http://taffydb.com/>.
      @param {object} opts
      @param {Tutorial} tutorials
   */
  exports.publish = function(taffyData, opts, tutorials) {
    //console.log(JSON.stringify(opts, null, 2));
  
    var fromDir = path.resolve(opts.template);
    var toDir = path.join(opts.destination);
    var renderer = createRenderer(fromDir, taffyData);
  
    var docFiles = fs.ls(fromDir, 3);
    docFiles.forEach(function(fileName) {
      // Template filenames need to be relative to template source dir
      var relName = path.relative(fromDir, fileName);
      var outFile = path.join(toDir, relName);
  
      if (/publish.js$/.test(fileName)) return;   // Skip self
      if (/README.md$/.test(fileName)) return;   // Skip own README
      if (/\.tmpl$/.test(fileName)) return;       // Skip .tmpl files; these are used as partials only
  
      if (!/\.html$/.test(fileName)) {
        // Just plain copy over non-html files
        var tmpDir = fs.toDir(outFile);
        fs.mkPath(tmpDir);
        fs.copyFileSync(fileName, tmpDir);
        return;
      }
     
      // Render html files as templates 
      //console.log(relName);
      var html = renderer.partial(relName, {});
      fs.mkPath(fs.toDir(outFile));
      fs.writeFileSync(outFile, html, 'utf8');
    });
  
    //console.log(JSON.stringify(env, null, 2));
  };
  