index.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. 'use strict';
  2. 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; };
  3. var _path = require('path');
  4. var _path2 = _interopRequireDefault(_path);
  5. var _postcss = require('postcss');
  6. var _postcss2 = _interopRequireDefault(_postcss);
  7. var _postcssValueParser = require('postcss-value-parser');
  8. var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
  9. var _normalizeUrl = require('normalize-url');
  10. var _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);
  11. var _isAbsoluteUrl = require('is-absolute-url');
  12. var _isAbsoluteUrl2 = _interopRequireDefault(_isAbsoluteUrl);
  13. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  14. var multiline = /\\[\r\n]/;
  15. var escapeChars = /([\s\(\)"'])/g;
  16. function convert(url, options) {
  17. if ((0, _isAbsoluteUrl2.default)(url) || !url.indexOf('//')) {
  18. return (0, _normalizeUrl2.default)(url, options);
  19. }
  20. return _path2.default.normalize(url).replace(new RegExp('\\' + _path2.default.sep, 'g'), '/');
  21. }
  22. function transformNamespace(rule) {
  23. rule.params = (0, _postcssValueParser2.default)(rule.params).walk(function (node) {
  24. if (node.type === 'function' && node.value === 'url' && node.nodes.length) {
  25. node.type = 'string';
  26. node.quote = node.nodes[0].quote || '"';
  27. node.value = node.nodes[0].value;
  28. }
  29. if (node.type === 'string') {
  30. node.value = node.value.trim();
  31. }
  32. return false;
  33. }).toString();
  34. }
  35. function transformDecl(decl, opts) {
  36. decl.value = (0, _postcssValueParser2.default)(decl.value).walk(function (node) {
  37. if (node.type !== 'function' || node.value !== 'url' || !node.nodes.length) {
  38. return false;
  39. }
  40. var url = node.nodes[0];
  41. var escaped = void 0;
  42. node.before = node.after = '';
  43. url.value = url.value.trim().replace(multiline, '');
  44. if (~url.value.indexOf('data:image/') || ~url.value.indexOf('data:application/') || ~url.value.indexOf('data:font/')) {
  45. return false;
  46. }
  47. if (!~url.value.indexOf('chrome-extension')) {
  48. url.value = convert(url.value, opts);
  49. }
  50. if (escapeChars.test(url.value)) {
  51. escaped = url.value.replace(escapeChars, '\\$1');
  52. if (escaped.length < url.value.length + (url.type === 'string' ? 2 : 0)) {
  53. url.value = escaped;
  54. url.type = 'word';
  55. }
  56. } else {
  57. url.type = 'word';
  58. }
  59. return false;
  60. }).toString();
  61. }
  62. module.exports = _postcss2.default.plugin('postcss-normalize-url', function (opts) {
  63. opts = _extends({
  64. normalizeProtocol: false,
  65. stripFragment: false,
  66. stripWWW: true
  67. }, opts);
  68. return function (css) {
  69. css.walk(function (node) {
  70. if (node.type === 'decl') {
  71. return transformDecl(node, opts);
  72. } else if (node.type === 'atrule' && node.name === 'namespace') {
  73. return transformNamespace(node);
  74. }
  75. });
  76. };
  77. });