marcattacks 2.5.1 → 2.7.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.
Files changed (96) hide show
  1. package/README.md +82 -2
  2. package/dist/attacker.d.ts.map +1 -1
  3. package/dist/attacker.js +10 -0
  4. package/dist/attacker.js.map +1 -1
  5. package/dist/command.js +1 -0
  6. package/dist/command.js.map +1 -1
  7. package/dist/fix/binds.d.ts +5 -0
  8. package/dist/fix/binds.d.ts.map +1 -0
  9. package/dist/fix/binds.js +82 -0
  10. package/dist/fix/binds.js.map +1 -0
  11. package/dist/fix/conditions.d.ts +5 -0
  12. package/dist/fix/conditions.d.ts.map +1 -0
  13. package/dist/fix/conditions.js +111 -0
  14. package/dist/fix/conditions.js.map +1 -0
  15. package/dist/fix/fixes.d.ts +7 -0
  16. package/dist/fix/fixes.d.ts.map +1 -0
  17. package/dist/fix/fixes.js +478 -0
  18. package/dist/fix/fixes.js.map +1 -0
  19. package/dist/fix/index.d.ts +12 -0
  20. package/dist/fix/index.d.ts.map +1 -0
  21. package/dist/fix/index.js +40 -0
  22. package/dist/fix/index.js.map +1 -0
  23. package/dist/fix/parser.d.ts +25 -0
  24. package/dist/fix/parser.d.ts.map +1 -0
  25. package/dist/fix/parser.js +156 -0
  26. package/dist/fix/parser.js.map +1 -0
  27. package/dist/fix/path.d.ts +23 -0
  28. package/dist/fix/path.d.ts.map +1 -0
  29. package/dist/fix/path.js +351 -0
  30. package/dist/fix/path.js.map +1 -0
  31. package/dist/fix/signal.d.ts +2 -0
  32. package/dist/fix/signal.d.ts.map +1 -0
  33. package/dist/fix/signal.js +5 -0
  34. package/dist/fix/signal.js.map +1 -0
  35. package/dist/fix/util.d.ts +6 -0
  36. package/dist/fix/util.d.ts.map +1 -0
  37. package/dist/fix/util.js +133 -0
  38. package/dist/fix/util.js.map +1 -0
  39. package/dist/input/alephseq.d.ts.map +1 -1
  40. package/dist/input/alephseq.js +18 -5
  41. package/dist/input/alephseq.js.map +1 -1
  42. package/dist/input/fastxml.d.ts +3 -0
  43. package/dist/input/fastxml.d.ts.map +1 -0
  44. package/dist/input/fastxml.js +134 -0
  45. package/dist/input/fastxml.js.map +1 -0
  46. package/dist/input/xml.d.ts.map +1 -1
  47. package/dist/input/xml.js +4 -2
  48. package/dist/input/xml.js.map +1 -1
  49. package/dist/marcmap.d.ts.map +1 -1
  50. package/dist/marcmap.js +15 -3
  51. package/dist/marcmap.js.map +1 -1
  52. package/dist/output/alephseq.d.ts.map +1 -1
  53. package/dist/output/alephseq.js +29 -5
  54. package/dist/output/alephseq.js.map +1 -1
  55. package/dist/output/null.d.ts +3 -0
  56. package/dist/output/null.d.ts.map +1 -0
  57. package/dist/output/null.js +13 -0
  58. package/dist/output/null.js.map +1 -0
  59. package/dist/output/xml.d.ts.map +1 -1
  60. package/dist/output/xml.js +27 -0
  61. package/dist/output/xml.js.map +1 -1
  62. package/dist/stream/framer.d.ts.map +1 -0
  63. package/dist/stream/framer.js.map +1 -0
  64. package/dist/stream/worker-pool-str.d.ts.map +1 -0
  65. package/dist/stream/worker-pool-str.js.map +1 -0
  66. package/dist/stream/worker-pool.d.ts +10 -0
  67. package/dist/stream/worker-pool.d.ts.map +1 -0
  68. package/dist/stream/worker-pool.js +206 -0
  69. package/dist/stream/worker-pool.js.map +1 -0
  70. package/dist/transform/fix.d.ts +16 -0
  71. package/dist/transform/fix.d.ts.map +1 -0
  72. package/dist/transform/fix.js +46 -0
  73. package/dist/transform/fix.js.map +1 -0
  74. package/dist/transform/jsonata.d.ts +4 -0
  75. package/dist/transform/jsonata.d.ts.map +1 -1
  76. package/dist/transform/jsonata.js +40 -44
  77. package/dist/transform/jsonata.js.map +1 -1
  78. package/dist/util/marc_record.d.ts +19 -0
  79. package/dist/util/marc_record.d.ts.map +1 -0
  80. package/dist/util/marc_record.js +16 -0
  81. package/dist/util/marc_record.js.map +1 -0
  82. package/dist/worker-str.d.ts.map +1 -0
  83. package/dist/worker-str.js.map +1 -0
  84. package/dist/worker.d.ts +2 -0
  85. package/dist/worker.d.ts.map +1 -0
  86. package/dist/worker.js +33 -0
  87. package/dist/worker.js.map +1 -0
  88. package/package.json +4 -1
  89. package/dist/output/mulitipart.d.ts +0 -7
  90. package/dist/output/mulitipart.d.ts.map +0 -1
  91. package/dist/output/mulitipart.js +0 -53
  92. package/dist/output/mulitipart.js.map +0 -1
  93. package/dist/output/text.d.ts +0 -6
  94. package/dist/output/text.d.ts.map +0 -1
  95. package/dist/output/text.js +0 -34
  96. package/dist/output/text.js.map +0 -1
