mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 11:09:27 +02:00
Refactoring, no functional changes
xmlread.pp: * Moved assignment of TXMLFileInputSource.SystemID into TXMLInputFileSource.Create. * Eliminated nested procedure in TXMLReader.ProcessDefaultAttributes, it was redundant since r12026. xpath.pp: * Moved predicate evaluation code, which is common for filter and step nodes, into TXPathExprNode.EvalPredicate(). git-svn-id: trunk@13056 -
This commit is contained in:
parent
efcccbf895
commit
841625e3dd
@ -409,7 +409,7 @@ type
|
||||
procedure ParseElementDecl;
|
||||
procedure ParseNotationDecl;
|
||||
function ResolveEntity(const SystemID, PublicID: WideString; out Source: TXMLCharSource): Boolean;
|
||||
procedure ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef);
|
||||
procedure ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
|
||||
|
||||
procedure PushVC(aElDef: TDOMElementDef);
|
||||
procedure PopVC;
|
||||
@ -1097,6 +1097,7 @@ end;
|
||||
constructor TXMLFileInputSource.Create(var AFile: Text);
|
||||
begin
|
||||
FFile := @AFile;
|
||||
SystemID := FilenameToURI(TTextRec(AFile).Name);
|
||||
FetchData;
|
||||
end;
|
||||
|
||||
@ -2888,7 +2889,8 @@ begin
|
||||
end;
|
||||
ExpectChar('>');
|
||||
|
||||
ProcessDefaultAttributes(NewElem, ElDef);
|
||||
if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
|
||||
ProcessDefaultAttributes(NewElem, ElDef.FAttributes);
|
||||
PushVC(ElDef); // this increases FNesting
|
||||
|
||||
// SAX: ContentHandler.StartElement(...)
|
||||
@ -3035,18 +3037,12 @@ begin
|
||||
ClearRefs(FIDRefs);
|
||||
end;
|
||||
|
||||
procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef);
|
||||
var
|
||||
Map: TDOMNamedNodeMap;
|
||||
Attr: TDOMAttr;
|
||||
|
||||
procedure DoDefaulting;
|
||||
procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
|
||||
var
|
||||
I: Integer;
|
||||
AttDef: TDOMAttrDef;
|
||||
Attr: TDOMAttr;
|
||||
begin
|
||||
Map := ElDef.FAttributes;
|
||||
|
||||
for I := 0 to Map.Length-1 do
|
||||
begin
|
||||
AttDef := Map[I] as TDOMAttrDef;
|
||||
@ -3067,11 +3063,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
|
||||
DoDefaulting;
|
||||
end;
|
||||
|
||||
function TXMLReader.ParseExternalID(out SysID, PubID: WideString; // [75]
|
||||
SysIdOptional: Boolean): Boolean;
|
||||
begin
|
||||
@ -3511,7 +3502,6 @@ var
|
||||
begin
|
||||
ADoc := nil;
|
||||
Src := TXMLFileInputSource.Create(f);
|
||||
Src.SystemID := FilenameToURI(TTextRec(f).Name);
|
||||
Reader := TXMLReader.Create;
|
||||
try
|
||||
Reader.ProcessXML(Src);
|
||||
|
@ -100,6 +100,9 @@ type
|
||||
{ XPath expression parse tree }
|
||||
|
||||
TXPathExprNode = class
|
||||
protected
|
||||
function EvalPredicate(AContext: TXPathContext;
|
||||
AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
|
||||
public
|
||||
function Evaluate(AContext: TXPathContext;
|
||||
AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract;
|
||||
@ -567,6 +570,22 @@ end;
|
||||
|
||||
{ XPath parse tree classes }
|
||||
|
||||
function TXPathExprNode.EvalPredicate(AContext: TXPathContext;
|
||||
AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
|
||||
var
|
||||
resvar: TXPathVariable;
|
||||
begin
|
||||
resvar := Evaluate(AContext, AEnvironment);
|
||||
try
|
||||
if resvar.InheritsFrom(TXPathNumberVariable) then
|
||||
Result := resvar.AsNumber = APosition + 1 // TODO: trunc/round?
|
||||
else
|
||||
Result := resvar.AsBoolean;
|
||||
finally
|
||||
resvar.Release;
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TXPathConstantNode.Create(AValue: TXPathVariable);
|
||||
begin
|
||||
inherited Create;
|
||||
@ -973,7 +992,7 @@ end;
|
||||
function TXPathFilterNode.Evaluate(AContext: TXPathContext;
|
||||
AEnvironment: TXPathEnvironment): TXPathVariable;
|
||||
var
|
||||
ExprResult, PredicateResult: TXPathVariable;
|
||||
ExprResult: TXPathVariable;
|
||||
NodeSet, NewNodeSet: TNodeSet;
|
||||
i, j: Integer;
|
||||
CurContextNode: TDOMNode;
|
||||
@ -995,24 +1014,10 @@ begin
|
||||
DoAdd := True;
|
||||
for j := 0 to FPredicates.Count - 1 do
|
||||
begin
|
||||
PredicateResult := TXPathExprNode(FPredicates[j]).Evaluate(NewContext,
|
||||
AEnvironment);
|
||||
try
|
||||
if PredicateResult.InheritsFrom(TXPathNumberVariable) then
|
||||
begin
|
||||
if PredicateResult.AsNumber <> i + 1 then
|
||||
begin
|
||||
DoAdd := False;
|
||||
break;
|
||||
end;
|
||||
end else if not PredicateResult.AsBoolean then
|
||||
begin
|
||||
DoAdd := False;
|
||||
break;
|
||||
end;
|
||||
finally
|
||||
PredicateResult.Release;
|
||||
end;
|
||||
DoAdd := TXPathExprNode(FPredicates[j]).EvalPredicate(NewContext,
|
||||
AEnvironment, i);
|
||||
if not DoAdd then
|
||||
Break;
|
||||
end;
|
||||
if DoAdd then
|
||||
NewNodeSet.Add(CurContextNode);
|
||||
@ -1108,7 +1113,6 @@ var
|
||||
NewContext: TXPathContext;
|
||||
NewStepNodes: TNodeSet;
|
||||
Predicate: TXPathExprNode;
|
||||
PredicateResult: TXPathVariable;
|
||||
TempList: TList;
|
||||
|
||||
begin
|
||||
@ -1241,16 +1245,8 @@ var
|
||||
Node := TDOMNode(StepNodes[j]);
|
||||
NewContext.ContextNode := Node;
|
||||
Inc(NewContext.ContextPosition);
|
||||
PredicateResult := Predicate.Evaluate(NewContext, AEnvironment);
|
||||
try
|
||||
if (PredicateResult.InheritsFrom(TXPathNumberVariable) and
|
||||
(PredicateResult.AsNumber = j + 1)) or
|
||||
(not PredicateResult.InheritsFrom(TXPathNumberVariable) and
|
||||
PredicateResult.AsBoolean) then
|
||||
NewStepNodes.Add(Node);
|
||||
finally
|
||||
PredicateResult.Release;
|
||||
end;
|
||||
if Predicate.EvalPredicate(NewContext, AEnvironment, j) then
|
||||
NewStepNodes.Add(Node);
|
||||
end;
|
||||
finally
|
||||
NewContext.Free;
|
||||
|
Loading…
Reference in New Issue
Block a user