Webiant Logo Webiant Logo
  1. No results found.

    Try your search with a different keyword or use * as a wildcard.

CodeFormatHelper.cs

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 }