spiritjs
Version:
The animation toolkit for the web
75 lines (73 loc) • 2.13 kB
JavaScript
;
exports.__esModule = true;
exports.getElement = getElement;
exports.getExpression = getExpression;
var _is = require("./is");
var _debug = _interopRequireDefault(require("./debug"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* Get DOM representation for an element.
*
* @param {Element} element
* @param {null|undefined|Node} nodeContext
* @returns {string|null}
*/
function getExpression(element, nodeContext) {
if (nodeContext === void 0) {
nodeContext = null;
}
var paths = [];
var isNodeContext = function isNodeContext() {
if (!nodeContext) {
return true;
}
return nodeContext !== element;
};
while (element.nodeType === window.Node.ELEMENT_NODE && isNodeContext()) {
var index = 0;
for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling) {
if (sibling.nodeType === window.Node.DOCUMENT_TYPE_NODE) {
continue;
}
if (sibling.nodeName === element.nodeName) {
++index;
}
}
var tagName = element.nodeName.toLowerCase();
var pathIndex = "[" + (index + 1) + "]";
if ((0, _is.isSVG)(element)) {
tagName = "*[local-name()='" + tagName + "']";
}
paths.unshift(tagName + pathIndex);
element = element.parentNode;
}
if (paths.length === 0) {
return null;
}
return nodeContext ? paths.join('/') : "/" + paths.join('/');
}
/**
* Get an element from expression
*
* @param {string} expression
* @param {Node} nodeContext
* @returns {Node|null}
*/
function getElement(expression, nodeContext) {
if (nodeContext === void 0) {
nodeContext = null;
}
if (!nodeContext) {
nodeContext = document.body || document.documentElement;
}
try {
var evaluated = document.evaluate(expression, nodeContext, null, window.XPathResult.ANY_TYPE, null);
return evaluated.iterateNext();
} catch (err) {
if ((0, _debug["default"])()) {
console.error('Cannot get element from expression: ', expression);
console.error(err.stack);
}
}
return null;
}