AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="0.16.0" />

 PrettyMarkupFormatter

Represents the an HTML5 markup formatter with inserted indents.
using AngleSharp.Dom; using AngleSharp.Text; using System; using System.Linq; using System.Runtime.CompilerServices; namespace AngleSharp.Html { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public class PrettyMarkupFormatter : HtmlMarkupFormatter { private string _indentString; private string _newLineString; private int _indentCount; public string Indentation { get { return _indentString; } set { _indentString = value; } } public string NewLine { get { return _newLineString; } set { _newLineString = value; } } public PrettyMarkupFormatter() { _indentCount = 0; _indentString = "\t"; _newLineString = "\n"; } public override string Comment(IComment comment) { return IndentBefore() + base.Comment(comment); } public override string Doctype(IDocumentType doctype) { string str = string.Empty; if (doctype.ParentElement != null) str = IndentBefore(); return str + base.Doctype(doctype) + NewLine; } public override string Processing(IProcessingInstruction processing) { return IndentBefore() + base.Processing(processing); } public override string Text(ICharacterData text) { string data = text.Data; string str = string.Empty; string text2 = data.Replace('\n', ' '); if (!(text.NextSibling is ICharacterData)) text2 = text2.TrimEnd(Array.Empty<char>()); if (text2.Length > 0 && !(text.PreviousSibling is ICharacterData) && text2[0].IsSpaceCharacter()) { text2 = text2.TrimStart(Array.Empty<char>()); str = IndentBefore(); } return str + HtmlMarkupFormatter.EscapeText(text2); } public override string OpenTag(IElement element, bool selfClosing) { string str = string.Empty; IText text = element.PreviousSibling as IText; if (element.ParentElement != null && (text == null || EndsWithSpace(text))) str = IndentBefore(); _indentCount++; return str + base.OpenTag(element, selfClosing); } public override string CloseTag(IElement element, bool selfClosing) { _indentCount--; string str = string.Empty; IText text = element.LastChild as IText; if (element.HasChildNodes && (text == null || EndsWithSpace(text))) str = IndentBefore(); return str + base.CloseTag(element, selfClosing); } private static bool EndsWithSpace(ICharacterData text) { string data = text.Data; if (data.Length > 0) return data[data.Length - 1].IsSpaceCharacter(); return false; } private string IndentBefore() { return _newLineString + string.Join(string.Empty, Enumerable.Repeat(_indentString, _indentCount)); } } }