From 9a851e51f99e27c253647aa12bd8a7f22720142d Mon Sep 17 00:00:00 2001 From: Will Budic Date: Wed, 1 May 2024 17:01:48 +1000 Subject: [PATCH] Further refined find all selector for nodes. --- system/modules/CNFNode.pm | 44 ++++++++++++++++++++++++++------------- tests/testCNFNode.pl | 6 +++++- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/system/modules/CNFNode.pm b/system/modules/CNFNode.pm index 98767ba..66ae63b 100644 --- a/system/modules/CNFNode.pm +++ b/system/modules/CNFNode.pm @@ -205,31 +205,45 @@ sub find { $ref = ref($ret); if($ret && $ref eq 'ARRAY'){ my $found = 0; + my @target = @$ret; undef $prev; - foreach my $ele(@$ret){ + foreach my $ele(@target){ my $r = ref($ele); - if($r eq 'ARRAY'){#TODO Is this to account here allso for rest of search path? + if($r eq 'ARRAY'){#TODO Is this to account here also for rest of search path? $ele = @{$ele}[0] } if($seekArray && exists $ele->{'@$'}){ foreach my$node(@{$ele->{'@$'}}){ if ($node->{'_'} eq $name){ - $arr[@arr] = $ele = $node; - }elsif($node->{'_'} eq $seekPName){ - my $seek = $node -> find("$seekPName/$name"); - $ref = ref($seek); - if($ref eq 'ARRAY'){ - @arr=(); - foreach my$nd(@{$seek}){ + if(ref($ele) eq 'ARRAY'){ + @arr= @$ele; + } + $arr[@arr] = $node; + + } + elsif($node->{'_'} eq $seekPName){ + my $seek = $node -> find("$seekPName/$name"); + $ref = ref($seek); + if($ref eq 'ARRAY'){ + @arr=(); + foreach my$nd(@{$seek}){ my $child = $nd -> findChildrenByName($name); $arr[@arr] = $child if $child - } - return \@arr if(@arr>1); - $ele = $arr[0]; - @arr=(); - }elsif($ref eq 'CNFNode'){ + } + return \@arr if(@arr>1); + $ele = $arr[0]; + @arr=(); + }elsif($seekPName && $ref eq 'CNFNode'){ $ele = $seek; - } + } + } + elsif($seekPName && $node->{'@'}){ + my $found = findChildrenByName($node,$name); + if($found){ + $ele = $found; + $found++; + next + } } } if(@arr>1){ diff --git a/tests/testCNFNode.pl b/tests/testCNFNode.pl index 3a0ec54..9ee4126 100644 --- a/tests/testCNFNode.pl +++ b/tests/testCNFNode.pl @@ -156,6 +156,7 @@ use Syntax::Keyword::Try; try { >div> >div> >div> + text> >parent> )); @@ -178,7 +179,10 @@ use Syntax::Keyword::Try; try { $test -> evaluate("\$find[/parent/div/*/text]","Deeply Nested!",$find->[0]->val()); $test -> evaluate("\$find[/parent/div/*/text]","This Too!",$find->[1]->val()); - + my $find2 = $node->find('/parent/*/text'); + $test -> subcase("Select all text nodes in parent.")-> + evaluate("\$find2[/parent/*/text]",3,scalar @$find2); + $test -> evaluate("\$find2[/parent/*/text]",'Shallow', $find2->[2]->val()); # $test -> nextCase(); -- 2.34.1