123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- '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'];
|