@@ -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":"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"}
@@ -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;AAK3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAkE9D"}
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"}
@@ -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
- if (!line.match(/^\w+\s[\x20-\x7E]{5}\sL\s.*/u)) {
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
- const [id, ...rest] = line.split(" ");
16
- const lineData = rest.join(" ");
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 + chunk.toString();
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":"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"}
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,3 @@
1
+ import { Transform } from 'stream';
2
+ export declare function transform(_opts: any): Promise<Transform>;
3
+ //# sourceMappingURL=fastxml.d.ts.map
@@ -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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"}
@@ -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;AAS3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAsE9D"}
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
- transformStream.push({ record });
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/input/xml.ts"],"names":[],"mappings":"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"}
@@ -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;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAI,MAAM,EAAE,CAkB3F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAI,MAAM,EAAE,CASlE"}
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.substring(0, 3);
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));
@@ -1 +1 @@
1
- {"version":3,"file":"marcmap.js","sourceRoot":"","sources":["../src/marcmap.ts"],"names":[],"mappings":"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"}
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;AAMnC,wBAAsB,SAAS,CAAC,KAAK,EAAC,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CAsD9D"}
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"}
@@ -1,7 +1,28 @@
1
1
  import { Transform } from 'stream';
2
- import { marcmap } from '../marcmap.js';
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
- let id = marcmap(rec, "001", {})[0];
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.match(/^LDR|00./g)) {
36
- sf += `${escapeLine(val)}`;
59
+ if (isControl(tag)) {
60
+ sf += `${esc(val)}`;
37
61
  }
38
62
  else {
39
- sf += `\$\$${code}${escapeLine(val)}`;
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,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAS;IACrC,OAAO,IAAI,SAAS,CAAC;QACjB,UAAU,EAAE,IAAI;QAChB,SAAS,CAAC,IAAS,EAAE,SAAS,EAAE,QAAQ;YACpC,IAAI,GAAG,GAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACrC,QAAQ,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YAED,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,EAAC,KAAK,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAElC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACN,EAAE,GAAG,WAAW,CAAC;YACrB,CAAC;YAED,IAAI,MAAM,GAAG,GAAG,EAAE,eAAe,CAAC;YAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI,GAAG,GAAI,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEZ,IAAI,GAAI,KAAK,KAAK,EAAE,CAAC;oBACjB,SAAS;gBACb,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,EAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,GAAG,GAAI,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;oBAExB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;wBACpB,wBAAwB;wBACxB,SAAS;oBACb,CAAC;oBAED,IAAI,GAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC1B,EAAE,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,CAAC;yBACI,CAAC;wBACF,EAAE,IAAI,OAAO,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1C,CAAC;gBACL,CAAC;gBAED,MAAM,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE,IAAI,CAAC;YACrD,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC9C,QAAQ,CAAC,IAAI,EAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAS,UAAU,CAAC,GAAU;IAC1B,OAAO,GAAG,CAAC,UAAU,CAAC,kBAAkB,EAAC,EAAE,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"alephseq.js","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Transform } from 'stream';
2
+ export declare function transform(_opts: any): Promise<Transform>;
3
+ //# sourceMappingURL=null.d.ts.map
@@ -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"}
@@ -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;AAED,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,CAkCR"}
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"}
@@ -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