var markdownlint = require("markdownlint");
var glob = require("glob");
var fs = require("fs");

var inputFiles = glob.sync("**/*.md", { ignore: "node_modules/**/*" });
var options = {
  files: inputFiles,
  config: {
    MD001: false, // Header levels should only increment by one level at a time
    MD002: false, // First header should be a h1 header
    MD003: "atx", // Header style
    MD004: { style: "asterisk" }, // Unordered list style
    MD005: true, // Inconsistent indentation for list items at the same level
    MD006: true, // Consider starting bulleted lists at the beginning of the line
    MD007: { indent: 4 }, // Unordered list indentation
    MD009: true, // Trailing spaces
    MD010: true, // Hard tabs
    MD011: true, // Reversed link syntax
    MD012: true, // Multiple consecutive blank lines
    MD013: false, // Line length
    MD014: false, // Dollar signs used before commands without showing output
    MD018: true, // No space after hash on atx style header
    MD019: true, // Multiple spaces after hash on atx style header
    MD020: false, // No space inside hashes on closed atx style header
    MD021: false, // Multiple spaces inside hashes on closed atx style header
    MD022: true, // Headers should be surrounded by blank lines
    MD023: true, // Headers must start at the beginning of the line
    MD024: false, // Multiple headers with the same content
    MD025: false, // Multiple top level headers in the same document
    MD026: { punctuation: ".,;:!" }, // Trailing punctuation in header
    MD027: true, // Multiple spaces after blockquote symbol
    MD028: true, // Blank line inside blockquote
    MD029: { style: "ordered" }, // Ordered list item prefix
    MD030: true, // Spaces after list markers
    MD031: true, // Fenced code blocks should be surrounded by blank lines
    MD032: true, // Lists should be surrounded by blank lines
    MD033: false, // Inline HTML
    MD034: true, // Bare URL used
    MD035: "---", // Horizontal rule style
    MD036: false, // Emphasis used instead of a header
    MD037: true, // Spaces inside emphasis markers
    MD038: false, // Spaces inside code span elements
    MD039: true, // Spaces inside link text
    MD040: true, // Fenced code blocks should have a language specified
    MD041: false, // First line in file should be a top level header
  }
};

var result = markdownlint.sync(options);
console.log(result.toString());

var exitCode = 0;
Object.keys(result).forEach(function (file) {
    var fileResults = result[file];
    Object.keys(fileResults).forEach(function (rule) {
        var ruleResults = fileResults[rule];
        exitCode += ruleResults.length;
    });
});

inputFiles.forEach(function(fileName) {
    var text = fs.readFileSync(fileName, "utf8")
    exitCode += checkForImproperlyIndentedFencedCodeBlocks(fileName, text);
})

process.exit(exitCode);

/**
 * @param {string} fileName
 * @param {string} text
 */
function checkForImproperlyIndentedFencedCodeBlocks(fileName, text) {
    var lines = text.split(/\r?\n/g);
    var numErrors = 0;

    for (var i = 0; i < lines.length; i++) {
        var line = lines[i];
        var codeBlockMatch = line.match(/^(\s*)```\S+/);

        if (codeBlockMatch) {
            var startingColumn = codeBlockMatch[1].length;
            if (startingColumn === 0 || startingColumn === getCorrectStartingColumnForLine(lines, i)) {
                continue;
            }

            numErrors++;
            console.log(fileName + ": " +
                        i + 1 + ": A fenced code block following a list item must be indented to the first non-whitespace character of the list item.")
        }
    }

    return numErrors;
}

/**
 * @param {string[]} line
 * @param {number} lineIndex
 */
function getCorrectStartingColumnForLine(lines, lineIndex) {
    for (var i = lineIndex - 1; i >= 0; i--) {
        var line = lines[i];

        if (line.length === 0) {
            continue;
        }

        var m;
        if (m = line.match(/^\s*([\*\-]|(\d+\.))\s*/)) {
            return m[0].length;
        }
        if (m = line.match(/^(\s*)/)) {
            return m[0].length;
        }
    }

    return 0;
}
@@ -219,13 +219,17 @@
     
-MD001
+%22default%22
 : fa
@@ -240,122 +240,42 @@
  // 
-Header levels should only increment by one level at a time%0A    MD002: false, // First header should be a h1 header
+Let's disable all rules by default
 %0A   
@@ -743,119 +743,8 @@
 nes%0A
-    MD013: false, // Line length%0A    MD014: false, // Dollar signs used before commands without showing output%0A
     
@@ -870,157 +870,8 @@
 der%0A
-    MD020: false, // No space inside hashes on closed atx style header%0A    MD021: false, // Multiple spaces inside hashes on closed atx style header%0A
     
@@ -1002,137 +1002,8 @@
 ine%0A
-    MD024: false, // Multiple headers with the same content%0A    MD025: false, // Multiple top level headers in the same document%0A
     
@@ -1426,41 +1426,8 @@
 nes%0A
-    MD033: false, // Inline HTML%0A
     
@@ -1511,158 +1511,49 @@
 MD03
-6: false, // Emphasis used instead of a header%0A    MD037: true, // Spaces inside emphasis markers%0A    MD038: false, // Spaces inside code span element
+7: true, // Spaces inside emphasis marker
 s%0A  
@@ -1669,77 +1669,9 @@
 fied
-%0A    MD041: false, // First line in file should be a top level header
+s
 %0A  %7D

Remove disabled markdownlint rules