mirror of
https://github.com/thangisme/notes.git
synced 2024-11-01 01:17:29 -04:00
118 lines
3.3 KiB
JavaScript
118 lines
3.3 KiB
JavaScript
(function() {
|
|
var Browsers, OldSelector, Prefixer, Selector, utils,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
OldSelector = require('./old-selector');
|
|
|
|
Prefixer = require('./prefixer');
|
|
|
|
Browsers = require('./browsers');
|
|
|
|
utils = require('./utils');
|
|
|
|
Selector = (function(superClass) {
|
|
extend(Selector, superClass);
|
|
|
|
function Selector(name1, prefixes, all) {
|
|
this.name = name1;
|
|
this.prefixes = prefixes;
|
|
this.all = all;
|
|
this.regexpCache = {};
|
|
}
|
|
|
|
Selector.prototype.check = function(rule) {
|
|
if (rule.selector.indexOf(this.name) !== -1) {
|
|
return !!rule.selector.match(this.regexp());
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
Selector.prototype.prefixed = function(prefix) {
|
|
return this.name.replace(/^([^\w]*)/, '$1' + prefix);
|
|
};
|
|
|
|
Selector.prototype.regexp = function(prefix) {
|
|
var name;
|
|
if (this.regexpCache[prefix]) {
|
|
return this.regexpCache[prefix];
|
|
}
|
|
name = prefix ? this.prefixed(prefix) : this.name;
|
|
return this.regexpCache[prefix] = RegExp("(^|[^:\"'=])" + (utils.escapeRegexp(name)), "gi");
|
|
};
|
|
|
|
Selector.prototype.possible = function() {
|
|
return Browsers.prefixes();
|
|
};
|
|
|
|
Selector.prototype.prefixeds = function(rule) {
|
|
var i, len, prefix, prefixeds, ref;
|
|
if (rule._autoprefixerPrefixeds) {
|
|
return rule._autoprefixerPrefixeds;
|
|
}
|
|
prefixeds = {};
|
|
ref = this.possible();
|
|
for (i = 0, len = ref.length; i < len; i++) {
|
|
prefix = ref[i];
|
|
prefixeds[prefix] = this.replace(rule.selector, prefix);
|
|
}
|
|
return rule._autoprefixerPrefixeds = prefixeds;
|
|
};
|
|
|
|
Selector.prototype.already = function(rule, prefixeds, prefix) {
|
|
var before, index, key, prefixed, some;
|
|
index = rule.parent.index(rule) - 1;
|
|
while (index >= 0) {
|
|
before = rule.parent.nodes[index];
|
|
if (before.type !== 'rule') {
|
|
return false;
|
|
}
|
|
some = false;
|
|
for (key in prefixeds) {
|
|
prefixed = prefixeds[key];
|
|
if (before.selector === prefixed) {
|
|
if (prefix === key) {
|
|
return true;
|
|
} else {
|
|
some = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!some) {
|
|
return false;
|
|
}
|
|
index -= 1;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Selector.prototype.replace = function(selector, prefix) {
|
|
return selector.replace(this.regexp(), '$1' + this.prefixed(prefix));
|
|
};
|
|
|
|
Selector.prototype.add = function(rule, prefix) {
|
|
var cloned, prefixeds;
|
|
prefixeds = this.prefixeds(rule);
|
|
if (this.already(rule, prefixeds, prefix)) {
|
|
return;
|
|
}
|
|
cloned = this.clone(rule, {
|
|
selector: prefixeds[prefix]
|
|
});
|
|
return rule.parent.insertBefore(rule, cloned);
|
|
};
|
|
|
|
Selector.prototype.old = function(prefix) {
|
|
return new OldSelector(this, prefix);
|
|
};
|
|
|
|
return Selector;
|
|
|
|
})(Prefixer);
|
|
|
|
module.exports = Selector;
|
|
|
|
}).call(this);
|