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

/**
 * @function task.worker._convertDirectory
 * @param {object} config
 * @param {string} config.srcDir - Source jade directory.
 * @param {string} config.ignore - Ignore  jade pattern. Glob.
 * @param {string} config.pattern - Source jade file pattern. Glob.
 * @param {string} config.destDir - Destination html directory.
 * @param {function} config.fileNameConverter - Function to convert file name.
 * @param {function} config.fileContentConverter - Function to convert file content.
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 *
 */

var path = require('path'),
    fs = require('fs'),
    debug = require('./_debug'),
    file = require('../../lib/file'),
    mkdirP = file.mkdirP,
    _expandGlobUnlessIgnored = require('./_expand_glob_unless_ignored');

exports = module.exports = function (config, callback) {
    var async = require('async'),
        srcDir = path.resolve(config.srcDir),
        destDir = path.resolve(config.destDir),
        fileNameConverter = config.fileNameConverter,
        fileContentConverter = config.fileContentConverter,
        ignore = config.ignore && [].concat(config.ignore).map(function (ignore) {
            return path.resolve(srcDir, ignore)
        }),
        src = path.resolve(srcDir, config.pattern || '*');
    _expandGlobUnlessIgnored(src, ignore, function (err, filenames) {
        if (err) {
            callback(err);
            return;
        }
        async.series(
            filenames
                .map(function (src) {
                    var filename = path.relative(srcDir, src),
                        dest = path.resolve(destDir, fileNameConverter(filename));
                    return {
                        src: src,
                        dest: dest
                    }
                })
                .map(function (data) {
                    return function (callback) {
                        var src = data.src, dest = data.dest;
                        mkdirP(path.dirname(dest), function (err) {
                            if (err) {
                                callback(err);
                                return;
                            }
                            fileContentConverter(src, dest, callback);
                        });
                    }
                }),
            function (err) {
                callback(err)
            }
        )
    });
};