From bf1f7b6ea6707b602ab4a50e09609287f8e0c853 Mon Sep 17 00:00:00 2001 From: Kryvich <44714498+Kryuski@users.noreply.github.com> Date: Sat, 8 Mar 2025 01:11:36 +0300 Subject: [PATCH] function InsertBefore - Inserts a child to this node --- Neslib.Xml.pas | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/Neslib.Xml.pas b/Neslib.Xml.pas index e04a5e9..9d04671 100644 --- a/Neslib.Xml.pas +++ b/Neslib.Xml.pas @@ -281,6 +281,7 @@ TEnumerator = record private procedure Free; procedure InternalAddChild(const AChild: TXmlNode); + procedure InternalInsertBefore(const AChild, AReferenceChild: TXmlNode); function InternalAddAttribute(const ANameIndex: Integer; const AValue: XmlString): TXmlAttribute; function GetBlock: PByte; inline; {$ENDREGION 'Internal Declarations'} @@ -460,6 +461,19 @@ TEnumerator = record This is a shortcut for AddChild(TXmlNodeType.Comment, AComment). } function AddComment(const AComment: XmlString): TXmlNode; inline; + { Inserts a child to this node. + + Parameters: + AType: the type of node to add. + AValue: the value of the node (depending on AType). + AReferenceChild: The node before which new node is inserted. + If it is null, the new node is inserted at the end of node's child nodes. + + Returns: + The newly inserted child node, or nil in case this node is nil.} + function InsertBefore(const AType: TXmlNodeType; const AValue: XmlString; + const AReferenceChild: TXmlNode): TXmlNode; + { Removes a child element with a given name. Parameters: @@ -1226,6 +1240,22 @@ function TXmlNode.AddText(const AText: XmlString): TXmlNode; Result := AddChild(TXmlNodeType.Text, AText); end; +function TXmlNode.InsertBefore(const AType: TXmlNodeType; + const AValue: XmlString; const AReferenceChild: TXmlNode): TXmlNode; +begin + if (FNode = nil) then + begin + Result.FNode := nil; + Exit; + end; + + var Doc := GetDocument; + Assert(Doc <> nil); + Result := Doc.CreateNode(AType); + InternalInsertBefore(Result, AReferenceChild); + Result.SetValue(AValue); +end; + function TXmlNode.AddAttribute(const AName: XmlString; const AValue: Single): TXmlAttribute; begin @@ -1703,6 +1733,27 @@ procedure TXmlNode.InternalAddChild(const AChild: TXmlNode); end; end; +procedure TXmlNode.InternalInsertBefore(const AChild, + AReferenceChild: TXmlNode); +begin + Assert(FNode <> nil); + Assert(NodeType = TXmlNodeType.Element); + Assert(AChild <> nil); + + AChild.SetParent(Self); + if AReferenceChild = nil then + InternalAddChild(AChild) + else begin + var Prev := AReferenceChild.GetPrevSibling; + Prev.SetNextSibling(AChild); + AChild.SetPrevSibling(Prev); + AChild.SetNextSibling(AReferenceChild); + AReferenceChild.SetPrevSibling(AChild); + if Prev = nil then + SetFirstChild(AChild); + end; +end; + function TXmlNode.NextSiblingByName(const AElementName: XmlString): TXmlNode; begin Result.FNode := nil;