2015-02-23 23:39:20 -08:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
var fs = require("fs");
|
2015-02-25 18:00:08 -08:00
|
|
|
var md = require("markdown-it")();
|
2015-02-23 23:39:20 -08:00
|
|
|
var rules = require("./rules");
|
2015-03-08 23:08:43 -07:00
|
|
|
var shared = require("./shared");
|
2015-02-23 23:39:20 -08:00
|
|
|
|
2015-02-24 23:35:34 -08:00
|
|
|
function numberComparison(a, b) {
|
|
|
|
return a - b;
|
|
|
|
}
|
|
|
|
|
|
|
|
function uniqueFilterForSorted(value, index, array) {
|
|
|
|
return (index === 0) || (value > array[index - 1]);
|
|
|
|
}
|
|
|
|
|
2015-02-27 22:06:54 -08:00
|
|
|
function lintFile(file, config, callback) {
|
2015-02-24 18:40:37 -08:00
|
|
|
fs.readFile(file, { "encoding": "utf8" }, function readFile(err, contents) {
|
|
|
|
if (err) {
|
|
|
|
callback(err);
|
|
|
|
} else {
|
2015-03-03 18:28:59 -08:00
|
|
|
var tokens = md.parse(contents, {});
|
2015-03-08 23:08:43 -07:00
|
|
|
var lines = contents.split(shared.newLineRe);
|
2015-03-02 23:52:39 -08:00
|
|
|
tokens.forEach(function forToken(token) {
|
|
|
|
if (token.lines) {
|
|
|
|
token.line = lines[token.lines[0]];
|
|
|
|
token.lineNumber = token.lines[0] + 1;
|
|
|
|
}
|
|
|
|
});
|
2015-02-27 22:06:54 -08:00
|
|
|
var params = {
|
2015-03-02 23:52:39 -08:00
|
|
|
"tokens": tokens,
|
|
|
|
"lines": lines
|
2015-02-27 22:06:54 -08:00
|
|
|
};
|
2015-02-24 18:40:37 -08:00
|
|
|
var result = {};
|
2015-03-02 22:45:43 -08:00
|
|
|
var configDefault = config.default;
|
|
|
|
var defaultRule = (configDefault !== undefined) && !!configDefault;
|
2015-02-24 23:50:37 -08:00
|
|
|
rules.forEach(function forRule(rule) {
|
2015-02-27 22:06:54 -08:00
|
|
|
var ruleConfig = config[rule.name];
|
2015-03-02 22:45:43 -08:00
|
|
|
if (ruleConfig || (defaultRule && (ruleConfig === undefined))) {
|
2015-03-01 22:56:52 -08:00
|
|
|
params.options = (ruleConfig instanceof Object) ? ruleConfig : {};
|
|
|
|
var errors = [];
|
|
|
|
rule.func(params, errors);
|
|
|
|
if (errors.length) {
|
|
|
|
errors.sort(numberComparison);
|
|
|
|
result[rule.name] = errors.filter(uniqueFilterForSorted);
|
|
|
|
}
|
2015-02-24 18:40:37 -08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
callback(null, result);
|
2015-02-23 23:39:20 -08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-02-24 18:40:37 -08:00
|
|
|
module.exports = function markdownlint(options, callback) {
|
2015-02-27 22:06:54 -08:00
|
|
|
options = options || {};
|
2015-03-11 21:13:21 -07:00
|
|
|
callback = callback || function noop() {};
|
2015-02-23 23:39:20 -08:00
|
|
|
var files = options.files || [];
|
2015-03-02 22:45:43 -08:00
|
|
|
var config = options.config || { "default": true };
|
2015-02-27 22:06:54 -08:00
|
|
|
var results = {};
|
2015-02-24 18:40:37 -08:00
|
|
|
function lintFiles() {
|
|
|
|
var file = files.shift();
|
|
|
|
if (file) {
|
2015-02-27 22:06:54 -08:00
|
|
|
lintFile(file, config, function lintFileCallback(err, result) {
|
2015-02-24 18:40:37 -08:00
|
|
|
if (err) {
|
|
|
|
callback(err);
|
|
|
|
} else {
|
|
|
|
results[file] = result;
|
|
|
|
lintFiles();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
callback(null, results);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lintFiles();
|
2015-02-23 23:39:20 -08:00
|
|
|
};
|