Skip to content

Commit

Permalink
feat: Added accent normalization in Players#findPlayers
Browse files Browse the repository at this point in the history
  • Loading branch information
phinner committed Nov 13, 2023
1 parent d6752a3 commit 95cfb81
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package fr.xpdustry.distributor.api.util;

import arc.util.Strings;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -68,18 +69,18 @@ public static List<Player> findPlayers(final String query, final boolean uuid) {
}

final List<Player> result = new ArrayList<>();
final var plainName = stripAndLower(query);
final var normalized = normalize(query);

Player match = null;
int matches = 0;

for (final var player : Groups.player) {
final var playerName = stripAndLower(player.name());
if (playerName.equalsIgnoreCase(plainName)) {
final var playerName = normalize(player.name());
if (playerName.equalsIgnoreCase(normalized)) {
match = player;
matches++;
result.add(player);
} else if (playerName.contains(plainName)) {
} else if (playerName.contains(normalized)) {
result.add(player);
}
}
Expand All @@ -97,7 +98,10 @@ public static Locale getLocale(final Player player) {
return Locale.forLanguageTag(player.locale().replace('_', '-'));
}

private static String stripAndLower(final String string) {
return Strings.stripColors(string.toLowerCase(Locale.ROOT));
// https://stackoverflow.com/a/4122207
private static String normalize(final String string) {
return Normalizer.normalize(Strings.stripColors(string), Normalizer.Form.NFD)
.replaceAll("[^\\p{ASCII}]", "")
.toLowerCase(Locale.ROOT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ void test_find_by_exact_name() {
assertThat(Players.findPlayers("deez")).singleElement().isEqualTo(this.player1);
}

@Test
void test_find_by_name_accents() {
assertThat(Players.findPlayers("phînnér")).singleElement().isEqualTo(this.player3);
}

@Test
void test_find_by_multiple_exact_names() {
assertThat(Players.findPlayers("zeta")).containsExactlyInAnyOrder(this.player4, this.player5);
Expand Down

0 comments on commit 95cfb81

Please sign in to comment.