SharpGen/Transform/NamingRulesManager.PascalCase.cs (82 lines of code) (raw):
using System.Linq;
using System.Text;
using SharpGen.Config;
namespace SharpGen.Transform
{
public sealed partial class NamingRulesManager
{
/// <summary>
/// Determines whether the specified string is a valid Pascal case.
/// </summary>
/// <param name="str">The string to validate.</param>
/// <param name="lowerCount">The lower count.</param>
/// <returns>
/// <c>true</c> if the specified string is a valid Pascal case; otherwise, <c>false</c>.
/// </returns>
private static bool IsPascalCase(string str, out int lowerCount)
{
// Count the number of char in lower case
lowerCount = str.Count(char.IsLower);
if (str.Length == 0)
return false;
// First char must be a letter
if (!char.IsLetter(str[0]))
return false;
// First letter must be upper
if (!char.IsUpper(str[0]))
return false;
// Second letter must be lower
if (str.Length > 1 && char.IsUpper(str[1]))
return false;
return str.All(char.IsLetterOrDigit);
}
/// <summary>
/// Converts a string to PascalCase.
/// </summary>
/// <param name="text">The text to convert.</param>
/// <param name="namingFlags">The naming options to apply to the given string to convert.</param>
/// <returns>The given string in PascalCase.</returns>
public string ConvertToPascalCase(string text, NamingFlags namingFlags)
{
var splittedPhrase = text.Split('_');
StringBuilder sb = new();
for (var i = 0; i < splittedPhrase.Length; i++)
{
var subPart = splittedPhrase[i];
// Don't perform expansion when asked
if ((namingFlags & NamingFlags.NoShortNameExpand) == 0)
{
while (subPart.Length > 0)
{
var continueReplace = false;
foreach (var regExp in _expandShortName)
{
var regex = regExp.Regex;
var newText = regExp.Replace;
if (regex.Match(subPart).Success)
{
if (regExp.HasRegexReplace)
{
subPart = regex.Replace(subPart, regExp.Replace);
sb.Append(subPart);
subPart = string.Empty;
}
else
{
subPart = regex.Replace(subPart, string.Empty);
sb.Append(newText);
continueReplace = true;
}
break;
}
}
if (!continueReplace)
{
break;
}
}
}
// Else, perform a standard conversion
if (subPart.Length > 0)
{
// If string is not Pascal Case, then Pascal Case it
if (IsPascalCase(subPart, out var numberOfCharLowercase))
{
sb.Append(subPart);
}
else
{
var splittedPhraseChars = numberOfCharLowercase > 0
? subPart.ToCharArray()
: subPart.ToLower().ToCharArray();
if (splittedPhraseChars.Length > 0)
splittedPhraseChars[0] = char.ToUpper(splittedPhraseChars[0]);
sb.Append(new string(splittedPhraseChars));
}
}
if ((namingFlags & NamingFlags.KeepUnderscore) != 0 && i + 1 < splittedPhrase.Length)
sb.Append('_');
}
return sb.ToString();
}
}
}