| 'use strict'; |
| var singleComment = 1; |
| var multiComment = 2; |
| |
| function stripWithoutWhitespace() { |
| return ''; |
| } |
| |
| function stripWithWhitespace(str, start, end) { |
| return str.slice(start, end).replace(/\S/g, ' '); |
| } |
| |
| module.exports = function (str, opts) { |
| opts = opts || {}; |
| |
| var currentChar; |
| var nextChar; |
| var insideString = false; |
| var insideComment = false; |
| var offset = 0; |
| var ret = ''; |
| var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace; |
| |
| for (var i = 0; i < str.length; i++) { |
| currentChar = str[i]; |
| nextChar = str[i + 1]; |
| |
| if (!insideComment && currentChar === '"') { |
| var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\'; |
| if (!escaped) { |
| insideString = !insideString; |
| } |
| } |
| |
| if (insideString) { |
| continue; |
| } |
| |
| if (!insideComment && currentChar + nextChar === '//') { |
| ret += str.slice(offset, i); |
| offset = i; |
| insideComment = singleComment; |
| i++; |
| } else if (insideComment === singleComment && currentChar + nextChar === '\r\n') { |
| i++; |
| insideComment = false; |
| ret += strip(str, offset, i); |
| offset = i; |
| continue; |
| } else if (insideComment === singleComment && currentChar === '\n') { |
| insideComment = false; |
| ret += strip(str, offset, i); |
| offset = i; |
| } else if (!insideComment && currentChar + nextChar === '/*') { |
| ret += str.slice(offset, i); |
| offset = i; |
| insideComment = multiComment; |
| i++; |
| continue; |
| } else if (insideComment === multiComment && currentChar + nextChar === '*/') { |
| i++; |
| insideComment = false; |
| ret += strip(str, offset, i + 1); |
| offset = i + 1; |
| continue; |
| } |
| } |
| |
| return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset)); |
| }; |