blob: ccd3d6cc674a6e9f3eff10921594a61daec09911 [file] [log] [blame]
"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 });
var actionTypes = {
equals: "",
element: "~",
start: "^",
end: "$",
any: "*",
not: "!",
hyphen: "|",
};
var charsToEscape = new Set(__spreadArray(__spreadArray([], Object.keys(actionTypes)
.map(function (typeKey) { return actionTypes[typeKey]; })
.filter(Boolean), true), [
":",
"[",
"]",
" ",
"\\",
"(",
")",
"'",
], false));
/**
* Turns `selector` back into a string.
*
* @param selector Selector to stringify.
*/
function stringify(selector) {
return selector.map(stringifySubselector).join(", ");
}
exports.default = stringify;
function stringifySubselector(token) {
return token.map(stringifyToken).join("");
}
function stringifyToken(token) {
switch (token.type) {
// Simple types
case "child":
return " > ";
case "parent":
return " < ";
case "sibling":
return " ~ ";
case "adjacent":
return " + ";
case "descendant":
return " ";
case "universal":
return getNamespace(token.namespace) + "*";
case "tag":
return getNamespacedName(token);
case "pseudo-element":
return "::" + escapeName(token.name);
case "pseudo":
if (token.data === null)
return ":" + escapeName(token.name);
if (typeof token.data === "string") {
return ":" + escapeName(token.name) + "(" + escapeName(token.data) + ")";
}
return ":" + escapeName(token.name) + "(" + stringify(token.data) + ")";
case "attribute": {
if (token.name === "id" &&
token.action === "equals" &&
!token.ignoreCase &&
!token.namespace) {
return "#" + escapeName(token.value);
}
if (token.name === "class" &&
token.action === "element" &&
!token.ignoreCase &&
!token.namespace) {
return "." + escapeName(token.value);
}
var name_1 = getNamespacedName(token);
if (token.action === "exists") {
return "[" + name_1 + "]";
}
return "[" + name_1 + actionTypes[token.action] + "='" + escapeName(token.value) + "'" + (token.ignoreCase ? "i" : token.ignoreCase === false ? "s" : "") + "]";
}
}
}
function getNamespacedName(token) {
return "" + getNamespace(token.namespace) + escapeName(token.name);
}
function getNamespace(namespace) {
return namespace !== null
? (namespace === "*" ? "*" : escapeName(namespace)) + "|"
: "";
}
function escapeName(str) {
return str
.split("")
.map(function (c) { return (charsToEscape.has(c) ? "\\" + c : c); })
.join("");
}