@@ -24,9 +24,8 @@ var SOURCE = 'remark-lint';
2424var decamelize = require ( 'decamelize' ) ;
2525var sort = require ( 'vfile-sort' ) ;
2626var range = require ( 'remark-range' ) ;
27- var zone = require ( 'mdast-zone ' ) ;
27+ var control = require ( 'remark-message-control ' ) ;
2828var internals = require ( './rules' ) ;
29- var filter = require ( './filter' ) ;
3029var npmPrefix = require ( 'npm-prefix' ) ( ) ;
3130
3231/*
@@ -249,162 +248,61 @@ function decamelizeSettings(source) {
249248 */
250249function 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
0 commit comments