|
|
|
@ -34,8 +34,10 @@ |
|
|
|
|
|
|
|
|
|
#endregion |
|
|
|
|
|
|
|
|
|
using System; |
|
|
|
|
using System.Globalization; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Text.RegularExpressions; |
|
|
|
|
|
|
|
|
|
namespace Google.ProtocolBuffers |
|
|
|
|
{ |
|
|
|
@ -64,49 +66,14 @@ namespace Google.ProtocolBuffers |
|
|
|
|
/// </summary> |
|
|
|
|
private static string UnderscoresToPascalOrCamelCase(string input, bool pascal) |
|
|
|
|
{ |
|
|
|
|
StringBuilder result = new StringBuilder(); |
|
|
|
|
bool capitaliseNext = pascal; |
|
|
|
|
for (int i = 0; i < input.Length; i++) |
|
|
|
|
string name = Transform(input, pascal ? UnderlineToPascal : UnderlineToCamel, x => x.Value.TrimStart('_').ToUpper()); |
|
|
|
|
if (!pascal && name.Length > 0 && Char.IsUpper(name[0])) |
|
|
|
|
{ |
|
|
|
|
char c = input[i]; |
|
|
|
|
if ('a' <= c && c <= 'z') |
|
|
|
|
{ |
|
|
|
|
if (capitaliseNext) |
|
|
|
|
{ |
|
|
|
|
result.Append(char.ToUpper(c, CultureInfo.InvariantCulture)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
result.Append(c); |
|
|
|
|
} |
|
|
|
|
capitaliseNext = false; |
|
|
|
|
} |
|
|
|
|
else if ('A' <= c && c <= 'Z') |
|
|
|
|
{ |
|
|
|
|
if (i == 0 && !pascal) |
|
|
|
|
{ |
|
|
|
|
// Force first letter to lower-case unless explicitly told to |
|
|
|
|
// capitalize it. |
|
|
|
|
result.Append(char.ToLower(c, CultureInfo.InvariantCulture)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
// Capital letters after the first are left as-is. |
|
|
|
|
result.Append(c); |
|
|
|
|
} |
|
|
|
|
capitaliseNext = false; |
|
|
|
|
} |
|
|
|
|
else if ('0' <= c && c <= '9') |
|
|
|
|
{ |
|
|
|
|
result.Append(c); |
|
|
|
|
capitaliseNext = true; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
capitaliseNext = true; |
|
|
|
|
} |
|
|
|
|
char[] chars = name.ToCharArray(); |
|
|
|
|
chars[0] = char.ToLower(chars[0]); |
|
|
|
|
return new string(chars); |
|
|
|
|
} |
|
|
|
|
return result.ToString(); |
|
|
|
|
return name; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
internal static string StripProto(string text) |
|
|
|
@ -131,5 +98,44 @@ namespace Google.ProtocolBuffers |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Similar to UnderlineToCamel, but also matches the first character if it is lower-case |
|
|
|
|
/// </summary> |
|
|
|
|
private static Regex UnderlineToPascal = new Regex(@"(?:^|[0-9_])[a-z]"); |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Matches lower-case character that follow either an underscore, or a number |
|
|
|
|
/// </summary> |
|
|
|
|
private static Regex UnderlineToCamel = 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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |