@natlibfi/melinda-record-match-validator
Version:
Validates if two records matched by melinda-record-matching can be merged and sets merge priority
60 lines (59 loc) • 2.3 kB
JavaScript
import { hasFields, getSubfield, stripPunc } from "../collectFunctions/collectUtils.js";
import createDebugLogger from "debug";
const debug = createDebugLogger("@natlibfi/melinda-record-match-validator:partsAndSets:test");
const debugData = debug.extend("data");
export function getExtentsForPartsAndSets(record) {
const f300s = hasFields("300", record, f300ToJSON);
debug("Field 300 info: %o", f300s);
return f300s;
function f300ToJSON(field) {
const extentString = getSubfield(field, "a");
debugData(`f300 $a: ${extentString}`);
const extentArray = parseExtentString(extentString);
const type = getExtentType(extentArray);
const extent = {
type,
string: extentString,
array: extentArray,
additionalExtent: void 0
};
const additionalExtentString = getSubfield(field, "e");
debugData(`f300 $e: ${additionalExtentString}`);
if (additionalExtentString && additionalExtentString !== "undefined") {
const additionalExtentArray = parseExtentString(additionalExtentString);
const additionalType = getExtentType(additionalExtentArray);
return {
...extent,
additionalExtent: {
string: additionalExtentString,
array: additionalExtentArray,
type: additionalType
}
};
}
return extent;
}
}
export function getExtentType(extentArray) {
debug(`Getting extentType from extentArray`);
debugData(extentArray);
const setTypeUnitsRegex = /vol|volumes|nidettä|osaa|band/iu;
if (extentArray.some((extent) => extent.amount > 1 && extent.unit.match(setTypeUnitsRegex))) {
return "set";
}
return "unknown";
}
export function parseExtentString(extentString) {
debug(`Handling extentString: |${extentString}|`);
const punctlessString = stripPunc(extentString);
debug(`Removed punctuation: |${punctlessString}|`);
const regexpExtent = /(?<amount>\p{N}+) (?<unit>[\p{L}\p{N}-]+)/mgu;
const foundExtents = [];
for (const match of punctlessString.matchAll(regexpExtent)) {
debug(`amount: ${match.groups.amount} unit: ${match.groups.unit}`);
foundExtents.push({ amount: match.groups.amount, unit: match.groups.unit });
}
debugData(JSON.stringify(foundExtents));
return foundExtents;
}
//# sourceMappingURL=partsAndSetsExtent.js.map