cssPriority.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. var selector = require('./selector');
  2. var each = require('./each');
  3. var startWith = require('./startWith');
  4. var contain = require('./contain');
  5. var cmpVersion = require('./cmpVersion');
  6. exports = function(sel) {
  7. var _ref =
  8. arguments.length > 1 && arguments[1] !== undefined
  9. ? arguments[1]
  10. : {},
  11. _ref$important = _ref.important,
  12. important = _ref$important === void 0 ? false : _ref$important,
  13. _ref$inlineStyle = _ref.inlineStyle,
  14. inlineStyle = _ref$inlineStyle === void 0 ? false : _ref$inlineStyle,
  15. _ref$position = _ref.position,
  16. position = _ref$position === void 0 ? 0 : _ref$position;
  17. var ret = [0, 0, 0, 0, 0, position];
  18. if (important) ret[0] = 1;
  19. if (inlineStyle) ret[1] = 1;
  20. var group = selector.parse(sel)[0];
  21. each(group, function(_ref2) {
  22. var type = _ref2.type,
  23. value = _ref2.value;
  24. switch (type) {
  25. case 'id':
  26. ret[2]++;
  27. break;
  28. case 'class':
  29. case 'attribute':
  30. ret[3]++;
  31. break;
  32. case 'pseudo':
  33. if (contain(PSEUDO_ELEMS, value.replace(/:/g, ''))) {
  34. ret[4]++;
  35. } else if (!startWith(value, '::')) {
  36. ret[3]++;
  37. }
  38. break;
  39. case 'tag':
  40. if (value !== '*') {
  41. ret[4]++;
  42. }
  43. break;
  44. }
  45. });
  46. return ret;
  47. };
  48. var PSEUDO_ELEMS = [
  49. 'first-letter',
  50. 'last-letter',
  51. 'first-line',
  52. 'last-line',
  53. 'first-child',
  54. 'last-child',
  55. 'before',
  56. 'after'
  57. ];
  58. exports.compare = function(p1, p2) {
  59. return cmpVersion(p1.join('.'), p2.join('.'));
  60. };
  61. module.exports = exports;