From bdfaa27eb6ada91380ac0622ca50bffe71d80d97 Mon Sep 17 00:00:00 2001 From: MihaZupan Date: Sun, 5 Apr 2020 16:05:37 +0200 Subject: [PATCH] Cache string representations of numbers 0-26 --- .../ListExtras/ListExtraItemParser.cs | 10 +++++----- src/Markdig/Helpers/CharHelper.cs | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Markdig/Extensions/ListExtras/ListExtraItemParser.cs b/src/Markdig/Extensions/ListExtras/ListExtraItemParser.cs index 4cd8171da..74d308878 100644 --- a/src/Markdig/Extensions/ListExtras/ListExtraItemParser.cs +++ b/src/Markdig/Extensions/ListExtras/ListExtraItemParser.cs @@ -45,16 +45,16 @@ public override bool TryParse(BlockProcessor state, char pendingBulletType, out if ((isRomanLow || isRomanUp) && (pendingBulletType == '\0' || pendingBulletType == 'i' || pendingBulletType == 'I')) { int startChar = state.Start; - int endChar = 0; // With a roman, we can have multiple characters // Note that we don't validate roman numbers - while (isRomanLow ? CharHelper.IsRomanLetterLowerPartial(c) : CharHelper.IsRomanLetterUpperPartial(c)) + do { - endChar = state.Start; c = state.NextChar(); } + while (isRomanLow ? CharHelper.IsRomanLetterLowerPartial(c) : CharHelper.IsRomanLetterUpperPartial(c)); - result.OrderedStart = CharHelper.RomanToArabic(state.Line.Text.AsSpan(startChar, endChar - startChar + 1)).ToString(); + int orderValue = CharHelper.RomanToArabic(state.Line.Text.AsSpan(startChar, state.Start - startChar)); + result.OrderedStart = CharHelper.SmallNumberToString(orderValue); result.BulletType = isRomanLow ? 'i' : 'I'; result.DefaultOrderedStart = isRomanLow ? "i" : "I"; } @@ -62,7 +62,7 @@ public override bool TryParse(BlockProcessor state, char pendingBulletType, out { // otherwise we expect a regular alpha lettered list with a single character. var isUpper = c.IsAlphaUpper(); - result.OrderedStart = (Char.ToUpperInvariant(c) - 64).ToString(); + result.OrderedStart = CharHelper.SmallNumberToString((c | 0x20) - 'a' + 1); result.BulletType = isUpper ? 'A' : 'a'; result.DefaultOrderedStart = isUpper ? "A" : "a"; state.NextChar(); diff --git a/src/Markdig/Helpers/CharHelper.cs b/src/Markdig/Helpers/CharHelper.cs index b10fd21a8..7ea8972cd 100644 --- a/src/Markdig/Helpers/CharHelper.cs +++ b/src/Markdig/Helpers/CharHelper.cs @@ -745,6 +745,24 @@ public static bool IsLeftToRight(int c) c == 0x002128 || c == 0x002395 || c == 0x01D4A2 || c == 0x01D4BB || c == 0x01D546; + } + + // Used by ListExtraItemParser to format numbers from 1 - 26 + private static readonly string[] smallNumberStringCache = { + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", + "20", "21", "22", "23", "24", "25", "26", + }; + + internal static string SmallNumberToString(int number) + { + string[] cache = smallNumberStringCache; + if ((uint)number < (uint)cache.Length) + { + return cache[number]; + } + + return number.ToString(); } } } \ No newline at end of file