Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update DOM utility functions #91

Merged
merged 3 commits into from
Jun 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 86 additions & 8 deletions src/js/dom-util.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,20 +67,75 @@ export const resolveContent = node => {
break;
}
}
const tree = document.createTreeWalker(root, WALKER_FILTER);
const walker = document.createTreeWalker(root, WALKER_FILTER);
return [
document,
root,
tree
walker
];
};

/**
* traverse node tree
* @private
* @param {object} node - node
* @param {object} walker - tree walker
* @returns {?object} - current node
*/
export const traverseNode = (node, walker) => {
if (!node || !node.nodeType) {
// throws
verifyNode(node);
}
let current;
if (walker?.currentNode) {
let refNode = walker.currentNode;
if (refNode === node) {
current = refNode;
} else if (refNode.contains(node)) {
refNode = walker.nextNode();
while (refNode) {
if (refNode === node) {
current = refNode;
break;
}
refNode = walker.nextNode();
}
} else {
if (refNode !== walker.root) {
while (refNode) {
if (refNode === walker.root || refNode === node) {
break;
}
refNode = walker.parentNode();
}
}
if (node.nodeType === ELEMENT_NODE) {
while (refNode) {
if (refNode === node) {
current = refNode;
break;
}
refNode = walker.nextNode();
}
} else {
current = refNode;
}
}
}
return current ?? null;
};

/**
* is in shadow tree
* @param {object} node - node
* @returns {boolean} - result;
*/
export const isInShadowTree = (node = {}) => {
export const isInShadowTree = node => {
if (!node || !node.type) {
// throws
verifyNode(node);
}
let bool;
if (node.nodeType === ELEMENT_NODE ||
node.nodeType === DOCUMENT_FRAGMENT_NODE) {
Expand All @@ -103,7 +158,11 @@ export const isInShadowTree = (node = {}) => {
* @param {object} node - Element node
* @returns {?string} - text content
*/
export const getSlottedTextContent = (node = {}) => {
export const getSlottedTextContent = node => {
if (!node || !node.nodeType) {
// throws
verifyNode(node);
}
let res;
if (node.localName === 'slot' && isInShadowTree(node)) {
const nodes = node.assignedNodes();
Expand All @@ -127,7 +186,11 @@ export const getSlottedTextContent = (node = {}) => {
* @param {object} node - Element node
* @returns {?string} - 'ltr' / 'rtl'
*/
export const getDirectionality = (node = {}) => {
export const getDirectionality = node => {
if (!node || !node.nodeType) {
// throws
verifyNode(node);
}
let res;
if (node.nodeType === ELEMENT_NODE) {
const { dir: nodeDir, localName, parentNode } = node;
Expand Down Expand Up @@ -248,7 +311,11 @@ export const getDirectionality = (node = {}) => {
* @param {object} node - Element node
* @returns {boolean} - result
*/
export const isContentEditable = (node = {}) => {
export const isContentEditable = node => {
if (!node || !node.nodeType) {
// throws
verifyNode(node);
}
let res;
if (node.nodeType === ELEMENT_NODE) {
if (typeof node.isContentEditable === 'boolean') {
Expand Down Expand Up @@ -281,8 +348,12 @@ export const isContentEditable = (node = {}) => {
* @returns {?string} - namespace URI
*/
export const getNamespaceURI = (ns, node) => {
if (!node || !node.nodeType) {
// throws
verifyNode(node);
}
let res;
if (ns && typeof ns === 'string' && node?.nodeType === ELEMENT_NODE) {
if (ns && typeof ns === 'string' && node.nodeType === ELEMENT_NODE) {
const { attributes } = node;
for (const attr of attributes) {
const { name, namespaceURI, prefix, value } = attr;
Expand Down Expand Up @@ -329,7 +400,14 @@ export const isNamespaceDeclared = (ns = '', node = {}) => {
* @param {object} nodeB - Element node
* @returns {boolean} - result
*/
export const isPreceding = (nodeA = {}, nodeB = {}) => {
export const isPreceding = (nodeA, nodeB) => {
if (!nodeA || !nodeA.nodeType) {
// throws
verifyNode(nodeA);
} else if (!nodeB || !nodeB.nodeType) {
// throws
verifyNode(nodeB);
}
let res;
if (nodeA.nodeType === ELEMENT_NODE && nodeB.nodeType === ELEMENT_NODE) {
const posBit = nodeB.compareDocumentPosition(nodeA);
Expand Down
Loading