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));
}
}
}