mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 18:09:40 +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 ParseElementDecl;
|
||||||
procedure ParseNotationDecl;
|
procedure ParseNotationDecl;
|
||||||
function ResolveEntity(const SystemID, PublicID: WideString; out Source: TXMLCharSource): Boolean;
|
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 PushVC(aElDef: TDOMElementDef);
|
||||||
procedure PopVC;
|
procedure PopVC;
|
||||||
@ -1097,6 +1097,7 @@ end;
|
|||||||
constructor TXMLFileInputSource.Create(var AFile: Text);
|
constructor TXMLFileInputSource.Create(var AFile: Text);
|
||||||
begin
|
begin
|
||||||
FFile := @AFile;
|
FFile := @AFile;
|
||||||
|
SystemID := FilenameToURI(TTextRec(AFile).Name);
|
||||||
FetchData;
|
FetchData;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2888,7 +2889,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
ExpectChar('>');
|
ExpectChar('>');
|
||||||
|
|
||||||
ProcessDefaultAttributes(NewElem, ElDef);
|
if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
|
||||||
|
ProcessDefaultAttributes(NewElem, ElDef.FAttributes);
|
||||||
PushVC(ElDef); // this increases FNesting
|
PushVC(ElDef); // this increases FNesting
|
||||||
|
|
||||||
// SAX: ContentHandler.StartElement(...)
|
// SAX: ContentHandler.StartElement(...)
|
||||||
@ -3035,18 +3037,12 @@ begin
|
|||||||
ClearRefs(FIDRefs);
|
ClearRefs(FIDRefs);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef);
|
procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
|
||||||
var
|
|
||||||
Map: TDOMNamedNodeMap;
|
|
||||||
Attr: TDOMAttr;
|
|
||||||
|
|
||||||
procedure DoDefaulting;
|
|
||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
AttDef: TDOMAttrDef;
|
AttDef: TDOMAttrDef;
|
||||||
|
Attr: TDOMAttr;
|
||||||
begin
|
begin
|
||||||
Map := ElDef.FAttributes;
|
|
||||||
|
|
||||||
for I := 0 to Map.Length-1 do
|
for I := 0 to Map.Length-1 do
|
||||||
begin
|
begin
|
||||||
AttDef := Map[I] as TDOMAttrDef;
|
AttDef := Map[I] as TDOMAttrDef;
|
||||||
@ -3067,11 +3063,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
|
||||||
if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
|
|
||||||
DoDefaulting;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TXMLReader.ParseExternalID(out SysID, PubID: WideString; // [75]
|
function TXMLReader.ParseExternalID(out SysID, PubID: WideString; // [75]
|
||||||
SysIdOptional: Boolean): Boolean;
|
SysIdOptional: Boolean): Boolean;
|
||||||
begin
|
begin
|
||||||
@ -3511,7 +3502,6 @@ var
|
|||||||
begin
|
begin
|
||||||
ADoc := nil;
|
ADoc := nil;
|
||||||
Src := TXMLFileInputSource.Create(f);
|
Src := TXMLFileInputSource.Create(f);
|
||||||
Src.SystemID := FilenameToURI(TTextRec(f).Name);
|
|
||||||
Reader := TXMLReader.Create;
|
Reader := TXMLReader.Create;
|
||||||
try
|
try
|
||||||
Reader.ProcessXML(Src);
|
Reader.ProcessXML(Src);
|
||||||
|
@ -100,6 +100,9 @@ type
|
|||||||
{ XPath expression parse tree }
|
{ XPath expression parse tree }
|
||||||
|
|
||||||
TXPathExprNode = class
|
TXPathExprNode = class
|
||||||
|
protected
|
||||||
|
function EvalPredicate(AContext: TXPathContext;
|
||||||
|
AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
|
||||||
public
|
public
|
||||||
function Evaluate(AContext: TXPathContext;
|
function Evaluate(AContext: TXPathContext;
|
||||||
AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract;
|
AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract;
|
||||||
@ -567,6 +570,22 @@ end;
|
|||||||
|
|
||||||
{ XPath parse tree classes }
|
{ 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);
|
constructor TXPathConstantNode.Create(AValue: TXPathVariable);
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -973,7 +992,7 @@ end;
|
|||||||
function TXPathFilterNode.Evaluate(AContext: TXPathContext;
|
function TXPathFilterNode.Evaluate(AContext: TXPathContext;
|
||||||
AEnvironment: TXPathEnvironment): TXPathVariable;
|
AEnvironment: TXPathEnvironment): TXPathVariable;
|
||||||
var
|
var
|
||||||
ExprResult, PredicateResult: TXPathVariable;
|
ExprResult: TXPathVariable;
|
||||||
NodeSet, NewNodeSet: TNodeSet;
|
NodeSet, NewNodeSet: TNodeSet;
|
||||||
i, j: Integer;
|
i, j: Integer;
|
||||||
CurContextNode: TDOMNode;
|
CurContextNode: TDOMNode;
|
||||||
@ -995,24 +1014,10 @@ begin
|
|||||||
DoAdd := True;
|
DoAdd := True;
|
||||||
for j := 0 to FPredicates.Count - 1 do
|
for j := 0 to FPredicates.Count - 1 do
|
||||||
begin
|
begin
|
||||||
PredicateResult := TXPathExprNode(FPredicates[j]).Evaluate(NewContext,
|
DoAdd := TXPathExprNode(FPredicates[j]).EvalPredicate(NewContext,
|
||||||
AEnvironment);
|
AEnvironment, i);
|
||||||
try
|
if not DoAdd then
|
||||||
if PredicateResult.InheritsFrom(TXPathNumberVariable) then
|
Break;
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
if DoAdd then
|
if DoAdd then
|
||||||
NewNodeSet.Add(CurContextNode);
|
NewNodeSet.Add(CurContextNode);
|
||||||
@ -1108,7 +1113,6 @@ var
|
|||||||
NewContext: TXPathContext;
|
NewContext: TXPathContext;
|
||||||
NewStepNodes: TNodeSet;
|
NewStepNodes: TNodeSet;
|
||||||
Predicate: TXPathExprNode;
|
Predicate: TXPathExprNode;
|
||||||
PredicateResult: TXPathVariable;
|
|
||||||
TempList: TList;
|
TempList: TList;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -1241,16 +1245,8 @@ var
|
|||||||
Node := TDOMNode(StepNodes[j]);
|
Node := TDOMNode(StepNodes[j]);
|
||||||
NewContext.ContextNode := Node;
|
NewContext.ContextNode := Node;
|
||||||
Inc(NewContext.ContextPosition);
|
Inc(NewContext.ContextPosition);
|
||||||
PredicateResult := Predicate.Evaluate(NewContext, AEnvironment);
|
if Predicate.EvalPredicate(NewContext, AEnvironment, j) then
|
||||||
try
|
NewStepNodes.Add(Node);
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
NewContext.Free;
|
NewContext.Free;
|
||||||
|
Loading…
Reference in New Issue
Block a user