# configure.js

    import template from "lodash.template";
    import fs from "fs-extra";
    import path from "path";

    import defaults from "./defaults";
    import {getLanguage} from "./languages";

    const pick = (obj, ...keys) => {
    	return keys.reduce((acc, key) => {
    		if (obj[key]) {
    			acc[key] = obj[key];
    		}
    		return acc;
    	}, {});
    };

Configure this particular run of Docco. We might use a passed-in external template, or one of the built-in layouts. We only attempt to process source files for languages for which we have definitions.

    const configure = function(options) {
    	const config = {
    		...defaults,
    		...pick(options, ...Object.keys(defaults))
    	};

The user is able to override the layout file used with the `--template` parameter. In this case, it is also neccessary to explicitly specify a stylesheet file. These custom templates are compiled exactly like the predefined ones, but the `public` folder is only copied for the latter.

    	if (options.template) {
    		if (!options.css) {
    			global.console.warn("docco: no stylesheet file specified");
    		}
    		config.layout = null;
    	} else {
    		config.layoutname = config.layout;
    		const dir = config.layout = path.join(__dirname, "../resources", config.layout);
    		if (fs.existsSync(path.join(dir, "public"))) {
    			config.public = path.join(dir, "public");
    		}
    		config.template = path.join(dir, "docco.jst");
    		config.css = options.css || path.join(dir, "docco.css");
    	}
    	try {
    		config.template = template(fs.readFileSync(config.template).toString());
    	} catch (err) {
    		global.console.log(`docco: could not load layout "${config.layoutname}", aborting`);
    		process.exit(!!err); // eslint-disable-line no-process-exit
    	}
    	if (options.marked) {
    		config.marked = JSON.parse(fs.readFileSync(options.marked));
    	}
    	config.sources = options.args.filter(function(source) {
    		const lang = getLanguage(source, config);
    		if (!lang) {
    			global.console.warn(`docco: skipped unknown type (${path.basename(source)})`);
    		}
    		return lang;
    	}).sort();
    	return config;
    };

    export default configure;

h