@natlibfi/marc-record-validators-melinda 11.4.3 → 11.4.4-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/merge-fields/mergeOrAddPostprocess.js +1 -1
  2. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  3. package/dist/mergeRelatorTermFields.js +4 -13
  4. package/dist/mergeRelatorTermFields.js.map +1 -1
  5. package/dist/sortFields.js +125 -19
  6. package/dist/sortFields.js.map +1 -1
  7. package/dist/sortRelatorTerms.js +41 -25
  8. package/dist/sortRelatorTerms.js.map +1 -1
  9. package/dist/subfield6Utils.js +1 -0
  10. package/dist/subfield6Utils.js.map +1 -1
  11. package/dist/subfield8Utils.js +1 -0
  12. package/dist/subfield8Utils.js.map +1 -1
  13. package/package.json +7 -7
  14. package/src/merge-fields/mergeOrAddPostprocess.js +2 -2
  15. package/src/mergeRelatorTermFields.js +5 -15
  16. package/src/sortFields.js +114 -17
  17. package/src/sortRelatorTerms.js +44 -26
  18. package/src/subfield6Utils.js +1 -1
  19. package/src/subfield8Utils.js +1 -1
  20. package/test-fixtures/sort-relator-terms/f01/expectedResult.json +7 -0
  21. package/test-fixtures/sort-relator-terms/f01/metadata.json +1 -1
  22. package/test-fixtures/sort-relator-terms/f01/record.json +7 -0
  23. package/test-fixtures/sort-relator-terms/f02/expectedResult.json +12 -3
  24. package/test-fixtures/sort-relator-terms/f02/metadata.json +1 -1
  25. package/test-fixtures/sort-relator-terms/f02/record.json +12 -0
  26. package/test-fixtures/sort-relator-terms/f03/expectedResult.json +20 -0
  27. package/test-fixtures/sort-relator-terms/f03/metadata.json +5 -0
  28. package/test-fixtures/sort-relator-terms/f03/record.json +19 -0
  29. package/test-fixtures/sort-relator-terms/f04/expectedResult.json +20 -0
  30. package/test-fixtures/sort-relator-terms/f04/metadata.json +5 -0
  31. package/test-fixtures/sort-relator-terms/f04/record.json +19 -0
