|
@@ -35,8 +35,6 @@
|
|
|
#endregion
|
|
|
|
|
|
using System;
|
|
|
-using System.Globalization;
|
|
|
-using System.Text;
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
namespace Google.ProtocolBuffers
|
|
@@ -46,6 +44,20 @@ namespace Google.ProtocolBuffers
|
|
|
/// </summary>
|
|
|
public class NameHelpers
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// All characters that are not alpha-numeric
|
|
|
+ /// </summary>
|
|
|
+ private static readonly Regex NonAlphaNumericCharacters = new Regex(@"[^a-zA-Z0-9]+");
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Matches lower-case character that follow either an underscore, or a number
|
|
|
+ /// </summary>
|
|
|
+ private static readonly Regex UnderscoreOrNumberWithLowerCase = new Regex(@"[0-9_][a-z]");
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Removes non alpha numeric characters while capitalizing letters that follow
|
|
|
+ /// a number or underscore. The first letter is always upper case.
|
|
|
+ /// </summary>
|
|
|
public static string UnderscoresToPascalCase(string input)
|
|
|
{
|
|
|
string name = UnderscoresToUpperCase(input);
|
|
@@ -60,6 +72,10 @@ namespace Google.ProtocolBuffers
|
|
|
return name;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Removes non alpha numeric characters while capitalizing letters that follow
|
|
|
+ /// a number or underscore. The first letter is always lower case.
|
|
|
+ /// </summary>
|
|
|
public static string UnderscoresToCamelCase(string input)
|
|
|
{
|
|
|
string name = UnderscoresToUpperCase(input);
|
|
@@ -76,20 +92,24 @@ namespace Google.ProtocolBuffers
|
|
|
|
|
|
/// <summary>
|
|
|
/// Capitalizes any characters following an '_' or a number '0' - '9' and removes
|
|
|
- /// all non alpha-numberic characters. If the resulting string begins with a number
|
|
|
+ /// all non alpha-numeric characters. If the resulting string begins with a number
|
|
|
/// an '_' will be prefixed.
|
|
|
/// </summary>
|
|
|
private static string UnderscoresToUpperCase(string input)
|
|
|
{
|
|
|
- string name = Transform(input, UnderlineCharacter, x => x.Value.ToUpper());
|
|
|
- name = Transform(name, InvalidCharacters, x => String.Empty);
|
|
|
+ string name = UnderscoreOrNumberWithLowerCase.Replace(input, x => x.Value.ToUpper());
|
|
|
+ name = NonAlphaNumericCharacters.Replace(name, String.Empty);
|
|
|
|
|
|
if (name.Length == 0)
|
|
|
+ {
|
|
|
throw new ArgumentException(String.Format("The field name '{0}' is invalid.", input));
|
|
|
+ }
|
|
|
|
|
|
// Fields can not start with a number
|
|
|
if (Char.IsNumber(name[0]))
|
|
|
+ {
|
|
|
name = '_' + name;
|
|
|
+ }
|
|
|
|
|
|
return name;
|
|
|
}
|
|
@@ -116,44 +136,5 @@ namespace Google.ProtocolBuffers
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// All characters that are not alpha-numberic
|
|
|
- /// </summary>
|
|
|
- private static Regex InvalidCharacters = new Regex(@"[^a-zA-Z0-9]+");
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Matches lower-case character that follow either an underscore, or a number
|
|
|
- /// </summary>
|
|
|
- private static Regex UnderlineCharacter = new Regex(@"[0-9_][a-z]");
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Used for text-template transformation where a regex match is replaced in the input string.
|
|
|
- /// </summary>
|
|
|
- /// <param name="input">The text to perform the replacement upon</param>
|
|
|
- /// <param name="pattern">The regex used to perform the match</param>
|
|
|
- /// <param name="fnReplace">A delegate that selects the appropriate replacement text</param>
|
|
|
- /// <returns>The newly formed text after all replacements are made</returns>
|
|
|
- /// <remarks>
|
|
|
- /// Originally found at http://csharptest.net/browse/src/Library/Utils/StringUtils.cs#120
|
|
|
- /// Republished here by the original author under this project's licensing.
|
|
|
- /// </remarks>
|
|
|
- private static string Transform(string input, Regex pattern, Converter<Match, string> fnReplace)
|
|
|
- {
|
|
|
- int currIx = 0;
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
-
|
|
|
- foreach (Match match in pattern.Matches(input))
|
|
|
- {
|
|
|
- sb.Append(input, currIx, match.Index - currIx);
|
|
|
- string replace = fnReplace(match);
|
|
|
- sb.Append(replace);
|
|
|
-
|
|
|
- currIx = match.Index + match.Length;
|
|
|
- }
|
|
|
-
|
|
|
- sb.Append(input, currIx, input.Length - currIx);
|
|
|
- return sb.ToString();
|
|
|
- }
|
|
|
}
|
|
|
}
|