processor.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. (function() {
  2. var Processor, Value, utils, vendor;
  3. vendor = require('postcss/lib/vendor');
  4. Value = require('./value');
  5. utils = require('./utils');
  6. Processor = (function() {
  7. function Processor(_at_prefixes) {
  8. this.prefixes = _at_prefixes;
  9. }
  10. Processor.prototype.add = function(css) {
  11. var keyframes, resolution, supports, viewport;
  12. resolution = this.prefixes.add['@resolution'];
  13. keyframes = this.prefixes.add['@keyframes'];
  14. viewport = this.prefixes.add['@viewport'];
  15. supports = this.prefixes.add['@supports'];
  16. css.eachAtRule((function(_this) {
  17. return function(rule) {
  18. if (rule.name === 'keyframes') {
  19. if (!_this.disabled(rule)) {
  20. return keyframes != null ? keyframes.process(rule) : void 0;
  21. }
  22. } else if (rule.name === 'viewport') {
  23. if (!_this.disabled(rule)) {
  24. return viewport != null ? viewport.process(rule) : void 0;
  25. }
  26. } else if (rule.name === 'supports') {
  27. if (!_this.disabled(rule)) {
  28. return supports.process(rule);
  29. }
  30. } else if (rule.name === 'media' && rule.params.indexOf('-resolution') !== -1) {
  31. if (!_this.disabled(rule)) {
  32. return resolution != null ? resolution.process(rule) : void 0;
  33. }
  34. }
  35. };
  36. })(this));
  37. css.eachRule((function(_this) {
  38. return function(rule) {
  39. var selector, _i, _len, _ref, _results;
  40. if (_this.disabled(rule)) {
  41. return;
  42. }
  43. _ref = _this.prefixes.add.selectors;
  44. _results = [];
  45. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  46. selector = _ref[_i];
  47. _results.push(selector.process(rule));
  48. }
  49. return _results;
  50. };
  51. })(this));
  52. css.eachDecl((function(_this) {
  53. return function(decl) {
  54. var prefix;
  55. prefix = _this.prefixes.add[decl.prop];
  56. if (prefix && prefix.prefixes) {
  57. if (!_this.disabled(decl)) {
  58. return prefix.process(decl);
  59. }
  60. }
  61. };
  62. })(this));
  63. return css.eachDecl((function(_this) {
  64. return function(decl) {
  65. var unprefixed, value, _i, _len, _ref;
  66. if (_this.disabled(decl)) {
  67. return;
  68. }
  69. unprefixed = _this.prefixes.unprefixed(decl.prop);
  70. _ref = _this.prefixes.values('add', unprefixed);
  71. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  72. value = _ref[_i];
  73. value.process(decl);
  74. }
  75. return Value.save(_this.prefixes, decl);
  76. };
  77. })(this));
  78. };
  79. Processor.prototype.remove = function(css) {
  80. var checker, resolution, _i, _len, _ref;
  81. resolution = this.prefixes.remove['@resolution'];
  82. css.eachAtRule((function(_this) {
  83. return function(rule, i) {
  84. if (_this.prefixes.remove['@' + rule.name]) {
  85. if (!_this.disabled(rule)) {
  86. return rule.parent.remove(i);
  87. }
  88. } else if (rule.name === 'media' && rule.params.indexOf('-resolution') !== -1) {
  89. return resolution != null ? resolution.clean(rule) : void 0;
  90. }
  91. };
  92. })(this));
  93. _ref = this.prefixes.remove.selectors;
  94. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  95. checker = _ref[_i];
  96. css.eachRule((function(_this) {
  97. return function(rule, i) {
  98. if (checker.check(rule)) {
  99. if (!_this.disabled(rule)) {
  100. return rule.parent.remove(i);
  101. }
  102. }
  103. };
  104. })(this));
  105. }
  106. return css.eachDecl((function(_this) {
  107. return function(decl, i) {
  108. var notHack, rule, unprefixed, _j, _len1, _ref1, _ref2;
  109. if (_this.disabled(decl)) {
  110. return;
  111. }
  112. rule = decl.parent;
  113. unprefixed = _this.prefixes.unprefixed(decl.prop);
  114. if ((_ref1 = _this.prefixes.remove[decl.prop]) != null ? _ref1.remove : void 0) {
  115. notHack = _this.prefixes.group(decl).down(function(other) {
  116. return other.prop === unprefixed;
  117. });
  118. if (notHack && !_this.withHackValue(decl)) {
  119. if (decl.style('before').indexOf("\n") > -1) {
  120. _this.reduceSpaces(decl);
  121. }
  122. rule.remove(i);
  123. return;
  124. }
  125. }
  126. _ref2 = _this.prefixes.values('remove', unprefixed);
  127. for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
  128. checker = _ref2[_j];
  129. if (checker.check(decl.value)) {
  130. unprefixed = checker.unprefixed;
  131. notHack = _this.prefixes.group(decl).down(function(other) {
  132. return other.value.indexOf(unprefixed) !== -1;
  133. });
  134. if (notHack) {
  135. rule.remove(i);
  136. return;
  137. } else if (checker.clean) {
  138. checker.clean(decl);
  139. return;
  140. }
  141. }
  142. }
  143. };
  144. })(this));
  145. };
  146. Processor.prototype.withHackValue = function(decl) {
  147. return decl.prop === '-webkit-background-clip' && decl.value === 'text';
  148. };
  149. Processor.prototype.disabled = function(node) {
  150. var status;
  151. if (node._autoprefixerDisabled != null) {
  152. return node._autoprefixerDisabled;
  153. } else if (node.nodes) {
  154. status = void 0;
  155. node.each(function(i) {
  156. if (i.type !== 'comment') {
  157. return;
  158. }
  159. if (i.text === 'autoprefixer: off') {
  160. status = false;
  161. return false;
  162. } else if (i.text === 'autoprefixer: on') {
  163. status = true;
  164. return false;
  165. }
  166. });
  167. return node._autoprefixerDisabled = status != null ? !status : node.parent ? this.disabled(node.parent) : false;
  168. } else {
  169. return node._autoprefixerDisabled = this.disabled(node.parent);
  170. }
  171. };
  172. Processor.prototype.reduceSpaces = function(decl) {
  173. var diff, parts, prevMin, stop;
  174. stop = false;
  175. this.prefixes.group(decl).up(function(other) {
  176. return stop = true;
  177. });
  178. if (stop) {
  179. return;
  180. }
  181. parts = decl.style('before').split("\n");
  182. prevMin = parts[parts.length - 1].length;
  183. diff = false;
  184. return this.prefixes.group(decl).down(function(other) {
  185. var last;
  186. parts = other.style('before').split("\n");
  187. last = parts.length - 1;
  188. if (parts[last].length > prevMin) {
  189. if (diff === false) {
  190. diff = parts[last].length - prevMin;
  191. }
  192. parts[last] = parts[last].slice(0, -diff);
  193. return other.before = parts.join("\n");
  194. }
  195. });
  196. };
  197. return Processor;
  198. })();
  199. module.exports = Processor;
  200. }).call(this);