Skip to content

Commit

Permalink
Merge pull request #61 from super-dm3/fix-parent
Browse files Browse the repository at this point in the history
Fix error when getting parents() for HTML elements
  • Loading branch information
jakejackson1 authored Nov 19, 2024
2 parents b5fb9e9 + 88db7da commit 0cdb852
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 21 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ QueryPath Changelog
- Fix for :nth-child(n+B) to select B-th and all following elements
- Fix for :nth-child(-n+B) to select first B elements
- Update PHPUnit Test Suite to use @dataProvider in testPseudoClassNthChild() to reduce code repetition
- Fix error when getting parents() for HTML elements

# 4.0.0

Expand Down
49 changes: 28 additions & 21 deletions src/Helpers/QueryFilters.php
Original file line number Diff line number Diff line change
Expand Up @@ -796,26 +796,7 @@ public function closest($selector): Query
*/
public function parent($selector = null): Query
{
$found = new SplObjectStorage();
foreach ($this->matches as $m) {
while ($m->parentNode->nodeType !== XML_DOCUMENT_NODE) {
$m = $m->parentNode;
// Is there any case where parent node is not an element?
if ($m->nodeType === XML_ELEMENT_NODE) {
if (! empty($selector)) {
if (QueryPath::with($m, null, $this->options)->is($selector) > 0) {
$found->attach($m);
break;
}
} else {
$found->attach($m);
break;
}
}
}
}

return $this->inst($found, null);
return $this->getParentElements($selector, true);
}

/**
Expand All @@ -835,19 +816,45 @@ public function parent($selector = null): Query
* @see siblings()
*/
public function parents($selector = null): Query
{
return $this->getParentElements($selector, false);
}

/**
* Get ancestor(s) of each element in the DOMQuery.
*
* If a selector is present, only matching ancestors will be retrieved.
*
* @param string|null $selector
* A valid CSS 3 Selector.
* @param bool $immediate
* If function should return only the immediate parent
*
* @return DOMQuery
* A DOMNode object containing the matching ancestors.
* @throws ParseException
* @throws Exception
*/
private function getParentElements(?string $selector, bool $immediate): Query
{
$found = new SplObjectStorage();
foreach ($this->matches as $m) {
while ($m->parentNode->nodeType !== XML_DOCUMENT_NODE) {
while ($m->parentNode && $m->parentNode->nodeType !== XML_DOCUMENT_NODE) {
$m = $m->parentNode;
// Is there any case where parent node is not an element?
if ($m->nodeType === XML_ELEMENT_NODE) {
if (! empty($selector)) {
if (QueryPath::with($m, null, $this->options)->is($selector) > 0) {
$found->attach($m);
if ($immediate) {
break;
}
}
} else {
$found->attach($m);
if ($immediate) {
break;
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions tests/QueryPath/DOMQueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1676,6 +1676,8 @@ public function testParent()
$this->assertEquals('root', qp($file, 'unary')->parent()->tag());
$this->assertEquals('root', qp($file, 'li')->parent('root')->tag());
$this->assertEquals(2, qp($file, 'li')->parent()->count());
$this->assertEquals(0, qp(DATA_HTML_FILE, 'html')->parent()->count());
$this->assertEquals(2, qp(DATA_HTML_FILE, 'table')->parents()->count());
}

public function testClosest()
Expand Down

0 comments on commit 0cdb852

Please sign in to comment.