You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.2 KiB
105 lines
3.2 KiB
"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(""); |
|
}
|
|
|