Current Directory: /home/astoriaah/www/templates/yootheme/vendor/assets/uikit/src/js/util
Viewing File: /home/astoriaah/www/templates/yootheme/vendor/assets/uikit/src/js/util/selector.js
import {removeAttr} from './attr';
import {isNode, isString, startsWith, toNode, toNodes} from './lang';
export function query(selector, context) {
return toNode(selector) || find(selector, isContextSelector(selector) ? context : document);
}
export function queryAll(selector, context) {
const nodes = toNodes(selector);
return nodes.length && nodes || findAll(selector, isContextSelector(selector) ? context : document);
}
export function find(selector, context) {
return toNode(_query(selector, context, 'querySelector'));
}
export function findAll(selector, context) {
return toNodes(_query(selector, context, 'querySelectorAll'));
}
function _query(selector, context = document, queryFn) {
if (!selector || !isString(selector)) {
return null;
}
selector = selector.replace(contextSanitizeRe, '$1 *');
let removes;
if (isContextSelector(selector)) {
removes = [];
selector = selector.split(',').map((selector, i) => {
let ctx = context;
selector = selector.trim();
if (selector[0] === '!') {
const selectors = selector.substr(1).trim().split(' ');
ctx = closest(context.parentNode, selectors[0]);
selector = selectors.slice(1).join(' ').trim();
}
if (selector[0] === '-') {
const selectors = selector.substr(1).trim().split(' ');
const prev = (ctx || context).previousElementSibling;
ctx = matches(prev, selector.substr(1)) ? prev : null;
selector = selectors.slice(1).join(' ');
}
if (!ctx) {
return null;
}
if (!ctx.id) {
ctx.id = `uk-${Date.now()}${i}`;
removes.push(() => removeAttr(ctx, 'id'));
}
return `#${escape(ctx.id)} ${selector}`;
}).filter(Boolean).join(',');
context = document;
}
try {
return context[queryFn](selector);
} catch (e) {
return null;
} finally {
removes && removes.forEach(remove => remove());
}
}
const contextSelectorRe = /(^|,)\s*[!>+~-]/;
const contextSanitizeRe = /([!>+~-])(?=\s+[!>+~-]|\s*$)/g;
function isContextSelector(selector) {
return isString(selector) && selector.match(contextSelectorRe);
}
const elProto = Element.prototype;
const matchesFn = elProto.matches || elProto.webkitMatchesSelector || elProto.msMatchesSelector;
export function matches(element, selector) {
return toNodes(element).some(element => matchesFn.call(element, selector));
}
const closestFn = elProto.closest || function (selector) {
let ancestor = this;
do {
if (matches(ancestor, selector)) {
return ancestor;
}
ancestor = ancestor.parentNode;
} while (ancestor && ancestor.nodeType === 1);
};
export function closest(element, selector) {
if (startsWith(selector, '>')) {
selector = selector.slice(1);
}
return isNode(element)
? element.parentNode && closestFn.call(element, selector)
: toNodes(element).map(element => element.parentNode && closestFn.call(element, selector)).filter(Boolean);
}
export function parents(element, selector) {
const elements = [];
let parent = toNode(element).parentNode;
while (parent && parent.nodeType === 1) {
if (matches(parent, selector)) {
elements.push(parent);
}
parent = parent.parentNode;
}
return elements;
}
const escapeFn = window.CSS && CSS.escape || function (css) { return css.replace(/([^\x7f-\uFFFF\w-])/g, match => `\\${match}`); };
export function escape(css) {
return isString(css) ? escapeFn.call(null, css) : '';
}