UNPKG

1.5 kBJavaScriptView Raw
1'use strict';
2
3var debug = require('debug')('analyze-css:specificity'),
4 specificity = require('specificity'),
5 stats = require('fast-stats').Stats;
6
7function rule(analyzer) {
8 var types = ['Id', 'Class', 'Tag'],
9 typesLen = types.length,
10 values = [];
11
12 // prepare metrics and stacks for values
13 types.forEach(function(type) {
14 analyzer.setMetric('specificity' + type + 'Avg');
15 analyzer.setMetric('specificity' + type + 'Total');
16
17 values.push(new stats());
18 });
19
20 analyzer.on('selector', function(rule, selector, expressions) {
21 var selectorSpecificity = specificity.calculate(selector),
22 parts;
23
24 if (!selectorSpecificity) {
25 debug('not counted for %s!', selector);
26 return;
27 }
28
29 // parse the results
30 parts = selectorSpecificity[0].specificity.
31 split(',').
32 slice(1).
33 map(function(i) {
34 return parseInt(i, 10);
35 });
36
37 debug('%s: %s', selector, parts.join(''));
38
39 // add each piece to a separate stack
40 parts.forEach(function(val, idx) {
41 values[idx].push(val);
42 });
43 });
44
45 analyzer.on('report', function() {
46 debug('Gathering stats...');
47
48 types.forEach(function(type, idx) {
49 analyzer.setMetric('specificity' + type + 'Avg', parseFloat(values[idx].amean().toFixed(2)));
50 analyzer.setMetric('specificity' + type + 'Total', values[idx].Σ());
51 });
52
53 debug('Done');
54 });
55}
56
57// @see http://www.w3.org/TR/css3-selectors/#specificity
58// @see http://css-tricks.com/specifics-on-css-specificity/
59rule.description = 'Reports rules specificity';
60module.exports = rule;