marcattacks 2.5.1 → 2.8.0
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.
- package/README.md +91 -2
- package/dist/attacker.d.ts +6 -0
- package/dist/attacker.d.ts.map +1 -1
- package/dist/attacker.js +38 -0
- package/dist/attacker.js.map +1 -1
- package/dist/command.js +1 -0
- package/dist/command.js.map +1 -1
- package/dist/fix/binds.d.ts +5 -0
- package/dist/fix/binds.d.ts.map +1 -0
- package/dist/fix/binds.js +82 -0
- package/dist/fix/binds.js.map +1 -0
- package/dist/fix/conditions.d.ts +5 -0
- package/dist/fix/conditions.d.ts.map +1 -0
- package/dist/fix/conditions.js +111 -0
- package/dist/fix/conditions.js.map +1 -0
- package/dist/fix/fixes.d.ts +7 -0
- package/dist/fix/fixes.d.ts.map +1 -0
- package/dist/fix/fixes.js +478 -0
- package/dist/fix/fixes.js.map +1 -0
- package/dist/fix/index.d.ts +12 -0
- package/dist/fix/index.d.ts.map +1 -0
- package/dist/fix/index.js +40 -0
- package/dist/fix/index.js.map +1 -0
- package/dist/fix/parser.d.ts +25 -0
- package/dist/fix/parser.d.ts.map +1 -0
- package/dist/fix/parser.js +156 -0
- package/dist/fix/parser.js.map +1 -0
- package/dist/fix/path.d.ts +23 -0
- package/dist/fix/path.d.ts.map +1 -0
- package/dist/fix/path.js +351 -0
- package/dist/fix/path.js.map +1 -0
- package/dist/fix/signal.d.ts +2 -0
- package/dist/fix/signal.d.ts.map +1 -0
- package/dist/fix/signal.js +5 -0
- package/dist/fix/signal.js.map +1 -0
- package/dist/fix/util.d.ts +6 -0
- package/dist/fix/util.d.ts.map +1 -0
- package/dist/fix/util.js +133 -0
- package/dist/fix/util.js.map +1 -0
- package/dist/input/alephseq.d.ts.map +1 -1
- package/dist/input/alephseq.js +18 -5
- package/dist/input/alephseq.js.map +1 -1
- package/dist/input/fastxml.d.ts +3 -0
- package/dist/input/fastxml.d.ts.map +1 -0
- package/dist/input/fastxml.js +134 -0
- package/dist/input/fastxml.js.map +1 -0
- package/dist/input/xml.d.ts.map +1 -1
- package/dist/input/xml.js +4 -2
- package/dist/input/xml.js.map +1 -1
- package/dist/marcmap.d.ts.map +1 -1
- package/dist/marcmap.js +15 -3
- package/dist/marcmap.js.map +1 -1
- package/dist/output/alephseq.d.ts.map +1 -1
- package/dist/output/alephseq.js +29 -5
- package/dist/output/alephseq.js.map +1 -1
- package/dist/output/null.d.ts +3 -0
- package/dist/output/null.d.ts.map +1 -0
- package/dist/output/null.js +13 -0
- package/dist/output/null.js.map +1 -0
- package/dist/output/xml.d.ts.map +1 -1
- package/dist/output/xml.js +27 -0
- package/dist/output/xml.js.map +1 -1
- package/dist/stream/framer.d.ts.map +1 -0
- package/dist/stream/framer.js.map +1 -0
- package/dist/stream/worker-pool-str.d.ts.map +1 -0
- package/dist/stream/worker-pool-str.js.map +1 -0
- package/dist/stream/worker-pool.d.ts +10 -0
- package/dist/stream/worker-pool.d.ts.map +1 -0
- package/dist/stream/worker-pool.js +217 -0
- package/dist/stream/worker-pool.js.map +1 -0
- package/dist/transform/fix.d.ts +16 -0
- package/dist/transform/fix.d.ts.map +1 -0
- package/dist/transform/fix.js +46 -0
- package/dist/transform/fix.js.map +1 -0
- package/dist/transform/jsonata.d.ts +5 -0
- package/dist/transform/jsonata.d.ts.map +1 -1
- package/dist/transform/jsonata.js +45 -44
- package/dist/transform/jsonata.js.map +1 -1
- package/dist/transform/marcids.d.ts.map +1 -1
- package/dist/transform/marcids.js +3 -0
- package/dist/transform/marcids.js.map +1 -1
- package/dist/util/marc_record.d.ts +19 -0
- package/dist/util/marc_record.d.ts.map +1 -0
- package/dist/util/marc_record.js +16 -0
- package/dist/util/marc_record.js.map +1 -0
- package/dist/worker-str.d.ts.map +1 -0
- package/dist/worker-str.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +33 -0
- package/dist/worker.js.map +1 -0
- package/package.json +5 -2
- package/dist/output/mulitipart.d.ts +0 -7
- package/dist/output/mulitipart.d.ts.map +0 -1
- package/dist/output/mulitipart.js +0 -53
- package/dist/output/mulitipart.js.map +0 -1
- package/dist/output/text.d.ts +0 -6
- package/dist/output/text.d.ts.map +0 -1
- package/dist/output/text.js +0 -34
- package/dist/output/text.js.map +0 -1
package/dist/fix/util.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Helpers for fixes that need more than the path engine: a Perl-ish sprintf
|
|
2
|
+
// (format), and the collapse/expand hash transforms (TT2 dot convention).
|
|
3
|
+
import { Path, isHash, isArray } from './path.js';
|
|
4
|
+
// A subset of Perl/C sprintf: flags - + space 0 #, width, .precision, and
|
|
5
|
+
// conversions d i u s f e g x X o b c %.
|
|
6
|
+
export function sprintf(fmt, args) {
|
|
7
|
+
let idx = 0;
|
|
8
|
+
return fmt.replace(/%([-+ 0#]*)(\d+)?(?:\.(\d+))?([%a-zA-Z])/g, (_m, flags, widthS, precS, conv) => {
|
|
9
|
+
if (conv === '%')
|
|
10
|
+
return '%';
|
|
11
|
+
const arg = args[idx++];
|
|
12
|
+
const width = widthS ? Number(widthS) : 0;
|
|
13
|
+
const prec = precS !== undefined ? Number(precS) : undefined;
|
|
14
|
+
const left = flags.includes('-');
|
|
15
|
+
const zero = flags.includes('0') && !left;
|
|
16
|
+
const signOf = (n) => (n < 0 ? '-' : flags.includes('+') ? '+' : flags.includes(' ') ? ' ' : '');
|
|
17
|
+
let sign = '';
|
|
18
|
+
let body = '';
|
|
19
|
+
switch (conv) {
|
|
20
|
+
case 'd':
|
|
21
|
+
case 'i':
|
|
22
|
+
case 'u': {
|
|
23
|
+
const n = Math.trunc(Number(arg)) || 0;
|
|
24
|
+
sign = signOf(n);
|
|
25
|
+
body = Math.abs(n).toString();
|
|
26
|
+
if (prec !== undefined)
|
|
27
|
+
body = body.padStart(prec, '0');
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case 'f':
|
|
31
|
+
case 'F': {
|
|
32
|
+
const n = Number(arg) || 0;
|
|
33
|
+
sign = signOf(n);
|
|
34
|
+
body = Math.abs(n).toFixed(prec === undefined ? 6 : prec);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'e':
|
|
38
|
+
case 'E': {
|
|
39
|
+
const n = Number(arg) || 0;
|
|
40
|
+
sign = signOf(n);
|
|
41
|
+
body = Math.abs(n).toExponential(prec === undefined ? 6 : prec);
|
|
42
|
+
if (conv === 'E')
|
|
43
|
+
body = body.toUpperCase();
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'g':
|
|
47
|
+
case 'G': {
|
|
48
|
+
const n = Number(arg) || 0;
|
|
49
|
+
sign = signOf(n);
|
|
50
|
+
body = String(parseFloat(Math.abs(n).toPrecision(prec || 6)));
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'x':
|
|
54
|
+
case 'X': {
|
|
55
|
+
body = (Number(arg) >>> 0).toString(16);
|
|
56
|
+
if (conv === 'X')
|
|
57
|
+
body = body.toUpperCase();
|
|
58
|
+
if (prec !== undefined)
|
|
59
|
+
body = body.padStart(prec, '0');
|
|
60
|
+
if (flags.includes('#') && body !== '0')
|
|
61
|
+
body = (conv === 'X' ? '0X' : '0x') + body;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 'o':
|
|
65
|
+
body = (Number(arg) >>> 0).toString(8);
|
|
66
|
+
break;
|
|
67
|
+
case 'b':
|
|
68
|
+
body = (Number(arg) >>> 0).toString(2);
|
|
69
|
+
break;
|
|
70
|
+
case 'c':
|
|
71
|
+
body = String.fromCharCode(Number(arg));
|
|
72
|
+
break;
|
|
73
|
+
case 's':
|
|
74
|
+
default: {
|
|
75
|
+
body = arg === undefined || arg === null ? '' : String(arg);
|
|
76
|
+
if (prec !== undefined)
|
|
77
|
+
body = body.slice(0, prec);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
let s = sign + body;
|
|
82
|
+
if (s.length < width) {
|
|
83
|
+
if (left)
|
|
84
|
+
s = s + ' '.repeat(width - s.length);
|
|
85
|
+
else if (zero)
|
|
86
|
+
s = sign + body.padStart(width - sign.length, '0');
|
|
87
|
+
else
|
|
88
|
+
s = ' '.repeat(width - s.length) + s;
|
|
89
|
+
}
|
|
90
|
+
return s;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Flatten nested data into a single-level hash keyed by dotted paths.
|
|
94
|
+
// {a:{b:1}, c:[10,20]} -> {"a.b":1, "c.0":10, "c.1":20}
|
|
95
|
+
export function collapseHash(data) {
|
|
96
|
+
const out = {};
|
|
97
|
+
const walk = (node, prefix) => {
|
|
98
|
+
if (isHash(node)) {
|
|
99
|
+
const keys = Object.keys(node);
|
|
100
|
+
if (keys.length === 0 && prefix) {
|
|
101
|
+
out[prefix] = node;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
for (const k of keys)
|
|
105
|
+
walk(node[k], prefix ? `${prefix}.${k}` : k);
|
|
106
|
+
}
|
|
107
|
+
else if (isArray(node)) {
|
|
108
|
+
if (node.length === 0 && prefix) {
|
|
109
|
+
out[prefix] = node;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
for (let i = 0; i < node.length; i++)
|
|
113
|
+
walk(node[i], prefix ? `${prefix}.${i}` : String(i));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
out[prefix] = node;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
walk(data, '');
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
// Inverse of collapseHash: nest dotted keys back into structure (numeric
|
|
123
|
+
// path segments become array indices, via the path creator).
|
|
124
|
+
export function expandHash(data) {
|
|
125
|
+
let out = {};
|
|
126
|
+
if (!isHash(data))
|
|
127
|
+
return data;
|
|
128
|
+
for (const k of Object.keys(data)) {
|
|
129
|
+
out = new Path(k).creator(data[k])(out);
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/fix/util.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIlD,0EAA0E;AAC1E,yCAAyC;AACzC,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,CAAC,OAAO,CAAC,2CAA2C,EAAE,CAAC,EAAE,EAAE,KAAa,EAAE,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;QAC/G,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzG,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACxF,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACxD,MAAM;YACV,CAAC;YACD,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACxG,MAAM;YACV,CAAC;YACD,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9G,IAAI,IAAI,KAAK,GAAG;oBAAE,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC5C,MAAM;YACV,CAAC;YACD,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5G,MAAM;YACV,CAAC;YACD,KAAK,GAAG,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAAC,IAAI,IAAI,KAAK,GAAG;oBAAE,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrF,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG;oBAAE,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACpF,MAAM;YACV,CAAC;YACD,KAAK,GAAG;gBAAE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM;YACxD,KAAK,GAAG;gBAAE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM;YACxD,KAAK,GAAG;gBAAE,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAM;YACzD,KAAK,GAAG,CAAC;YAAC,OAAO,CAAC,CAAC,CAAC;gBAChB,IAAI,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5D,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACnD,MAAM;YACV,CAAC;QACL,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACnB,IAAI,IAAI;gBAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC1C,IAAI,IAAI;gBAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;gBAC7D,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACP,CAAC;AAED,sEAAsE;AACtE,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,IAAU;IACnC,MAAM,GAAG,GAAS,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,CAAC,IAAU,EAAE,MAAc,EAAE,EAAE;QACxC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;IACL,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,IAAU;IACjC,IAAI,GAAG,GAAS,EAAE,CAAC;IACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAS3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CA4E9D"}
|
package/dist/input/alephseq.js
CHANGED
|
@@ -1,19 +1,31 @@
|
|
|
1
1
|
import { Transform } from "stream";
|
|
2
|
+
import { StringDecoder } from "node:string_decoder";
|
|
2
3
|
import log4js from 'log4js';
|
|
3
4
|
const logger = log4js.getLogger();
|
|
5
|
+
const VALID_LINE = /^\w+\s[\x20-\x7E]{5}\sL\s/; // <id> <tag+ind1+ind2> L <data>
|
|
6
|
+
const SUBFIELD = /\$\$(.)/; // splits "$$avalue" subfields
|
|
4
7
|
export async function transform(_opts) {
|
|
5
8
|
let recordNum = 0;
|
|
6
9
|
let rec = [];
|
|
7
10
|
let previd = "";
|
|
8
11
|
let tail = "";
|
|
12
|
+
// decode bytes to UTF-8 across chunk boundaries (a multi-byte character may
|
|
13
|
+
// be split between two chunks; StringDecoder buffers the incomplete bytes)
|
|
14
|
+
const decoder = new StringDecoder("utf8");
|
|
9
15
|
function processLine(line, stream) {
|
|
10
|
-
|
|
16
|
+
// Validate the line prefix "<id> <tag+ind> L ". Same accept/reject as
|
|
17
|
+
// the original /^\w+\s[\x20-\x7E]{5}\sL\s.*/u but cheaper: no trailing
|
|
18
|
+
// .* (it always matched), no /u (ASCII only), and test() not match().
|
|
19
|
+
if (!VALID_LINE.test(line)) {
|
|
11
20
|
logger.warn(`syntax error in record ${recordNum + 1}`);
|
|
12
21
|
logger.warn(`skipping> ${line}`);
|
|
13
22
|
return false;
|
|
14
23
|
}
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
// Split id from the rest on the first space (was split(" ")+join(" "),
|
|
25
|
+
// which split the whole line on every space and rejoined it).
|
|
26
|
+
const sp = line.indexOf(" ");
|
|
27
|
+
const id = line.slice(0, sp);
|
|
28
|
+
const lineData = line.slice(sp + 1);
|
|
17
29
|
if (previd && previd !== id) {
|
|
18
30
|
stream.push({ record: rec });
|
|
19
31
|
rec = [];
|
|
@@ -23,7 +35,7 @@ export async function transform(_opts) {
|
|
|
23
35
|
const ind1 = lineData.substring(3, 4);
|
|
24
36
|
const ind2 = lineData.substring(4, 5);
|
|
25
37
|
const sf = lineData.substring(8);
|
|
26
|
-
const parts = sf.split(
|
|
38
|
+
const parts = sf.split(SUBFIELD);
|
|
27
39
|
if (tag === 'FMT' || tag === 'LDR' || tag.startsWith("00")) {
|
|
28
40
|
rec.push([tag, ind1, ind2, "_", ...parts]);
|
|
29
41
|
}
|
|
@@ -36,7 +48,7 @@ export async function transform(_opts) {
|
|
|
36
48
|
return new Transform({
|
|
37
49
|
objectMode: true,
|
|
38
50
|
transform(chunk, _encoding, callback) {
|
|
39
|
-
const data = tail +
|
|
51
|
+
const data = tail + decoder.write(chunk);
|
|
40
52
|
const lines = data.split(/\r?\n/);
|
|
41
53
|
tail = lines.pop() || "";
|
|
42
54
|
for (const line of lines) {
|
|
@@ -47,6 +59,7 @@ export async function transform(_opts) {
|
|
|
47
59
|
callback();
|
|
48
60
|
},
|
|
49
61
|
flush(callback) {
|
|
62
|
+
tail += decoder.end(); // flush any buffered trailing bytes
|
|
50
63
|
if (tail.length > 0) {
|
|
51
64
|
processLine(tail, this);
|
|
52
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.js","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAC3D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAU;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,GAAG,GAAe,EAAE,CAAC;IACzB,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,IAAI,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"alephseq.js","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAE,gCAAgC;AACjF,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAuB,8BAA8B;AAEhF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAU;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,GAAG,GAAe,EAAE,CAAC;IACzB,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,SAAS,WAAW,CAAC,IAAY,EAAE,MAAiB;QAChD,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,MAAM,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7B,GAAG,GAAG,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,EAAE,GAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,GAAG,EAAG,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,SAAS,CAAC;QACjB,UAAU,EAAE,IAAI;QAEhB,SAAS,CAAC,KAAU,EAAE,SAAiB,EAAE,QAA2B;YAChE,MAAM,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAElC,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAChC,WAAW,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,KAAK,CAAC,QAA2B;YAC7B,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAG,oCAAoC;YAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,QAAQ,EAAE,CAAC;QACf,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastxml.d.ts","sourceRoot":"","sources":["../../src/input/fastxml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAmF3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAqD9D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Transform } from 'stream';
|
|
2
|
+
import { StringDecoder } from 'node:string_decoder';
|
|
3
|
+
import { CLEAN } from '../util/marc_record.js';
|
|
4
|
+
import log4js from 'log4js';
|
|
5
|
+
const logger = log4js.getLogger();
|
|
6
|
+
// A fast, flat-memory MARCXML reader.
|
|
7
|
+
//
|
|
8
|
+
// Instead of running the whole document through a character-by-character SAX
|
|
9
|
+
// state machine (see ./xml.ts), this splits the byte stream into individual
|
|
10
|
+
// <record>...</record> blocks and scans each block with a few targeted
|
|
11
|
+
// regexes. Only one record is ever buffered, so memory stays flat regardless
|
|
12
|
+
// of input size, and throughput is several times higher than the SAX reader.
|
|
13
|
+
//
|
|
14
|
+
// MARCXML is a rigidly constrained subset of XML (LOC MARC21slim): no CDATA,
|
|
15
|
+
// no comments, no nested elements beyond record/leader/controlfield/datafield/
|
|
16
|
+
// subfield. Attributes may be single- or double-quoted. This scanner targets
|
|
17
|
+
// exactly that grammar; for arbitrary XML use the SAX-based `xml` reader.
|
|
18
|
+
const OPEN = /<(?:[\w.-]+:)?record(?:\s[^>]*)?>/g;
|
|
19
|
+
const CLOSE = /<\/(?:[\w.-]+:)?record\s*>/g;
|
|
20
|
+
// leader / controlfield / datafield, with the element body captured in group 3
|
|
21
|
+
const FIELD = /<(?:[\w.-]+:)?(leader|controlfield|datafield)((?:\s[^>]*)?)(?:\/>|>([\s\S]*?)<\/(?:[\w.-]+:)?\1\s*>)/g;
|
|
22
|
+
const SUBF = /<(?:[\w.-]+:)?subfield((?:\s[^>]*)?)(?:\/>|>([\s\S]*?)<\/(?:[\w.-]+:)?subfield\s*>)/g;
|
|
23
|
+
const ATTR = /([\w.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
|
|
24
|
+
const CONTROL = /[\x00-\x1F\x7F]/g;
|
|
25
|
+
const ENTITY = /&(#x?[0-9a-fA-F]+|\w+);/g;
|
|
26
|
+
const NAMED = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" };
|
|
27
|
+
function decodeEntities(s) {
|
|
28
|
+
if (s.indexOf('&') === -1)
|
|
29
|
+
return s;
|
|
30
|
+
return s.replace(ENTITY, (m, e) => {
|
|
31
|
+
if (e[0] === '#') {
|
|
32
|
+
const cp = (e[1] === 'x' || e[1] === 'X')
|
|
33
|
+
? parseInt(e.slice(2), 16)
|
|
34
|
+
: parseInt(e.slice(1), 10);
|
|
35
|
+
return Number.isFinite(cp) ? String.fromCodePoint(cp) : m;
|
|
36
|
+
}
|
|
37
|
+
return e in NAMED ? NAMED[e] : m;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// element text: decode entities and strip control characters (matches xml.ts)
|
|
41
|
+
function decodeText(s) {
|
|
42
|
+
return decodeEntities(s).replaceAll(CONTROL, '');
|
|
43
|
+
}
|
|
44
|
+
// attribute value: decode entities only (xml.ts does not strip attributes)
|
|
45
|
+
function attrs(s) {
|
|
46
|
+
const o = {};
|
|
47
|
+
ATTR.lastIndex = 0;
|
|
48
|
+
let a;
|
|
49
|
+
while ((a = ATTR.exec(s)))
|
|
50
|
+
o[a[1]] = decodeEntities(a[2] ?? a[3] ?? '');
|
|
51
|
+
return o;
|
|
52
|
+
}
|
|
53
|
+
function recordToFields(xml) {
|
|
54
|
+
const fields = [];
|
|
55
|
+
FIELD.lastIndex = 0;
|
|
56
|
+
let f;
|
|
57
|
+
while ((f = FIELD.exec(xml))) {
|
|
58
|
+
const kind = f[1];
|
|
59
|
+
const body = f[3] ?? '';
|
|
60
|
+
if (kind === 'leader') {
|
|
61
|
+
fields.push(['LDR', ' ', ' ', '_', decodeText(body)]);
|
|
62
|
+
}
|
|
63
|
+
else if (kind === 'controlfield') {
|
|
64
|
+
fields.push([attrs(f[2] ?? '').tag, ' ', ' ', '_', decodeText(body)]);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const at = attrs(f[2] ?? '');
|
|
68
|
+
const row = [at.tag, at.ind1 ?? ' ', at.ind2 ?? ' '];
|
|
69
|
+
SUBF.lastIndex = 0;
|
|
70
|
+
let s;
|
|
71
|
+
while ((s = SUBF.exec(body))) {
|
|
72
|
+
row.push(attrs(s[1] ?? '').code, decodeText(s[2] ?? ''));
|
|
73
|
+
}
|
|
74
|
+
fields.push(row);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return fields;
|
|
78
|
+
}
|
|
79
|
+
export async function transform(_opts) {
|
|
80
|
+
let buf = '';
|
|
81
|
+
const decoder = new StringDecoder('utf8');
|
|
82
|
+
function drain(stream) {
|
|
83
|
+
let pos = 0;
|
|
84
|
+
let keepFrom = -1;
|
|
85
|
+
while (true) {
|
|
86
|
+
OPEN.lastIndex = pos;
|
|
87
|
+
const o = OPEN.exec(buf);
|
|
88
|
+
if (!o)
|
|
89
|
+
break; // no (more) open tags
|
|
90
|
+
CLOSE.lastIndex = o.index + o[0].length;
|
|
91
|
+
const c = CLOSE.exec(buf);
|
|
92
|
+
if (!c) {
|
|
93
|
+
keepFrom = o.index;
|
|
94
|
+
break;
|
|
95
|
+
} // record not yet complete
|
|
96
|
+
const end = c.index + c[0].length;
|
|
97
|
+
// values are stripped of control chars during parsing -> mark clean
|
|
98
|
+
stream.push({ record: recordToFields(buf.slice(o.index, end)), [CLEAN]: true });
|
|
99
|
+
pos = end;
|
|
100
|
+
}
|
|
101
|
+
// keep a pending partial record, else drop consumed text but retain a
|
|
102
|
+
// small tail so an open tag spanning the next chunk is not lost
|
|
103
|
+
buf = keepFrom >= 0 ? buf.slice(keepFrom)
|
|
104
|
+
: pos > 0 ? buf.slice(pos)
|
|
105
|
+
: buf.length > 64 ? buf.slice(-64) : buf;
|
|
106
|
+
}
|
|
107
|
+
const transformStream = new Transform({
|
|
108
|
+
objectMode: true,
|
|
109
|
+
transform(chunk, _encoding, callback) {
|
|
110
|
+
try {
|
|
111
|
+
buf += decoder.write(chunk);
|
|
112
|
+
drain(this);
|
|
113
|
+
callback();
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.error('fastxml parse error', err.message);
|
|
117
|
+
callback(err);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
flush(callback) {
|
|
121
|
+
try {
|
|
122
|
+
buf += decoder.end();
|
|
123
|
+
drain(this);
|
|
124
|
+
callback();
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logger.error('fastxml parse error', err.message);
|
|
128
|
+
callback(err);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
return transformStream;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=fastxml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastxml.js","sourceRoot":"","sources":["../../src/input/fastxml.ts"],"names":[],"mappings":"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"}
|
package/dist/input/xml.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAU3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAuE9D"}
|
package/dist/input/xml.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Transform } from 'stream';
|
|
2
2
|
import sax from 'sax';
|
|
3
|
+
import { CLEAN } from '../util/marc_record.js';
|
|
3
4
|
import log4js from 'log4js';
|
|
4
5
|
const logger = log4js.getLogger();
|
|
5
6
|
export async function transform(_opts) {
|
|
@@ -54,8 +55,9 @@ export async function transform(_opts) {
|
|
|
54
55
|
subfield.push(sattrib.code, escapeLine(text));
|
|
55
56
|
}
|
|
56
57
|
if (localName === 'record') {
|
|
57
|
-
// Push the completed record object down the pipeline
|
|
58
|
-
|
|
58
|
+
// Push the completed record object down the pipeline.
|
|
59
|
+
// Text values are stripped of control chars above -> mark clean.
|
|
60
|
+
transformStream.push({ record, [CLEAN]: true });
|
|
59
61
|
record = [];
|
|
60
62
|
}
|
|
61
63
|
});
|
package/dist/input/xml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAC3D,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAKlC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAU;IACtC,IAAI,MAAM,GAAe,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAmB,EAAE,CAAC;IAChC,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAW,EAAE,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC;QAClC,UAAU,EAAE,IAAI;QAEhB,SAAS,CAAC,KAAU,EAAE,SAAiB,EAAE,QAA2B;YAChE,IAAI,QAAQ;gBAAE,OAAO,QAAQ,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,KAAK,CAAC,QAA2B;YAC7B,IAAI,QAAQ;gBAAE,OAAO,QAAQ,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;QACf,CAAC;KACJ,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,CAAC;aAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAW,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE/C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAa,EAAE,MAAM,CAAC,IAAc,EAAE,MAAM,CAAC,IAAc,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC/F,QAAQ,GAAG,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAc,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YACzB,
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"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"}
|
package/dist/marcmap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marcmap.d.ts","sourceRoot":"","sources":["../src/marcmap.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GAAI,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GAAI,MAAM,EAAE,CAO5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAG,GAAG,EAAE,CAAC,GAAG,EAAC,MAAM,EAAE,GAAG,EAAC,MAAM,EAAE,KAAK,IAAI,GAAI,IAAI,CAU3G;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EAAG,GAAG,EAAE,CAAC,IAAI,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,KAAK,IAAI,GAAI,IAAI,CAU1G;
|
|
1
|
+
{"version":3,"file":"marcmap.d.ts","sourceRoot":"","sources":["../src/marcmap.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GAAI,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GAAI,MAAM,EAAE,CAO5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAG,GAAG,EAAE,CAAC,GAAG,EAAC,MAAM,EAAE,GAAG,EAAC,MAAM,EAAE,KAAK,IAAI,GAAI,IAAI,CAU3G;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EAAG,GAAG,EAAE,CAAC,IAAI,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,KAAK,IAAI,GAAI,IAAI,CAU1G;AAkBD;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAI,MAAM,EAAE,CAgB3F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAI,MAAM,EAAE,CASlE"}
|
package/dist/marcmap.js
CHANGED
|
@@ -48,6 +48,20 @@ export function marcForEachSub(row, fun) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
// The tag and subfield regex derived from a field-path depend only on the
|
|
52
|
+
// path string, so compile them once per distinct path. Field-paths form a
|
|
53
|
+
// tiny fixed set (a handful of MARC tags), so this cache stays small.
|
|
54
|
+
const findCache = new Map();
|
|
55
|
+
function parseFind(find) {
|
|
56
|
+
let parsed = findCache.get(find);
|
|
57
|
+
if (!parsed) {
|
|
58
|
+
const tagName = find.substring(0, 3);
|
|
59
|
+
const subMatch = find.substring(3) ? find.substring(3).split("").join("|") : ".*";
|
|
60
|
+
parsed = { tagName, subRegex: new RegExp(`^${subMatch}$`) };
|
|
61
|
+
findCache.set(find, parsed);
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
51
65
|
/**
|
|
52
66
|
* Given an marc record and a field-path return a string[] with all matching values
|
|
53
67
|
*/
|
|
@@ -56,9 +70,7 @@ export function marcmap(record, find, opts = {}) {
|
|
|
56
70
|
join_char: opts?.join_char ?? " "
|
|
57
71
|
};
|
|
58
72
|
const results = [];
|
|
59
|
-
const tagName = find
|
|
60
|
-
const subMatch = find.substring(3) ? find.substring(3).split("").join("|") : ".*";
|
|
61
|
-
const subRegex = new RegExp(`^${subMatch}$`);
|
|
73
|
+
const { tagName, subRegex } = parseFind(find);
|
|
62
74
|
for (const row of record) {
|
|
63
75
|
if (row[0] === tagName) {
|
|
64
76
|
results.push(marcsubfields(row, subRegex).join(fullOpts.join_char));
|
package/dist/marcmap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marcmap.js","sourceRoot":"","sources":["../src/marcmap.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAyB;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAyB;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACzB,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACzB,OAAO,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAA2B,EAAG,GAAuC;IAChG,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAE1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACzC,GAAG,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAyB,EAAG,GAAwC;IAC/F,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAG,CAAC,IAAG,CAAC,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;AACL,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"marcmap.js","sourceRoot":"","sources":["../src/marcmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AA4BnC,wBAAsB,SAAS,CAAC,KAAK,EAAC,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CA0D9D"}
|
package/dist/output/alephseq.js
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
import { Transform } from 'stream';
|
|
2
|
-
import {
|
|
2
|
+
import { CLEAN } from '../util/marc_record.js';
|
|
3
3
|
import log4js from 'log4js';
|
|
4
4
|
const logger = log4js.getLogger();
|
|
5
|
+
// Read the 001 control field value (the record id) without compiling a regex
|
|
6
|
+
// per record, as marcmap("001") would. Mirrors marcmap: first matching 001
|
|
7
|
+
// row, all of its values joined by a space.
|
|
8
|
+
function recordId(rec) {
|
|
9
|
+
for (const row of rec) {
|
|
10
|
+
if (row[0] === '001') {
|
|
11
|
+
let id = '';
|
|
12
|
+
for (let k = 4; k < row.length; k += 2) {
|
|
13
|
+
if (row[k] !== undefined)
|
|
14
|
+
id = id ? `${id} ${row[k]}` : row[k];
|
|
15
|
+
}
|
|
16
|
+
return id;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
// Control fields (00x) and the leader carry a bare value; data fields carry
|
|
22
|
+
// $$-prefixed subfields. Equivalent to the old /^LDR|00./ test, without a regex.
|
|
23
|
+
function isControl(tag) {
|
|
24
|
+
return tag === 'LDR' || (tag[0] === '0' && tag[1] === '0');
|
|
25
|
+
}
|
|
5
26
|
export async function transform(_opts) {
|
|
6
27
|
return new Transform({
|
|
7
28
|
objectMode: true,
|
|
@@ -12,7 +33,10 @@ export async function transform(_opts) {
|
|
|
12
33
|
callback();
|
|
13
34
|
return;
|
|
14
35
|
}
|
|
15
|
-
|
|
36
|
+
// Input readers that strip control chars mark the record clean, so
|
|
37
|
+
// we can skip re-escaping every value here.
|
|
38
|
+
const esc = data[CLEAN] === true ? (v) => v : escapeLine;
|
|
39
|
+
let id = recordId(rec);
|
|
16
40
|
if (!id) {
|
|
17
41
|
id = "000000000";
|
|
18
42
|
}
|
|
@@ -32,11 +56,11 @@ export async function transform(_opts) {
|
|
|
32
56
|
// skip undefined values
|
|
33
57
|
continue;
|
|
34
58
|
}
|
|
35
|
-
if (tag
|
|
36
|
-
sf += `${
|
|
59
|
+
if (isControl(tag)) {
|
|
60
|
+
sf += `${esc(val)}`;
|
|
37
61
|
}
|
|
38
62
|
else {
|
|
39
|
-
sf += `\$\$${code}${
|
|
63
|
+
sf += `\$\$${code}${esc(val)}`;
|
|
40
64
|
}
|
|
41
65
|
}
|
|
42
66
|
output += `${id} ${tag}${ind1}${ind2} L ${sf}\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.js","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"alephseq.js","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../src/output/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CAO/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Transform } from 'stream';
|
|
2
|
+
import log4js from 'log4js';
|
|
3
|
+
const logger = log4js.getLogger();
|
|
4
|
+
// The do nothing transformer: generates nothing
|
|
5
|
+
export async function transform(_opts) {
|
|
6
|
+
return new Transform({
|
|
7
|
+
objectMode: true,
|
|
8
|
+
transform(data, _encoding, callback) {
|
|
9
|
+
callback();
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=null.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/output/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAU;IACtC,OAAO,IAAI,SAAS,CAAC;QACjB,UAAU,EAAE,IAAI;QAChB,SAAS,CAAC,IAAS,EAAE,SAAS,EAAE,QAAQ;YACpC,QAAQ,EAAE,CAAC;QACf,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
|
package/dist/output/xml.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/output/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,wBAAsB,SAAS,CAAC,KAAK,EAAC,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CA8D9D;
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/output/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,wBAAsB,SAAS,CAAC,KAAK,EAAC,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CA8D9D;AAoBD,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACnC,MAAM,CAqCR"}
|
package/dist/output/xml.js
CHANGED
|
@@ -56,10 +56,37 @@ export async function transform(_opts) {
|
|
|
56
56
|
}
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
+
// True if the string contains any character escapeXML would change: & < >
|
|
60
|
+
// (and " ' for attributes), disallowed XML 1.0 control chars, surrogates, or
|
|
61
|
+
// non-characters. A single char-code scan; lets the common (clean) case skip
|
|
62
|
+
// the 5-7 regex replaces below. No literal control chars in source.
|
|
63
|
+
function needsEscape(s, forAttribute) {
|
|
64
|
+
for (let i = 0; i < s.length; i++) {
|
|
65
|
+
const c = s.charCodeAt(i);
|
|
66
|
+
if (c === 38 || c === 60 || c === 62)
|
|
67
|
+
return true; // & < >
|
|
68
|
+
if (forAttribute && (c === 34 || c === 39))
|
|
69
|
+
return true; // " '
|
|
70
|
+
if (c <= 0x08 || c === 0x0B || c === 0x0C || (c >= 0x0E && c <= 0x1F))
|
|
71
|
+
return true; // ctrl
|
|
72
|
+
if (c >= 0x7F && c <= 0x9F)
|
|
73
|
+
return true;
|
|
74
|
+
if (c >= 0xD800 && c <= 0xDFFF)
|
|
75
|
+
return true; // surrogates
|
|
76
|
+
if (c >= 0xFDD0 && c <= 0xFDEF)
|
|
77
|
+
return true; // non-chars
|
|
78
|
+
if (c === 0xFFFE || c === 0xFFFF)
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
59
83
|
export function escapeXML(value, options) {
|
|
60
84
|
if (value === null || value === undefined)
|
|
61
85
|
return '';
|
|
62
86
|
let s = String(value);
|
|
87
|
+
// Fast path: most values are clean, so skip the regex replaces below.
|
|
88
|
+
if (!needsEscape(s, options?.forAttribute === true))
|
|
89
|
+
return s;
|
|
63
90
|
// STEP 1: Remove/replace invalid UTF-8 and disallowed XML characters
|
|
64
91
|
// Remove unpaired UTF-16 surrogates (invalid in JSON and problematic in XML)
|
|
65
92
|
s = s.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g, '\uFFFD'); // unpaired high surrogates
|