<PackageReference Include="NJsonSchema" Version="11.5.2" />

ConversionUtilities

public class ConversionUtilities
Provides name conversion utility methods.
using System; using System.Globalization; using System.IO; using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using System.Xml.Linq; namespace NJsonSchema { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public class ConversionUtilities { [System.Runtime.CompilerServices.NullableContext(0)] private enum CamelCaseMode { None, FirstLower, FirstUpper } private static readonly char[] _camelCaseCleanupChars = new char[2] { ' ', '/' }; private static readonly char[] CamelCaseCleanupChars = _camelCaseCleanupChars; private static readonly char[] _whiteSpaceChars = new char[4] { '\n', '\r', '\t', ' ' }; private static readonly char[] _lineBreakTrimChars = new char[3] { '\n', '\t', ' ' }; private static readonly char[] _cSharpDocLineBreakChars = new char[2] { '\r', '\n' }; private static readonly Lazy<Regex> _cSharpDocLineBreakRegex = new Lazy<Regex>(() => new Regex("^( *)/// ", RegexOptions.Multiline | RegexOptions.Compiled)); public static string ConvertToCamelCase(string input) { return ConvertToCamelCase(input, false, CamelCaseMode.None); } public static string ConvertToLowerCamelCase(string input, bool firstCharacterMustBeAlpha) { return ConvertToCamelCase(input, firstCharacterMustBeAlpha, CamelCaseMode.FirstLower); } public static string ConvertToUpperCamelCase(string input, bool firstCharacterMustBeAlpha) { return ConvertToCamelCase(input, firstCharacterMustBeAlpha, CamelCaseMode.FirstUpper); } private static string ConvertToCamelCase(string input, bool firstCharacterMustBeAlpha, CamelCaseMode mode) { if (string.IsNullOrEmpty(input)) return string.Empty; if (input.AsSpan().IndexOfAny(CamelCaseCleanupChars) != -1) input = input.Replace(' ', '_').Replace('/', '_'); if (input.AsSpan().IndexOf('-') == -1) { char c = input[0]; if (char.IsNumber(c)) { if (!firstCharacterMustBeAlpha) return input; return "_" + input; } char c2; switch (mode) { case CamelCaseMode.FirstUpper: c2 = char.ToUpperInvariant(c); break; case CamelCaseMode.FirstLower: c2 = char.ToLowerInvariant(c); break; default: c2 = c; break; } char c3 = c2; if (c3 != c) { string str = c3.ToString(); string text = input; return str + text.Substring(1, text.Length - 1); } return input; } return DoFullCamelCaseConversion(input, firstCharacterMustBeAlpha, mode); } private unsafe static string DoFullCamelCaseConversion(string input, bool firstCharacterMustBeAlpha, CamelCaseMode mode) { int num = input.Length + (firstCharacterMustBeAlpha ? 1 : 0); Span<char> span2; if (num <= 256) { Span<char> span = new Span<char>(stackalloc byte[512], 256); span2 = span; } else span2 = new char[num]; Span<char> initialBuffer = span2; System.Text.ValueStringBuilder valueStringBuilder = new System.Text.ValueStringBuilder(initialBuffer); bool flag = false; for (int i = 0; i < input.Length; i++) { char c = input[i]; if (c == '-') flag = true; else if (flag) { valueStringBuilder.Append(char.ToUpperInvariant(c)); flag = false; } else { if (i == 0) { if (!firstCharacterMustBeAlpha || !char.IsNumber(c)) { switch (mode) { case CamelCaseMode.FirstUpper: c = char.ToUpperInvariant(c); break; case CamelCaseMode.FirstLower: c = char.ToLowerInvariant(c); break; } } else valueStringBuilder.Append('_'); } valueStringBuilder.Append(c); } } return valueStringBuilder.ToString(); } public static string ConvertToStringLiteral(string input) { return ConvertToStringLiteral(input, null, null); } internal static string ConvertToStringLiteral(string input, [System.Runtime.CompilerServices.Nullable(2)] string prefix, [System.Runtime.CompilerServices.Nullable(2)] string postfix) { System.Text.ValueStringBuilder valueStringBuilder = new System.Text.ValueStringBuilder(input.Length + (prefix?.Length ?? 0) + (postfix?.Length ?? 0)); try { if (prefix != null) valueStringBuilder.Append(prefix); foreach (char c in input) { switch (c) { case '\'': valueStringBuilder.Append("\\'"); break; case '"': valueStringBuilder.Append("\\\""); break; case '\\': valueStringBuilder.Append("\\\\"); break; case '': valueStringBuilder.Append("\\0"); break; case '': valueStringBuilder.Append("\\a"); break; case '\b': valueStringBuilder.Append("\\b"); break; case ' ': valueStringBuilder.Append("\\f"); break; case '\n': valueStringBuilder.Append("\\n"); break; case '\r': valueStringBuilder.Append("\\r"); break; case '\t': valueStringBuilder.Append("\\t"); break; case ' ': valueStringBuilder.Append("\\v"); break; default: if (c >= ' ' && c <= '~') valueStringBuilder.Append(c); else { valueStringBuilder.Append("\\u"); int num = c; valueStringBuilder.Append(num.ToString("x4", CultureInfo.InvariantCulture)); } break; } } if (postfix != null) valueStringBuilder.Append(postfix); return valueStringBuilder.ToString(); } finally { valueStringBuilder.Dispose(); } } public static string TrimWhiteSpaces([System.Runtime.CompilerServices.Nullable(2)] string text) { return text?.Trim(_whiteSpaceChars) ?? string.Empty; } [System.Runtime.CompilerServices.NullableContext(0)] public static ReadOnlySpan<char> TrimWhiteSpaces(ReadOnlySpan<char> text) { return text.Trim(_whiteSpaceChars); } public static string RemoveLineBreaks([System.Runtime.CompilerServices.Nullable(2)] string text) { return text?.Replace("\r", "").Replace("\n", " \n").Replace("\n ", "\n") .Replace(" \n", " \n") .Replace("\n", "") .Trim(_lineBreakTrimChars) ?? string.Empty; } public static string Singularize(string word) { if (word == "people") return "Person"; if (!Polyfills.EndsWith(word, 's')) return word; return word.Substring(0, word.Length - 1); } public static string Tab(string input, int tabCount) { if (input == null) return ""; string text = CreateTabString(tabCount); if (text.Length != 0) { System.Text.ValueStringBuilder valueStringBuilder = new System.Text.ValueStringBuilder(input.Length); try { for (int i = 0; i < input.Length; i++) { char c = input[i]; valueStringBuilder.Append(c); if (c == '\n') { bool flag = false; for (int j = i + 1; j < input.Length; j++) { char c2 = input[j]; if (c2 == '\n') break; if (!char.IsWhiteSpace(c2)) { flag = true; break; } } if (flag) valueStringBuilder.Append(text); } } return valueStringBuilder.ToString(); } finally { valueStringBuilder.Dispose(); } } return input; } public static void Tab(string input, int tabCount, TextWriter writer) { string tabString = CreateTabString(tabCount); AddPrefixToBeginningOfNonEmptyLines(input, tabString, writer); } private static void AddPrefixToBeginningOfNonEmptyLines(string input, string tabString, TextWriter writer) { if (tabString.Length != 0) { for (int i = 0; i < input.Length; i++) { char c = input[i]; writer.Write(c); if (c == '\n') { bool flag = false; for (int j = i + 1; j < input.Length; j++) { char c2 = input[j]; if (c2 == '\n') break; if (!char.IsWhiteSpace(c2)) { flag = true; break; } } if (flag) writer.Write(tabString); } } } } public static string ConvertCSharpDocs(string input, int tabCount) { if (input == null) input = ""; if (input.IndexOfAny(_cSharpDocLineBreakChars) != -1) input = input.Replace("\r", string.Empty).Replace("\n", "\n" + CreateTabString(tabCount) + "/// "); string input2 = new XText(input).ToString(); return _cSharpDocLineBreakRegex.Value.Replace(input2, (Match m) => m.Groups[1]?.ToString() + "/// <br/>"); } private static string CreateTabString(int tabCount) { switch (tabCount) { case 0: return ""; case 1: return " "; case 2: return " "; default: return new string(' ', 4 * tabCount); } } } }