WikiFunctions.Tools.MakeHumanCatKey C# (CSharp) Method

MakeHumanCatKey() public static method

Returns Category key from article name e.g. "David Smith" returns "Smith, David". special case: "John Doe, Jr." turns into "Doe, Jonn Jr." https://en.wikipedia.org/wiki/Wikipedia:Categorization_of_people
public static MakeHumanCatKey ( string name, string articletext ) : string
name string
articletext string
return string
        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);
        }

Usage Example

Beispiel #1
0
        /// <summary>
        /// Applies the key words "%%title%%" etc.
        /// </summary>
        public static string ApplyKeyWords(string Title, string Text)
        {
            Text = Text.Replace("%%title%%", Title);
            Text = Text.Replace("%%key%%", Tools.MakeHumanCatKey(Title));

            Text = Text.Replace("%%titlename%%", Tools.RemoveNamespaceString(Title));
            Text = Text.Replace("%%namespace%%", Tools.GetNamespaceString(Title));

            return(Text);
        }
Tools