// // Titlecasing: // ----------- // Titlecasing refers to a casing practice wherein the first letter of a word is an uppercase letter // and the rest of the letters are lowercase. The choice of which words to titlecase in headings // and titles is dependent on language and local conventions. For example, "The Merry Wives of Windor" // is the appropriate titlecasing of that play's name in English, with the word "of" not titlecased. // In German, however, the title is "Die lustigen Weiber von Windsor," and both "lustigen" and "von" // are not titlecased. In French even fewer words are titlecased: "Les joyeuses commeres de Windsor." // // Moreover, the determination of what actually constitutes a word is language dependent, and this can // influence which letter or letters of a "word" are uppercased when titlecasing strings. For example // "l'arbre" is considered two words in French, whereas "can't" is considered one word in English. // public unsafe String ToTitleCase(String str) { if (str == null) { throw new ArgumentNullException(nameof(str)); } Contract.EndContractBlock(); if (str.Length == 0) { return(str); } StringBuilder result = new StringBuilder(); string lowercaseData = null; for (int i = 0; i < str.Length; i++) { UnicodeCategory charType; int charLen; charType = CharUnicodeInfo.InternalGetUnicodeCategory(str, i, out charLen); if (Char.CheckLetter(charType)) { // Do the titlecasing for the first character of the word. i = AddTitlecaseLetter(ref result, ref str, i, charLen) + 1; // // Convert the characters until the end of the this word // to lowercase. // int lowercaseStart = i; // // Use hasLowerCase flag to prevent from lowercasing acronyms (like "URT", "USA", etc) // This is in line with Word 2000 behavior of titlecasing. // bool hasLowerCase = (charType == UnicodeCategory.LowercaseLetter); // Use a loop to find all of the other letters following this letter. while (i < str.Length) { charType = CharUnicodeInfo.InternalGetUnicodeCategory(str, i, out charLen); if (IsLetterCategory(charType)) { if (charType == UnicodeCategory.LowercaseLetter) { hasLowerCase = true; } i += charLen; } else if (str[i] == '\'') { i++; if (hasLowerCase) { if (lowercaseData == null) { lowercaseData = this.ToLower(str); } result.Append(lowercaseData, lowercaseStart, i - lowercaseStart); } else { result.Append(str, lowercaseStart, i - lowercaseStart); } lowercaseStart = i; hasLowerCase = true; } else if (!IsWordSeparator(charType)) { // This category is considered to be part of the word. // This is any category that is marked as false in wordSeprator array. i += charLen; } else { // A word separator. Break out of the loop. break; } } int count = i - lowercaseStart; if (count > 0) { if (hasLowerCase) { if (lowercaseData == null) { lowercaseData = this.ToLower(str); } result.Append(lowercaseData, lowercaseStart, count); } else { result.Append(str, lowercaseStart, count); } } if (i < str.Length) { // not a letter, just append it i = AddNonLetter(ref result, ref str, i, charLen); } } else { // not a letter, just append it i = AddNonLetter(ref result, ref str, i, charLen); } } return(result.ToString()); }
private string punycode_encode(string unicode) { StringBuilder builder = new StringBuilder(unicode.Length); int num = 0; int startIndex = 0; int length = 0; if (unicode.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } while (num < unicode.Length) { num = unicode.IndexOfAny(M_Dots, startIndex); if (num < 0) { num = unicode.Length; } if (num == startIndex) { if (num != unicode.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } break; } builder.Append("xn--"); bool flag = false; BidiCategory bidiCategory = CharUnicodeInfo.GetBidiCategory(unicode, startIndex); switch (bidiCategory) { case BidiCategory.RightToLeft: case BidiCategory.RightToLeftArabic: { flag = true; int index = num - 1; if (char.IsLowSurrogate(unicode, index)) { index--; } bidiCategory = CharUnicodeInfo.GetBidiCategory(unicode, index); if ((bidiCategory != BidiCategory.RightToLeft) && (bidiCategory != BidiCategory.RightToLeftArabic)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } break; } } int num6 = 0; for (int i = startIndex; i < num; i++) { BidiCategory category2 = CharUnicodeInfo.GetBidiCategory(unicode, i); if (flag && (category2 == BidiCategory.LeftToRight)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } if (!flag && ((category2 == BidiCategory.RightToLeft) || (category2 == BidiCategory.RightToLeftArabic))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } if (basic(unicode[i])) { builder.Append(encode_basic(unicode[i])); num6++; } else if (char.IsSurrogatePair(unicode, i)) { i++; } } int num7 = num6; if (num7 == (num - startIndex)) { builder.Remove(length, "xn--".Length); } else { if (((unicode.Length - startIndex) >= "xn--".Length) && unicode.Substring(startIndex, "xn--".Length).Equals("xn--", StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "unicode"); } int num8 = 0; if (num7 > 0) { builder.Append('-'); } int num9 = 0x80; int delta = 0; int num11 = 0x48; while (num6 < (num - startIndex)) { int cTest = 0; int num13 = 0x7ffffff; int num12 = startIndex; while (num12 < num) { cTest = char.ConvertToUtf32(unicode, num12); if ((cTest >= num9) && (cTest < num13)) { num13 = cTest; } num12 += this.IsSupplementary(cTest) ? 2 : 1; } delta += (num13 - num9) * ((num6 - num8) + 1); num9 = num13; for (num12 = startIndex; num12 < num; num12 += this.IsSupplementary(cTest) ? 2 : 1) { cTest = char.ConvertToUtf32(unicode, num12); if (cTest < num9) { delta++; } if (cTest == num9) { int d = delta; int num16 = 0x24; while (true) { int num17 = (num16 <= num11) ? 1 : ((num16 >= (num11 + 0x1a)) ? 0x1a : (num16 - num11)); if (d < num17) { break; } builder.Append(encode_digit(num17 + ((d - num17) % (0x24 - num17)))); d = (d - num17) / (0x24 - num17); num16 += 0x24; } builder.Append(encode_digit(d)); num11 = adapt(delta, (num6 - num8) + 1, num6 == num7); delta = 0; num6++; if (this.IsSupplementary(num13)) { num6++; num8++; } } } delta++; num9++; } } if ((builder.Length - length) > 0x3f) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } if (num != unicode.Length) { builder.Append('.'); } startIndex = num + 1; length = builder.Length; } if (builder.Length > (0xff - (this.IsDot(unicode[unicode.Length - 1]) ? 0 : 1))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 0xff - (this.IsDot(unicode[unicode.Length - 1]) ? 0 : 1) }), "unicode"); } return(builder.ToString()); }
// Token: 0x06002FE3 RID: 12259 RVA: 0x000B7D34 File Offset: 0x000B5F34 private static string punycode_decode(string ascii) { if (ascii.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if (ascii.Length > 255 - (IdnMapping.IsDot(ascii[ascii.Length - 1]) ? 0 : 1)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 255 - (IdnMapping.IsDot(ascii[ascii.Length - 1]) ? 0 : 1) }), "ascii"); } StringBuilder stringBuilder = new StringBuilder(ascii.Length); int i = 0; int num = 0; int num2 = 0; while (i < ascii.Length) { i = ascii.IndexOf('.', num); if (i < 0 || i > ascii.Length) { i = ascii.Length; } if (i == num) { if (i != ascii.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } break; } else { if (i - num > 63) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if (ascii.Length < "xn--".Length + num || !ascii.Substring(num, "xn--".Length).Equals("xn--", StringComparison.OrdinalIgnoreCase)) { stringBuilder.Append(ascii.Substring(num, i - num)); } else { num += "xn--".Length; int num3 = ascii.LastIndexOf('-', i - 1); if (num3 == i - 1) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } int num4; if (num3 <= num) { num4 = 0; } else { num4 = num3 - num; for (int j = num; j < num + num4; j++) { if (ascii[j] > '\u007f') { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } stringBuilder.Append((ascii[j] >= 'A' && ascii[j] <= 'Z') ? (ascii[j] - 'A' + 'a') : ascii[j]); } } int k = num + ((num4 > 0) ? (num4 + 1) : 0); int num5 = 128; int num6 = 72; int num7 = 0; int num8 = 0; IL_40D: while (k < i) { int num9 = num7; int num10 = 1; int num11 = 36; while (k < i) { int num12 = IdnMapping.decode_digit(ascii[k++]); if (num12 > (134217727 - num7) / num10) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num7 += num12 * num10; int num13 = (num11 <= num6) ? 1 : ((num11 >= num6 + 26) ? 26 : (num11 - num6)); if (num12 >= num13) { if (num10 > 134217727 / (36 - num13)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num10 *= 36 - num13; num11 += 36; } else { num6 = IdnMapping.adapt(num7 - num9, stringBuilder.Length - num2 - num8 + 1, num9 == 0); if (num7 / (stringBuilder.Length - num2 - num8 + 1) > 134217727 - num5) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num5 += num7 / (stringBuilder.Length - num2 - num8 + 1); num7 %= stringBuilder.Length - num2 - num8 + 1; if (num5 < 0 || num5 > 1114111 || (num5 >= 55296 && num5 <= 57343)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } string value = char.ConvertFromUtf32(num5); int num14; if (num8 > 0) { int l = num7; num14 = num2; while (l > 0) { if (num14 >= stringBuilder.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } if (char.IsSurrogate(stringBuilder[num14])) { num14++; } l--; num14++; } } else { num14 = num2 + num7; } stringBuilder.Insert(num14, value); if (IdnMapping.IsSupplementary(num5)) { num8++; } num7++; goto IL_40D; } } throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } bool flag = false; BidiCategory bidiCategory = CharUnicodeInfo.GetBidiCategory(stringBuilder.ToString(), num2); if (bidiCategory == BidiCategory.RightToLeft || bidiCategory == BidiCategory.RightToLeftArabic) { flag = true; } for (int m = num2; m < stringBuilder.Length; m++) { if (!char.IsLowSurrogate(stringBuilder.ToString(), m)) { bidiCategory = CharUnicodeInfo.GetBidiCategory(stringBuilder.ToString(), m); if ((flag && bidiCategory == BidiCategory.LeftToRight) || (!flag && (bidiCategory == BidiCategory.RightToLeft || bidiCategory == BidiCategory.RightToLeftArabic))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "ascii"); } } } if (flag && bidiCategory != BidiCategory.RightToLeft && bidiCategory != BidiCategory.RightToLeftArabic) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "ascii"); } } if (i - num > 63) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if (i != ascii.Length) { stringBuilder.Append('.'); } num = i + 1; num2 = stringBuilder.Length; } } if (stringBuilder.Length > 255 - (IdnMapping.IsDot(stringBuilder[stringBuilder.Length - 1]) ? 0 : 1)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 255 - (IdnMapping.IsDot(stringBuilder[stringBuilder.Length - 1]) ? 0 : 1) }), "ascii"); } return(stringBuilder.ToString()); }
private string punycode_decode(string ascii) { if (ascii.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if (ascii.Length > (0xff - (this.IsDot(ascii[ascii.Length - 1]) ? 0 : 1))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 0xff - (this.IsDot(ascii[ascii.Length - 1]) ? 0 : 1) }), "ascii"); } StringBuilder builder = new StringBuilder(ascii.Length); int index = 0; int startIndex = 0; for (int i = 0; index < ascii.Length; i = builder.Length) { index = ascii.IndexOf('.', startIndex); if ((index < 0) || (index > ascii.Length)) { index = ascii.Length; } if (index == startIndex) { if (index != ascii.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } break; } if ((index - startIndex) > 0x3f) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if ((ascii.Length < ("xn--".Length + startIndex)) || !ascii.Substring(startIndex, "xn--".Length).Equals("xn--", StringComparison.OrdinalIgnoreCase)) { builder.Append(ascii.Substring(startIndex, index - startIndex)); } else { int num5; startIndex += "xn--".Length; int num4 = ascii.LastIndexOf('-', index - 1); if (num4 == (index - 1)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } if (num4 <= startIndex) { num5 = 0; } else { num5 = num4 - startIndex; for (int k = startIndex; k < (startIndex + num5); k++) { if (ascii[k] > '\x007f') { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } builder.Append(((ascii[k] >= 'A') && (ascii[k] <= 'Z')) ? ((char)((ascii[k] - 'A') + 0x61)) : ascii[k]); } } int num7 = startIndex + ((num5 > 0) ? (num5 + 1) : 0); int num8 = 0x80; int num9 = 0x48; int num10 = 0; int num13 = 0; while (num7 < index) { int num17; int num14 = num10; int num11 = 1; int num12 = 0x24; while (true) { if (num7 >= index) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } int num15 = decode_digit(ascii[num7++]); if (num15 > ((0x7ffffff - num10) / num11)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num10 += num15 * num11; int num16 = (num12 <= num9) ? 1 : ((num12 >= (num9 + 0x1a)) ? 0x1a : (num12 - num9)); if (num15 < num16) { break; } if (num11 > (0x7ffffff / (0x24 - num16))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num11 *= 0x24 - num16; num12 += 0x24; } num9 = adapt(num10 - num14, ((builder.Length - i) - num13) + 1, num14 == 0); if ((num10 / (((builder.Length - i) - num13) + 1)) > (0x7ffffff - num8)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } num8 += num10 / (((builder.Length - i) - num13) + 1); num10 = num10 % (((builder.Length - i) - num13) + 1); if (((num8 < 0) || (num8 > 0x10ffff)) || ((num8 >= 0xd800) && (num8 <= 0xdfff))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } string str = char.ConvertFromUtf32(num8); if (num13 > 0) { int num18 = num10; num17 = i; while (num18 > 0) { if (num17 >= builder.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "ascii"); } if (char.IsSurrogate(builder[num17])) { num17++; } num18--; num17++; } } else { num17 = i + num10; } builder.Insert(num17, str); if (this.IsSupplementary(num8)) { num13++; } num10++; } bool flag = false; BidiCategory bidiCategory = CharUnicodeInfo.GetBidiCategory(builder.ToString(), i); switch (bidiCategory) { case BidiCategory.RightToLeft: case BidiCategory.RightToLeftArabic: flag = true; break; } for (int j = i; j < builder.Length; j++) { if (!char.IsLowSurrogate(builder.ToString(), j)) { bidiCategory = CharUnicodeInfo.GetBidiCategory(builder.ToString(), j); if ((flag && (bidiCategory == BidiCategory.LeftToRight)) || (!flag && ((bidiCategory == BidiCategory.RightToLeft) || (bidiCategory == BidiCategory.RightToLeftArabic)))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "ascii"); } } } if ((flag && (bidiCategory != BidiCategory.RightToLeft)) && (bidiCategory != BidiCategory.RightToLeftArabic)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "ascii"); } } if ((index - startIndex) > 0x3f) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "ascii"); } if (index != ascii.Length) { builder.Append('.'); } startIndex = index + 1; } if (builder.Length > (0xff - (this.IsDot(builder[builder.Length - 1]) ? 0 : 1))) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 0xff - (this.IsDot(builder[builder.Length - 1]) ? 0 : 1) }), "ascii"); } return(builder.ToString()); }
// Token: 0x06002FE2 RID: 12258 RVA: 0x000B7924 File Offset: 0x000B5B24 private static string punycode_encode(string unicode) { if (unicode.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } StringBuilder stringBuilder = new StringBuilder(unicode.Length); int i = 0; int num = 0; int num2 = 0; while (i < unicode.Length) { i = unicode.IndexOfAny(IdnMapping.M_Dots, num); if (i < 0) { i = unicode.Length; } if (i == num) { if (i != unicode.Length) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } break; } else { stringBuilder.Append("xn--"); bool flag = false; BidiCategory bidiCategory = CharUnicodeInfo.GetBidiCategory(unicode, num); if (bidiCategory == BidiCategory.RightToLeft || bidiCategory == BidiCategory.RightToLeftArabic) { flag = true; int num3 = i - 1; if (char.IsLowSurrogate(unicode, num3)) { num3--; } bidiCategory = CharUnicodeInfo.GetBidiCategory(unicode, num3); if (bidiCategory != BidiCategory.RightToLeft && bidiCategory != BidiCategory.RightToLeftArabic) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } } int j = 0; for (int k = num; k < i; k++) { BidiCategory bidiCategory2 = CharUnicodeInfo.GetBidiCategory(unicode, k); if (flag && bidiCategory2 == BidiCategory.LeftToRight) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } if (!flag && (bidiCategory2 == BidiCategory.RightToLeft || bidiCategory2 == BidiCategory.RightToLeftArabic)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadBidi"), "unicode"); } if (IdnMapping.basic((uint)unicode[k])) { stringBuilder.Append(IdnMapping.encode_basic(unicode[k])); j++; } else if (char.IsSurrogatePair(unicode, k)) { k++; } } int num4 = j; if (num4 == i - num) { stringBuilder.Remove(num2, "xn--".Length); } else { if (unicode.Length - num >= "xn--".Length && unicode.Substring(num, "xn--".Length).Equals("xn--", StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadPunycode"), "unicode"); } int num5 = 0; if (num4 > 0) { stringBuilder.Append('-'); } int num6 = 128; int num7 = 0; int num8 = 72; while (j < i - num) { int num9 = 134217727; int num10; for (int l = num; l < i; l += (IdnMapping.IsSupplementary(num10) ? 2 : 1)) { num10 = char.ConvertToUtf32(unicode, l); if (num10 >= num6 && num10 < num9) { num9 = num10; } } num7 += (num9 - num6) * (j - num5 + 1); num6 = num9; for (int l = num; l < i; l += (IdnMapping.IsSupplementary(num10) ? 2 : 1)) { num10 = char.ConvertToUtf32(unicode, l); if (num10 < num6) { num7++; } if (num10 == num6) { int num11 = num7; int num12 = 36; for (;;) { int num13 = (num12 <= num8) ? 1 : ((num12 >= num8 + 26) ? 26 : (num12 - num8)); if (num11 < num13) { break; } stringBuilder.Append(IdnMapping.encode_digit(num13 + (num11 - num13) % (36 - num13))); num11 = (num11 - num13) / (36 - num13); num12 += 36; } stringBuilder.Append(IdnMapping.encode_digit(num11)); num8 = IdnMapping.adapt(num7, j - num5 + 1, j == num4); num7 = 0; j++; if (IdnMapping.IsSupplementary(num9)) { j++; num5++; } } } num7++; num6++; } } if (stringBuilder.Length - num2 > 63) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadLabelSize"), "unicode"); } if (i != unicode.Length) { stringBuilder.Append('.'); } num = i + 1; num2 = stringBuilder.Length; } } if (stringBuilder.Length > 255 - (IdnMapping.IsDot(unicode[unicode.Length - 1]) ? 0 : 1)) { throw new ArgumentException(Environment.GetResourceString("Argument_IdnBadNameSize", new object[] { 255 - (IdnMapping.IsDot(unicode[unicode.Length - 1]) ? 0 : 1) }), "unicode"); } return(stringBuilder.ToString()); }