Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/#1029 add emptyTagsToSelfClosing option to xhtml formatter #1031

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/AngleSharp.Core.Tests/Library/XhtmlFormatter.cs
@@ -0,0 +1,55 @@
using AngleSharp.Xhtml;
using NUnit.Framework;

namespace AngleSharp.Core.Tests.Library
{
[TestFixture]
public class XhtmlFormatter
{
[Test]
public void XhtmlMarkupFormatter_DoesNotFormatEmptyElementsToSelfClosing_WhenEmptyTagsToSelfClosingIsFalse()
{
var formatter = new XhtmlMarkupFormatter(false);
var input = "<html>" +
"<head></head>" +
"<body>" +
"<div>test</div>" +
"<div></div>" +
"<div class=\"test\"></div>" +
"</body>" +
"</html>";
var doc = input.ToHtmlDocument();

var res = doc.ToHtml(formatter);

Assert.AreEqual(input, res);
}

[Test]
public void XhtmlMarkupFormatter_FormatsEmptyElementsToSelfClosing_WhenEmptyTagsToSelfClosingIsTrue()
{
var formatter = new XhtmlMarkupFormatter(true);
var input = "<html>" +
"<head></head>" +
"<body>" +
"<div>test</div>" +
"<div></div>" +
"<div class=\"test\"></div>" +
"</body>" +
"</html>";
var expected = "<html>" +
"<head />" +
"<body>" +
"<div>test</div>" +
"<div />" +
"<div class=\"test\" />" +
"</body>" +
"</html>";
var doc = input.ToHtmlDocument();

var res = doc.ToHtml(formatter);

Assert.AreEqual(expected, res);
}
}
}
32 changes: 30 additions & 2 deletions src/AngleSharp/Xhtml/XhtmlMarkupFormatter.cs
Expand Up @@ -18,6 +18,34 @@ public class XhtmlMarkupFormatter : IMarkupFormatter

#endregion

#region Constructors

/// <summary>
/// Default constructor for <see cref="XhtmlMarkupFormatter"/>
/// </summary>
public XhtmlMarkupFormatter() : this(true)
{

}

/// <summary>
/// Constructor for <see cref="XhtmlMarkupFormatter"/>
/// </summary>
/// <param name="emptyTagsToSelfClosing">Specify if empty elements like &lt;div&gt;&lt;/div&gt;
/// should be converted to self-closing ones like &lt;div/&gt;</param>
public XhtmlMarkupFormatter(Boolean emptyTagsToSelfClosing)
{
_emptyTagsToSelfClosing = emptyTagsToSelfClosing;
}

#endregion

#region Private fields

private readonly Boolean _emptyTagsToSelfClosing;

#endregion

#region Methods

/// <inheritdoc />
Expand All @@ -26,7 +54,7 @@ public virtual String CloseTag(IElement element, Boolean selfClosing)
var prefix = element.Prefix;
var name = element.LocalName;
var tag = !String.IsNullOrEmpty(prefix) ? prefix + ":" + name : name;
return (selfClosing || !element.HasChildNodes) ? String.Empty : String.Concat("</", tag, ">");
return (selfClosing || _emptyTagsToSelfClosing && !element.HasChildNodes) ? String.Empty : String.Concat("</", tag, ">");
}

/// <inheritdoc />
Expand Down Expand Up @@ -64,7 +92,7 @@ public virtual String OpenTag(IElement element, Boolean selfClosing)
temp.Append(' ').Append(Attribute(attribute));
}

if (selfClosing || !element.HasChildNodes)
if (selfClosing || _emptyTagsToSelfClosing && !element.HasChildNodes)
{
temp.Append(" /");
}
Expand Down