3 const _ = require("lodash");
4 const declarationValueIndex = require("../../utils/declarationValueIndex");
5 const findFontFamily = require("../../utils/findFontFamily");
6 const keywordSets = require("../../reference/keywordSets");
7 const optionsMatches = require("../../utils/optionsMatches");
8 const report = require("../../utils/report");
9 const ruleMessages = require("../../utils/ruleMessages");
10 const validateOptions = require("../../utils/validateOptions");
12 const ruleName = "font-family-no-duplicate-names";
14 const messages = ruleMessages(ruleName, {
15 rejected: name => `Unexpected duplicate name ${name}`
18 const isFamilyNameKeyword = node =>
19 !node.quote && keywordSets.fontFamilyKeywords.has(node.value.toLowerCase());
21 const rule = function(actual, options) {
22 return (root, result) => {
23 const validOptions = validateOptions(
30 ignoreFontFamilyNames: [_.isString]
39 root.walkDecls(/^font(-family)?$/i, decl => {
40 const keywords = new Set();
41 const familyNames = new Set();
43 const fontFamilies = findFontFamily(decl.value);
45 if (fontFamilies.length === 0) {
49 fontFamilies.forEach(fontFamilyNode => {
50 const family = fontFamilyNode.value.trim();
55 "ignoreFontFamilyNames",
56 fontFamilyNode.value.trim()
62 if (isFamilyNameKeyword(fontFamilyNode)) {
63 if (keywords.has(family.toLowerCase())) {
65 messages.rejected(family),
66 declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
76 if (familyNames.has(family)) {
78 messages.rejected(family),
79 declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
85 familyNames.add(family);
89 function complain(message, index, decl) {
101 rule.ruleName = ruleName;
102 rule.messages = messages;
103 module.exports = rule;