prefixer.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. (function() {
  2. var Browsers, Prefixer, clone, utils, vendor,
  3. __hasProp = {}.hasOwnProperty;
  4. Browsers = require('./browsers');
  5. utils = require('./utils');
  6. vendor = require('postcss/lib/vendor');
  7. clone = function(obj, parent) {
  8. var cloned, i, value;
  9. if (typeof obj !== 'object') {
  10. return obj;
  11. }
  12. cloned = new obj.constructor();
  13. for (i in obj) {
  14. if (!__hasProp.call(obj, i)) continue;
  15. value = obj[i];
  16. if (i === 'parent' && typeof value === 'object') {
  17. if (parent) {
  18. cloned[i] = parent;
  19. }
  20. } else if (i === 'source') {
  21. cloned[i] = value;
  22. } else if (value instanceof Array) {
  23. cloned[i] = value.map(function(i) {
  24. return clone(i, cloned);
  25. });
  26. } else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') {
  27. cloned[i] = clone(value, cloned);
  28. }
  29. }
  30. return cloned;
  31. };
  32. Prefixer = (function() {
  33. Prefixer.hack = function(klass) {
  34. var name, _i, _len, _ref, _results;
  35. this.hacks || (this.hacks = {});
  36. _ref = klass.names;
  37. _results = [];
  38. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  39. name = _ref[_i];
  40. _results.push(this.hacks[name] = klass);
  41. }
  42. return _results;
  43. };
  44. Prefixer.load = function(name, prefixes, all) {
  45. var klass, _ref;
  46. klass = (_ref = this.hacks) != null ? _ref[name] : void 0;
  47. if (klass) {
  48. return new klass(name, prefixes, all);
  49. } else {
  50. return new this(name, prefixes, all);
  51. }
  52. };
  53. Prefixer.clone = function(node, overrides) {
  54. var cloned, name;
  55. cloned = clone(node);
  56. for (name in overrides) {
  57. cloned[name] = overrides[name];
  58. }
  59. return cloned;
  60. };
  61. function Prefixer(_at_name, _at_prefixes, _at_all) {
  62. this.name = _at_name;
  63. this.prefixes = _at_prefixes;
  64. this.all = _at_all;
  65. }
  66. Prefixer.prototype.parentPrefix = function(node) {
  67. var prefix;
  68. 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 ? node.selector.match(/:(-\w+-)/)[1] : node.type === 'atrule' && node.name[0] === '-' ? vendor.prefix(node.name) : this.parentPrefix(node.parent);
  69. if (Browsers.prefixes().indexOf(prefix) === -1) {
  70. prefix = false;
  71. }
  72. return node._autoprefixerPrefix = prefix;
  73. };
  74. Prefixer.prototype.process = function(node) {
  75. var added, parent, prefix, prefixes, _i, _j, _len, _len1, _ref;
  76. if (!this.check(node)) {
  77. return;
  78. }
  79. parent = this.parentPrefix(node);
  80. prefixes = [];
  81. _ref = this.prefixes;
  82. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  83. prefix = _ref[_i];
  84. if (parent && parent !== utils.removeNote(prefix)) {
  85. continue;
  86. }
  87. prefixes.push(prefix);
  88. }
  89. added = [];
  90. for (_j = 0, _len1 = prefixes.length; _j < _len1; _j++) {
  91. prefix = prefixes[_j];
  92. if (this.add(node, prefix, added.concat([prefix]))) {
  93. added.push(prefix);
  94. }
  95. }
  96. return added;
  97. };
  98. Prefixer.prototype.clone = function(node, overrides) {
  99. return Prefixer.clone(node, overrides);
  100. };
  101. return Prefixer;
  102. })();
  103. module.exports = Prefixer;
  104. }).call(this);