-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathremark.js
143 lines (132 loc) · 4.63 KB
/
remark.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
* @fileoverview Lint markdown (*.md) files using package "remark"
* @author Leonid Buneev
*/
const _ = require('lodash')
const remark = require('remark')
const fs = require('fs')
// const { showInvisibles, generateDifferences } = require('prettier-linter-helpers')
// const { INSERT, DELETE, REPLACE } = generateDifferences
// function reportInsert(context, offset, text) {
// const pos = context.getSourceCode().getLocFromIndex(offset)
// const range = [offset, offset]
// context.report({
// message: 'Insert `{{ code }}`',
// data: { code: showInvisibles(text) },
// loc: { start: pos, end: pos },
// fix(fixer) {
// return fixer.insertTextAfterRange(range, text)
// },
// })
// }
// function reportDelete(context, offset, text) {
// const start = context.getSourceCode().getLocFromIndex(offset)
// const end = context.getSourceCode().getLocFromIndex(offset + text.length)
// const range = [offset, offset + text.length]
// context.report({
// message: 'Delete `{{ code }}`',
// data: { code: showInvisibles(text) },
// loc: { start, end },
// fix(fixer) {
// return fixer.removeRange(range)
// },
// })
// }
// function reportReplace(context, offset, deleteText, insertText) {
// const start = context.getSourceCode().getLocFromIndex(offset)
// const end = context.getSourceCode().getLocFromIndex(offset + deleteText.length)
// const range = [offset, offset + deleteText.length]
// context.report({
// message: 'Replace `{{ deleteCode }}` with `{{ insertCode }}`',
// data: {
// deleteCode: showInvisibles(deleteText),
// insertCode: showInvisibles(insertText),
// },
// loc: { start, end },
// fix(fixer) {
// return fixer.replaceTextRange(range, insertText)
// },
// })
// }
module.exports = {
meta: {
docs: {
description: 'Lint markdown (*.md) files using package "remark"',
},
fixable: 'code', // or "code" or "whitespace"
schema: [
// Remark options:
{
type: 'object',
properties: {},
additionalProperties: true,
},
{
type: 'object',
properties: {
useRemarkrc: { type: 'boolean' },
},
additionalProperties: true,
},
],
},
create: function(context) {
return {
Program(node) {
if (!node.mdCode) return // Not processed by markdown-eslint-parser => not .md
const useRemarkrc = !context.options[1] || context.options[1].useRemarkrc !== false
let remarkOptionsFromFile = null
if (useRemarkrc) {
if (fs.existsSync('./.remarkrc')) {
remarkOptionsFromFile = JSON.parse(fs.readFileSync('./.remarkrc', 'utf8'))
} else if (fs.existsSync('./.remarkrc.js')) {
remarkOptionsFromFile = require('./.remarkrc.js')
}
}
const remarkOptions = _.merge({ plugins: [] }, remarkOptionsFromFile, context.options[0])
// const sourceCode = context.getSourceCode()
// const filepath = context.getFilename()
// const source = sourceCode.text
const source = node.mdCode
let remarkProcessor = remark()
for (let plugin of remarkOptions.plugins) {
if (!_.isArray(plugin)) plugin = [plugin]
if (!plugin[0].startsWith('remark-')) plugin[0] = 'remark-' + plugin[0]
plugin[0] = require(plugin[0])
remarkProcessor = remarkProcessor.use(...plugin)
}
// const vfile = remark()
// .use({
// settings: { emphasis: '*', strong: '*' },
// })
const vfile = remarkProcessor.processSync(source)
const messages = vfile.messages || []
// const fixedSource = String(vfile)
for (const msg of messages) {
msg.location.start.column -= 1
msg.location.end.column -= 1
context.report({
message: msg.message + ` (${msg.ruleId})`,
loc: msg.location,
})
}
// if (source !== fixedSource) {
// const differences = generateDifferences(source, fixedSource)
// for (const difference of differences) {
// switch (difference.operation) {
// case INSERT:
// reportInsert(context, difference.offset, difference.insertText)
// break
// case DELETE:
// reportDelete(context, difference.offset, difference.deleteText)
// break
// case REPLACE:
// reportReplace(context, difference.offset, difference.deleteText, difference.insertText)
// break
// }
// }
// }
},
}
},
}