@rgrove/parse-xml 2.0.4 → 4.0.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/LICENSE +1 -1
- package/README.md +84 -337
- package/dist/browser.js +774 -0
- package/dist/browser.js.map +7 -0
- package/dist/global.min.js +10 -0
- package/dist/global.min.js.map +7 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/Parser.d.ts +218 -0
- package/dist/lib/Parser.d.ts.map +1 -0
- package/dist/lib/Parser.js +638 -0
- package/dist/lib/Parser.js.map +1 -0
- package/dist/lib/StringScanner.d.ts +97 -0
- package/dist/lib/StringScanner.d.ts.map +1 -0
- package/dist/lib/StringScanner.js +210 -0
- package/dist/lib/StringScanner.js.map +1 -0
- package/dist/lib/XmlCdata.d.ts +8 -0
- package/dist/lib/XmlCdata.d.ts.map +1 -0
- package/dist/lib/XmlCdata.js +15 -0
- package/dist/lib/XmlCdata.js.map +1 -0
- package/dist/lib/XmlComment.d.ts +16 -0
- package/dist/lib/XmlComment.d.ts.map +1 -0
- package/dist/lib/XmlComment.js +23 -0
- package/dist/lib/XmlComment.js.map +1 -0
- package/dist/lib/XmlDocument.d.ts +29 -0
- package/dist/lib/XmlDocument.d.ts.map +1 -0
- package/dist/lib/XmlDocument.js +47 -0
- package/dist/lib/XmlDocument.js.map +1 -0
- package/dist/lib/XmlElement.d.ts +40 -0
- package/dist/lib/XmlElement.d.ts.map +1 -0
- package/dist/lib/XmlElement.js +51 -0
- package/dist/lib/XmlElement.js.map +1 -0
- package/dist/lib/XmlNode.d.ts +74 -0
- package/dist/lib/XmlNode.d.ts.map +1 -0
- package/dist/lib/XmlNode.js +96 -0
- package/dist/lib/XmlNode.js.map +1 -0
- package/dist/lib/XmlProcessingInstruction.d.ts +22 -0
- package/dist/lib/XmlProcessingInstruction.d.ts.map +1 -0
- package/dist/lib/XmlProcessingInstruction.js +25 -0
- package/dist/lib/XmlProcessingInstruction.js.map +1 -0
- package/dist/lib/XmlText.d.ts +16 -0
- package/dist/lib/XmlText.d.ts.map +1 -0
- package/dist/lib/XmlText.js +23 -0
- package/dist/lib/XmlText.js.map +1 -0
- package/dist/lib/syntax.d.ts +69 -0
- package/dist/lib/syntax.d.ts.map +1 -0
- package/dist/lib/syntax.js +133 -0
- package/dist/lib/syntax.js.map +1 -0
- package/dist/lib/types.d.ts +5 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +36 -22
- package/src/index.ts +30 -0
- package/src/lib/Parser.ts +819 -0
- package/src/lib/StringScanner.ts +254 -0
- package/src/lib/XmlCdata.ts +11 -0
- package/src/lib/XmlComment.ts +26 -0
- package/src/lib/XmlDocument.ts +57 -0
- package/src/lib/XmlElement.ts +81 -0
- package/src/lib/XmlNode.ts +107 -0
- package/src/lib/XmlProcessingInstruction.ts +35 -0
- package/src/lib/XmlText.ts +26 -0
- package/src/lib/syntax.ts +136 -0
- package/src/lib/types.ts +2 -0
- package/CHANGELOG.md +0 -89
- package/dist/commonjs/index.js +0 -434
- package/dist/commonjs/lib/syntax.js +0 -262
- package/dist/umd/parse-xml.min.js +0 -1
- package/src/index.js +0 -451
- package/src/lib/syntax.js +0 -263
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.Parser = void 0;
|
|
27
|
+
const StringScanner_js_1 = require("./StringScanner.js");
|
|
28
|
+
const syntax = __importStar(require("./syntax.js"));
|
|
29
|
+
const XmlCdata_js_1 = require("./XmlCdata.js");
|
|
30
|
+
const XmlComment_js_1 = require("./XmlComment.js");
|
|
31
|
+
const XmlDocument_js_1 = require("./XmlDocument.js");
|
|
32
|
+
const XmlElement_js_1 = require("./XmlElement.js");
|
|
33
|
+
const XmlProcessingInstruction_js_1 = require("./XmlProcessingInstruction.js");
|
|
34
|
+
const XmlText_js_1 = require("./XmlText.js");
|
|
35
|
+
const emptyString = '';
|
|
36
|
+
/**
|
|
37
|
+
* Parses an XML string into an `XmlDocument`.
|
|
38
|
+
*
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
class Parser {
|
|
42
|
+
/**
|
|
43
|
+
* @param xml XML string to parse.
|
|
44
|
+
* @param options Parser options.
|
|
45
|
+
*/
|
|
46
|
+
constructor(xml, options = {}) {
|
|
47
|
+
this.document = new XmlDocument_js_1.XmlDocument();
|
|
48
|
+
this.currentNode = this.document;
|
|
49
|
+
this.options = options;
|
|
50
|
+
this.scanner = new StringScanner_js_1.StringScanner(normalizeXmlString(xml));
|
|
51
|
+
this.consumeProlog();
|
|
52
|
+
if (!this.consumeElement()) {
|
|
53
|
+
throw this.error('Root element is missing or invalid');
|
|
54
|
+
}
|
|
55
|
+
while (this.consumeMisc()) { } // eslint-disable-line no-empty
|
|
56
|
+
if (!this.scanner.isEnd) {
|
|
57
|
+
throw this.error('Extra content at the end of the document');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Adds the given `XmlNode` as a child of `this.currentNode`.
|
|
62
|
+
*/
|
|
63
|
+
addNode(node) {
|
|
64
|
+
node.parent = this.currentNode;
|
|
65
|
+
// @ts-expect-error: XmlDocument has a more limited set of possible children
|
|
66
|
+
// than XmlElement so TypeScript is unhappy, but we always do the right
|
|
67
|
+
// thing.
|
|
68
|
+
this.currentNode.children.push(node);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Adds the given _text_ to the document, either by appending it to a
|
|
72
|
+
* preceding `XmlText` node (if possible) or by creating a new `XmlText` node.
|
|
73
|
+
*/
|
|
74
|
+
addText(text) {
|
|
75
|
+
let { children } = this.currentNode;
|
|
76
|
+
let { length } = children;
|
|
77
|
+
if (length > 0) {
|
|
78
|
+
let prevNode = children[length - 1];
|
|
79
|
+
if (prevNode instanceof XmlText_js_1.XmlText) {
|
|
80
|
+
// The previous node is a text node, so we can append to it and avoid
|
|
81
|
+
// creating another node.
|
|
82
|
+
prevNode.text += text;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.addNode(new XmlText_js_1.XmlText(text));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Consumes element attributes.
|
|
90
|
+
*
|
|
91
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-starttags
|
|
92
|
+
*/
|
|
93
|
+
consumeAttributes() {
|
|
94
|
+
let attributes = Object.create(null);
|
|
95
|
+
while (this.consumeWhitespace()) {
|
|
96
|
+
let attrName = this.consumeName();
|
|
97
|
+
if (!attrName) {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
let attrValue = this.consumeEqual() && this.consumeAttributeValue();
|
|
101
|
+
if (attrValue === false) {
|
|
102
|
+
throw this.error('Attribute value expected');
|
|
103
|
+
}
|
|
104
|
+
if (attrName in attributes) {
|
|
105
|
+
throw this.error(`Duplicate attribute: ${attrName}`);
|
|
106
|
+
}
|
|
107
|
+
if (attrName === 'xml:space'
|
|
108
|
+
&& attrValue !== 'default'
|
|
109
|
+
&& attrValue !== 'preserve') {
|
|
110
|
+
throw this.error('Value of the `xml:space` attribute must be "default" or "preserve"');
|
|
111
|
+
}
|
|
112
|
+
attributes[attrName] = attrValue;
|
|
113
|
+
}
|
|
114
|
+
if (this.options.sortAttributes) {
|
|
115
|
+
let attrNames = Object.keys(attributes).sort();
|
|
116
|
+
let sortedAttributes = Object.create(null);
|
|
117
|
+
for (let i = 0; i < attrNames.length; ++i) {
|
|
118
|
+
let attrName = attrNames[i];
|
|
119
|
+
sortedAttributes[attrName] = attributes[attrName];
|
|
120
|
+
}
|
|
121
|
+
attributes = sortedAttributes;
|
|
122
|
+
}
|
|
123
|
+
return attributes;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Consumes an `AttValue` (attribute value) if possible.
|
|
127
|
+
*
|
|
128
|
+
* @returns
|
|
129
|
+
* Contents of the `AttValue` minus quotes, or `false` if nothing was
|
|
130
|
+
* consumed. An empty string indicates that an `AttValue` was consumed but
|
|
131
|
+
* was empty.
|
|
132
|
+
*
|
|
133
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-AttValue
|
|
134
|
+
*/
|
|
135
|
+
consumeAttributeValue() {
|
|
136
|
+
let { scanner } = this;
|
|
137
|
+
let quote = scanner.peek();
|
|
138
|
+
if (quote !== '"' && quote !== "'") {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
scanner.advance();
|
|
142
|
+
let chars;
|
|
143
|
+
let isClosed = false;
|
|
144
|
+
let value = emptyString;
|
|
145
|
+
let regex = quote === '"'
|
|
146
|
+
? syntax.attValueCharDoubleQuote
|
|
147
|
+
: syntax.attValueCharSingleQuote;
|
|
148
|
+
matchLoop: while (!scanner.isEnd) {
|
|
149
|
+
chars = scanner.consumeMatch(regex);
|
|
150
|
+
if (chars) {
|
|
151
|
+
this.validateChars(chars);
|
|
152
|
+
value += chars.replace(syntax.attValueNormalizedWhitespace, ' ');
|
|
153
|
+
}
|
|
154
|
+
switch (scanner.peek()) {
|
|
155
|
+
case quote:
|
|
156
|
+
isClosed = true;
|
|
157
|
+
break matchLoop;
|
|
158
|
+
case '&':
|
|
159
|
+
value += this.consumeReference();
|
|
160
|
+
continue;
|
|
161
|
+
case '<':
|
|
162
|
+
throw this.error('Unescaped `<` is not allowed in an attribute value');
|
|
163
|
+
case emptyString:
|
|
164
|
+
break matchLoop;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!isClosed) {
|
|
168
|
+
throw this.error('Unclosed attribute');
|
|
169
|
+
}
|
|
170
|
+
scanner.advance();
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Consumes a CDATA section if possible.
|
|
175
|
+
*
|
|
176
|
+
* @returns Whether a CDATA section was consumed.
|
|
177
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-cdata-sect
|
|
178
|
+
*/
|
|
179
|
+
consumeCdataSection() {
|
|
180
|
+
let { scanner } = this;
|
|
181
|
+
if (!scanner.consumeStringFast('<![CDATA[')) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
let text = scanner.consumeUntilString(']]>');
|
|
185
|
+
this.validateChars(text);
|
|
186
|
+
if (!scanner.consumeStringFast(']]>')) {
|
|
187
|
+
throw this.error('Unclosed CDATA section');
|
|
188
|
+
}
|
|
189
|
+
if (this.options.preserveCdata) {
|
|
190
|
+
this.addNode(new XmlCdata_js_1.XmlCdata(text));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.addText(text);
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Consumes character data if possible.
|
|
199
|
+
*
|
|
200
|
+
* @returns Whether character data was consumed.
|
|
201
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#dt-chardata
|
|
202
|
+
*/
|
|
203
|
+
consumeCharData() {
|
|
204
|
+
let { scanner } = this;
|
|
205
|
+
let charData = scanner.consumeUntilMatch(syntax.endCharData);
|
|
206
|
+
if (!charData) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
this.validateChars(charData);
|
|
210
|
+
if (scanner.peek(3) === ']]>') {
|
|
211
|
+
throw this.error('Element content may not contain the CDATA section close delimiter `]]>`');
|
|
212
|
+
}
|
|
213
|
+
this.addText(charData);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Consumes a comment if possible.
|
|
218
|
+
*
|
|
219
|
+
* @returns Whether a comment was consumed.
|
|
220
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Comment
|
|
221
|
+
*/
|
|
222
|
+
consumeComment() {
|
|
223
|
+
let { scanner } = this;
|
|
224
|
+
if (!scanner.consumeStringFast('<!--')) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
let content = scanner.consumeUntilString('--');
|
|
228
|
+
this.validateChars(content);
|
|
229
|
+
if (!scanner.consumeStringFast('-->')) {
|
|
230
|
+
if (scanner.peek(2) === '--') {
|
|
231
|
+
throw this.error("The string `--` isn't allowed inside a comment");
|
|
232
|
+
}
|
|
233
|
+
throw this.error('Unclosed comment');
|
|
234
|
+
}
|
|
235
|
+
if (this.options.preserveComments) {
|
|
236
|
+
this.addNode(new XmlComment_js_1.XmlComment(content.trim()));
|
|
237
|
+
}
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Consumes a reference in a content context if possible.
|
|
242
|
+
*
|
|
243
|
+
* This differs from `consumeReference()` in that a consumed reference will be
|
|
244
|
+
* added to the document as a text node instead of returned.
|
|
245
|
+
*
|
|
246
|
+
* @returns Whether a reference was consumed.
|
|
247
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#entproc
|
|
248
|
+
*/
|
|
249
|
+
consumeContentReference() {
|
|
250
|
+
let ref = this.consumeReference();
|
|
251
|
+
if (ref) {
|
|
252
|
+
this.addText(ref);
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Consumes a doctype declaration if possible.
|
|
259
|
+
*
|
|
260
|
+
* This is a loose implementation since doctype declarations are currently
|
|
261
|
+
* discarded without further parsing.
|
|
262
|
+
*
|
|
263
|
+
* @returns Whether a doctype declaration was consumed.
|
|
264
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#dtd
|
|
265
|
+
*/
|
|
266
|
+
consumeDoctypeDeclaration() {
|
|
267
|
+
let { scanner } = this;
|
|
268
|
+
if (!scanner.consumeStringFast('<!DOCTYPE')
|
|
269
|
+
|| !this.consumeWhitespace()) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
scanner.consumeMatch(/[^[>]+/y);
|
|
273
|
+
if (scanner.consumeMatch(/\[[\s\S]+?\][\x20\t\r\n]*>/y)) {
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
if (!scanner.consumeStringFast('>')) {
|
|
277
|
+
throw this.error('Unclosed doctype declaration');
|
|
278
|
+
}
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Consumes an element if possible.
|
|
283
|
+
*
|
|
284
|
+
* @returns Whether an element was consumed.
|
|
285
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-element
|
|
286
|
+
*/
|
|
287
|
+
consumeElement() {
|
|
288
|
+
let { scanner } = this;
|
|
289
|
+
let mark = scanner.charIndex;
|
|
290
|
+
if (!scanner.consumeStringFast('<')) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
let name = this.consumeName();
|
|
294
|
+
if (!name) {
|
|
295
|
+
scanner.reset(mark);
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
let attributes = this.consumeAttributes();
|
|
299
|
+
let isEmpty = Boolean(scanner.consumeStringFast('/>'));
|
|
300
|
+
let element = new XmlElement_js_1.XmlElement(name, attributes);
|
|
301
|
+
element.parent = this.currentNode;
|
|
302
|
+
if (!isEmpty) {
|
|
303
|
+
if (!scanner.consumeStringFast('>')) {
|
|
304
|
+
throw this.error(`Unclosed start tag for element \`${name}\``);
|
|
305
|
+
}
|
|
306
|
+
this.currentNode = element;
|
|
307
|
+
do {
|
|
308
|
+
this.consumeCharData();
|
|
309
|
+
} while (this.consumeElement()
|
|
310
|
+
|| this.consumeContentReference()
|
|
311
|
+
|| this.consumeCdataSection()
|
|
312
|
+
|| this.consumeProcessingInstruction()
|
|
313
|
+
|| this.consumeComment());
|
|
314
|
+
let endTagMark = scanner.charIndex;
|
|
315
|
+
let endTagName;
|
|
316
|
+
if (!scanner.consumeStringFast('</')
|
|
317
|
+
|| !(endTagName = this.consumeName())
|
|
318
|
+
|| endTagName !== name) {
|
|
319
|
+
scanner.reset(endTagMark);
|
|
320
|
+
throw this.error(`Missing end tag for element ${name}`);
|
|
321
|
+
}
|
|
322
|
+
this.consumeWhitespace();
|
|
323
|
+
if (!scanner.consumeStringFast('>')) {
|
|
324
|
+
throw this.error(`Unclosed end tag for element ${name}`);
|
|
325
|
+
}
|
|
326
|
+
this.currentNode = element.parent;
|
|
327
|
+
}
|
|
328
|
+
this.addNode(element);
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Consumes an `Eq` production if possible.
|
|
333
|
+
*
|
|
334
|
+
* @returns Whether an `Eq` production was consumed.
|
|
335
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Eq
|
|
336
|
+
*/
|
|
337
|
+
consumeEqual() {
|
|
338
|
+
this.consumeWhitespace();
|
|
339
|
+
if (this.scanner.consumeStringFast('=')) {
|
|
340
|
+
this.consumeWhitespace();
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Consumes `Misc` content if possible.
|
|
347
|
+
*
|
|
348
|
+
* @returns Whether anything was consumed.
|
|
349
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Misc
|
|
350
|
+
*/
|
|
351
|
+
consumeMisc() {
|
|
352
|
+
return this.consumeComment()
|
|
353
|
+
|| this.consumeProcessingInstruction()
|
|
354
|
+
|| this.consumeWhitespace();
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Consumes one or more `Name` characters if possible.
|
|
358
|
+
*
|
|
359
|
+
* @returns `Name` characters, or an empty string if none were consumed.
|
|
360
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name
|
|
361
|
+
*/
|
|
362
|
+
consumeName() {
|
|
363
|
+
return syntax.isNameStartChar(this.scanner.peek())
|
|
364
|
+
? this.scanner.consumeMatchFn(syntax.isNameChar)
|
|
365
|
+
: emptyString;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Consumes a processing instruction if possible.
|
|
369
|
+
*
|
|
370
|
+
* @returns Whether a processing instruction was consumed.
|
|
371
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-pi
|
|
372
|
+
*/
|
|
373
|
+
consumeProcessingInstruction() {
|
|
374
|
+
let { scanner } = this;
|
|
375
|
+
let mark = scanner.charIndex;
|
|
376
|
+
if (!scanner.consumeStringFast('<?')) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
let name = this.consumeName();
|
|
380
|
+
if (name) {
|
|
381
|
+
if (name.toLowerCase() === 'xml') {
|
|
382
|
+
scanner.reset(mark);
|
|
383
|
+
throw this.error("XML declaration isn't allowed here");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
throw this.error('Invalid processing instruction');
|
|
388
|
+
}
|
|
389
|
+
if (!this.consumeWhitespace()) {
|
|
390
|
+
if (scanner.consumeStringFast('?>')) {
|
|
391
|
+
this.addNode(new XmlProcessingInstruction_js_1.XmlProcessingInstruction(name));
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
throw this.error('Whitespace is required after a processing instruction name');
|
|
395
|
+
}
|
|
396
|
+
let content = scanner.consumeUntilString('?>');
|
|
397
|
+
this.validateChars(content);
|
|
398
|
+
if (!scanner.consumeStringFast('?>')) {
|
|
399
|
+
throw this.error('Unterminated processing instruction');
|
|
400
|
+
}
|
|
401
|
+
this.addNode(new XmlProcessingInstruction_js_1.XmlProcessingInstruction(name, content));
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Consumes a prolog if possible.
|
|
406
|
+
*
|
|
407
|
+
* @returns Whether a prolog was consumed.
|
|
408
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-prolog-dtd
|
|
409
|
+
*/
|
|
410
|
+
consumeProlog() {
|
|
411
|
+
let { scanner } = this;
|
|
412
|
+
let mark = scanner.charIndex;
|
|
413
|
+
this.consumeXmlDeclaration();
|
|
414
|
+
while (this.consumeMisc()) { } // eslint-disable-line no-empty
|
|
415
|
+
if (this.consumeDoctypeDeclaration()) {
|
|
416
|
+
while (this.consumeMisc()) { } // eslint-disable-line no-empty
|
|
417
|
+
}
|
|
418
|
+
return mark < scanner.charIndex;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Consumes a reference if possible.
|
|
422
|
+
*
|
|
423
|
+
* This differs from `consumeContentReference()` in that a consumed reference
|
|
424
|
+
* will be returned rather than added to the document.
|
|
425
|
+
*
|
|
426
|
+
* @returns
|
|
427
|
+
* Parsed reference value, or `false` if nothing was consumed (to
|
|
428
|
+
* distinguish from a reference that resolves to an empty string).
|
|
429
|
+
*
|
|
430
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Reference
|
|
431
|
+
*/
|
|
432
|
+
consumeReference() {
|
|
433
|
+
let { scanner } = this;
|
|
434
|
+
if (!scanner.consumeStringFast('&')) {
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
let ref = scanner.consumeMatchFn(syntax.isReferenceChar);
|
|
438
|
+
if (scanner.consume() !== ';') {
|
|
439
|
+
throw this.error('Unterminated reference (a reference must end with `;`)');
|
|
440
|
+
}
|
|
441
|
+
let parsedValue;
|
|
442
|
+
if (ref[0] === '#') {
|
|
443
|
+
// This is a character reference.
|
|
444
|
+
let codePoint = ref[1] === 'x'
|
|
445
|
+
? parseInt(ref.slice(2), 16) // Hex codepoint.
|
|
446
|
+
: parseInt(ref.slice(1), 10); // Decimal codepoint.
|
|
447
|
+
if (isNaN(codePoint)) {
|
|
448
|
+
throw this.error('Invalid character reference');
|
|
449
|
+
}
|
|
450
|
+
if (!syntax.isXmlCodePoint(codePoint)) {
|
|
451
|
+
throw this.error('Character reference resolves to an invalid character');
|
|
452
|
+
}
|
|
453
|
+
parsedValue = String.fromCodePoint(codePoint);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
// This is an entity reference.
|
|
457
|
+
parsedValue = syntax.predefinedEntities[ref];
|
|
458
|
+
if (parsedValue === undefined) {
|
|
459
|
+
let { ignoreUndefinedEntities, resolveUndefinedEntity, } = this.options;
|
|
460
|
+
let wrappedRef = `&${ref};`; // for backcompat with <= 2.x
|
|
461
|
+
if (resolveUndefinedEntity) {
|
|
462
|
+
let resolvedValue = resolveUndefinedEntity(wrappedRef);
|
|
463
|
+
if (resolvedValue !== null && resolvedValue !== undefined) {
|
|
464
|
+
let type = typeof resolvedValue;
|
|
465
|
+
if (type !== 'string') {
|
|
466
|
+
throw new TypeError(`\`resolveUndefinedEntity()\` must return a string, \`null\`, or \`undefined\`, but returned a value of type ${type}`);
|
|
467
|
+
}
|
|
468
|
+
return resolvedValue;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (ignoreUndefinedEntities) {
|
|
472
|
+
return wrappedRef;
|
|
473
|
+
}
|
|
474
|
+
scanner.reset(-wrappedRef.length);
|
|
475
|
+
throw this.error(`Named entity isn't defined: ${wrappedRef}`);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return parsedValue;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Consumes a `SystemLiteral` if possible.
|
|
482
|
+
*
|
|
483
|
+
* A `SystemLiteral` is similar to an attribute value, but allows the
|
|
484
|
+
* characters `<` and `&` and doesn't replace references.
|
|
485
|
+
*
|
|
486
|
+
* @returns
|
|
487
|
+
* Value of the `SystemLiteral` minus quotes, or `false` if nothing was
|
|
488
|
+
* consumed. An empty string indicates that a `SystemLiteral` was consumed
|
|
489
|
+
* but was empty.
|
|
490
|
+
*
|
|
491
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-SystemLiteral
|
|
492
|
+
*/
|
|
493
|
+
consumeSystemLiteral() {
|
|
494
|
+
let { scanner } = this;
|
|
495
|
+
let quote = scanner.consumeStringFast('"') || scanner.consumeStringFast("'");
|
|
496
|
+
if (!quote) {
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
499
|
+
let value = scanner.consumeUntilString(quote);
|
|
500
|
+
this.validateChars(value);
|
|
501
|
+
if (!scanner.consumeStringFast(quote)) {
|
|
502
|
+
throw this.error('Missing end quote');
|
|
503
|
+
}
|
|
504
|
+
return value;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Consumes one or more whitespace characters if possible.
|
|
508
|
+
*
|
|
509
|
+
* @returns Whether any whitespace characters were consumed.
|
|
510
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#white
|
|
511
|
+
*/
|
|
512
|
+
consumeWhitespace() {
|
|
513
|
+
return Boolean(this.scanner.consumeMatchFn(syntax.isWhitespace));
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Consumes an XML declaration if possible.
|
|
517
|
+
*
|
|
518
|
+
* @returns Whether an XML declaration was consumed.
|
|
519
|
+
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-XMLDecl
|
|
520
|
+
*/
|
|
521
|
+
consumeXmlDeclaration() {
|
|
522
|
+
let { scanner } = this;
|
|
523
|
+
if (!scanner.consumeStringFast('<?xml')) {
|
|
524
|
+
return false;
|
|
525
|
+
}
|
|
526
|
+
if (!this.consumeWhitespace()) {
|
|
527
|
+
throw this.error('Invalid XML declaration');
|
|
528
|
+
}
|
|
529
|
+
let version = Boolean(scanner.consumeStringFast('version'))
|
|
530
|
+
&& this.consumeEqual()
|
|
531
|
+
&& this.consumeSystemLiteral();
|
|
532
|
+
if (version === false) {
|
|
533
|
+
throw this.error('XML version is missing or invalid');
|
|
534
|
+
}
|
|
535
|
+
else if (!/^1\.[0-9]+$/.test(version)) {
|
|
536
|
+
throw this.error('Invalid character in version number');
|
|
537
|
+
}
|
|
538
|
+
if (this.consumeWhitespace()) {
|
|
539
|
+
let encoding = Boolean(scanner.consumeStringFast('encoding'))
|
|
540
|
+
&& this.consumeEqual()
|
|
541
|
+
&& this.consumeSystemLiteral();
|
|
542
|
+
if (encoding) {
|
|
543
|
+
this.consumeWhitespace();
|
|
544
|
+
}
|
|
545
|
+
let standalone = Boolean(scanner.consumeStringFast('standalone'))
|
|
546
|
+
&& this.consumeEqual()
|
|
547
|
+
&& this.consumeSystemLiteral();
|
|
548
|
+
if (standalone) {
|
|
549
|
+
if (standalone !== 'yes' && standalone !== 'no') {
|
|
550
|
+
throw this.error('Only "yes" and "no" are permitted as values of `standalone`');
|
|
551
|
+
}
|
|
552
|
+
this.consumeWhitespace();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
if (!scanner.consumeStringFast('?>')) {
|
|
556
|
+
throw this.error('Invalid or unclosed XML declaration');
|
|
557
|
+
}
|
|
558
|
+
return true;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Throws an error at the current scanner position.
|
|
562
|
+
*/
|
|
563
|
+
error(message) {
|
|
564
|
+
let { charIndex, string: xml } = this.scanner;
|
|
565
|
+
let column = 1;
|
|
566
|
+
let excerpt = '';
|
|
567
|
+
let line = 1;
|
|
568
|
+
// Find the line and column where the error occurred.
|
|
569
|
+
for (let i = 0; i < charIndex; ++i) {
|
|
570
|
+
let char = xml[i];
|
|
571
|
+
if (char === '\n') {
|
|
572
|
+
column = 1;
|
|
573
|
+
excerpt = '';
|
|
574
|
+
line += 1;
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
column += 1;
|
|
578
|
+
excerpt += char;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
let eol = xml.indexOf('\n', charIndex);
|
|
582
|
+
excerpt += eol === -1
|
|
583
|
+
? xml.slice(charIndex)
|
|
584
|
+
: xml.slice(charIndex, eol);
|
|
585
|
+
let excerptStart = 0;
|
|
586
|
+
// Keep the excerpt below 50 chars, but always keep the error position in
|
|
587
|
+
// view.
|
|
588
|
+
if (excerpt.length > 50) {
|
|
589
|
+
if (column < 40) {
|
|
590
|
+
excerpt = excerpt.slice(0, 50);
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
excerptStart = column - 20;
|
|
594
|
+
excerpt = excerpt.slice(excerptStart, column + 30);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
let err = new Error(`${message} (line ${line}, column ${column})\n`
|
|
598
|
+
+ ` ${excerpt}\n`
|
|
599
|
+
+ ' '.repeat(column - excerptStart + 1) + '^\n');
|
|
600
|
+
Object.assign(err, {
|
|
601
|
+
column,
|
|
602
|
+
excerpt,
|
|
603
|
+
line,
|
|
604
|
+
pos: charIndex,
|
|
605
|
+
});
|
|
606
|
+
return err;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Throws an invalid character error if any character in the given _string_
|
|
610
|
+
* isn't a valid XML character.
|
|
611
|
+
*/
|
|
612
|
+
validateChars(string) {
|
|
613
|
+
let { length } = string;
|
|
614
|
+
for (let i = 0; i < length; ++i) {
|
|
615
|
+
let cp = string.codePointAt(i);
|
|
616
|
+
if (!syntax.isXmlCodePoint(cp)) {
|
|
617
|
+
this.scanner.reset(-([...string].length - i));
|
|
618
|
+
throw this.error('Invalid character');
|
|
619
|
+
}
|
|
620
|
+
if (cp > 65535) {
|
|
621
|
+
i += 1;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
exports.Parser = Parser;
|
|
627
|
+
// -- Private Functions --------------------------------------------------------
|
|
628
|
+
/**
|
|
629
|
+
* Normalizes the given XML string by stripping a byte order mark (if present)
|
|
630
|
+
* and replacing CRLF sequences and lone CR characters with LF characters.
|
|
631
|
+
*/
|
|
632
|
+
function normalizeXmlString(xml) {
|
|
633
|
+
if (xml[0] === '\uFEFF') {
|
|
634
|
+
xml = xml.slice(1);
|
|
635
|
+
}
|
|
636
|
+
return xml.replace(/\r\n?/g, '\n');
|
|
637
|
+
}
|
|
638
|
+
//# sourceMappingURL=Parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/lib/Parser.ts"],"names":[],"mappings":"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"}
|