Skip to content

Commit

Permalink
Update DOM utility functions (#91)
Browse files Browse the repository at this point in the history
  • Loading branch information
asamuzaK authored Jun 30, 2024
1 parent f1d5fe5 commit 3317240
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 154 deletions.
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

0 comments on commit 3317240

Please sign in to comment.