@natlibfi/marc-record-validators-melinda 10.15.1 → 10.15.2-alpha.3

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 (96) hide show
  1. package/dist/ending-punctuation.js +0 -5
  2. package/dist/ending-punctuation.js.map +1 -1
  3. package/dist/ending-punctuation.spec.js +0 -8
  4. package/dist/ending-punctuation.spec.js.map +1 -1
  5. package/dist/field-505-separators.js +0 -2
  6. package/dist/field-505-separators.js.map +1 -1
  7. package/dist/field-521-fix.js +0 -1
  8. package/dist/field-521-fix.js.map +1 -1
  9. package/dist/field-exclusion.js +0 -3
  10. package/dist/field-exclusion.js.map +1 -1
  11. package/dist/field-exclusion.spec.js +0 -2
  12. package/dist/field-exclusion.spec.js.map +1 -1
  13. package/dist/fixRelatorTerms.js +1 -2
  14. package/dist/fixRelatorTerms.js.map +1 -1
  15. package/dist/identical-fields.js +0 -1
  16. package/dist/identical-fields.js.map +1 -1
  17. package/dist/indicator-fixes.js +0 -7
  18. package/dist/indicator-fixes.js.map +1 -1
  19. package/dist/isbn-issn.js +0 -3
  20. package/dist/isbn-issn.js.map +1 -1
  21. package/dist/item-language.js +0 -1
  22. package/dist/item-language.js.map +1 -1
  23. package/dist/mergeField500Lisapainokset.js +0 -3
  24. package/dist/mergeField500Lisapainokset.js.map +1 -1
  25. package/dist/mergeRelatorTermFields.js +1 -2
  26. package/dist/mergeRelatorTermFields.js.map +1 -1
  27. package/dist/normalize-identifiers.js +2 -0
  28. package/dist/normalize-identifiers.js.map +1 -1
  29. package/dist/normalize-qualifying-information.js +0 -1
  30. package/dist/normalize-qualifying-information.js.map +1 -1
  31. package/dist/normalize-utf8-diacritics.js +3 -0
  32. package/dist/normalize-utf8-diacritics.js.map +1 -1
  33. package/dist/normalizeFieldForComparison.js +0 -6
  34. package/dist/normalizeFieldForComparison.js.map +1 -1
  35. package/dist/prepublicationUtils.js +0 -1
  36. package/dist/prepublicationUtils.js.map +1 -1
  37. package/dist/punctuation/index.js +0 -9
  38. package/dist/punctuation/index.js.map +1 -1
  39. package/dist/punctuation2.js +7 -14
  40. package/dist/punctuation2.js.map +1 -1
  41. package/dist/reindexSubfield6OccurenceNumbers.js +0 -1
  42. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  43. package/dist/removeDuplicateDataFields.js +0 -6
  44. package/dist/removeDuplicateDataFields.js.map +1 -1
  45. package/dist/removeInferiorDataFields.js +29 -14
  46. package/dist/removeInferiorDataFields.js.map +1 -1
  47. package/dist/resolvable-ext-references-melinda.js +0 -3
  48. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  49. package/dist/resolveOrphanedSubfield6s.js +0 -2
  50. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  51. package/dist/sanitize-vocabulary-source-codes.js +1 -0
  52. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  53. package/dist/sort-tags.js +0 -1
  54. package/dist/sort-tags.js.map +1 -1
  55. package/dist/sortFields.js +1 -1
  56. package/dist/sortFields.js.map +1 -1
  57. package/dist/sortRelatorTerms.js +1 -1
  58. package/dist/sortRelatorTerms.js.map +1 -1
  59. package/dist/sortSubfields.js +0 -3
  60. package/dist/sortSubfields.js.map +1 -1
  61. package/dist/subfield-exclusion.js +0 -4
  62. package/dist/subfield-exclusion.js.map +1 -1
  63. package/dist/subfield-exclusion.spec.js +1 -0
  64. package/dist/subfield-exclusion.spec.js.map +1 -1
  65. package/dist/subfield6Utils.js +0 -6
  66. package/dist/subfield6Utils.js.map +1 -1
  67. package/dist/subfield8Utils.js +0 -2
  68. package/dist/subfield8Utils.js.map +1 -1
  69. package/dist/subfieldValueNormalizations.js +0 -1
  70. package/dist/subfieldValueNormalizations.js.map +1 -1
  71. package/dist/sync-007-and-300.js +1 -2
  72. package/dist/sync-007-and-300.js.map +1 -1
  73. package/dist/unicode-decomposition.js +0 -1
  74. package/dist/unicode-decomposition.js.map +1 -1
  75. package/dist/update-field-540.js +1 -1
  76. package/dist/update-field-540.js.map +1 -1
  77. package/dist/urn.js +0 -1
  78. package/dist/urn.js.map +1 -1
  79. package/dist/utils.js +0 -1
  80. package/dist/utils.js.map +1 -1
  81. package/package.json +10 -10
  82. package/src/normalize-utf8-diacritics.js +2 -2
  83. package/src/punctuation2.js +4 -3
  84. package/src/removeInferiorDataFields.js +33 -13
  85. package/test-fixtures/punctuation2/96/expectedResult.json +26 -0
  86. package/test-fixtures/punctuation2/96/metadata.json +6 -0
  87. package/test-fixtures/punctuation2/96/record.json +25 -0
  88. package/test-fixtures/remove-inferior-datafields/f12/expectedResult.json +15 -0
  89. package/test-fixtures/remove-inferior-datafields/f12/metadata.json +6 -0
  90. package/test-fixtures/remove-inferior-datafields/f12/record.json +22 -0
  91. package/test-fixtures/remove-inferior-datafields/f13/expectedResult.json +11 -0
  92. package/test-fixtures/remove-inferior-datafields/f13/metadata.json +6 -0
  93. package/test-fixtures/remove-inferior-datafields/f13/record.json +15 -0
  94. package/test-fixtures/strip-punctuation/96/expectedResult.json +26 -0
  95. package/test-fixtures/strip-punctuation/96/metadata.json +6 -0
  96. package/test-fixtures/strip-punctuation/96/record.json +25 -0
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "10.15.1",
17
+ "version": "10.15.2-alpha.3",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -37,8 +37,8 @@
37
37
  "dependencies": {
38
38
  "@babel/register": "^7.22.15",
39
39
  "@natlibfi/issn-verify": "^1.0.3",
40
- "@natlibfi/marc-record": "^8.0.0",
41
- "@natlibfi/marc-record-validate": "^8.0.3",
40
+ "@natlibfi/marc-record": "^8.0.2",
41
+ "@natlibfi/marc-record-validate": "^8.0.4",
42
42
  "cld3-asm": "^3.1.1",
43
43
  "clone": "^2.1.2",
44
44
  "debug": "^4.3.4",
@@ -48,22 +48,22 @@
48
48
  "xml2js": "^0.6.2"
49
49
  },
