xml-tokenizer 0.0.31 → 0.0.32
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/config.js +43 -1
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/get-q-name.js +8 -1
- package/dist/cjs/get-q-name.js.map +1 -0
- package/dist/cjs/index.js +80 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/selector/TokenSelectState.js +107 -1
- package/dist/cjs/selector/TokenSelectState.js.map +1 -0
- package/dist/cjs/selector/TokenSelectStateMachine.js +151 -1
- package/dist/cjs/selector/TokenSelectStateMachine.js.map +1 -0
- package/dist/cjs/selector/TokenSelector.js +140 -1
- package/dist/cjs/selector/TokenSelector.js.map +1 -0
- package/dist/cjs/selector/match-string.js +22 -1
- package/dist/cjs/selector/match-string.js.map +1 -0
- package/dist/cjs/selector/select.js +20 -1
- package/dist/cjs/selector/select.js.map +1 -0
- package/dist/cjs/token-to-xml.js +45 -1
- package/dist/cjs/token-to-xml.js.map +1 -0
- package/dist/cjs/tokenizer/XmlError.js +97 -1
- package/dist/cjs/tokenizer/XmlError.js.map +1 -0
- package/dist/cjs/tokenizer/XmlStream.js +479 -1
- package/dist/cjs/tokenizer/XmlStream.js.map +1 -0
- package/dist/cjs/tokenizer/ascii-constants.js +70 -1
- package/dist/cjs/tokenizer/ascii-constants.js.map +1 -0
- package/dist/cjs/tokenizer/tokenize.js +420 -1
- package/dist/cjs/tokenizer/tokenize.js.map +1 -0
- package/dist/cjs/tokenizer/utils.js +48 -1
- package/dist/cjs/tokenizer/utils.js.map +1 -0
- package/dist/cjs/tokens-to-xml.js +14 -1
- package/dist/cjs/tokens-to-xml.js.map +1 -0
- package/dist/cjs/xml-to-object.js +70 -1
- package/dist/cjs/xml-to-object.js.map +1 -0
- package/dist/cjs/xml-to-simplified-object.js +87 -1
- package/dist/cjs/xml-to-simplified-object.js.map +1 -0
- package/dist/esm/config.js +39 -1
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/get-q-name.js +6 -1
- package/dist/esm/get-q-name.js.map +1 -0
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/selector/TokenSelectState.js +103 -1
- package/dist/esm/selector/TokenSelectState.js.map +1 -0
- package/dist/esm/selector/TokenSelectStateMachine.js +149 -1
- package/dist/esm/selector/TokenSelectStateMachine.js.map +1 -0
- package/dist/esm/selector/TokenSelector.js +138 -1
- package/dist/esm/selector/TokenSelector.js.map +1 -0
- package/dist/esm/selector/match-string.js +20 -1
- package/dist/esm/selector/match-string.js.map +1 -0
- package/dist/esm/selector/select.js +18 -1
- package/dist/esm/selector/select.js.map +1 -0
- package/dist/esm/token-to-xml.js +43 -1
- package/dist/esm/token-to-xml.js.map +1 -0
- package/dist/esm/tokenizer/XmlError.js +95 -1
- package/dist/esm/tokenizer/XmlError.js.map +1 -0
- package/dist/esm/tokenizer/XmlStream.js +477 -1
- package/dist/esm/tokenizer/XmlStream.js.map +1 -0
- package/dist/esm/tokenizer/ascii-constants.js +36 -1
- package/dist/esm/tokenizer/ascii-constants.js.map +1 -0
- package/dist/esm/tokenizer/tokenize.js +417 -1
- package/dist/esm/tokenizer/tokenize.js.map +1 -0
- package/dist/esm/tokenizer/utils.js +41 -1
- package/dist/esm/tokenizer/utils.js.map +1 -0
- package/dist/esm/tokens-to-xml.js +12 -1
- package/dist/esm/tokens-to-xml.js.map +1 -0
- package/dist/esm/xml-to-object.js +67 -1
- package/dist/esm/xml-to-object.js.map +1 -0
- package/dist/esm/xml-to-simplified-object.js +84 -1
- package/dist/esm/xml-to-simplified-object.js.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/get-q-name.d.ts +1 -0
- package/dist/types/get-q-name.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/selector/TokenSelectState.d.ts +1 -0
- package/dist/types/selector/TokenSelectState.d.ts.map +1 -0
- package/dist/types/selector/TokenSelectStateMachine.d.ts +1 -0
- package/dist/types/selector/TokenSelectStateMachine.d.ts.map +1 -0
- package/dist/types/selector/TokenSelector.d.ts +1 -0
- package/dist/types/selector/TokenSelector.d.ts.map +1 -0
- package/dist/types/selector/index.d.ts +1 -0
- package/dist/types/selector/index.d.ts.map +1 -0
- package/dist/types/selector/match-string.d.ts +1 -0
- package/dist/types/selector/match-string.d.ts.map +1 -0
- package/dist/types/selector/select.d.ts +1 -0
- package/dist/types/selector/select.d.ts.map +1 -0
- package/dist/types/selector/types.d.ts +1 -0
- package/dist/types/selector/types.d.ts.map +1 -0
- package/dist/types/token-to-xml.d.ts +1 -0
- package/dist/types/token-to-xml.d.ts.map +1 -0
- package/dist/types/tokenizer/XmlError.d.ts +1 -0
- package/dist/types/tokenizer/XmlError.d.ts.map +1 -0
- package/dist/types/tokenizer/XmlStream.d.ts +1 -0
- package/dist/types/tokenizer/XmlStream.d.ts.map +1 -0
- package/dist/types/tokenizer/ascii-constants.d.ts +1 -0
- package/dist/types/tokenizer/ascii-constants.d.ts.map +1 -0
- package/dist/types/tokenizer/index.d.ts +1 -0
- package/dist/types/tokenizer/index.d.ts.map +1 -0
- package/dist/types/tokenizer/tokenize.d.ts +1 -0
- package/dist/types/tokenizer/tokenize.d.ts.map +1 -0
- package/dist/types/tokenizer/types.d.ts +1 -0
- package/dist/types/tokenizer/types.d.ts.map +1 -0
- package/dist/types/tokenizer/utils.d.ts +1 -0
- package/dist/types/tokenizer/utils.d.ts.map +1 -0
- package/dist/types/tokens-to-xml.d.ts +1 -0
- package/dist/types/tokens-to-xml.d.ts.map +1 -0
- package/dist/types/xml-to-object.d.ts +1 -0
- package/dist/types/xml-to-object.d.ts.map +1 -0
- package/dist/types/xml-to-simplified-object.d.ts +1 -0
- package/dist/types/xml-to-simplified-object.d.ts.map +1 -0
- package/package.json +6 -5
|
@@ -1 +1,417 @@
|
|
|
1
|
-
import{getQName
|
|
1
|
+
import { getQName } from '../get-q-name.js';
|
|
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) }, s);
|
|
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
|
+
{
|
|
130
|
+
type: "ProcessingInstruction",
|
|
131
|
+
target,
|
|
132
|
+
content: content.length === 0 ? void 0 : content,
|
|
133
|
+
range: s.rangeFrom(start)
|
|
134
|
+
},
|
|
135
|
+
s
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
function parseDoctype(s, tokenCallback) {
|
|
139
|
+
const start = s.getPos();
|
|
140
|
+
parseDoctypeStart(s);
|
|
141
|
+
s.skipSpaces();
|
|
142
|
+
if (s.currCodeUnit() === GREATER_THAN) {
|
|
143
|
+
s.advance(1);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
s.advance(1);
|
|
147
|
+
while (!s.atEnd()) {
|
|
148
|
+
s.skipSpaces();
|
|
149
|
+
if (s.startsWith(ENTITY_DECLARATION_START)) {
|
|
150
|
+
parseEntityDecl(s, tokenCallback);
|
|
151
|
+
} else if (s.startsWith(COMMENT_START)) {
|
|
152
|
+
parseComment(s, tokenCallback);
|
|
153
|
+
} else if (s.startsWith(PI_START)) {
|
|
154
|
+
parsePi(s, tokenCallback);
|
|
155
|
+
} else if (s.startsWith("]")) {
|
|
156
|
+
s.advance(1);
|
|
157
|
+
s.skipSpaces();
|
|
158
|
+
if (s.currCodeUnit() === GREATER_THAN) {
|
|
159
|
+
s.advance(1);
|
|
160
|
+
break;
|
|
161
|
+
} else {
|
|
162
|
+
throw new XmlError(
|
|
163
|
+
{ type: "InvalidChar", expected: "'>'", actual: s.currCodeUnitUnchecked() },
|
|
164
|
+
s.genTextPos()
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
} else if (s.startsWith(ELEMENT_DECLARATION_START) || s.startsWith(ATTLIST_DECLARATION_START) || s.startsWith(NOTATION_DECLARATION_START)) {
|
|
168
|
+
try {
|
|
169
|
+
consumeDecl(s);
|
|
170
|
+
} catch (e) {
|
|
171
|
+
throw new XmlError(
|
|
172
|
+
{ type: "UnknownToken", message: "Failed to consume declaration" },
|
|
173
|
+
s.genTextPosFrom(start)
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
throw new XmlError(
|
|
178
|
+
{ type: "UnknownToken", message: "Failed to parse doctype" },
|
|
179
|
+
s.genTextPos()
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function parseDoctypeStart(s) {
|
|
185
|
+
s.advance(9);
|
|
186
|
+
s.consumeSpaces();
|
|
187
|
+
s.skipName();
|
|
188
|
+
s.skipSpaces();
|
|
189
|
+
parseExternalId(s);
|
|
190
|
+
s.skipSpaces();
|
|
191
|
+
const currCodeUnit = s.currCodeUnit();
|
|
192
|
+
if (currCodeUnit !== OPEN_SQUARE_BRACKET && currCodeUnit !== GREATER_THAN) {
|
|
193
|
+
throw new XmlError(
|
|
194
|
+
{ type: "InvalidChar", expected: "'[' or '>'", actual: currCodeUnit },
|
|
195
|
+
s.genTextPos()
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function parseExternalId(s) {
|
|
200
|
+
if (s.startsWith(SYSTEM) || s.startsWith(PUBLIC)) {
|
|
201
|
+
const start = s.getPos();
|
|
202
|
+
s.advance(6);
|
|
203
|
+
const id = s.sliceBack(start);
|
|
204
|
+
s.consumeSpaces();
|
|
205
|
+
const quote = s.consumeQuote();
|
|
206
|
+
s.consumeCodeUnitsWhile((c) => c !== quote);
|
|
207
|
+
s.consumeCodeUnit(quote);
|
|
208
|
+
if (id === PUBLIC) {
|
|
209
|
+
s.consumeSpaces();
|
|
210
|
+
const _quote = s.consumeQuote();
|
|
211
|
+
s.consumeCodeUnitsWhile((c) => c !== _quote);
|
|
212
|
+
s.consumeCodeUnit(_quote);
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
function parseEntityDecl(s, tokenCallback) {
|
|
219
|
+
s.advance(8);
|
|
220
|
+
s.consumeSpaces();
|
|
221
|
+
const isGe = !s.tryConsumeCodeUnit(PERCENT);
|
|
222
|
+
if (!isGe) {
|
|
223
|
+
s.consumeSpaces();
|
|
224
|
+
}
|
|
225
|
+
const name = s.consumeName();
|
|
226
|
+
s.consumeSpaces();
|
|
227
|
+
const definition = parseEntityDef(s, isGe);
|
|
228
|
+
if (definition !== null) {
|
|
229
|
+
tokenCallback({ type: "EntityDeclaration", name, definition }, s);
|
|
230
|
+
}
|
|
231
|
+
s.skipSpaces();
|
|
232
|
+
s.consumeCodeUnit(GREATER_THAN);
|
|
233
|
+
}
|
|
234
|
+
function parseEntityDef(s, isGe) {
|
|
235
|
+
const currCodeUnit = s.currCodeUnit();
|
|
236
|
+
if (currCodeUnit === DOUBLE_QUOTE || currCodeUnit === SINGLE_QUOTE) {
|
|
237
|
+
const quote = s.consumeQuote();
|
|
238
|
+
const start = s.getPos();
|
|
239
|
+
s.skipCodeUnitsWhile((c) => c !== quote);
|
|
240
|
+
const value = s.sliceBack(start);
|
|
241
|
+
s.consumeCodeUnit(quote);
|
|
242
|
+
return value;
|
|
243
|
+
} else if (currCodeUnit === UPPERCASE_S || currCodeUnit === UPPERCASE_P) {
|
|
244
|
+
if (parseExternalId(s)) {
|
|
245
|
+
if (isGe) {
|
|
246
|
+
s.skipSpaces();
|
|
247
|
+
if (s.startsWith(NDATA)) {
|
|
248
|
+
s.advance(5);
|
|
249
|
+
s.consumeSpaces();
|
|
250
|
+
s.skipName();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
throw new XmlError({ type: "InvalidExternalID" }, s.genTextPos());
|
|
256
|
+
} else {
|
|
257
|
+
throw new XmlError(
|
|
258
|
+
{ type: "InvalidChar", expected: "a quote, SYSTEM or PUBLIC", actual: currCodeUnit },
|
|
259
|
+
s.genTextPos()
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function consumeDecl(s) {
|
|
264
|
+
s.skipCodeUnitsWhile((c) => c !== GREATER_THAN);
|
|
265
|
+
s.consumeCodeUnit(GREATER_THAN);
|
|
266
|
+
}
|
|
267
|
+
function parseElement(s, tokenCallback) {
|
|
268
|
+
const start = s.getPos();
|
|
269
|
+
s.advance(1);
|
|
270
|
+
const [prefix, local] = s.consumeQName();
|
|
271
|
+
tokenCallback({ type: "ElementStart", prefix, local, start }, s);
|
|
272
|
+
let open = false;
|
|
273
|
+
while (!s.atEnd()) {
|
|
274
|
+
const hasSpace = s.startsWithSpace();
|
|
275
|
+
s.skipSpaces();
|
|
276
|
+
const _start = s.getPos();
|
|
277
|
+
const currCodeUnit = s.currCodeUnit();
|
|
278
|
+
if (currCodeUnit === SLASH) {
|
|
279
|
+
s.advance(1);
|
|
280
|
+
s.consumeCodeUnit(GREATER_THAN);
|
|
281
|
+
const range = s.rangeFrom(_start);
|
|
282
|
+
tokenCallback({ type: "ElementEnd", end: { type: "Empty" }, range }, s);
|
|
283
|
+
break;
|
|
284
|
+
} else if (currCodeUnit === GREATER_THAN) {
|
|
285
|
+
s.advance(1);
|
|
286
|
+
const range = s.rangeFrom(_start);
|
|
287
|
+
if (s.config.implicitSelfClosingElements != null && s.config.implicitSelfClosingElements.includes(getQName(local, prefix))) {
|
|
288
|
+
tokenCallback({ type: "ElementEnd", end: { type: "Empty" }, range }, s);
|
|
289
|
+
break;
|
|
290
|
+
} else {
|
|
291
|
+
tokenCallback({ type: "ElementEnd", end: { type: "Open" }, range }, s);
|
|
292
|
+
open = true;
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
if (!hasSpace) {
|
|
297
|
+
throw new XmlError(
|
|
298
|
+
{ type: "InvalidChar", expected: "a whitespace", actual: s.currCodeUnitUnchecked() },
|
|
299
|
+
s.genTextPos()
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
const [_prefix, _local, value] = parseAttribute(s);
|
|
303
|
+
const end = s.getPos();
|
|
304
|
+
tokenCallback(
|
|
305
|
+
{
|
|
306
|
+
type: "Attribute",
|
|
307
|
+
range: { start: _start, end },
|
|
308
|
+
prefix: _prefix,
|
|
309
|
+
local: _local,
|
|
310
|
+
value
|
|
311
|
+
},
|
|
312
|
+
s
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (open) {
|
|
317
|
+
if (s.config.rawTextElements != null) {
|
|
318
|
+
const qName = getQName(local, prefix);
|
|
319
|
+
if (s.config.rawTextElements.includes(qName)) {
|
|
320
|
+
parseContent(s, tokenCallback, `</${qName}>`);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
parseContent(s, tokenCallback);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function parseAttribute(s) {
|
|
328
|
+
const [prefix, local] = s.consumeQName();
|
|
329
|
+
let value;
|
|
330
|
+
const start = s.getPos();
|
|
331
|
+
s.skipSpaces();
|
|
332
|
+
if (s.tryConsumeCodeUnit(EQUALS)) {
|
|
333
|
+
s.skipSpaces();
|
|
334
|
+
const currCodeUnit = s.currCodeUnit();
|
|
335
|
+
if (currCodeUnit === SINGLE_QUOTE || currCodeUnit === DOUBLE_QUOTE) {
|
|
336
|
+
const quote = s.consumeQuote();
|
|
337
|
+
value = s.consumeCodeUnitsWhile((c) => c !== quote && c !== LESS_THAN);
|
|
338
|
+
s.consumeCodeUnit(quote);
|
|
339
|
+
} else if (!s.config.strictDocument) {
|
|
340
|
+
value = s.consumeCodeUnitsWhile(
|
|
341
|
+
(c) => !isXmlSpaceByte(c) && c !== GREATER_THAN && c !== SLASH && c !== LESS_THAN
|
|
342
|
+
);
|
|
343
|
+
} else {
|
|
344
|
+
throw new XmlError(
|
|
345
|
+
{ type: "InvalidChar", expected: "a quote", actual: currCodeUnit },
|
|
346
|
+
s.genTextPos()
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
} else if (!s.config.strictDocument) {
|
|
350
|
+
s.goTo(start);
|
|
351
|
+
value = "true";
|
|
352
|
+
} else {
|
|
353
|
+
throw new XmlError(
|
|
354
|
+
{ type: "InvalidChar", expected: EQUALS, actual: s.currCodeUnit() },
|
|
355
|
+
s.genTextPos()
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
return [prefix, local, value];
|
|
359
|
+
}
|
|
360
|
+
function parseContent(s, tokenCallback, parseContentUntil = LESS_THAN) {
|
|
361
|
+
while (!s.atEnd()) {
|
|
362
|
+
if (typeof parseContentUntil === "number" ? s.currCodeUnit() === parseContentUntil : s.startsWith(parseContentUntil)) {
|
|
363
|
+
const nextCodeUnit = s.nextCodeUnit();
|
|
364
|
+
if (nextCodeUnit === EXCLAMATION_MARK) {
|
|
365
|
+
if (s.startsWith(COMMENT_START)) {
|
|
366
|
+
parseComment(s, tokenCallback);
|
|
367
|
+
} else if (s.startsWith(CDATA_START)) {
|
|
368
|
+
parseCdata(s, tokenCallback);
|
|
369
|
+
} else {
|
|
370
|
+
throw new XmlError(
|
|
371
|
+
{ type: "UnknownToken", message: "Failed to parse content" },
|
|
372
|
+
s.genTextPos()
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
} else if (nextCodeUnit === QUESTION_MARK) {
|
|
376
|
+
parsePi(s, tokenCallback);
|
|
377
|
+
} else if (nextCodeUnit === SLASH) {
|
|
378
|
+
parseCloseElement(s, tokenCallback);
|
|
379
|
+
break;
|
|
380
|
+
} else {
|
|
381
|
+
parseElement(s, tokenCallback);
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
parseText(s, tokenCallback, parseContentUntil);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function parseCdata(s, tokenCallback) {
|
|
389
|
+
const start = s.getPos();
|
|
390
|
+
s.advance(9);
|
|
391
|
+
const text = s.consumeCodeUnitsWhile(
|
|
392
|
+
(c, _s) => !(c === CLOSE_SQUARE_BRACKET && _s.startsWith(CDATA_END))
|
|
393
|
+
);
|
|
394
|
+
s.skipString(CDATA_END);
|
|
395
|
+
const range = s.rangeFrom(start);
|
|
396
|
+
tokenCallback({ type: "Cdata", text, range }, s);
|
|
397
|
+
}
|
|
398
|
+
function parseCloseElement(s, tokenCallback) {
|
|
399
|
+
const start = s.getPos();
|
|
400
|
+
s.advance(2);
|
|
401
|
+
const [prefix, local] = s.consumeQName();
|
|
402
|
+
s.skipSpaces();
|
|
403
|
+
s.consumeCodeUnit(GREATER_THAN);
|
|
404
|
+
const range = s.rangeFrom(start);
|
|
405
|
+
tokenCallback({ type: "ElementEnd", end: { type: "Close", prefix, local }, range }, s);
|
|
406
|
+
}
|
|
407
|
+
function parseText(s, tokenCallback, parseTextUntil = LESS_THAN) {
|
|
408
|
+
const start = s.getPos();
|
|
409
|
+
const text = typeof parseTextUntil === "number" ? s.consumeCodeUnitsWhile((c) => c !== parseTextUntil) : s.consumeCodeUnitsWhile((_, _s) => !_s.startsWith(parseTextUntil));
|
|
410
|
+
if (text.includes(CDATA_END)) {
|
|
411
|
+
throw new XmlError({ type: "InvalidCharacterData" }, s.genTextPos());
|
|
412
|
+
}
|
|
413
|
+
tokenCallback({ type: "Text", text, range: s.rangeFrom(start) }, s);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export { tokenize, tokenizeXmlStream };
|
|
417
|
+
//# sourceMappingURL=tokenize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.js","sources":["../../../src/tokenizer/tokenize.ts"],"sourcesContent":["import { getQName } from '../get-q-name';\nimport {\n\tCLOSE_SQUARE_BRACKET,\n\tDOUBLE_QUOTE,\n\tEQUALS,\n\tEXCLAMATION_MARK,\n\tGREATER_THAN,\n\tHYPHEN,\n\tLESS_THAN,\n\tOPEN_SQUARE_BRACKET,\n\tPERCENT,\n\tQUESTION_MARK,\n\tSINGLE_QUOTE,\n\tSLASH,\n\tUPPERCASE_P,\n\tUPPERCASE_S\n} from './ascii-constants';\nimport { type TTokenCallback } from './types';\nimport { isXmlSpaceByte } from './utils';\nimport { XmlError } from './XmlError';\nimport { XmlStream, type TXmlStreamOptions } from './XmlStream';\n\nconst BOM = '\\uFEFF';\nconst XML_DECLARATION_START = '<?xml ';\nconst XML_DECLARATION_END = '?>';\nconst ENTITY_DECLARATION_START = '<!ENTITY';\nconst ELEMENT_DECLARATION_START = '<!ELEMENT';\nconst ATTLIST_DECLARATION_START = '<!ATTLIST';\nconst NOTATION_DECLARATION_START = '<!NOTATION';\nconst DOCTYPE_START = '<!DOCTYPE';\nconst PI_START = '<?';\nconst PI_END = '?>';\nconst COMMENT_START = '<!--';\nconst COMMENT_END = '-->';\nconst CDATA_START = '<![CDATA[';\nconst CDATA_END = ']]>';\nconst NDATA = 'NDATA';\nconst PUBLIC = 'PUBLIC';\nconst SYSTEM = 'SYSTEM';\nconst VERSION = 'version';\nconst ENCODING = 'encoding';\nconst STANDALONE = 'standalone';\n\nexport function tokenize(\n\txmlString: string,\n\ttokenCallback: TTokenCallback,\n\toptions: TXmlStreamOptions = {}\n): void {\n\ttokenizeXmlStream(new XmlStream(xmlString, options), tokenCallback);\n}\n\n/**\n * Parses an XML document.\n *\n * document ::= prolog element Misc*\n *\n * https://www.w3.org/TR/xml/#NT-document\n */\nexport function tokenizeXmlStream(s: XmlStream, tokenCallback: TTokenCallback): void {\n\t// Skip UTF-8 BOM\n\tif (s.startsWith(BOM)) {\n\t\ts.advance(1);\n\t}\n\n\tif (s.startsWith(XML_DECLARATION_START)) {\n\t\tparseDeclaration(s);\n\t}\n\n\tparseMisc(s, tokenCallback);\n\n\ts.skipSpaces();\n\tif (s.startsWith(DOCTYPE_START) || s.startsWith(DOCTYPE_START.toLowerCase())) {\n\t\tif (!s.config.allowDtd) {\n\t\t\tthrow new XmlError({ type: 'DtdDetected' });\n\t\t}\n\n\t\tparseDoctype(s, tokenCallback);\n\t\tparseMisc(s, tokenCallback);\n\t}\n\n\ts.skipSpaces();\n\n\tif (s.config.strictDocument) {\n\t\tif (!s.atEnd() && s.currCodeUnit() === LESS_THAN) {\n\t\t\tparseElement(s, tokenCallback);\n\t\t}\n\n\t\tparseMisc(s, tokenCallback);\n\n\t\tif (!s.atEnd()) {\n\t\t\tthrow new XmlError({ type: 'UnknownToken', message: 'Not at end' }, s.genTextPos());\n\t\t}\n\t} else {\n\t\twhile (!s.atEnd()) {\n\t\t\tif (s.currCodeUnit() === LESS_THAN) {\n\t\t\t\tparseElement(s, tokenCallback);\n\t\t\t} else {\n\t\t\t\tparseText(s, tokenCallback);\n\t\t\t}\n\t\t\tparseMisc(s, tokenCallback);\n\t\t}\n\t}\n}\n\n/**\n * Parses miscellaneous XML content (comments, processing instructions, whitespace).\n *\n * Misc ::= Comment | PI | S\n *\n * https://www.w3.org/TR/xml/#NT-Misc\n */\nfunction parseMisc(s: XmlStream, tokenCallback: TTokenCallback): void {\n\twhile (!s.atEnd()) {\n\t\ts.skipSpaces();\n\t\tif (s.startsWith(COMMENT_START)) {\n\t\t\tparseComment(s, tokenCallback);\n\t\t} else if (s.startsWith(PI_START)) {\n\t\t\tparsePi(s, tokenCallback);\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Parses the XML declaration.\n *\n * XMLDecl ::= '\\<?xml' VersionInfo EncodingDecl? SDDecl? S? '?\\>'\n *\n * https://www.w3.org/TR/xml/#sec-prolog-dtd\n */\nfunction parseDeclaration(s: XmlStream): void {\n\tfunction consumeSpaces(_s: XmlStream): void {\n\t\tif (_s.startsWithSpace()) {\n\t\t\t_s.skipSpaces();\n\t\t} else if (!_s.startsWith(XML_DECLARATION_END) && !_s.atEnd()) {\n\t\t\tthrow new XmlError(\n\t\t\t\t{ type: 'InvalidChar', expected: 'a whitespace', actual: _s.currCodeUnitUnchecked() },\n\t\t\t\t_s.genTextPos()\n\t\t\t);\n\t\t}\n\t}\n\n\ts.advance(5); // <?xml\n\tconsumeSpaces(s);\n\n\t// The `version` \"attribute\" is mandatory\n\tif (!s.startsWith(VERSION)) {\n\t\tthrow new XmlError({ type: 'InvalidString', expected: 'version' }, s.genTextPos());\n\t}\n\tparseAttribute(s);\n\tconsumeSpaces(s);\n\n\tif (s.startsWith(ENCODING)) {\n\t\tparseAttribute(s);\n\t\tconsumeSpaces(s);\n\t}\n\n\tif (s.startsWith(STANDALONE)) {\n\t\tparseAttribute(s);\n\t}\n\n\ts.skipSpaces();\n\ts.skipString(XML_DECLARATION_END);\n}\n\n/**\n * Parses an XML comment.\n *\n * '\\<!--' ((Char - '-') | ('-' (Char - '-')))* '--\\>'\n *\n * https://www.w3.org/TR/xml/#sec-comments\n */\nfunction parseComment(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tconst start = s.getPos();\n\ts.advance(4);\n\tconst text = s.consumeCodeUnitsWhile((c, _s) => !(c === HYPHEN && _s.startsWith(COMMENT_END)));\n\ts.skipString(COMMENT_END);\n\n\tif (text.includes('--') || text.endsWith('-')) {\n\t\tthrow new XmlError({ type: 'InvalidComment' }, s.genTextPosFrom(start));\n\t}\n\n\ttokenCallback({ type: 'Comment', text, range: s.rangeFrom(start) }, s);\n}\n\n/**\n * Parses a processing instruction.\n *\n * PI ::= '\\<?' PITarget (S (Char* - (Char* '?\\>' Char*)))? '?\\>'\n * PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))\n *\n * https://www.w3.org/TR/xml/#sec-pi\n */\nfunction parsePi(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tif (s.startsWith(XML_DECLARATION_START)) {\n\t\tthrow new XmlError({ type: 'UnexpectedDeclaration' }, s.genTextPos());\n\t}\n\n\tconst start = s.getPos();\n\ts.advance(2);\n\tconst target = s.consumeName();\n\ts.skipSpaces();\n\tconst content = s.consumeCodeUnitsWhile(\n\t\t(c, _s) => !(c === QUESTION_MARK && _s.startsWith(PI_END))\n\t);\n\n\ts.skipString(PI_END);\n\n\ttokenCallback(\n\t\t{\n\t\t\ttype: 'ProcessingInstruction',\n\t\t\ttarget,\n\t\t\tcontent: content.length === 0 ? undefined : content,\n\t\t\trange: s.rangeFrom(start)\n\t\t},\n\t\ts\n\t);\n}\n\n/**\n * Parses the DOCTYPE declaration.\n */\nfunction parseDoctype(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tconst start = s.getPos();\n\tparseDoctypeStart(s);\n\ts.skipSpaces();\n\n\tif (s.currCodeUnit() === GREATER_THAN) {\n\t\ts.advance(1);\n\t\treturn;\n\t}\n\n\ts.advance(1); // '['\n\twhile (!s.atEnd()) {\n\t\ts.skipSpaces();\n\t\tif (s.startsWith(ENTITY_DECLARATION_START)) {\n\t\t\tparseEntityDecl(s, tokenCallback);\n\t\t} else if (s.startsWith(COMMENT_START)) {\n\t\t\tparseComment(s, tokenCallback);\n\t\t} else if (s.startsWith(PI_START)) {\n\t\t\tparsePi(s, tokenCallback);\n\t\t} else if (s.startsWith(']')) {\n\t\t\t// DTD ends with ']' S? '>', therefore we have to skip possible spaces\n\t\t\ts.advance(1);\n\t\t\ts.skipSpaces();\n\t\t\tif (s.currCodeUnit() === GREATER_THAN) {\n\t\t\t\ts.advance(1);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tthrow new XmlError(\n\t\t\t\t\t{ type: 'InvalidChar', expected: \"'>'\", actual: s.currCodeUnitUnchecked() },\n\t\t\t\t\ts.genTextPos()\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (\n\t\t\ts.startsWith(ELEMENT_DECLARATION_START) ||\n\t\t\ts.startsWith(ATTLIST_DECLARATION_START) ||\n\t\t\ts.startsWith(NOTATION_DECLARATION_START)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconsumeDecl(s);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new XmlError(\n\t\t\t\t\t{ type: 'UnknownToken', message: 'Failed to consume declaration' },\n\t\t\t\t\ts.genTextPosFrom(start)\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new XmlError(\n\t\t\t\t{ type: 'UnknownToken', message: 'Failed to parse doctype' },\n\t\t\t\ts.genTextPos()\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Parses the start of a DOCTYPE declaration.\n *\n * doctypedecl ::= '\\<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '\\>'\n *\n * https://www.w3.org/TR/xml/#NT-doctypedecl\n */\nfunction parseDoctypeStart(s: XmlStream): void {\n\ts.advance(9);\n\n\ts.consumeSpaces();\n\ts.skipName();\n\ts.skipSpaces();\n\n\tparseExternalId(s);\n\ts.skipSpaces();\n\n\tconst currCodeUnit = s.currCodeUnit();\n\tif (currCodeUnit !== OPEN_SQUARE_BRACKET && currCodeUnit !== GREATER_THAN) {\n\t\tthrow new XmlError(\n\t\t\t{ type: 'InvalidChar', expected: \"'[' or '>'\", actual: currCodeUnit },\n\t\t\ts.genTextPos()\n\t\t);\n\t}\n}\n\n/**\n * Parses an external ID.\n *\n * ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral\n *\n * https://www.w3.org/TR/xml/#NT-ExternalID\n */\nfunction parseExternalId(s: XmlStream): boolean {\n\tif (s.startsWith(SYSTEM) || s.startsWith(PUBLIC)) {\n\t\tconst start = s.getPos();\n\t\ts.advance(6);\n\t\tconst id = s.sliceBack(start);\n\n\t\ts.consumeSpaces();\n\t\tconst quote = s.consumeQuote();\n\t\ts.consumeCodeUnitsWhile((c) => c !== quote);\n\t\ts.consumeCodeUnit(quote);\n\n\t\tif (id === PUBLIC) {\n\t\t\ts.consumeSpaces();\n\t\t\tconst _quote = s.consumeQuote();\n\t\t\ts.consumeCodeUnitsWhile((c) => c !== _quote);\n\t\t\ts.consumeCodeUnit(_quote);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Parses an entity declaration.\n *\n * EntityDecl ::= GEDecl | PEDecl\n * GEDecl ::= '\\<!ENTITY' S Name S EntityDef S? '\\>'\n * PEDecl ::= '\\<!ENTITY' S '%' S Name S PEDef S? '\\>'\n *\n * https://www.w3.org/TR/xml/#sec-entity-decl\n */\nfunction parseEntityDecl(s: XmlStream, tokenCallback: TTokenCallback): void {\n\ts.advance(8);\n\ts.consumeSpaces();\n\n\tconst isGe = !s.tryConsumeCodeUnit(PERCENT);\n\tif (!isGe) {\n\t\ts.consumeSpaces();\n\t}\n\n\tconst name = s.consumeName();\n\ts.consumeSpaces();\n\tconst definition = parseEntityDef(s, isGe);\n\tif (definition !== null) {\n\t\ttokenCallback({ type: 'EntityDeclaration', name, definition }, s);\n\t}\n\ts.skipSpaces();\n\ts.consumeCodeUnit(GREATER_THAN);\n}\n\n/**\n * Parses an entity definition.\n *\n * EntityDef ::= EntityValue | (ExternalID NDataDecl?)\n * PEDef ::= EntityValue | ExternalID\n * EntityValue ::= '\"' ([^%&\"] | PEReference | Reference)* '\"' | \"'\" ([^%&']\n * | PEReference | Reference)* \"'\"\n * ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral\n * NDataDecl ::= S 'NDATA' S Name\n *\n * https://www.w3.org/TR/xml/#sec-entity-decl\n */\nfunction parseEntityDef(s: XmlStream, isGe: boolean): string | null {\n\tconst currCodeUnit = s.currCodeUnit();\n\tif (currCodeUnit === DOUBLE_QUOTE || currCodeUnit === SINGLE_QUOTE) {\n\t\tconst quote = s.consumeQuote();\n\t\tconst start = s.getPos();\n\t\ts.skipCodeUnitsWhile((c) => c !== quote);\n\t\tconst value = s.sliceBack(start);\n\t\ts.consumeCodeUnit(quote);\n\t\treturn value;\n\t} else if (currCodeUnit === UPPERCASE_S || currCodeUnit === UPPERCASE_P) {\n\t\tif (parseExternalId(s)) {\n\t\t\tif (isGe) {\n\t\t\t\ts.skipSpaces();\n\t\t\t\tif (s.startsWith(NDATA)) {\n\t\t\t\t\ts.advance(5);\n\t\t\t\t\ts.consumeSpaces();\n\t\t\t\t\ts.skipName();\n\t\t\t\t\t// TODO: NDataDecl is not supported\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tthrow new XmlError({ type: 'InvalidExternalID' }, s.genTextPos());\n\t} else {\n\t\tthrow new XmlError(\n\t\t\t{ type: 'InvalidChar', expected: 'a quote, SYSTEM or PUBLIC', actual: currCodeUnit },\n\t\t\ts.genTextPos()\n\t\t);\n\t}\n}\n\n/**\n * Consumes a declaration.\n */\nfunction consumeDecl(s: XmlStream): void {\n\ts.skipCodeUnitsWhile((c) => c !== GREATER_THAN);\n\ts.consumeCodeUnit(GREATER_THAN);\n}\n\n/**\n * Parses an XML element.\n *\n * element ::= EmptyElemTag | STag content ETag\n * '\\<' Name (S Attribute)* S? '\\>'\n *\n * https://www.w3.org/TR/xml/#NT-element\n */\nfunction parseElement(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tconst start = s.getPos();\n\ts.advance(1); // '<'\n\tconst [prefix, local] = s.consumeQName();\n\ttokenCallback({ type: 'ElementStart', prefix, local, start }, s);\n\n\tlet open = false;\n\twhile (!s.atEnd()) {\n\t\tconst hasSpace = s.startsWithSpace();\n\t\ts.skipSpaces();\n\t\tconst _start = s.getPos();\n\t\tconst currCodeUnit = s.currCodeUnit();\n\n\t\tif (currCodeUnit === SLASH) {\n\t\t\ts.advance(1);\n\t\t\ts.consumeCodeUnit(GREATER_THAN);\n\t\t\tconst range = s.rangeFrom(_start);\n\t\t\ttokenCallback({ type: 'ElementEnd', end: { type: 'Empty' }, range }, s);\n\t\t\tbreak;\n\t\t} else if (currCodeUnit === GREATER_THAN) {\n\t\t\ts.advance(1);\n\t\t\tconst range = s.rangeFrom(_start);\n\n\t\t\tif (\n\t\t\t\ts.config.implicitSelfClosingElements != null &&\n\t\t\t\ts.config.implicitSelfClosingElements.includes(getQName(local, prefix))\n\t\t\t) {\n\t\t\t\ttokenCallback({ type: 'ElementEnd', end: { type: 'Empty' }, range }, s);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\ttokenCallback({ type: 'ElementEnd', end: { type: 'Open' }, range }, s);\n\t\t\t\topen = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\t// An attribute must be preceded with a whitespace\n\t\t\tif (!hasSpace) {\n\t\t\t\tthrow new XmlError(\n\t\t\t\t\t{ type: 'InvalidChar', expected: 'a whitespace', actual: s.currCodeUnitUnchecked() },\n\t\t\t\t\ts.genTextPos()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst [_prefix, _local, value] = parseAttribute(s);\n\t\t\tconst end = s.getPos();\n\t\t\ttokenCallback(\n\t\t\t\t{\n\t\t\t\t\ttype: 'Attribute',\n\t\t\t\t\trange: { start: _start, end },\n\t\t\t\t\tprefix: _prefix,\n\t\t\t\t\tlocal: _local,\n\t\t\t\t\tvalue\n\t\t\t\t},\n\t\t\t\ts\n\t\t\t);\n\t\t}\n\t}\n\n\tif (open) {\n\t\tif (s.config.rawTextElements != null) {\n\t\t\tconst qName = getQName(local, prefix);\n\t\t\tif (s.config.rawTextElements.includes(qName)) {\n\t\t\t\tparseContent(s, tokenCallback, `</${qName}>`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tparseContent(s, tokenCallback);\n\t}\n}\n\n/**\n * Parses an XML attribute.\n *\n * If there's no Eq (equal sign), the value is interpreted as \"true\".\n *\n * Attribute ::= Name Eq AttValue\n *\n * https://www.w3.org/TR/xml/#NT-Attribute\n */\nfunction parseAttribute(s: XmlStream): [string, string, string] {\n\tconst [prefix, local] = s.consumeQName();\n\tlet value: string;\n\tconst start = s.getPos();\n\n\ts.skipSpaces();\n\tif (s.tryConsumeCodeUnit(EQUALS)) {\n\t\ts.skipSpaces();\n\t\tconst currCodeUnit = s.currCodeUnit();\n\n\t\tif (currCodeUnit === SINGLE_QUOTE || currCodeUnit === DOUBLE_QUOTE) {\n\t\t\tconst quote = s.consumeQuote();\n\t\t\tvalue = s.consumeCodeUnitsWhile((c) => c !== quote && c !== LESS_THAN);\n\t\t\ts.consumeCodeUnit(quote);\n\t\t}\n\t\t// In non-strict mode, consume until whitespace or closing tag\n\t\telse if (!s.config.strictDocument) {\n\t\t\tvalue = s.consumeCodeUnitsWhile(\n\t\t\t\t(c) => !isXmlSpaceByte(c) && c !== GREATER_THAN && c !== SLASH && c !== LESS_THAN\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new XmlError(\n\t\t\t\t{ type: 'InvalidChar', expected: 'a quote', actual: currCodeUnit },\n\t\t\t\ts.genTextPos()\n\t\t\t);\n\t\t}\n\t}\n\t// In strict mode, if there's no Eq (equal sign), the value is interpreted as \"true\"\n\telse if (!s.config.strictDocument) {\n\t\ts.goTo(start);\n\t\tvalue = 'true';\n\t} else {\n\t\tthrow new XmlError(\n\t\t\t{ type: 'InvalidChar', expected: EQUALS, actual: s.currCodeUnit() },\n\t\t\ts.genTextPos()\n\t\t);\n\t}\n\n\treturn [prefix, local, value];\n}\n\n/**\n * Parses the content of an XML element.\n *\n * content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*\n *\n * https://www.w3.org/TR/xml/#NT-content\n */\nfunction parseContent(\n\ts: XmlStream,\n\ttokenCallback: TTokenCallback,\n\tparseContentUntil: string | number = LESS_THAN\n): void {\n\twhile (!s.atEnd()) {\n\t\tif (\n\t\t\ttypeof parseContentUntil === 'number'\n\t\t\t\t? s.currCodeUnit() === parseContentUntil\n\t\t\t\t: s.startsWith(parseContentUntil)\n\t\t) {\n\t\t\tconst nextCodeUnit = s.nextCodeUnit();\n\t\t\tif (nextCodeUnit === EXCLAMATION_MARK) {\n\t\t\t\tif (s.startsWith(COMMENT_START)) {\n\t\t\t\t\tparseComment(s, tokenCallback);\n\t\t\t\t} else if (s.startsWith(CDATA_START)) {\n\t\t\t\t\tparseCdata(s, tokenCallback);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new XmlError(\n\t\t\t\t\t\t{ type: 'UnknownToken', message: 'Failed to parse content' },\n\t\t\t\t\t\ts.genTextPos()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (nextCodeUnit === QUESTION_MARK) {\n\t\t\t\tparsePi(s, tokenCallback);\n\t\t\t} else if (nextCodeUnit === SLASH) {\n\t\t\t\tparseCloseElement(s, tokenCallback);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tparseElement(s, tokenCallback);\n\t\t\t}\n\t\t} else {\n\t\t\tparseText(s, tokenCallback, parseContentUntil);\n\t\t}\n\t}\n}\n\n/**\n * Parses a CDATA section.\n *\n * CDSect ::= CDStart CData CDEnd\n * CDStart ::= '\\<![CDATA['\n * CData ::= (Char* - (Char* ']]\\>' Char*))\n * CDEnd ::= ']]\\>'\n *\n * https://www.w3.org/TR/xml/#sec-cdata-sect\n */\nfunction parseCdata(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tconst start = s.getPos();\n\ts.advance(9); // <![CDATA[\n\tconst text = s.consumeCodeUnitsWhile(\n\t\t(c, _s) => !(c === CLOSE_SQUARE_BRACKET && _s.startsWith(CDATA_END))\n\t);\n\ts.skipString(CDATA_END);\n\tconst range = s.rangeFrom(start);\n\ttokenCallback({ type: 'Cdata', text, range }, s);\n}\n\n/**\n * Parses a closing element tag.\n *\n * '\\</' Name S? '\\>'\n *\n * https://www.w3.org/TR/xml/#NT-ETag\n */\nfunction parseCloseElement(s: XmlStream, tokenCallback: TTokenCallback): void {\n\tconst start = s.getPos();\n\ts.advance(2); // </\n\n\tconst [prefix, local] = s.consumeQName();\n\ts.skipSpaces();\n\ts.consumeCodeUnit(GREATER_THAN);\n\n\tconst range = s.rangeFrom(start);\n\ttokenCallback({ type: 'ElementEnd', end: { type: 'Close', prefix, local }, range }, s);\n}\n\n/**\n * Parses text content.\n */\nfunction parseText(\n\ts: XmlStream,\n\ttokenCallback: TTokenCallback,\n\tparseTextUntil: string | number = LESS_THAN\n): void {\n\tconst start = s.getPos();\n\tconst text =\n\t\ttypeof parseTextUntil === 'number'\n\t\t\t? s.consumeCodeUnitsWhile((c) => c !== parseTextUntil)\n\t\t\t: s.consumeCodeUnitsWhile((_, _s) => !_s.startsWith(parseTextUntil));\n\n\t// According to the spec, `]]>` must not appear inside a Text node.\n\t// https://www.w3.org/TR/xml/#syntax\n\tif (text.includes(CDATA_END)) {\n\t\tthrow new XmlError({ type: 'InvalidCharacterData' }, s.genTextPos());\n\t}\n\n\ttokenCallback({ type: 'Text', text, range: s.rangeFrom(start) }, s);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,41 @@
|
|
|
1
|
-
import{ZERO
|
|
1
|
+
import { ZERO, NINE, UPPERCASE_A, UPPERCASE_Z, LOWERCASE_A, LOWERCASE_Z, COLON, UNDERSCORE, SPACE, HORIZONTAL_TAB, LINE_FEED, CARRIAGE_RETURN, HYPHEN, PERIOD } from './ascii-constants.js';
|
|
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 };
|
|
41
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/tokenizer/utils.ts"],"sourcesContent":["import {\n\tCARRIAGE_RETURN,\n\tCOLON,\n\tHORIZONTAL_TAB,\n\tHYPHEN,\n\tLINE_FEED,\n\tLOWERCASE_A,\n\tLOWERCASE_Z,\n\tNINE,\n\tPERIOD,\n\tSPACE,\n\tUNDERSCORE,\n\tUPPERCASE_A,\n\tUPPERCASE_Z,\n\tZERO\n} from './ascii-constants';\n\nexport function isAsciiDigit(byte: number): boolean {\n\treturn byte >= ZERO && byte <= NINE;\n}\n\n/**\n * Checks if the unicode code point (character) is within the name start char range.\n *\n * @param codePoint - The character to check.\n * @returns True if the character is a valid XML name start character, false otherwise.\n */\nexport function isXmlNameStart(codePoint: number | undefined): boolean {\n\tif (codePoint == null) {\n\t\treturn false;\n\t}\n\n\t// Check for ASCII first\n\tif (codePoint <= 128) {\n\t\treturn (\n\t\t\t(codePoint >= UPPERCASE_A && codePoint <= UPPERCASE_Z) ||\n\t\t\t(codePoint >= LOWERCASE_A && codePoint <= LOWERCASE_Z) ||\n\t\t\tcodePoint === COLON ||\n\t\t\tcodePoint === UNDERSCORE\n\t\t);\n\t}\n\n\treturn (\n\t\t(codePoint >= 0xc0 && codePoint <= 0xd6) ||\n\t\t(codePoint >= 0xd8 && codePoint <= 0xf6) ||\n\t\t(codePoint >= 0xf8 && codePoint <= 0x2ff) ||\n\t\t(codePoint >= 0x370 && codePoint <= 0x37d) ||\n\t\t(codePoint >= 0x37f && codePoint <= 0x1fff) ||\n\t\t(codePoint >= 0x200c && codePoint <= 0x200d) ||\n\t\t(codePoint >= 0x2070 && codePoint <= 0x218f) ||\n\t\t(codePoint >= 0x2c00 && codePoint <= 0x2fef) ||\n\t\t(codePoint >= 0x3001 && codePoint <= 0xd7ff) ||\n\t\t(codePoint >= 0xf900 && codePoint <= 0xfdcf) ||\n\t\t(codePoint >= 0xfdf0 && codePoint <= 0xfffd) ||\n\t\t(codePoint >= 0x10000 && codePoint <= 0xeffff)\n\t);\n}\n\n/**\n * Checks if the unicode code point (character) is within the XML name char range.\n *\n * @param codePoint - The character to check.\n * @returns True if the character is a valid XML name character, false otherwise.\n */\nexport function isXmlName(codePoint: number | undefined): boolean {\n\tif (codePoint == null) {\n\t\treturn false;\n\t}\n\n\t// Check for ASCII first\n\tif (codePoint <= 128) {\n\t\treturn isXmlNameByte(codePoint);\n\t}\n\n\treturn (\n\t\tcodePoint === 0xb7 ||\n\t\t(codePoint >= 0xc0 && codePoint <= 0xd6) ||\n\t\t(codePoint >= 0xd8 && codePoint <= 0xf6) ||\n\t\t(codePoint >= 0xf8 && codePoint <= 0x2ff) ||\n\t\t(codePoint >= 0x300 && codePoint <= 0x36f) ||\n\t\t(codePoint >= 0x370 && codePoint <= 0x37d) ||\n\t\t(codePoint >= 0x37f && codePoint <= 0x1fff) ||\n\t\t(codePoint >= 0x200c && codePoint <= 0x200d) ||\n\t\t(codePoint >= 0x203f && codePoint <= 0x2040) ||\n\t\t(codePoint >= 0x2070 && codePoint <= 0x218f) ||\n\t\t(codePoint >= 0x2c00 && codePoint <= 0x2fef) ||\n\t\t(codePoint >= 0x3001 && codePoint <= 0xd7ff) ||\n\t\t(codePoint >= 0xf900 && codePoint <= 0xfdcf) ||\n\t\t(codePoint >= 0xfdf0 && codePoint <= 0xfffd) ||\n\t\t(codePoint >= 0x10000 && codePoint <= 0xeffff)\n\t);\n}\n\n/**\n * Checks if the unicode code point (character) is within the XML char range.\n *\n * @param codePoint - The character to check.\n * @returns True if the character is a valid XML character, false otherwise.\n */\nexport function isXmlChar(codePoint: number | undefined): boolean {\n\tif (codePoint == null) {\n\t\treturn false;\n\t}\n\n\tif (codePoint < 0x20) {\n\t\treturn isXmlSpaceByte(codePoint);\n\t}\n\n\treturn codePoint !== 0xffff && codePoint !== 0xfffe;\n}\n\n/**\n * Checks if the character is an XML space.\n *\n * @param byte - The byte to check.\n * @returns True if the byte is a valid XML space, false otherwise.\n */\nexport function isXmlSpaceByte(byte: number): boolean {\n\treturn (\n\t\tbyte === SPACE || byte === HORIZONTAL_TAB || byte === LINE_FEED || byte === CARRIAGE_RETURN\n\t);\n}\n\n/**\n * Checks if the byte is within the ASCII char range.\n *\n * @param byte - The byte to check.\n * @returns True if the byte is a valid ASCII XML name character, false otherwise.\n */\nexport function isXmlNameByte(byte: number): boolean {\n\treturn (\n\t\t(byte >= ZERO && byte <= NINE) ||\n\t\t(byte >= UPPERCASE_A && byte <= UPPERCASE_Z) ||\n\t\t(byte >= LOWERCASE_A && byte <= LOWERCASE_Z) ||\n\t\tbyte === COLON ||\n\t\tbyte === UNDERSCORE ||\n\t\tbyte === HYPHEN ||\n\t\tbyte === PERIOD\n\t);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,12 @@
|
|
|
1
|
-
import{tokenToXml
|
|
1
|
+
import { tokenToXml } from './token-to-xml.js';
|
|
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 };
|
|
12
|
+
//# sourceMappingURL=tokens-to-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens-to-xml.js","sources":["../../src/tokens-to-xml.ts"],"sourcesContent":["import { tokenToXml } from './token-to-xml';\nimport { type TXmlToken } from './tokenizer';\n\nexport function tokensToXml(tokens: TXmlToken[]): string {\n\tlet xmlString = '';\n\n\ttokens.forEach((token) => {\n\t\txmlString += tokenToXml(token);\n\t});\n\n\treturn xmlString;\n}\n"],"names":[],"mappings":";;AAEO,SAAS,WAAW,CAAC,MAAM,EAAE;AACpC,EAAE,IAAI,SAAS,GAAG,EAAE;AACpB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK;AAC5B,IAAI,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;AAClC,GAAG,CAAC;AACJ,EAAE,OAAO,SAAS;AAClB;;;;"}
|
|
@@ -1 +1,67 @@
|
|
|
1
|
-
import{tokenize
|
|
1
|
+
import { tokenize } from './tokenizer/tokenize.js';
|
|
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 };
|
|
67
|
+
//# sourceMappingURL=xml-to-object.js.map
|