index.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. 'use strict';
  2. var isRegExp = require('is-regexp');
  3. module.exports = function (str, opts) {
  4. str = str.toString();
  5. opts = opts || {};
  6. var preserveFilter;
  7. var comment = '';
  8. var currentChar = '';
  9. var insideString = false;
  10. var preserveImportant = !(opts.preserve === false || opts.all === true);
  11. var ret = '';
  12. if (typeof opts.preserve === 'function') {
  13. preserveImportant = false;
  14. preserveFilter = opts.preserve;
  15. } else if (isRegExp(opts.preserve)) {
  16. preserveImportant = false;
  17. preserveFilter = function (comment) {
  18. return opts.preserve.test(comment);
  19. };
  20. }
  21. for (var i = 0; i < str.length; i++) {
  22. currentChar = str[i];
  23. if (str[i - 1] !== '\\') {
  24. if (currentChar === '"' || currentChar === '\'') {
  25. if (insideString === currentChar) {
  26. insideString = false;
  27. } else if (!insideString) {
  28. insideString = currentChar;
  29. }
  30. }
  31. }
  32. // find beginning of /* type comment
  33. if (!insideString && currentChar === '/' && str[i + 1] === '*') {
  34. // ignore important comment when configured to preserve comments using important syntax: /*!
  35. if (!(preserveImportant && str[i + 2] === '!')) {
  36. var j = i + 2;
  37. // iterate over comment
  38. for (; j < str.length; j++) {
  39. // find end of comment
  40. if (str[j] === '*' && str[j + 1] === '/') {
  41. if (preserveFilter) {
  42. // evaluate comment text
  43. ret = preserveFilter(comment) ? ret + ('/*' + comment + '*/') : ret;
  44. comment = '';
  45. }
  46. break;
  47. }
  48. // store comment text to be evaluated by the filter when the end of the comment is reached
  49. if (preserveFilter) {
  50. comment += str[j];
  51. }
  52. }
  53. // resume iteration over CSS string from the end of the comment
  54. i = j + 1;
  55. continue;
  56. }
  57. }
  58. ret += currentChar;
  59. }
  60. return ret;
  61. };