Source: apc-static/task/worker/generate_html_from_markdown.js

/**
 * Generate a html file from markdown.
 * @function task.worker.generateHtmlFromMarkdown
 * @param {object} config - Work configuration.
 * @param {string} config.src - Source markdown file path.
 * @param {string} config.dest - Destination html file path.
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 *
 */
var path = require('path'),
    util = require('util'),
    debug = require('./_debug'),
    fs = require('fs'),
    lib = require('../../lib'),
    string = lib.string,
    file = lib.file,
    underscorize = string.underscorize,
    forceUnlink = file.forceUnlink,
    html = lib.html,
    markdown2html = html.markdown2html;

exports = module.exports = function (config, callback) {
    var src = exports._resolveAll(config.src),
        dest = exports._resolveAll(config.dest);
    require('async')
        .series(
            src.map(function (src, i) {
                return function (callback) {
                    exports._convert(src, dest[i] || dest[0], callback);
                }
            }),
            callback
        );

};


exports._resolveAll = function (filename) {
    return [].concat(filename || []).map(function (filename) {
        return path.resolve(filename);
    });
};

exports._convert = function (src, dest, callback) {
    dest = util.format(dest, underscorize(path.basename(src, path.extname(src)).toLowerCase())
        .replace(/_/g, '-')).replace(/\-\-/g, '-').replace(/\-\./g, '.');
    forceUnlink(dest, function (err) {
        if (err) {
            callback(err);
            return;
        }
        markdown2html(src, dest, function (err) {
            if (err) {
                callback(err);
                return;
            }
            fs.chmod(dest, '444', function (err) {
                if (!err) {
                    debug.didCreateFile(dest);
                }
                callback(err);
            });
        });
    });
};