50
50
  "peerDependencies": {
51
- "@natlibfi/marc-record-validate": "^8.0.3"
51
+ "@natlibfi/marc-record-validate": "^8.0.4"
52
52
  },
53
53
  "devDependencies": {
54
- "@babel/cli": "^7.23.0",
55
- "@babel/core": "^7.23.3",
54
+ "@babel/cli": "^7.23.4",
55
+ "@babel/core": "^7.23.6",
56
56
  "@babel/eslint-parser": "^7.23.3",
57
- "@babel/preset-env": "^7.23.3",
57
+ "@babel/preset-env": "^7.23.6",
58
58
  "@natlibfi/eslint-config-melinda-backend": "^3.0.3",
59
- "@natlibfi/fixugen": "^2.0.2",
60
- "@natlibfi/fixura": "^3.0.2",
59
+ "@natlibfi/fixugen": "^2.0.3",
60
+ "@natlibfi/fixura": "^3.0.3",
61
61
  "babel-plugin-istanbul": "^6.1.1",
62
62
  "babel-plugin-rewire": "^1.2.0",
63
63
  "chai": "^4.3.10",
64
64
  "chai-as-promised": "^7.1.1",
65
65
  "cross-env": "^7.0.3",
66
- "eslint": "^8.53.0",
66
+ "eslint": "^8.55.0",
67
67
  "fetch-mock": "^9.11.0",
68
68
  "mocha": "^10.2.0",
69
69
  "nyc": "^15.1.0"
@@ -77,7 +77,7 @@ export default function () {
77
77
 
78
78
 
79
79
  // Traditionally these six are precomposed and all the rest decomposed
80
- function precomposeFinnishLetters(value = '') {
80
+ export function precomposeFinnishLetters(value = '') {
81
81
  return value.
82
82
  replace(/å/gu, 'å').
83
83
  replace(/ä/gu, 'ä').
@@ -87,7 +87,7 @@ function precomposeFinnishLetters(value = '') {
87
87
  replace(/Ö/gu, 'Ö');
88
88
  }
89
89
 
90
- function fixComposition(value = '') {
90
+ export function fixComposition(value = '') {
91
91
  // Target: Diacritics use Melinda internal notation.
92
92
  // General solution: Decompose everything and then compose 'å', 'ä', 'ö', 'Å', 'Ä' and 'Ö'.
93
93
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
@@ -111,11 +111,12 @@ const cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context':
111
111
 
112
112
  const addX00aComma = {'add': ',', 'code': 'abcqdej', 'followedBy': 'cdeg', 'context': commaNeedsPuncAfter, 'contextRHS': allowsPuncRHS};
113
113
  const addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\.$/u, 'contextRHS': allowsPuncRHS};
114
- const addX00aDot = {'add': '.', 'code': 'abcde', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};
114
+ const addX00aDot = {'add': '.', 'code': 'abcdet', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};
115
115
 
116
+ //const addX10iaComma = {'name': 'Punctuate relationship information', 'code': 'i', 'followedBy': 'a', 'context': defaultNeedsPuncAfter2};
116
117
  const addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter};
117
118
  const addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter};
118
- const addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abe', 'followedBy': '#', 'context': defaultNeedsPuncAfter};
119
+ const addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': defaultNeedsPuncAfter};
119
120
  const addLanguageComma = {'name': 'Add comma before 810$l', 'add': ',', 'code': 'tv', 'followedBy': 'l', 'context': defaultNeedsPuncAfter2};
120
121
  const addColonToRelationshipInformation = {'name': 'Add \':\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};
121
122
 
@@ -194,7 +195,7 @@ const cleanLanguageComma = {'name': 'language comma', 'code': 'tv', 'followedBy'
194
195
  const legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];
195
196
 
196
197
  const cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};
197
- const cleanLegalX10Dot = {'name': 'X10dot', 'code': 'ab', 'followedBy': 'b#', 'context': /.\.$/u, 'remove': /\.$/u};
198
+ const cleanLegalX10Dot = {'name': 'X10dot', 'code': 'abt', 'followedBy': 'bst#', 'context': /.\.$/u, 'remove': /\.$/u};
198
199
 
199
200
  const legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, cleanLanguageComma];
200
201
 
@@ -5,6 +5,7 @@ import {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} fro
5
5
  import {fieldHasValidSubfield8} from './subfield8Utils';
6
6
  import {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';
7
7
  import {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';
8
+ import {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';
8
9
 
9
10
  // Relocated from melinda-marc-record-merge-reducers (and renamed)
10
11
 
@@ -241,14 +242,21 @@ function deriveIndividualDeletables(record) {
241
242
  return deletables;
242
243
  }
243
244
 
245
+ const accentless = getAccentlessVersion(currString);
246
+ const d490 = deriveIndividualDeletables490([currString]);
247
+ const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign
248
+ const moreToDo = [...accentless, ...d490, ...subsets];
249
+
250
+
244
251
  if (currString.match(/^[1678]00/u)) {
245
- // Proof-of-concpet rule. Should be improved eventually...
252
+ // Proof-of-concept rule. Should be improved eventually...
246
253
  if (currString.match(/, ‡e [^‡]+\.$/u)) {
247
254
  const tmp = currString.replace(/, ‡e [^‡]+\.$/u, '.');
248
- return processTodoList([tmp, ...stillToDo], [...deletables, tmp]);
255
+ return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);
249
256
  }
250
257
  }
251
258
 
259
+
252
260
  if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish
253
261
  const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields
254
262
  replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields
@@ -256,7 +264,7 @@ function deriveIndividualDeletables(record) {
256
264
  // ind2: '1' => '#':
257
265
  replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group
258
266
  if (tmp !== currString) {
259
- return processTodoList([tmp, ...stillToDo], [...deletables, tmp]);
267
+ return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);
260
268
  }
261
269
  //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)
262
270
  //nvdebug(`505 DERIVATE: '${tmp}'`)
@@ -270,23 +278,35 @@ function deriveIndividualDeletables(record) {
270
278
  if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /u)) {
271
279
  const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group
272
280
  //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);
273
- return processTodoList(stillToDo, [...deletables, tmp, tmp2]);
281
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);
274
282
  }
275
- return processTodoList(stillToDo, [...deletables, tmp]);
283
+ return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);
276
284
  }
