1 | const standard = require('standard')
|
2 | const fs = require('fs')
|
3 | const range = require('lodash.range')
|
4 | const flatten = require('lodash.flatten')
|
5 | const async = require('async')
|
6 | const blockOpener = /^```(js|javascript)$/mg
|
7 | const blockCloser = /^```$/mg
|
8 |
|
9 | let standardMarkdown = module.exports = {}
|
10 |
|
11 | standardMarkdown.lintText = function (text, done) {
|
12 | const blocks = extractCodeBlocks(text)
|
13 | async.map(
|
14 | blocks,
|
15 | function (block, callback) { return standard.lintText(block, callback) },
|
16 | function (err, results) {
|
17 | if (err) return done(err)
|
18 | results = results.map(r => r.results.map(res => res.messages))
|
19 | results = flatten(flatten(results))
|
20 | return done(null, results)
|
21 | }
|
22 | )
|
23 | }
|
24 |
|
25 | standardMarkdown.lintFiles = function (files, done) {
|
26 | async.map(
|
27 | files,
|
28 | function (file, callback) {
|
29 | standardMarkdown.lintText(fs.readFileSync(file, 'utf8'), function (err, errors) {
|
30 | if (err) return callback(err)
|
31 | return callback(null, {file: file, errors: errors})
|
32 | })
|
33 | },
|
34 | function (err, results) {
|
35 | if (err) return done(err)
|
36 | return done(null, results)
|
37 | }
|
38 | )
|
39 | }
|
40 |
|
41 | function extractCodeBlocks (text) {
|
42 | const lines = text.split('\n')
|
43 | const matches = text.match(blockOpener) || []
|
44 | return range(matches.length).map(index => extractCodeBlock(lines, index))
|
45 | }
|
46 |
|
47 |
|
48 | function extractCodeBlock (lines, targetIndex) {
|
49 | let currentIndex = 0
|
50 | let insideBlock = false
|
51 | return lines
|
52 | .map(line => {
|
53 |
|
54 | line = line.replace(/\s*$/, '')
|
55 |
|
56 | if (line.match(blockOpener)) {
|
57 | if (currentIndex === targetIndex) {
|
58 | insideBlock = true
|
59 | line = `// -${line}`
|
60 | }
|
61 | currentIndex++
|
62 | }
|
63 | if (line.match(blockCloser)) insideBlock = false
|
64 | if (!insideBlock) line = `// -${line}`
|
65 | return line
|
66 | })
|
67 | .join('\n')
|
68 | .concat('\n')
|
69 | }
|