public static string UseStyles(LinkedList <RichTextStyle> styles, string text, RichTextType type = RichTextType.gui_style, int offset = 0)
        {
            if (text == null || styles == null || styles.Count == 0)
            {
                return(text);
            }
            int len = text.Length;

            System.Text.StringBuilder      builder = new System.Text.StringBuilder(text);
            LinkedListNode <RichTextStyle> node    = styles.Last;

            while (node != null)
            {
                RichTextStyle set = node.Value;
                node = node.Previous;
                if (set.start + offset >= len)
                {
                    continue;
                }
                TextTag tag = set.EndTag(type);
                if (!string.IsNullOrEmpty(tag.tag))
                {
                    builder.Insert(Mathf.Clamp(tag.offset + offset, 0, len), tag.tag);
                }
                tag = set.StartTag(type);
                if (!string.IsNullOrEmpty(tag.tag))
                {
                    builder.Insert(Mathf.Clamp(tag.offset + offset, 0, len), tag.tag);
                }
            }
            return(builder.ToString());
        }
        public static void Optimization(LinkedList <RichTextStyle> settings)
        {
            if (settings == null || settings.Count < 2)
            {
                return;
            }
            LinkedListNode <RichTextStyle> node1 = settings.First;
            LinkedListNode <RichTextStyle> node2 = node1.Next;

            while (node1 != null && node2 != null)
            {
                RichTextStyle r1 = node1.Value;
                RichTextStyle r2 = node2.Value;
                if (r1.end == r2.start && RichTextStyle.SameStyle(r1, r2))
                {
                    r1.end      = r2.end;
                    node1.Value = r1;
                    settings.Remove(node2);
                }
                else
                {
                    node1 = node2;
                }
                node2 = node1 == null ? null : node1.Next;
            }
        }
 public void OverrideSet(RichTextStyle newSet)
 {
     if (newSet.hasColor)
     {
         this.color = newSet.color;
     }
     if (newSet.hasSize)
     {
         this.size = newSet.size;
     }
     this.styles |= newSet.styles;
 }
 public static bool SameStyle(RichTextStyle set1, RichTextStyle set2)
 {
     if (set1.size != set2.size)
     {
         return(false);
     }
     else if (set1.hasColor ^ set2.hasColor)
     {
         return(false);
     }
     else if (set1.hasColor && set1.color != set2.color)
     {
         return(false);
     }
     else if (set1.styles != set2.styles)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }
        public RichTextStyle CopyTo(int start, int end)
        {
            RichTextStyle set = new RichTextStyle(start, end, this.color, this.size, this.styles);

            return(set);
        }
        public static void AddStyle(ref LinkedList <RichTextStyle> styles, RichTextStyle newSet, bool overrideOldStyle)
        {
            if (newSet.end <= newSet.start || newSet.start < 0 || !newSet.hasAnyStyle)
            {
                return;
            }
            if (styles == null)
            {
                styles = new LinkedList <RichTextStyle>();
            }
            if (styles.Count == 0)
            {
                styles.AddLast(newSet);
                return;
            }
            LinkedListNode <RichTextStyle> node = styles.First;

            while (node != null)
            {
                RichTextStyle set = node.Value;
                LinkedListNode <RichTextStyle> next = node.Next;
                if (newSet.end <= set.start)
                {
                    styles.AddBefore(node, newSet);
                    return;
                }
                else if (newSet.start >= set.end)
                {
                    node = next;
                    continue;
                }
                //newSet.end>set.Start, newSet.start<set.end
                int off0, off1;
                //左边区域
                off0 = Mathf.Min(newSet.start, set.start);
                off1 = Mathf.Max(newSet.start, set.start);
                if (off0 < off1)
                {
                    RichTextStyle insert = newSet.start < set.start ? newSet.CopyTo(off0, off1) : set.CopyTo(off0, off1);
                    styles.AddBefore(node, insert);
                    newSet.start = off1;
                    set.start    = off1;
                    node.Value   = set;
                }
                //公共区域
                off0 = off1;
                off1 = Mathf.Min(set.end, newSet.end);
                if (off0 < off1)
                {
                    RichTextStyle insert;
                    if (overrideOldStyle)
                    {
                        insert = set.CopyTo(off0, off1);
                        insert.OverrideSet(newSet);
                    }
                    else
                    {
                        insert = newSet.CopyTo(off0, off1);
                        insert.OverrideSet(set);
                    }
                    node.Value   = insert;
                    set.start    = off1;
                    newSet.start = off1;
                }
                if (newSet.start >= newSet.end)
                {
                    styles.AddAfter(node, set);
                    break;
                }
                else
                {
                    node = next;
                }
            }
            if (newSet.start < newSet.end)
            {
                styles.AddLast(newSet);
            }
        }