Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

111 строки
3.4 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. 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; };
  6. exports.default = jssNested;
  7. var _warning = require('warning');
  8. var _warning2 = _interopRequireDefault(_warning);
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. var separatorRegExp = /\s*,\s*/g;
  11. var parentRegExp = /&/g;
  12. var refRegExp = /\$([\w-]+)/g;
  13. /**
  14. * Convert nested rules to separate, remove them from original styles.
  15. *
  16. * @param {Rule} rule
  17. * @api public
  18. */
  19. function jssNested() {
  20. // Get a function to be used for $ref replacement.
  21. function getReplaceRef(container) {
  22. return function (match, key) {
  23. var rule = container.getRule(key);
  24. if (rule) return rule.selector;
  25. (0, _warning2.default)(false, '[JSS] Could not find the referenced rule %s in %s.', key, container.options.meta || container);
  26. return key;
  27. };
  28. }
  29. var hasAnd = function hasAnd(str) {
  30. return str.indexOf('&') !== -1;
  31. };
  32. function replaceParentRefs(nestedProp, parentProp) {
  33. var parentSelectors = parentProp.split(separatorRegExp);
  34. var nestedSelectors = nestedProp.split(separatorRegExp);
  35. var result = '';
  36. for (var i = 0; i < parentSelectors.length; i++) {
  37. var parent = parentSelectors[i];
  38. for (var j = 0; j < nestedSelectors.length; j++) {
  39. var nested = nestedSelectors[j];
  40. if (result) result += ', ';
  41. // Replace all & by the parent or prefix & with the parent.
  42. result += hasAnd(nested) ? nested.replace(parentRegExp, parent) : parent + ' ' + nested;
  43. }
  44. }
  45. return result;
  46. }
  47. function getOptions(rule, container, options) {
  48. // Options has been already created, now we only increase index.
  49. if (options) return _extends({}, options, { index: options.index + 1 });
  50. var nestingLevel = rule.options.nestingLevel;
  51. nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;
  52. return _extends({}, rule.options, {
  53. nestingLevel: nestingLevel,
  54. index: container.indexOf(rule) + 1
  55. });
  56. }
  57. function onProcessStyle(style, rule) {
  58. if (rule.type !== 'style') return style;
  59. var container = rule.options.parent;
  60. var options = void 0;
  61. var replaceRef = void 0;
  62. for (var prop in style) {
  63. var isNested = hasAnd(prop);
  64. var isNestedConditional = prop[0] === '@';
  65. if (!isNested && !isNestedConditional) continue;
  66. options = getOptions(rule, container, options);
  67. if (isNested) {
  68. var selector = replaceParentRefs(prop, rule.selector
  69. // Lazily create the ref replacer function just once for
  70. // all nested rules within the sheet.
  71. );if (!replaceRef) replaceRef = getReplaceRef(container
  72. // Replace all $refs.
  73. );selector = selector.replace(refRegExp, replaceRef);
  74. container.addRule(selector, style[prop], _extends({}, options, { selector: selector }));
  75. } else if (isNestedConditional) {
  76. container
  77. // Place conditional right after the parent rule to ensure right ordering.
  78. .addRule(prop, null, options).addRule(rule.key, style[prop], { selector: rule.selector });
  79. }
  80. delete style[prop];
  81. }
  82. return style;
  83. }
  84. return { onProcessStyle: onProcessStyle };
  85. }