mirror of
https://github.com/idanoo/GoScrobble.git
synced 2024-11-23 00:45:16 +00:00
102 lines
3.0 KiB
JavaScript
102 lines
3.0 KiB
JavaScript
|
"use strict";
|
||
|
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
||
|
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
||
|
to[j] = from[i];
|
||
|
return to;
|
||
|
};
|
||
|
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)), [
|
||
|
":",
|
||
|
"[",
|
||
|
"]",
|
||
|
" ",
|
||
|
"\\",
|
||
|
"(",
|
||
|
")",
|
||
|
"'",
|
||
|
]));
|
||
|
/**
|
||
|
* 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("");
|
||
|
}
|