Files
RedHotRoast-ios/Assets/SGModule/MarkdownKit/SGModule/Scripts/MarkdownConvert.cs
T

125 lines
5.5 KiB
C#

using System.Text.RegularExpressions;
namespace SGModule.MarkdownKit {
public static class MarkdownConvert {
/// <summary>
/// 将md转换为富文本标签
/// </summary>
/// <param name="markdown"></param>
/// <returns></returns>
public static string ToRichText(string markdown) {
// 移除每一行行尾的多余空格和制表符
markdown = Regex.Replace(markdown, @"[ \t]+$", "");
// 标题替换 (支持 "#### " 等不同级别的标题)
markdown = Regex.Replace(markdown, @"^(#{1,6})\s*(.+)$", match => {
var level = match.Groups[1].Value.Length; // 获取标题级别
var content = match.Groups[2].Value.Trim(); // 去除标题内容的多余空格
// 标题大小规则:越小的标题级别,字体越大
var baseSize = 40; // 默认正文字体大小
var size = baseSize + (6 - level) * 5; // 一级标题最大,六级标题最小
var str = $"<b><size={size}>{content}</size></b>\n";
if (level <= 2) {
str = $"<u>{str}</u>";
}
return str; // 设置标题大小
}, RegexOptions.Multiline);
// 粗体替换 ( **加粗** )
markdown = Regex.Replace(markdown, @"\*\*(.+?)\*\*", "<b>$1</b>");
// 斜体替换 ( *斜体* )
markdown = Regex.Replace(markdown, @"\*(.+?)\*", "<i>$1</i>");
// 下划线替换 ( __下划线__ )
markdown = Regex.Replace(markdown, @"__(.+?)__", "<u>$1</u>");
// 删除线替换 ( ~~删除线~~ )
markdown = Regex.Replace(markdown, @"~~(.+?)~~", "<s>$1</s>");
// 超链接替换 ( [文字](链接) )
markdown = Regex.Replace(markdown, @"\[(.+?)\]\((.+?)\)", "<a href='$2'>$1</a>");
// 无序列表替换 ( - 或 * 开头)
markdown = Regex.Replace(markdown, @"^\s*[-*]\s+(.+)$", match => {
var content = match.Groups[1].Value.Trim();
return $"• {content}"; // 使用 • 作为无序列表的符号
}, RegexOptions.Multiline);
// 有序列表替换 ( 1. 或 2. 开头)
markdown = Regex.Replace(markdown, @"^\s*\d+\.\s+(.+)$", match => {
var content = match.Groups[1].Value.Trim();
return $"<b>{content}</b>"; // 有序列表使用加粗标记
}, RegexOptions.Multiline);
// 移除多余的连续空行 (将多个空行压缩为一个空行)
markdown = Regex.Replace(markdown, @"(\r?\n){2,}", "\n");
return markdown;
}
/// <summary>
/// 将md文本转换为UBB语法的富文本
/// </summary>
/// <param name="markdown"></param>
/// <param name="textBaseSize"></param>
/// <returns></returns>
public static string ToUBB(string markdown, int textBaseSize) {
// 移除每一行行尾的多余空格和制表符
markdown = Regex.Replace(markdown, @"[ \t]+$", "");
// 标题替换 (支持 "#### " 等不同级别的标题)
markdown = Regex.Replace(markdown, @"^(#{1,6})\s*(.+)$", match => {
var level = match.Groups[1].Value.Length; // 获取标题级别
var content = match.Groups[2].Value.Trim(); // 去除标题内容的多余空格
// 标题大小规则:越小的标题级别,字体越大
var baseSize = textBaseSize; // 默认正文字体大小
var size = baseSize + (6 - level) * 3; // 一级标题最大,六级标题最小
var str = $"[b][size={size}]{content}[/size][/b]\n";
if (level <= 2) {
str = $"[u]{str}[/u]";
}
return str; // 设置标题大小
}, RegexOptions.Multiline);
// 粗体替换 ( **加粗** -> [b]加粗[/b])
markdown = Regex.Replace(markdown, @"\*\*(.+?)\*\*", "[b]$1[/b]");
// 斜体替换 ( *斜体* -> [i]斜体[/i])
markdown = Regex.Replace(markdown, @"\*(.+?)\*", "[i]$1[/i]");
// 下划线替换 ( __下划线__ -> [u]下划线[/u])
markdown = Regex.Replace(markdown, @"__(.+?)__", "[u]$1[/u]");
// 删除线替换 ( ~~删除线~~ -> [s]删除线[/s])
markdown = Regex.Replace(markdown, @"~~(.+?)~~", "[s]$1[/s]");
// 超链接替换 ( [文字](链接) -> [url=链接]文字[/url])
markdown = Regex.Replace(markdown, @"\[(.+?)\]\((.+?)\)", "[url=$2]$1[/url]");
// 无序列表替换 ( - 或 * 开头 -> • 项目内容)
markdown = Regex.Replace(markdown, @"^\s*[-*]\s+(.+)$", match => {
var content = match.Groups[1].Value.Trim();
return $"• {content}"; // 使用 • 作为无序列表的符号
}, RegexOptions.Multiline);
// 有序列表替换 ( 1. 或 2. 开头 -> 加粗项目内容)
markdown = Regex.Replace(markdown, @"^\s*\d+\.\s+(.+)$", match => {
var content = match.Groups[1].Value.Trim();
return $"[b]{content}[/b]"; // 有序列表使用加粗标记
}, RegexOptions.Multiline);
// 移除多余的连续空行 (将多个空行压缩为一个空行)
markdown = Regex.Replace(markdown, @"(\r?\n){2,}", "\n");
return markdown;
}
}
}