Add basic infrastructure, MD031, and test.

This commit is contained in:
David Anson 2015-02-23 23:39:20 -08:00
parent cdec362dc0
commit d16e1cafc1
5 changed files with 136 additions and 1 deletions

27
lib/markdownlint.js Normal file
View file

@ -0,0 +1,27 @@
"use strict";
var fs = require("fs");
var rules = require("./rules");
function lintFile(file, options) {
var results = {};
var contents = fs.readFileSync(file, { encoding: "utf8" });
var lines = contents.split(/\r\n|\n/g);
Object.keys(rules).forEach(function(name) {
var rule = rules[name];
var errors = rule(lines);
if (errors.length) {
results[name] = errors;
}
});
return results;
}
module.exports = function(options) {
var results = {};
var files = options.files || [];
files.forEach(function(file) {
results[file] = lintFile(file, options);
});
return results;
};

30
lib/rules.js Normal file
View file

@ -0,0 +1,30 @@
"use strict";
function padAndTrim(lines) {
return [].concat(
"",
lines.map(function(line) {
return line.trim();
}),
"");
}
module.exports = {
MD031: function(lines) {
// Some parsers have trouble detecting fenced code blocks without
// surrounding whitespace, so examine the lines directly.
lines = padAndTrim(lines);
var errors = [];
var inCode = false;
lines.forEach(function(line, lineNum) {
if (line.match(/^(```|~~~)/)) {
inCode = !inCode;
if ((inCode && lines[lineNum - 1].length) ||
(!inCode && lines[lineNum + 1].length)) {
errors.push(lineNum);
}
}
});
return errors;
}
};

View file

@ -2,7 +2,7 @@
"name": "markdownlint",
"version": "0.0.1",
"description": "A linting tool for Markdown files",
"main": "markdownlint.js",
"main": "lib/markdownlint.js",
"author": "David Anson (http://dlaa.me/)",
"license": "MIT",
"homepage": "https://github.com/DavidAnson/markdownlint",

View file

@ -0,0 +1,42 @@
```
code at start of file
```
text
```ruby
code
```
text
``` {MD031}
code
``` {MD031}
text
```
code
``` {MD031}
text
text
``` {MD031}
code
```
text
```js
code
code
code
```
```html
```
text
```
code at end of file without newline
```

36
test/markdownlint-test.js Normal file
View file

@ -0,0 +1,36 @@
"use strict";
var fs = require("fs");
var path = require("path");
var markdownlint = require("../lib/markdownlint");
function createTestForFile(file) {
return function(test) {
test.expect(1);
var contents = fs.readFileSync(file, { encoding: "utf8" });
var lines = contents.split(/\r\n|\n/g);
var results = {};
lines.forEach(function(line, lineNum) {
var match = line.match(/\{(MD\d+)(?::(\d+))?\}/);
if (match) {
var rule = match[1];
var lines = results[rule] || [];
lines.push(lineNum + 1);
results[rule] = lines;
}
});
var actual = markdownlint({
files: [ file ]
});
var expected = {};
expected[file] = results;
test.deepEqual(actual, expected, "Line numbers are not correct.");
test.done();
};
}
fs.readdirSync(__dirname).forEach(function(file) {
if (file.match(/\.md$/)) {
module.exports[file] = createTestForFile(path.join(__dirname, file));
}
});