74 lines
2.9 KiB
C#
74 lines
2.9 KiB
C#
namespace PlotLine.Services;
|
|
|
|
public static class CharacterSexHintService
|
|
{
|
|
public const string Unknown = "Unknown";
|
|
public const string Female = "Female";
|
|
public const string Male = "Male";
|
|
public const string NonBinaryOrOther = "NonBinaryOrOther";
|
|
|
|
private static readonly HashSet<string> FemaleNames = new(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
"abby", "abigail", "alice", "alison", "allison", "amanda", "amelia", "amy", "angela", "anna", "anne",
|
|
"beth", "bethany", "carol", "caroline", "catherine", "charlotte", "chloe", "cindy", "claire", "daisy",
|
|
"diana", "emily", "emma", "eva", "eve", "grace", "hannah", "helen", "isabel", "isabella", "jane",
|
|
"jessica", "julia", "julie", "kate", "katie", "laura", "lily", "lucy", "maggie", "margaret", "mary",
|
|
"molly", "nicola", "olivia", "rachel", "rebecca", "rose", "sarah", "sophie", "susan", "victoria",
|
|
"zoe"
|
|
};
|
|
|
|
private static readonly HashSet<string> MaleNames = new(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
"adam", "alan", "alexander", "andrew", "anthony", "arthur", "ben", "benjamin", "brian", "charles",
|
|
"chris", "christopher", "daniel", "david", "edward", "george", "harry", "henry", "ian", "jack",
|
|
"james", "john", "jonathan", "joseph", "kevin", "mark", "matthew", "michael", "nick", "nicolas",
|
|
"nicholas", "oliver", "paul", "peter", "philip", "richard", "robert", "samuel", "simon", "stephen",
|
|
"steven", "thomas", "tom", "william"
|
|
};
|
|
|
|
private static readonly HashSet<string> AmbiguousNames = new(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
"alex", "andy", "ashley", "billie", "blair", "bobbie", "casey", "charlie", "drew", "frankie",
|
|
"jamie", "jessie", "jo", "jordan", "lee", "leslie", "morgan", "pat", "riley", "robyn", "robin",
|
|
"sam", "sandy", "shannon", "taylor", "terry"
|
|
};
|
|
|
|
public static string Suggest(string? name)
|
|
{
|
|
var token = FirstNameToken(name);
|
|
if (string.IsNullOrWhiteSpace(token) || AmbiguousNames.Contains(token))
|
|
{
|
|
return Unknown;
|
|
}
|
|
|
|
if (FemaleNames.Contains(token))
|
|
{
|
|
return Female;
|
|
}
|
|
|
|
return MaleNames.Contains(token) ? Male : Unknown;
|
|
}
|
|
|
|
public static string Normalise(string? value, string? fallbackName = null)
|
|
=> value?.Trim() switch
|
|
{
|
|
Female => Female,
|
|
Male => Male,
|
|
NonBinaryOrOther => NonBinaryOrOther,
|
|
Unknown => Unknown,
|
|
_ => Suggest(fallbackName)
|
|
};
|
|
|
|
private static string FirstNameToken(string? name)
|
|
{
|
|
var clean = name?.Trim();
|
|
if (string.IsNullOrWhiteSpace(clean))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
var first = clean.Split(' ', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? string.Empty;
|
|
return first.Trim('.', ',', ';', ':', '\'', '"').ToLowerInvariant();
|
|
}
|
|
}
|