@natlibfi/melinda-record-match-validator
Version:
Validates if two records matched by melinda-record-matching can be merged and sets merge priority
72 lines (71 loc) • 2.71 kB
JavaScript
import ISBN from "isbn3";
function mapQualifier(value) {
if (value.match(/epub/iu)) {
return "EPUB";
}
if (value.match(/pdf/iu)) {
return "PDF";
}
if (value.match(/^(?:hft|häftad|mjuka pärmar|nid|paperback|pehmeäkantinen)/ui)) {
return "PEHME\xC4KANTINEN";
}
if (value.match(/^(?:hard.?cover|hårda pärmar|kovakantinen|sid)/ui)) {
return "KOVAKANTINEN";
}
return void 0;
}
function normalizeIsbn(value) {
const normalizedValue = value.replace(/x/u, "X").replace(/-/ug, "");
if (normalizedValue.length !== 10 && normalizedValue.length !== 13) {
return value;
}
if (invalidISBN(normalizedValue)) {
return value;
}
const parsedIsbn = ISBN.parse(normalizedValue);
const result = parsedIsbn.isbn13;
return result;
}
function invalidISBN(isbn) {
try {
const auditedIsbn = ISBN.audit(isbn);
return !auditedIsbn.validIsbn;
} catch {
return true;
}
}
function fieldsShareIsbn(field1, field2) {
const isbns1 = field1.subfields.filter((sf) => sf.code === "a" && sf.value !== void 0).map((sf) => normalizeIsbn(sf.value));
const isbns2 = field2.subfields.filter((sf) => sf.code === "a" && sf.value !== void 0).map((sf) => normalizeIsbn(sf.value));
return isbns1.some((v1) => isbns2.some((v2) => v1 === v2));
}
function hasConflictingQualifierTypes(type1, type2) {
return type1 !== void 0 && type2 !== void 0 && type1 !== type2;
}
function fieldHaveConflictingQualifiers(field1, field2) {
const qualifierTypes1 = field1.subfields.filter((sf) => sf.code === "q").map((sf) => mapQualifier(sf.value));
const qualifierTypes2 = field2.subfields.filter((sf) => sf.code === "q").map((sf) => mapQualifier(sf.value));
return qualifierTypes1.some((type1) => qualifierTypes2.some((type2) => hasConflictingQualifierTypes(type1, type2)));
}
function hasConflinctingQualifier(field, otherFields) {
const relevantOtherFields = otherFields.filter((field2) => fieldsShareIsbn(field, field2));
if (relevantOtherFields.length === 0) {
return false;
}
return relevantOtherFields.some((field2) => fieldHaveConflictingQualifiers(field, field2));
}
function isRelevantField(field) {
if (field.tag !== "020") {
return false;
}
return field.subfields.some((sf) => sf.code === "a") && field.subfields.some((sf) => sf.code === "q");
}
export function performIsbnQualifierCheck({ record1, record2 }) {
const fields1 = record1.fields.filter((f) => isRelevantField(f));
const fields2 = record2.fields.filter((f) => isRelevantField(f));
if (fields1.length === 0 || fields2.length === 0) {
return true;
}
return fields1.some((f) => !hasConflinctingQualifier(f, fields2));
}
//# sourceMappingURL=sanityCheckIsbnQualifer.js.map