Example #1
0
 private static bool IsNewCategory(UnicodeCategory category, DecamelizeOptions options)
 {
     if ((options & DecamelizeOptions.DontDecamelizeNumbers) == DecamelizeOptions.DontDecamelizeNumbers)
     {
         if (category == UnicodeCategory.LetterNumber ||
             category == UnicodeCategory.DecimalDigitNumber ||
             category == UnicodeCategory.OtherNumber)
         {
             return(false);
         }
     }
     return(true);
 }
 public static string Decamelize(string text, DecamelizeOptions options)
 {
     return ServiceProvider.Current.GetService<IDecamelizer>().Decamelize(text, options);
 }
Example #3
0
        public static string Decamelize(this string text, DecamelizeOptions options = DecamelizeOptions.Default)
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return(text);
            }

            var lastCategory = CharUnicodeInfo.GetUnicodeCategory(text[0]);
            var prevCategory = lastCategory;

            if (lastCategory == UnicodeCategory.UppercaseLetter)
            {
                lastCategory = UnicodeCategory.LowercaseLetter;
            }

            int  i  = 0;
            var  sb = new StringBuilder(text.Length);
            bool firstIsStillUnderscore = (text[0] == '_');

            if (((options & DecamelizeOptions.UnescapeUnicode) == DecamelizeOptions.UnescapeUnicode) && CanUnicodeEscape(text, 0))
            {
                sb.Append(GetUnicodeEscape(text, ref i));
            }
            else if (((options & DecamelizeOptions.UnescapeHexadecimal) == DecamelizeOptions.UnescapeHexadecimal) && CanHexEscape(text, 0))
            {
                sb.Append(GetHexEscape(text, ref i));
            }
            else
            {
                if ((options & DecamelizeOptions.ForceFirstUpper) == DecamelizeOptions.ForceFirstUpper)
                {
                    sb.Append(Char.ToUpper(text[0]));
                }
                else
                {
                    sb.Append(text[0]);
                }
            }

            bool separated  = false;
            bool keepFormat = (options & DecamelizeOptions.KeepFormattingIndices) == DecamelizeOptions.KeepFormattingIndices;

            for (i++; i < text.Length; i++)
            {
                char c = text[i];
                if (((options & DecamelizeOptions.UnescapeUnicode) == DecamelizeOptions.UnescapeUnicode) && CanUnicodeEscape(text, i))
                {
                    sb.Append(GetUnicodeEscape(text, ref i));
                    separated = true;
                }
                else if (((options & DecamelizeOptions.UnescapeHexadecimal) == DecamelizeOptions.UnescapeHexadecimal) && CanHexEscape(text, i))
                {
                    sb.Append(GetHexEscape(text, ref i));
                    separated = true;
                }
                else if (c == '_')
                {
                    if (!firstIsStillUnderscore || (options & DecamelizeOptions.KeepFirstUnderscores) != DecamelizeOptions.KeepFirstUnderscores)
                    {
                        sb.Append(' ');
                        separated = true;
                    }
                    else
                    {
                        sb.Append(c);
                    }
                }
                else
                {
                    UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory(c);
                    switch (category)
                    {
                    case UnicodeCategory.ClosePunctuation:
                    case UnicodeCategory.ConnectorPunctuation:
                    case UnicodeCategory.DashPunctuation:
                    case UnicodeCategory.EnclosingMark:
                    case UnicodeCategory.FinalQuotePunctuation:
                    case UnicodeCategory.Format:
                    case UnicodeCategory.InitialQuotePunctuation:
                    case UnicodeCategory.LineSeparator:
                    case UnicodeCategory.OpenPunctuation:
                    case UnicodeCategory.OtherPunctuation:
                    case UnicodeCategory.ParagraphSeparator:
                    case UnicodeCategory.SpaceSeparator:
                    case UnicodeCategory.SpacingCombiningMark:
                        if (keepFormat && c == '{')
                        {
                            while (c != '}')
                            {
                                c = text[i++];
                                sb.Append(c);
                            }
                            i--;
                            separated = true;
                            break;
                        }

                        if ((options & DecamelizeOptions.ForceRestLower) == DecamelizeOptions.ForceRestLower)
                        {
                            sb.Append(Char.ToLower(c));
                        }
                        else
                        {
                            sb.Append(c);
                        }
                        sb.Append(' ');
                        separated = true;
                        break;

                    case UnicodeCategory.LetterNumber:
                    case UnicodeCategory.DecimalDigitNumber:
                    case UnicodeCategory.OtherNumber:
                    case UnicodeCategory.CurrencySymbol:
                    case UnicodeCategory.LowercaseLetter:
                    case UnicodeCategory.MathSymbol:
                    case UnicodeCategory.ModifierLetter:
                    case UnicodeCategory.ModifierSymbol:
                    case UnicodeCategory.NonSpacingMark:
                    case UnicodeCategory.OtherLetter:
                    case UnicodeCategory.OtherNotAssigned:
                    case UnicodeCategory.Control:
                    case UnicodeCategory.OtherSymbol:
                    case UnicodeCategory.Surrogate:
                    case UnicodeCategory.PrivateUse:
                    case UnicodeCategory.TitlecaseLetter:
                    case UnicodeCategory.UppercaseLetter:
                        if ((category != lastCategory && c != ' ') && IsNewCategory(category, options))
                        {
                            if (!separated && prevCategory != UnicodeCategory.UppercaseLetter &&
                                (!firstIsStillUnderscore || (options & DecamelizeOptions.KeepFirstUnderscores) != DecamelizeOptions.KeepFirstUnderscores))
                            {
                                sb.Append(' ');
                            }

                            if ((options & DecamelizeOptions.ForceRestLower) == DecamelizeOptions.ForceRestLower)
                            {
                                sb.Append(Char.ToLower(c));
                            }
                            else
                            {
                                sb.Append(Char.ToUpper(c));
                            }

                            char upper = Char.ToUpper(c);
                            category     = CharUnicodeInfo.GetUnicodeCategory(upper);
                            lastCategory = category == UnicodeCategory.UppercaseLetter ? UnicodeCategory.LowercaseLetter : category;
                        }
                        else
                        {
                            if ((options & DecamelizeOptions.ForceRestLower) == DecamelizeOptions.ForceRestLower)
                            {
                                sb.Append(Char.ToLower(c));
                            }
                            else
                            {
                                sb.Append(c);
                            }
                        }
                        separated = false;
                        break;
                    }

                    firstIsStillUnderscore = firstIsStillUnderscore && (c == '_');
                    prevCategory           = category;
                }
            }

            if ((options & DecamelizeOptions.ReplaceSpacesByUnderscore) == DecamelizeOptions.ReplaceSpacesByUnderscore)
            {
                return(sb.Replace(' ', '_').ToString());
            }

            if ((options & DecamelizeOptions.ReplaceSpacesByMinus) == DecamelizeOptions.ReplaceSpacesByMinus)
            {
                return(sb.Replace(' ', '-').ToString());
            }

            if ((options & DecamelizeOptions.ReplaceSpacesByDot) == DecamelizeOptions.ReplaceSpacesByDot)
            {
                return(sb.Replace(' ', '.').ToString());
            }

            return(sb.ToString());
        }
Example #4
0
 public static string Decamelize(string text, DecamelizeOptions options)
 {
     return(ServiceProvider.Current.GetService <IDecamelizer>().Decamelize(text, options));
 }