Spaces:
Configuration error
Configuration error
; | |
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | |
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { | |
if (ar || !(i in from)) { | |
if (!ar) ar = Array.prototype.slice.call(from, 0, i); | |
ar[i] = from[i]; | |
} | |
} | |
return to.concat(ar || Array.prototype.slice.call(from)); | |
}; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.stringify = void 0; | |
var types_1 = require("./types"); | |
var attribValChars = ["\\", '"']; | |
var pseudoValChars = __spreadArray(__spreadArray([], attribValChars, true), ["(", ")"], false); | |
var charsToEscapeInAttributeValue = new Set(attribValChars.map(function (c) { return c.charCodeAt(0); })); | |
var charsToEscapeInPseudoValue = new Set(pseudoValChars.map(function (c) { return c.charCodeAt(0); })); | |
var charsToEscapeInName = new Set(__spreadArray(__spreadArray([], pseudoValChars, true), [ | |
"~", | |
"^", | |
"$", | |
"*", | |
"+", | |
"!", | |
"|", | |
":", | |
"[", | |
"]", | |
" ", | |
".", | |
], false).map(function (c) { return c.charCodeAt(0); })); | |
/** | |
* Turns `selector` back into a string. | |
* | |
* @param selector Selector to stringify. | |
*/ | |
function stringify(selector) { | |
return selector | |
.map(function (token) { return token.map(stringifyToken).join(""); }) | |
.join(", "); | |
} | |
exports.stringify = stringify; | |
function stringifyToken(token, index, arr) { | |
switch (token.type) { | |
// Simple types | |
case types_1.SelectorType.Child: | |
return index === 0 ? "> " : " > "; | |
case types_1.SelectorType.Parent: | |
return index === 0 ? "< " : " < "; | |
case types_1.SelectorType.Sibling: | |
return index === 0 ? "~ " : " ~ "; | |
case types_1.SelectorType.Adjacent: | |
return index === 0 ? "+ " : " + "; | |
case types_1.SelectorType.Descendant: | |
return " "; | |
case types_1.SelectorType.ColumnCombinator: | |
return index === 0 ? "|| " : " || "; | |
case types_1.SelectorType.Universal: | |
// Return an empty string if the selector isn't needed. | |
return token.namespace === "*" && | |
index + 1 < arr.length && | |
"name" in arr[index + 1] | |
? "" | |
: "".concat(getNamespace(token.namespace), "*"); | |
case types_1.SelectorType.Tag: | |
return getNamespacedName(token); | |
case types_1.SelectorType.PseudoElement: | |
return "::".concat(escapeName(token.name, charsToEscapeInName)).concat(token.data === null | |
? "" | |
: "(".concat(escapeName(token.data, charsToEscapeInPseudoValue), ")")); | |
case types_1.SelectorType.Pseudo: | |
return ":".concat(escapeName(token.name, charsToEscapeInName)).concat(token.data === null | |
? "" | |
: "(".concat(typeof token.data === "string" | |
? escapeName(token.data, charsToEscapeInPseudoValue) | |
: stringify(token.data), ")")); | |
case types_1.SelectorType.Attribute: { | |
if (token.name === "id" && | |
token.action === types_1.AttributeAction.Equals && | |
token.ignoreCase === "quirks" && | |
!token.namespace) { | |
return "#".concat(escapeName(token.value, charsToEscapeInName)); | |
} | |
if (token.name === "class" && | |
token.action === types_1.AttributeAction.Element && | |
token.ignoreCase === "quirks" && | |
!token.namespace) { | |
return ".".concat(escapeName(token.value, charsToEscapeInName)); | |
} | |
var name_1 = getNamespacedName(token); | |
if (token.action === types_1.AttributeAction.Exists) { | |
return "[".concat(name_1, "]"); | |
} | |
return "[".concat(name_1).concat(getActionValue(token.action), "=\"").concat(escapeName(token.value, charsToEscapeInAttributeValue), "\"").concat(token.ignoreCase === null ? "" : token.ignoreCase ? " i" : " s", "]"); | |
} | |
} | |
} | |
function getActionValue(action) { | |
switch (action) { | |
case types_1.AttributeAction.Equals: | |
return ""; | |
case types_1.AttributeAction.Element: | |
return "~"; | |
case types_1.AttributeAction.Start: | |
return "^"; | |
case types_1.AttributeAction.End: | |
return "$"; | |
case types_1.AttributeAction.Any: | |
return "*"; | |
case types_1.AttributeAction.Not: | |
return "!"; | |
case types_1.AttributeAction.Hyphen: | |
return "|"; | |
case types_1.AttributeAction.Exists: | |
throw new Error("Shouldn't be here"); | |
} | |
} | |
function getNamespacedName(token) { | |
return "".concat(getNamespace(token.namespace)).concat(escapeName(token.name, charsToEscapeInName)); | |
} | |
function getNamespace(namespace) { | |
return namespace !== null | |
? "".concat(namespace === "*" | |
? "*" | |
: escapeName(namespace, charsToEscapeInName), "|") | |
: ""; | |
} | |
function escapeName(str, charsToEscape) { | |
var lastIdx = 0; | |
var ret = ""; | |
for (var i = 0; i < str.length; i++) { | |
if (charsToEscape.has(str.charCodeAt(i))) { | |
ret += "".concat(str.slice(lastIdx, i), "\\").concat(str.charAt(i)); | |
lastIdx = i + 1; | |
} | |
} | |
return ret.length > 0 ? ret + str.slice(lastIdx) : str; | |
} | |