@finbheara/names 0.12.0 → 0.14.0
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/README.md +33 -0
- package/dist/chunks/{index-ztpxgcs1.js → index-a15g2gp6.js} +2 -2
- package/dist/chunks/{index-yf904dam.js → index-ka8nzreg.js} +6 -2
- package/dist/chunks/{index-yf904dam.js.map → index-ka8nzreg.js.map} +3 -3
- package/dist/chunks/{index-vqbvesky.js → index-kw69ry3j.js} +533 -185
- package/dist/chunks/index-kw69ry3j.js.map +21 -0
- package/dist/cli/census.js +2 -2
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/dist/measure/index.js +2 -2
- package/dist/normalize/index.js +18 -8
- package/dist/normalize/index.js.map +1 -1
- package/dist/types/normalize/given-diminutives.d.ts +35 -11
- package/dist/types/normalize/index.d.ts +3 -2
- package/dist/types/normalize/multiset.d.ts +9 -0
- package/dist/types/normalize/name-compare.d.ts +43 -0
- package/dist/types/normalize/name-kinship.d.ts +171 -0
- package/dist/types/normalize/name-middle.d.ts +11 -0
- package/docs/NAME-NORMALIZATION.md +90 -0
- package/package.json +1 -1
- package/dist/chunks/index-vqbvesky.js.map +0 -19
- /package/dist/chunks/{index-ztpxgcs1.js.map → index-a15g2gp6.js.map} +0 -0
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
commaReading2,
|
|
20
20
|
levelOf2,
|
|
21
21
|
defaultPersonNameFactory2
|
|
22
|
-
} from "./index-
|
|
22
|
+
} from "./index-ka8nzreg.js";
|
|
23
23
|
import {
|
|
24
24
|
isTeamPrint2
|
|
25
25
|
} from "./index-0phgwy52.js";
|
|
@@ -88,29 +88,93 @@ var given_diminutives_default = {
|
|
|
88
88
|
"THE ONE GIVEN-NAME DIMINUTIVE TABLE. Read by `given-diminutives.ts` in this directory; a consumer in",
|
|
89
89
|
"another language reads this file rather than keeping a copy. Keys and forms are NN3 upper case,",
|
|
90
90
|
"letters only.",
|
|
91
|
-
"`
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
91
|
+
"`variants`: one name's SPELLINGS, canonical -> the other spellings (`CONNOR` / `CONOR`). A spelling",
|
|
92
|
+
"is read as its canonical before `families` is consulted, so `families` and `notAtGate` hold canonical",
|
|
93
|
+
"spellings only. A transposition or a typo (`OLIVA`, `CAILTIN`, `NAIMH`) is not a variant.",
|
|
94
|
+
"`families`: root -> its familiar forms. A form may sit under SEVERAL roots and meets EVERY one of",
|
|
95
|
+
"them (`ELLIE` is ELEANOR's, ELIZABETH's and ELLEN's); two names meet when they share a root, a root",
|
|
96
|
+
"belonging to itself. Nothing is transitive: ELEANOR and ELIZABETH share no root.",
|
|
97
|
+
"`notAtGate`: forms read as one family for a comparison level BELOW exact, but which are names in",
|
|
98
|
+
"their own right, translations, another gender's name, or forms of more than one root (every such",
|
|
99
|
+
"form is listed). An identity gate must never equate a pair through one of these AS A FORM: `Megan`",
|
|
100
|
+
"is not `Margaret`, `Sean` is not `John`, `Michelle` is not `Michael`. A listed form that is also a",
|
|
101
|
+
"root still meets its own forms at a gate (`CAITLIN` / `CAIT`). A form belongs here when two",
|
|
102
|
+
"different people plausibly carry the two names."
|
|
98
103
|
],
|
|
104
|
+
variants: {
|
|
105
|
+
AIDAN: ["AIDEN"],
|
|
106
|
+
AISLING: ["ASHLING", "AISHLING"],
|
|
107
|
+
ALANNA: ["ALANNAH", "ALANA"],
|
|
108
|
+
ALEXANDRA: ["ALEXANDRIA"],
|
|
109
|
+
ALLISON: ["ALISON"],
|
|
110
|
+
AOIBHINN: ["AOIBHIN"],
|
|
111
|
+
BRIANNA: ["BRIANA"],
|
|
112
|
+
BRIGID: ["BRIDGID", "BRIGHID"],
|
|
113
|
+
CAITLIN: ["CAITLYN", "KAITLIN", "KAITLYN", "KATELYN"],
|
|
114
|
+
CAITRIONA: ["CATRIONA"],
|
|
115
|
+
CATHERINE: ["KATHERINE", "KATHRYN", "CATHRYN"],
|
|
116
|
+
CECILIA: ["CECELIA"],
|
|
117
|
+
CIARA: ["KIERA", "KEIRA", "CIARRA"],
|
|
118
|
+
CIARAN: ["KIERAN", "KEIRAN"],
|
|
119
|
+
CLAIRE: ["CLARE"],
|
|
120
|
+
COLLEEN: ["COLEEN"],
|
|
121
|
+
CONNOR: ["CONOR"],
|
|
122
|
+
DEBORAH: ["DEBRA"],
|
|
123
|
+
EMER: ["EIMEAR"],
|
|
124
|
+
FIONNUALA: ["FIONNULA"],
|
|
125
|
+
GABRIELLE: ["GABRIELLA"],
|
|
126
|
+
GRAINNE: ["GRAINE"],
|
|
127
|
+
HALEY: ["HAILEY"],
|
|
128
|
+
HANNAH: ["HANNA", "HANAH"],
|
|
129
|
+
ISABEL: ["ISABELLE"],
|
|
130
|
+
JEN: ["JENN"],
|
|
131
|
+
JENNY: ["JENNIE"],
|
|
132
|
+
JONATHAN: ["JONATHON"],
|
|
133
|
+
JULIANNA: ["JULIANA"],
|
|
134
|
+
KATE: ["CATE"],
|
|
135
|
+
KATHLEEN: ["CATHLEEN"],
|
|
136
|
+
KATIE: ["CATIE"],
|
|
137
|
+
KAYLEIGH: ["KALEIGH"],
|
|
138
|
+
KERRY: ["KERRI"],
|
|
139
|
+
KIMBERLY: ["KIMBERLEY"],
|
|
140
|
+
KRISTIN: ["KRISTEN"],
|
|
141
|
+
LILY: ["LILLY"],
|
|
142
|
+
LINDSAY: ["LINDSEY"],
|
|
143
|
+
MADELINE: ["MADELEINE"],
|
|
144
|
+
MADISON: ["MADDISON"],
|
|
145
|
+
MATTHEW: ["MATHEW"],
|
|
146
|
+
MEGAN: ["MEGHAN", "MEAGAN", "MEAGHAN"],
|
|
147
|
+
MOLLY: ["MOLLIE"],
|
|
148
|
+
RACHEL: ["RACHAEL"],
|
|
149
|
+
SARAH: ["SARA"],
|
|
150
|
+
SHANNON: ["SHANNAN", "SHANNEN"],
|
|
151
|
+
SIOBHAN: ["SIOBHAIN"],
|
|
152
|
+
SOPHIA: ["SOFIA"],
|
|
153
|
+
STEPHEN: ["STEVEN"],
|
|
154
|
+
SYDNEY: ["SIDNEY"],
|
|
155
|
+
TERESA: ["THERESA"],
|
|
156
|
+
TRISTAN: ["TRISTEN"],
|
|
157
|
+
VICKY: ["VICKI"],
|
|
158
|
+
ZACH: ["ZACK"]
|
|
159
|
+
},
|
|
99
160
|
families: {
|
|
100
|
-
ABIGAIL: ["ABBY", "ABBIE"],
|
|
101
|
-
|
|
161
|
+
ABIGAIL: ["ABBY", "ABBIE", "ABBEY", "ABI"],
|
|
162
|
+
ADDISON: ["ADDIE"],
|
|
163
|
+
AIDAN: ["AODHAN", "AIDY"],
|
|
102
164
|
ALEXANDER: ["ALEX", "ALEC", "SANDY", "XANDER", "ALEXANDRA", "ALEXA", "LEXI", "LEXIE"],
|
|
165
|
+
ALEXANDRA: ["ALLY"],
|
|
166
|
+
ALLISON: ["ALLY", "ALLIE"],
|
|
103
167
|
AMANDA: ["MANDY"],
|
|
104
168
|
ANDREW: ["ANDY"],
|
|
169
|
+
ANGELA: ["ANGIE"],
|
|
105
170
|
ANNE: ["ANN", "ANNA", "ANNIE", "NANCY", "NAN", "ANYA"],
|
|
106
171
|
ANTHONY: ["TONY"],
|
|
107
172
|
BARBARA: ["BARB"],
|
|
108
|
-
|
|
109
|
-
|
|
173
|
+
BENJAMIN: ["BEN", "BENNY"],
|
|
174
|
+
BRIDGET: ["BRIDIE", "BRID", "BRIGID", "BREDA", "BREEDA", "BIDDY"],
|
|
175
|
+
CAITLIN: ["CAIT"],
|
|
176
|
+
CASSANDRA: ["CASSIE"],
|
|
110
177
|
CATHERINE: [
|
|
111
|
-
"KATHERINE",
|
|
112
|
-
"KATHRYN",
|
|
113
|
-
"CATHRYN",
|
|
114
178
|
"KATE",
|
|
115
179
|
"KATIE",
|
|
116
180
|
"KATY",
|
|
@@ -120,31 +184,72 @@ var given_diminutives_default = {
|
|
|
120
184
|
"KITTY",
|
|
121
185
|
"CAITRIONA",
|
|
122
186
|
"KATHLEEN",
|
|
123
|
-
"
|
|
187
|
+
"CAITLIN"
|
|
124
188
|
],
|
|
189
|
+
CHARLES: ["CHARLIE"],
|
|
125
190
|
CHRISTOPHER: ["CHRIS", "KIT", "TOPHER"],
|
|
126
|
-
CIARA: [
|
|
127
|
-
CIARAN: [
|
|
191
|
+
CIARA: [],
|
|
192
|
+
CIARAN: [],
|
|
193
|
+
CONSTANCE: ["CONNIE"],
|
|
128
194
|
CYNTHIA: ["CINDY"],
|
|
129
195
|
DANIEL: ["DAN", "DANNY", "DANIELLE", "DANI"],
|
|
130
|
-
DEBORAH: ["
|
|
196
|
+
DEBORAH: ["DEBBIE", "DEB"],
|
|
131
197
|
DEIRDRE: ["DEE", "DIDI"],
|
|
132
198
|
DOROTHY: ["DOT", "DOTTIE"],
|
|
199
|
+
DOUGLAS: ["DOUG"],
|
|
133
200
|
EDWARD: ["ED", "EDDIE", "TED", "TEDDY", "NED"],
|
|
134
201
|
EILEEN: ["EILISH", "EILIS", "AILEEN"],
|
|
135
|
-
|
|
202
|
+
ELEANOR: ["ELLIE"],
|
|
203
|
+
ELIJAH: ["ELI"],
|
|
204
|
+
ELIZABETH: [
|
|
205
|
+
"LIZ",
|
|
206
|
+
"LIZZIE",
|
|
207
|
+
"BETH",
|
|
208
|
+
"BETSY",
|
|
209
|
+
"BETTY",
|
|
210
|
+
"ELIZA",
|
|
211
|
+
"LIBBY",
|
|
212
|
+
"ELSIE",
|
|
213
|
+
"ELISE",
|
|
214
|
+
"ELLIE"
|
|
215
|
+
],
|
|
216
|
+
ELLEN: ["ELLIE"],
|
|
136
217
|
EOIN: ["OWEN", "EOGHAN"],
|
|
137
|
-
|
|
218
|
+
EVA: ["EVIE"],
|
|
219
|
+
EVANGELINE: ["EVIE"],
|
|
220
|
+
EVE: ["EVIE"],
|
|
221
|
+
EVELYN: ["EVIE"],
|
|
222
|
+
FIONNUALA: ["FINOLA", "NUALA"],
|
|
223
|
+
FLORENCE: ["FLO"],
|
|
224
|
+
FRANCES: ["FRANCIE"],
|
|
225
|
+
FRANCESCA: ["FRANKIE"],
|
|
138
226
|
FRANCIS: ["FRANK", "FRANKIE", "FRAN", "FRANCES"],
|
|
227
|
+
GABRIEL: ["GABE"],
|
|
228
|
+
GABRIELLE: ["GABBY", "GABY"],
|
|
229
|
+
GENEVIEVE: ["EVIE"],
|
|
230
|
+
GEOFFREY: ["GEOFF"],
|
|
139
231
|
GILLIAN: ["GILL"],
|
|
140
|
-
|
|
232
|
+
GRACE: ["GRACIE"],
|
|
233
|
+
GRAINNE: ["GRANIA", "GRACE"],
|
|
234
|
+
GREGORY: ["GREG"],
|
|
235
|
+
GWENDOLYN: ["GWEN"],
|
|
236
|
+
ISABEL: ["IZZY", "ISSY"],
|
|
237
|
+
JACOB: ["JAKE"],
|
|
141
238
|
JACQUELINE: ["JACKIE"],
|
|
142
239
|
JAMES: ["JIM", "JIMMY", "JAMIE", "SEAMUS", "JAY"],
|
|
143
|
-
|
|
240
|
+
JEFFREY: ["JEFF"],
|
|
241
|
+
JENNIFER: ["JEN", "JENNY"],
|
|
242
|
+
JESSICA: ["JESSIE", "JESS"],
|
|
243
|
+
JILLIAN: ["JILL"],
|
|
144
244
|
JOHN: ["JACK", "JOHNNY", "SEAN", "SHANE", "JOHNNIE", "EOIN"],
|
|
145
245
|
JOSEPH: ["JOE", "JOEY", "JOSEPHINE", "JO"],
|
|
246
|
+
JOSEPHINE: ["JOSIE"],
|
|
247
|
+
JOSHUA: ["JOSH"],
|
|
146
248
|
JUDITH: ["JUDY"],
|
|
147
|
-
KIMBERLY: ["
|
|
249
|
+
KIMBERLY: ["KIM"],
|
|
250
|
+
LILLIAN: ["LILY"],
|
|
251
|
+
MADELINE: ["MADDIE", "MADDY"],
|
|
252
|
+
MADISON: ["MADDIE"],
|
|
148
253
|
MARGARET: [
|
|
149
254
|
"MAGGIE",
|
|
150
255
|
"PEGGY",
|
|
@@ -159,61 +264,91 @@ var given_diminutives_default = {
|
|
|
159
264
|
],
|
|
160
265
|
MARY: ["MAIRE", "MOLLY", "MAY", "POLLY", "MAIREAD", "MARIE", "MARIA", "MOIRA", "MAUREEN"],
|
|
161
266
|
MATTHEW: ["MATT", "MATTIE"],
|
|
162
|
-
|
|
163
|
-
|
|
267
|
+
MAXIMILIAN: ["MAX"],
|
|
268
|
+
MICHAEL: ["MIKE", "MICK", "MICKEY", "MICHEAL", "MICHELLE", "MICHAELA", "MIKEY"],
|
|
269
|
+
MITCHELL: ["MITCH"],
|
|
270
|
+
NATHAN: ["NATE"],
|
|
271
|
+
NATHANIEL: ["NATE"],
|
|
164
272
|
NIAMH: ["NEVE", "NEEVE"],
|
|
273
|
+
NICHOLAS: ["NICK", "NICKY", "NICOLE", "NICOLA", "NIKKI"],
|
|
165
274
|
PAMELA: ["PAM"],
|
|
166
275
|
PATRICK: ["PAT", "PADDY", "PADRAIG", "PATSY", "PATRICIA", "TRICIA", "TRISH", "PATTY"],
|
|
276
|
+
PENELOPE: ["PENNY"],
|
|
167
277
|
PETER: ["PETE", "PEADAR"],
|
|
168
278
|
PHILIPPA: ["PIPPA"],
|
|
169
279
|
RAYMOND: ["RAY"],
|
|
170
280
|
REBECCA: ["BECKY", "BECCA", "BEX"],
|
|
171
281
|
RICHARD: ["RICK", "RICKY", "DICK", "RICH", "RICHIE"],
|
|
172
282
|
ROBERT: ["ROB", "BOB", "BOBBY", "ROBBIE", "ROBERTA"],
|
|
283
|
+
SAMANTHA: ["SAM", "SAMMY", "SAMMIE"],
|
|
284
|
+
SAMUEL: ["SAM", "SAMMY", "SAMMIE"],
|
|
173
285
|
SAOIRSE: ["SEERSHA"],
|
|
174
|
-
SIOBHAN: ["SHIVAUN", "CHEVONNE"
|
|
175
|
-
|
|
286
|
+
SIOBHAN: ["SHIVAUN", "CHEVONNE"],
|
|
287
|
+
SOPHIA: ["SOPHIE"],
|
|
288
|
+
STEPHEN: ["STEVE", "STEPHANIE", "STEPH"],
|
|
176
289
|
SUSAN: ["SUE", "SUSIE", "SUZANNE", "SUZY"],
|
|
177
|
-
|
|
290
|
+
TABITHA: ["TABBY"],
|
|
291
|
+
TERENCE: ["TERRY"],
|
|
292
|
+
TERESA: ["TESS"],
|
|
178
293
|
THOMAS: ["TOM", "TOMMY", "TOMAS", "THOM"],
|
|
179
|
-
|
|
294
|
+
TIMOTHY: ["TIM", "TIMMY"],
|
|
295
|
+
VICTORIA: ["VICKY"],
|
|
180
296
|
VINCENT: ["VINNIE"],
|
|
181
|
-
WILLIAM: ["WILL", "BILL", "BILLY", "WILLIE", "LIAM"]
|
|
297
|
+
WILLIAM: ["WILL", "BILL", "BILLY", "WILLIE", "LIAM"],
|
|
298
|
+
ZACHARY: ["ZACH"]
|
|
182
299
|
},
|
|
183
300
|
notAtGate: [
|
|
301
|
+
"ABBEY",
|
|
184
302
|
"ABBIE",
|
|
185
303
|
"ABBY",
|
|
304
|
+
"ADDIE",
|
|
186
305
|
"ALEXA",
|
|
187
306
|
"ALEXANDRA",
|
|
307
|
+
"ALLIE",
|
|
308
|
+
"ALLY",
|
|
188
309
|
"ANNA",
|
|
189
310
|
"ANYA",
|
|
311
|
+
"CAITLIN",
|
|
190
312
|
"CAITRIONA",
|
|
191
|
-
"
|
|
313
|
+
"CHARLIE",
|
|
192
314
|
"DANI",
|
|
193
315
|
"DANIELLE",
|
|
194
316
|
"DEE",
|
|
195
317
|
"EILIS",
|
|
196
318
|
"EILISH",
|
|
319
|
+
"ELI",
|
|
197
320
|
"ELISE",
|
|
321
|
+
"ELLIE",
|
|
198
322
|
"ELSIE",
|
|
199
323
|
"EOGHAN",
|
|
200
324
|
"EOIN",
|
|
325
|
+
"EVIE",
|
|
201
326
|
"FRANCES",
|
|
327
|
+
"FRANKIE",
|
|
202
328
|
"GRACE",
|
|
329
|
+
"GRACIE",
|
|
330
|
+
"GWEN",
|
|
203
331
|
"JACK",
|
|
204
332
|
"JAY",
|
|
333
|
+
"JESSIE",
|
|
334
|
+
"JILL",
|
|
205
335
|
"JO",
|
|
206
336
|
"JOSEPHINE",
|
|
337
|
+
"JOSIE",
|
|
207
338
|
"KATHLEEN",
|
|
208
339
|
"KIM",
|
|
340
|
+
"KIT",
|
|
209
341
|
"LEXI",
|
|
210
342
|
"LEXIE",
|
|
211
343
|
"LIAM",
|
|
344
|
+
"LILY",
|
|
345
|
+
"MADDIE",
|
|
212
346
|
"MAIRE",
|
|
213
347
|
"MAIREAD",
|
|
214
348
|
"MARIA",
|
|
215
349
|
"MARIE",
|
|
216
350
|
"MAUREEN",
|
|
351
|
+
"MAX",
|
|
217
352
|
"MAY",
|
|
218
353
|
"MEGAN",
|
|
219
354
|
"MICHAELA",
|
|
@@ -222,6 +357,7 @@ var given_diminutives_default = {
|
|
|
222
357
|
"MOIRA",
|
|
223
358
|
"MOLLY",
|
|
224
359
|
"NANCY",
|
|
360
|
+
"NATE",
|
|
225
361
|
"NICOLA",
|
|
226
362
|
"NICOLE",
|
|
227
363
|
"NIKKI",
|
|
@@ -232,15 +368,21 @@ var given_diminutives_default = {
|
|
|
232
368
|
"PATSY",
|
|
233
369
|
"PATTY",
|
|
234
370
|
"PEADAR",
|
|
371
|
+
"PENNY",
|
|
235
372
|
"POLLY",
|
|
236
373
|
"ROBERTA",
|
|
374
|
+
"SAM",
|
|
375
|
+
"SAMMIE",
|
|
376
|
+
"SAMMY",
|
|
237
377
|
"SANDY",
|
|
238
378
|
"SEAMUS",
|
|
239
379
|
"SEAN",
|
|
240
380
|
"SHANE",
|
|
381
|
+
"SOPHIE",
|
|
241
382
|
"STEPH",
|
|
242
383
|
"STEPHANIE",
|
|
243
384
|
"SUZANNE",
|
|
385
|
+
"TERRY",
|
|
244
386
|
"TESS",
|
|
245
387
|
"TOMAS",
|
|
246
388
|
"TRICIA",
|
|
@@ -250,23 +392,68 @@ var given_diminutives_default = {
|
|
|
250
392
|
|
|
251
393
|
// src/normalize/given-diminutives.ts
|
|
252
394
|
var TABLE = given_diminutives_default;
|
|
253
|
-
var
|
|
395
|
+
var CANONICAL = (() => {
|
|
396
|
+
const out = new Map;
|
|
397
|
+
for (const [canonical, spellings] of Object.entries(TABLE.variants))
|
|
398
|
+
for (const s of spellings)
|
|
399
|
+
out.set(s, canonical);
|
|
400
|
+
return out;
|
|
401
|
+
})();
|
|
402
|
+
var ROOTS = (() => {
|
|
254
403
|
const out = new Map;
|
|
404
|
+
const add = (form, root) => {
|
|
405
|
+
let roots = out.get(form);
|
|
406
|
+
if (roots === undefined)
|
|
407
|
+
out.set(form, roots = new Set);
|
|
408
|
+
roots.add(root);
|
|
409
|
+
};
|
|
255
410
|
for (const [root, forms] of Object.entries(TABLE.families)) {
|
|
256
|
-
|
|
411
|
+
add(root, root);
|
|
257
412
|
for (const f of forms)
|
|
258
|
-
|
|
259
|
-
out.set(f, root);
|
|
413
|
+
add(f, root);
|
|
260
414
|
}
|
|
261
415
|
return out;
|
|
262
416
|
})();
|
|
263
417
|
var NOT_AT_GATE = new Set(TABLE.notAtGate);
|
|
418
|
+
var canonical = (name) => CANONICAL.get(name) ?? name;
|
|
419
|
+
var gateThrough = (name, root) => name === root || !NOT_AT_GATE.has(name);
|
|
264
420
|
function sameGivenFamily2(a, b) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const ra = ROOT.get(a);
|
|
268
|
-
return ra !== undefined && ra === ROOT.get(b);
|
|
421
|
+
const via = givenFamilyTable2(a, b);
|
|
422
|
+
return via === "given-variant" || via === "given-family";
|
|
269
423
|
}
|
|
424
|
+
function givenFamilyTable2(a, b) {
|
|
425
|
+
if (a === b)
|
|
426
|
+
return null;
|
|
427
|
+
const ca = canonical(a);
|
|
428
|
+
const cb = canonical(b);
|
|
429
|
+
if (ca === cb)
|
|
430
|
+
return "given-variant";
|
|
431
|
+
const ra = ROOTS.get(ca);
|
|
432
|
+
const rb = ROOTS.get(cb);
|
|
433
|
+
if (ra === undefined || rb === undefined)
|
|
434
|
+
return null;
|
|
435
|
+
let shared = false;
|
|
436
|
+
for (const root of ra) {
|
|
437
|
+
if (!rb.has(root))
|
|
438
|
+
continue;
|
|
439
|
+
if (gateThrough(ca, root) && gateThrough(cb, root))
|
|
440
|
+
return "given-family";
|
|
441
|
+
shared = true;
|
|
442
|
+
}
|
|
443
|
+
return shared ? "given-family-not-gate" : null;
|
|
444
|
+
}
|
|
445
|
+
// src/normalize/multiset.ts
|
|
446
|
+
function subMultiset(outer, inner) {
|
|
447
|
+
const left = [...inner];
|
|
448
|
+
for (const part of outer) {
|
|
449
|
+
const at = left.indexOf(part);
|
|
450
|
+
if (at < 0)
|
|
451
|
+
return false;
|
|
452
|
+
left.splice(at, 1);
|
|
453
|
+
}
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
|
|
270
457
|
// src/normalize/name-middle.ts
|
|
271
458
|
function suffixCut(p) {
|
|
272
459
|
return Math.max(1, p.givenFields().length - p.suffixes.length);
|
|
@@ -298,6 +485,9 @@ function nameRelation2(a, b) {
|
|
|
298
485
|
if (a.surnameKey() !== b.surnameKey() || ga[0] !== gb[0] || ga[0] === undefined) {
|
|
299
486
|
return { relation: "different", reason: "head-differs" };
|
|
300
487
|
}
|
|
488
|
+
return tailRelation(a, b);
|
|
489
|
+
}
|
|
490
|
+
function tailRelation(a, b) {
|
|
301
491
|
if (!sameList(suffixFields(a), suffixFields(b))) {
|
|
302
492
|
return { relation: "different", reason: "suffixes-differ" };
|
|
303
493
|
}
|
|
@@ -318,138 +508,6 @@ function nameRelation2(a, b) {
|
|
|
318
508
|
return { relation: "candidate", reason: "initial-agrees" };
|
|
319
509
|
}
|
|
320
510
|
|
|
321
|
-
// src/normalize/name-compare.ts
|
|
322
|
-
function nameCompare2(a, b, dop) {
|
|
323
|
-
const x = levelOf2(a, dop);
|
|
324
|
-
const y = levelOf2(b, dop);
|
|
325
|
-
if (x < y)
|
|
326
|
-
return -1;
|
|
327
|
-
return x > y ? 1 : 0;
|
|
328
|
-
}
|
|
329
|
-
function probablySame2(a, b, dop) {
|
|
330
|
-
if (!a.isPerson() || !b.isPerson())
|
|
331
|
-
return false;
|
|
332
|
-
if (dop === "nn5")
|
|
333
|
-
return nameRelation2(a, b).relation !== "different";
|
|
334
|
-
return levelOf2(a, dop) === levelOf2(b, dop);
|
|
335
|
-
}
|
|
336
|
-
function slotOf(name, dop) {
|
|
337
|
-
return name.isPerson() ? levelOf2(name, dop) : null;
|
|
338
|
-
}
|
|
339
|
-
var loner = 0;
|
|
340
|
-
var lonerSlot = () => `\x1F\x1F${loner++}`;
|
|
341
|
-
function createNameSet2(dop) {
|
|
342
|
-
const held = new Map;
|
|
343
|
-
const set = {
|
|
344
|
-
dop,
|
|
345
|
-
get size() {
|
|
346
|
-
return held.size;
|
|
347
|
-
},
|
|
348
|
-
get: (name) => {
|
|
349
|
-
const slot = slotOf(name, dop);
|
|
350
|
-
return slot === null ? undefined : held.get(slot);
|
|
351
|
-
},
|
|
352
|
-
has: (name) => {
|
|
353
|
-
const slot = slotOf(name, dop);
|
|
354
|
-
return slot === null ? false : held.has(slot);
|
|
355
|
-
},
|
|
356
|
-
add(name) {
|
|
357
|
-
const slot = slotOf(name, dop);
|
|
358
|
-
if (slot === null)
|
|
359
|
-
held.set(lonerSlot(), name);
|
|
360
|
-
else if (!held.has(slot))
|
|
361
|
-
held.set(slot, name);
|
|
362
|
-
return this;
|
|
363
|
-
},
|
|
364
|
-
delete: (name) => {
|
|
365
|
-
const slot = slotOf(name, dop);
|
|
366
|
-
return slot === null ? false : held.delete(slot);
|
|
367
|
-
},
|
|
368
|
-
clear: () => held.clear(),
|
|
369
|
-
values: () => held.values(),
|
|
370
|
-
[Symbol.iterator]: () => held.values()
|
|
371
|
-
};
|
|
372
|
-
return set;
|
|
373
|
-
}
|
|
374
|
-
function createNameMap2(dop, entries) {
|
|
375
|
-
const held = new Map;
|
|
376
|
-
const map = {
|
|
377
|
-
dop,
|
|
378
|
-
get size() {
|
|
379
|
-
return held.size;
|
|
380
|
-
},
|
|
381
|
-
get: (name) => {
|
|
382
|
-
const key = slotOf(name, dop);
|
|
383
|
-
return key === null ? undefined : held.get(key)?.[1];
|
|
384
|
-
},
|
|
385
|
-
has: (name) => {
|
|
386
|
-
const key = slotOf(name, dop);
|
|
387
|
-
return key === null ? false : held.has(key);
|
|
388
|
-
},
|
|
389
|
-
set(name, value) {
|
|
390
|
-
const key = slotOf(name, dop);
|
|
391
|
-
const slot = key === null ? undefined : held.get(key);
|
|
392
|
-
if (slot === undefined)
|
|
393
|
-
held.set(key ?? lonerSlot(), [name, value]);
|
|
394
|
-
else
|
|
395
|
-
slot[1] = value;
|
|
396
|
-
return this;
|
|
397
|
-
},
|
|
398
|
-
delete: (name) => {
|
|
399
|
-
const key = slotOf(name, dop);
|
|
400
|
-
return key === null ? false : held.delete(key);
|
|
401
|
-
},
|
|
402
|
-
clear: () => held.clear(),
|
|
403
|
-
*keys() {
|
|
404
|
-
for (const [name] of held.values())
|
|
405
|
-
yield name;
|
|
406
|
-
},
|
|
407
|
-
*values() {
|
|
408
|
-
for (const [, value] of held.values())
|
|
409
|
-
yield value;
|
|
410
|
-
},
|
|
411
|
-
*entries() {
|
|
412
|
-
for (const slot of held.values())
|
|
413
|
-
yield [slot[0], slot[1]];
|
|
414
|
-
},
|
|
415
|
-
[Symbol.iterator]() {
|
|
416
|
-
return this.entries();
|
|
417
|
-
}
|
|
418
|
-
};
|
|
419
|
-
for (const [name, value] of entries ?? [])
|
|
420
|
-
map.set(name, value);
|
|
421
|
-
return map;
|
|
422
|
-
}
|
|
423
|
-
function createNameClusters2(dop, linkage) {
|
|
424
|
-
if (dop === "nn5") {
|
|
425
|
-
throw new Error('createNameClusters at nn5 is unimplemented: a linkage is defined over a distance and NN5 answers a relation. Use nameRelation / probablySame(a, b, "nn5"); see docs/NAME-NORMALIZATION.md § NN5 — the middle-name relation.');
|
|
426
|
-
}
|
|
427
|
-
const transitive = dop;
|
|
428
|
-
const held = new Map;
|
|
429
|
-
const out = {
|
|
430
|
-
dop,
|
|
431
|
-
linkage,
|
|
432
|
-
get size() {
|
|
433
|
-
return held.size;
|
|
434
|
-
},
|
|
435
|
-
add(name) {
|
|
436
|
-
const key = slotOf(name, transitive);
|
|
437
|
-
const cluster = key === null ? undefined : held.get(key);
|
|
438
|
-
if (cluster === undefined)
|
|
439
|
-
held.set(key ?? lonerSlot(), [name]);
|
|
440
|
-
else
|
|
441
|
-
cluster.push(name);
|
|
442
|
-
return this;
|
|
443
|
-
},
|
|
444
|
-
clusterOf: (name) => {
|
|
445
|
-
const key = slotOf(name, transitive);
|
|
446
|
-
return key === null ? undefined : held.get(key);
|
|
447
|
-
},
|
|
448
|
-
clusters: () => [...held.values()],
|
|
449
|
-
[Symbol.iterator]: () => held.values()
|
|
450
|
-
};
|
|
451
|
-
return out;
|
|
452
|
-
}
|
|
453
511
|
// src/normalize/name-compose.ts
|
|
454
512
|
var READER_RANK = ["as-parsed", "boundary", "order"];
|
|
455
513
|
var VIA_ORDER = [
|
|
@@ -552,16 +610,6 @@ function meetMiddles(x, y) {
|
|
|
552
610
|
}
|
|
553
611
|
return out;
|
|
554
612
|
}
|
|
555
|
-
function subMultiset(outer, inner) {
|
|
556
|
-
const left = [...inner];
|
|
557
|
-
for (const part of outer) {
|
|
558
|
-
const at = left.indexOf(part);
|
|
559
|
-
if (at < 0)
|
|
560
|
-
return false;
|
|
561
|
-
left.splice(at, 1);
|
|
562
|
-
}
|
|
563
|
-
return true;
|
|
564
|
-
}
|
|
565
613
|
function meetSurname(x, y) {
|
|
566
614
|
if (subMultiset(x, y))
|
|
567
615
|
return y;
|
|
@@ -817,6 +865,306 @@ function foldUnder(prints, surname) {
|
|
|
817
865
|
return mx - my || (slotKey(x) < slotKey(y) ? -1 : 1);
|
|
818
866
|
})[0];
|
|
819
867
|
}
|
|
868
|
+
|
|
869
|
+
// src/normalize/name-kinship.ts
|
|
870
|
+
var KINSHIP_VIAS2 = Object.freeze({
|
|
871
|
+
"surname-part": Object.freeze({ field: "surname", gateSafe: true }),
|
|
872
|
+
"given-variant": Object.freeze({ field: "given", gateSafe: true }),
|
|
873
|
+
"given-family": Object.freeze({ field: "given", gateSafe: true }),
|
|
874
|
+
"given-family-not-gate": Object.freeze({ field: "given", gateSafe: false }),
|
|
875
|
+
"given-maybe": Object.freeze({ field: "given", gateSafe: false }),
|
|
876
|
+
"middle-absent": Object.freeze({ field: "middle", gateSafe: true }),
|
|
877
|
+
"initial-agrees": Object.freeze({ field: "middle", gateSafe: true })
|
|
878
|
+
});
|
|
879
|
+
var VIA_ORDER2 = Object.freeze(Object.keys(KINSHIP_VIAS2));
|
|
880
|
+
var different = (reason) => ({
|
|
881
|
+
relation: "different",
|
|
882
|
+
via: [],
|
|
883
|
+
reason,
|
|
884
|
+
gateSafe: false
|
|
885
|
+
});
|
|
886
|
+
function surnamePartOf(a, b) {
|
|
887
|
+
const pa = surnameParts2(a);
|
|
888
|
+
const pb = surnameParts2(b);
|
|
889
|
+
if (pa.length === pb.length)
|
|
890
|
+
return false;
|
|
891
|
+
const [short, long] = pa.length < pb.length ? [pa, pb] : [pb, pa];
|
|
892
|
+
return subMultiset(short, long);
|
|
893
|
+
}
|
|
894
|
+
function createNameKinship2(options = {}) {
|
|
895
|
+
const providers = Object.freeze([
|
|
896
|
+
...options.given ?? [givenFamilyTable2]
|
|
897
|
+
]);
|
|
898
|
+
const givenVia = (x, y) => {
|
|
899
|
+
const [lo, hi] = x < y ? [x, y] : [y, x];
|
|
900
|
+
for (const provider of providers) {
|
|
901
|
+
const via = provider(lo, hi);
|
|
902
|
+
if (via !== null)
|
|
903
|
+
return via;
|
|
904
|
+
}
|
|
905
|
+
return null;
|
|
906
|
+
};
|
|
907
|
+
return (a, b) => {
|
|
908
|
+
if (!a.isPerson() || !b.isPerson())
|
|
909
|
+
return different("not-a-person");
|
|
910
|
+
const found = new Set;
|
|
911
|
+
if (a.surnameKey() !== b.surnameKey()) {
|
|
912
|
+
if (!surnamePartOf(a, b))
|
|
913
|
+
return different("surname-differs");
|
|
914
|
+
found.add("surname-part");
|
|
915
|
+
}
|
|
916
|
+
const ga = a.givenFields()[0];
|
|
917
|
+
const gb = b.givenFields()[0];
|
|
918
|
+
if (ga === undefined || gb === undefined)
|
|
919
|
+
return different("given-differs");
|
|
920
|
+
if (ga !== gb) {
|
|
921
|
+
const via = givenVia(ga, gb);
|
|
922
|
+
if (via === null)
|
|
923
|
+
return different("given-differs");
|
|
924
|
+
found.add(via);
|
|
925
|
+
}
|
|
926
|
+
const tail = tailRelation(a, b);
|
|
927
|
+
if (tail.relation === "different")
|
|
928
|
+
return different(tail.reason);
|
|
929
|
+
if (tail.relation === "candidate")
|
|
930
|
+
found.add(tail.reason);
|
|
931
|
+
const via = VIA_ORDER2.filter((v) => found.has(v));
|
|
932
|
+
return {
|
|
933
|
+
relation: via.length === 0 ? "same" : "candidate",
|
|
934
|
+
via,
|
|
935
|
+
reason: tail.reason,
|
|
936
|
+
gateSafe: via.every((v) => KINSHIP_VIAS2[v].gateSafe)
|
|
937
|
+
};
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
var nameKinship2 = createNameKinship2();
|
|
941
|
+
|
|
942
|
+
// src/normalize/name-compare.ts
|
|
943
|
+
function nameCompare2(a, b, dop) {
|
|
944
|
+
const x = levelOf2(a, dop);
|
|
945
|
+
const y = levelOf2(b, dop);
|
|
946
|
+
if (x < y)
|
|
947
|
+
return -1;
|
|
948
|
+
return x > y ? 1 : 0;
|
|
949
|
+
}
|
|
950
|
+
function probablySame2(a, b, dop) {
|
|
951
|
+
if (!a.isPerson() || !b.isPerson())
|
|
952
|
+
return false;
|
|
953
|
+
if (dop === "nn5")
|
|
954
|
+
return nameRelation2(a, b).relation !== "different";
|
|
955
|
+
return levelOf2(a, dop) === levelOf2(b, dop);
|
|
956
|
+
}
|
|
957
|
+
function slotOf(name, dop) {
|
|
958
|
+
return name.isPerson() ? levelOf2(name, dop) : null;
|
|
959
|
+
}
|
|
960
|
+
var loner = 0;
|
|
961
|
+
var lonerSlot = () => `\x1F\x1F${loner++}`;
|
|
962
|
+
function createNameSet2(dop) {
|
|
963
|
+
const held = new Map;
|
|
964
|
+
const set = {
|
|
965
|
+
dop,
|
|
966
|
+
get size() {
|
|
967
|
+
return held.size;
|
|
968
|
+
},
|
|
969
|
+
get: (name) => {
|
|
970
|
+
const slot = slotOf(name, dop);
|
|
971
|
+
return slot === null ? undefined : held.get(slot);
|
|
972
|
+
},
|
|
973
|
+
has: (name) => {
|
|
974
|
+
const slot = slotOf(name, dop);
|
|
975
|
+
return slot === null ? false : held.has(slot);
|
|
976
|
+
},
|
|
977
|
+
add(name) {
|
|
978
|
+
const slot = slotOf(name, dop);
|
|
979
|
+
if (slot === null)
|
|
980
|
+
held.set(lonerSlot(), name);
|
|
981
|
+
else if (!held.has(slot))
|
|
982
|
+
held.set(slot, name);
|
|
983
|
+
return this;
|
|
984
|
+
},
|
|
985
|
+
delete: (name) => {
|
|
986
|
+
const slot = slotOf(name, dop);
|
|
987
|
+
return slot === null ? false : held.delete(slot);
|
|
988
|
+
},
|
|
989
|
+
clear: () => held.clear(),
|
|
990
|
+
values: () => held.values(),
|
|
991
|
+
[Symbol.iterator]: () => held.values()
|
|
992
|
+
};
|
|
993
|
+
return set;
|
|
994
|
+
}
|
|
995
|
+
function createNameMap2(dop, entries) {
|
|
996
|
+
const held = new Map;
|
|
997
|
+
const map = {
|
|
998
|
+
dop,
|
|
999
|
+
get size() {
|
|
1000
|
+
return held.size;
|
|
1001
|
+
},
|
|
1002
|
+
get: (name) => {
|
|
1003
|
+
const key = slotOf(name, dop);
|
|
1004
|
+
return key === null ? undefined : held.get(key)?.[1];
|
|
1005
|
+
},
|
|
1006
|
+
has: (name) => {
|
|
1007
|
+
const key = slotOf(name, dop);
|
|
1008
|
+
return key === null ? false : held.has(key);
|
|
1009
|
+
},
|
|
1010
|
+
set(name, value) {
|
|
1011
|
+
const key = slotOf(name, dop);
|
|
1012
|
+
const slot = key === null ? undefined : held.get(key);
|
|
1013
|
+
if (slot === undefined)
|
|
1014
|
+
held.set(key ?? lonerSlot(), [name, value]);
|
|
1015
|
+
else
|
|
1016
|
+
slot[1] = value;
|
|
1017
|
+
return this;
|
|
1018
|
+
},
|
|
1019
|
+
delete: (name) => {
|
|
1020
|
+
const key = slotOf(name, dop);
|
|
1021
|
+
return key === null ? false : held.delete(key);
|
|
1022
|
+
},
|
|
1023
|
+
clear: () => held.clear(),
|
|
1024
|
+
*keys() {
|
|
1025
|
+
for (const [name] of held.values())
|
|
1026
|
+
yield name;
|
|
1027
|
+
},
|
|
1028
|
+
*values() {
|
|
1029
|
+
for (const [, value] of held.values())
|
|
1030
|
+
yield value;
|
|
1031
|
+
},
|
|
1032
|
+
*entries() {
|
|
1033
|
+
for (const slot of held.values())
|
|
1034
|
+
yield [slot[0], slot[1]];
|
|
1035
|
+
},
|
|
1036
|
+
[Symbol.iterator]() {
|
|
1037
|
+
return this.entries();
|
|
1038
|
+
}
|
|
1039
|
+
};
|
|
1040
|
+
for (const [name, value] of entries ?? [])
|
|
1041
|
+
map.set(name, value);
|
|
1042
|
+
return map;
|
|
1043
|
+
}
|
|
1044
|
+
function kinshipBuckets(name) {
|
|
1045
|
+
return [...new Set([name.surnameKey(), ...surnameParts2(name)])];
|
|
1046
|
+
}
|
|
1047
|
+
var RELATION_RANK = {
|
|
1048
|
+
same: 0,
|
|
1049
|
+
candidate: 1,
|
|
1050
|
+
different: 2
|
|
1051
|
+
};
|
|
1052
|
+
function createNameIndex2(dop, options = {}) {
|
|
1053
|
+
const kinship = options.kinship ?? nameKinship2;
|
|
1054
|
+
const map = createNameMap2(dop);
|
|
1055
|
+
const filed = new Map;
|
|
1056
|
+
const buckets = new Map;
|
|
1057
|
+
let seq = 0;
|
|
1058
|
+
const file = (slot, name) => {
|
|
1059
|
+
filed.set(slot, { name, seq: seq++ });
|
|
1060
|
+
for (const key of kinshipBuckets(name)) {
|
|
1061
|
+
const slots = buckets.get(key);
|
|
1062
|
+
if (slots === undefined)
|
|
1063
|
+
buckets.set(key, new Set([slot]));
|
|
1064
|
+
else
|
|
1065
|
+
slots.add(slot);
|
|
1066
|
+
}
|
|
1067
|
+
};
|
|
1068
|
+
const unfile = (slot) => {
|
|
1069
|
+
const held = filed.get(slot);
|
|
1070
|
+
if (held === undefined)
|
|
1071
|
+
return;
|
|
1072
|
+
filed.delete(slot);
|
|
1073
|
+
for (const key of kinshipBuckets(held.name)) {
|
|
1074
|
+
const slots = buckets.get(key);
|
|
1075
|
+
slots?.delete(slot);
|
|
1076
|
+
if (slots?.size === 0)
|
|
1077
|
+
buckets.delete(key);
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
const index = {
|
|
1081
|
+
dop,
|
|
1082
|
+
get size() {
|
|
1083
|
+
return map.size;
|
|
1084
|
+
},
|
|
1085
|
+
get: (name) => map.get(name),
|
|
1086
|
+
has: (name) => map.has(name),
|
|
1087
|
+
set(name, value) {
|
|
1088
|
+
const slot = slotOf(name, dop);
|
|
1089
|
+
if (slot !== null && !filed.has(slot))
|
|
1090
|
+
file(slot, name);
|
|
1091
|
+
map.set(name, value);
|
|
1092
|
+
return this;
|
|
1093
|
+
},
|
|
1094
|
+
delete: (name) => {
|
|
1095
|
+
const slot = slotOf(name, dop);
|
|
1096
|
+
if (slot !== null)
|
|
1097
|
+
unfile(slot);
|
|
1098
|
+
return map.delete(name);
|
|
1099
|
+
},
|
|
1100
|
+
clear: () => {
|
|
1101
|
+
filed.clear();
|
|
1102
|
+
buckets.clear();
|
|
1103
|
+
map.clear();
|
|
1104
|
+
},
|
|
1105
|
+
keys: () => map.keys(),
|
|
1106
|
+
values: () => map.values(),
|
|
1107
|
+
entries: () => map.entries(),
|
|
1108
|
+
[Symbol.iterator]: () => map.entries(),
|
|
1109
|
+
related(name) {
|
|
1110
|
+
const slots = new Set;
|
|
1111
|
+
for (const key of kinshipBuckets(name)) {
|
|
1112
|
+
for (const slot of buckets.get(key) ?? [])
|
|
1113
|
+
slots.add(slot);
|
|
1114
|
+
}
|
|
1115
|
+
const found = [];
|
|
1116
|
+
for (const slot of slots) {
|
|
1117
|
+
const held = filed.get(slot);
|
|
1118
|
+
if (held === undefined)
|
|
1119
|
+
continue;
|
|
1120
|
+
const k = kinship(name, held.name);
|
|
1121
|
+
if (k.relation === "different")
|
|
1122
|
+
continue;
|
|
1123
|
+
found.push({
|
|
1124
|
+
name: held.name,
|
|
1125
|
+
value: map.get(held.name),
|
|
1126
|
+
kinship: k,
|
|
1127
|
+
seq: held.seq
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
found.sort((x, y) => RELATION_RANK[x.kinship.relation] - RELATION_RANK[y.kinship.relation] || x.seq - y.seq);
|
|
1131
|
+
return found.map(({ name: n, value, kinship: k }) => ({ name: n, value, kinship: k }));
|
|
1132
|
+
}
|
|
1133
|
+
};
|
|
1134
|
+
for (const [name, value] of options.entries ?? [])
|
|
1135
|
+
index.set(name, value);
|
|
1136
|
+
return index;
|
|
1137
|
+
}
|
|
1138
|
+
function createNameClusters2(dop, linkage) {
|
|
1139
|
+
if (dop === "nn5") {
|
|
1140
|
+
throw new Error('createNameClusters at nn5 is unimplemented: a linkage is defined over a distance and NN5 answers a relation. Use nameRelation / probablySame(a, b, "nn5"); see docs/NAME-NORMALIZATION.md § NN5 — the middle-name relation.');
|
|
1141
|
+
}
|
|
1142
|
+
const transitive = dop;
|
|
1143
|
+
const held = new Map;
|
|
1144
|
+
const out = {
|
|
1145
|
+
dop,
|
|
1146
|
+
linkage,
|
|
1147
|
+
get size() {
|
|
1148
|
+
return held.size;
|
|
1149
|
+
},
|
|
1150
|
+
add(name) {
|
|
1151
|
+
const key = slotOf(name, transitive);
|
|
1152
|
+
const cluster = key === null ? undefined : held.get(key);
|
|
1153
|
+
if (cluster === undefined)
|
|
1154
|
+
held.set(key ?? lonerSlot(), [name]);
|
|
1155
|
+
else
|
|
1156
|
+
cluster.push(name);
|
|
1157
|
+
return this;
|
|
1158
|
+
},
|
|
1159
|
+
clusterOf: (name) => {
|
|
1160
|
+
const key = slotOf(name, transitive);
|
|
1161
|
+
return key === null ? undefined : held.get(key);
|
|
1162
|
+
},
|
|
1163
|
+
clusters: () => [...held.values()],
|
|
1164
|
+
[Symbol.iterator]: () => held.values()
|
|
1165
|
+
};
|
|
1166
|
+
return out;
|
|
1167
|
+
}
|
|
820
1168
|
// src/normalize/name-infeasible.ts
|
|
821
1169
|
var INFEASIBLE_CLASSES2 = ["merge?", "spelling", "rule-gap"];
|
|
822
1170
|
function editDistance2(a, b) {
|
|
@@ -1420,7 +1768,7 @@ function deriveNameFormat2(prints, options = {}) {
|
|
|
1420
1768
|
return first;
|
|
1421
1769
|
return scoreReadings(cells.map((c) => readNameCell2(c, { ...options, placeColumn: true })), NAME_FORMAT_MODEL, threshold, schoolRead);
|
|
1422
1770
|
}
|
|
1423
|
-
export { repairMojibake2, sameGivenFamily2, comparePosition2, nameRelation2,
|
|
1771
|
+
export { repairMojibake2, sameGivenFamily2, givenFamilyTable2, comparePosition2, nameRelation2, MAX_READINGS2, surnameParts2, printAttestsOrder2, nameReadings2, meetReading2, refinesReading2, sameReading2, chooseReadingPair2, composeReadings2, composeNames2, meetReadings2, nameMeet2, showReading2, blockKeysOfReadings2, nameBlockKeys2, namesFeasible2, KINSHIP_VIAS2, createNameKinship2, nameKinship2, nameCompare2, probablySame2, createNameSet2, createNameMap2, createNameIndex2, createNameClusters2, INFEASIBLE_CLASSES2, editDistance2, nearSpelling2, compoundGiven2, middleForm2, infeasibleClass2, isListJoiner2, personList2, surnameBlock2, initialsBlock2, metaphoneBlocks2, NAME_LEVEL_COLUMNS2, NAME_COLUMNS2, nameColumns2, NAME_FORMATS2, nameFormatOrder2, ORDER_READINGS2, readNameCell2, DEFAULT_NAME_FORMAT_THRESHOLD2, deriveNameFormat2 };
|
|
1424
1772
|
|
|
1425
|
-
//# debugId=
|
|
1426
|
-
//# sourceMappingURL=index-
|
|
1773
|
+
//# debugId=37DF635DD383940A64756E2164756E21
|
|
1774
|
+
//# sourceMappingURL=index-kw69ry3j.js.map
|