2020-12-29 01:14:19 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace NoSoliciting.Trainer {
|
|
|
|
|
public static class Util {
|
2021-01-30 21:02:37 +00:00
|
|
|
|
private static readonly Dictionary<char, string> Replacements = new() {
|
2020-12-29 01:14:19 +00:00
|
|
|
|
// numerals
|
|
|
|
|
['\ue055'] = "1",
|
|
|
|
|
['\ue056'] = "2",
|
|
|
|
|
['\ue057'] = "3",
|
|
|
|
|
['\ue058'] = "4",
|
|
|
|
|
['\ue059'] = "5",
|
|
|
|
|
['\ue099'] = "10",
|
|
|
|
|
['\ue09a'] = "11",
|
|
|
|
|
['\ue09b'] = "12",
|
|
|
|
|
['\ue09c'] = "13",
|
|
|
|
|
['\ue09d'] = "14",
|
|
|
|
|
['\ue09e'] = "15",
|
|
|
|
|
['\ue09f'] = "16",
|
|
|
|
|
['\ue0a0'] = "17",
|
|
|
|
|
['\ue0a1'] = "18",
|
|
|
|
|
['\ue0a2'] = "19",
|
|
|
|
|
['\ue0a3'] = "20",
|
|
|
|
|
['\ue0a4'] = "21",
|
|
|
|
|
['\ue0a5'] = "22",
|
|
|
|
|
['\ue0a6'] = "23",
|
|
|
|
|
['\ue0a7'] = "24",
|
|
|
|
|
['\ue0a8'] = "25",
|
|
|
|
|
['\ue0a9'] = "26",
|
|
|
|
|
['\ue0aa'] = "27",
|
|
|
|
|
['\ue0ab'] = "28",
|
|
|
|
|
['\ue0ac'] = "29",
|
|
|
|
|
['\ue0ad'] = "30",
|
|
|
|
|
['\ue0ae'] = "31",
|
|
|
|
|
|
|
|
|
|
// symbols
|
|
|
|
|
['\ue0af'] = "+",
|
|
|
|
|
['\ue070'] = "?",
|
|
|
|
|
|
|
|
|
|
// letters in other sets
|
|
|
|
|
['\ue022'] = "A",
|
|
|
|
|
['\ue024'] = "_A",
|
|
|
|
|
['\ue0b0'] = "E",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private const char LowestReplacement = '\ue022';
|
|
|
|
|
|
|
|
|
|
public static string Normalise(string input) {
|
|
|
|
|
if (input == null) {
|
|
|
|
|
throw new ArgumentNullException(nameof(input), "input cannot be null");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// replace ffxiv private use chars
|
|
|
|
|
var builder = new StringBuilder(input.Length);
|
|
|
|
|
foreach (var c in input) {
|
|
|
|
|
if (c < LowestReplacement) {
|
|
|
|
|
goto AppendNormal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// alphabet
|
|
|
|
|
if (c >= 0xe071 && c <= 0xe08a) {
|
|
|
|
|
builder.Append((char) (c - 0xe030));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 0 to 9
|
|
|
|
|
if (c >= 0xe060 && c <= 0xe069) {
|
|
|
|
|
builder.Append((char) (c - 0xe030));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 1 to 9
|
|
|
|
|
if (c >= 0xe0b1 && c <= 0xe0b9) {
|
|
|
|
|
builder.Append((char) (c - 0xe080));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 1 to 9 again
|
|
|
|
|
if (c >= 0xe090 && c <= 0xe098) {
|
|
|
|
|
builder.Append((char) (c - 0xe05f));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// replacements in map
|
|
|
|
|
if (Replacements.TryGetValue(c, out var rep)) {
|
|
|
|
|
builder.Append(rep);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AppendNormal:
|
|
|
|
|
builder.Append(c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
input = builder.ToString();
|
|
|
|
|
|
|
|
|
|
// NFKD unicode normalisation
|
|
|
|
|
return input.Normalize(NormalizationForm.FormKD);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|