xml-tokenizer 0.0.26 → 0.0.27
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/dist/cjs/get-q-name.js +1 -7
- package/dist/cjs/index.js +1 -75
- package/dist/cjs/selector/TokenSelectState.js +1 -106
- package/dist/cjs/selector/TokenSelectStateMachine.js +1 -150
- package/dist/cjs/selector/TokenSelector.js +1 -139
- package/dist/cjs/selector/match-string.js +1 -21
- package/dist/cjs/selector/select.js +1 -19
- package/dist/cjs/token-to-xml.js +1 -44
- package/dist/cjs/tokenizer/XmlError.js +1 -96
- package/dist/cjs/tokenizer/XmlStream.js +1 -447
- package/dist/cjs/tokenizer/ascii-constants.js +1 -69
- package/dist/cjs/tokenizer/tokenize.js +1 -408
- package/dist/cjs/tokenizer/utils.js +1 -47
- package/dist/cjs/tokens-to-xml.js +1 -13
- package/dist/cjs/xml-to-object.js +1 -69
- package/dist/cjs/xml-to-simplified-object.js +1 -86
- package/dist/esm/get-q-name.js +1 -5
- package/dist/esm/index.js +1 -14
- package/dist/esm/selector/TokenSelectState.js +1 -102
- package/dist/esm/selector/TokenSelectStateMachine.js +1 -148
- package/dist/esm/selector/TokenSelector.js +1 -137
- package/dist/esm/selector/match-string.js +1 -19
- package/dist/esm/selector/select.js +1 -17
- package/dist/esm/token-to-xml.js +1 -42
- package/dist/esm/tokenizer/XmlError.js +1 -94
- package/dist/esm/tokenizer/XmlStream.js +1 -445
- package/dist/esm/tokenizer/ascii-constants.js +1 -35
- package/dist/esm/tokenizer/tokenize.js +1 -405
- package/dist/esm/tokenizer/utils.js +1 -40
- package/dist/esm/tokens-to-xml.js +1 -11
- package/dist/esm/xml-to-object.js +1 -66
- package/dist/esm/xml-to-simplified-object.js +1 -83
- package/dist/types/get-q-name.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/selector/TokenSelectState.d.ts +0 -1
- package/dist/types/selector/TokenSelectStateMachine.d.ts +0 -1
- package/dist/types/selector/TokenSelector.d.ts +0 -1
- package/dist/types/selector/index.d.ts +0 -1
- package/dist/types/selector/match-string.d.ts +0 -1
- package/dist/types/selector/select.d.ts +0 -1
- package/dist/types/selector/types.d.ts +0 -1
- package/dist/types/token-to-xml.d.ts +0 -1
- package/dist/types/tokenizer/XmlError.d.ts +0 -1
- package/dist/types/tokenizer/XmlStream.d.ts +20 -1
- package/dist/types/tokenizer/ascii-constants.d.ts +0 -1
- package/dist/types/tokenizer/index.d.ts +0 -1
- package/dist/types/tokenizer/tokenize.d.ts +0 -1
- package/dist/types/tokenizer/types.d.ts +3 -2
- package/dist/types/tokenizer/utils.d.ts +0 -1
- package/dist/types/tokens-to-xml.d.ts +0 -1
- package/dist/types/xml-to-object.d.ts +0 -1
- package/dist/types/xml-to-simplified-object.d.ts +0 -1
- package/package.json +1 -1
- package/dist/types/get-q-name.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/selector/TokenSelectState.d.ts.map +0 -1
- package/dist/types/selector/TokenSelectStateMachine.d.ts.map +0 -1
- package/dist/types/selector/TokenSelector.d.ts.map +0 -1
- package/dist/types/selector/index.d.ts.map +0 -1
- package/dist/types/selector/match-string.d.ts.map +0 -1
- package/dist/types/selector/select.d.ts.map +0 -1
- package/dist/types/selector/types.d.ts.map +0 -1
- package/dist/types/token-to-xml.d.ts.map +0 -1
- package/dist/types/tokenizer/XmlError.d.ts.map +0 -1
- package/dist/types/tokenizer/XmlStream.d.ts.map +0 -1
- package/dist/types/tokenizer/ascii-constants.d.ts.map +0 -1
- package/dist/types/tokenizer/index.d.ts.map +0 -1
- package/dist/types/tokenizer/tokenize.d.ts.map +0 -1
- package/dist/types/tokenizer/types.d.ts.map +0 -1
- package/dist/types/tokenizer/utils.d.ts.map +0 -1
- package/dist/types/tokens-to-xml.d.ts.map +0 -1
- package/dist/types/xml-to-object.d.ts.map +0 -1
- package/dist/types/xml-to-simplified-object.d.ts.map +0 -1
|
@@ -1,405 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { LESS_THAN, GREATER_THAN, SLASH, EQUALS, SINGLE_QUOTE, DOUBLE_QUOTE, HYPHEN, QUESTION_MARK, OPEN_SQUARE_BRACKET, PERCENT, EXCLAMATION_MARK, UPPERCASE_S, UPPERCASE_P, CLOSE_SQUARE_BRACKET } from './ascii-constants.js';
|
|
3
|
-
import { isXmlSpaceByte } from './utils.js';
|
|
4
|
-
import { XmlError } from './XmlError.js';
|
|
5
|
-
import { XmlStream } from './XmlStream.js';
|
|
6
|
-
|
|
7
|
-
const BOM = "\uFEFF";
|
|
8
|
-
const XML_DECLARATION_START = "<?xml ";
|
|
9
|
-
const XML_DECLARATION_END = "?>";
|
|
10
|
-
const ENTITY_DECLARATION_START = "<!ENTITY";
|
|
11
|
-
const ELEMENT_DECLARATION_START = "<!ELEMENT";
|
|
12
|
-
const ATTLIST_DECLARATION_START = "<!ATTLIST";
|
|
13
|
-
const NOTATION_DECLARATION_START = "<!NOTATION";
|
|
14
|
-
const DOCTYPE_START = "<!DOCTYPE";
|
|
15
|
-
const PI_START = "<?";
|
|
16
|
-
const PI_END = "?>";
|
|
17
|
-
const COMMENT_START = "<!--";
|
|
18
|
-
const COMMENT_END = "-->";
|
|
19
|
-
const CDATA_START = "<![CDATA[";
|
|
20
|
-
const CDATA_END = "]]>";
|
|
21
|
-
const NDATA = "NDATA";
|
|
22
|
-
const PUBLIC = "PUBLIC";
|
|
23
|
-
const SYSTEM = "SYSTEM";
|
|
24
|
-
const VERSION = "version";
|
|
25
|
-
const ENCODING = "encoding";
|
|
26
|
-
const STANDALONE = "standalone";
|
|
27
|
-
function tokenize(xmlString, tokenCallback, options = {}) {
|
|
28
|
-
tokenizeXmlStream(new XmlStream(xmlString, options), tokenCallback);
|
|
29
|
-
}
|
|
30
|
-
function tokenizeXmlStream(s, tokenCallback) {
|
|
31
|
-
if (s.startsWith(BOM)) {
|
|
32
|
-
s.advance(1);
|
|
33
|
-
}
|
|
34
|
-
if (s.startsWith(XML_DECLARATION_START)) {
|
|
35
|
-
parseDeclaration(s);
|
|
36
|
-
}
|
|
37
|
-
parseMisc(s, tokenCallback);
|
|
38
|
-
s.skipSpaces();
|
|
39
|
-
if (s.startsWith(DOCTYPE_START) || s.startsWith(DOCTYPE_START.toLowerCase())) {
|
|
40
|
-
if (!s.config.allowDtd) {
|
|
41
|
-
throw new XmlError({ type: "DtdDetected" });
|
|
42
|
-
}
|
|
43
|
-
parseDoctype(s, tokenCallback);
|
|
44
|
-
parseMisc(s, tokenCallback);
|
|
45
|
-
}
|
|
46
|
-
s.skipSpaces();
|
|
47
|
-
if (s.config.strictDocument) {
|
|
48
|
-
if (!s.atEnd() && s.currCodeUnit() === LESS_THAN) {
|
|
49
|
-
parseElement(s, tokenCallback);
|
|
50
|
-
}
|
|
51
|
-
parseMisc(s, tokenCallback);
|
|
52
|
-
if (!s.atEnd()) {
|
|
53
|
-
throw new XmlError({ type: "UnknownToken", message: "Not at end" }, s.genTextPos());
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
while (!s.atEnd()) {
|
|
57
|
-
if (s.currCodeUnit() === LESS_THAN) {
|
|
58
|
-
parseElement(s, tokenCallback);
|
|
59
|
-
} else {
|
|
60
|
-
parseText(s, tokenCallback);
|
|
61
|
-
}
|
|
62
|
-
parseMisc(s, tokenCallback);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function parseMisc(s, tokenCallback) {
|
|
67
|
-
while (!s.atEnd()) {
|
|
68
|
-
s.skipSpaces();
|
|
69
|
-
if (s.startsWith(COMMENT_START)) {
|
|
70
|
-
parseComment(s, tokenCallback);
|
|
71
|
-
} else if (s.startsWith(PI_START)) {
|
|
72
|
-
parsePi(s, tokenCallback);
|
|
73
|
-
} else {
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function parseDeclaration(s) {
|
|
79
|
-
function consumeSpaces(_s) {
|
|
80
|
-
if (_s.startsWithSpace()) {
|
|
81
|
-
_s.skipSpaces();
|
|
82
|
-
} else if (!_s.startsWith(XML_DECLARATION_END) && !_s.atEnd()) {
|
|
83
|
-
throw new XmlError(
|
|
84
|
-
{ type: "InvalidChar", expected: "a whitespace", actual: _s.currCodeUnitUnchecked() },
|
|
85
|
-
_s.genTextPos()
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
s.advance(5);
|
|
90
|
-
consumeSpaces(s);
|
|
91
|
-
if (!s.startsWith(VERSION)) {
|
|
92
|
-
throw new XmlError({ type: "InvalidString", expected: "version" }, s.genTextPos());
|
|
93
|
-
}
|
|
94
|
-
parseAttribute(s);
|
|
95
|
-
consumeSpaces(s);
|
|
96
|
-
if (s.startsWith(ENCODING)) {
|
|
97
|
-
parseAttribute(s);
|
|
98
|
-
consumeSpaces(s);
|
|
99
|
-
}
|
|
100
|
-
if (s.startsWith(STANDALONE)) {
|
|
101
|
-
parseAttribute(s);
|
|
102
|
-
}
|
|
103
|
-
s.skipSpaces();
|
|
104
|
-
s.skipString(XML_DECLARATION_END);
|
|
105
|
-
}
|
|
106
|
-
function parseComment(s, tokenCallback) {
|
|
107
|
-
const start = s.getPos();
|
|
108
|
-
s.advance(4);
|
|
109
|
-
const text = s.consumeCodeUnitsWhile((c, _s) => !(c === HYPHEN && _s.startsWith(COMMENT_END)));
|
|
110
|
-
s.skipString(COMMENT_END);
|
|
111
|
-
if (text.includes("--") || text.endsWith("-")) {
|
|
112
|
-
throw new XmlError({ type: "InvalidComment" }, s.genTextPosFrom(start));
|
|
113
|
-
}
|
|
114
|
-
tokenCallback({ type: "Comment", text, range: s.rangeFrom(start) });
|
|
115
|
-
}
|
|
116
|
-
function parsePi(s, tokenCallback) {
|
|
117
|
-
if (s.startsWith(XML_DECLARATION_START)) {
|
|
118
|
-
throw new XmlError({ type: "UnexpectedDeclaration" }, s.genTextPos());
|
|
119
|
-
}
|
|
120
|
-
const start = s.getPos();
|
|
121
|
-
s.advance(2);
|
|
122
|
-
const target = s.consumeName();
|
|
123
|
-
s.skipSpaces();
|
|
124
|
-
const content = s.consumeCodeUnitsWhile(
|
|
125
|
-
(c, _s) => !(c === QUESTION_MARK && _s.startsWith(PI_END))
|
|
126
|
-
);
|
|
127
|
-
s.skipString(PI_END);
|
|
128
|
-
tokenCallback({
|
|
129
|
-
type: "ProcessingInstruction",
|
|
130
|
-
target,
|
|
131
|
-
content: content.length === 0 ? void 0 : content,
|
|
132
|
-
range: s.rangeFrom(start)
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
function parseDoctype(s, tokenCallback) {
|
|
136
|
-
const start = s.getPos();
|
|
137
|
-
parseDoctypeStart(s);
|
|
138
|
-
s.skipSpaces();
|
|
139
|
-
if (s.currCodeUnit() === GREATER_THAN) {
|
|
140
|
-
s.advance(1);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
s.advance(1);
|
|
144
|
-
while (!s.atEnd()) {
|
|
145
|
-
s.skipSpaces();
|
|
146
|
-
if (s.startsWith(ENTITY_DECLARATION_START)) {
|
|
147
|
-
parseEntityDecl(s, tokenCallback);
|
|
148
|
-
} else if (s.startsWith(COMMENT_START)) {
|
|
149
|
-
parseComment(s, tokenCallback);
|
|
150
|
-
} else if (s.startsWith(PI_START)) {
|
|
151
|
-
parsePi(s, tokenCallback);
|
|
152
|
-
} else if (s.startsWith("]")) {
|
|
153
|
-
s.advance(1);
|
|
154
|
-
s.skipSpaces();
|
|
155
|
-
if (s.currCodeUnit() === GREATER_THAN) {
|
|
156
|
-
s.advance(1);
|
|
157
|
-
break;
|
|
158
|
-
} else {
|
|
159
|
-
throw new XmlError(
|
|
160
|
-
{ type: "InvalidChar", expected: "'>'", actual: s.currCodeUnitUnchecked() },
|
|
161
|
-
s.genTextPos()
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
} else if (s.startsWith(ELEMENT_DECLARATION_START) || s.startsWith(ATTLIST_DECLARATION_START) || s.startsWith(NOTATION_DECLARATION_START)) {
|
|
165
|
-
try {
|
|
166
|
-
consumeDecl(s);
|
|
167
|
-
} catch (e) {
|
|
168
|
-
throw new XmlError(
|
|
169
|
-
{ type: "UnknownToken", message: "Failed to consume declaration" },
|
|
170
|
-
s.genTextPosFrom(start)
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
} else {
|
|
174
|
-
throw new XmlError(
|
|
175
|
-
{ type: "UnknownToken", message: "Failed to parse doctype" },
|
|
176
|
-
s.genTextPos()
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
function parseDoctypeStart(s) {
|
|
182
|
-
s.advance(9);
|
|
183
|
-
s.consumeSpaces();
|
|
184
|
-
s.skipName();
|
|
185
|
-
s.skipSpaces();
|
|
186
|
-
parseExternalId(s);
|
|
187
|
-
s.skipSpaces();
|
|
188
|
-
const currCodeUnit = s.currCodeUnit();
|
|
189
|
-
if (currCodeUnit !== OPEN_SQUARE_BRACKET && currCodeUnit !== GREATER_THAN) {
|
|
190
|
-
throw new XmlError(
|
|
191
|
-
{ type: "InvalidChar", expected: "'[' or '>'", actual: currCodeUnit },
|
|
192
|
-
s.genTextPos()
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function parseExternalId(s) {
|
|
197
|
-
if (s.startsWith(SYSTEM) || s.startsWith(PUBLIC)) {
|
|
198
|
-
const start = s.getPos();
|
|
199
|
-
s.advance(6);
|
|
200
|
-
const id = s.sliceBack(start);
|
|
201
|
-
s.consumeSpaces();
|
|
202
|
-
const quote = s.consumeQuote();
|
|
203
|
-
s.consumeCodeUnitsWhile((c) => c !== quote);
|
|
204
|
-
s.consumeCodeUnit(quote);
|
|
205
|
-
if (id === PUBLIC) {
|
|
206
|
-
s.consumeSpaces();
|
|
207
|
-
const _quote = s.consumeQuote();
|
|
208
|
-
s.consumeCodeUnitsWhile((c) => c !== _quote);
|
|
209
|
-
s.consumeCodeUnit(_quote);
|
|
210
|
-
}
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
return false;
|
|
214
|
-
}
|
|
215
|
-
function parseEntityDecl(s, tokenCallback) {
|
|
216
|
-
s.advance(8);
|
|
217
|
-
s.consumeSpaces();
|
|
218
|
-
const isGe = !s.tryConsumeCodeUnit(PERCENT);
|
|
219
|
-
if (!isGe) {
|
|
220
|
-
s.consumeSpaces();
|
|
221
|
-
}
|
|
222
|
-
const name = s.consumeName();
|
|
223
|
-
s.consumeSpaces();
|
|
224
|
-
const definition = parseEntityDef(s, isGe);
|
|
225
|
-
if (definition !== null) {
|
|
226
|
-
tokenCallback({ type: "EntityDeclaration", name, definition });
|
|
227
|
-
}
|
|
228
|
-
s.skipSpaces();
|
|
229
|
-
s.consumeCodeUnit(GREATER_THAN);
|
|
230
|
-
}
|
|
231
|
-
function parseEntityDef(s, isGe) {
|
|
232
|
-
const currCodeUnit = s.currCodeUnit();
|
|
233
|
-
if (currCodeUnit === DOUBLE_QUOTE || currCodeUnit === SINGLE_QUOTE) {
|
|
234
|
-
const quote = s.consumeQuote();
|
|
235
|
-
const start = s.getPos();
|
|
236
|
-
s.skipCodeUnitsWhile((c) => c !== quote);
|
|
237
|
-
const value = s.sliceBack(start);
|
|
238
|
-
s.consumeCodeUnit(quote);
|
|
239
|
-
return value;
|
|
240
|
-
} else if (currCodeUnit === UPPERCASE_S || currCodeUnit === UPPERCASE_P) {
|
|
241
|
-
if (parseExternalId(s)) {
|
|
242
|
-
if (isGe) {
|
|
243
|
-
s.skipSpaces();
|
|
244
|
-
if (s.startsWith(NDATA)) {
|
|
245
|
-
s.advance(5);
|
|
246
|
-
s.consumeSpaces();
|
|
247
|
-
s.skipName();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
throw new XmlError({ type: "InvalidExternalID" }, s.genTextPos());
|
|
253
|
-
} else {
|
|
254
|
-
throw new XmlError(
|
|
255
|
-
{ type: "InvalidChar", expected: "a quote, SYSTEM or PUBLIC", actual: currCodeUnit },
|
|
256
|
-
s.genTextPos()
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
function consumeDecl(s) {
|
|
261
|
-
s.skipCodeUnitsWhile((c) => c !== GREATER_THAN);
|
|
262
|
-
s.consumeCodeUnit(GREATER_THAN);
|
|
263
|
-
}
|
|
264
|
-
function parseElement(s, tokenCallback) {
|
|
265
|
-
const start = s.getPos();
|
|
266
|
-
s.advance(1);
|
|
267
|
-
const [prefix, local] = s.consumeQName();
|
|
268
|
-
tokenCallback({ type: "ElementStart", prefix, local, start });
|
|
269
|
-
let open = false;
|
|
270
|
-
while (!s.atEnd()) {
|
|
271
|
-
const hasSpace = s.startsWithSpace();
|
|
272
|
-
s.skipSpaces();
|
|
273
|
-
const _start = s.getPos();
|
|
274
|
-
const currCodeUnit = s.currCodeUnit();
|
|
275
|
-
if (currCodeUnit === SLASH) {
|
|
276
|
-
s.advance(1);
|
|
277
|
-
s.consumeCodeUnit(GREATER_THAN);
|
|
278
|
-
const range = s.rangeFrom(_start);
|
|
279
|
-
tokenCallback({ type: "ElementEnd", end: { type: "Empty" }, range });
|
|
280
|
-
break;
|
|
281
|
-
} else if (currCodeUnit === GREATER_THAN) {
|
|
282
|
-
s.advance(1);
|
|
283
|
-
const range = s.rangeFrom(_start);
|
|
284
|
-
tokenCallback({ type: "ElementEnd", end: { type: "Open" }, range });
|
|
285
|
-
open = true;
|
|
286
|
-
break;
|
|
287
|
-
} else {
|
|
288
|
-
if (!hasSpace) {
|
|
289
|
-
throw new XmlError(
|
|
290
|
-
{ type: "InvalidChar", expected: "a whitespace", actual: s.currCodeUnitUnchecked() },
|
|
291
|
-
s.genTextPos()
|
|
292
|
-
);
|
|
293
|
-
}
|
|
294
|
-
const [_prefix, _local, value] = parseAttribute(s);
|
|
295
|
-
const end = s.getPos();
|
|
296
|
-
tokenCallback({
|
|
297
|
-
type: "Attribute",
|
|
298
|
-
range: { start: _start, end },
|
|
299
|
-
prefix: _prefix,
|
|
300
|
-
local: _local,
|
|
301
|
-
value
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
if (open) {
|
|
306
|
-
if (s.config.rawTextElements != null) {
|
|
307
|
-
const qName = getQName(local, prefix);
|
|
308
|
-
if (s.config.rawTextElements.includes(qName)) {
|
|
309
|
-
parseContent(s, tokenCallback, `</${qName}>`);
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
parseContent(s, tokenCallback);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
function parseAttribute(s) {
|
|
317
|
-
const [prefix, local] = s.consumeQName();
|
|
318
|
-
let value;
|
|
319
|
-
const start = s.getPos();
|
|
320
|
-
s.skipSpaces();
|
|
321
|
-
if (s.tryConsumeCodeUnit(EQUALS)) {
|
|
322
|
-
s.skipSpaces();
|
|
323
|
-
const currCodeUnit = s.currCodeUnit();
|
|
324
|
-
if (currCodeUnit === SINGLE_QUOTE || currCodeUnit === DOUBLE_QUOTE) {
|
|
325
|
-
const quote = s.consumeQuote();
|
|
326
|
-
value = s.consumeCodeUnitsWhile((c) => c !== quote && c !== LESS_THAN);
|
|
327
|
-
s.consumeCodeUnit(quote);
|
|
328
|
-
} else if (!s.config.strictDocument) {
|
|
329
|
-
value = s.consumeCodeUnitsWhile(
|
|
330
|
-
(c) => !isXmlSpaceByte(c) && c !== GREATER_THAN && c !== SLASH && c !== LESS_THAN
|
|
331
|
-
);
|
|
332
|
-
} else {
|
|
333
|
-
throw new XmlError(
|
|
334
|
-
{ type: "InvalidChar", expected: "a quote", actual: currCodeUnit },
|
|
335
|
-
s.genTextPos()
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
} else if (!s.config.strictDocument) {
|
|
339
|
-
s.goTo(start);
|
|
340
|
-
value = "true";
|
|
341
|
-
} else {
|
|
342
|
-
throw new XmlError(
|
|
343
|
-
{ type: "InvalidChar", expected: EQUALS, actual: s.currCodeUnit() },
|
|
344
|
-
s.genTextPos()
|
|
345
|
-
);
|
|
346
|
-
}
|
|
347
|
-
return [prefix, local, value];
|
|
348
|
-
}
|
|
349
|
-
function parseContent(s, tokenCallback, parseContentUntil = LESS_THAN) {
|
|
350
|
-
while (!s.atEnd()) {
|
|
351
|
-
if (typeof parseContentUntil === "number" ? s.currCodeUnit() === parseContentUntil : s.startsWith(parseContentUntil)) {
|
|
352
|
-
const nextCodeUnit = s.nextCodeUnit();
|
|
353
|
-
if (nextCodeUnit === EXCLAMATION_MARK) {
|
|
354
|
-
if (s.startsWith(COMMENT_START)) {
|
|
355
|
-
parseComment(s, tokenCallback);
|
|
356
|
-
} else if (s.startsWith(CDATA_START)) {
|
|
357
|
-
parseCdata(s, tokenCallback);
|
|
358
|
-
} else {
|
|
359
|
-
throw new XmlError(
|
|
360
|
-
{ type: "UnknownToken", message: "Failed to parse content" },
|
|
361
|
-
s.genTextPos()
|
|
362
|
-
);
|
|
363
|
-
}
|
|
364
|
-
} else if (nextCodeUnit === QUESTION_MARK) {
|
|
365
|
-
parsePi(s, tokenCallback);
|
|
366
|
-
} else if (nextCodeUnit === SLASH) {
|
|
367
|
-
parseCloseElement(s, tokenCallback);
|
|
368
|
-
break;
|
|
369
|
-
} else {
|
|
370
|
-
parseElement(s, tokenCallback);
|
|
371
|
-
}
|
|
372
|
-
} else {
|
|
373
|
-
parseText(s, tokenCallback, parseContentUntil);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
function parseCdata(s, tokenCallback) {
|
|
378
|
-
const start = s.getPos();
|
|
379
|
-
s.advance(9);
|
|
380
|
-
const text = s.consumeCodeUnitsWhile(
|
|
381
|
-
(c, _s) => !(c === CLOSE_SQUARE_BRACKET && _s.startsWith(CDATA_END))
|
|
382
|
-
);
|
|
383
|
-
s.skipString(CDATA_END);
|
|
384
|
-
const range = s.rangeFrom(start);
|
|
385
|
-
tokenCallback({ type: "Cdata", text, range });
|
|
386
|
-
}
|
|
387
|
-
function parseCloseElement(s, tokenCallback) {
|
|
388
|
-
const start = s.getPos();
|
|
389
|
-
s.advance(2);
|
|
390
|
-
const [prefix, local] = s.consumeQName();
|
|
391
|
-
s.skipSpaces();
|
|
392
|
-
s.consumeCodeUnit(GREATER_THAN);
|
|
393
|
-
const range = s.rangeFrom(start);
|
|
394
|
-
tokenCallback({ type: "ElementEnd", end: { type: "Close", prefix, local }, range });
|
|
395
|
-
}
|
|
396
|
-
function parseText(s, tokenCallback, parseTextUntil = LESS_THAN) {
|
|
397
|
-
const start = s.getPos();
|
|
398
|
-
const text = typeof parseTextUntil === "number" ? s.consumeCodeUnitsWhile((c) => c !== parseTextUntil) : s.consumeCodeUnitsWhile((_, _s) => !_s.startsWith(parseTextUntil));
|
|
399
|
-
if (text.includes(CDATA_END)) {
|
|
400
|
-
throw new XmlError({ type: "InvalidCharacterData" }, s.genTextPos());
|
|
401
|
-
}
|
|
402
|
-
tokenCallback({ type: "Text", text, range: s.rangeFrom(start) });
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
export { tokenize, tokenizeXmlStream };
|
|
1
|
+
import{getQName as b}from"../get-q-name.js";import{LESS_THAN as d,GREATER_THAN as r,SLASH as f,EQUALS as T,SINGLE_QUOTE as k,DOUBLE_QUOTE as w,HYPHEN as B,QUESTION_MARK as W,OPEN_SQUARE_BRACKET as M,PERCENT as X,EXCLAMATION_MARK as H,UPPERCASE_S as Y,UPPERCASE_P as K,CLOSE_SQUARE_BRACKET as z}from"./ascii-constants.js";import{isXmlSpaceByte as q}from"./utils.js";import{XmlError as c}from"./XmlError.js";import{XmlStream as G}from"./XmlStream.js";const $="\uFEFF",P="<?xml ",y="?>",j="<!ENTITY",J="<!ELEMENT",V="<!ATTLIST",Z="<!NOTATION",x="<!DOCTYPE",v="<?",N="?>",h="<!--",A="-->",tt="<![CDATA[",g="]]>",nt="NDATA",I="PUBLIC",st="SYSTEM",ot="version",et="encoding",it="standalone";function at(t,n,s={}){D(new G(t,s),n)}function D(t,n){if(t.startsWith($)&&t.advance(1),t.startsWith(P)&&ct(t),l(t,n),t.skipSpaces(),t.startsWith(x)||t.startsWith(x.toLowerCase())){if(!t.config.allowDtd)throw new c({type:"DtdDetected"});rt(t,n),l(t,n)}if(t.skipSpaces(),t.config.strictDocument){if(!t.atEnd()&&t.currCodeUnit()===d&&U(t,n),l(t,n),!t.atEnd())throw new c({type:"UnknownToken",message:"Not at end"},t.genTextPos())}else for(;!t.atEnd();)t.currCodeUnit()===d?U(t,n):L(t,n),l(t,n)}function l(t,n){for(;!t.atEnd();)if(t.skipSpaces(),t.startsWith(h))C(t,n);else if(t.startsWith(v))S(t,n);else break}function ct(t){function n(s){if(s.startsWithSpace())s.skipSpaces();else if(!s.startsWith(y)&&!s.atEnd())throw new c({type:"InvalidChar",expected:"a whitespace",actual:s.currCodeUnitUnchecked()},s.genTextPos())}if(t.advance(5),n(t),!t.startsWith(ot))throw new c({type:"InvalidString",expected:"version"},t.genTextPos());m(t),n(t),t.startsWith(et)&&(m(t),n(t)),t.startsWith(it)&&m(t),t.skipSpaces(),t.skipString(y)}function C(t,n){const s=t.getPos();t.advance(4);const o=t.consumeCodeUnitsWhile((e,i)=>!(e===B&&i.startsWith(A)));if(t.skipString(A),o.includes("--")||o.endsWith("-"))throw new c({type:"InvalidComment"},t.genTextPosFrom(s));n({type:"Comment",text:o,range:t.rangeFrom(s)},t)}function S(t,n){if(t.startsWith(P))throw new c({type:"UnexpectedDeclaration"},t.genTextPos());const s=t.getPos();t.advance(2);const o=t.consumeName();t.skipSpaces();const e=t.consumeCodeUnitsWhile((i,a)=>!(i===W&&a.startsWith(N)));t.skipString(N),n({type:"ProcessingInstruction",target:o,content:e.length===0?void 0:e,range:t.rangeFrom(s)},t)}function rt(t,n){const s=t.getPos();if(pt(t),t.skipSpaces(),t.currCodeUnit()===r){t.advance(1);return}for(t.advance(1);!t.atEnd();)if(t.skipSpaces(),t.startsWith(j))dt(t,n);else if(t.startsWith(h))C(t,n);else if(t.startsWith(v))S(t,n);else if(t.startsWith("]"))if(t.advance(1),t.skipSpaces(),t.currCodeUnit()===r){t.advance(1);break}else throw new c({type:"InvalidChar",expected:"'>'",actual:t.currCodeUnitUnchecked()},t.genTextPos());else if(t.startsWith(J)||t.startsWith(V)||t.startsWith(Z))try{lt(t)}catch(o){throw new c({type:"UnknownToken",message:"Failed to consume declaration"},t.genTextPosFrom(s))}else throw new c({type:"UnknownToken",message:"Failed to parse doctype"},t.genTextPos())}function pt(t){t.advance(9),t.consumeSpaces(),t.skipName(),t.skipSpaces(),F(t),t.skipSpaces();const n=t.currCodeUnit();if(n!==M&&n!==r)throw new c({type:"InvalidChar",expected:"'[' or '>'",actual:n},t.genTextPos())}function F(t){if(t.startsWith(st)||t.startsWith(I)){const n=t.getPos();t.advance(6);const s=t.sliceBack(n);t.consumeSpaces();const o=t.consumeQuote();if(t.consumeCodeUnitsWhile(e=>e!==o),t.consumeCodeUnit(o),s===I){t.consumeSpaces();const e=t.consumeQuote();t.consumeCodeUnitsWhile(i=>i!==e),t.consumeCodeUnit(e)}return!0}return!1}function dt(t,n){t.advance(8),t.consumeSpaces();const s=!t.tryConsumeCodeUnit(X);s||t.consumeSpaces();const o=t.consumeName();t.consumeSpaces();const e=ut(t,s);e!==null&&n({type:"EntityDeclaration",name:o,definition:e},t),t.skipSpaces(),t.consumeCodeUnit(r)}function ut(t,n){const s=t.currCodeUnit();if(s===w||s===k){const o=t.consumeQuote(),e=t.getPos();t.skipCodeUnitsWhile(a=>a!==o);const i=t.sliceBack(e);return t.consumeCodeUnit(o),i}else if(s===Y||s===K){if(F(t))return n&&(t.skipSpaces(),t.startsWith(nt)&&(t.advance(5),t.consumeSpaces(),t.skipName())),null;throw new c({type:"InvalidExternalID"},t.genTextPos())}else throw new c({type:"InvalidChar",expected:"a quote, SYSTEM or PUBLIC",actual:s},t.genTextPos())}function lt(t){t.skipCodeUnitsWhile(n=>n!==r),t.consumeCodeUnit(r)}function U(t,n){const s=t.getPos();t.advance(1);const[o,e]=t.consumeQName();n({type:"ElementStart",prefix:o,local:e,start:s},t);let i=!1;for(;!t.atEnd();){const a=t.startsWithSpace();t.skipSpaces();const p=t.getPos(),E=t.currCodeUnit();if(E===f){t.advance(1),t.consumeCodeUnit(r);const u=t.rangeFrom(p);n({type:"ElementEnd",end:{type:"Empty"},range:u},t);break}else if(E===r){t.advance(1);const u=t.rangeFrom(p);n({type:"ElementEnd",end:{type:"Open"},range:u},t),i=!0;break}else{if(!a)throw new c({type:"InvalidChar",expected:"a whitespace",actual:t.currCodeUnitUnchecked()},t.genTextPos());const[u,_,O]=m(t),R=t.getPos();n({type:"Attribute",range:{start:p,end:R},prefix:u,local:_,value:O},t)}}if(i){if(t.config.rawTextElements!=null){const a=b(e,o);if(t.config.rawTextElements.includes(a)){Q(t,n,`</${a}>`);return}}Q(t,n)}}function m(t){const[n,s]=t.consumeQName();let o;const e=t.getPos();if(t.skipSpaces(),t.tryConsumeCodeUnit(T)){t.skipSpaces();const i=t.currCodeUnit();if(i===k||i===w){const a=t.consumeQuote();o=t.consumeCodeUnitsWhile(p=>p!==a&&p!==d),t.consumeCodeUnit(a)}else if(!t.config.strictDocument)o=t.consumeCodeUnitsWhile(a=>!q(a)&&a!==r&&a!==f&&a!==d);else throw new c({type:"InvalidChar",expected:"a quote",actual:i},t.genTextPos())}else if(!t.config.strictDocument)t.goTo(e),o="true";else throw new c({type:"InvalidChar",expected:T,actual:t.currCodeUnit()},t.genTextPos());return[n,s,o]}function Q(t,n,s=d){for(;!t.atEnd();)if(typeof s=="number"?t.currCodeUnit()===s:t.startsWith(s)){const o=t.nextCodeUnit();if(o===H)if(t.startsWith(h))C(t,n);else if(t.startsWith(tt))mt(t,n);else throw new c({type:"UnknownToken",message:"Failed to parse content"},t.genTextPos());else if(o===W)S(t,n);else if(o===f){ft(t,n);break}else U(t,n)}else L(t,n,s)}function mt(t,n){const s=t.getPos();t.advance(9);const o=t.consumeCodeUnitsWhile((i,a)=>!(i===z&&a.startsWith(g)));t.skipString(g);const e=t.rangeFrom(s);n({type:"Cdata",text:o,range:e},t)}function ft(t,n){const s=t.getPos();t.advance(2);const[o,e]=t.consumeQName();t.skipSpaces(),t.consumeCodeUnit(r);const i=t.rangeFrom(s);n({type:"ElementEnd",end:{type:"Close",prefix:o,local:e},range:i},t)}function L(t,n,s=d){const o=t.getPos(),e=typeof s=="number"?t.consumeCodeUnitsWhile(i=>i!==s):t.consumeCodeUnitsWhile((i,a)=>!a.startsWith(s));if(e.includes(g))throw new c({type:"InvalidCharacterData"},t.genTextPos());n({type:"Text",text:e,range:t.rangeFrom(o)},t)}export{at as tokenize,D as tokenizeXmlStream};
|
|
@@ -1,40 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
function isAsciiDigit(byte) {
|
|
4
|
-
return byte >= ZERO && byte <= NINE;
|
|
5
|
-
}
|
|
6
|
-
function isXmlNameStart(codePoint) {
|
|
7
|
-
if (codePoint == null) {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
if (codePoint <= 128) {
|
|
11
|
-
return codePoint >= UPPERCASE_A && codePoint <= UPPERCASE_Z || codePoint >= LOWERCASE_A && codePoint <= LOWERCASE_Z || codePoint === COLON || codePoint === UNDERSCORE;
|
|
12
|
-
}
|
|
13
|
-
return codePoint >= 192 && codePoint <= 214 || codePoint >= 216 && codePoint <= 246 || codePoint >= 248 && codePoint <= 767 || codePoint >= 880 && codePoint <= 893 || codePoint >= 895 && codePoint <= 8191 || codePoint >= 8204 && codePoint <= 8205 || codePoint >= 8304 && codePoint <= 8591 || codePoint >= 11264 && codePoint <= 12271 || codePoint >= 12289 && codePoint <= 55295 || codePoint >= 63744 && codePoint <= 64975 || codePoint >= 65008 && codePoint <= 65533 || codePoint >= 65536 && codePoint <= 983039;
|
|
14
|
-
}
|
|
15
|
-
function isXmlName(codePoint) {
|
|
16
|
-
if (codePoint == null) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
if (codePoint <= 128) {
|
|
20
|
-
return isXmlNameByte(codePoint);
|
|
21
|
-
}
|
|
22
|
-
return codePoint === 183 || codePoint >= 192 && codePoint <= 214 || codePoint >= 216 && codePoint <= 246 || codePoint >= 248 && codePoint <= 767 || codePoint >= 768 && codePoint <= 879 || codePoint >= 880 && codePoint <= 893 || codePoint >= 895 && codePoint <= 8191 || codePoint >= 8204 && codePoint <= 8205 || codePoint >= 8255 && codePoint <= 8256 || codePoint >= 8304 && codePoint <= 8591 || codePoint >= 11264 && codePoint <= 12271 || codePoint >= 12289 && codePoint <= 55295 || codePoint >= 63744 && codePoint <= 64975 || codePoint >= 65008 && codePoint <= 65533 || codePoint >= 65536 && codePoint <= 983039;
|
|
23
|
-
}
|
|
24
|
-
function isXmlChar(codePoint) {
|
|
25
|
-
if (codePoint == null) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
if (codePoint < 32) {
|
|
29
|
-
return isXmlSpaceByte(codePoint);
|
|
30
|
-
}
|
|
31
|
-
return codePoint !== 65535 && codePoint !== 65534;
|
|
32
|
-
}
|
|
33
|
-
function isXmlSpaceByte(byte) {
|
|
34
|
-
return byte === SPACE || byte === HORIZONTAL_TAB || byte === LINE_FEED || byte === CARRIAGE_RETURN;
|
|
35
|
-
}
|
|
36
|
-
function isXmlNameByte(byte) {
|
|
37
|
-
return byte >= ZERO && byte <= NINE || byte >= UPPERCASE_A && byte <= UPPERCASE_Z || byte >= LOWERCASE_A && byte <= LOWERCASE_Z || byte === COLON || byte === UNDERSCORE || byte === HYPHEN || byte === PERIOD;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { isAsciiDigit, isXmlChar, isXmlName, isXmlNameByte, isXmlNameStart, isXmlSpaceByte };
|
|
1
|
+
import{ZERO as E,NINE as t,UPPERCASE_A as i,UPPERCASE_Z as r,LOWERCASE_A as e,LOWERCASE_Z as u,COLON as l,UNDERSCORE as R,SPACE as m,HORIZONTAL_TAB as s,LINE_FEED as a,CARRIAGE_RETURN as o,HYPHEN as C,PERIOD as O}from"./ascii-constants.js";function c(n){return n>=E&&n<=t}function S(n){return n==null?!1:n<=128?n>=i&&n<=r||n>=e&&n<=u||n===l||n===R:n>=192&&n<=214||n>=216&&n<=246||n>=248&&n<=767||n>=880&&n<=893||n>=895&&n<=8191||n>=8204&&n<=8205||n>=8304&&n<=8591||n>=11264&&n<=12271||n>=12289&&n<=55295||n>=63744&&n<=64975||n>=65008&&n<=65533||n>=65536&&n<=983039}function P(n){return n==null?!1:n<=128?N(n):n===183||n>=192&&n<=214||n>=216&&n<=246||n>=248&&n<=767||n>=768&&n<=879||n>=880&&n<=893||n>=895&&n<=8191||n>=8204&&n<=8205||n>=8255&&n<=8256||n>=8304&&n<=8591||n>=11264&&n<=12271||n>=12289&&n<=55295||n>=63744&&n<=64975||n>=65008&&n<=65533||n>=65536&&n<=983039}function _(n){return n==null?!1:n<32?A(n):n!==65535&&n!==65534}function A(n){return n===m||n===s||n===a||n===o}function N(n){return n>=E&&n<=t||n>=i&&n<=r||n>=e&&n<=u||n===l||n===R||n===C||n===O}export{c as isAsciiDigit,_ as isXmlChar,P as isXmlName,N as isXmlNameByte,S as isXmlNameStart,A as isXmlSpaceByte};
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
function tokensToXml(tokens) {
|
|
4
|
-
let xmlString = "";
|
|
5
|
-
tokens.forEach((token) => {
|
|
6
|
-
xmlString += tokenToXml(token);
|
|
7
|
-
});
|
|
8
|
-
return xmlString;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export { tokensToXml };
|
|
1
|
+
import{tokenToXml as e}from"./token-to-xml.js";function n(t){let o="";return t.forEach(r=>{o+=e(r)}),o}export{n as tokensToXml};
|
|
@@ -1,66 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
function xmlToObject(xmlString, options = {}) {
|
|
4
|
-
const root = {
|
|
5
|
-
local: "root",
|
|
6
|
-
attributes: [],
|
|
7
|
-
content: []
|
|
8
|
-
};
|
|
9
|
-
const stack = [root];
|
|
10
|
-
tokenize(
|
|
11
|
-
xmlString,
|
|
12
|
-
(token) => {
|
|
13
|
-
processTokenForObject(token, stack);
|
|
14
|
-
},
|
|
15
|
-
options
|
|
16
|
-
);
|
|
17
|
-
return root.content[0];
|
|
18
|
-
}
|
|
19
|
-
function processTokenForObject(token, stack) {
|
|
20
|
-
switch (token.type) {
|
|
21
|
-
case "ElementStart": {
|
|
22
|
-
const newNode = {
|
|
23
|
-
local: token.local,
|
|
24
|
-
prefix: token.prefix.length > 0 ? token.prefix : void 0,
|
|
25
|
-
attributes: [],
|
|
26
|
-
content: []
|
|
27
|
-
};
|
|
28
|
-
const currentNode = stack[stack.length - 1];
|
|
29
|
-
if (currentNode != null) {
|
|
30
|
-
currentNode.content.push(newNode);
|
|
31
|
-
}
|
|
32
|
-
stack.push(newNode);
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
case "ElementEnd": {
|
|
36
|
-
if (token.end.type === "Close" || token.end.type === "Empty") {
|
|
37
|
-
stack.pop();
|
|
38
|
-
}
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
case "Attribute": {
|
|
42
|
-
const currentNode = stack[stack.length - 1];
|
|
43
|
-
if (currentNode != null) {
|
|
44
|
-
currentNode.attributes.push({
|
|
45
|
-
local: token.local,
|
|
46
|
-
prefix: token.prefix.length > 0 ? token.prefix : void 0,
|
|
47
|
-
value: token.value
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
case "Text":
|
|
53
|
-
case "Cdata": {
|
|
54
|
-
const currentNode = stack[stack.length - 1];
|
|
55
|
-
if (currentNode != null) {
|
|
56
|
-
const trimmedText = token.text.trim();
|
|
57
|
-
if (trimmedText.length > 0) {
|
|
58
|
-
currentNode.content.push(token.text);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export { processTokenForObject, xmlToObject };
|
|
1
|
+
import{tokenize as c}from"./tokenizer/tokenize.js";function a(t,o={}){const e={local:"root",attributes:[],content:[]},l=[e];return c(t,r=>{n(r,l)},o),e.content[0]}function n(t,o){switch(t.type){case"ElementStart":{const e={local:t.local,prefix:t.prefix.length>0?t.prefix:void 0,attributes:[],content:[]},l=o[o.length-1];l!=null&&l.content.push(e),o.push(e);break}case"ElementEnd":{(t.end.type==="Close"||t.end.type==="Empty")&&o.pop();break}case"Attribute":{const e=o[o.length-1];e!=null&&e.attributes.push({local:t.local,prefix:t.prefix.length>0?t.prefix:void 0,value:t.value});break}case"Text":case"Cdata":{const e=o[o.length-1];e!=null&&t.text.trim().length>0&&e.content.push(t.text);break}}}export{n as processTokenForObject,a as xmlToObject};
|
|
@@ -1,83 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { tokenize } from './tokenizer/tokenize.js';
|
|
3
|
-
|
|
4
|
-
function xmlToSimplifiedObject(xmlString, options = {}) {
|
|
5
|
-
const result = {};
|
|
6
|
-
const stack = [result];
|
|
7
|
-
tokenize(
|
|
8
|
-
xmlString,
|
|
9
|
-
(token) => {
|
|
10
|
-
processTokenForSimplifiedObject(token, stack);
|
|
11
|
-
},
|
|
12
|
-
options
|
|
13
|
-
);
|
|
14
|
-
return result;
|
|
15
|
-
}
|
|
16
|
-
function processTokenForSimplifiedObject(token, stack) {
|
|
17
|
-
switch (token.type) {
|
|
18
|
-
case "ElementStart": {
|
|
19
|
-
const tagName = getQName(token.local, token.prefix);
|
|
20
|
-
const tagNameWithPrefix = `_${tagName}`;
|
|
21
|
-
const newNode = {};
|
|
22
|
-
const currentNode = stack[stack.length - 1];
|
|
23
|
-
if (currentNode != null) {
|
|
24
|
-
if (currentNode.content != null) {
|
|
25
|
-
newNode.tag = tagName;
|
|
26
|
-
currentNode.content.push(newNode);
|
|
27
|
-
} else if (currentNode.text != null) {
|
|
28
|
-
newNode.tag = tagName;
|
|
29
|
-
currentNode.content = [currentNode.text, newNode];
|
|
30
|
-
delete currentNode.text;
|
|
31
|
-
} else if (currentNode[tagNameWithPrefix] == null) {
|
|
32
|
-
currentNode[tagNameWithPrefix] = [newNode];
|
|
33
|
-
} else if (Array.isArray(currentNode[tagNameWithPrefix])) {
|
|
34
|
-
currentNode[tagNameWithPrefix].push(newNode);
|
|
35
|
-
} else {
|
|
36
|
-
currentNode[tagNameWithPrefix] = [currentNode[tagNameWithPrefix], newNode];
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
stack.push(newNode);
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
case "ElementEnd": {
|
|
43
|
-
if (token.end.type === "Close" || token.end.type === "Empty") {
|
|
44
|
-
stack.pop();
|
|
45
|
-
}
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
case "Attribute": {
|
|
49
|
-
const currentNode = stack[stack.length - 1];
|
|
50
|
-
if (currentNode != null) {
|
|
51
|
-
const attrName = getQName(token.local, token.prefix);
|
|
52
|
-
if (currentNode.attributes != null) {
|
|
53
|
-
currentNode.attributes[attrName] = token.value;
|
|
54
|
-
} else {
|
|
55
|
-
currentNode.attributes = {
|
|
56
|
-
[attrName]: token.value
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case "Text":
|
|
63
|
-
case "Cdata": {
|
|
64
|
-
const currentNode = stack[stack.length - 1];
|
|
65
|
-
if (currentNode != null) {
|
|
66
|
-
const trimmedText = token.text.trim();
|
|
67
|
-
if (trimmedText.length > 0) {
|
|
68
|
-
if (currentNode.content != null) {
|
|
69
|
-
currentNode.content.push(trimmedText);
|
|
70
|
-
} else if (currentNode.text != null) {
|
|
71
|
-
currentNode.content = [currentNode.text, trimmedText];
|
|
72
|
-
delete currentNode.text;
|
|
73
|
-
} else {
|
|
74
|
-
currentNode.text = trimmedText;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export { processTokenForSimplifiedObject, xmlToSimplifiedObject };
|
|
1
|
+
import{getQName as c}from"./get-q-name.js";import{tokenize as i}from"./tokenizer/tokenize.js";function s(o,l={}){const t={},e=[t];return i(o,r=>{a(r,e)},l),t}function a(o,l){switch(o.type){case"ElementStart":{const t=c(o.local,o.prefix),e=`_${t}`,r={},n=l[l.length-1];n!=null&&(n.content!=null?(r.tag=t,n.content.push(r)):n.text!=null?(r.tag=t,n.content=[n.text,r],delete n.text):n[e]==null?n[e]=[r]:Array.isArray(n[e])?n[e].push(r):n[e]=[n[e],r]),l.push(r);break}case"ElementEnd":{(o.end.type==="Close"||o.end.type==="Empty")&&l.pop();break}case"Attribute":{const t=l[l.length-1];if(t!=null){const e=c(o.local,o.prefix);t.attributes!=null?t.attributes[e]=o.value:t.attributes={[e]:o.value}}break}case"Text":case"Cdata":{const t=l[l.length-1];if(t!=null){const e=o.text.trim();e.length>0&&(t.content!=null?t.content.push(e):t.text!=null?(t.content=[t.text,e],delete t.text):t.text=e)}break}}}export{a as processTokenForSimplifiedObject,s as xmlToSimplifiedObject};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import { TXmlStreamOptions } from '../tokenizer';
|
|
2
2
|
import { type TSelectedTokenCallback, type TTokenSelectPath } from './types';
|
|
3
3
|
export declare function select(xml: string, tokenSelectPaths: TTokenSelectPath[], callback: TSelectedTokenCallback, options?: TXmlStreamOptions): void;
|
|
4
|
-
//# sourceMappingURL=select.d.ts.map
|