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.
138 lines
5.3 KiB
138 lines
5.3 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 }); |
|
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; |
|
}
|
|
|