Turbopower IPro: Added functions FindNode, FindNodeByElemId and FindNodeByElemClass. Issue #29483, patch from Silvio Clécio.

git-svn-id: trunk@51431 -
This commit is contained in:
juha 2016-01-27 18:11:54 +00:00
parent 05b537ca3f
commit 3da9248939
2 changed files with 58 additions and 0 deletions

View File

@ -47,6 +47,7 @@
{$DEFINE VERSION5}
{$DEFINE Version6OrHigher}
{$DEFINE Version7OrHigher}
{$MODESWITCH NESTEDPROCVARS}
{$ELSE}

View File

@ -2656,6 +2656,8 @@ type
property FlagErrors;
end;
TIdFindNodeCriteria = function(ACurrNode: TIpHtmlNodeCore): Boolean is nested;
const
NAnchorChar = #3 ; {character used to represent an Anchor }
var
@ -2683,6 +2685,9 @@ function dbgs(et: TElementType): string; overload;
function GetNextSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
function GetPrevSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
function GetParentNodeOfClass(ANode: TIpHtmlNode; AClass: TIpHtmlNodeClass): TIpHtmlNode;
function FindNode(ANode: TIpHtmlNode; ACriteria: TIdFindNodeCriteria): TIpHtmlNodeCore;
function FindNodeByElemId(ANode: TIpHtmlNode; const AElemId: string): TIpHtmlNodeCore;
function FindNodeByElemClass(ANode: TIpHtmlNode; const AElemClass: string): TIpHtmlNodeCore;
procedure Register;
@ -2886,6 +2891,58 @@ begin
Result := Result.FParentNode;
end;
function FindNode(ANode: TIpHtmlNode; ACriteria: TIdFindNodeCriteria): TIpHtmlNodeCore;
var
I: Integer;
VNode: TIpHtmlNodeMulti;
VPrevNode, VNextNode: TIpHtmlNode;
begin
if not Assigned(ANode) or not (ANode is TIpHtmlNodeMulti) then
Exit(nil);
VNode := ANode as TIpHtmlNodeMulti;
if VNode.ChildCount < 1 then
Exit(nil);
for I := 0 to Pred(VNode.ChildCount) do
begin
VPrevNode := VNode.ChildNode[I];
VNextNode := FindNode(VPrevNode, ACriteria);
if not Assigned(VNextNode) then
VNextNode := VPrevNode;
if VNextNode is TIpHtmlNodeCore then
begin
Result := VNextNode as TIpHtmlNodeCore;
if ACriteria(Result) then
Exit;
end;
end;
Result := nil;
end;
function FindNodeByElemId(ANode: TIpHtmlNode; const AElemId: string): TIpHtmlNodeCore;
function Criteria(ACurrNode: TIpHtmlNodeCore): Boolean;
begin
if ACurrNode.Id = AElemId then
Exit(True);
Result := False;
end;
begin
Result := FindNode(ANode, Criteria);
end;
function FindNodeByElemClass(ANode: TIpHtmlNode; const AElemClass: string): TIpHtmlNodeCore;
function Criteria(ACurrNode: TIpHtmlNodeCore): Boolean;
begin
if ACurrNode.ClassId = AElemClass then
Exit(True);
Result := False;
end;
begin
Result := FindNode(ANode, Criteria);
end;
procedure Register;
begin