@rr0/data
Version:
RR0 data model
80 lines (79 loc) • 3.56 kB
JavaScript
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);
}
}