| "use strict"; |
| 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; |
| } |