Skip to content

Commit 870cb99

Browse files
committed
Update support for configuration comments
* Add a new `ignore` keyword which ignores warnings in the following node; * Externalise `lib/filter` to `remark-message-control`.
1 parent b6309f0 commit 870cb99

File tree

6 files changed

+39
-274
lines changed

6 files changed

+39
-274
lines changed

component.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
1111
],
1212
"repository": "wooorm/remark-lint",
1313
"dependencies": {
14-
"sindresorhus/plur": "^2.0.0",
15-
"wooorm/remark-range": "^2.0.0",
14+
"sindresorhus/decamelize": "^1.0.0",
1615
"wooorm/mdast-util-heading-style": "^1.0.0",
1716
"wooorm/mdast-util-position": "^1.0.0",
1817
"wooorm/mdast-util-to-string": "^1.0.0",
18+
"eush77/npm-prefix": "^1.1.1",
19+
"sindresorhus/plur": "^2.0.0",
20+
"wooorm/remark-message-control": "^1.0.1",
21+
"wooorm/remark-range": "^2.0.0",
1922
"wooorm/unist-util-visit": "^1.0.0",
20-
"wooorm/mdast-zone": "^2.0.0",
2123
"wooorm/vfile-sort": "^1.0.0"
2224
},
2325
"scripts": [

lib/filter.js

Lines changed: 0 additions & 139 deletions
This file was deleted.

lib/index.js

Lines changed: 25 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ var SOURCE = 'remark-lint';
2424
var decamelize = require('decamelize');
2525
var sort = require('vfile-sort');
2626
var range = require('remark-range');
27-
var zone = require('mdast-zone');
27+
var control = require('remark-message-control');
2828
var internals = require('./rules');
29-
var filter = require('./filter');
3029
var npmPrefix = require('npm-prefix')();
3130

3231
/*
@@ -249,162 +248,61 @@ function decamelizeSettings(source) {
249248
*/
250249
function lint(remark, options) {
251250
var settings = decamelizeSettings(options || {});
252-
var reset = settings.reset;
253251
var rules = loadExternals(settings.external);
254-
var id;
252+
var reset = options && options.reset;
253+
var enable = [];
254+
var disable = [];
255+
var known = [];
255256
var setting;
257+
var id;
256258

257259
/*
258260
* Ensure offset information is added.
259261
*/
260262

261263
remark.use(range);
262264

263-
/**
264-
* Get the latest state of a rule.
265-
*
266-
* @param {string} ruleId - Unique rule name.
267-
* @param {File} [file] - File (optional)
268-
*/
269-
function getState(ruleId, file) {
270-
var scope = file && file.namespace('remark-lint');
271-
var ranges = scope && scope.ranges && scope.ranges[ruleId];
272-
273-
if (ranges) {
274-
return ranges[ranges.length - 1].state;
275-
}
276-
277-
setting = settings[ruleId];
278-
279-
if (setting === false) {
280-
return false;
281-
}
282-
283-
return !reset || (setting !== null && setting !== undefined);
284-
}
285-
286-
/**
287-
* Store settings on `file`.
288-
*
289-
* @param {File} file - Virtual file.
290-
*/
291-
function store(file) {
292-
var scope = file.namespace('remark-lint');
293-
var ranges = scope.ranges;
294-
var ruleId;
295-
296-
if (!ranges) {
297-
ranges = {};
298-
299-
for (ruleId in rules) {
300-
ranges[ruleId] = [{
301-
'state': getState(ruleId),
302-
'position': {
303-
'line': 0,
304-
'column': 0
305-
}
306-
}];
307-
}
308-
309-
scope.ranges = ranges;
310-
}
311-
}
312-
313-
remark.use(function () {
314-
return function (ast, file) {
315-
store(file);
316-
};
317-
});
318-
319265
/*
320266
* Add each rule as a seperate plugin.
321267
*/
322268

323269
for (id in rules) {
324-
remark.use(attachFactory(id, rules[id], settings[id]));
325-
}
326-
327-
/**
328-
* Handle a rule.
329-
*
330-
* @param {VFile} file - Virtual file.
331-
* @param {Object} marker - Marker context.
332-
* @param {string} type - Type to toggle to.
333-
* @param {*} ruleId - Rule to toggle.
334-
*/
335-
function toggle(file, marker, type, ruleId) {
336-
var scope = file.namespace('remark-lint');
337-
var markers;
338-
var currentState;
339-
var previousState;
270+
setting = settings[id];
340271

341-
if (!(ruleId in rules)) {
342-
file.fail('Unknown rule: cannot ' + type + ' `\'' + ruleId + '\'`', marker.node);
272+
known.push(id);
343273

344-
return;
345-
}
346-
347-
markers = scope.ranges[ruleId];
348-
349-
previousState = getState(ruleId, file);
350-
currentState = type === 'enable';
351-
352-
if (currentState !== previousState) {
353-
markers.push({
354-
'state': currentState,
355-
'position': marker.node.position.start
356-
});
357-
}
358-
}
359-
360-
/**
361-
* Handle a new-found marker.
362-
*
363-
* @param {Object} marker - Marker context.
364-
* @param {Object} parser - Parser instance.
365-
*/
366-
function onparse(marker, parser) {
367-
var file = parser.file;
368-
var attributes = marker.attributes.split(' ');
369-
var type = attributes[0];
370-
var ids = attributes.slice(1);
371-
var length = ids.length;
372-
var index = -1;
373-
374-
if (type !== 'disable' && type !== 'enable') {
375-
file.fail('Unknown lint keyword `' + type + '`: use either `\'enable\'` or `\'disable\'`', marker.node);
376-
377-
return;
274+
if (!(setting === null || setting === undefined)) {
275+
if (setting === false) {
276+
disable.push(id);
277+
} else {
278+
enable.push(id);
279+
}
378280
}
379281

380-
store(file);
381-
382-
while (++index < length) {
383-
toggle(file, marker, type, ids[index]);
384-
}
282+
remark.use(attachFactory(id, rules[id], setting));
385283
}
386284

387-
remark.use(zone({
388-
'name': 'lint',
389-
'onparse': onparse
390-
}));
391-
392285
/*
393-
* Filter.
286+
* Allow comments to toggle messages.
394287
*/
395288

396-
remark.use(filter);
289+
remark.use(control, {
290+
'name': 'lint',
291+
'source': SOURCE,
292+
'reset': reset,
293+
'known': known,
294+
'enable': enable,
295+
'disable': disable
296+
});
397297

398298
/**
399299
* Transformer sort messages.
400300
*
401301
* @param {Node} node - Syntax tree.
402302
* @param {VFile} file - Virtual file.
403-
* @param {Function} next - Completion handler.
404303
*/
405-
return function (node, file, next) {
304+
return function (node, file) {
406305
sort(file);
407-
next();
408306
};
409307
}
410308

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
"author": "Titus Wormer <[email protected]>",
1818
"dependencies": {
1919
"decamelize": "^1.0.0",
20-
"remark-range": "^2.0.0",
2120
"mdast-util-heading-style": "^1.0.0",
2221
"mdast-util-position": "^1.0.0",
2322
"mdast-util-to-string": "^1.0.0",
24-
"mdast-zone": "^2.0.0",
2523
"npm-prefix": "^1.1.1",
2624
"plur": "^2.0.0",
25+
"remark-message-control": "^1.0.1",
26+
"remark-range": "^2.0.0",
2727
"unist-util-visit": "^1.0.0",
2828
"vfile-sort": "^1.0.0"
2929
},

readme.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@ markdown code. Read more about the latter on [**remark**’s
114114
readme][remark-process].
115115

116116
In addition, you can also provide configuration comments to turn a rule
117-
on or off inside a file (note that you cannot change what a setting, such as
118-
`maximum-line-length`, you’re either enabling or disabling warnings).
117+
on or off inside a file. Note that you cannot change what a setting,
118+
such as `maximum-line-length`, checks for, as you’re either enabling
119+
or disabling warnings). Read more about configuration comments in
120+
[**remark-message-control**][message-control]s documentation.
119121

120122
The following file will warn twice for the duplicate headings:
121123

@@ -234,3 +236,5 @@ excluding `remark-lint-no-` or `remark-lint-`
234236
[remark-process]: https://github.com/wooorm/remark#remarkprocessvalue-options-done
235237

236238
[linter-markdown]: https://atom.io/packages/linter-markdown
239+
240+
[message-control]: https://github.com/wooorm/remark-message-control#markers

0 commit comments

Comments
 (0)