mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 23:49:22 +02:00
XML writer: split CDATA sections at the ']]>' sequence.
git-svn-id: trunk@14186 -
This commit is contained in:
parent
60a9ef963d
commit
5c60f0e9e2
@ -316,6 +316,7 @@ end;
|
|||||||
const
|
const
|
||||||
AttrSpecialChars = ['<', '"', '&', #9, #10, #13];
|
AttrSpecialChars = ['<', '"', '&', #9, #10, #13];
|
||||||
TextSpecialChars = ['<', '>', '&'];
|
TextSpecialChars = ['<', '>', '&'];
|
||||||
|
CDSectSpecialChars = [']'];
|
||||||
|
|
||||||
procedure TXMLWriter.ConvWrite(const s: WideString; const SpecialChars: TSetOfChar;
|
procedure TXMLWriter.ConvWrite(const s: WideString; const SpecialChars: TSetOfChar;
|
||||||
const SpecialCharCallback: TSpecialCharCallback);
|
const SpecialCharCallback: TSpecialCharCallback);
|
||||||
@ -372,6 +373,19 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure CDSectSpecialCharCallback(Sender: TXMLWriter; const s: DOMString;
|
||||||
|
var idx: Integer);
|
||||||
|
begin
|
||||||
|
if (idx <= Length(s)-2) and (s[idx+1] = ']') and (s[idx+2] = '>') then
|
||||||
|
begin
|
||||||
|
Sender.wrtStr(']]]]><![CDATA[>');
|
||||||
|
Inc(idx, 2);
|
||||||
|
// TODO: emit warning 'cdata-section-splitted'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Sender.wrtChr(s[idx]);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.WriteNode(node: TDOMNode);
|
procedure TXMLWriter.WriteNode(node: TDOMNode);
|
||||||
begin
|
begin
|
||||||
case node.NodeType of
|
case node.NodeType of
|
||||||
@ -598,7 +612,7 @@ begin
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
wrtChars('<![CDATA[', 9);
|
wrtChars('<![CDATA[', 9);
|
||||||
wrtStr(TDOMCharacterData(node).Data);
|
ConvWrite(TDOMCharacterData(node).Data, CDSectSpecialChars, @CDSectSpecialCharCallback);
|
||||||
wrtChars(']]>', 3);
|
wrtChars(']]>', 3);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user