Merge branch 'master' into business
大石头 authored at 2024-10-29 10:27:40
3.30 KiB
AntJob
using NewLife;
using NewLife.Collections;

namespace AntJob.Data;

/// <summary>模板助手</summary>
public static class TemplateHelper
{
    /// <summary>使用时间参数处理模板</summary>
    /// <param name="template"></param>
    /// <param name="startTime"></param>
    /// <param name="endTime"></param>
    /// <returns></returns>
    public static String Build(String template, DateTime startTime, DateTime endTime)
    {
        if (template.IsNullOrEmpty()) return template;

        var str = template;
        var sb = Pool.StringBuilder.Get();
        var p = 0;
        while (true)
        {
            var ti = Find(str, "DataTime", p);
            if (ti.IsEmpty) ti = Find(str, "dt", p);
            if (ti.IsEmpty)
            {
                sb.Append(str.Substring(p));
                break;
            }

            // 准备替换
            var val = ti.Format.IsNullOrEmpty() ? startTime.ToFullString() : startTime.ToString(ti.Format);
            sb.Append(str.Substring(p, ti.Start - p));
            sb.Append(val);

            // 移动指针
            p = ti.End + 1;
        }

        str = sb.ToString();
        sb.Clear();
        p = 0;
        while (true)
        {
            var ti = Find(str, "End", p);
            if (ti.IsEmpty)
            {
                sb.Append(str.Substring(p));
                break;
            }

            // 准备替换
            var val = ti.Format.IsNullOrEmpty() ? endTime.ToFullString() : endTime.ToString(ti.Format);
            sb.Append(str.Substring(p, ti.Start - p));
            sb.Append(val);

            // 移动指针
            p = ti.End + 1;
        }

        return sb.Put(true);
    }

    private static VarItem Find(String str, String key, Int32 p)
    {
        // 头尾
        var p1 = str.IndexOf("{" + key, p);
        if (p1 < 0) return _empty;

        var p2 = str.IndexOf("}", p1);
        if (p2 < 0) return _empty;

        // 格式化字符串
        var format = "";
        var p3 = str.IndexOf(":", p1);
        if (p3 > 0 && p3 < p2) format = str.Substring(p3 + 1, p2 - p3 - 1);

        // 左括号位置,右括号位置,格式化字符串
        return new VarItem(p1, p2, format);
    }

    private static VarItem _empty = new(-1, -1, "");
    struct VarItem(Int32 start, Int32 end, String format)
    {
        public Int32 Start = start;
        public Int32 End = end;
        public String Format = format;

        public readonly Boolean IsEmpty => Start < 0;
    }

    /// <summary>使用消息数组处理模板</summary>
    /// <param name="template"></param>
    /// <param name="messages"></param>
    /// <returns></returns>
    public static String Build(String template, String[] messages)
    {
        if (template.IsNullOrEmpty()) return template;

        var str = template;
        var sb = Pool.StringBuilder.Get();
        var p = 0;
        while (true)
        {
            var p1 = str.IndexOf("{Message}", p);
            if (p1 < 0)
            {
                sb.Append(str.Substring(p));
                break;
            }

            // 准备替换
            var val = messages.Join();
            sb.Append(str.Substring(p, p1 - p));
            sb.Append(val);

            // 移动指针
            p = p1 + "{Message}".Length;
        }

        return sb.Put(true);
    }
}