123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- "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;
- }
|