UNPKG

@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
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