blob: 664b69ecdb21b16c0c25639582c105f5f9afbca9 [file] [log] [blame]
Tim van der Lippe706ec962021-06-04 13:24:42 +01001"use strict";
2var __spreadArrays = (this && this.__spreadArrays) || function () {
3 for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
4 for (var r = Array(s), k = 0, i = 0; i < il; i++)
5 for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
6 r[k] = a[j];
7 return r;
8};
9Object.defineProperty(exports, "__esModule", { value: true });
10var actionTypes = {
11 equals: "",
12 element: "~",
13 start: "^",
14 end: "$",
15 any: "*",
16 not: "!",
17 hyphen: "|",
18};
19var charsToEscape = new Set(__spreadArrays(Object.keys(actionTypes)
20 .map(function (typeKey) { return actionTypes[typeKey]; })
21 .filter(Boolean), [
22 ":",
23 "[",
24 "]",
25 " ",
26 "\\",
27 "(",
28 ")",
29]));
30/**
31 * Turns `selector` back into a string.
32 *
33 * @param selector Selector to stringify.
34 */
35function stringify(selector) {
36 return selector.map(stringifySubselector).join(", ");
37}
38exports.default = stringify;
39function stringifySubselector(token) {
40 return token.map(stringifyToken).join("");
41}
42function stringifyToken(token) {
43 switch (token.type) {
44 // Simple types
45 case "child":
46 return " > ";
47 case "parent":
48 return " < ";
49 case "sibling":
50 return " ~ ";
51 case "adjacent":
52 return " + ";
53 case "descendant":
54 return " ";
55 case "universal":
56 return getNamespace(token.namespace) + "*";
57 case "tag":
58 return getNamespacedName(token);
59 case "pseudo-element":
60 return "::" + escapeName(token.name);
61 case "pseudo":
62 if (token.data === null)
63 return ":" + escapeName(token.name);
64 if (typeof token.data === "string") {
65 return ":" + escapeName(token.name) + "(" + escapeName(token.data) + ")";
66 }
67 return ":" + escapeName(token.name) + "(" + stringify(token.data) + ")";
68 case "attribute": {
69 if (token.name === "id" &&
70 token.action === "equals" &&
71 !token.ignoreCase &&
72 !token.namespace) {
73 return "#" + escapeName(token.value);
74 }
75 if (token.name === "class" &&
76 token.action === "element" &&
77 !token.ignoreCase &&
78 !token.namespace) {
79 return "." + escapeName(token.value);
80 }
81 var name_1 = getNamespacedName(token);
82 if (token.action === "exists") {
83 return "[" + name_1 + "]";
84 }
85 return "[" + name_1 + actionTypes[token.action] + "='" + escapeName(token.value) + "'" + (token.ignoreCase ? "i" : "") + "]";
86 }
87 }
88}
89function getNamespacedName(token) {
90 return "" + getNamespace(token.namespace) + escapeName(token.name);
91}
92function getNamespace(namespace) {
93 return namespace
94 ? (namespace === "*" ? "*" : escapeName(namespace)) + "|"
95 : "";
96}
97function escapeName(str) {
98 return str
99 .split("")
100 .map(function (c) { return (charsToEscape.has(c) ? "\\" + c : c); })
101 .join("");
102}