mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 10:09:19 +02:00
* Patch from Pawel Dmitruk to add CDATA and comment support
git-svn-id: trunk@45724 -
This commit is contained in:
parent
e74050ede6
commit
795365eee7
@ -31,6 +31,8 @@ type
|
|||||||
scUnknown,
|
scUnknown,
|
||||||
scWhitespace, // within whitespace
|
scWhitespace, // within whitespace
|
||||||
scText, // within text
|
scText, // within text
|
||||||
|
scCData, // within cdata section
|
||||||
|
scComment, // within comment
|
||||||
scEntityReference, // within entity reference ("&...;")
|
scEntityReference, // within entity reference ("&...;")
|
||||||
scTag); // within a start tag or end tag
|
scTag); // within a start tag or end tag
|
||||||
|
|
||||||
@ -59,7 +61,7 @@ type
|
|||||||
|
|
||||||
{ TXMLToDOMConverter }
|
{ TXMLToDOMConverter }
|
||||||
|
|
||||||
TXMLNodeType = (ntWhitespace, ntText, ntEntityReference, ntTag);
|
TXMLNodeType = (ntWhitespace, ntText, ntEntityReference, ntTag, ntComment);
|
||||||
|
|
||||||
TXMLNodeInfo = class
|
TXMLNodeInfo = class
|
||||||
NodeType: TXMLNodeType;
|
NodeType: TXMLNodeType;
|
||||||
@ -77,6 +79,8 @@ type
|
|||||||
|
|
||||||
procedure ReaderCharacters(Sender: TObject; const ch: PSAXChar;
|
procedure ReaderCharacters(Sender: TObject; const ch: PSAXChar;
|
||||||
Start, Count: Integer);
|
Start, Count: Integer);
|
||||||
|
procedure ReaderComment(Sender: TObject; const ch: PSAXChar;
|
||||||
|
Start, Count: Integer);
|
||||||
procedure ReaderIgnorableWhitespace(Sender: TObject; const ch: PSAXChar;
|
procedure ReaderIgnorableWhitespace(Sender: TObject; const ch: PSAXChar;
|
||||||
Start, Count: Integer);
|
Start, Count: Integer);
|
||||||
procedure ReaderSkippedEntity(Sender: TObject; const Name: SAXString);
|
procedure ReaderSkippedEntity(Sender: TObject; const Name: SAXString);
|
||||||
@ -171,6 +175,17 @@ begin
|
|||||||
'<':
|
'<':
|
||||||
begin
|
begin
|
||||||
Inc(BufferPos);
|
Inc(BufferPos);
|
||||||
|
if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='[') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 8);
|
||||||
|
EnterNewScannerContext(scCData);
|
||||||
|
end
|
||||||
|
else if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='-') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 3);
|
||||||
|
EnterNewScannerContext(scComment);
|
||||||
|
end
|
||||||
|
else
|
||||||
EnterNewScannerContext(scTag);
|
EnterNewScannerContext(scTag);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
@ -191,6 +206,17 @@ begin
|
|||||||
'<':
|
'<':
|
||||||
begin
|
begin
|
||||||
Inc(BufferPos);
|
Inc(BufferPos);
|
||||||
|
if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='[') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 8);
|
||||||
|
EnterNewScannerContext(scCData);
|
||||||
|
end
|
||||||
|
else if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='-') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 3);
|
||||||
|
EnterNewScannerContext(scComment);
|
||||||
|
end
|
||||||
|
else
|
||||||
EnterNewScannerContext(scTag);
|
EnterNewScannerContext(scTag);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
@ -206,6 +232,17 @@ begin
|
|||||||
'<':
|
'<':
|
||||||
begin
|
begin
|
||||||
Inc(BufferPos);
|
Inc(BufferPos);
|
||||||
|
if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='[') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 8);
|
||||||
|
EnterNewScannerContext(scCData);
|
||||||
|
end
|
||||||
|
else if (Buffer[BufferPos]='!') and (Buffer[BufferPos + 1]='-') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 3);
|
||||||
|
EnterNewScannerContext(scComment);
|
||||||
|
end
|
||||||
|
else
|
||||||
EnterNewScannerContext(scTag);
|
EnterNewScannerContext(scTag);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
@ -214,6 +251,28 @@ begin
|
|||||||
Inc(BufferPos);
|
Inc(BufferPos);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
scCData:
|
||||||
|
if (Buffer[BufferPos] = ']') and (Buffer[BufferPos + 1]=']') and (Buffer[BufferPos + 2]='>') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 3);
|
||||||
|
EnterNewScannerContext(scUnknown);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
FRawTokenText := FRawTokenText + Buffer[BufferPos];
|
||||||
|
Inc(BufferPos);
|
||||||
|
end;
|
||||||
|
scComment:
|
||||||
|
if (Buffer[BufferPos] = '-') and (Buffer[BufferPos + 1]='-') and (Buffer[BufferPos + 2]='>') then
|
||||||
|
begin
|
||||||
|
Inc(BufferPos, 3);
|
||||||
|
EnterNewScannerContext(scUnknown);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
FRawTokenText := FRawTokenText + Buffer[BufferPos];
|
||||||
|
Inc(BufferPos);
|
||||||
|
end;
|
||||||
scEntityReference:
|
scEntityReference:
|
||||||
if Buffer[BufferPos] = ';' then
|
if Buffer[BufferPos] = ';' then
|
||||||
begin
|
begin
|
||||||
@ -353,8 +412,11 @@ begin
|
|||||||
case ScannerContext of
|
case ScannerContext of
|
||||||
scWhitespace:
|
scWhitespace:
|
||||||
DoIgnorableWhitespace(PSAXChar(TokenText), 0, Length(TokenText));
|
DoIgnorableWhitespace(PSAXChar(TokenText), 0, Length(TokenText));
|
||||||
scText:
|
scText,
|
||||||
|
scCData:
|
||||||
DoCharacters(PSAXChar(TokenText), 0, Length(TokenText));
|
DoCharacters(PSAXChar(TokenText), 0, Length(TokenText));
|
||||||
|
scComment:
|
||||||
|
DoComment(PSAXChar(TokenText), 0, Length(TokenText));
|
||||||
scEntityReference:
|
scEntityReference:
|
||||||
begin
|
begin
|
||||||
if (Length(TokenText) >= 2) and (TokenText[1] = '#') and
|
if (Length(TokenText) >= 2) and (TokenText[1] = '#') and
|
||||||
@ -459,6 +521,17 @@ begin
|
|||||||
FNodeBuffer.Add(NodeInfo);
|
FNodeBuffer.Add(NodeInfo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TXMLToDOMConverter.ReaderComment(Sender: TObject;
|
||||||
|
const ch: PSAXChar; Start, Count: Integer);
|
||||||
|
var
|
||||||
|
NodeInfo: TXMLNodeInfo;
|
||||||
|
begin
|
||||||
|
NodeInfo := TXMLNodeInfo.Create;
|
||||||
|
NodeInfo.NodeType := ntComment;
|
||||||
|
NodeInfo.DOMNode := FDocument.CreateCommentBuf(ch, Count);
|
||||||
|
FNodeBuffer.Add(NodeInfo);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TXMLToDOMConverter.ReaderIgnorableWhitespace(Sender: TObject;
|
procedure TXMLToDOMConverter.ReaderIgnorableWhitespace(Sender: TObject;
|
||||||
const ch: PSAXChar; Start, Count: Integer);
|
const ch: PSAXChar; Start, Count: Integer);
|
||||||
var
|
var
|
||||||
|
Loading…
Reference in New Issue
Block a user