UNPKG

1.99 kBJavaScriptView Raw
1const standard = require('standard')
2const fs = require('fs')
3const range = require('lodash.range')
4const flatten = require('lodash.flatten')
5const async = require('async')
6const blockOpener = /^```(js|javascript)$/mg
7const blockCloser = /^```$/mg
8
9let standardMarkdown = module.exports = {}
10
11standardMarkdown.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
25standardMarkdown.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
41function 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// Seek out the nth block of javascript code in the file
48function extractCodeBlock (lines, targetIndex) {
49 let currentIndex = 0
50 let insideBlock = false
51 return lines
52 .map(line => {
53 // standard doesn't like trailing whitespace
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') // standard requires a newline at end of file
69}