UNPKG

@rr0/data

Version:
80 lines (79 loc) 3.56 kB
import { People } from "./People.js"; import { TypedDataFactory } from "../TypedDataFactory.js"; import { Occupation } from "./Occupation.js"; import { CountryCode } from "../org/country/CountryCode.js"; import { Gender } from "@rr0/common"; import * as assert from "node:assert"; import { StringUtil } from "../util/string/index.js"; export class PeopleFactory extends TypedDataFactory { constructor(eventFactory) { super(eventFactory, "people"); } namesFromTitle(title) { let lastName = ""; let firstNames = []; let qualifier = ""; if (title) { title = title.trim(); let commaPos = title.indexOf(","); if (commaPos > 0) { lastName = title.substring(0, commaPos).trim(); firstNames = title.substring(commaPos + 1).trim().replace(" ", " ").split(" "); } else { let spaceParts = title.split(" "); if (spaceParts.length > 1) { let qualifierDone = false; let lastPos = spaceParts.length - 1; do { lastName = spaceParts[lastPos]; if (lastName.startsWith("(")) { qualifier = lastName.substring(1, lastName.length - 1); lastPos--; } else { lastName = StringUtil.camelToText(lastName); qualifierDone = true; } } while (qualifier && !qualifierDone); firstNames = spaceParts.slice(0, lastPos); } else { lastName = ""; firstNames = []; } } } return { lastName, firstNames, qualifier }; } parse(json) { let title = this.createTitle(json); let { lastName, firstNames, qualifier } = this.namesFromTitle(title); lastName = json.lastName = json.lastName || lastName; firstNames = json.firstNames = json.firstNames || firstNames; qualifier = json.qualifier = json.qualifier || qualifier; const pseudonyms = json.pseudonyms || []; json.name = json.name || lastName || firstNames[0] || pseudonyms[0] || ""; const data = super.parse(json); if (!title) { title = (firstNames.join(" ") + lastName || "") || pseudonyms.join(" ") || ""; } assert.ok(title, `Could not devise People title from ${JSON.stringify(json)}`); const occupations = (json.occupations || []).map(occupation => Occupation[occupation]); const countries = (json.countries || []).map(country => CountryCode[country]); const discredited = json.discredited || false; const gender = Gender[json.gender] || Gender.male; const people = new People(firstNames, lastName, pseudonyms, occupations, countries, discredited, gender, data.id, data.dirName, data.image, data.url, data.events, qualifier, data.surname); if (!people.title) { people.title = title; } return people; } createTitle(json) { const firstNames = (json.firstNames || []).join(" "); const lastName = json.lastName || ""; const qualifier = json.qualifier ? `(${json.qualifier})` : ""; const title = [firstNames, lastName, qualifier].join(" ").trim(); return title || super.createTitle(json); } }