| File: Text\XmlAttributedTextWriter.cs | Web Access |
| Project: src\src\Graphics\src\Graphics\Graphics.csproj (Microsoft.Maui.Graphics) |
using System; using System.Globalization; using System.IO; using System.Text; using XmlNames = Microsoft.Maui.Graphics.Text.XmlAttributedTextNames; namespace Microsoft.Maui.Graphics.Text { public class XmlAttributedTextWriter { public string Write(IAttributedText text) { using (var writer = new StringWriter()) { Write(text, writer); return writer.ToString(); } } public void Write( IAttributedText attributedText, TextWriter writer) { if (attributedText != null && !string.IsNullOrEmpty(attributedText.Text)) { bool encode = attributedText.Text.IndexOf("]]", StringComparison.Ordinal) != -1; writer.Write($"<{XmlNames.AttributedText}>"); if (encode) { writer.Write($"<{XmlNames.Content} {XmlNames.Encoded}=\"True\"><![CDATA["); byte[] bytes = Encoding.UTF8.GetBytes(attributedText.Text); writer.Write(Convert.ToBase64String(bytes)); writer.Write($"]]></{XmlNames.Content}>"); } else { writer.Write($"<{XmlNames.Content}><![CDATA["); writer.Write(attributedText.Text); writer.Write($"]]></{XmlNames.Content}>"); } if (attributedText.Runs != null && attributedText.Runs.Count > 0) { foreach (var run in attributedText.Runs) WriteRun(run, writer); } writer.Write($"</{XmlNames.AttributedText}>"); } } private void WriteRun( IAttributedTextRun run, TextWriter writer) { if (run.Attributes != null) { var attributes = run.Attributes; writer.Write($"<{XmlNames.Run}"); writer.Write($" {XmlNames.Start}=\""); writer.Write(run.Start.ToString(CultureInfo.InvariantCulture)); writer.Write("\""); writer.Write($" {XmlNames.Length}=\""); writer.Write(run.Length.ToString(CultureInfo.InvariantCulture)); writer.Write("\""); foreach (var entry in run.Attributes) Write(attributes, entry.Key, null, writer); writer.Write(" />"); } } private void Write( ITextAttributes currentAttributes, TextAttribute key, string defaultValue, TextWriter writer) { currentAttributes.TryGetValue(key, out var value); if (!string.Equals(value, defaultValue, StringComparison.Ordinal)) WriteAttribute(writer, key.ToString(), value); } private void WriteAttribute(TextWriter writer, string attribute, string value) { if (value != null) { writer.Write(" "); writer.Write(attribute); writer.Write("=\""); writer.Write(value); writer.Write("\""); } } } }