generator-hilary
Version:
Yeoman generator for projects that use hilary IoC (DI)
107 lines (87 loc) • 2.89 kB
JavaScript
module.exports.name = 'docRenderer';
module.exports.singleton = true;
module.exports.dependencies = ['fs', 'async', 'marked', 'highlight.js', 'environment', 'mdParser'];
module.exports.factory = function(fs, async, marked, highlight, env, mdParser) {
'use strict';
var readDocs, makeReader, render, rendered, projectName;
projectName = env.get('projectName');
// create an alias for node, so we can differentiate between server-side
// and client-side examples
highlight.registerLanguage('node', function () {
return highlight.getLanguage('js');
});
marked.setOptions({
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: true,
smartLists: true,
smartypants: false,
highlight: function(code, lang, callback) {
var content = highlight.highlightAuto(code).value;
callback(null, content);
}
});
makeReader = function(filepath) {
return function(callback) {
fs.readFile(filepath, function(err, markdown) {
if (err) {
callback(err);
return;
}
callback(null, markdown + '');
});
};
};
readDocs = function(callback) {
var files = env.get('docs:files'),
fileReaders = [],
i;
for (i = 0; i < files.length; i += 1) {
fileReaders.push(makeReader(files[i]));
}
async.parallel(fileReaders, function(err, result) {
if (err) {
callback(err);
return;
}
var markdown = '',
i;
for (i = 0; i < result.length; i += 1) {
markdown += result[i];
}
callback(null, markdown);
});
};
render = function(options, next) {
var tasks = [];
if (rendered) {
// we already rendered the documentation, keep using it
return next(null, rendered);
}
options = options || {};
tasks.push(readDocs);
tasks.push(function (markdown, callback) {
mdParser.parse(markdown, callback);
});
tasks.push(function (markdown, callback) {
marked(markdown, callback);
});
tasks.push(function (html, callback) {
rendered = {
title: projectName,
content: html,
language: options.language || 'any',
languages: JSON.stringify(options.languages),
useHeadingAlerts: options.useHeadingAlerts !== false
};
callback(null, rendered);
});
async.waterfall(tasks, next);
};
return {
render: render
};
};