using System.CodeDom;
using System.CodeDom.Compiler;
using System.Text;
namespace StabilityMatrix.Core.Extensions;
public static class StringExtensions
{
private static string EncodeNonAsciiCharacters(string value) {
var sb = new StringBuilder();
foreach (var c in value)
{
// If not ascii or not printable
if (c > 127 || c < 32)
{
// This character is too big for ASCII
var encodedValue = "\\u" + ((int) c).ToString("x4");
sb.Append(encodedValue);
}
else {
sb.Append(c);
}
}
return sb.ToString();
}
///
/// Converts string to repr
///
public static string ToRepr(this string str)
{
using var writer = new StringWriter();
using var provider = CodeDomProvider.CreateProvider("CSharp");
provider.GenerateCodeFromExpression(
new CodePrimitiveExpression(str),
writer,
new CodeGeneratorOptions {IndentString = "\t"});
var literal = writer.ToString();
// Replace split lines
literal = literal.Replace($"\" +{Environment.NewLine}\t\"", "");
// Encode non-ascii characters
literal = EncodeNonAsciiCharacters(literal);
// Surround with single quotes
literal = literal.Trim('"');
literal = $"'{literal}'";
return literal;
}
///
/// Counts continuous sequence of a character
/// from the start of the string
///
public static int CountStart(this string str, char c)
{
var count = 0;
foreach (var ch in str)
{
if (ch == c)
{
count++;
}
else
{
break;
}
}
return count;
}
}