Blame view

node_modules/svgo/plugins/cleanupNumericValues.js 2.01 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
  'use strict';
  
  exports.type = 'perItem';
  
  exports.active = true;
  
  exports.description = 'rounds numeric values to the fixed precision, removes default ‘px’ units';
  
  exports.params = {
      floatPrecision: 3,
      leadingZero: true,
      defaultPx: true,
      convertToPx: true
  };
  
  var regNumericValues = /^([\-+]?\d*\.?\d+([eE][\-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,
      removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,
      absoluteLengths = { // relative to px
          cm: 96/2.54,
          mm: 96/25.4,
          in: 96,
          pt: 4/3,
          pc: 16
      };
  
  /**
   * Round numeric values to the fixed precision,
   * remove default 'px' units.
   *
   * @param {Object} item current iteration item
   * @param {Object} params plugin params
   * @return {Boolean} if false, item will be filtered out
   *
   * @author Kir Belevich
   */
  exports.fn = function(item, params) {
  
      if (item.isElem()) {
  
          var match;
  
          item.eachAttr(function(attr) {
              match = attr.value.match(regNumericValues);
  
              // if attribute value matches regNumericValues
              if (match) {
                  // round it to the fixed precision
                  var num = +(+match[1]).toFixed(params.floatPrecision),
                      units = match[3] || '';
  
                  // convert absolute values to pixels
                  if (params.convertToPx && units && (units in absoluteLengths)) {
                      var pxNum = +(absoluteLengths[units] * match[1]).toFixed(params.floatPrecision);
  
                      if (String(pxNum).length < match[0].length)
                          num = pxNum,
                          units = 'px';
                  }
  
                  // and remove leading zero
                  if (params.leadingZero) {
                      num = removeLeadingZero(num);
                  }
  
                  // remove default 'px' units
                  if (params.defaultPx && units === 'px') {
                      units = '';
                  }
  
                  attr.value = num + units;
              }
          });
  
      }
  
  };