From 913fc9dcded9aa75b4fd53a74e611757850cf888 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Tue, 9 Dec 2025 16:40:38 +0100 Subject: [PATCH] feat: support XML formatting in grid popup text editor --- source/texteditor.pas | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/source/texteditor.pas b/source/texteditor.pas index 1d98bb2a..eb85bf77 100644 --- a/source/texteditor.pas +++ b/source/texteditor.pas @@ -9,6 +9,7 @@ uses ComCtrls, Dialogs, SysUtils, Menus, LCLType, apphelpers, ActnList, extra_controls, ExtCtrls, dbconnection, SynEdit, SynEditHighlighter, customize_highlighter, + Laz2_DOM, Laz2_XMLRead, Laz2_XMLWrite, reformatter, jsonparser, extfiledialog, SynHighlighterBat, @@ -455,8 +456,8 @@ end; procedure TfrmTextEditor.menuFormatCodeOnceClick(Sender: TObject); var JsonParser: TJSONParser; - //Xml: TXmlVerySimple; - //XmlTmp: IXMLDocument; + Doc: TXMLDocument; + InStream, OutStream: TStringStream; begin // Reformat code if possible try @@ -475,23 +476,26 @@ begin MemoText.SelEnd := 0; frmReformatter.Free; end - {else if FHighlighter is TSynXMLSyn then begin - XmlTmp := TXMLDocument.Create(nil); - XmlTmp.LoadFromXML(MemoText.Text); - MemoText.BeginUpdate; - MemoText.Text := XMLDoc.FormatXMLData(MemoText.Text); - MemoText.EndUpdate; - Xml := TXmlVerySimple.Create; - //Xml.Options := [doNodeAutoIndent, doParseProcessingInstr, doCaseInsensitive, doWriteBOM, doSimplifyTextNodes]; - Xml.Clear; - Xml.Text := MemoText.Lines.Text.Trim; - MemoText.BeginUpdate; - MemoText.Lines.Text := Xml.Text; - MemoText.EndUpdate; - Xml.Free; - MemoText.SelStart := 0; - MemoText.SelLength := 0; - end} + else if FHighlighter is TSynXMLSyn then begin + InStream := TStringStream.Create(MemoText.Text); + OutStream := TStringStream.Create(''); + try + ReadXMLFile(Doc, InStream); // parse XML + try + WriteXMLFile(Doc, OutStream); // pretty-print XML + finally + Doc.Free; + end; + MemoText.BeginUpdate; + MemoText.Text := OutStream.DataString; // show formatted XML + MemoText.EndUpdate; + MemoText.SelStart := 0; + MemoText.SelEnd := 0; + finally + InStream.Free; + OutStream.Free; + end; + end else begin Beep; end;