@@ -26,7 +26,7 @@ function postprocessBaseRecord(base) {
26
26
  (0, _removeDuplicateSubfields.fieldRemoveDuplicateSubfields)(field);
27
27
  (0, _punctuation.fieldFixPunctuation)(field); // NB! This will fix only fields with merged content
28
28
  (0, _sortSubfields.sortAdjacentSubfields)(field); // Put the added $e subfield to proper places.
29
- (0, _sortRelatorTerms.sortAdjacentESubfields)(field); // Sort $e subfields with each other
29
+ (0, _sortRelatorTerms.sortAdjacentRelatorTerms)(field); // Sort $e subfields with each other
30
30
  (0, _punctuation.fieldFixPunctuation)(field);
31
31
  delete field.merged; // eslint-disable-line functional/immutable-data
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentESubfields","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentESubfields} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) { // eslint-disable-line functional/no-conditional-statements\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentESubfields(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged; // eslint-disable-line functional/immutable-data\n }\n\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n delete field.useExternalEndPunctuation; // eslint-disable-line functional/immutable-data\n }\n\n if (field.added) { // eslint-disable-line functional/no-conditional-statements\n delete field.added; // eslint-disable-line functional/immutable-data\n }\n\n /*\n if (field.deleted) { // eslint-disable-line functional/no-conditional-statements\n delete field.deleted; // eslint-disable-line functional/immutable-data\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted); // eslint-disable-line functional/immutable-data\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAAE;MAClB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,wCAAsB,EAACL,KAAK,CAAC,CAAC,CAAC;MAC/B,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM,CAAC,CAAC;IACvB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MAAE;MACrC,OAAON,KAAK,CAACM,yBAAyB,CAAC,CAAC;IAC1C;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MAAE;MACjB,OAAOP,KAAK,CAACO,KAAK,CAAC,CAAC;IACtB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC,CAAC,CAAC;AACzD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
1
+ {"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) { // eslint-disable-line functional/no-conditional-statements\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged; // eslint-disable-line functional/immutable-data\n }\n\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n delete field.useExternalEndPunctuation; // eslint-disable-line functional/immutable-data\n }\n\n if (field.added) { // eslint-disable-line functional/no-conditional-statements\n delete field.added; // eslint-disable-line functional/immutable-data\n }\n\n /*\n if (field.deleted) { // eslint-disable-line functional/no-conditional-statements\n delete field.deleted; // eslint-disable-line functional/immutable-data\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted); // eslint-disable-line functional/immutable-data\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAAE;MAClB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,0CAAwB,EAACL,KAAK,CAAC,CAAC,CAAC;MACjC,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM,CAAC,CAAC;IACvB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MAAE;MACrC,OAAON,KAAK,CAACM,yBAAyB,CAAC,CAAC;IAC1C;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MAAE;MACjB,OAAOP,KAAK,CAACO,KAAK,CAAC,CAAC;IACtB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC,CAAC,CAAC;AACzD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
@@ -59,20 +59,11 @@ function createNormalizedCloneWithoutRelatorTerms(field) {
59
59
  clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e'); // eslint-disable-line functional/immutable-data
60
60
  return clonedField;
61
61
  }
62
- function fieldToRelatorTermSubfieldCode(field) {
63
- if (['100', '110', '700', '710', '720', '751', '752'].includes(field.tag)) {
64
- return 'e';
65
- }
66
- if (field.tag === '111' || field.tag === '711') {
67
- return 'j';
68
- }
69
- return '?'; // No need to complain. Nothing is found.
70
- }
71
62
  function getRelatorTermStrings(relatorTermSubfieldCode, field) {
72
63
  return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);
73
64
  }
74
65
  function extractAddableRelatorTerms(fromField, toField) {
75
- const relatorTermSubfieldCode = fieldToRelatorTermSubfieldCode(fromField);
66
+ const relatorTermSubfieldCode = (0, _sortRelatorTerms.tagToRelatorTermSubfieldCode)(fromField.tag);
76
67
  const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);
77
68
  if (normalizedFromFieldRelatorTerms.length === 0) {
78
69
  return [];
@@ -82,7 +73,7 @@ function extractAddableRelatorTerms(fromField, toField) {
82
73
  return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));
83
74
  }
84
75
  function copyRelatorSubfields(fromField, toField) {
85
- const relatorTermSubfieldCode = fieldToRelatorTermSubfieldCode(fromField);
76
+ const relatorTermSubfieldCode = (0, _sortRelatorTerms.tagToRelatorTermSubfieldCode)(fromField.tag);
86
77
  const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);
