"use strict"; var fs = require("fs"); var md = require("markdown-it")(); var rules = require("./rules"); function numberComparison(a, b) { return a - b; } function uniqueFilterForSorted(value, index, array) { return (index === 0) || (value > array[index - 1]); } function lintFile(file, config, callback) { fs.readFile(file, { "encoding": "utf8" }, function readFile(err, contents) { if (err) { callback(err); } else { var tokens = md.parse(contents, {}); var lines = contents.split(/\r\n|\r|\n/g); tokens.forEach(function forToken(token) { if (token.lines) { token.line = lines[token.lines[0]]; token.lineNumber = token.lines[0] + 1; } }); var params = { "tokens": tokens, "lines": lines }; var result = {}; var configDefault = config.default; var defaultRule = (configDefault !== undefined) && !!configDefault; rules.forEach(function forRule(rule) { var ruleConfig = config[rule.name]; if (ruleConfig || (defaultRule && (ruleConfig === undefined))) { params.options = (ruleConfig instanceof Object) ? ruleConfig : {}; var errors = []; rule.func(params, errors); if (errors.length) { errors.sort(numberComparison); result[rule.name] = errors.filter(uniqueFilterForSorted); } } }); callback(null, result); } }); } module.exports = function markdownlint(options, callback) { options = options || {}; var files = options.files || []; var config = options.config || { "default": true }; var results = {}; function lintFiles() { var file = files.shift(); if (file) { lintFile(file, config, function lintFileCallback(err, result) { if (err) { callback(err); } else { results[file] = result; lintFiles(); } }); } else { callback(null, results); } } lintFiles(); };