UNPKG

r2-navigator-js

Version:

Readium 2 'navigator' for NodeJS (TypeScript)

215 lines 7.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fullQualifiedSelector = void 0; var tslib_1 = require("tslib"); var fullQualifiedSelector = function (node, justSelector) { if (node.nodeType !== Node.ELEMENT_NODE) { var lowerCaseName = (node.localName && node.localName.toLowerCase()) || node.nodeName.toLowerCase(); return lowerCaseName; } return cssPath(node, justSelector); }; exports.fullQualifiedSelector = fullQualifiedSelector; var cssPath = function (node, optimized) { if (node.nodeType !== Node.ELEMENT_NODE) { return ""; } var steps = []; var contextNode = node; while (contextNode) { var step = _cssPathStep(contextNode, !!optimized, contextNode === node); if (!step) { break; } steps.push(step.value); if (step.optimized) { break; } contextNode = contextNode.parentNode; } steps.reverse(); return steps.join(" > "); }; var _cssPathStep = function (node, optimized, isTargetNode) { var e_1, _a; var prefixedElementClassNames = function (nd) { var classAttribute = nd.getAttribute("class"); if (!classAttribute) { return []; } return classAttribute.split(/\s+/g).filter(Boolean).map(function (nm) { return "$" + nm; }); }; var idSelector = function (idd) { return "#" + escapeIdentifierIfNeeded(idd); }; var escapeIdentifierIfNeeded = function (ident) { if (isCSSIdentifier(ident)) { return ident; } var shouldEscapeFirst = /^(?:[0-9]|-[0-9-]?)/.test(ident); var lastIndex = ident.length - 1; return ident.replace(/./g, function (c, ii) { return ((shouldEscapeFirst && ii === 0) || !isCSSIdentChar(c)) ? escapeAsciiChar(c, ii === lastIndex) : c; }); }; var escapeAsciiChar = function (c, isLast) { return "\\" + toHexByte(c) + (isLast ? "" : " "); }; var toHexByte = function (c) { var hexByte = c.charCodeAt(0).toString(16); if (hexByte.length === 1) { hexByte = "0" + hexByte; } return hexByte; }; var isCSSIdentChar = function (c) { if (/[a-zA-Z0-9_-]/.test(c)) { return true; } return c.charCodeAt(0) >= 0xA0; }; var isCSSIdentifier = function (value) { return /^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value); }; if (node.nodeType !== Node.ELEMENT_NODE) { return undefined; } var lowerCaseName = (node.localName && node.localName.toLowerCase()) || node.nodeName.toLowerCase(); var element = node; var id = element.getAttribute("id"); if (optimized) { if (id) { return { optimized: true, value: idSelector(id), }; } if (lowerCaseName === "body" || lowerCaseName === "head" || lowerCaseName === "html") { return { optimized: true, value: lowerCaseName, }; } } var nodeName = lowerCaseName; if (id) { return { optimized: true, value: nodeName + idSelector(id), }; } var parent = node.parentNode; if (!parent || parent.nodeType === Node.DOCUMENT_NODE) { return { optimized: true, value: nodeName, }; } var prefixedOwnClassNamesArray_ = prefixedElementClassNames(element); var prefixedOwnClassNamesArray = []; prefixedOwnClassNamesArray_.forEach(function (arrItem) { if (prefixedOwnClassNamesArray.indexOf(arrItem) < 0) { prefixedOwnClassNamesArray.push(arrItem); } }); var needsClassNames = false; var needsNthChild = false; var ownIndex = -1; var elementIndex = -1; var siblings = parent.children; var _loop_1 = function (i) { var e_2, _b; var sibling = siblings[i]; if (sibling.nodeType !== Node.ELEMENT_NODE) { return "continue"; } elementIndex += 1; if (sibling === node) { ownIndex = elementIndex; return "continue"; } if (needsNthChild) { return "continue"; } var siblingName = (sibling.localName && sibling.localName.toLowerCase()) || sibling.nodeName.toLowerCase(); if (siblingName !== nodeName) { return "continue"; } needsClassNames = true; var ownClassNames = []; prefixedOwnClassNamesArray.forEach(function (arrItem) { ownClassNames.push(arrItem); }); var ownClassNameCount = ownClassNames.length; if (ownClassNameCount === 0) { needsNthChild = true; return "continue"; } var siblingClassNamesArray_ = prefixedElementClassNames(sibling); var siblingClassNamesArray = []; siblingClassNamesArray_.forEach(function (arrItem) { if (siblingClassNamesArray.indexOf(arrItem) < 0) { siblingClassNamesArray.push(arrItem); } }); try { for (var siblingClassNamesArray_1 = (e_2 = void 0, tslib_1.__values(siblingClassNamesArray)), siblingClassNamesArray_1_1 = siblingClassNamesArray_1.next(); !siblingClassNamesArray_1_1.done; siblingClassNamesArray_1_1 = siblingClassNamesArray_1.next()) { var siblingClass = siblingClassNamesArray_1_1.value; var ind = ownClassNames.indexOf(siblingClass); if (ind < 0) { continue; } ownClassNames.splice(ind, 1); if (!--ownClassNameCount) { needsNthChild = true; break; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (siblingClassNamesArray_1_1 && !siblingClassNamesArray_1_1.done && (_b = siblingClassNamesArray_1.return)) _b.call(siblingClassNamesArray_1); } finally { if (e_2) throw e_2.error; } } }; for (var i = 0; (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) { _loop_1(i); } var result = nodeName; if (isTargetNode && nodeName === "input" && element.getAttribute("type") && !element.getAttribute("id") && !element.getAttribute("class")) { result += "[type=\"" + element.getAttribute("type") + "\"]"; } if (needsNthChild) { result += ":nth-child(" + (ownIndex + 1) + ")"; } else if (needsClassNames) { try { for (var prefixedOwnClassNamesArray_1 = tslib_1.__values(prefixedOwnClassNamesArray), prefixedOwnClassNamesArray_1_1 = prefixedOwnClassNamesArray_1.next(); !prefixedOwnClassNamesArray_1_1.done; prefixedOwnClassNamesArray_1_1 = prefixedOwnClassNamesArray_1.next()) { var prefixedName = prefixedOwnClassNamesArray_1_1.value; result += "." + escapeIdentifierIfNeeded(prefixedName.substr(1)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (prefixedOwnClassNamesArray_1_1 && !prefixedOwnClassNamesArray_1_1.done && (_a = prefixedOwnClassNamesArray_1.return)) _a.call(prefixedOwnClassNamesArray_1); } finally { if (e_1) throw e_1.error; } } } return { optimized: false, value: result, }; }; //# sourceMappingURL=cssselector.js.map