Split extension methods into separate classes (#161)
This PR splits the extension methods contained in `Extensions.cs` into separate classes in the `Octobot.Extensions` namespace. This was done for multiple reasons: 1) The `Extensions.cs` violates SRP (Single Responsibility Principle) - it takes upon itself every extension method for many types 2) Having a separate class for each extended type is a standard practice - take a look at [Remora.Discord](https://github.com/Remora/Remora.Discord/tree/main/Backend/Remora.Discord.Rest/Extensions) or [osu!](https://github.com/ppy/osu/tree/master/osu.Game/Extensions) 3) Having all extension methods in one file makes it hard to find the method you want
This commit is contained in:
parent
20eac79380
commit
e6f53b13f0
31 changed files with 452 additions and 371 deletions
52
src/Extensions/StringExtensions.cs
Normal file
52
src/Extensions/StringExtensions.cs
Normal file
|
@ -0,0 +1,52 @@
|
|||
using System.Net;
|
||||
using Remora.Discord.Extensions.Formatting;
|
||||
|
||||
namespace Octobot.Extensions;
|
||||
|
||||
public static class StringExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Sanitizes a string for use in <see cref="Markdown.BlockCode(string)" /> by inserting zero-width spaces in between
|
||||
/// symbols used to format the string with block code.
|
||||
/// </summary>
|
||||
/// <param name="s">The string to sanitize.</param>
|
||||
/// <returns>The sanitized string that can be safely used in <see cref="Markdown.BlockCode(string)" />.</returns>
|
||||
private static string SanitizeForBlockCode(this string s)
|
||||
{
|
||||
return s.Replace("```", "```");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sanitizes a string (see <see cref="SanitizeForBlockCode" />) and formats the string to use Markdown Block Code
|
||||
/// formatting with a specified
|
||||
/// language for syntax highlighting.
|
||||
/// </summary>
|
||||
/// <param name="s">The string to sanitize and format.</param>
|
||||
/// <param name="language"></param>
|
||||
/// <returns>
|
||||
/// The sanitized string formatted to use Markdown Block Code with a specified
|
||||
/// language for syntax highlighting.
|
||||
/// </returns>
|
||||
public static string InBlockCode(this string s, string language = "")
|
||||
{
|
||||
s = s.SanitizeForBlockCode();
|
||||
return
|
||||
$"```{language}\n{s.SanitizeForBlockCode()}{(s.EndsWith("`", StringComparison.Ordinal) || string.IsNullOrWhiteSpace(s) ? " " : "")}```";
|
||||
}
|
||||
|
||||
public static string Localized(this string key)
|
||||
{
|
||||
return Messages.ResourceManager.GetString(key, Messages.Culture) ?? key;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encodes a string to allow its transmission in request headers.
|
||||
/// </summary>
|
||||
/// <remarks>Used when encountering "Request headers must contain only ASCII characters".</remarks>
|
||||
/// <param name="s">The string to encode.</param>
|
||||
/// <returns>An encoded string with spaces kept intact.</returns>
|
||||
public static string EncodeHeader(this string s)
|
||||
{
|
||||
return WebUtility.UrlEncode(s).Replace('+', ' ');
|
||||
}
|
||||
}
|
Reference in a new issue