70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
const regexAnySingleEscape = /[ -,\.\/:-@\[-\^`\{-~]/;
|
|
const regexSingleEscape = /[ -,\.\/:-@\[\]\^`\{-~]/;
|
|
const regexExcessiveSpaces = /(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g;
|
|
const DEFAULT_OPTIONS = {
|
|
escapeEverything: false,
|
|
isIdentifier: false,
|
|
quotes: "single",
|
|
wrap: false
|
|
};
|
|
function cssesc(string, options = {}) {
|
|
options = { ...DEFAULT_OPTIONS, ...options };
|
|
const quote = options.quotes === "double" ? '"' : "'";
|
|
const { isIdentifier } = options;
|
|
const firstChar = string.charAt(0);
|
|
let output = "";
|
|
let counter = 0;
|
|
const length = string.length;
|
|
while (counter < length) {
|
|
const character = string.charAt(counter++);
|
|
let codePoint = character.charCodeAt(0);
|
|
let value;
|
|
if (codePoint < 32 || codePoint > 126) {
|
|
if (codePoint >= 55296 && codePoint <= 56319 && counter < length) {
|
|
const extra = string.charCodeAt(counter++);
|
|
if ((extra & 64512) === 56320) {
|
|
codePoint = ((codePoint & 1023) << 10) + (extra & 1023) + 65536;
|
|
} else {
|
|
counter--;
|
|
}
|
|
}
|
|
value = "\\" + codePoint.toString(16).toUpperCase() + " ";
|
|
} else {
|
|
if (options.escapeEverything) {
|
|
if (regexAnySingleEscape.test(character)) {
|
|
value = "\\" + character;
|
|
} else {
|
|
value = "\\" + codePoint.toString(16).toUpperCase() + " ";
|
|
}
|
|
} else if (/[\t\n\f\r\x0B]/.test(character)) {
|
|
value = "\\" + codePoint.toString(16).toUpperCase() + " ";
|
|
} else if (character === "\\" || !isIdentifier && (character === '"' && quote === character || character === "'" && quote === character) || isIdentifier && regexSingleEscape.test(character)) {
|
|
value = "\\" + character;
|
|
} else {
|
|
value = character;
|
|
}
|
|
}
|
|
output += value;
|
|
}
|
|
if (isIdentifier) {
|
|
if (/^-[-\d]/.test(output)) {
|
|
output = "\\-" + output.slice(1);
|
|
} else if (/\d/.test(firstChar)) {
|
|
output = "\\3" + firstChar + " " + output.slice(1);
|
|
}
|
|
}
|
|
output = output.replace(regexExcessiveSpaces, function($0, $1, $2) {
|
|
if ($1 && $1.length % 2) {
|
|
return $0;
|
|
}
|
|
return ($1 || "") + $2;
|
|
});
|
|
if (!isIdentifier && options.wrap) {
|
|
return quote + output + quote;
|
|
}
|
|
return output;
|
|
}
|
|
export {
|
|
cssesc as default
|
|
};
|