122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
(function() {
|
|
var Browsers, Prefixer, clone, utils, vendor,
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
Browsers = require('./browsers');
|
|
|
|
utils = require('./utils');
|
|
|
|
vendor = require('postcss/lib/vendor');
|
|
|
|
clone = function(obj, parent) {
|
|
var cloned, i, value;
|
|
cloned = new obj.constructor();
|
|
for (i in obj) {
|
|
if (!hasProp.call(obj, i)) continue;
|
|
value = obj[i];
|
|
if (i === 'parent' && typeof value === 'object') {
|
|
if (parent) {
|
|
cloned[i] = parent;
|
|
}
|
|
} else if (i === 'source') {
|
|
cloned[i] = value;
|
|
} else if (i === null) {
|
|
cloned[i] = value;
|
|
} else if (value instanceof Array) {
|
|
cloned[i] = value.map(function(i) {
|
|
return clone(i, cloned);
|
|
});
|
|
} else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') {
|
|
if (typeof value === 'object' && value !== null) {
|
|
value = clone(value, cloned);
|
|
}
|
|
cloned[i] = value;
|
|
}
|
|
}
|
|
return cloned;
|
|
};
|
|
|
|
Prefixer = (function() {
|
|
Prefixer.hack = function(klass) {
|
|
var j, len, name, ref, results;
|
|
this.hacks || (this.hacks = {});
|
|
ref = klass.names;
|
|
results = [];
|
|
for (j = 0, len = ref.length; j < len; j++) {
|
|
name = ref[j];
|
|
results.push(this.hacks[name] = klass);
|
|
}
|
|
return results;
|
|
};
|
|
|
|
Prefixer.load = function(name, prefixes, all) {
|
|
var klass, ref;
|
|
klass = (ref = this.hacks) != null ? ref[name] : void 0;
|
|
if (klass) {
|
|
return new klass(name, prefixes, all);
|
|
} else {
|
|
return new this(name, prefixes, all);
|
|
}
|
|
};
|
|
|
|
Prefixer.clone = function(node, overrides) {
|
|
var cloned, name;
|
|
cloned = clone(node);
|
|
for (name in overrides) {
|
|
cloned[name] = overrides[name];
|
|
}
|
|
return cloned;
|
|
};
|
|
|
|
function Prefixer(name1, prefixes1, all1) {
|
|
this.name = name1;
|
|
this.prefixes = prefixes1;
|
|
this.all = all1;
|
|
}
|
|
|
|
Prefixer.prototype.parentPrefix = function(node) {
|
|
var prefix;
|
|
prefix = node._autoprefixerPrefix != null ? node._autoprefixerPrefix : node.type === 'decl' && node.prop[0] === '-' ? vendor.prefix(node.prop) : node.type === 'root' ? false : node.type === 'rule' && node.selector.indexOf(':-') !== -1 && /:(-\w+-)/.test(node.selector) ? node.selector.match(/:(-\w+-)/)[1] : node.type === 'atrule' && node.name[0] === '-' ? vendor.prefix(node.name) : this.parentPrefix(node.parent);
|
|
if (Browsers.prefixes().indexOf(prefix) === -1) {
|
|
prefix = false;
|
|
}
|
|
return node._autoprefixerPrefix = prefix;
|
|
};
|
|
|
|
Prefixer.prototype.process = function(node) {
|
|
var added, j, k, len, len1, parent, prefix, prefixes, ref;
|
|
if (!this.check(node)) {
|
|
return;
|
|
}
|
|
parent = this.parentPrefix(node);
|
|
prefixes = [];
|
|
ref = this.prefixes;
|
|
for (j = 0, len = ref.length; j < len; j++) {
|
|
prefix = ref[j];
|
|
if (parent && parent !== utils.removeNote(prefix)) {
|
|
continue;
|
|
}
|
|
prefixes.push(prefix);
|
|
}
|
|
added = [];
|
|
for (k = 0, len1 = prefixes.length; k < len1; k++) {
|
|
prefix = prefixes[k];
|
|
if (this.add(node, prefix, added.concat([prefix]))) {
|
|
added.push(prefix);
|
|
}
|
|
}
|
|
return added;
|
|
};
|
|
|
|
Prefixer.prototype.clone = function(node, overrides) {
|
|
return Prefixer.clone(node, overrides);
|
|
};
|
|
|
|
return Prefixer;
|
|
|
|
})();
|
|
|
|
module.exports = Prefixer;
|
|
|
|
}).call(this);
|