| 542 | }; |
| 543 | |
| 544 | const getParents = (elm: string | Node | null, selector?: string | ((node: Node) => boolean | void), root?: Node, collect?: boolean): Node[] | null => { |
| 545 | const result: Node[] = []; |
| 546 | |
| 547 | let node = get(elm); |
| 548 | collect = collect === undefined; |
| 549 | |
| 550 | // Default root on inline mode |
| 551 | const resolvedRoot = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null); |
| 552 | |
| 553 | // Wrap node name as func |
| 554 | if (Type.isString(selector)) { |
| 555 | if (selector === '*') { |
| 556 | selector = NodeType.isElement; |
| 557 | } else { |
| 558 | const selectorVal = selector; |
| 559 | selector = (node) => is(node, selectorVal); |
| 560 | } |
| 561 | } |
| 562 | |
| 563 | while (node) { |
| 564 | // TODO: Remove nullable check once TINY-6599 is complete |
| 565 | if (node === resolvedRoot || Type.isNullable(node.nodeType) || NodeType.isDocument(node) || NodeType.isDocumentFragment(node)) { |
| 566 | break; |
| 567 | } |
| 568 | |
| 569 | if (!selector || selector(node)) { |
| 570 | if (collect) { |
| 571 | result.push(node); |
| 572 | } else { |
| 573 | return [ node ]; |
| 574 | } |
| 575 | } |
| 576 | |
| 577 | node = node.parentNode; |
| 578 | } |
| 579 | |
| 580 | return collect ? result : null; |
| 581 | }; |
| 582 | |
| 583 | const getParent = (node: string | Node | null, selector?: string | ((node: Node) => boolean | void), root?: Node): Node | null => { |
| 584 | const parents = getParents(node, selector, root, false); |