clean-up.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. function removeWhitespace(match, value) {
  2. return '[' + value.replace(/ /g, '') + ']';
  3. }
  4. function selectorSorter(s1, s2) {
  5. return s1[0] > s2[0] ? 1 : -1;
  6. }
  7. function whitespaceReplacements(_, p1, p2, p3) {
  8. if (p1 && p2 && p3.length)
  9. return p1 + p2 + ' ';
  10. else if (p1 && p2)
  11. return p1 + p2;
  12. else
  13. return p2;
  14. }
  15. var CleanUp = {
  16. selectors: function (selectors, removeUnsupported, adjacentSpace) {
  17. var list = [];
  18. var repeated = [];
  19. for (var i = 0, l = selectors.length; i < l; i++) {
  20. var selector = selectors[i];
  21. var reduced = selector[0]
  22. .replace(/\s+/g, ' ')
  23. .replace(/ ?, ?/g, ',')
  24. .replace(/\s*(\\)?([>+~])(\s*)/g, whitespaceReplacements)
  25. .trim();
  26. if (adjacentSpace && reduced.indexOf('nav') > 0)
  27. reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1');
  28. if (removeUnsupported && (reduced.indexOf('*+html ') != -1 || reduced.indexOf('*:first-child+html ') != -1))
  29. continue;
  30. if (reduced.indexOf('*') > -1) {
  31. reduced = reduced
  32. .replace(/\*([:#\.\[])/g, '$1')
  33. .replace(/^(\:first\-child)?\+html/, '*$1+html');
  34. }
  35. if (reduced.indexOf('[') > -1)
  36. reduced = reduced.replace(/\[([^\]]+)\]/g, removeWhitespace);
  37. if (repeated.indexOf(reduced) == -1) {
  38. selector[0] = reduced;
  39. repeated.push(reduced);
  40. list.push(selector);
  41. }
  42. }
  43. return list.sort(selectorSorter);
  44. },
  45. selectorDuplicates: function (selectors) {
  46. var list = [];
  47. var repeated = [];
  48. for (var i = 0, l = selectors.length; i < l; i++) {
  49. var selector = selectors[i];
  50. if (repeated.indexOf(selector[0]) == -1) {
  51. repeated.push(selector[0]);
  52. list.push(selector);
  53. }
  54. }
  55. return list.sort(selectorSorter);
  56. },
  57. block: function (values, spaceAfterClosingBrace) {
  58. values[0] = values[0]
  59. .replace(/\s+/g, ' ')
  60. .replace(/(,|:|\() /g, '$1')
  61. .replace(/ \)/g, ')');
  62. if (!spaceAfterClosingBrace)
  63. values[0] = values[0].replace(/\) /g, ')');
  64. },
  65. atRule: function (values) {
  66. values[0] = values[0]
  67. .replace(/\s+/g, ' ')
  68. .trim();
  69. }
  70. };
  71. module.exports = CleanUp;