diff --git a/OpenUtau.Core/Classic/Flags/UstFlag.cs b/OpenUtau.Core/Classic/Flags/UstFlag.cs index 81948ecab..7af74c5d4 100644 --- a/OpenUtau.Core/Classic/Flags/UstFlag.cs +++ b/OpenUtau.Core/Classic/Flags/UstFlag.cs @@ -10,5 +10,9 @@ public UstFlag(string key, int value) { Key = key ?? throw new ArgumentNullException(nameof(key)); Value = value; } + + public override string ToString() { + return Key + Value; + } } } diff --git a/OpenUtau.Core/Classic/Flags/UstFlagParser.cs b/OpenUtau.Core/Classic/Flags/UstFlagParser.cs index 2dfed5be8..e6ce4cc6a 100644 --- a/OpenUtau.Core/Classic/Flags/UstFlagParser.cs +++ b/OpenUtau.Core/Classic/Flags/UstFlagParser.cs @@ -1,17 +1,18 @@ - -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Text; namespace OpenUtau.Classic.Flags { public class UstFlagParser { public IList Parse(string text) { List flags = new List(); + if (string.IsNullOrEmpty(text)) return flags; + var keyBuilder = new StringBuilder(); var valueBuilder = new StringBuilder(); bool wasDigit = false; + for (int i = 0; i <= text.Length; ++i) { - if (i == text.Length || char.IsLetter(text[i]) && wasDigit) { + if (i == text.Length || (char.IsLetter(text[i]) || text[i] == '/') && wasDigit) { string key = keyBuilder.ToString(); if (!int.TryParse(valueBuilder.ToString(), out int value)) { value = 0; @@ -29,7 +30,7 @@ public IList Parse(string text) { if (c == '-' || c == '+' || char.IsDigit(c)) { valueBuilder.Append(c); wasDigit = true; - } else if (char.IsLetter(c)) { + } else if (char.IsLetter(c) || c == '/') { if (keyBuilder.Length == 0 && IsSingleCharacterFlag(c)) { flags.Add(new UstFlag(c.ToString(), 0)); continue; diff --git a/OpenUtau.Test/Classic/Flags/UstFlagParserTest.cs b/OpenUtau.Test/Classic/Flags/UstFlagParserTest.cs index a5cf9d200..37d3467e9 100644 --- a/OpenUtau.Test/Classic/Flags/UstFlagParserTest.cs +++ b/OpenUtau.Test/Classic/Flags/UstFlagParserTest.cs @@ -26,14 +26,29 @@ public void ParseTest() { } [Fact] - public void ParseSelector() { + public void ParsePluginSelector() { var result = new UstFlagParser().Parse("/1g10Mt-20"); - Assert.Equal(2, result.Count); + Assert.Equal(3, result.Count); + Assert.Equal("/", result[0].Key); + Assert.Equal(1, result[0].Value); + Assert.Equal("g", result[1].Key); + Assert.Equal(10, result[1].Value); + Assert.Equal("Mt", result[2].Key); + Assert.Equal(-20, result[2].Value); + } + + [Fact] + public void ParsePluginSelector2() { + var result = new UstFlagParser().Parse("g5/11t-10"); + + Assert.Equal(3, result.Count); Assert.Equal("g", result[0].Key); - Assert.Equal(10, result[0].Value); - Assert.Equal("Mt", result[1].Key); - Assert.Equal(-20, result[1].Value); + Assert.Equal(5, result[0].Value); + Assert.Equal("/", result[1].Key); + Assert.Equal(11, result[1].Value); + Assert.Equal("t", result[2].Key); + Assert.Equal(-10, result[2].Value); } [Fact]