58 lines
1.7 KiB
JavaScript
58 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
var addonCssom = require('./cssom').addon;
|
|
|
|
exports.addon = function (renderer) {
|
|
if (!renderer.putRule) {
|
|
addonCssom(renderer);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
require('./__dev__/warnOnMissingDependencies')('pipe', renderer, ['createRule']);
|
|
}
|
|
|
|
var counter = 0;
|
|
|
|
renderer.pipe = function () {
|
|
var rules = {};
|
|
var className = renderer.pfx + 'pipe-' + (counter++).toString(36);
|
|
var attr = 'data-' + className;
|
|
var scope1 = '.' + className;
|
|
var scope2 = '[' + attr + ']';
|
|
|
|
var obj = {
|
|
attr: attr,
|
|
className: className,
|
|
css: function (css) {
|
|
for (var selectorTemplate in css) {
|
|
var declarations = css[selectorTemplate];
|
|
var rule = rules[selectorTemplate];
|
|
|
|
if (!rule) {
|
|
var selector = selectorTemplate.replace('&', scope1) + ',' + selectorTemplate.replace('&', scope2);
|
|
|
|
rules[selectorTemplate] = rule = renderer.putRule(selector);
|
|
}
|
|
|
|
for (var prop in declarations)
|
|
rule.style.setProperty(prop, declarations[prop]);
|
|
}
|
|
|
|
// GC
|
|
for (var selectorTemplate2 in rules) {
|
|
if (!(selectorTemplate2 in css)) {
|
|
rules[selectorTemplate2].remove();
|
|
delete rules[selectorTemplate2];
|
|
}
|
|
}
|
|
},
|
|
remove: function () {
|
|
for (var selectorTemplate in rules)
|
|
renderer.sh.deleteRule(rule.index);
|
|
}
|
|
};
|
|
|
|
return obj;
|
|
};
|
|
};
|