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
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}";
|
|
}
|
|
}
|
|
}
|