getInitials: handle more cases

See [#5029]][0].

[0]: https://github.com/signalapp/Signal-Desktop/pull/5029
This commit is contained in:
Kasia Kosturek 2021-04-02 22:30:49 +02:00 committed by GitHub
parent 7438590bc0
commit d20cc59a26
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 12 deletions

View file

@ -1,24 +1,31 @@
// Copyright 2018-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
const BAD_CHARACTERS = /[^A-Za-z\s]+/g;
const WHITESPACE = /\s+/g;
function removeNonInitials(name: string) {
return name.replace(BAD_CHARACTERS, '').replace(WHITESPACE, ' ');
}
export function getInitials(name?: string): string | undefined {
if (!name) {
return undefined;
}
const cleaned = removeNonInitials(name);
const parts = cleaned.split(' ');
const initials = parts.map(part => part.trim()[0]);
if (!initials.length) {
const parsedName = name
// remove all chars that are not letters or separators
.replace(/[^\p{L}\p{Z}]+/gu, '')
// replace all chars that are separators with a single ASCII space
.replace(/\p{Z}+/gu, ' ')
.trim();
if (!parsedName) {
return undefined;
}
return initials.slice(0, 2).join('');
// check if chars in the parsed string are initials
if (parsedName.length === 2 && parsedName === parsedName.toUpperCase()) {
return parsedName;
}
const parts = parsedName.toUpperCase().split(' ');
const partsLen = parts.length;
return partsLen === 1
? parts[0].charAt(0)
: parts[0].charAt(0) + parts[partsLen - 1].charAt(0);
}