Fix HtmlEntity.DeEntitize duplicating '#' on invalid numeric entities
When a numeric character reference (&#...;) fails to parse, the catch block restored the text as "&#" + e where e already begins with '#', producing a doubled '#' (for example "&#foo;" became "&##foo;"). Restore the original text as "&" + e + ";" to match the named-entity fallback and keep DeEntitize idempotent for unparseable numeric entities.
This commit is contained in:
1 parent
8fcdf400eb
commit
56dba32abf
2 files changed
+27
-1
No files matched your search
@@ -663,7 +663,8 @@ namespace HtmlAgilityPack
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
sb.Append("&#" + e + ";");
|
// 'e' already starts with '#', so prepending "&#" would duplicate it.
|
||||||
|
sb.Append("&" + e + ";");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace HtmlAgilityPack.Tests.NetStandard2_0
|
||||||
|
{
|
||||||
|
public class HtmlEntityDeEntitizeTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
// Invalid numeric entities must be left untouched; "&#foo;" used to become
|
||||||
|
// "&##foo;".
|
||||||
|
[InlineData("&#foo;", "&#foo;")]
|
||||||
|
[InlineData("&#xGG;", "&#xGG;")]
|
||||||
|
[InlineData("&#;", "&#;")]
|
||||||
|
[InlineData("prefix &#foo; suffix", "prefix &#foo; suffix")]
|
||||||
|
// Valid numeric entities keep decoding correctly.
|
||||||
|
[InlineData("A", "A")]
|
||||||
|
[InlineData("A", "A")]
|
||||||
|
// Named entities are unaffected.
|
||||||
|
[InlineData("&", "&")]
|
||||||
|
[InlineData("¬real;", "¬real;")]
|
||||||
|
public void DeEntitize_HandlesInvalidNumericEntitiesWithoutDuplicatingHash(string input, string expected)
|
||||||
|
{
|
||||||
|
Assert.Equal(expected, HtmlEntity.DeEntitize(input));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user