remark-lint/packages/remark-lint-no-unused-definitions/index.js
2018-05-19 13:51:23 +02:00

64 lines
1.3 KiB
JavaScript

/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module no-unused-definitions
* @fileoverview
* Warn when unused definitions are found.
*
* @example {"name": "valid.md"}
*
* [foo][]
*
* [foo]: https://example.com
*
* @example {"name": "invalid.md", "label": "input"}
*
* [bar]: https://example.com
*
* @example {"name": "invalid.md", "label": "output"}
*
* 1:1-1:27: Found unused definition
*/
'use strict'
var rule = require('unified-lint-rule')
var generated = require('unist-util-generated')
var visit = require('unist-util-visit')
module.exports = rule('remark-lint:no-unused-definitions', noUnusedDefinitions)
var reason = 'Found unused definition'
function noUnusedDefinitions(tree, file) {
var map = {}
var identifier
var entry
visit(tree, ['definition', 'footnoteDefinition'], find)
visit(tree, ['imageReference', 'linkReference', 'footnoteReference'], mark)
for (identifier in map) {
entry = map[identifier]
if (!entry.used) {
file.message(reason, entry.node)
}
}
function find(node) {
if (!generated(node)) {
map[node.identifier.toUpperCase()] = {node: node, used: false}
}
}
function mark(node) {
var info = map[node.identifier.toUpperCase()]
if (!generated(node) && info) {
info.used = true
}
}
}