import { isTag, hasChildren, } from "domhandler"; /** * Get a node's children. * * @category Traversal * @param elem Node to get the children of. * @returns `elem`'s children, or an empty array. */ export function getChildren(elem) { return hasChildren(elem) ? elem.children : []; } /** * Get a node's parent. * * @category Traversal * @param elem Node to get the parent of. * @returns `elem`'s parent node. */ export function getParent(elem) { return elem.parent || null; } /** * Gets an elements siblings, including the element itself. * * Attempts to get the children through the element's parent first. If we don't * have a parent (the element is a root node), we walk the element's `prev` & * `next` to get all remaining nodes. * * @category Traversal * @param elem Element to get the siblings of. * @returns `elem`'s siblings. */ export function getSiblings(elem) { const parent = getParent(elem); if (parent != null) return getChildren(parent); const siblings = [elem]; let { prev, next } = elem; while (prev != null) { siblings.unshift(prev); ({ prev } = prev); } while (next != null) { siblings.push(next); ({ next } = next); } return siblings; } /** * Gets an attribute from an element. * * @category Traversal * @param elem Element to check. * @param name Attribute name to retrieve. * @returns The element's attribute value, or `undefined`. */ export function getAttributeValue(elem, name) { var _a; return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name]; } /** * Checks whether an element has an attribute. * * @category Traversal * @param elem Element to check. * @param name Attribute name to look for. * @returns Returns whether `elem` has the attribute `name`. */ export function hasAttrib(elem, name) { return (elem.attribs != null && Object.prototype.hasOwnProperty.call(elem.attribs, name) && elem.attribs[name] != null); } /** * Get the tag name of an element. * * @category Traversal * @param elem The element to get the name for. * @returns The tag name of `elem`. */ export function getName(elem) { return elem.name; } /** * Returns the next element sibling of a node. * * @category Traversal * @param elem The element to get the next sibling of. * @returns `elem`'s next sibling that is a tag. */ export function nextElementSibling(elem) { let { next } = elem; while (next !== null && !isTag(next)) ({ next } = next); return next; } /** * Returns the previous element sibling of a node. * * @category Traversal * @param elem The element to get the previous sibling of. * @returns `elem`'s previous sibling that is a tag. */ export function prevElementSibling(elem) { let { prev } = elem; while (prev !== null && !isTag(prev)) ({ prev } = prev); return prev; } //# sourceMappingURL=traversal.js.map