diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsTextHelper.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsTextHelper.cs
index bb70fab137..6383b3a36f 100644
--- a/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsTextHelper.cs
+++ b/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsTextHelper.cs
@@ -21,6 +21,7 @@ public static string Humanize(string text)
.HumanizeCodeTags()
.HumanizeMultilineCodeTags()
.HumanizeParaTags()
+ .HumanizeBrTags() // must be called after HumanizeParaTags() so that it replaces any additional
tags
.DecodeXml();
}
@@ -108,6 +109,11 @@ private static string HumanizeParaTags(this string text)
return ParaTag().Replace(text, (match) => "
" + match.Groups["display"].Value);
}
+ private static string HumanizeBrTags(this string text)
+ {
+ return BrTag().Replace(text, m => Environment.NewLine);
+ }
+
private static string DecodeXml(this string text)
{
return WebUtility.HtmlDecode(text);
@@ -118,6 +124,7 @@ private static string DecodeXml(this string text)
private const string MultilineCodeTagPattern = @"(?.+?)
";
private const string ParaTagPattern = @"(?.+?)";
private const string HrefPattern = @"(.*)<\/see>";
+ private const string BrPattern = @"(
)"; // handles
,
,
#if NET7_0_OR_GREATER
[GeneratedRegex(RefTagPattern)]
@@ -134,18 +141,23 @@ private static string DecodeXml(this string text)
[GeneratedRegex(HrefPattern)]
private static partial Regex HrefTag();
+
+ [GeneratedRegex(BrPattern)]
+ private static partial Regex BrTag();
#else
private static readonly Regex _refTag = new(RefTagPattern);
private static readonly Regex _codeTag = new(CodeTagPattern);
private static readonly Regex _multilineCodeTag = new(MultilineCodeTagPattern, RegexOptions.Singleline);
private static readonly Regex _paraTag = new(ParaTagPattern, RegexOptions.Singleline);
private static readonly Regex _hrefTag = new(HrefPattern);
+ private static readonly Regex _brTag = new(BrPattern);
private static Regex RefTag() => _refTag;
private static Regex CodeTag() => _codeTag;
private static Regex MultilineCodeTag() => _multilineCodeTag;
private static Regex ParaTag() => _paraTag;
private static Regex HrefTag() => _hrefTag;
+ private static Regex BrTag() => _brTag;
#endif
}
}
diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsTextHelperTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsTextHelperTests.cs
index 7690cd78fd..9464de28ff 100644
--- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsTextHelperTests.cs
+++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsTextHelperTests.cs
@@ -128,10 +128,11 @@ Misplaced Tab Indentation
[InlineData(@" does something", "param1 does something")]
[InlineData("DoWork is a method in TestClass.", "`DoWork` is a method in `TestClass`.")]
[InlineData("DoWork
is a method in \nTestClass\n
.", "```DoWork``` is a method in ```\nTestClass\n```.")]
- [InlineData("This is a paragraph.", "
This is a paragraph.")]
+ [InlineData("This is a paragraph.", "\r\nThis is a paragraph.")]
[InlineData("GET /Todo?iscomplete=true&owner=mike", "GET /Todo?iscomplete=true&owner=mike")]
[InlineData(@"Returns a item.", "Returns a null item.")]
[InlineData(@"ISO currency code", "[ISO currency code](https://www.iso.org/iso-4217-currency-codes.html)")]
+ [InlineData("First line.
Second line.
Third line.
Fourth line.", "First line.\r\nSecond line.\r\nThird line.\r\nFourth line.")]
public void Humanize_HumanizesInlineTags(
string input,
string expectedOutput)