87
78
  newRelatorTerms.forEach(term => toField.subfields.push({
88
79
  code: relatorTermSubfieldCode,
@@ -91,7 +82,7 @@ function copyRelatorSubfields(fromField, toField) {
91
82
  }
92
83
  function mergeRelatorTermFields(record, fix = false) {
93
84
  /* eslint-disable */
94
- // NV: 111/711, 751 and 752 where so rare that I did not add them here
85
+ // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...
95
86
  let fields = record.get('(?:[17][01]0|720)');
96
87
  let result = [];
97
88
  const comparisonFieldsAsString = fields.map(f => (0, _utils.fieldToString)(createNormalizedCloneWithoutRelatorTerms(f)));
@@ -124,7 +115,7 @@ function mergeRelatorTermFields(record, fix = false) {
124
115
  copyRelatorSubfields(mergableField, currField);
125
116
  (0, _punctuation.fieldFixPunctuation)(currField);
126
117
  (0, _sortSubfields.sortAdjacentSubfields)(currField); // Put the added $e subfield to proper places.
127
- (0, _sortRelatorTerms.sortAdjacentESubfields)(currField); // Sort $e subfields with each other
118
+ (0, _sortRelatorTerms.sortAdjacentRelatorTerms)(currField); // Sort $e subfields with each other
128
119
  (0, _punctuation.fieldFixPunctuation)(currField);
129
120
  }
130
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","fieldToRelatorTermSubfieldCode","includes","tag","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentESubfields"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentESubfields} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e'); // eslint-disable-line functional/immutable-data\n return clonedField;\n}\n\nfunction fieldToRelatorTermSubfieldCode(field) {\n if (['100', '110', '700', '710', '720', '751', '752'].includes(field.tag)) {\n return 'e';\n }\n if (field.tag === '111' || field.tag === '711') {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = fieldToRelatorTermSubfieldCode(fromField);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = fieldToRelatorTermSubfieldCode(fromField);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line functional/immutable-data\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentESubfields(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e'); // eslint-disable-line functional/immutable-data\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line functional/immutable-data\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = _default;
7
7
  exports.fieldOrderComparator = fieldOrderComparator;
8
- exports.relatorTermScore = void 0;
9
8
  exports.scoreRelatorTerm = scoreRelatorTerm;
10
9
  var _clone = _interopRequireDefault(require("clone"));
11
10
  var _utils = require("./utils");
@@ -54,43 +53,150 @@ function _default() {
54
53
  return res;
55
54
  }
56
55
  }
57
- const relatorTermScore = exports.relatorTermScore = {
56
+ const relatorTermScore = {
58
57
  // Here bigger is better
59
58
  // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.
60
59
  // NB! The more abstract, the earlier it appears.
61
60
  // Note that terms with same abstraction level might also have order preferences
62
61
  // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)
63
- // work/teos > expression/ekspressio > manifestation/manifestaatio
62
+ // work/teos > expression/ekspressio > manifestation/manifestaatin, https://finto.fi/mts/fi/page/m1298
64
63
  'säveltäjä': 100,
65
64
  'composer': 100,
66
65
  'kirjoittaja': 99,
67
- 'author': 100,
66
+ 'author': 99,
68
67
  'sarjakuvantekijä': 99,
69
68
  'taiteilija': 98,
69
+ 'kartantekijä': 98,
70
70
  'sanoittaja': 90,
71
71
  'käsikirjoittaja': 90,
72
- // expression:
73
- 'toimittaja': 80,
74
- 'editor': 80,
75
- 'sovittaja': 80,
76
- 'arranger': 80,
77
- 'kuvittaja': 75,
72
+ 'soitonoppaan tekijä': 90,
73
+ 'teoksella kunnioitettu': 81,
74
+ 'gratulaation kohde': 81,
75
+ // expression: https://finto.fi/mts/fi/page/m153
76
+ 'sovittaja': 79,
77
+ 'arranger': 79,
78
+ 'kuvittaja': 78,
79
+ 'esipuheen kirjoittaja': 77,
80
+ 'alkusanojen kirjoittaja': 76,
81
+ 'loppusanojen kirjoittaja': 76,
82
+ 'toimittaja': 75,
83
+ 'editor': 75,
84
+ 'esittäjä': 74,
85
+ 'johtaja': 73,
86
+ // orkesterinjohtaja
78
87
  'editointi': 71,
79
88
  // for music, editor/toimittaja is another thing
80
89
  'kääntäjä': 70,
81
90
  'lukija': 61,
82
- // Manifestation level
83
- 'esittäjä': 60,
84
- 'johtaja': 50,
85
- // orkesterinjohtaja
91
+ 'kertoja': 61,
92
+ // Manifestation level: https://finto.fi/mts/fi/page/m491
93
+
86
94
  'kustantaja': 41,
87
95
  'julkaisija': 40
96
+ // Item level: https://finto.fi/mts/fi/page/m1157
97
+ };
98
+ const relatorTermScoreBk = {
99
+ // https://finto.fi/mts/fi/page/m1298 100-81
100
+ 'libretisti': 100,
101
+ 'sarjakuvantekijä': 100,
102
+ 'kirjoittaja': 99,
103
+ 'author': 99,
104
+ 'soitonoppaan tekijä': 99,
105
+ 'kuvaaja': 98,
106
+ 'valokuvaaja': 98,
107
+ 'kokoaja': 85,
108
+ 'teoksella kunnioitettu': 84,
109
+ 'gratulaation kohde': 84,
110
+ 'julkaisija': 83,
111
+ 'säveltäjä': 82,
112
+ // if 300$e has CD etc
113
+ 'sanoittaja': 81,
114
+ // expression: https://finto.fi/mts/fi/page/m153
115
+ 'kuvittaja': 80,
116
+ 'esipuheen kirjoittaja': 79,
117
+ 'alkusanojen kirjoittaja': 78,
118
+ 'loppusanojen kirjoittaja': 78,
119
+ 'kääntäjä': 70,
120
+ 'sovittaja': 50,
121
+ // kappale
122
+ 'sitoja': 25,
123
+ 'gratulaation kirjoittaja': 24
124
+ };
125
+ const relatorTermScoreMu = {
126
+ 'säveltäjä': 100,
127
+ 'sanoittaja': 99,
128
+ 'soitonoppaan tekijä': 98,
129
+ 'teoksella kunnioitettu': 81,
130
+ // expression: https://finto.fi/mts/fi/page/m153
131
+ 'sovittaja': 79,
132
+ 'johtaja': 78,
133
+ 'esittäjä': 77,
134
+ 'lukija': 76,
135
+ 'miksaaja': 75
136
+ };
137
+ const relatorTermScoreVm = {
138
+ // Work
139
+ 'ohjaaja': 100,
140
+ 'kirjoittaja': 99,
141
+ 'author': 99,
142
+ // Here we assume that film/whatever is based on author's book
143
+ 'käsikirjoittaja': 98,
144
+ 'kuvaaja': 89,
145
+ 'säveltäjä': 82,
146
+ // volatile
147
+ // Expression
148
+ 'leikkaaja': 80,
149
+ 'sovittaja': 79,
150
+ 'johtaja': 78,
151
+ 'esittäjä': 77,
152
+ 'lukija': 76,
153
+ 'miksaaja': 75,
154
+ 'kääntäjä': 70
155
+ // Manifestation
156
+
157
+ // Item
88
158
  };
89
- function scoreRelatorTerm(value) {
90
- // sortRelatorTerms.js validator should call this on future version
91
- const normValue = value.replace(/[.,]+$/u, '');
92
- if (normValue in relatorTermScore) {
93
- return relatorTermScore[normValue];
159
+ function normalizeValue(value) {
160
+ // Removing last punc char is good enough for our purposes.
161
+ // We don't handle abbreviations here etc.
162
+ // Brackets should not happen either, should they?
163
+ return value.replace(/[.,]$/u, '');
164
+ }
165
+ function scoreRelatorTermBk(normalizedValue) {
166
+ if (normalizedValue in relatorTermScoreBk) {
167
+ return relatorTermScoreBk[normalizedValue];
168
+ }
169
+ return 0;
170
+ }
171
+ function scoreRelatorTermMu(normalizedValue) {
172
+ if (normalizedValue in relatorTermScoreMu) {
173
+ return relatorTermScoreMu[normalizedValue];
174
+ }
175
+ return 0;
176
+ }
177
+ function scoreRelatorTermVm(normalizedValue) {
178
+ if (normalizedValue in relatorTermScoreVm) {
179
+ return relatorTermScoreVm[normalizedValue];
180
+ }
181
+ return 0;
182
+ }
183
+ function scoreRelatorTerm(value, typeOfMaterial = undefined) {
184
+ // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!
185
+ const normalizedValue = normalizeValue(value);
186
+ if (typeOfMaterial === 'BK') {
187
+ // Books
188
+ return scoreRelatorTermBk(normalizedValue);
189
+ }
190
+ if (typeOfMaterial === 'MU') {
191
+ // Music (NB: audio books should be BK in this context!)
192
+ return scoreRelatorTermMu(normalizedValue);
193
+ }
194
+ if (typeOfMaterial === 'VM') {
195
+ // video material
196
+ return scoreRelatorTermVm(normalizedValue);
197
+ }
198
+ if (normalizedValue in relatorTermScore) {
199
+ return relatorTermScore[normalizedValue];
94
200
  }
95
201
  return 0;
96
202
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","exports","scoreRelatorTerm","value","normValue","replace","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","undefined","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nexport const relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatio\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 99, 'author': 100,\n 'sarjakuvantekijä': 99,\n 'taiteilija': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n // expression:\n 'toimittaja': 80, 'editor': 80,\n 'sovittaja': 80, 'arranger': 80,\n 'kuvittaja': 75,\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61,\n // Manifestation level\n 'esittäjä': 60,\n 'johtaja': 50, // orkesterinjohtaja\n 'kustantaja': 41,\n 'julkaisija': 40\n\n};\n\nexport function scoreRelatorTerm(value) { // sortRelatorTerms.js validator should call this on future version\n const normValue = value.replace(/[.,]+$/u, '');\n if (normValue in relatorTermScore) {\n return relatorTermScore[normValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin, https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 99, 'author': 99,\n 'sarjakuvantekijä': 99,\n 'taiteilija': 98, 'kartantekijä': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90, 'soitonoppaan tekijä': 90,\n 'teoksella kunnioitettu': 81, 'gratulaation kohde': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'kuvittaja': 78,\n 'esipuheen kirjoittaja': 77,\n 'alkusanojen kirjoittaja': 76, 'loppusanojen kirjoittaja': 76,\n 'toimittaja': 75, 'editor': 75,\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n\n 'kustantaja': 41,\n 'julkaisija': 40\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m1298 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 83,\n 'säveltäjä': 82, // if 300$e has CD etc\n 'sanoittaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'kuvittaja': 80,\n 'esipuheen kirjoittaja': 79,\n 'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,\n 'kääntäjä': 70,\n\n 'sovittaja': 50,\n // kappale\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75\n};\n\nconst relatorTermScoreVm = {\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 82, // volatile\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70\n // Manifestation\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = _default;
7
- exports.sortAdjacentESubfields = sortAdjacentESubfields;
7
+ exports.sortAdjacentRelatorTerms = sortAdjacentRelatorTerms;
8
+ exports.tagToRelatorTermSubfieldCode = tagToRelatorTermSubfieldCode;
8
9
  var _clone = _interopRequireDefault(require("clone"));
9
10
  var _utils = require("./utils");
10
11
  var _punctuation = require("./punctuation2");
@@ -19,14 +20,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
19
20
  //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');
20
21
  //const debugData = debug.extend('data');
21
22
 
22
- const WORST_WORK = 98;
23
- function scoreRelatorTerm(term) {
24
- const normalizedTerm = normalizeValue(term);
25
- if (normalizedTerm in _sortFields.relatorTermScore) {
26
- return _sortFields.relatorTermScore[normalizedTerm];
27
- }
28
- return 0;
29
- }
23
+ const WORST_WORK = 81;
30
24
  function _default() {
31
25
  return {
32
26
  description: 'Sort adjacent $e subfields in field [1678][01]0',
@@ -39,8 +33,9 @@ function _default() {
39
33
  fix: [],
40
34
  valid: true
41
35
  };
36
+ const typeOfMaterial = recordToTypeOfMaterial(record);
42
37
  record.fields.forEach(field => {
43
- sortAdjacentESubfields(field);
38
+ sortAdjacentRelatorTerms(field, typeOfMaterial);
44
39
  });
45
40
  return res;
46
41
  }
@@ -48,9 +43,10 @@ function _default() {
48
43
  const res = {
49
44
  message: []
50
45
  };
46
+ const typeOfMaterial = recordToTypeOfMaterial(record);
51
47
  record.fields.forEach(field => {
52
48
  const clonedField = (0, _clone.default)(field);
53
- sortAdjacentESubfields(clonedField);
49
+ sortAdjacentRelatorTerms(clonedField, typeOfMaterial);
54
50
  const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
55
51
  const fieldAsString = (0, _utils.fieldToString)(field);
56
52
  if (fieldAsString !== clonedFieldAsString) {
@@ -62,26 +58,46 @@ function _default() {
62
58
  return res;
63
59
  }
64
60
  }
65
- function normalizeValue(value) {
66
- // Removing last punc char is good enough for our purposes.
67
- // We don't handle abbreviations here etc.
68
- // Brackets should not happen either, should they?
69
- return value.replace(/[.,]$/u, '');
61
+ function recordToTypeOfMaterial(record) {
62
+ if (!record.leader) {
63
+ return undefined;
64
+ }
65
+ if (record.leader.charAt(6) === 'i') {
66
+ // Audio books should follow rules of a book, I guess...
67
+ return 'BK';
68
+ }
69
+ return record.getTypeOfMaterial();
70
70
  }
71
- function swapESubfields(field) {
71
+ function tagToRelatorTermSubfieldCode(tag) {
72
+ if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {
73
+ return 'e';
74
+ }
75
+ if (['111', '611', '711', '811'].includes(tag)) {
76
+ return 'j';
77
+ }
78
+ return '?'; // No need to complain. Nothing is found.
79
+ }
80
+ function isRelatorTermTag(tag) {
81
+ // NV: 111/711, 751 and 752 are very rare
82
+ return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));
83
+ }
84
+ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
72
85
  if (!field.subfields) {
73
86
  return;
74
87
  }
88
+ const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
75
89
  const loopAgain = field.subfields.some((sf, index) => {
76
- if (index === 0 || sf.code !== 'e') {
90
+ // NB! we should fix 'e' to 'e' or 'j'....
91
+ if (index === 0 || sf.code !== subfieldCode) {
77
92
  return false;
78
93
  }
79
- const currScore = scoreRelatorTerm(sf.value);
94
+ const currScore = (0, _sortFields.scoreRelatorTerm)(sf.value, typeOfMaterial);
80
95
  const prevSubfield = field.subfields[index - 1];
81
- if (currScore === 0 || prevSubfield.code !== 'e') {
96
+ if (currScore === 0 || prevSubfield.code !== subfieldCode) {
82
97
  return false;
83
98
  }
84
- const prevScore = scoreRelatorTerm(prevSubfield.value);
99
+ const prevScore = (0, _sortFields.scoreRelatorTerm)(prevSubfield.value, typeOfMaterial);
100
+ //console.log(`PREV: ${prevScore}, CURR: ${currScore}`); // eslint-disable-line no-console
85
101
 
86
102
  // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!
87
103
  if (prevScore === 0 && currScore < WORST_WORK) {
@@ -98,16 +114,16 @@ function swapESubfields(field) {
98
114
  return false;
99
115
  });
100
116
  if (loopAgain) {
101
- swapESubfields(field); // uh, evil recursion...
117
+ swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
102
118
  return;
103
119
  }
104
120
  return;
105
121
  }
106
- function sortAdjacentESubfields(field) {
107
- if (!field.subfields) {
122
+ function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {
123
+ if (!field.subfields || !isRelatorTermTag(field.tag)) {
108
124
  return field;
109
125
  }
110
- swapESubfields(field);
126
+ swapRelatorTermSubfields(field, typeOfMaterial);
111
127
  return field;
112
128
  }
113
129
  //# sourceMappingURL=sortRelatorTerms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","scoreRelatorTerm","term","normalizedTerm","normalizeValue","relatorTermScore","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","sortAdjacentESubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","value","replace","swapESubfields","subfields","loopAgain","some","sf","index","code","currScore","prevSubfield","prevScore","tmp","fieldFixPunctuation"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {relatorTermScore} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 98;\n\nfunction scoreRelatorTerm(term) {\n const normalizedTerm = normalizeValue(term);\n if (normalizedTerm in relatorTermScore) {\n return relatorTermScore[normalizedTerm];\n }\n return 0;\n}\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n sortAdjacentESubfields(field);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentESubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\n\nfunction swapESubfields(field) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0 || sf.code !== 'e') {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value);\n\n const prevSubfield = field.subfields[index - 1];\n if (currScore === 0 || prevSubfield.code !== 'e') {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value);\n\n\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n\n if (currScore > prevScore) {\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n return false;\n\n });\n\n if (loopAgain) {\n swapESubfields(field); // uh, evil recursion...\n return;\n }\n\n return;\n\n}\n\nexport function sortAdjacentESubfields(field) {\n if (!field.subfields) {\n return field;\n }\n swapESubfields(field);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","loopAgain","some","sf","index","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore","tmp","fieldFixPunctuation"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n const loopAgain = field.subfields.some((sf, index) => {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n\n const prevSubfield = field.subfields[index - 1];\n if (currScore === 0 || prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n //console.log(`PREV: ${prevScore}, CURR: ${currScore}`); // eslint-disable-line no-console\n\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n\n if (currScore > prevScore) {\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n return false;\n\n });\n\n if (loopAgain) {\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n return;\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -29,6 +29,7 @@ exports.recordGetSubfield6ChainHeads = recordGetSubfield6ChainHeads;
29
29
  exports.resetSubfield6Tag = resetSubfield6Tag;
30
30
  exports.subfield6GetOccurrenceNumber = subfield6GetOccurrenceNumber;
31
31
  exports.subfield6GetOccurrenceNumberAsInteger = subfield6GetOccurrenceNumberAsInteger;
32
+ exports.subfield6GetTag = subfield6GetTag;
32
33
  exports.subfield6HasWantedTagAndOccurrenceNumber = subfield6HasWantedTagAndOccurrenceNumber;
33
34
  exports.subfield6ResetOccurrenceNumber = subfield6ResetOccurrenceNumber;
34
35
  var _debug = _interopRequireDefault(require("debug"));