diff --git a/CHANGELIST.md b/CHANGELIST.md index 6006ae7f..f5d082c3 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -144,6 +144,7 @@ - Fix hardware info - Add specialized CDS/SafeDisc filter - Add unused article formatter +- Add language filtering to formatter ### 2.3 (2022-02-05) - Start overhauling Redump information pulling, again diff --git a/MPF.Library/InfoTool.cs b/MPF.Library/InfoTool.cs index b16b73eb..0f324742 100644 --- a/MPF.Library/InfoTool.cs +++ b/MPF.Library/InfoTool.cs @@ -1184,9 +1184,13 @@ namespace MPF.Library /// Adjust a disc title so that it will be processed correctly by Redump /// /// Existing title to potentially reformat + /// Language to use for assuming articles /// The reformatted title - /// TODO: Limit normalization by language - public static string NormalizeDiscTitle(string title) + /// + /// If the language of the title is unknown or if it's multilingual, + /// pass in Language.English for standardized coverage. + /// + public static string NormalizeDiscTitle(string title, Language language) { // If we have an invalid title, just return it as-is if (string.IsNullOrWhiteSpace(title)) @@ -1200,142 +1204,311 @@ namespace MPF.Library return title; // Determine if we have a definite or indefinite article as the first item - switch (splitTitle[0].ToLowerInvariant()) + string firstItem = splitTitle[0]; + switch (firstItem.ToLowerInvariant()) { // Latin script articles - case "'n": // Manx, Quenya - case "a": // English, Hungarian, Portuguese, Scots - case "a'": // English, Hungarian, Irish, Scottish Gaelic - case "al": // Breton - case "am": // Scottish Gaelic - case "an": // Breton, Cornish, English, Irish, Scottish Gaelic - case "anek": // Nepali - case "ar": // Breton - case "az": // Hungarian - case "ān": // Persian - case "as": // Portuguese - case "d'": // Luxembourgish - case "das": // German - case "dat": // Luxembourgish - case "de": // Dutch - case "déi": // Luxembourgish - case "dem": // German, Luxembourgish - case "den": // Dutch, German, Luxembourgish - case "der": // Dutch, German, Luxembourgish - case "des": // Dutch, French, German - case "die": // Afrikaans, German - case "e": // Papiamento - case "een": // Dutch - case "egy": // Hungarian - case "ei": // Norwegian - case "ein": // German, Norwegian - case "eine": // German - case "einem": // German - case "einen": // German - case "einer": // German - case "eines": // German - case "eit": // Norwegian - case "ek": // Nepali - case "el": // Arabic, Catalan, Spanish - case "els": // Catalan - case "en": // Danish, Luxembourgish, Norwegian, Sindarin, Swedish - case "eng": // Luxembourgish - case "engem": // Luxembourgish - case "enger": // Luxembourgish - case "es": // Catalan - case "et": // Danish, Norwegian - case "ett": // Swedish - case "euta": // Nepali - case "euti": // Nepali - case "gli": // Italian - case "he": // Hawaiian, Māori - case "het": // Dutch - case "i": // Italian, Khasi, Quenya, Sindarin - case "il": // Italian - case "in": // Persian, Quenya, Sindarin - case "ka": // Hawaiian, Khasi - case "ke": // Hawaiian - case "ki": // Khasi - case "kunai": // Nepali - case "l'": // Catalan, French, Italian - case "la": // Catalan, Esperanto, French, Italian, Spanish - case "las": // Spanish - case "le": // French, Interlingua, Italian - case "les": // Catalan, French - case "lo": // Catalan, Italian, Spanish - case "los": // Catalan, Spanish - case "na": // Irish, Scottish Gaelic - case "nam": // Scottish Gaelic - case "nan": // Scottish Gaelic - case "nā": // Hawaiian - case "ngā": // Māori - case "niște": // Romanian - case "ny": // Manx - case "o": // Portuguese, Romanian - case "os": // Portuguese - case "sa": // Catalan - case "sang": // Malay - case "se": // Finnish - case "ses": // Catalan - case "si": // Malay - case "te": // Māori - case "the": // English, Scots - case "u": // Khasi - case "ul": // Breton - case "um": // Portuguese - case "uma": // Portuguese - case "umas": // Portuguese - case "un": // Breton, Catalan, French, Interlingua, Italian, Papiamento, Romanian, Spanish - case "un'": // Italian - case "una": // Catalan, Italian - case "unas": // Spanish - case "une": // French - case "uno": // Italian - case "unos": // Spanish - case "uns": // Catalan, Portuguese - case "unei": // Romanian - case "unes": // Catalan - case "unor": // Romanian - case "unui": // Romanian - case "ur": // Breton - case "y": // Manx, Welsh - case "yaow": // Pashto - case "yaowə": // Pashto - case "yaowa": // Pashto - case "yaowey": // Pashto - case "ye": // Persian - case "yek": // Persian - case "yn": // Manx - case "yr": // Welsh + case "'n" + when language is Language.Manx: + case "a" + when language is Language.English + || language is Language.Hungarian + || language is Language.Portuguese + || language is Language.Scots: + case "a'" + when language is Language.English + || language is Language.Hungarian + || language is Language.Irish + || language is Language.Gaelic: // Scottish Gaelic + case "al" + when language is Language.Breton: + case "am" + when language is Language.Gaelic: // Scottish Gaelic + case "an" + when language is Language.Breton + || language is Language.Cornish + || language is Language.English + || language is Language.Irish + || language is Language.Gaelic: // Scottish Gaelic + case "anek" + when language is Language.Nepali: + case "ar" + when language is Language.Breton: + case "az" + when language is Language.Hungarian: + case "ān" + when language is Language.Persian: + case "as" + when language is Language.Portuguese: + case "d'" + when language is Language.Luxembourgish: + case "das" + when language is Language.German: + case "dat" + when language is Language.Luxembourgish: + case "de" + when language is Language.Dutch: + case "déi" + when language is Language.Luxembourgish: + case "dem" + when language is Language.German + || language is Language.Luxembourgish: + case "den" + when language is Language.Dutch + || language is Language.German + || language is Language.Luxembourgish: + case "der" + when language is Language.Dutch + || language is Language.German + || language is Language.Luxembourgish: + case "des" + when language is Language.Dutch + || language is Language.French + || language is Language.German: + case "die" + when language is Language.Afrikaans + || language is Language.German: + case "e" + when language is Language.Papiamento: + case "een" + when language is Language.Dutch: + case "egy" + when language is Language.Hungarian: + case "ei" + when language is Language.Norwegian: + case "ein" + when language is Language.German + || language is Language.Norwegian: + case "eine" + when language is Language.German: + case "einem" + when language is Language.German: + case "einen" + when language is Language.German: + case "einer" + when language is Language.German: + case "eines" + when language is Language.German: + case "eit" + when language is Language.Norwegian: + case "ek" + when language is Language.Nepali: + case "el" + when language is Language.Arabic + || language is Language.Catalan + || language is Language.Spanish: + case "els" + when language is Language.Catalan: + case "en" + when language is Language.Danish + || language is Language.Luxembourgish + || language is Language.Norwegian + || language is Language.Swedish: + case "eng" + when language is Language.Luxembourgish: + case "engem" + when language is Language.Luxembourgish: + case "enger" + when language is Language.Luxembourgish: + case "es" + when language is Language.Catalan: + case "et" + when language is Language.Danish + || language is Language.Norwegian: + case "ett" + when language is Language.Swedish: + case "euta" + when language is Language.Nepali: + case "euti" + when language is Language.Nepali: + case "gli" + when language is Language.Italian: + case "he" + when language is Language.Hawaiian + || language is Language.Maori: + case "het" + when language is Language.Dutch: + case "i" + when language is Language.Italian + || language is Language.Khasi: + case "il" + when language is Language.Italian: + case "in" + when language is Language.Persian: + case "ka" + when language is Language.Hawaiian + || language is Language.Khasi: + case "ke" + when language is Language.Hawaiian: + case "ki" + when language is Language.Khasi: + case "kunai" + when language is Language.Nepali: + case "l'" + when language is Language.Catalan + || language is Language.French + || language is Language.Italian: + case "la" + when language is Language.Catalan + || language is Language.Esperanto + || language is Language.French + || language is Language.Italian + || language is Language.Spanish: + case "las" + when language is Language.Spanish: + case "le" + when language is Language.French + || language is Language.Interlingua + || language is Language.Italian: + case "les" + when language is Language.Catalan + || language is Language.French: + case "lo" + when language is Language.Catalan + || language is Language.Italian + || language is Language.Spanish: + case "los" + when language is Language.Catalan + || language is Language.Spanish: + case "na" + when language is Language.Irish + || language is Language.Gaelic: // Scottish Gaelic + case "nam" + when language is Language.Gaelic: // Scottish Gaelic + case "nan" + when language is Language.Gaelic: // Scottish Gaelic + case "nā" + when language is Language.Hawaiian: + case "ngā" + when language is Language.Maori: + case "niște" + when language is Language.Romanian: + case "ny" + when language is Language.Manx: + case "o" + when language is Language.Portuguese + || language is Language.Romanian: + case "os" + when language is Language.Portuguese: + case "sa" + when language is Language.Catalan: + case "sang" + when language is Language.Malay: + case "se" + when language is Language.Finnish: + case "ses" + when language is Language.Catalan: + case "si" + when language is Language.Malay: + case "te" + when language is Language.Maori: + case "the" + when language is Language.English + || language is Language.Scots: + case "u" + when language is Language.Khasi: + case "ul" + when language is Language.Breton: + case "um" + when language is Language.Portuguese: + case "uma" + when language is Language.Portuguese: + case "umas" + when language is Language.Portuguese: + case "un" + when language is Language.Breton + || language is Language.Catalan + || language is Language.French + || language is Language.Interlingua + || language is Language.Italian + || language is Language.Papiamento + || language is Language.Romanian + || language is Language.Spanish: + case "un'" + when language is Language.Italian: + case "una" + when language is Language.Catalan + || language is Language.Italian: + case "unas" + when language is Language.Spanish: + case "une" + when language is Language.French: + case "uno" + when language is Language.Italian: + case "unos" + when language is Language.Spanish: + case "uns" + when language is Language.Catalan + || language is Language.Portuguese: + case "unei" + when language is Language.Romanian: + case "unes" + when language is Language.Catalan: + case "unor" + when language is Language.Romanian: + case "unui" + when language is Language.Romanian: + case "ur" + when language is Language.Breton: + case "y" + when language is Language.Manx + || language is Language.Welsh: + case "ye" + when language is Language.Persian: + case "yek" + when language is Language.Persian: + case "yn" + when language is Language.Manx: + case "yr" + when language is Language.Welsh: // Non-latin script articles - case "ο": // Greek - case "η": // Greek - case "το": // Greek - case "οι": // Greek - case "τα": // Greek - case "ένας": // Greek - case "μια": // Greek - case "ένα": // Greek - case "еден": // Macedonian - case "една": // Macedonian - case "едно": // Macedonian - case "едни": // Macedonian - case "एउटा": // Nepali - case "एउटी": // Nepali - case "एक": // Nepali - case "अनेक": // Nepali - case "कुनै": // Nepali - case "يوې": // Pashto - case "يوه": // Pashto - case "يوهٔ": // Pashto - case "يو": // Pashto - case "דער": // Yiddish - case "די": // Yiddish - case "דאָס": // Yiddish - case "דעם": // Yiddish - case "אַ": // Yiddish - case "אַן": // Yiddish + case "ο" + when language is Language.Greek: + case "η" + when language is Language.Greek: + case "το" + when language is Language.Greek: + case "οι" + when language is Language.Greek: + case "τα" + when language is Language.Greek: + case "ένας" + when language is Language.Greek: + case "μια" + when language is Language.Greek: + case "ένα" + when language is Language.Greek: + case "еден" + when language is Language.Macedonian: + case "една" + when language is Language.Macedonian: + case "едно" + when language is Language.Macedonian: + case "едни" + when language is Language.Macedonian: + case "एउटा" + when language is Language.Nepali: + case "एउटी" + when language is Language.Nepali: + case "एक" + when language is Language.Nepali: + case "अनेक" + when language is Language.Nepali: + case "कुनै" + when language is Language.Nepali: + case "דער" + when language is Language.Yiddish: + case "די" + when language is Language.Yiddish: + case "דאָס" + when language is Language.Yiddish: + case "דעם" + when language is Language.Yiddish: + case "אַ" + when language is Language.Yiddish: + case "אַן" + when language is Language.Yiddish: // Seen by Redump, unknown origin case "du": @@ -1346,21 +1519,29 @@ namespace MPF.Library return title; } - // Either insert the item last or if we have a `:` or `-` - StringBuilder newTitle = new StringBuilder(); + // Insert the first item if we have a `:` or `-` + bool itemInserted = false; + StringBuilder newTitleBuilder = new StringBuilder(); for (int i = 1; i < splitTitle.Length; i++) { string segment = splitTitle[i]; - if (segment.EndsWith(":") || segment.EndsWith("-")) - newTitle.Append($"{segment}, {splitTitle[0]}"); - else if (i == splitTitle.Length - 1) - newTitle.Append($"{segment}, {splitTitle[0]}"); + { + itemInserted = true; + newTitleBuilder.Append($"{segment}, {firstItem}"); + } else - newTitle.Append($"{segment} "); + { + newTitleBuilder.Append($"{segment} "); + } } - return newTitle.ToString().Trim(); + // If we didn't insert the item yet, add it to the end + string newTitle = newTitleBuilder.ToString().Trim(); + if (!itemInserted) + newTitle = $"{newTitle}, {firstItem}"; + + return newTitle; } ///