using System.Net; using System.Text.RegularExpressions; namespace Nop.Services.Html.CodeFormatter; /// /// Represents a code format helper /// public partial class CodeFormatHelper { #region Fields protected static readonly Regex _regexHtml = new("<[^>]*>", RegexOptions.Compiled); protected static readonly Regex _regexCode = new(@"\[code\](?(.*?))\[/code\]", RegexOptions.Compiled | RegexOptions.IgnoreCase); #endregion #region Utilities /// /// Code evaluator method /// /// Match /// Formatted text protected static string CodeEvaluatorSimple(Match match) { if (!match.Success) return match.Value; var options = new HighlightOptions { Language = "c#", Code = match.Groups["inner"].Value, DisplayLineNumbers = false, Title = string.Empty, AlternateLineNumbers = false }; var result = match.Value; result = Highlight(options, result); return result; } /// /// Strips HTML /// /// HTML /// Formatted text protected static string StripHtml(string html) { if (string.IsNullOrEmpty(html)) return string.Empty; return _regexHtml.Replace(html, string.Empty); } /// /// Returns the formatted text. /// /// Whatever options were set in the regex groups. /// Send the e.body so it can get formatted. /// The formatted string of the match. protected static string Highlight(HighlightOptions options, string text) { switch (options.Language) { case "c#": var csf = new CSharpFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; return WebUtility.HtmlDecode(csf.FormatCode(text)); case "vb": var vbf = new VisualBasicFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; return vbf.FormatCode(text); case "js": var jsf = new JavaScriptFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; return WebUtility.HtmlDecode(jsf.FormatCode(text)); case "html": var htmlf = new HtmlFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; text = StripHtml(text).Trim(); var code = htmlf.FormatCode(WebUtility.HtmlDecode(text)).Trim(); return code.Replace("\r\n", "
").Replace("\n", "
"); case "xml": var xmlf = new HtmlFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; text = text.Replace("
", "\r\n"); text = StripHtml(text).Trim(); var xml = xmlf.FormatCode(WebUtility.HtmlDecode(text)).Trim(); return xml.Replace("\r\n", "
").Replace("\n", "
"); case "tsql": var tsqlf = new TsqlFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; return WebUtility.HtmlDecode(tsqlf.FormatCode(text)); case "msh": var mshf = new MshFormat { LineNumbers = options.DisplayLineNumbers, Alternate = options.AlternateLineNumbers }; return WebUtility.HtmlDecode(mshf.FormatCode(text)); } return string.Empty; } #endregion #region Methods /// /// Formats the text /// /// Text /// Formatted text public static string FormatTextSimple(string text) { if (string.IsNullOrEmpty(text)) return string.Empty; if (!text.Contains("[/code]")) return text; text = _regexCode.Replace(text, CodeEvaluatorSimple); text = _regexCode.Replace(text, "$1"); return text; } #endregion }