mirror of
https://github.com/PeWu/topola-viewer.git
synced 2026-03-15 20:13:45 +00:00
Refactor convertPersonNames()
This commit is contained in:
@@ -397,49 +397,53 @@ function convertPerson(person: Person, intl: IntlShape): JsonIndi {
|
|||||||
}
|
}
|
||||||
return indi;
|
return indi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isSimilarName(name1: string, name2: string) {
|
||||||
|
return StringUtils.compareSimilarityPercent(name1, name2) >= 75;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMarriedName(person: Person) {
|
||||||
|
if (
|
||||||
|
!person.Spouses ||
|
||||||
|
person.LastNameCurrent === 'Unknown' ||
|
||||||
|
person.LastNameCurrent === person.LastNameAtBirth
|
||||||
|
) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const nameParts = person.LastNameCurrent.split(/[- ,]/);
|
||||||
|
// In some languages the same names can differ a bit between genders,
|
||||||
|
// so regular equals comparison cannot be used.
|
||||||
|
// To verify if spouse has the same name, person name is split to include
|
||||||
|
// people with double names, then there is a check if any name part is
|
||||||
|
// at least 75% similar to spouse name.
|
||||||
|
const matchingNames = Object.entries(person.Spouses)
|
||||||
|
.flatMap(([, spousePerson]) => spousePerson.LastNameAtBirth.split(/[- ,]/))
|
||||||
|
.some((spousePersonNamePart) =>
|
||||||
|
nameParts.some((personNamePart) =>
|
||||||
|
isSimilarName(spousePersonNamePart, personNamePart),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return matchingNames ? person.LastNameCurrent : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resolve birth name, married name and aka name with following logic:
|
* Resolve birth name, married name and aka name with following logic:
|
||||||
- birth name is always prioritized and is set if exists and is not unknown
|
* - birth name is always prioritized and is set if exists and is not unknown
|
||||||
- married name is based on LastNameCurrent and is set if it's different than birth name
|
* - married name is based on LastNameCurrent and is set if it's different than
|
||||||
and one of the spouses has it as their birth name
|
* birth name and one of the spouses has it as their birth name
|
||||||
- aka name is based on LastNameOther and is set if it's different than others
|
* - aka name is based on LastNameOther and is set if it's different than others
|
||||||
*/
|
*/
|
||||||
function convertPersonNames(person: Person) {
|
function convertPersonNames(person: Person) {
|
||||||
return {
|
const birth =
|
||||||
birth:
|
person.LastNameAtBirth !== 'Unknown' ? person.LastNameAtBirth : undefined;
|
||||||
person.LastNameAtBirth !== 'Unknown' ? person.LastNameAtBirth : undefined,
|
const married = getMarriedName(person);
|
||||||
married:
|
const aka =
|
||||||
person.Spouses &&
|
person.LastNameOther !== 'Unknown' &&
|
||||||
person.LastNameCurrent !== 'Unknown' &&
|
person.LastNameAtBirth !== person.LastNameOther &&
|
||||||
person.LastNameCurrent !== person.LastNameAtBirth &&
|
person.LastNameCurrent !== person.LastNameOther
|
||||||
Object.entries(person.Spouses)
|
? person.LastNameOther
|
||||||
.flatMap(([, spousePerson]) =>
|
: undefined;
|
||||||
spousePerson.LastNameAtBirth.split(/[- ,]/),
|
return {birth, married, aka};
|
||||||
)
|
|
||||||
.filter(
|
|
||||||
(spousePersonNamePart) =>
|
|
||||||
/* In some languages the same names can differ a bit between genders,
|
|
||||||
so regular equals comparison cannot be used.
|
|
||||||
To verify if spouse has the same name, person name is split to include people with double names,
|
|
||||||
then there is a check if any name part is at least 75% similar to spouse name.
|
|
||||||
*/
|
|
||||||
person.LastNameCurrent.split(/[- ,]/).filter(
|
|
||||||
(personNamePart) =>
|
|
||||||
StringUtils.compareSimilarityPercent(
|
|
||||||
spousePersonNamePart,
|
|
||||||
personNamePart,
|
|
||||||
) >= 75,
|
|
||||||
).length,
|
|
||||||
).length
|
|
||||||
? person.LastNameCurrent
|
|
||||||
: undefined,
|
|
||||||
aka:
|
|
||||||
person.LastNameOther !== 'Unknown' &&
|
|
||||||
person.LastNameAtBirth !== person.LastNameOther &&
|
|
||||||
person.LastNameCurrent !== person.LastNameOther
|
|
||||||
? person.LastNameOther
|
|
||||||
: undefined,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user