139 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"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;
 | 
						|
}
 |