You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.9 KiB
110 lines
2.9 KiB
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
|