You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.8 KiB

using System.Text;
namespace Discord
{
/// <summary> A helper class for formatting characters. </summary>
public static class Format
{
// Characters which need escaping
private static readonly string[] SensitiveCharacters = { "\\", "*", "_", "~", "`", "|", ">" };
/// <summary> Returns a markdown-formatted string with bold formatting. </summary>
public static string Bold(string text) => $"**{text}**";
/// <summary> Returns a markdown-formatted string with italics formatting. </summary>
public static string Italics(string text) => $"*{text}*";
/// <summary> Returns a markdown-formatted string with underline formatting. </summary>
public static string Underline(string text) => $"__{text}__";
/// <summary> Returns a markdown-formatted string with strikethrough formatting. </summary>
public static string Strikethrough(string text) => $"~~{text}~~";
/// <summary> Returns a string with spoiler formatting. </summary>
public static string Spoiler(string text) => $"||{text}||";
/// <summary> Returns a markdown-formatted URL. Only works in <see cref="EmbedBuilder"/> descriptions and fields. </summary>
public static string Url(string text, string url) => $"[{text}]({url})";
/// <summary> Escapes a URL so that a preview is not generated. </summary>
public static string EscapeUrl(string url) => $"<{url}>";
/// <summary> Returns a markdown-formatted string with codeblock formatting. </summary>
public static string Code(string text, string language = null)
{
if (language != null || text.Contains("\n"))
return $"```{language ?? ""}\n{text}\n```";
else
return $"`{text}`";
}
/// <summary> Sanitizes the string, safely escaping any Markdown sequences. </summary>
public static string Sanitize(string text)
{
foreach (string unsafeChar in SensitiveCharacters)
text = text.Replace(unsafeChar, $"\\{unsafeChar}");
return text;
}
/// <summary>
/// Formats a string as a quote.
/// </summary>
/// <param name="text">The text to format.</param>
/// <returns>Gets the formatted quote text.</returns>
public static string Quote(string text)
{
// do not modify null or whitespace text
// whitespace does not get quoted properly
if (string.IsNullOrWhiteSpace(text))
return text;
StringBuilder result = new StringBuilder();
int startIndex = 0;
int newLineIndex;
do
{
newLineIndex = text.IndexOf('\n', startIndex);
if (newLineIndex == -1)
{
// read the rest of the string
var str = text.Substring(startIndex);
result.Append($"> {str}");
}
else
{
// read until the next newline
var str = text.Substring(startIndex, newLineIndex - startIndex);
result.Append($"> {str}\n");
}
startIndex = newLineIndex + 1;
}
while (newLineIndex != -1 && startIndex != text.Length);
return result.ToString();
}
/// <summary>
/// Formats a string as a block quote.
/// </summary>
/// <param name="text">The text to format.</param>
/// <returns>Gets the formatted block quote text.</returns>
public static string BlockQuote(string text)
{
// do not modify null or whitespace
if (string.IsNullOrWhiteSpace(text))
return text;
return $">>> {text}";
}
}
}