You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.2 KiB
77 lines
2.2 KiB
'use strict'; |
|
const singleComment = Symbol('singleComment'); |
|
const multiComment = Symbol('multiComment'); |
|
const stripWithoutWhitespace = () => ''; |
|
const stripWithWhitespace = (string, start, end) => string.slice(start, end).replace(/\S/g, ' '); |
|
|
|
const isEscaped = (jsonString, quotePosition) => { |
|
let index = quotePosition - 1; |
|
let backslashCount = 0; |
|
|
|
while (jsonString[index] === '\\') { |
|
index -= 1; |
|
backslashCount += 1; |
|
} |
|
|
|
return Boolean(backslashCount % 2); |
|
}; |
|
|
|
module.exports = (jsonString, options = {}) => { |
|
if (typeof jsonString !== 'string') { |
|
throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``); |
|
} |
|
|
|
const strip = options.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace; |
|
|
|
let insideString = false; |
|
let insideComment = false; |
|
let offset = 0; |
|
let result = ''; |
|
|
|
for (let i = 0; i < jsonString.length; i++) { |
|
const currentCharacter = jsonString[i]; |
|
const nextCharacter = jsonString[i + 1]; |
|
|
|
if (!insideComment && currentCharacter === '"') { |
|
const escaped = isEscaped(jsonString, i); |
|
if (!escaped) { |
|
insideString = !insideString; |
|
} |
|
} |
|
|
|
if (insideString) { |
|
continue; |
|
} |
|
|
|
if (!insideComment && currentCharacter + nextCharacter === '//') { |
|
result += jsonString.slice(offset, i); |
|
offset = i; |
|
insideComment = singleComment; |
|
i++; |
|
} else if (insideComment === singleComment && currentCharacter + nextCharacter === '\r\n') { |
|
i++; |
|
insideComment = false; |
|
result += strip(jsonString, offset, i); |
|
offset = i; |
|
continue; |
|
} else if (insideComment === singleComment && currentCharacter === '\n') { |
|
insideComment = false; |
|
result += strip(jsonString, offset, i); |
|
offset = i; |
|
} else if (!insideComment && currentCharacter + nextCharacter === '/*') { |
|
result += jsonString.slice(offset, i); |
|
offset = i; |
|
insideComment = multiComment; |
|
i++; |
|
continue; |
|
} else if (insideComment === multiComment && currentCharacter + nextCharacter === '*/') { |
|
i++; |
|
insideComment = false; |
|
result += strip(jsonString, offset, i + 1); |
|
offset = i + 1; |
|
continue; |
|
} |
|
} |
|
|
|
return result + (insideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset)); |
|
};
|
|
|