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); } }