< Summary

Information
Class: TeleFlow.Telegram.Formatting.TelegramHtmlEscaper
Assembly: TeleFlow.Telegram.Client
File(s): /_/src/TeleFlow.Telegram.Client/Formatting/TelegramHtmlEscaper.cs
Line coverage
100%
Covered lines: 26
Uncovered lines: 0
Coverable lines: 26
Total lines: 71
Line coverage: 100%
Branch coverage
95%
Covered branches: 38
Total branches: 40
Branch coverage: 95%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
EscapeText(...)100%11100%
EscapeInterpolation(...)100%11100%
Escape(...)100%2222100%
FindFirstSpecialCharacter(...)88.88%1818100%

File(s)

/_/src/TeleFlow.Telegram.Client/Formatting/TelegramHtmlEscaper.cs

#LineLine coverage
 1using System.Text;
 2
 3namespace TeleFlow.Telegram.Formatting;
 4
 5/// <summary>
 6/// Encodes dynamic values for Telegram HTML text and interpolation boundaries in one pass.
 7/// Text rendering preserves quotes, while general interpolation also prevents values from leaving quoted attributes.
 8/// </summary>
 9internal static class TelegramHtmlEscaper
 10{
 11    public static string EscapeText(string value)
 12    {
 1513        return Escape(value, escapeQuotes: false);
 14    }
 15
 16    public static string EscapeInterpolation(string value)
 17    {
 818        return Escape(value, escapeQuotes: true);
 19    }
 20
 21    private static string Escape(string value, bool escapeQuotes)
 22    {
 2323        var firstSpecialCharacter = FindFirstSpecialCharacter(value, escapeQuotes);
 24
 2325        if (firstSpecialCharacter < 0)
 26        {
 1427            return value;
 28        }
 29
 930        var builder = new StringBuilder(value.Length + 16);
 931        builder.Append(value.AsSpan(0, firstSpecialCharacter));
 32
 17833        for (var index = firstSpecialCharacter; index < value.Length; index++)
 34        {
 8035            var replacement = value[index] switch
 8036            {
 637                '&' => "&amp;",
 438                '<' => "&lt;",
 239                '>' => "&gt;",
 440                '"' when escapeQuotes => "&quot;",
 241                '\'' when escapeQuotes => "&#39;",
 6542                _ => null
 8043            };
 44
 8045            if (replacement is null)
 46            {
 6547                builder.Append(value[index]);
 48            }
 49            else
 50            {
 1551                builder.Append(replacement);
 52            }
 53        }
 54
 955        return builder.ToString();
 56    }
 57
 58    private static int FindFirstSpecialCharacter(string value, bool escapeQuotes)
 59    {
 31260        for (var index = 0; index < value.Length; index++)
 61        {
 14262            if (value[index] is '&' or '<' or '>' ||
 14263                escapeQuotes && (value[index] is '"' or '\''))
 64            {
 965                return index;
 66            }
 67        }
 68
 1469        return -1;
 70    }
 71}