From 1217a44bc3c477d96657e6a6850c5c1833ad106a Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Fri, 24 Apr 2020 11:58:42 +0300 Subject: [PATCH] use StringTokenizer to parse PointsList --- .../Converters/PointsListTypeConverter.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs index 7246d8c583..099ffa8c8c 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs @@ -5,6 +5,7 @@ using System.Globalization; namespace Avalonia.Markup.Xaml.Converters { using System.ComponentModel; + using Avalonia.Utilities; public class PointsListTypeConverter : TypeConverter { @@ -15,15 +16,17 @@ namespace Avalonia.Markup.Xaml.Converters public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - string strValue = (string)value; - string[] pointStrs = strValue.Split(new[] { ' ', '\t', '\r', '\n', ',' }, StringSplitOptions.RemoveEmptyEntries); - var result = new List(pointStrs.Length / 2); - for (int i = 0; i < pointStrs.Length; i += 2) + var points = new List(); + + using (var tokenizer = new StringTokenizer((string)value, CultureInfo.InvariantCulture, exceptionMessage: "Invalid PointsList.")) { - result.Add(Point.Parse($"{pointStrs[i]} {pointStrs[i + 1]}")); + while (tokenizer.TryReadDouble(out double x)) + { + points.Add(new Point(x, tokenizer.ReadDouble())); + } } - return result; + return points; } } }