| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 'use strict';
- var isRegExp = require('is-regexp');
- module.exports = function (str, opts) {
- str = str.toString();
- opts = opts || {};
- var preserveFilter;
- var comment = '';
- var currentChar = '';
- var insideString = false;
- var preserveImportant = !(opts.preserve === false || opts.all === true);
- var ret = '';
- if (typeof opts.preserve === 'function') {
- preserveImportant = false;
- preserveFilter = opts.preserve;
- } else if (isRegExp(opts.preserve)) {
- preserveImportant = false;
- preserveFilter = function (comment) {
- return opts.preserve.test(comment);
- };
- }
- for (var i = 0; i < str.length; i++) {
- currentChar = str[i];
- if (str[i - 1] !== '\\') {
- if (currentChar === '"' || currentChar === '\'') {
- if (insideString === currentChar) {
- insideString = false;
- } else if (!insideString) {
- insideString = currentChar;
- }
- }
- }
- // find beginning of /* type comment
- if (!insideString && currentChar === '/' && str[i + 1] === '*') {
- // ignore important comment when configured to preserve comments using important syntax: /*!
- if (!(preserveImportant && str[i + 2] === '!')) {
- var j = i + 2;
- // iterate over comment
- for (; j < str.length; j++) {
- // find end of comment
- if (str[j] === '*' && str[j + 1] === '/') {
- if (preserveFilter) {
- // evaluate comment text
- ret = preserveFilter(comment) ? ret + ('/*' + comment + '*/') : ret;
- comment = '';
- }
- break;
- }
- // store comment text to be evaluated by the filter when the end of the comment is reached
- if (preserveFilter) {
- comment += str[j];
- }
- }
- // resume iteration over CSS string from the end of the comment
- i = j + 1;
- continue;
- }
- }
- ret += currentChar;
- }
- return ret;
- };
|