277
285
 
278
- const d490 = deriveIndividualDeletables490([currString]);
279
- if (d490.length) {
280
- return processTodoList([...stillToDo, ...d490], [...deletables, ...d490]);
281
- }
282
- // d490.forEach(str => deletables.push(str)); // eslint-disable-line functional/immutable-data
283
286
 
284
- const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign
287
+ const ennakkotieto653 = currString.match(/^653./u) ? [`${currString} ‡g ENNAKKOTIETO`] : []; // MET-528
288
+
289
+ const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...ennakkotieto653];
290
+
285
291
  if (subsets.length) {
286
- return processTodoList([...stillToDo, ...subsets], [...deletables, ...subsets]);
292
+ return processTodoList([...stillToDo, ...moreToDo], newDeletables);
287
293
  }
288
294
 
289
- return processTodoList(stillToDo, deletables);
295
+ return processTodoList([...stillToDo, ...moreToDo], newDeletables);
296
+ }
297
+
298
+ function getAccentlessVersion(string) { // MET-527
299
+ //nvdebug(`START: '${string}`);
300
+ // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..
301
+ if (string !== precomposeFinnishLetters(string)) {
302
+ return [];
303
+ }
304
+ const accentless = String(fixComposition(string)).replace(/\p{Diacritic}/gu, '');
305
+ //nvdebug(`FROM '${string}'\n TO '${accentless}'`);
306
+ if (accentless === string) { // Don't self-destruct
307
+ return [];
308
+ }
309
+ return [accentless];
290
310
  }
