using Microsoft.Xna.Framework; using System.Collections.Generic; using System.Collections.Immutable; namespace Barotrauma { public class RichTextData { public int StartIndex, EndIndex; public Color? Color; public string Metadata; public float Alpha = 1.0f; private const char definitionIndicator = '‖'; private const char attributeSeparator = ';'; private const char keyValueSeparator = ':'; //private const char lineChangeIndicator = '\n'; private const string colorDefinition = "color"; private const string metadataDefinition = "metadata"; private const string endDefinition = "end"; public static ImmutableArray? GetRichTextData(string text, out string sanitizedText) { sanitizedText = text; if (!string.IsNullOrEmpty(text) && text.Contains(definitionIndicator, System.StringComparison.Ordinal)) { text = text.Replace("\r", ""); string[] segments = text.Split(definitionIndicator); sanitizedText = string.Empty; List textColors = new List(); RichTextData tempData = null; int prevIndex = 0; int currIndex = 0; for (int i = 0; i < segments.Length; i++) { if (i % 2 == 0) { sanitizedText += segments[i]; prevIndex = currIndex; currIndex += segments[i].Replace("\n", "").Replace("\r", "").Length; } else { string[] attributes = segments[i].Split(attributeSeparator); for (int j = 0; j < attributes.Length; j++) { if (attributes[j].Contains(endDefinition, System.StringComparison.OrdinalIgnoreCase)) { if (tempData != null) { tempData.StartIndex = prevIndex; tempData.EndIndex = currIndex - 1; textColors.Add(tempData); } tempData = null; } else if (attributes[j].StartsWith(colorDefinition, System.StringComparison.OrdinalIgnoreCase)) { if (tempData == null) { tempData = new RichTextData(); } string valueStr = attributes[j].Substring(attributes[j].IndexOf(keyValueSeparator) + 1); if (valueStr.Equals("null", System.StringComparison.InvariantCultureIgnoreCase)) { tempData.Color = null; } else { tempData.Color = XMLExtensions.ParseColor(valueStr); } } else if (attributes[j].StartsWith(metadataDefinition, System.StringComparison.OrdinalIgnoreCase)) { if (tempData == null) { tempData = new RichTextData(); } tempData.Metadata = attributes[j].Substring(attributes[j].IndexOf(keyValueSeparator) + 1); } } } } return textColors.ToImmutableArray(); } return null; } } }