123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- (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);
|