-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
114 lines (100 loc) · 3.02 KB
/
index.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
/**
* @author Duncan Beaton
* @copyright 2016 Duncan Beaton
* @license MIT
* @module retext:overuse
* @fileoverview Word overuse with Retext.
*/
'use strict';
/*
* Dependencies.
*/
var keys = require('object-keys');
var difference = require('array-differ');
var search = require('nlcst-search');
var nlcstToString = require('nlcst-to-string');
var quotation = require('quotation');
var stopwords = require('stopwords').english;
var thesaurus = require('thesaurus/lib/th_en_US_new');
/*
* Methods.
*/
/**
* Get any duplicated Words in `node`.
*
* @param {Node} node - Parent to search in.
* @param {Array.<string>} phrases - Phrases to search for.
* @return {Object}
*/
function getDuplicates(node, phrases) {
var duplicates = {};
search(node, phrases, function (match, position, parent, phrase) {
duplicates[phrase] = duplicates[phrase] ? duplicates[phrase] + 1 : 1
});
return duplicates;
}
/**
* Get duplicates that are used too frequently.
*
* @param {Object} duplicates - Phrases to search for.
* @param {number} limit - Number of times phrase must have been used.
* @return {Array.<string>}
*/
function getOveruse(duplicates, limit) {
var duplicate;
for (duplicate in duplicates) {
if (duplicates[duplicate] < limit) {
delete duplicates[duplicate]
}
}
return keys(duplicates);
}
/**
* Attach.
*
* @param {Retext} retext - Instance.
* @param {Object?} [options] - Configuration.
* @param {Object.<Object>?} [options.list] - Phrases with suggestions
* @param {Object.<Array>?} [options.ignore] - Phrases in the list
* to ignore.
* @param {Object.<number>?} [options.limit] - Number of times phrase
* must have been used.
* @return {Function} - `transformer`.
*/
function attacher(retext, options) {
var settings = options || {};
var ignore = settings.ignore || stopwords;
var patterns = settings.list || thesaurus;
var limit = settings.limit || 3;
var list = keys(patterns);
var phrases = difference(list, ignore);
/**
* Search `tree` for overuse.
*
* @param {Node} tree - NLCST node.
* @param {VFile} file - Virtual file.
*/
function transformer(tree, file) {
var duplicates = getDuplicates(tree, phrases)
var overuse = getOveruse(duplicates, limit)
search(tree, overuse, function (match, position, parent, phrase) {
var suggestions = patterns[phrase];
var value = quotation(nlcstToString(match), '“', '”');
var reason = 'Replace ' + value + ' with ' +
quotation(suggestions, '“', '”').join(', ');
var message = file.warn(reason, {
'start': match[0].position.start,
'end': match[match.length - 1].position.end
});
message.ruleId = phrase;
message.source = 'retext-overuse';
message.actual = value.slice(1, -1);
message.expected = suggestions;
});
}
return transformer;
}
/*
* Expose.
*/
module.exports = attacher;