247 lines
6.4 KiB
JavaScript
247 lines
6.4 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: 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 _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
var _createRule = require('./utils/createRule');
|
|
|
|
var _createRule2 = _interopRequireDefault(_createRule);
|
|
|
|
var _linkRule = require('./utils/linkRule');
|
|
|
|
var _linkRule2 = _interopRequireDefault(_linkRule);
|
|
|
|
var _StyleRule = require('./rules/StyleRule');
|
|
|
|
var _StyleRule2 = _interopRequireDefault(_StyleRule);
|
|
|
|
var _escape = require('./utils/escape');
|
|
|
|
var _escape2 = _interopRequireDefault(_escape);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
/**
|
|
* Contains rules objects and allows adding/removing etc.
|
|
* Is used for e.g. by `StyleSheet` or `ConditionalRule`.
|
|
*/
|
|
var RuleList = function () {
|
|
|
|
// Original styles object.
|
|
function RuleList(options) {
|
|
var _this = this;
|
|
|
|
_classCallCheck(this, RuleList);
|
|
|
|
this.map = {};
|
|
this.raw = {};
|
|
this.index = [];
|
|
|
|
this.update = function (name, data) {
|
|
var _options = _this.options,
|
|
plugins = _options.jss.plugins,
|
|
sheet = _options.sheet;
|
|
|
|
if (typeof name === 'string') {
|
|
plugins.onUpdate(data, _this.get(name), sheet);
|
|
} else {
|
|
for (var index = 0; index < _this.index.length; index++) {
|
|
plugins.onUpdate(name, _this.index[index], sheet);
|
|
}
|
|
}
|
|
};
|
|
|
|
this.options = options;
|
|
this.classes = options.classes;
|
|
}
|
|
|
|
/**
|
|
* Create and register rule.
|
|
*
|
|
* Will not render after Style Sheet was rendered the first time.
|
|
*/
|
|
|
|
|
|
// Used to ensure correct rules order.
|
|
|
|
// Rules registry for access by .get() method.
|
|
// It contains the same rule registered by name and by selector.
|
|
|
|
|
|
_createClass(RuleList, [{
|
|
key: 'add',
|
|
value: function add(name, decl, options) {
|
|
var _options2 = this.options,
|
|
parent = _options2.parent,
|
|
sheet = _options2.sheet,
|
|
jss = _options2.jss,
|
|
Renderer = _options2.Renderer,
|
|
generateClassName = _options2.generateClassName;
|
|
|
|
|
|
options = _extends({
|
|
classes: this.classes,
|
|
parent: parent,
|
|
sheet: sheet,
|
|
jss: jss,
|
|
Renderer: Renderer,
|
|
generateClassName: generateClassName
|
|
}, options);
|
|
|
|
if (!options.selector && this.classes[name]) {
|
|
options.selector = '.' + (0, _escape2['default'])(this.classes[name]);
|
|
}
|
|
|
|
this.raw[name] = decl;
|
|
|
|
var rule = (0, _createRule2['default'])(name, decl, options);
|
|
|
|
var className = void 0;
|
|
|
|
if (!options.selector && rule instanceof _StyleRule2['default']) {
|
|
className = generateClassName(rule, sheet);
|
|
rule.selector = '.' + (0, _escape2['default'])(className);
|
|
}
|
|
|
|
this.register(rule, className);
|
|
|
|
var index = options.index === undefined ? this.index.length : options.index;
|
|
this.index.splice(index, 0, rule);
|
|
|
|
return rule;
|
|
}
|
|
|
|
/**
|
|
* Get a rule.
|
|
*/
|
|
|
|
}, {
|
|
key: 'get',
|
|
value: function get(name) {
|
|
return this.map[name];
|
|
}
|
|
|
|
/**
|
|
* Delete a rule.
|
|
*/
|
|
|
|
}, {
|
|
key: 'remove',
|
|
value: function remove(rule) {
|
|
this.unregister(rule);
|
|
this.index.splice(this.indexOf(rule), 1);
|
|
}
|
|
|
|
/**
|
|
* Get index of a rule.
|
|
*/
|
|
|
|
}, {
|
|
key: 'indexOf',
|
|
value: function indexOf(rule) {
|
|
return this.index.indexOf(rule);
|
|
}
|
|
|
|
/**
|
|
* Run `onProcessRule()` plugins on every rule.
|
|
*/
|
|
|
|
}, {
|
|
key: 'process',
|
|
value: function process() {
|
|
var plugins = this.options.jss.plugins;
|
|
// We need to clone array because if we modify the index somewhere else during a loop
|
|
// we end up with very hard-to-track-down side effects.
|
|
|
|
this.index.slice(0).forEach(plugins.onProcessRule, plugins);
|
|
}
|
|
|
|
/**
|
|
* Register a rule in `.map` and `.classes` maps.
|
|
*/
|
|
|
|
}, {
|
|
key: 'register',
|
|
value: function register(rule, className) {
|
|
this.map[rule.key] = rule;
|
|
if (rule instanceof _StyleRule2['default']) {
|
|
this.map[rule.selector] = rule;
|
|
if (className) this.classes[rule.key] = className;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unregister a rule.
|
|
*/
|
|
|
|
}, {
|
|
key: 'unregister',
|
|
value: function unregister(rule) {
|
|
delete this.map[rule.key];
|
|
if (rule instanceof _StyleRule2['default']) {
|
|
delete this.map[rule.selector];
|
|
delete this.classes[rule.key];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the function values with a new data.
|
|
*/
|
|
|
|
}, {
|
|
key: 'link',
|
|
|
|
|
|
/**
|
|
* Link renderable rules with CSSRuleList.
|
|
*/
|
|
value: function link(cssRules) {
|
|
var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index);
|
|
|
|
for (var i = 0; i < cssRules.length; i++) {
|
|
var cssRule = cssRules[i];
|
|
var _key = this.options.sheet.renderer.getKey(cssRule);
|
|
if (map[_key]) _key = map[_key];
|
|
var rule = this.map[_key];
|
|
if (rule) (0, _linkRule2['default'])(rule, cssRule);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convert rules to a CSS string.
|
|
*/
|
|
|
|
}, {
|
|
key: 'toString',
|
|
value: function toString(options) {
|
|
var str = '';
|
|
var sheet = this.options.sheet;
|
|
|
|
var link = sheet ? sheet.options.link : false;
|
|
|
|
for (var index = 0; index < this.index.length; index++) {
|
|
var rule = this.index[index];
|
|
var css = rule.toString(options);
|
|
|
|
// No need to render an empty rule.
|
|
if (!css && !link) continue;
|
|
|
|
if (str) str += '\n';
|
|
str += css;
|
|
}
|
|
|
|
return str;
|
|
}
|
|
}]);
|
|
|
|
return RuleList;
|
|
}();
|
|
|
|
exports['default'] = RuleList; |