reduceBackgroundRepeat.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _postcss = require('postcss');
  4. var _postcss2 = _interopRequireDefault(_postcss);
  5. var _postcssValueParser = require('postcss-value-parser');
  6. var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
  7. var _evenValues = require('./evenValues');
  8. var _evenValues2 = _interopRequireDefault(_evenValues);
  9. var _getArguments = require('./getArguments');
  10. var _getArguments2 = _interopRequireDefault(_getArguments);
  11. var _getMatch = require('./getMatch');
  12. var _getMatch2 = _interopRequireDefault(_getMatch);
  13. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  14. var mappings = [['repeat-x', ['repeat', 'no-repeat']], ['repeat-y', ['no-repeat', 'repeat']], ['repeat', ['repeat', 'repeat']], ['space', ['space', 'space']], ['round', ['round', 'round']], ['no-repeat', ['no-repeat', 'no-repeat']]];
  15. var repeat = [mappings[0][0], mappings[1][0], mappings[2][0], mappings[3][0], mappings[4][0], mappings[5][0]];
  16. var getMatch = (0, _getMatch2.default)(mappings);
  17. function transform(decl) {
  18. var values = (0, _postcssValueParser2.default)(decl.value);
  19. if (values.nodes.length === 1) {
  20. return;
  21. }
  22. var args = (0, _getArguments2.default)(values);
  23. var relevant = [];
  24. args.forEach(function (arg) {
  25. relevant.push({
  26. start: null,
  27. end: null
  28. });
  29. arg.forEach(function (part, index) {
  30. var isRepeat = ~repeat.indexOf(part.value);
  31. var len = relevant.length - 1;
  32. if (relevant[len].start === null && isRepeat) {
  33. relevant[len].start = index;
  34. relevant[len].end = index;
  35. return;
  36. }
  37. if (relevant[len].start !== null) {
  38. if (part.type === 'space') {
  39. return;
  40. } else if (isRepeat) {
  41. relevant[len].end = index;
  42. return;
  43. }
  44. return;
  45. }
  46. });
  47. });
  48. relevant.forEach(function (range, index) {
  49. if (range.start === null) {
  50. return;
  51. }
  52. var val = args[index].slice(range.start, range.end + 1);
  53. if (val.length !== 3) {
  54. return;
  55. }
  56. var match = getMatch(val.filter(_evenValues2.default).map(function (n) {
  57. return n.value;
  58. }));
  59. if (match.length) {
  60. args[index][range.start].value = match[0][0];
  61. args[index][range.start + 1].value = '';
  62. args[index][range.end].value = '';
  63. }
  64. });
  65. decl.value = values.toString();
  66. }
  67. var plugin = _postcss2.default.plugin('cssnano-reduce-background-repeat', function () {
  68. return function (css) {
  69. return css.walkDecls(/background(-repeat|$)/, transform);
  70. };
  71. });
  72. plugin.mappings = mappings;
  73. exports.default = plugin;
  74. module.exports = exports['default'];