@treeviz/gedcom-parser 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classes/date.d.ts +2 -0
- package/dist/classes/date.d.ts.map +1 -1
- package/dist/classes/index.js +424 -159
- package/dist/classes/indi.d.ts.map +1 -1
- package/dist/cli/index.js +424 -159
- package/dist/constants/index.js +423 -158
- package/dist/factories/index.js +423 -158
- package/dist/index.js +425 -160
- package/dist/kinship-translator/index.js +423 -158
- package/dist/kinship-translator/kinship-translator.basic.d.ts +11 -0
- package/dist/kinship-translator/kinship-translator.basic.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.de.d.ts +2 -1
- package/dist/kinship-translator/kinship-translator.de.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.en.d.ts +2 -1
- package/dist/kinship-translator/kinship-translator.en.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.es.d.ts +2 -1
- package/dist/kinship-translator/kinship-translator.es.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.fr.d.ts +2 -1
- package/dist/kinship-translator/kinship-translator.fr.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.hu.d.ts +8 -1
- package/dist/kinship-translator/kinship-translator.hu.d.ts.map +1 -1
- package/dist/kinship-translator/kinship-translator.interface.d.ts +1 -0
- package/dist/kinship-translator/kinship-translator.interface.d.ts.map +1 -1
- package/dist/kinship-translator/patterns.es.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +14 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/index.js +425 -160
- package/package.json +1 -1
package/dist/factories/index.js
CHANGED
|
@@ -1394,6 +1394,20 @@ var LONG_NOTES = {
|
|
|
1394
1394
|
"Bef.": "Before",
|
|
1395
1395
|
"Aft.": "After"
|
|
1396
1396
|
};
|
|
1397
|
+
var STANDARD_QUALIFIERS = {
|
|
1398
|
+
ABT: "Abt.",
|
|
1399
|
+
ABOUT: "Abt.",
|
|
1400
|
+
BEF: "Bef.",
|
|
1401
|
+
BEFORE: "Bef.",
|
|
1402
|
+
AFT: "Aft.",
|
|
1403
|
+
AFTER: "Aft."
|
|
1404
|
+
};
|
|
1405
|
+
var EXPORT_QUALIFIERS = {
|
|
1406
|
+
"Abt.": "ABT",
|
|
1407
|
+
"Bef.": "BEF",
|
|
1408
|
+
"Aft.": "AFT"
|
|
1409
|
+
};
|
|
1410
|
+
var GEDCOM_MONTHS = /\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b/g;
|
|
1397
1411
|
var NOTE_MARKER = "####";
|
|
1398
1412
|
var formatDateWithComponents = (date, hasDay, hasMonth, hasYear, noteValue, baseFormat = "dd MMM yyyy", locale) => {
|
|
1399
1413
|
const hasNote = baseFormat.includes("NOTE");
|
|
@@ -1427,6 +1441,17 @@ var CommonDate = class extends Common {
|
|
|
1427
1441
|
this.NOTE = this.NOTE || createCommon(this._gedcom, void 0, this.main);
|
|
1428
1442
|
this.NOTE.value = noteMatch?.note;
|
|
1429
1443
|
validValue = value.replace(noteRegExp, "");
|
|
1444
|
+
} else {
|
|
1445
|
+
const qualifierMatch = value.match(
|
|
1446
|
+
/^(?<qualifier>ABT|ABOUT|BEF|BEFORE|AFT|AFTER)\b\s*/i
|
|
1447
|
+
);
|
|
1448
|
+
const qualifier = qualifierMatch?.groups?.qualifier?.toUpperCase();
|
|
1449
|
+
const note = qualifier ? STANDARD_QUALIFIERS[qualifier] : void 0;
|
|
1450
|
+
if (note) {
|
|
1451
|
+
this.NOTE = this.NOTE || createCommon(this._gedcom, void 0, this.main);
|
|
1452
|
+
this.NOTE.value = note;
|
|
1453
|
+
validValue = value.slice(qualifierMatch[0].length);
|
|
1454
|
+
}
|
|
1430
1455
|
}
|
|
1431
1456
|
const acceptedDate = this.isValidDateFormat(validValue);
|
|
1432
1457
|
if (acceptedDate) {
|
|
@@ -1532,7 +1557,23 @@ var CommonDate = class extends Common {
|
|
|
1532
1557
|
);
|
|
1533
1558
|
}
|
|
1534
1559
|
exportValue() {
|
|
1535
|
-
|
|
1560
|
+
const formatted = this.toValue("NOTE dd MMM yyyy", null);
|
|
1561
|
+
if (!formatted) {
|
|
1562
|
+
return formatted;
|
|
1563
|
+
}
|
|
1564
|
+
const note = this.NOTE?.value?.trim();
|
|
1565
|
+
const qualifier = note ? EXPORT_QUALIFIERS[note] : void 0;
|
|
1566
|
+
const standardized = qualifier ? formatted.replace(note, qualifier) : formatted;
|
|
1567
|
+
return standardized.replace(
|
|
1568
|
+
GEDCOM_MONTHS,
|
|
1569
|
+
(month) => month.toUpperCase()
|
|
1570
|
+
);
|
|
1571
|
+
}
|
|
1572
|
+
toGedcomLines(tag, level = 0, options) {
|
|
1573
|
+
const internal = new RegExp(
|
|
1574
|
+
`^${level} (DAY|MONTH|YEAR)( |$)|^${level} NOTE (Abt\\.|Bef\\.|Aft\\.)$`
|
|
1575
|
+
);
|
|
1576
|
+
return super.toGedcomLines(tag, level, options).filter((line) => !internal.test(line));
|
|
1536
1577
|
}
|
|
1537
1578
|
inRange(range, trueIfNoYear = false) {
|
|
1538
1579
|
return inRange(this.YEAR?.value, range, trueIfNoYear);
|
|
@@ -1857,6 +1898,135 @@ var profilePictureCache = (gedcom, key, value) => {
|
|
|
1857
1898
|
const cached = caches.profilePictureCache?.[fullKey];
|
|
1858
1899
|
return cached;
|
|
1859
1900
|
};
|
|
1901
|
+
var isNonBiologicalPath = (path) => path.some(
|
|
1902
|
+
(item) => item.relation && item.relation !== "biological" /* BIOLOGICAL */
|
|
1903
|
+
);
|
|
1904
|
+
var invertHop = (kinship) => {
|
|
1905
|
+
if (kinship === "parent") {
|
|
1906
|
+
return "child";
|
|
1907
|
+
}
|
|
1908
|
+
if (kinship === "child") {
|
|
1909
|
+
return "parent";
|
|
1910
|
+
}
|
|
1911
|
+
return kinship;
|
|
1912
|
+
};
|
|
1913
|
+
var hopRelation = (from, toIndi, kinship, inherited) => {
|
|
1914
|
+
if (kinship === "parent" || kinship === "child") {
|
|
1915
|
+
const parent = kinship === "parent" ? toIndi : from.indi;
|
|
1916
|
+
const child = kinship === "parent" ? from.indi : toIndi;
|
|
1917
|
+
const currentRelation = child.getParentType(parent);
|
|
1918
|
+
if (currentRelation && currentRelation !== "biological" /* BIOLOGICAL */) {
|
|
1919
|
+
return currentRelation;
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
if (inherited && inherited !== "biological" /* BIOLOGICAL */) {
|
|
1923
|
+
return inherited;
|
|
1924
|
+
}
|
|
1925
|
+
return void 0;
|
|
1926
|
+
};
|
|
1927
|
+
var rebuildPathFromHops = (hops, skipRelation = false) => {
|
|
1928
|
+
if (hops.length === 0) {
|
|
1929
|
+
return [];
|
|
1930
|
+
}
|
|
1931
|
+
const path = [
|
|
1932
|
+
{
|
|
1933
|
+
indi: hops[0].indi,
|
|
1934
|
+
kinship: "self",
|
|
1935
|
+
level: 0,
|
|
1936
|
+
levelUp: 0,
|
|
1937
|
+
levelDown: 0,
|
|
1938
|
+
degree: 0
|
|
1939
|
+
}
|
|
1940
|
+
];
|
|
1941
|
+
for (let i = 1; i < hops.length; i++) {
|
|
1942
|
+
const prev = path[i - 1];
|
|
1943
|
+
const { indi, kinship } = hops[i];
|
|
1944
|
+
const relation = skipRelation ? void 0 : hopRelation(prev, indi, kinship, prev.relation);
|
|
1945
|
+
if (kinship === "parent") {
|
|
1946
|
+
path.push({
|
|
1947
|
+
indi,
|
|
1948
|
+
kinship,
|
|
1949
|
+
relation,
|
|
1950
|
+
level: prev.level + 1,
|
|
1951
|
+
levelUp: prev.levelUp + 1,
|
|
1952
|
+
levelDown: prev.levelDown,
|
|
1953
|
+
degree: prev.degree
|
|
1954
|
+
});
|
|
1955
|
+
continue;
|
|
1956
|
+
}
|
|
1957
|
+
if (kinship === "child") {
|
|
1958
|
+
path.push({
|
|
1959
|
+
indi,
|
|
1960
|
+
kinship,
|
|
1961
|
+
relation,
|
|
1962
|
+
level: prev.level - 1,
|
|
1963
|
+
levelUp: prev.levelUp,
|
|
1964
|
+
levelDown: prev.levelDown + 1,
|
|
1965
|
+
degree: prev.levelUp ? prev.level > 0 ? prev.levelUp - prev.level + 1 : prev.levelDown - Math.abs(prev.level) : 0
|
|
1966
|
+
});
|
|
1967
|
+
continue;
|
|
1968
|
+
}
|
|
1969
|
+
path.push({
|
|
1970
|
+
indi,
|
|
1971
|
+
kinship,
|
|
1972
|
+
relation,
|
|
1973
|
+
level: prev.level,
|
|
1974
|
+
levelUp: prev.levelUp,
|
|
1975
|
+
levelDown: prev.levelDown,
|
|
1976
|
+
degree: prev.degree
|
|
1977
|
+
});
|
|
1978
|
+
}
|
|
1979
|
+
return path;
|
|
1980
|
+
};
|
|
1981
|
+
var storePathIfBetter = (gedcom, fromId, toId, path) => {
|
|
1982
|
+
const key = `${fromId}|${toId}`;
|
|
1983
|
+
const existing = pathCache(gedcom, key);
|
|
1984
|
+
if (existing && (!isNonBiologicalPath(existing) || isNonBiologicalPath(path))) {
|
|
1985
|
+
return;
|
|
1986
|
+
}
|
|
1987
|
+
pathCache(gedcom, key, path);
|
|
1988
|
+
};
|
|
1989
|
+
var cacheDiscoveredPath = (gedcom, path) => {
|
|
1990
|
+
const n = path.length;
|
|
1991
|
+
if (n < 2) {
|
|
1992
|
+
return;
|
|
1993
|
+
}
|
|
1994
|
+
for (let i = 0; i < n; i++) {
|
|
1995
|
+
const fromId = path[i].indi.id;
|
|
1996
|
+
if (!fromId) {
|
|
1997
|
+
continue;
|
|
1998
|
+
}
|
|
1999
|
+
for (let j = i + 1; j < n; j++) {
|
|
2000
|
+
const toId = path[j].indi.id;
|
|
2001
|
+
if (!toId) {
|
|
2002
|
+
continue;
|
|
2003
|
+
}
|
|
2004
|
+
const isOriginalPair = i === 0 && j === n - 1;
|
|
2005
|
+
const isDirectHop = j === i + 1;
|
|
2006
|
+
const slice = path.slice(i, j + 1);
|
|
2007
|
+
const sliceMixed = isNonBiologicalPath(slice);
|
|
2008
|
+
if (!isOriginalPair && !isDirectHop && sliceMixed) {
|
|
2009
|
+
continue;
|
|
2010
|
+
}
|
|
2011
|
+
const forward = i === 0 ? slice : rebuildPathFromHops(slice, !sliceMixed);
|
|
2012
|
+
const reverseHops = [
|
|
2013
|
+
{
|
|
2014
|
+
indi: slice[slice.length - 1].indi,
|
|
2015
|
+
kinship: "self"
|
|
2016
|
+
}
|
|
2017
|
+
];
|
|
2018
|
+
for (let k = slice.length - 2; k >= 0; k--) {
|
|
2019
|
+
reverseHops.push({
|
|
2020
|
+
indi: slice[k].indi,
|
|
2021
|
+
kinship: invertHop(slice[k + 1].kinship)
|
|
2022
|
+
});
|
|
2023
|
+
}
|
|
2024
|
+
const reverse = rebuildPathFromHops(reverseHops, !sliceMixed);
|
|
2025
|
+
storePathIfBetter(gedcom, fromId, toId, forward);
|
|
2026
|
+
storePathIfBetter(gedcom, toId, fromId, reverse);
|
|
2027
|
+
}
|
|
2028
|
+
}
|
|
2029
|
+
};
|
|
1860
2030
|
|
|
1861
2031
|
// src/utils/get-places.ts
|
|
1862
2032
|
var getPlaces = (common, type = ["ALL" /* All */], maxLevel = 1, level = 0, mainKey) => {
|
|
@@ -3905,7 +4075,6 @@ var Indi = class extends Common {
|
|
|
3905
4075
|
if (cache) {
|
|
3906
4076
|
return cache;
|
|
3907
4077
|
}
|
|
3908
|
-
const visited = new Individuals().append(this);
|
|
3909
4078
|
const mainItem = {
|
|
3910
4079
|
indi: this,
|
|
3911
4080
|
level: 0,
|
|
@@ -3914,129 +4083,155 @@ var Indi = class extends Common {
|
|
|
3914
4083
|
degree: 0,
|
|
3915
4084
|
kinship: "self"
|
|
3916
4085
|
};
|
|
3917
|
-
const
|
|
4086
|
+
const mainPath = [mainItem];
|
|
3918
4087
|
if (this.id === usedIndi.id) {
|
|
3919
|
-
return
|
|
4088
|
+
return mainPath;
|
|
3920
4089
|
}
|
|
3921
|
-
const
|
|
3922
|
-
|
|
3923
|
-
|
|
3924
|
-
|
|
3925
|
-
|
|
3926
|
-
|
|
3927
|
-
let helper = 0;
|
|
3928
|
-
while (queue.length > 0) {
|
|
3929
|
-
if (helper++ > 1e6) {
|
|
3930
|
-
break;
|
|
3931
|
-
}
|
|
3932
|
-
const {
|
|
3933
|
-
indi,
|
|
3934
|
-
path: path2,
|
|
3935
|
-
kinship,
|
|
3936
|
-
relation,
|
|
3937
|
-
level,
|
|
3938
|
-
levelUp,
|
|
3939
|
-
levelDown,
|
|
3940
|
-
degree,
|
|
3941
|
-
breakOnNext,
|
|
3942
|
-
breakAfterNext,
|
|
3943
|
-
inLaw
|
|
3944
|
-
} = queue.shift();
|
|
3945
|
-
if (usedIndi.id === indi.id) {
|
|
3946
|
-
if (breakOnNext) {
|
|
3947
|
-
return void 0;
|
|
4090
|
+
const bfs = (biologicalOnly) => {
|
|
4091
|
+
const visited = new Individuals().append(this);
|
|
4092
|
+
const queue = [
|
|
4093
|
+
{
|
|
4094
|
+
...mainItem,
|
|
4095
|
+
path: mainPath
|
|
3948
4096
|
}
|
|
3949
|
-
|
|
3950
|
-
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
if (breakOnNext || breakAfterNext) {
|
|
3955
|
-
additional.breakOnNext = breakOnNext || breakAfterNext;
|
|
3956
|
-
}
|
|
3957
|
-
if (inLaw) {
|
|
3958
|
-
additional.inLaw = inLaw;
|
|
3959
|
-
}
|
|
3960
|
-
if (kinship === "spouse" && breakAfterSpouse) {
|
|
3961
|
-
if (path2.length <= 2) {
|
|
3962
|
-
additional.inLaw = true;
|
|
3963
|
-
} else {
|
|
3964
|
-
additional.breakOnNext = true;
|
|
4097
|
+
];
|
|
4098
|
+
let helper = 0;
|
|
4099
|
+
while (queue.length > 0) {
|
|
4100
|
+
if (helper++ > 1e6) {
|
|
4101
|
+
break;
|
|
3965
4102
|
}
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
4103
|
+
const {
|
|
4104
|
+
indi,
|
|
4105
|
+
path,
|
|
4106
|
+
kinship,
|
|
4107
|
+
relation,
|
|
4108
|
+
level,
|
|
4109
|
+
levelUp,
|
|
4110
|
+
levelDown,
|
|
4111
|
+
degree,
|
|
4112
|
+
breakOnNext,
|
|
4113
|
+
breakAfterNext,
|
|
4114
|
+
inLaw
|
|
4115
|
+
} = queue.shift();
|
|
4116
|
+
if (usedIndi.id === indi.id) {
|
|
4117
|
+
if (breakOnNext) {
|
|
4118
|
+
return void 0;
|
|
4119
|
+
}
|
|
4120
|
+
return path;
|
|
4121
|
+
}
|
|
4122
|
+
visited.append(indi);
|
|
4123
|
+
const additional = {};
|
|
4124
|
+
if (breakOnNext || breakAfterNext) {
|
|
4125
|
+
additional.breakOnNext = breakOnNext || breakAfterNext;
|
|
4126
|
+
}
|
|
4127
|
+
if (inLaw) {
|
|
4128
|
+
additional.inLaw = inLaw;
|
|
4129
|
+
}
|
|
4130
|
+
if (!biologicalOnly && kinship === "spouse" && breakAfterSpouse) {
|
|
4131
|
+
if (path.length <= 2) {
|
|
4132
|
+
additional.inLaw = true;
|
|
4133
|
+
} else {
|
|
4134
|
+
additional.breakOnNext = true;
|
|
4135
|
+
}
|
|
4136
|
+
}
|
|
4137
|
+
if (kinship !== "child" || !breakAfterSpouse) {
|
|
4138
|
+
indi.getBiologicalFathers().copy().merge(indi.getBiologicalMothers()).merge(indi.getFathers().copy().merge(indi.getMothers())).forEach((relative) => {
|
|
4139
|
+
if (!visited.has(relative)) {
|
|
4140
|
+
const currentRelation = indi.getParentType(relative);
|
|
4141
|
+
const isNonBiological = !!currentRelation && currentRelation !== "biological" /* BIOLOGICAL */;
|
|
4142
|
+
if (biologicalOnly && isNonBiological) {
|
|
4143
|
+
return;
|
|
4144
|
+
}
|
|
4145
|
+
if (!biologicalOnly && breakAfterNonBiological && isNonBiological) {
|
|
4146
|
+
additional.breakAfterNext = true;
|
|
4147
|
+
}
|
|
4148
|
+
const newItem = {
|
|
4149
|
+
indi: relative,
|
|
4150
|
+
kinship: "parent",
|
|
4151
|
+
relation: isNonBiological ? currentRelation : relation,
|
|
4152
|
+
level: level + 1,
|
|
4153
|
+
levelUp: levelUp + 1,
|
|
4154
|
+
levelDown,
|
|
4155
|
+
degree,
|
|
4156
|
+
...additional
|
|
4157
|
+
};
|
|
4158
|
+
queue.push({
|
|
4159
|
+
...newItem,
|
|
4160
|
+
path: [...path, newItem]
|
|
4161
|
+
});
|
|
4162
|
+
}
|
|
4163
|
+
});
|
|
4164
|
+
}
|
|
4165
|
+
indi.getChildren().forEach((relative) => {
|
|
3969
4166
|
if (!visited.has(relative)) {
|
|
3970
|
-
const currentRelation =
|
|
3971
|
-
|
|
4167
|
+
const currentRelation = relative.getParentType(indi);
|
|
4168
|
+
const isNonBiological = !!currentRelation && currentRelation !== "biological" /* BIOLOGICAL */;
|
|
4169
|
+
if (biologicalOnly && isNonBiological) {
|
|
4170
|
+
return;
|
|
4171
|
+
}
|
|
4172
|
+
if (!biologicalOnly && breakAfterNonBiological && isNonBiological) {
|
|
3972
4173
|
additional.breakAfterNext = true;
|
|
3973
4174
|
}
|
|
3974
4175
|
const newItem = {
|
|
3975
4176
|
indi: relative,
|
|
3976
|
-
kinship: "
|
|
3977
|
-
relation:
|
|
3978
|
-
level: level
|
|
3979
|
-
levelUp
|
|
3980
|
-
levelDown,
|
|
3981
|
-
degree,
|
|
4177
|
+
kinship: "child",
|
|
4178
|
+
relation: isNonBiological ? currentRelation : relation,
|
|
4179
|
+
level: level - 1,
|
|
4180
|
+
levelUp,
|
|
4181
|
+
levelDown: levelDown + 1,
|
|
4182
|
+
degree: levelUp ? level > 0 ? levelUp - level + 1 : levelDown - Math.abs(level) : 0,
|
|
3982
4183
|
...additional
|
|
3983
4184
|
};
|
|
3984
4185
|
queue.push({
|
|
3985
4186
|
...newItem,
|
|
3986
|
-
path: [...
|
|
4187
|
+
path: [...path, newItem]
|
|
3987
4188
|
});
|
|
3988
4189
|
}
|
|
3989
4190
|
});
|
|
3990
|
-
|
|
3991
|
-
|
|
3992
|
-
if (!visited.has(relative)) {
|
|
3993
|
-
const currentRelation = relative.getParentType(indi);
|
|
3994
|
-
if (breakAfterNonBiological && currentRelation !== "biological" /* BIOLOGICAL */) {
|
|
3995
|
-
additional.breakAfterNext = true;
|
|
3996
|
-
}
|
|
3997
|
-
const newItem = {
|
|
3998
|
-
indi: relative,
|
|
3999
|
-
kinship: "child",
|
|
4000
|
-
relation: currentRelation && currentRelation !== "biological" /* BIOLOGICAL */ ? currentRelation : relation,
|
|
4001
|
-
level: level - 1,
|
|
4002
|
-
levelUp,
|
|
4003
|
-
levelDown: levelDown + 1,
|
|
4004
|
-
degree: levelUp ? level > 0 ? levelUp - level + 1 : levelDown - Math.abs(level) : 0,
|
|
4005
|
-
...additional
|
|
4006
|
-
};
|
|
4007
|
-
queue.push({
|
|
4008
|
-
...newItem,
|
|
4009
|
-
path: [...path2, newItem]
|
|
4010
|
-
});
|
|
4191
|
+
if (biologicalOnly) {
|
|
4192
|
+
continue;
|
|
4011
4193
|
}
|
|
4012
|
-
|
|
4013
|
-
|
|
4014
|
-
|
|
4015
|
-
|
|
4016
|
-
|
|
4017
|
-
|
|
4018
|
-
|
|
4019
|
-
|
|
4020
|
-
|
|
4194
|
+
indi.getCoParents().forEach((relative) => {
|
|
4195
|
+
if (!visited.has(relative)) {
|
|
4196
|
+
const currentAddition = {};
|
|
4197
|
+
if (relation && relation !== "biological" /* BIOLOGICAL */) {
|
|
4198
|
+
currentAddition.relation = relation;
|
|
4199
|
+
}
|
|
4200
|
+
if (inLaw) {
|
|
4201
|
+
currentAddition.breakOnNext = true;
|
|
4202
|
+
}
|
|
4203
|
+
const newItem = {
|
|
4204
|
+
indi: relative,
|
|
4205
|
+
kinship: "spouse",
|
|
4206
|
+
level,
|
|
4207
|
+
levelUp,
|
|
4208
|
+
levelDown,
|
|
4209
|
+
degree,
|
|
4210
|
+
...additional,
|
|
4211
|
+
...currentAddition
|
|
4212
|
+
};
|
|
4213
|
+
queue.push({
|
|
4214
|
+
...newItem,
|
|
4215
|
+
path: [...path, newItem]
|
|
4216
|
+
});
|
|
4021
4217
|
}
|
|
4022
|
-
|
|
4023
|
-
|
|
4024
|
-
|
|
4025
|
-
|
|
4026
|
-
|
|
4027
|
-
|
|
4028
|
-
|
|
4029
|
-
|
|
4030
|
-
|
|
4031
|
-
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
path: [...path2, newItem]
|
|
4035
|
-
});
|
|
4036
|
-
}
|
|
4037
|
-
});
|
|
4218
|
+
});
|
|
4219
|
+
}
|
|
4220
|
+
return void 0;
|
|
4221
|
+
};
|
|
4222
|
+
const foundPath = bfs(false);
|
|
4223
|
+
const lastItem = foundPath?.[foundPath.length - 1];
|
|
4224
|
+
if (lastItem?.relation && lastItem.relation !== "biological" /* BIOLOGICAL */) {
|
|
4225
|
+
const biologicalPath = bfs(true);
|
|
4226
|
+
if (biologicalPath) {
|
|
4227
|
+
cacheDiscoveredPath(this._gedcom, biologicalPath);
|
|
4228
|
+
return biologicalPath;
|
|
4229
|
+
}
|
|
4038
4230
|
}
|
|
4039
|
-
|
|
4231
|
+
if (foundPath) {
|
|
4232
|
+
cacheDiscoveredPath(this._gedcom, foundPath);
|
|
4233
|
+
}
|
|
4234
|
+
return foundPath;
|
|
4040
4235
|
}
|
|
4041
4236
|
kinship(other, showMainPerson, lang = "en", entirePath, displayName = "givenname") {
|
|
4042
4237
|
const KinshipTranslatorClass2 = getKinshipTranslatorClass();
|
|
@@ -5008,6 +5203,44 @@ var KinshipTranslatorBasic = class {
|
|
|
5008
5203
|
}
|
|
5009
5204
|
return this.pathN?.indi;
|
|
5010
5205
|
}
|
|
5206
|
+
/**
|
|
5207
|
+
* True when the path goes through a common ancestor whose two children
|
|
5208
|
+
* (the person we came from and the person we go to) share fewer than two
|
|
5209
|
+
* biological parents — i.e. they are half-siblings, so every collateral
|
|
5210
|
+
* relative on this path is a half-aunt/half-cousin/... too.
|
|
5211
|
+
*
|
|
5212
|
+
* Direct ancestors/descendants and paths that already use a
|
|
5213
|
+
* step/adopted/foster edge are never half-blood.
|
|
5214
|
+
*/
|
|
5215
|
+
get isHalfBlood() {
|
|
5216
|
+
const path = this.path;
|
|
5217
|
+
if (!path || path.length < 3) {
|
|
5218
|
+
return false;
|
|
5219
|
+
}
|
|
5220
|
+
if (path.some(
|
|
5221
|
+
(item) => item.relation && item.relation !== "biological" /* BIOLOGICAL */
|
|
5222
|
+
)) {
|
|
5223
|
+
return false;
|
|
5224
|
+
}
|
|
5225
|
+
let peakIndex = -1;
|
|
5226
|
+
for (let i = 1; i < path.length; i++) {
|
|
5227
|
+
if (path[i].kinship === "parent") {
|
|
5228
|
+
peakIndex = i;
|
|
5229
|
+
}
|
|
5230
|
+
}
|
|
5231
|
+
if (peakIndex <= 0 || peakIndex >= path.length - 1) {
|
|
5232
|
+
return false;
|
|
5233
|
+
}
|
|
5234
|
+
if (path[peakIndex + 1].kinship !== "child") {
|
|
5235
|
+
return false;
|
|
5236
|
+
}
|
|
5237
|
+
const siblingA = path[peakIndex - 1].indi;
|
|
5238
|
+
const siblingB = path[peakIndex + 1].indi;
|
|
5239
|
+
const parentsA = siblingA.getBiologicalParents();
|
|
5240
|
+
const parentsB = siblingB.getBiologicalParents();
|
|
5241
|
+
const inter = parentsA.intersection(parentsB);
|
|
5242
|
+
return inter.length === 1 && (parentsA.length > 1 || parentsB.length > 1);
|
|
5243
|
+
}
|
|
5011
5244
|
indirect() {
|
|
5012
5245
|
return "";
|
|
5013
5246
|
}
|
|
@@ -5035,6 +5268,9 @@ var KinshipTranslatorBasic = class {
|
|
|
5035
5268
|
relationType(relation) {
|
|
5036
5269
|
return relation ?? "";
|
|
5037
5270
|
}
|
|
5271
|
+
halfBlood(relation) {
|
|
5272
|
+
return relation ?? "";
|
|
5273
|
+
}
|
|
5038
5274
|
of(relation) {
|
|
5039
5275
|
return relation ?? "";
|
|
5040
5276
|
}
|
|
@@ -5273,14 +5509,34 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
|
|
|
5273
5509
|
return `${prefix.replace(/nagy$/, "")}unoka`;
|
|
5274
5510
|
}
|
|
5275
5511
|
sibling() {
|
|
5276
|
-
const parents1 = this.person1?.getBiologicalParents();
|
|
5277
|
-
const parentsN = this.personN?.getBiologicalParents();
|
|
5278
|
-
const inter = parents1?.intersection(parentsN);
|
|
5279
|
-
if (!inter || inter.length < 2) {
|
|
5280
|
-
return "f\xE9ltestv\xE9r";
|
|
5281
|
-
}
|
|
5282
5512
|
return "testv\xE9r";
|
|
5283
5513
|
}
|
|
5514
|
+
halfBlood(relation) {
|
|
5515
|
+
if (!relation || !this.isHalfBlood) {
|
|
5516
|
+
return relation ?? "";
|
|
5517
|
+
}
|
|
5518
|
+
const [head, ...rest] = relation.split(" ");
|
|
5519
|
+
if (!head) {
|
|
5520
|
+
return relation;
|
|
5521
|
+
}
|
|
5522
|
+
const prefixed = this.prefixHalf(head);
|
|
5523
|
+
return [prefixed, ...rest].join(" ");
|
|
5524
|
+
}
|
|
5525
|
+
/**
|
|
5526
|
+
* AkH. 139: compounds of more than two members stay closed up to 6
|
|
5527
|
+
* syllables; longer ones are hyphenated at the main boundary. A head
|
|
5528
|
+
* that is already hyphenated also takes a hyphenated half- prefix.
|
|
5529
|
+
*/
|
|
5530
|
+
prefixHalf(head) {
|
|
5531
|
+
if (head.includes("-") || !/[aáeéiíoóöőuúüű]/i.test(head)) {
|
|
5532
|
+
return `f\xE9l-${head}`;
|
|
5533
|
+
}
|
|
5534
|
+
const syllables = (head.match(/[aáeéiíoóöőuúüű]/gi) ?? []).length + 1;
|
|
5535
|
+
if (syllables > 6) {
|
|
5536
|
+
return `f\xE9l-${head}`;
|
|
5537
|
+
}
|
|
5538
|
+
return `f\xE9l${head}`;
|
|
5539
|
+
}
|
|
5284
5540
|
spouse() {
|
|
5285
5541
|
if (this.personN?.isMale()) {
|
|
5286
5542
|
return "f\xE9rj";
|
|
@@ -5479,20 +5735,22 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
|
|
|
5479
5735
|
return `${prefix}child`;
|
|
5480
5736
|
}
|
|
5481
5737
|
sibling() {
|
|
5482
|
-
const parents1 = this.person1?.getBiologicalParents();
|
|
5483
|
-
const parentsN = this.personN?.getBiologicalParents();
|
|
5484
|
-
const inter = parents1?.intersection(parentsN);
|
|
5485
|
-
let prefix = "";
|
|
5486
|
-
if (!inter || inter.length < 2) {
|
|
5487
|
-
prefix = "half-";
|
|
5488
|
-
}
|
|
5489
5738
|
if (this.personN?.isMale()) {
|
|
5490
|
-
return
|
|
5739
|
+
return "brother";
|
|
5491
5740
|
}
|
|
5492
5741
|
if (this.personN?.isFemale()) {
|
|
5493
|
-
return
|
|
5742
|
+
return "sister";
|
|
5743
|
+
}
|
|
5744
|
+
return "sibling";
|
|
5745
|
+
}
|
|
5746
|
+
halfBlood(relation) {
|
|
5747
|
+
if (!relation || !this.isHalfBlood) {
|
|
5748
|
+
return relation ?? "";
|
|
5749
|
+
}
|
|
5750
|
+
if (relation.includes(" ")) {
|
|
5751
|
+
return `half ${relation}`;
|
|
5494
5752
|
}
|
|
5495
|
-
return
|
|
5753
|
+
return `half-${relation}`;
|
|
5496
5754
|
}
|
|
5497
5755
|
spouse() {
|
|
5498
5756
|
if (this.personN?.isMale()) {
|
|
@@ -5674,20 +5932,22 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
|
|
|
5674
5932
|
return `${prefix}kind`;
|
|
5675
5933
|
}
|
|
5676
5934
|
sibling() {
|
|
5677
|
-
const parents1 = this.person1?.getBiologicalParents();
|
|
5678
|
-
const parentsN = this.personN?.getBiologicalParents();
|
|
5679
|
-
const inter = parents1?.intersection(parentsN);
|
|
5680
|
-
let prefix = "";
|
|
5681
|
-
if (!inter || inter.length < 2) {
|
|
5682
|
-
prefix = "Halb";
|
|
5683
|
-
}
|
|
5684
5935
|
if (this.personN?.isMale()) {
|
|
5685
|
-
return
|
|
5936
|
+
return "bruder";
|
|
5686
5937
|
}
|
|
5687
5938
|
if (this.personN?.isFemale()) {
|
|
5688
|
-
return
|
|
5939
|
+
return "schwester";
|
|
5940
|
+
}
|
|
5941
|
+
return "geschwister";
|
|
5942
|
+
}
|
|
5943
|
+
halfBlood(relation) {
|
|
5944
|
+
if (!relation || !this.isHalfBlood) {
|
|
5945
|
+
return relation ?? "";
|
|
5946
|
+
}
|
|
5947
|
+
if (/^[A-ZÄÖÜ]/.test(relation) || /[-\s]/.test(relation)) {
|
|
5948
|
+
return `Halb-${relation}`;
|
|
5689
5949
|
}
|
|
5690
|
-
return
|
|
5950
|
+
return `Halb${relation}`;
|
|
5691
5951
|
}
|
|
5692
5952
|
spouse() {
|
|
5693
5953
|
if (this.personN?.isMale()) {
|
|
@@ -5869,20 +6129,19 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
|
|
|
5869
6129
|
return `${prefix}enfant`;
|
|
5870
6130
|
}
|
|
5871
6131
|
sibling() {
|
|
5872
|
-
const parents1 = this.person1?.getBiologicalParents();
|
|
5873
|
-
const parentsN = this.personN?.getBiologicalParents();
|
|
5874
|
-
const inter = parents1?.intersection(parentsN);
|
|
5875
|
-
let prefix = "";
|
|
5876
|
-
if (!inter || inter.length < 2) {
|
|
5877
|
-
prefix = "demi-";
|
|
5878
|
-
}
|
|
5879
6132
|
if (this.personN?.isMale()) {
|
|
5880
|
-
return
|
|
6133
|
+
return "fr\xE8re";
|
|
5881
6134
|
}
|
|
5882
6135
|
if (this.personN?.isFemale()) {
|
|
5883
|
-
return
|
|
6136
|
+
return "s\u0153ur";
|
|
6137
|
+
}
|
|
6138
|
+
return "fr\xE8re/s\u0153ur";
|
|
6139
|
+
}
|
|
6140
|
+
halfBlood(relation) {
|
|
6141
|
+
if (!relation || !this.isHalfBlood) {
|
|
6142
|
+
return relation ?? "";
|
|
5884
6143
|
}
|
|
5885
|
-
return
|
|
6144
|
+
return `demi-${relation}`;
|
|
5886
6145
|
}
|
|
5887
6146
|
spouse() {
|
|
5888
6147
|
if (this.personN?.isMale()) {
|
|
@@ -5979,12 +6238,12 @@ var InLawsEs = {
|
|
|
5979
6238
|
"madre del (c\xF3nyuge|esposa|esposo)": "suegra",
|
|
5980
6239
|
"padre del (c\xF3nyuge|esposa|esposo)": "suegro",
|
|
5981
6240
|
"padre/madre del (c\xF3nyuge|esposa|esposo)": "suegro/suegra",
|
|
5982
|
-
"esposa de (medio )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
|
|
5983
|
-
"esposo de (medio )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
|
|
5984
|
-
"c\xF3nyuge de (medio )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
|
|
5985
|
-
"(medio )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
|
|
5986
|
-
"(medio )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
|
|
5987
|
-
"(medio )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
|
|
6241
|
+
"esposa de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
|
|
6242
|
+
"esposo de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
|
|
6243
|
+
"c\xF3nyuge de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
|
|
6244
|
+
"(medio |media |medio/a )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
|
|
6245
|
+
"(medio |media |medio/a )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
|
|
6246
|
+
"(medio |media |medio/a )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
|
|
5988
6247
|
};
|
|
5989
6248
|
|
|
5990
6249
|
// src/kinship-translator/kinship-translator.es.ts
|
|
@@ -6064,20 +6323,25 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
|
|
|
6064
6323
|
return `${prefix}hijo/hija`;
|
|
6065
6324
|
}
|
|
6066
6325
|
sibling() {
|
|
6067
|
-
const parents1 = this.person1?.getBiologicalParents();
|
|
6068
|
-
const parentsN = this.personN?.getBiologicalParents();
|
|
6069
|
-
const inter = parents1?.intersection(parentsN);
|
|
6070
|
-
let prefix = "";
|
|
6071
|
-
if (!inter || inter.length < 2) {
|
|
6072
|
-
prefix = "medio ";
|
|
6073
|
-
}
|
|
6074
6326
|
if (this.personN?.isMale()) {
|
|
6075
|
-
return
|
|
6327
|
+
return "hermano";
|
|
6328
|
+
}
|
|
6329
|
+
if (this.personN?.isFemale()) {
|
|
6330
|
+
return "hermana";
|
|
6331
|
+
}
|
|
6332
|
+
return "hermano/hermana";
|
|
6333
|
+
}
|
|
6334
|
+
halfBlood(relation) {
|
|
6335
|
+
if (!relation || !this.isHalfBlood) {
|
|
6336
|
+
return relation ?? "";
|
|
6076
6337
|
}
|
|
6077
6338
|
if (this.personN?.isFemale()) {
|
|
6078
|
-
return
|
|
6339
|
+
return `media ${relation}`;
|
|
6340
|
+
}
|
|
6341
|
+
if (this.personN?.isMale()) {
|
|
6342
|
+
return `medio ${relation}`;
|
|
6079
6343
|
}
|
|
6080
|
-
return
|
|
6344
|
+
return `medio/a ${relation}`;
|
|
6081
6345
|
}
|
|
6082
6346
|
spouse() {
|
|
6083
6347
|
if (this.personN?.isMale()) {
|
|
@@ -6259,6 +6523,7 @@ var KinshipTranslator = class {
|
|
|
6259
6523
|
} else if (personN.level !== 0) {
|
|
6260
6524
|
relation = this.removal();
|
|
6261
6525
|
}
|
|
6526
|
+
relation = this.translator?.halfBlood(relation);
|
|
6262
6527
|
relation = this.translator?.relationType(relation);
|
|
6263
6528
|
if (this.translator?.isOfSpouse) {
|
|
6264
6529
|
relation = this.translator?.ofSpouse(relation);
|