Blame view

node_modules/postcss-svgo/dist/index.js 3.45 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
107
108
  'use strict';
  
  exports.__esModule = true;
  
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
  
  var _postcss = require('postcss');
  
  var _postcss2 = _interopRequireDefault(_postcss);
  
  var _postcssValueParser = require('postcss-value-parser');
  
  var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
  
  var _svgo = require('svgo');
  
  var _svgo2 = _interopRequireDefault(_svgo);
  
  var _isSvg = require('is-svg');
  
  var _isSvg2 = _interopRequireDefault(_isSvg);
  
  var _url = require('./lib/url');
  
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  var PLUGIN = 'postcss-svgo';
  var dataURI = /data:image\/svg\+xml(;(charset=)?utf-8)?,/;
  
  function minifyPromise(svgo, decl, opts) {
      var promises = [];
  
      decl.value = (0, _postcssValueParser2.default)(decl.value).walk(function (node) {
          if (node.type !== 'function' || node.value !== 'url' || !node.nodes.length) {
              return;
          }
          var value = node.nodes[0].value;
  
          var decodedUri = void 0,
              isUriEncoded = void 0;
  
          try {
              decodedUri = (0, _url.decode)(value);
              isUriEncoded = decodedUri !== value;
          } catch (e) {
              // Swallow exception if we cannot decode the value
              isUriEncoded = false;
          }
  
          if (isUriEncoded) {
              value = decodedUri;
          }
          if (opts.encode !== undefined) {
              isUriEncoded = opts.encode;
          }
  
          var svg = value.replace(dataURI, '');
  
          if (!(0, _isSvg2.default)(svg)) {
              return;
          }
  
          promises.push(new Promise(function (resolve, reject) {
              return svgo.optimize(svg, function (result) {
                  if (result.error) {
                      return reject(PLUGIN + ': ' + result.error);
                  }
                  var data = isUriEncoded ? (0, _url.encode)(result.data) : result.data;
                  // Should always encode # otherwise we yield a broken SVG
                  // in Firefox (works in Chrome however). See this issue:
                  // https://github.com/ben-eb/cssnano/issues/245
                  data = data.replace(/#/g, '%23');
                  node.nodes[0] = _extends({}, node.nodes[0], {
                      value: 'data:image/svg+xml;charset=utf-8,' + data,
                      quote: isUriEncoded ? '"' : '\'',
                      type: 'string',
                      before: '',
                      after: ''
                  });
                  return resolve();
              });
          }));
  
          return false;
      });
  
      return Promise.all(promises).then(function () {
          return decl.value = decl.value.toString();
      });
  }
  
  exports.default = _postcss2.default.plugin(PLUGIN, function () {
      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  
      var svgo = new _svgo2.default(opts);
      return function (css) {
          return new Promise(function (resolve, reject) {
              var promises = [];
              css.walkDecls(function (decl) {
                  if (dataURI.test(decl.value)) {
                      promises.push(minifyPromise(svgo, decl, opts));
                  }
              });
              return Promise.all(promises).then(resolve, reject);
          });
      };
  });
  module.exports = exports['default'];