1 | 'use strict';
|
2 |
|
3 | var _ = require('lodash');
|
4 | var css = require('css');
|
5 |
|
6 | function toRegExp (text) {
|
7 | return new RegExp('^' + text + '$');
|
8 | }
|
9 |
|
10 | function api (stylesheet, options) {
|
11 | var sheet = css.parse(stylesheet);
|
12 | var sheetRules = sheet.stylesheet.rules;
|
13 | var props = options.properties.map(toRegExp);
|
14 |
|
15 | _.forEach(sheetRules, inspectRuleset);
|
16 |
|
17 | return result();
|
18 |
|
19 | function inspectRuleset (inspected, parent) {
|
20 | var forEachVictim = typeof parent === 'number';
|
21 | if (forEachVictim) {
|
22 | parent = false;
|
23 | }
|
24 | if (inspected.type === 'rule') {
|
25 | if (parent) {
|
26 | _(sheetRules)
|
27 | .where({ type: 'media', media: parent.media })
|
28 | .pluck('rules')
|
29 | .value()
|
30 | .forEach(inspectRules);
|
31 | } else {
|
32 | inspectRules(sheetRules);
|
33 | }
|
34 | } else if (inspected.type === 'media') {
|
35 | inspected.rules.forEach(inspectRulesetInMedia);
|
36 | }
|
37 |
|
38 | function inspectRulesetInMedia (rule) {
|
39 | inspectRuleset(rule, inspected);
|
40 | }
|
41 |
|
42 | function inspectRules (rules) {
|
43 | _.forEach(rules, inspectDeclarations);
|
44 | }
|
45 |
|
46 | function inspectDeclarations (rule) {
|
47 | if (rule.declarations) {
|
48 | rule.declarations = rule.declarations.filter(keepPropertyDeclaration);
|
49 | }
|
50 | }
|
51 |
|
52 | function keepPropertyDeclaration (declaration) {
|
53 | return props.every(notMatching);
|
54 | function notMatching (prop) {
|
55 | return prop.test(declaration.property) === false;
|
56 | }
|
57 | }
|
58 | }
|
59 |
|
60 | function result () {
|
61 | return css
|
62 | .stringify(sheet)
|
63 | .replace(/^\n*/, '')
|
64 | .replace(/\n*$/, '\n');
|
65 | }
|
66 | }
|
67 |
|
68 | module.exports = api;
|