Blame view

node_modules/postcss-minify-params/dist/index.js 3.09 KB
aaac7fed   liuqimichale   add
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
  var postcss = require('postcss');
  var valueParser = require('postcss-value-parser');
  var stringify = valueParser.stringify;
  var sort = require('alphanum-sort');
  var uniqs = require('uniqs');
  
  /**
   * Return the greatest common divisor
   * of two numbers.
   */
  
  function gcd(a, b) {
      return b ? gcd(b, a % b) : a;
  }
  
  function aspectRatio(a, b) {
      var divisor = gcd(a, b);
  
      return [a / divisor, b / divisor];
  }
  
  function split(nodes, div) {
      var result = [];
      var i, max, node;
      var last = '';
  
      for (i = 0, max = nodes.length; i < max; i += 1) {
          node = nodes[i];
          if (node.type === 'div' && node.value === div) {
              result.push(last);
              last = '';
          } else {
              last += stringify(node);
          }
      }
  
      result.push(last);
  
      return result;
  }
  
  function removeNode(node) {
      node.value = '';
      node.type = 'word';
  }
  
  module.exports = postcss.plugin('postcss-minify-params', function () {
      return function (css) {
          css.walkAtRules(function (rule) {
              if (!rule.params) {
                  return;
              }
  
              var params = valueParser(rule.params);
  
              params.walk(function (node, index) {
                  if (node.type === 'div' || node.type === 'function') {
                      node.before = node.after = '';
                      if (
                          node.type === 'function' &&
                          node.nodes[4] &&
                          node.nodes[0].value.indexOf('-aspect-ratio') === 3
                      ) {
                          var ref = aspectRatio(
                              node.nodes[2].value,
                              node.nodes[4].value
                          );
                          var a = ref[0];
                          var b = ref[1];
                          node.nodes[2].value = a;
                          node.nodes[4].value = b;
                      }
                  } else if (node.type === 'space') {
                      node.value = ' ';
                  } else if (node.type === 'word') {
                      var prevWord = params.nodes[index - 2];
                      if (
                          node.value === 'all' &&
                          rule.name === 'media' &&
                          !prevWord
                      ) {
                          var nextSpace = params.nodes[index + 1];
                          var nextWord = params.nodes[index + 2];
                          var secondSpace = params.nodes[index + 3];
                          if (nextWord && nextWord.value === 'and') {
                              removeNode(nextWord);
                              removeNode(nextSpace);
                              if (secondSpace) {
                                  removeNode(secondSpace);
                              }
                          }
                          removeNode(node);
                      }
                  }
              }, true);
  
              rule.params = sort(uniqs(split(params.nodes, ',')), {
                  insensitive: true
              }).join();
  
              if (!rule.params.length) {
                  rule.raws.afterName = '';
              }
          });
      };
  });