using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using System.Text.RegularExpressions; 
 | 
using UnityEngine; 
 | 
using UnityEngine.UI; 
 | 
using UnityEngine.EventSystems; 
 | 
using System; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
public class RichText : Text, IPointerClickHandler 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// 最终显示文本 
 | 
    /// </summary> 
 | 
    private string m_OutputText; 
 | 
  
 | 
    private string m_RichText = string.Empty; 
 | 
  
 | 
    public Action OnClick; 
 | 
  
 | 
    #region 对外参数 
 | 
    [SerializeField] 
 | 
    private float m_ImgDeltay = 0; 
 | 
    public float ImgDeltay 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_ImgDeltay; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_ImgDeltay = value; 
 | 
            SetVerticesDirty(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private float m_unlineDeltay = 0; 
 | 
    public float UnlineDeltay 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_unlineDeltay; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_unlineDeltay = value; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private float m_unlineHeight = 1; 
 | 
    public float UnlineHeight 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_unlineHeight; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_unlineHeight = value; 
 | 
        } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private float m_faceSize = 32; 
 | 
    public float FaceSize 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_faceSize; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_faceSize = value; 
 | 
        } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private bool m_unline = true; 
 | 
    public bool Unline 
 | 
    { 
 | 
        get { return m_unline; } 
 | 
        set { m_unline = value; } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private bool m_HrefClick = true; 
 | 
    public bool HrefClick 
 | 
    { 
 | 
        get { return m_HrefClick; } 
 | 
        set { m_HrefClick = value; } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private string m_EnableDisplay; 
 | 
    public string enableDisplay 
 | 
    { 
 | 
        get { return m_EnableDisplay; } 
 | 
        set { m_EnableDisplay = value; } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private bool m_Language = false; 
 | 
    public bool language 
 | 
    { 
 | 
        get { return m_Language; } 
 | 
        set { m_Language = value; } 
 | 
    } 
 | 
    [SerializeField] 
 | 
    private bool m_AutoNewLine = false; 
 | 
    public bool AutoNewLine 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_AutoNewLine; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_AutoNewLine = value; 
 | 
            SetRichTextDirty(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private bool m_LockImgSize = false; 
 | 
    public bool LockImgSize 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_LockImgSize; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            m_LockImgSize = value; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private bool m_ModifyImgSize = false; 
 | 
    public bool ModifyImgSiez 
 | 
    { 
 | 
        get { return m_ModifyImgSize; } 
 | 
        set { m_ModifyImgSize = value; } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private float m_ModifyImgWidth = 0; 
 | 
    public float ModifyImgWidth 
 | 
    { 
 | 
        get { return m_ModifyImgWidth; } 
 | 
        set { m_ModifyImgWidth = value; } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private float m_ModifyImgHeight = 0; 
 | 
    public float ModifyImgHeight 
 | 
    { 
 | 
        get { return m_ModifyImgHeight; } 
 | 
        set { m_ModifyImgHeight = value; } 
 | 
    } 
 | 
  
 | 
    [SerializeField] 
 | 
    private ColorType m_ColorType = ColorType.Dark; 
 | 
    public ColorType colorType 
 | 
    { 
 | 
        get { return m_ColorType; } 
 | 
        set { m_ColorType = value; } 
 | 
    } 
 | 
  
 | 
    public enum ColorType 
 | 
    { 
 | 
        Dark, 
 | 
        Bright, 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    protected override void Awake() 
 | 
    { 
 | 
#if UNITY_EDITOR 
 | 
        if (UnityEditor.PrefabUtility.GetPrefabType(this) == UnityEditor.PrefabType.Prefab) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
#endif  
 | 
        unline = transform.GetComponentInChildren<TextUnline>(); 
 | 
        if (unline == null) 
 | 
        { 
 | 
            GameObject obj = Resources.Load("TextUnline") as GameObject; 
 | 
            // GameObject obj = UILoader.LoadPrefab("TextUnline") as GameObject; 
 | 
            obj = Instantiate(obj); 
 | 
            obj.transform.SetParent(transform); 
 | 
            obj.transform.localScale = Vector3.one; 
 | 
            unline = obj.GetComponent<TextUnline>(); 
 | 
            unline.raycastTarget = false; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    protected override void OnEnable() 
 | 
    { 
 | 
        base.OnEnable(); 
 | 
#if UNITY_EDITOR 
 | 
        if (UnityEditor.PrefabUtility.GetPrefabType(this) == UnityEditor.PrefabType.Prefab) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
#endif  
 | 
        // TODO YYL 配置加载完成与否的判定可能还需要考量 
 | 
        if (language && !string.IsNullOrEmpty(enableDisplay) && Application.isPlaying/* && ConfigInitiator.done*/) 
 | 
        { 
 | 
            text = Language.Get(enableDisplay); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    #region 绘制 
 | 
    private UIVertex vert = new UIVertex(); 
 | 
    protected override void OnPopulateMesh(VertexHelper toFill) 
 | 
    { 
 | 
        if (font == null) return; 
 | 
        toFill.Clear(); 
 | 
        base.OnPopulateMesh(toFill); 
 | 
        CalcBounds(toFill); 
 | 
        #region 修改图片位置 
 | 
        if (m_ImgList == null) return; 
 | 
        for (int i = 0; i < m_ImgList.Count; i++) 
 | 
        { 
 | 
            int _imgEnd = m_ImgList[i].end; 
 | 
            RectTransform rt = m_ImgPool[i].rectTransform; 
 | 
            Vector2 _imgSize = rt.sizeDelta; 
 | 
            if (_imgEnd < toFill.currentIndexCount) 
 | 
            { 
 | 
                try 
 | 
                { 
 | 
                    toFill.PopulateUIVertex(ref vert, _imgEnd); 
 | 
                    rt.localPosition = new Vector2(vert.position.x + _imgSize.x / 2, vert.position.y + _imgSize.y / 2 - m_ImgDeltay); 
 | 
                    toFill.PopulateUIVertex(ref vert, _imgEnd - 3); 
 | 
                    Vector3 pos = vert.position; 
 | 
                    for (int j = _imgEnd, k = _imgEnd - 3; j >= k; j--) 
 | 
                    { 
 | 
                        toFill.PopulateUIVertex(ref vert, j); 
 | 
                        pos.y = Mathf.Min(pos.y, vert.position.y - ImgDeltay); 
 | 
                        vert.position = pos; 
 | 
                        toFill.SetUIVertex(vert, j); 
 | 
                    } 
 | 
                } 
 | 
                catch (System.Exception) 
 | 
                { 
 | 
                    continue; 
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
        #endregion 
 | 
    } 
 | 
  
 | 
    public override void SetVerticesDirty() 
 | 
    { 
 | 
        base.SetVerticesDirty(); 
 | 
#if UNITY_EDITOR 
 | 
        if (UnityEditor.PrefabUtility.GetPrefabType(this) == UnityEditor.PrefabType.Prefab) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
#endif  
 | 
        //m_OutputText = GetOutputText(m_RichText); 
 | 
  
 | 
        GenerateImg(); 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 解析 
 | 
    private string GetOutputText(string _text) 
 | 
    { 
 | 
        string result = _text; 
 | 
        result = GetExtenalData(result); 
 | 
        result = GetTaskInfo(result); 
 | 
        result = RichTextMgr.Inst.Analysis(result, out m_ImgList, out m_HrefList, this); 
 | 
        return result; 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 图片 
 | 
    private List<RichTextMgr.ImgInfo> m_ImgList; 
 | 
    private List<Image> m_ImgPool = new List<Image>(); 
 | 
    private void GenerateImg() 
 | 
    { 
 | 
        if (m_ImgList == null) return; 
 | 
        m_ImgPool.Clear(); 
 | 
        GetComponentsInChildren(true, m_ImgPool); 
 | 
        for (int i = 0; i < m_ImgList.Count; i++) 
 | 
        { 
 | 
            RichTextMgr.ImgInfo imgInfo = m_ImgList[i]; 
 | 
            Image img; 
 | 
            if (i >= m_ImgPool.Count) 
 | 
            { 
 | 
                img = CreateImg(); 
 | 
                m_ImgPool.Add(img); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                img = m_ImgPool[i]; 
 | 
            } 
 | 
            img.SetActive(true); 
 | 
            img.raycastTarget = HrefClick; 
 | 
            img.sprite = imgInfo.sprite; 
 | 
            Vector2 _imgSize = new Vector2(imgInfo.width, imgInfo.height); 
 | 
            img.rectTransform.sizeDelta = _imgSize; 
 | 
            UIFrame frame = img.GetComponent<UIFrame>(); 
 | 
            if (imgInfo.IsFace) 
 | 
            { 
 | 
                if (frame == null) frame = img.gameObject.AddComponent<UIFrame>(); 
 | 
                img.raycastTarget = false; 
 | 
                frame.ResetFrame(imgInfo.spriteName); 
 | 
                frame.enabled = true; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (frame != null) frame.enabled = false; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        for (int i = m_ImgPool.Count - 1; i >= m_ImgList.Count; i--) 
 | 
        { 
 | 
            m_ImgPool[i].SetActive(false); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private Image CreateImg() 
 | 
    { 
 | 
        DefaultControls.Resources res = new DefaultControls.Resources(); 
 | 
        GameObject go = DefaultControls.CreateImage(res); 
 | 
        go.layer = gameObject.layer; 
 | 
        RectTransform rt = go.transform as RectTransform; 
 | 
        if (rt != null) 
 | 
        { 
 | 
            rt.SetParent(rectTransform); 
 | 
            rt.localPosition = Vector3.zero; 
 | 
            rt.localRotation = Quaternion.identity; 
 | 
            rt.localScale = Vector3.one; 
 | 
        } 
 | 
        Image img = go.GetComponent<Image>(); 
 | 
        return img; 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 下划线||超链接 
 | 
    [SerializeField] 
 | 
    private TextUnline unline; 
 | 
    private List<RichTextMgr.HrefInfo> m_HrefList; 
 | 
    private Dictionary<int,float> m_UnlineBottomDict = new Dictionary<int,float>(); 
 | 
    private float GetUnlineHeight(int _line) 
 | 
    { 
 | 
        foreach (var _key in m_UnlineBottomDict.Keys) 
 | 
        { 
 | 
            if (_line <= _key) 
 | 
            { 
 | 
                return m_UnlineBottomDict[_key]; 
 | 
            } 
 | 
        } 
 | 
        return m_UnlineBottomDict.Values.Last(); 
 | 
    } 
 | 
  
 | 
    public string GetHrefMessage(string _key) 
 | 
    { 
 | 
        if (m_HrefList != null) 
 | 
        { 
 | 
            for (int i = 0; i < m_HrefList.Count; i++) 
 | 
            { 
 | 
                if (m_HrefList[i].mSplits.ContainsKey(_key)) 
 | 
                { 
 | 
                    return m_HrefList[i].mSplits[_key]; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return string.Empty; 
 | 
    } 
 | 
  
 | 
    private void CalcBounds(VertexHelper toFill) 
 | 
    { 
 | 
        if (unline != null) unline.ClearVert(); 
 | 
        if (m_HrefList == null) return; 
 | 
        float minBottom = 0; 
 | 
        if (!Unline) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
        m_UnlineBottomDict.Clear(); 
 | 
        int _line = 0; 
 | 
        bool _note = false; 
 | 
        foreach (RichTextMgr.HrefInfo hrefInfo in m_HrefList) 
 | 
        { 
 | 
            CalcUnline(toFill, hrefInfo); 
 | 
            if (!hrefInfo.unline) 
 | 
            { 
 | 
                continue; 
 | 
            } 
 | 
            hrefInfo.lines.Clear(); 
 | 
            for (int i = 0; i < hrefInfo.boxs.Count; i++) 
 | 
            { 
 | 
                Vector3 start = hrefInfo.boxs[i].position; 
 | 
                if (minBottom == 0 && !_note) 
 | 
                { 
 | 
                    minBottom = start.y; 
 | 
                    _note = true; 
 | 
                } 
 | 
                if (Math.Abs(minBottom - start.y) >= fontSize / 2) 
 | 
                { 
 | 
                    m_UnlineBottomDict.Add(_line, minBottom); 
 | 
                    minBottom = start.y; 
 | 
                    _line++; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    minBottom = Mathf.Min(start.y, minBottom); 
 | 
                } 
 | 
                hrefInfo.lines.Add(_line); 
 | 
            } 
 | 
        } 
 | 
        m_UnlineBottomDict.Add(_line, minBottom); 
 | 
        foreach (RichTextMgr.HrefInfo hrefInfo in m_HrefList) 
 | 
        { 
 | 
            if (!hrefInfo.unline) 
 | 
            { 
 | 
                continue; 
 | 
            } 
 | 
            for (int i = 0; i < hrefInfo.boxs.Count; i++) 
 | 
            { 
 | 
                Vector3 start = hrefInfo.boxs[i].position; 
 | 
                var _unlineline = i < hrefInfo.lines.Count ? hrefInfo.lines[i] : 0; 
 | 
                start.y = GetUnlineHeight(_unlineline); 
 | 
                Vector3 end = start; 
 | 
                end.x += hrefInfo.boxs[i].width; 
 | 
                unline.SetUIVertex(start, end, -UnlineDeltay, m_unlineHeight, hrefInfo.unlineColor); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void CalcUnline(VertexHelper toFill, RichTextMgr.HrefInfo hrefInfo) 
 | 
    { 
 | 
        hrefInfo.boxs.Clear(); 
 | 
        if (hrefInfo.start >= toFill.currentIndexCount) return; 
 | 
        try 
 | 
        { 
 | 
            toFill.PopulateUIVertex(ref vert, hrefInfo.start); 
 | 
        } 
 | 
        catch (System.Exception) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
        Vector3 pos = vert.position; 
 | 
        var realStart = hrefInfo.start; 
 | 
        ///-----为了过滤颜色导致多次添加包围盒 
 | 
        while (realStart <= hrefInfo.end) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                toFill.PopulateUIVertex(ref vert, realStart); 
 | 
                if (pos != vert.position) 
 | 
                { 
 | 
                    if (realStart <= hrefInfo.start + 1) 
 | 
                    { 
 | 
                        realStart = hrefInfo.start; 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        pos = vert.position; 
 | 
                    } 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            catch (Exception) 
 | 
            { 
 | 
                return; 
 | 
            } 
 | 
            realStart++; 
 | 
        } 
 | 
        Bounds bounds = new Bounds(pos, Vector3.zero); 
 | 
        int _Cnt = 0; 
 | 
        for (int i = realStart, k = hrefInfo.end; i <= k; i++) 
 | 
        { 
 | 
            if (i >= toFill.currentIndexCount) break; 
 | 
            try 
 | 
            { 
 | 
                toFill.PopulateUIVertex(ref vert, i); 
 | 
            } 
 | 
            catch (System.Exception) 
 | 
            { 
 | 
                break; 
 | 
            } 
 | 
            pos = vert.position; 
 | 
            if (pos.x - 0.1 <= bounds.min.x && _Cnt > 3) 
 | 
            { 
 | 
                hrefInfo.boxs.Add(new Rect(bounds.min, bounds.size)); 
 | 
                bounds = new Bounds(pos, Vector3.zero); 
 | 
                _Cnt = 0; 
 | 
            } 
 | 
            bounds.Encapsulate(pos); 
 | 
            _Cnt++; 
 | 
        } 
 | 
        hrefInfo.boxs.Add(new Rect(bounds.min, bounds.size)); 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 自适应 
 | 
    public override float preferredWidth 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            if (font == null && Application.isPlaying) 
 | 
            { 
 | 
                font = FontUtility.preferred; 
 | 
            } 
 | 
            var settings = GetGenerationSettings(Vector2.zero); 
 | 
            return cachedTextGeneratorForLayout.GetPreferredWidth(m_OutputText, settings) / pixelsPerUnit; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public override float preferredHeight 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            if (font == null && Application.isPlaying) 
 | 
            { 
 | 
                font = FontUtility.preferred; 
 | 
            } 
 | 
            var settings = GetGenerationSettings(new Vector2(rectTransform.rect.size.x, 0.0f)); 
 | 
            float _height = cachedTextGeneratorForLayout.GetPreferredHeight(m_OutputText, settings) / pixelsPerUnit; 
 | 
            return _height; 
 | 
        } 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 外部数据 
 | 
    private static readonly string FORMAT_PATTERN = @"\%s([0-9]+)"; 
 | 
  
 | 
    private ArrayList extenalData = new ArrayList(); 
 | 
  
 | 
    public void SetExtenalData(params object[] msg) 
 | 
    { 
 | 
        extenalData.Clear(); 
 | 
        if (msg != null && msg.Length > 0) 
 | 
        { 
 | 
            extenalData.AddRange(msg); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SetExtenalData(ICollection collection) 
 | 
    { 
 | 
        extenalData.Clear(); 
 | 
        if (collection != null && collection.Count > 0) 
 | 
        { 
 | 
            extenalData.AddRange(collection); 
 | 
            collection = null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private string GetExtenalData(string val) 
 | 
    { 
 | 
        textBuilder.Length = 0; 
 | 
        int index = 0; 
 | 
        if (Regex.IsMatch(val, FORMAT_PATTERN)) 
 | 
        { 
 | 
            foreach (Match match in Regex.Matches(val, FORMAT_PATTERN)) 
 | 
            { 
 | 
                textBuilder.Append(val.Substring(index, match.Index - index)); 
 | 
                int infoIndex = 0; 
 | 
                int.TryParse(match.Groups[1].Value, out infoIndex); 
 | 
                if (extenalData != null && infoIndex < extenalData.Count) 
 | 
                { 
 | 
                    textBuilder.Append(extenalData[infoIndex]); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    textBuilder.Append(0); 
 | 
                } 
 | 
                index = match.Index + match.Length; 
 | 
            } 
 | 
            textBuilder.Append(val.Substring(index, val.Length - index)); 
 | 
            return textBuilder.ToString(); 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            return val; 
 | 
        } 
 | 
    } 
 | 
    #region 任务数据 
 | 
    private Dictionary<string, string> extenalDataDic = null; 
 | 
    private const string Info_Pattern = "{([a-zA-Z0-9_]+)}"; 
 | 
    public void SetReplaceInfo(Dictionary<string, string> _infoDic) 
 | 
    { 
 | 
        extenalDataDic = _infoDic; 
 | 
        SetRichTextDirty(); 
 | 
    } 
 | 
  
 | 
    private string GetTaskInfo(string val) 
 | 
    { 
 | 
        textBuilder.Length = 0; 
 | 
        int index = 0; 
 | 
        if (Regex.IsMatch(val, Info_Pattern)) 
 | 
        { 
 | 
            foreach (Match match in Regex.Matches(val, Info_Pattern)) 
 | 
            { 
 | 
                textBuilder.Append(val.Substring(index, match.Index - index)); 
 | 
                if (extenalDataDic != null && extenalDataDic.ContainsKey(match.Groups[1].Value)) 
 | 
                { 
 | 
                    textBuilder.Append(extenalDataDic[match.Groups[1].Value]); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    textBuilder.Append(0); 
 | 
                } 
 | 
                index = match.Index + match.Length; 
 | 
            } 
 | 
            textBuilder.Append(val.Substring(index, val.Length - index)); 
 | 
            return textBuilder.ToString(); 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            return val; 
 | 
        } 
 | 
    } 
 | 
    #endregion 
 | 
    #endregion 
 | 
  
 | 
    #region 执行事件 
 | 
    public void OnPointerClick(PointerEventData eventData) 
 | 
    { 
 | 
        if (HrefClick) 
 | 
        { 
 | 
            Vector2 lp; 
 | 
            RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, 
 | 
                eventData.position, eventData.pressEventCamera, out lp); 
 | 
            if (m_HrefList != null) 
 | 
            { 
 | 
                foreach (var hrefInfo in m_HrefList) 
 | 
                { 
 | 
                    List<Rect> boxs = hrefInfo.boxs; 
 | 
                    for (int i = 0; i < boxs.Count; i++) 
 | 
                    { 
 | 
                        if (boxs[i].Contains(lp)) 
 | 
                        { 
 | 
                            hrefInfo.Execute(); 
 | 
                            return; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (OnClick != null) OnClick(); 
 | 
    } 
 | 
  
 | 
    public void OnImgClick() 
 | 
    { 
 | 
    } 
 | 
  
 | 
    public void ExcuteHref(int eventIndex = 0, int hrefIndex = 0) 
 | 
    { 
 | 
        if (m_HrefList == null || m_HrefList.Count <= 0 
 | 
            || hrefIndex < 0) return; 
 | 
        if (hrefIndex < m_HrefList.Count) 
 | 
        { 
 | 
            m_HrefList[hrefIndex].Execute(eventIndex); 
 | 
        } 
 | 
    } 
 | 
    #endregion 
 | 
  
 | 
    #region 自适应2 
 | 
    /// <summary> 
 | 
    /// 牺牲了主动换行 
 | 
    /// </summary> 
 | 
    private static StringBuilder textBuilder = new StringBuilder(); 
 | 
  
 | 
    private Dictionary<int, Match> matchDics = new Dictionary<int, Match>(); 
 | 
  
 | 
    private bool IsModifySize(int _index,out int _size) 
 | 
    { 
 | 
        _size = 0; 
 | 
        int _end = 0; 
 | 
        int _before = -1; 
 | 
        foreach (var _key in matchDics.Keys) 
 | 
        { 
 | 
            if (_index < _key) 
 | 
            { 
 | 
                var _match = matchDics[_key]; 
 | 
                if (WordAnalysis.Size_Start_Regex.IsMatch(_match.Value)) 
 | 
                { 
 | 
                    break; 
 | 
                } 
 | 
                else if (WordAnalysis.Size_End_Regex.IsMatch(_match.Value)) 
 | 
                { 
 | 
                    _end = _key; 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (_end != 0) 
 | 
        { 
 | 
            foreach (var _key in matchDics.Keys) 
 | 
            { 
 | 
                if (_key < _end) 
 | 
                { 
 | 
                    var _match = matchDics[_key]; 
 | 
                    if (WordAnalysis.Size_Start_Regex.IsMatch(_match.Value)) 
 | 
                    { 
 | 
                        _before = _key; 
 | 
                    } 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (_before != -1) 
 | 
        { 
 | 
            _size = int.Parse(matchDics[_before].Groups[1].Value); 
 | 
            return true; 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    public void SetFitterSize() 
 | 
    { 
 | 
        string fitterText = m_OutputText; 
 | 
        fitterText = fitterText.Replace("\n", ""); 
 | 
        float width = 0; 
 | 
  
 | 
        textBuilder.Length = 0; 
 | 
        if (null == font && Application.isPlaying) 
 | 
        { 
 | 
            font = FontUtility.preferred; 
 | 
        } 
 | 
        var settings = GetGenerationSettings(Vector2.zero); 
 | 
  
 | 
        float cache = 0; 
 | 
        string part = string.Empty; 
 | 
  
 | 
        float ratio = GetResolutionRatio(); 
 | 
  
 | 
        matchDics.Clear(); 
 | 
  
 | 
        foreach (Match match in ImgAnalysis.Unity_Img_Regex.Matches(fitterText)) 
 | 
        { 
 | 
            if (!matchDics.ContainsKey(match.Index)) 
 | 
            { 
 | 
                matchDics.Add(match.Index, match); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        foreach (Match match in WordAnalysis.Color_Start_Regex.Matches(fitterText)) 
 | 
        { 
 | 
            if (!matchDics.ContainsKey(match.Index)) 
 | 
            { 
 | 
                matchDics.Add(match.Index, match); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        foreach (Match match in WordAnalysis.Color_End_Regex.Matches(fitterText)) 
 | 
        { 
 | 
            if (!matchDics.ContainsKey(match.Index)) 
 | 
            { 
 | 
                matchDics.Add(match.Index, match); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        bool _modifySize = false; 
 | 
        foreach (Match match in WordAnalysis.Size_Start_Regex.Matches(fitterText)) 
 | 
        { 
 | 
            if (!matchDics.ContainsKey(match.Index)) 
 | 
            { 
 | 
                _modifySize = true; 
 | 
                matchDics.Add(match.Index, match); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        foreach (Match match in WordAnalysis.Size_End_Regex.Matches(fitterText)) 
 | 
        { 
 | 
            if (!matchDics.ContainsKey(match.Index)) 
 | 
            { 
 | 
                matchDics.Add(match.Index, match); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        for (int i = 0; i < fitterText.Length; i++) 
 | 
        { 
 | 
            if (matchDics.ContainsKey(i)) 
 | 
            { 
 | 
                Match match = matchDics[i]; 
 | 
                if (ImgAnalysis.Unity_Img_Regex.IsMatch(match.Value)) 
 | 
                { 
 | 
                    width += match.Length; 
 | 
                } 
 | 
                if (WordAnalysis.Color_Start_Regex.IsMatch(match.Value)) 
 | 
                { 
 | 
                    textBuilder.Append(match.Value); 
 | 
                } 
 | 
                else if (WordAnalysis.Color_End_Regex.IsMatch(match.Value)) 
 | 
                { 
 | 
                    textBuilder.Append(match.Value); 
 | 
                } 
 | 
                else if (WordAnalysis.Size_Start_Regex.IsMatch(match.Value)) 
 | 
                { 
 | 
                    textBuilder.Append(match.Value); 
 | 
                } 
 | 
                else if (WordAnalysis.Size_End_Regex.IsMatch(match.Value)) 
 | 
                { 
 | 
                    textBuilder.Append(match.Value); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(match.Value, settings) * ratio; 
 | 
                    if (width + cache > (rectTransform.rect.width - 5)) 
 | 
                    { 
 | 
                        CacluHrefAndImgIndex(Mathf.Max(0, i - 1)); 
 | 
                        textBuilder.Append("\n"); 
 | 
                        width = cache; 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        width += cache; 
 | 
                    } 
 | 
                    textBuilder.Append(match.Value); 
 | 
                } 
 | 
                i += (match.Length - 1); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                var _size = 0; 
 | 
                var _cacheFontSize = fontSize; 
 | 
                if (_modifySize && IsModifySize(i, out _size)) 
 | 
                { 
 | 
                    fontSize = _size; 
 | 
                    settings = GetGenerationSettings(Vector2.zero); 
 | 
                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(fitterText[i].ToString(), settings) * ratio; 
 | 
                    fontSize = _cacheFontSize; 
 | 
                    settings = GetGenerationSettings(Vector2.zero); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(fitterText[i].ToString(), settings) * ratio; 
 | 
                } 
 | 
                if (width + cache > (rectTransform.rect.width - 5)) 
 | 
                { 
 | 
                    CacluHrefAndImgIndex(Mathf.Max(0, i - 1)); 
 | 
                    textBuilder.Append("\n"); 
 | 
                    width = cache; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    width += cache; 
 | 
                } 
 | 
                textBuilder.Append(fitterText[i]); 
 | 
            } 
 | 
        } 
 | 
        CacluHrefAndImgIndex(); 
 | 
        m_OutputText = textBuilder.ToString(); 
 | 
    } 
 | 
  
 | 
    private void CacluHrefAndImgIndex(int index) 
 | 
    { 
 | 
        for (int i = 0; i < m_ImgList.Count; i++) 
 | 
        { 
 | 
            if (index * 4 < m_ImgList[i].end) 
 | 
            { 
 | 
                m_ImgList[i].cacheCnt += 1; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        for (int m = 0; m < m_HrefList.Count; m++) 
 | 
        { 
 | 
            RichTextMgr.HrefInfo hrefInfo = m_HrefList[m]; 
 | 
            if (index * 4 < hrefInfo.end) 
 | 
            { 
 | 
                hrefInfo.end_cache_cnt += 1; 
 | 
            } 
 | 
            if (index * 4 < hrefInfo.start) 
 | 
            { 
 | 
                hrefInfo.start_cache_cnt += 1; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void CacluHrefAndImgIndex() 
 | 
    { 
 | 
        for (int i = 0; i < m_ImgList.Count; i++) 
 | 
        { 
 | 
            m_ImgList[i].end += m_ImgList[i].cacheCnt * 4; 
 | 
        } 
 | 
  
 | 
        for (int m = 0; m < m_HrefList.Count; m++) 
 | 
        { 
 | 
            RichTextMgr.HrefInfo hrefInfo = m_HrefList[m]; 
 | 
            hrefInfo.start += hrefInfo.start_cache_cnt * 4; 
 | 
            hrefInfo.end += hrefInfo.end_cache_cnt * 4; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private float GetResolutionRatio() 
 | 
    { 
 | 
        return 1 / pixelsPerUnit; 
 | 
    } 
 | 
  
 | 
    public override string text 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_Text; 
 | 
        } 
 | 
        set 
 | 
        { 
 | 
            if (string.IsNullOrEmpty(value)) 
 | 
            { 
 | 
                value = string.Empty; 
 | 
            } 
 | 
            m_RichText = value; 
 | 
            SetRichTextDirty(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if UNITY_EDITOR 
 | 
    protected override void OnValidate() 
 | 
    { 
 | 
        text = m_Text; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    private void SetRichTextDirty() 
 | 
    { 
 | 
        m_RichText = UIHelper.ReplaceNewLine(m_RichText); 
 | 
        m_OutputText = GetOutputText(m_RichText); 
 | 
        if (AutoNewLine) 
 | 
        { 
 | 
            SetFitterSize(); 
 | 
        } 
 | 
        m_Text = m_OutputText; 
 | 
        SetVerticesDirty(); 
 | 
        SetLayoutDirty(); 
 | 
    } 
 | 
    #endregion 
 | 
} 
 |