Skip to content

Commit

Permalink
GH-60: Fix issue where firstname equals lastname
Browse files Browse the repository at this point in the history
  • Loading branch information
magicsunday committed May 13, 2024
1 parent f57fe96 commit fadc4e1
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 22 deletions.
2 changes: 1 addition & 1 deletion resources/js/descendants-chart.min.js

Large diffs are not rendered by default.

58 changes: 39 additions & 19 deletions resources/js/modules/lib/tree/name.js
Original file line number Diff line number Diff line change
Expand Up @@ -274,51 +274,71 @@ export default class Name
let lastnames = {};
let minPosFirstnames = Number.MAX_SAFE_INTEGER;
let minPosLastnames = Number.MAX_SAFE_INTEGER;
let offset = 0;

let firstnameOffset = 0;
let firstnameMap = new Map();

// Iterate over the individual name components and determine their position in the overall
// name and insert the component at the corresponding position in the result object.
for (let i in datum.data.data.firstNames) {
const pos = datum.data.data.name.indexOf(datum.data.data.firstNames[i], offset);
const pos = datum.data.data.name.indexOf(datum.data.data.firstNames[i], firstnameOffset);

if (pos !== -1) {
offset = pos;
firstnameOffset = pos + datum.data.data.firstNames[i].length;

if (pos < minPosFirstnames) {
minPosFirstnames = pos;
}

firstnames[pos] = {
label: datum.data.data.firstNames[i],
isPreferred: datum.data.data.firstNames[i] === datum.data.data.preferredName,
isLastName: false,
isNameRtl: datum.data.data.isNameRtl
};
firstnameMap.set(
pos,
{
label: datum.data.data.firstNames[i],
isPreferred: datum.data.data.firstNames[i] === datum.data.data.preferredName,
isLastName: false,
isNameRtl: datum.data.data.isNameRtl
}
);
}
}

names[minPosFirstnames] = Object.values(firstnames);
names[minPosFirstnames] = [...firstnameMap].map(([, value]) => ( value ));

let lastnameOffset = 0;
let lastnameMap = new Map();

for (let i in datum.data.data.lastNames) {
const pos = datum.data.data.name.indexOf(datum.data.data.lastNames[i], offset);
let pos;

// Check if last name already exists in first names list, in case first name equals last name
do {
pos = datum.data.data.name.indexOf(datum.data.data.lastNames[i], lastnameOffset);

if ((pos !== -1) && firstnameMap.has(pos)) {
lastnameOffset += pos + datum.data.data.lastNames[i].length;
}
} while ((pos !== -1) && firstnameMap.has(pos));

if (pos !== -1) {
offset = pos;
lastnameOffset = pos;

if (pos < minPosLastnames) {
minPosLastnames = pos;
}

lastnames[pos] = {
label: datum.data.data.lastNames[i],
isPreferred: false,
isLastName: true,
isNameRtl: datum.data.data.isNameRtl
};
lastnameMap.set(
pos,
{
label: datum.data.data.lastNames[i],
isPreferred: false,
isLastName: true,
isNameRtl: datum.data.data.isNameRtl
}
);
}
}

names[minPosLastnames] = Object.values(lastnames);
names[minPosLastnames] = [...lastnameMap].map(([, value]) => ( value ));

// Extract the values (keys don't matter anymore)
return Object.values(names);
Expand Down
4 changes: 2 additions & 2 deletions src/Processor/NameProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ private function getDomXPathInstance(string $input): DOMXPath
/**
* Extracts the primary name from the individual.
*
* @param null|Individual $spouse
* @param Individual|null $spouse
* @param bool $useMarriedName TRUE to return the married name instead of the primary one
*
* @return array<string, string>
Expand Down Expand Up @@ -288,7 +288,7 @@ public function getAlternateName(Individual $individual): string
$individual->canShowName()
&& ($individual->getPrimaryName() !== $individual->getSecondaryName())
) {
$allNames = $individual->getAllNames();
$allNames = $individual->getAllNames();
$alternativeName = $allNames[$individual->getSecondaryName()][self::FULL_NAME_WITH_PLACEHOLDERS];

return $this->replacePlaceholders($alternativeName);
Expand Down

0 comments on commit fadc4e1

Please sign in to comment.