public static string MakeHumanCatKey(string name, string articletext)
{
name = RemoveNamespaceString(Regex.Replace(CleanSortKey(name), @"\(.*?\)$", "").Replace("'", "").Trim()).Trim();
string origName = name;
// ukwiki uses "Lastname Firstname Patronymic" convention, nothing more is needed
// if page has {{Chinese name}} etc. then family name is already first
if (!name.Contains(" ") || Variables.LangCode.Equals("uk") || WikiRegexes.SurnameClarificationTemplates.IsMatch(articletext))
return FixupDefaultSort(origName);
string suffix = "";
int pos = name.IndexOf(',');
// ruwiki has "Lastname, Firstname Patronymic" convention
if (pos >= 0 && !Variables.LangCode.Equals("ru"))
{
suffix = name.Substring(pos + 1).Trim();
name = name.Substring(0, pos).Trim();
}
// https://en.wikipedia.org/wiki/Wikipedia_talk:AutoWikiBrowser/Bugs/Archive_11#Arabic_names
// Arabic names etc. use "Full Name" format
// find the most common of these names and use that format for them
if (Regex.IsMatch(origName, @"(\b(Abd[au]ll?ah?|Ahmed|Mustaq|Merza|Kandah[a-z]*|Mohabet|Nasrat|Nazargul|Yasi[mn]|Husayn|Akram|M[ou]hamm?[ae]d\w*|Abd[eu]l|Razzaq|Adil|Anwar|Fahed|Habi[bdr]|Hafiz|Jawad|Hassan|Ibr[ao]him|Khal[ei]d|Karam|Majid|Mustafa|Rash[ie]d|Yusef|[Bb]in|Nasir|Aziz|Rahim|Kareem|Abu|Aminullah|Fahd|Fawaz|Ahmad|Rahman|Hasan|Nassar|A(?:zz|s)am|Jam[ai]l|Tariqe?|Yussef|Said|Wass?im|Wazir|Tarek|Umran|Mahmoud|Malik|Shoaib|Hizani|Abib|Raza|Salim|Iqbal|Saleh|Hajj|Brahim|Zahir|Wasm|Yo?usef|Yunis|Zakim|Shah|Yasser|Samil|Akh[dk]ar|Haji|Uthman|Khadr|Asiri|Rajab|Shakouri|Ishmurat|Anazi|Nahdi|Zaheed|Ramzi|Rasul|Muktar|Muhassen|Radhi|Rafat|Kadir|Zaman|Karim|Awal|Mahmud|Mohammon|Husein|Airat|Alawi|Ullah|Sayaf|Henali|Ismael|Salih|Mahnut|Faha|Hammad|Hozaifa|Ravil|Jehan|Abdah|Djamel|Sabir|Ruhani|Hisham|Rehman|Mesut|Mehdi|Lakhdar|Mourad|Fazal[a-z]*|Mukit|Jalil|Rustam|Jumm?a|Omar Ali)\b|(?:[bdfmtnrz]ullah|alludin|[hm]atulla|r[ao]llah|harudin|millah)\b|\b(?:Abd[aeu][lr]|Nazur| Al[- ][A-Z]| al-[A-Z]))"))
return FixupDefaultSort(origName);
// Person of Place --> Person Of Place, WP:NAMESORT
// WordsOnly regex check to avoid backtracking issue
if (WordsOnly.IsMatch(origName) && PersonOfPlace.IsMatch(origName))
{
origName = PersonOfPlace.Replace(origName,
m =>
m.Groups["person"].Value +
(m.Groups["ordinal"].Length > 0 ? " " + RomanToInt(m.Groups["ordinal"].Value) : "") + " of " +
m.Groups["place"].Value);
return FixupDefaultSort(origName);
}
int intLast = name.LastIndexOf(" ") + 1;
string lastName = name.Substring(intLast).Trim();
if (name.Length > 0)
name = name.Remove(intLast).Trim();
if (IsRomanNumber(lastName) || Regex.IsMatch(lastName, @"^[SJsj]n?r\.$"))
{
if (name.Contains(" "))
{
suffix += lastName;
intLast = name.LastIndexOf(" ") + 1;
lastName = name.Substring(intLast);
name = name.Remove(intLast).Trim();
}
else
{
// We have something like "Peter" "II" "King of Spain" (first/last/suffix), so return what we started with
// OR We have "Fred" "II", we don't want to return "II, Fred" so we must return "Fred II"
return FixupDefaultSort(origName);
}
}
name = (lastName + ", " + (name.Length > 0 ? name + ", " : "") + suffix).Trim(" ,".ToCharArray());
// set correct casing
return FixupDefaultSort(name);
}