Add support for shareable/extendable configuration via "extends" and helper functions (fixes #33).

This commit is contained in:
David Anson 2017-05-19 22:36:46 -07:00
parent d826833a82
commit 7528295cae
11 changed files with 385 additions and 25 deletions

View file

@ -1,6 +1,7 @@
"use strict";
var fs = require("fs");
var path = require("path");
var md = require("markdown-it")({ "html": true });
var rules = require("./rules");
var shared = require("./shared");
@ -329,7 +330,7 @@ function markdownlintSynchronousCallback() {
}
/**
* Lint specified Markdown files according to configurable rules.
* Lint specified Markdown files.
*
* @param {Object} options Configuration options.
* @param {Function} callback Callback (err, result) function.
@ -387,7 +388,7 @@ function markdownlint(options, callback) {
}
/**
* Lint specified Markdown files according to configurable rules.
* Lint specified Markdown files synchronously.
*
* @param {Object} options Configuration options.
* @returns {Object} Result object.
@ -396,6 +397,63 @@ function markdownlintSync(options) {
return markdownlint(options, markdownlintSynchronousCallback);
}
/**
* Read specified configuration file.
*
* @param {String} file Configuration file name/path.
* @param {Function} callback Callback (err, result) function.
* @returns {void}
*/
function readConfig(file, callback) {
// Read file
fs.readFile(file, shared.utf8Encoding, function handleFile(err, content) {
if (err) {
return callback(err);
}
// Parse file
var config = null;
try {
config = JSON.parse(content);
} catch (ex) {
return callback(ex);
}
if (config.extends) {
// Extend configuration
var extendsFile = path.resolve(path.dirname(file), config.extends);
readConfig(extendsFile, function handleConfig(errr, extendsConfig) {
if (errr) {
return callback(errr);
}
delete config.extends;
callback(null, shared.assign(extendsConfig, config));
});
} else {
callback(null, config);
}
});
}
/**
* Read specified configuration file synchronously.
*
* @param {String} file Configuration file name/path.
* @returns {Object} Configuration object.
*/
function readConfigSync(file) {
// Parse file
var config = JSON.parse(fs.readFileSync(file, shared.utf8Encoding));
if (config.extends) {
// Extend configuration
config = shared.assign(
readConfigSync(path.resolve(path.dirname(file), config.extends)),
config);
delete config.extends;
}
return config;
}
// Export a/synchronous APIs
module.exports = markdownlint;
module.exports.sync = markdownlintSync;
module.exports.readConfig = readConfig;
module.exports.readConfigSync = readConfigSync;