Selaa lähdekoodia

Rewrite BaseItem.ModifySortChunks

Bond_009 2 vuotta sitten
vanhempi
sitoutus
224bb355dd

+ 25 - 43
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -775,36 +775,6 @@ namespace MediaBrowser.Controller.Entities
             return Id.ToString("N", CultureInfo.InvariantCulture);
         }
 
-        private List<Tuple<StringBuilder, bool>> GetSortChunks(string s1)
-        {
-            var list = new List<Tuple<StringBuilder, bool>>();
-
-            int thisMarker = 0;
-
-            while (thisMarker < s1.Length)
-            {
-                char thisCh = s1[thisMarker];
-
-                var thisChunk = new StringBuilder();
-                bool isNumeric = char.IsDigit(thisCh);
-
-                while (thisMarker < s1.Length && char.IsDigit(thisCh) == isNumeric)
-                {
-                    thisChunk.Append(thisCh);
-                    thisMarker++;
-
-                    if (thisMarker < s1.Length)
-                    {
-                        thisCh = s1[thisMarker];
-                    }
-                }
-
-                list.Add(new Tuple<StringBuilder, bool>(thisChunk, isNumeric));
-            }
-
-            return list;
-        }
-
         public virtual bool CanDelete()
         {
             if (SourceType == SourceType.Channel)
@@ -951,28 +921,40 @@ namespace MediaBrowser.Controller.Entities
             return ModifySortChunks(sortable);
         }
 
-        private string ModifySortChunks(string name)
+        internal static string ModifySortChunks(string name)
         {
-            var chunks = GetSortChunks(name);
+            void AppendChunk(StringBuilder builder, bool isDigitChunk, ReadOnlySpan<char> chunk)
+            {
+                if (isDigitChunk && chunk.Length < 10)
+                {
+                    builder.Append('0', 10 - chunk.Length);
+                }
 
-            var builder = new StringBuilder();
+                builder.Append(chunk);
+            }
 
-            foreach (var chunk in chunks)
+            if (name.Length == 0)
             {
-                var chunkBuilder = chunk.Item1;
+                return string.Empty;
+            }
+
+            var builder = new StringBuilder(name.Length);
 
-                // This chunk is numeric
-                if (chunk.Item2)
+            int chunkStart = 0;
+            bool isDigitChunk = char.IsDigit(name[0]);
+            for (int i = 0; i < name.Length; i++)
+            {
+                var isDigit = char.IsDigit(name[i]);
+                if (isDigit != isDigitChunk)
                 {
-                    while (chunkBuilder.Length < 10)
-                    {
-                        chunkBuilder.Insert(0, '0');
-                    }
+                    AppendChunk(builder, isDigitChunk, name.AsSpan(chunkStart, i - chunkStart));
+                    chunkStart = i;
+                    isDigitChunk = isDigit;
                 }
-
-                builder.Append(chunkBuilder);
             }
 
+            AppendChunk(builder, isDigitChunk, name.AsSpan(chunkStart));
+
             // logger.LogDebug("ModifySortChunks Start: {0} End: {1}", name, builder.ToString());
             return builder.ToString().RemoveDiacritics();
         }

+ 1 - 0
MediaBrowser.Controller/Properties/AssemblyInfo.cs

@@ -15,6 +15,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
+[assembly: InternalsVisibleTo("Jellyfin.Controller.Tests")]
 [assembly: InternalsVisibleTo("Jellyfin.Server.Implementations.Tests")]
 
 // Setting ComVisible to false makes the types in this assembly not visible

+ 18 - 0
tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs

@@ -0,0 +1,18 @@
+using MediaBrowser.Controller.Entities;
+using Xunit;
+
+namespace Jellyfin.Controller.Tests.Entities
+{
+    public class BaseItemTests
+    {
+        [Theory]
+        [InlineData("", "")]
+        [InlineData("1", "0000000001")]
+        [InlineData("t", "t")]
+        [InlineData("test", "test")]
+        [InlineData("test1", "test0000000001")]
+        [InlineData("1test 2", "0000000001test 0000000002")]
+        public void BaseItem_ModifySortChunks_Valid(string input, string expected)
+            => Assert.Equal(expected, BaseItem.ModifySortChunks(input));
+    }
+}