291
311
 
292
312
  }
@@ -0,0 +1,26 @@
1
+ {
2
+ "leader": "01331cam a22003494i 4500",
3
+ "_validationOptions": {},
4
+ "fields": [
5
+ { "tag": "001", "value": "000000001" },
6
+
7
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
8
+ { "code": "a", "value": "Pulun Yliopisto." },
9
+ { "code": "b", "value": "Yksikkö." },
10
+ { "code": "b", "value": "Alayksikkö." }
11
+ ]},
12
+
13
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
14
+ { "code": "a", "value": "Pulun Yliopisto." },
15
+ { "code": "b", "value": "Yksikkö," },
16
+ { "code": "e", "value": "julkaisija." }
17
+ ]},
18
+
19
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
20
+ { "code": "i", "value": "Sisältää (teos):" },
21
+ { "code": "a", "value": "Whatever." },
22
+ { "code": "t", "value": "Bulebule." }
23
+ ]}
24
+
25
+ ]
26
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "description":"Fix 96 - fix punctuation of X10 fields.",
3
+ "enabled": true,
4
+ "fix": true,
5
+ "only": false
6
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "leader": "01331cam a22003494i 4500",
3
+ "fields": [
4
+ { "tag": "001", "value": "000000001" },
5
+
6
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
7
+ { "code": "a", "value": "Pulun Yliopisto" },
8
+ { "code": "b", "value": "Yksikkö" },
9
+ { "code": "b", "value": "Alayksikkö" }
10
+ ]},
11
+
12
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
13
+ { "code": "a", "value": "Pulun Yliopisto" },
14
+ { "code": "b", "value": "Yksikkö" },
15
+ { "code": "e", "value": "julkaisija" }
16
+ ]},
17
+
18
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
19
+ { "code": "i", "value": "Sisältää (teos)" },
20
+ { "code": "a", "value": "Whatever" },
21
+ { "code": "t", "value": "Bulebule" }
22
+ ]}
23
+
24
+ ]
25
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "001", "value": "f13" },
5
+ { "tag": "490", "ind1": "0", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "Mortuí non silent ;"},
7
+ { "code": "v", "value": "v2"}
8
+ ]},
9
+ { "tag": "600", "ind1": "1", "ind2": "4", "subfields": [
10
+ { "code": "a", "value": "Sirén, Matti"}
11
+ ]}
12
+ ],
13
+ "leader": "01331cam a22003498i 4500"
14
+
15
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "description": "f12/MET-527: diacriticful > diacriticless",
3
+ "enabled": true,
4
+ "fix": true,
5
+ "only": false
6
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "001", "value": "f13" },
5
+ { "tag": "490", "ind1": "0", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "Mortuí non silent ;"},
7
+ { "code": "v", "value": "v2"}
8
+ ]},
9
+ { "tag": "490", "ind1": "0", "ind2": " ", "subfields": [
10
+ { "code": "a", "value": "Mortui non silent ;"},
11
+ { "code": "v", "value": "v2"}
12
+ ]},
13
+ { "tag": "600", "ind1": "1", "ind2": "4", "subfields": [
14
+ { "code": "a", "value": "Sirén, Matti"}
15
+ ]},
16
+ { "tag": "600", "ind1": "1", "ind2": "4", "subfields": [
17
+ { "code": "a", "value": "Siren, Matti"}
18
+ ]}
19
+ ],
20
+ "leader": "01331cam a22003498i 4500"
21
+
22
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "001", "value": "f13" },
5
+ { "tag": "653", "ind1": " ", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "taikasana"}
7
+ ]}
8
+ ],
9
+ "leader": "01331cam a22003498i 4500"
10
+
11
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "description": "f13/MET-528-ish: remove ENNAKKOTIETO version, ennakkotietoless pair exists",
3
+ "enabled": true,
4
+ "fix": true,
5
+ "only": false
6
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "001", "value": "f13" },
5
+ { "tag": "653", "ind1": " ", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "taikasana"}
7
+ ]},
8
+ { "tag": "653", "ind1": " ", "ind2": " ", "subfields": [
9
+ { "code": "a", "value": "taikasana"},
10
+ { "code": "g", "value": "ENNAKKOTIETO"}
11
+ ]}
12
+ ],
13
+ "leader": "01331cam a22003498i 4500"
14
+
15
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "01331cam a22003494i 4500",
4
+ "fields": [
5
+ { "tag": "001", "value": "000000001" },
6
+
7
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
8
+ { "code": "a", "value": "Pulun Yliopisto" },
9
+ { "code": "b", "value": "Yksikkö" },
10
+ { "code": "b", "value": "Alayksikkö" }
11
+ ]},
12
+
13
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
14
+ { "code": "a", "value": "Pulun Yliopisto" },
15
+ { "code": "b", "value": "Yksikkö" },
16
+ { "code": "e", "value": "julkaisija" }
17
+ ]},
18
+
19
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
20
+ { "code": "i", "value": "Sisältää (teos)" },
21
+ { "code": "a", "value": "Whatever" },
22
+ { "code": "t", "value": "Bulebule" }
23
+ ]}
24
+
25
+ ]
26
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "description":"Fix 96 - fix punctuation of X10 fields.",
3
+ "enabled": true,
4
+ "fix": true,
5
+ "only": false
6
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "leader": "01331cam a22003494i 4500",
3
+ "fields": [
4
+ { "tag": "001", "value": "000000001" },
5
+
6
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
7
+ { "code": "a", "value": "Pulun Yliopisto." },
8
+ { "code": "b", "value": "Yksikkö." },
9
+ { "code": "b", "value": "Alayksikkö." }
10
+ ]},
11
+
12
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
13
+ { "code": "a", "value": "Pulun Yliopisto." },
14
+ { "code": "b", "value": "Yksikkö," },
15
+ { "code": "e", "value": "julkaisija." }
16
+ ]},
17
+
18
+ { "tag": "710", "ind1": "2", "ind2": " ", "subfields": [
19
+ { "code": "i", "value": "Sisältää (teos):" },
20
+ { "code": "a", "value": "Whatever." },
21
+ { "code": "t", "value": "Bulebule." }
22
+ ]}
23
+
24
+ ]
25
+ }