tag-soup-ng 0.0.1-security → 1.1.14
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.
Potentially problematic release.
This version of tag-soup-ng might be problematic. Click here for more details.
- package/LICENSE.txt +21 -0
- package/README.md +283 -3
- package/lib/createDomParser.d.ts +12 -0
- package/lib/createDomParser.js +84 -0
- package/lib/createHtmlDomParser.d.ts +21 -0
- package/lib/createHtmlDomParser.js +7 -0
- package/lib/createHtmlSaxParser.d.ts +29 -0
- package/lib/createHtmlSaxParser.js +120 -0
- package/lib/createSaxParser.d.ts +8 -0
- package/lib/createSaxParser.js +124 -0
- package/lib/createXmlDomParser.d.ts +21 -0
- package/lib/createXmlDomParser.js +58 -0
- package/lib/createXmlSaxParser.d.ts +18 -0
- package/lib/createXmlSaxParser.js +28 -0
- package/lib/dom-types.d.ts +116 -0
- package/lib/dom-types.js +14 -0
- package/lib/index-cjs.js +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +10 -0
- package/lib/parser-types.d.ts +425 -0
- package/lib/parser-types.js +14 -0
- package/lib/tokenize.d.ts +34 -0
- package/lib/tokenize.js +409 -0
- package/lib/tokens.d.ts +9 -0
- package/lib/tokens.js +69 -0
- package/package.json +77 -3
package/lib/tokenize.js
ADDED
@@ -0,0 +1,409 @@
|
|
1
|
+
import { all, char, seq, text, until } from 'tokenizer-dsl';
|
2
|
+
// https://www.w3.org/TR/xml/#NT-S
|
3
|
+
var isSpaceChar = function (charCode) {
|
4
|
+
return charCode === 32 /* ' ' */
|
5
|
+
|| charCode === 9 /* '\t' */
|
6
|
+
|| charCode === 13 /* '\r' */
|
7
|
+
|| charCode === 10 /* '\n' */;
|
8
|
+
};
|
9
|
+
// https://www.w3.org/TR/xml/#NT-NameStartChar
|
10
|
+
var isTagNameStartChar = function (charCode) {
|
11
|
+
return charCode >= 97 /* 'a' */ && charCode <= 122 /* 'z' */
|
12
|
+
|| charCode >= 65 /* 'A' */ && charCode <= 90 /* 'Z' */
|
13
|
+
|| charCode === 95 /* '_' */
|
14
|
+
|| charCode === 58 /* ':' */
|
15
|
+
|| charCode >= 0xc0 && charCode <= 0xd6
|
16
|
+
|| charCode >= 0xd8 && charCode <= 0xf6
|
17
|
+
|| charCode >= 0xf8 && charCode <= 0x2ff
|
18
|
+
|| charCode >= 0x370 && charCode <= 0x37d
|
19
|
+
|| charCode >= 0x37f && charCode <= 0x1fff
|
20
|
+
|| charCode >= 0x200c && charCode <= 0x200d
|
21
|
+
|| charCode >= 0x2070 && charCode <= 0x218f
|
22
|
+
|| charCode >= 0x2c00 && charCode <= 0x2fef
|
23
|
+
|| charCode >= 0x3001 && charCode <= 0xd7ff
|
24
|
+
|| charCode >= 0xf900 && charCode <= 0xfdcf
|
25
|
+
|| charCode >= 0xfdf0 && charCode <= 0xfffd
|
26
|
+
|| charCode >= 0x10000 && charCode <= 0xeffff;
|
27
|
+
};
|
28
|
+
/**
|
29
|
+
* Check if char should be treated as a whitespace inside a tag.
|
30
|
+
*/
|
31
|
+
var isTagSpaceChar = function (charCode) {
|
32
|
+
// isSpaceChar(charCode)
|
33
|
+
return charCode === 32 /* ' ' */
|
34
|
+
|| charCode === 9 /* '\t' */
|
35
|
+
|| charCode === 13 /* '\r' */
|
36
|
+
|| charCode === 10 /* '\n' */
|
37
|
+
//
|
38
|
+
|| charCode === 47 /* '/' */;
|
39
|
+
};
|
40
|
+
var isNotTagNameChar = function (charCode) {
|
41
|
+
// isSpaceChar(charCode)
|
42
|
+
return charCode === 32 /* ' ' */
|
43
|
+
|| charCode === 9 /* '\t' */
|
44
|
+
|| charCode === 13 /* '\r' */
|
45
|
+
|| charCode === 10 /* '\n' */
|
46
|
+
//
|
47
|
+
|| charCode === 47 /* '/' */
|
48
|
+
|| charCode === 62 /* '>' */;
|
49
|
+
};
|
50
|
+
var isNotAttributeNameChar = function (charCode) {
|
51
|
+
// isSpaceChar(charCode)
|
52
|
+
return charCode === 32 /* ' ' */
|
53
|
+
|| charCode === 9 /* '\t' */
|
54
|
+
|| charCode === 13 /* '\r' */
|
55
|
+
|| charCode === 10 /* '\n' */
|
56
|
+
//
|
57
|
+
|| charCode === 47 /* '/' */
|
58
|
+
|| charCode === 62 /* '>' */
|
59
|
+
|| charCode === 61 /* '=' */;
|
60
|
+
};
|
61
|
+
var isNotUnquotedValueChar = function (charCode) {
|
62
|
+
//isSpaceChar(charCode)
|
63
|
+
return charCode === 32 /* ' ' */
|
64
|
+
|| charCode === 9 /* '\t' */
|
65
|
+
|| charCode === 13 /* '\r' */
|
66
|
+
|| charCode === 10 /* '\n' */
|
67
|
+
//
|
68
|
+
|| charCode === 62 /* '>' */;
|
69
|
+
};
|
70
|
+
var takeText = until(text('<'));
|
71
|
+
var takeUntilGt = until(text('>'), { inclusive: true });
|
72
|
+
var takeTagNameStartChar = char(isTagNameStartChar);
|
73
|
+
var takeTagNameChars = until(char(isNotTagNameChar), { openEnded: true, endOffset: 1 });
|
74
|
+
// <…
|
75
|
+
var takeStartTagOpening = seq(text('<'), takeTagNameStartChar, takeTagNameChars);
|
76
|
+
// </…
|
77
|
+
var takeEndTagOpening = seq(text('</'), takeTagNameStartChar, takeTagNameChars);
|
78
|
+
var takeAttributeName = until(char(isNotAttributeNameChar), { openEnded: true });
|
79
|
+
var takeTagSpace = all(char(isTagSpaceChar));
|
80
|
+
var takeSpace = all(char(isSpaceChar));
|
81
|
+
// =
|
82
|
+
var takeEq = seq(takeSpace, text('='), takeSpace);
|
83
|
+
// "…"
|
84
|
+
var takeQuotValue = seq(text('"'), until(text('"'), { inclusive: true, openEnded: true, endOffset: 1 }));
|
85
|
+
// '…'
|
86
|
+
var takeAposValue = seq(text('\''), until(text('\''), { inclusive: true, openEnded: true, endOffset: 1 }));
|
87
|
+
// okay
|
88
|
+
var takeUnquotedValue = until(char(isNotUnquotedValueChar), { openEnded: true });
|
89
|
+
// <!-- … -->
|
90
|
+
var takeComment = seq(text('<!--'), until(text('-->'), { inclusive: true, openEnded: true, endOffset: 3 }));
|
91
|
+
// <! … >
|
92
|
+
var takeDtd = seq(text('<!'), until(text('>'), { inclusive: true, openEnded: true, endOffset: 1 }));
|
93
|
+
// <? … ?>
|
94
|
+
var takeProcessingInstruction = seq(text('<?'), until(text('?>'), { inclusive: true, openEnded: true, endOffset: 2 }));
|
95
|
+
// <![CDATA[ … ]]>
|
96
|
+
var takeCdata = seq(text('<![CDATA['), until(text(']]>'), { inclusive: true, openEnded: true, endOffset: 3 }));
|
97
|
+
// <!DOCTYPE … >
|
98
|
+
var takeDoctype = seq(text('<!DOCTYPE', { caseInsensitive: true }), until(text('>'), { inclusive: true, openEnded: true, endOffset: 1 }));
|
99
|
+
/**
|
100
|
+
* Reads attributes from the source.
|
101
|
+
*
|
102
|
+
* @param chunk The string to read attributes from.
|
103
|
+
* @param index The index in `chunk` from which to start reading.
|
104
|
+
* @param chunkOffset The offset of the `chunk` in scope of the whole input.
|
105
|
+
* @param attributes An array-like object to which {@link IAttributeToken} objects are added.
|
106
|
+
* @param options Tokenization options.
|
107
|
+
* @param parserOptions Parsing options.
|
108
|
+
* @returns The index in `chunk` at which reading was completed.
|
109
|
+
*/
|
110
|
+
export function tokenizeAttributes(chunk, index, chunkOffset, attributes, options, parserOptions) {
|
111
|
+
var attributeTokenPool = options.attributeTokenPool;
|
112
|
+
var decodeAttribute = parserOptions.decodeAttribute, renameAttribute = parserOptions.renameAttribute;
|
113
|
+
var charCount = chunk.length;
|
114
|
+
var attributeCount = 0;
|
115
|
+
while (index < charCount) {
|
116
|
+
var k = takeTagSpace(chunk, index);
|
117
|
+
var j = takeAttributeName(chunk, k);
|
118
|
+
// No attributes are available
|
119
|
+
if (j === k) {
|
120
|
+
break;
|
121
|
+
}
|
122
|
+
var token = attributes[attributeCount] = attributeTokenPool.take();
|
123
|
+
var rawName = chunk.substring(k, j);
|
124
|
+
token.rawName = rawName;
|
125
|
+
token.name = renameAttribute != null ? renameAttribute(rawName) : rawName;
|
126
|
+
token.nameStart = token.start = chunkOffset + k;
|
127
|
+
token.nameEnd = chunkOffset + j;
|
128
|
+
k = j;
|
129
|
+
j = takeEq(chunk, k);
|
130
|
+
var rawValue = void 0;
|
131
|
+
var value = void 0;
|
132
|
+
var valueStart = -1;
|
133
|
+
var valueEnd = -1;
|
134
|
+
var quoted = false;
|
135
|
+
// Equals sign presents, so there may be a value
|
136
|
+
if (j !== -1 /* NO_MATCH */) {
|
137
|
+
k = j;
|
138
|
+
rawValue = value = null;
|
139
|
+
// Quoted value
|
140
|
+
j = takeQuotValue(chunk, k);
|
141
|
+
if (j === -1 /* NO_MATCH */) {
|
142
|
+
j = takeAposValue(chunk, k);
|
143
|
+
}
|
144
|
+
if (j !== -1 /* NO_MATCH */) {
|
145
|
+
valueStart = k + 1;
|
146
|
+
valueEnd = j - 1;
|
147
|
+
quoted = true;
|
148
|
+
k = Math.min(j, charCount);
|
149
|
+
}
|
150
|
+
else {
|
151
|
+
// Unquoted value
|
152
|
+
j = takeUnquotedValue(chunk, k);
|
153
|
+
if (j !== k) {
|
154
|
+
valueStart = k;
|
155
|
+
valueEnd = j;
|
156
|
+
k = j;
|
157
|
+
}
|
158
|
+
}
|
159
|
+
if (valueStart !== -1) {
|
160
|
+
rawValue = chunk.substring(valueStart, valueEnd);
|
161
|
+
value = decodeAttribute != null ? decodeAttribute(rawValue) : rawValue;
|
162
|
+
valueStart += chunkOffset;
|
163
|
+
valueEnd += chunkOffset;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
token.rawValue = rawValue;
|
167
|
+
token.value = value;
|
168
|
+
token.valueStart = valueStart;
|
169
|
+
token.valueEnd = valueEnd;
|
170
|
+
token.quoted = quoted;
|
171
|
+
token.end = chunkOffset + k;
|
172
|
+
++attributeCount;
|
173
|
+
index = k;
|
174
|
+
}
|
175
|
+
// Clean up array-like object
|
176
|
+
for (var i = attributeCount; i < attributes.length; ++i) {
|
177
|
+
attributes[i] = undefined;
|
178
|
+
}
|
179
|
+
attributes.length = attributeCount;
|
180
|
+
return index;
|
181
|
+
}
|
182
|
+
/**
|
183
|
+
* Reads markup tokens from the string.
|
184
|
+
*
|
185
|
+
* **Note:** Tokenizer doesn't return allocated tokens back to pools.
|
186
|
+
*
|
187
|
+
* @param chunk The chunk of the input to read tokens from.
|
188
|
+
* @param streaming If set to `true` then tokenizer stops when an ambiguous char sequence is met.
|
189
|
+
* @param chunkOffset The offset of the `chunk` in scope of the whole input.
|
190
|
+
* @param options Tokenization options.
|
191
|
+
* @param parserOptions Parsing options.
|
192
|
+
* @param handler SAX handler that is notified about parsed tokens.
|
193
|
+
* @returns The index in `chunk` right after the last parsed character.
|
194
|
+
*/
|
195
|
+
export function tokenize(chunk, streaming, chunkOffset, options, parserOptions, handler) {
|
196
|
+
var startTagTokenPool = options.startTagTokenPool, endTagToken = options.endTagToken, dataToken = options.dataToken;
|
197
|
+
var cdataEnabled = parserOptions.cdataEnabled, processingInstructionsEnabled = parserOptions.processingInstructionsEnabled, selfClosingEnabled = parserOptions.selfClosingEnabled, decodeText = parserOptions.decodeText, renameTag = parserOptions.renameTag, checkCdataTag = parserOptions.checkCdataTag;
|
198
|
+
var startTagCallback = handler.startTag, endTagCallback = handler.endTag, textCallback = handler.text, commentCallback = handler.comment, processingInstructionCallback = handler.processingInstruction, cdataCallback = handler.cdata, doctypeCallback = handler.doctype;
|
199
|
+
var textStart = -1;
|
200
|
+
var textEnd = 0;
|
201
|
+
var tagParsingEnabled = true;
|
202
|
+
var startTagName;
|
203
|
+
var charCount = chunk.length;
|
204
|
+
var i = 0;
|
205
|
+
var j;
|
206
|
+
// This function is inlined by Terser
|
207
|
+
var triggerTextCallback = function () {
|
208
|
+
if (textStart !== -1) {
|
209
|
+
triggerDataCallback(chunk, chunkOffset, 3 /* TEXT */, dataToken, textCallback, textStart, textEnd, 0, 0, decodeText);
|
210
|
+
textStart = -1;
|
211
|
+
}
|
212
|
+
};
|
213
|
+
while (i < charCount) {
|
214
|
+
// Text
|
215
|
+
if (textStart === -1) {
|
216
|
+
var k = takeText(chunk, i);
|
217
|
+
if (k === -1 /* NO_MATCH */ && (k = charCount) && streaming) {
|
218
|
+
break;
|
219
|
+
}
|
220
|
+
if (k !== i) {
|
221
|
+
textStart = i;
|
222
|
+
textEnd = i = k;
|
223
|
+
continue;
|
224
|
+
}
|
225
|
+
}
|
226
|
+
if (tagParsingEnabled) {
|
227
|
+
// Start tag
|
228
|
+
j = takeStartTagOpening(chunk, i);
|
229
|
+
if (j !== -1 /* NO_MATCH */) {
|
230
|
+
var token = startTagTokenPool.take();
|
231
|
+
var attributes = token.attributes;
|
232
|
+
var nameStart = i + 1;
|
233
|
+
var nameEnd = j;
|
234
|
+
var rawTagName = chunk.substring(nameStart, nameEnd);
|
235
|
+
var tagName = renameTag != null ? renameTag(rawTagName) : rawTagName;
|
236
|
+
j = tokenizeAttributes(chunk, j, chunkOffset, attributes, options, parserOptions);
|
237
|
+
// Skip malformed content and excessive whitespaces
|
238
|
+
var k = takeUntilGt(chunk, j);
|
239
|
+
if (k === -1 /* NO_MATCH */) {
|
240
|
+
// Unterminated start tag
|
241
|
+
return i;
|
242
|
+
}
|
243
|
+
var selfClosing = selfClosingEnabled && k - j >= 2 && chunk.charCodeAt(k - 2) === 47 /* '/' */ || false;
|
244
|
+
/*@__INLINE__*/
|
245
|
+
triggerTextCallback();
|
246
|
+
token.rawName = rawTagName;
|
247
|
+
token.name = tagName;
|
248
|
+
token.selfClosing = selfClosing;
|
249
|
+
token.start = chunkOffset + i;
|
250
|
+
token.end = chunkOffset + k;
|
251
|
+
token.nameStart = chunkOffset + nameStart;
|
252
|
+
token.nameEnd = chunkOffset + nameEnd;
|
253
|
+
if (!selfClosing) {
|
254
|
+
startTagName = tagName;
|
255
|
+
tagParsingEnabled = !(checkCdataTag === null || checkCdataTag === void 0 ? void 0 : checkCdataTag(token));
|
256
|
+
}
|
257
|
+
i = k;
|
258
|
+
startTagCallback === null || startTagCallback === void 0 ? void 0 : startTagCallback(token);
|
259
|
+
// Start tag token and its attributes must be returned to the pool owner
|
260
|
+
continue;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
// End tag
|
264
|
+
j = takeEndTagOpening(chunk, i);
|
265
|
+
if (j !== -1 /* NO_MATCH */) {
|
266
|
+
var nameStart = i + 2;
|
267
|
+
var nameEnd = j;
|
268
|
+
var rawTagName = chunk.substring(nameStart, nameEnd);
|
269
|
+
var tagName = renameTag != null ? renameTag(rawTagName) : rawTagName;
|
270
|
+
if (tagParsingEnabled || startTagName === tagName) {
|
271
|
+
// Resume tag parsing if CDATA content tag has ended
|
272
|
+
tagParsingEnabled = true;
|
273
|
+
// Skip malformed content and excessive whitespaces
|
274
|
+
var k = takeUntilGt(chunk, j);
|
275
|
+
if (k === -1 /* NO_MATCH */) {
|
276
|
+
// Unterminated end tag
|
277
|
+
return i;
|
278
|
+
}
|
279
|
+
/*@__INLINE__*/
|
280
|
+
triggerTextCallback();
|
281
|
+
if (endTagCallback) {
|
282
|
+
endTagToken.rawName = rawTagName;
|
283
|
+
endTagToken.name = tagName;
|
284
|
+
endTagToken.start = chunkOffset + i;
|
285
|
+
endTagToken.end = chunkOffset + k;
|
286
|
+
endTagToken.nameStart = chunkOffset + nameStart;
|
287
|
+
endTagToken.nameEnd = chunkOffset + nameEnd;
|
288
|
+
endTagCallback(endTagToken);
|
289
|
+
}
|
290
|
+
i = k;
|
291
|
+
continue;
|
292
|
+
}
|
293
|
+
}
|
294
|
+
if (tagParsingEnabled) {
|
295
|
+
var k = void 0;
|
296
|
+
// Comment
|
297
|
+
k = j = takeComment(chunk, i);
|
298
|
+
if (j !== -1 /* NO_MATCH */) {
|
299
|
+
if (j > charCount && streaming) {
|
300
|
+
return i;
|
301
|
+
}
|
302
|
+
/*@__INLINE__*/
|
303
|
+
triggerTextCallback();
|
304
|
+
i = triggerDataCallback(chunk, chunkOffset, 8 /* COMMENT */, dataToken, commentCallback, i, j, 4, 3, decodeText);
|
305
|
+
continue;
|
306
|
+
}
|
307
|
+
// Doctype
|
308
|
+
k = j = takeDoctype(chunk, i);
|
309
|
+
if (j !== -1 /* NO_MATCH */) {
|
310
|
+
if (j > charCount && streaming) {
|
311
|
+
return i;
|
312
|
+
}
|
313
|
+
/*@__INLINE__*/
|
314
|
+
triggerTextCallback();
|
315
|
+
i = triggerDataCallback(chunk, chunkOffset, 10 /* DOCTYPE */, dataToken, doctypeCallback, i, j, 9, 1);
|
316
|
+
continue;
|
317
|
+
}
|
318
|
+
// CDATA section
|
319
|
+
j = takeCdata(chunk, i);
|
320
|
+
if (j !== -1 /* NO_MATCH */) {
|
321
|
+
if (j > charCount && streaming) {
|
322
|
+
return i;
|
323
|
+
}
|
324
|
+
/*@__INLINE__*/
|
325
|
+
triggerTextCallback();
|
326
|
+
if (cdataEnabled) {
|
327
|
+
i = triggerDataCallback(chunk, chunkOffset, 4 /* CDATA_SECTION */, dataToken, cdataCallback, i, j, 9, 3);
|
328
|
+
}
|
329
|
+
else {
|
330
|
+
i = triggerDataCallback(chunk, chunkOffset, 8 /* COMMENT */, dataToken, commentCallback, i, j, 2, 1);
|
331
|
+
}
|
332
|
+
continue;
|
333
|
+
}
|
334
|
+
// Processing instruction
|
335
|
+
j = takeProcessingInstruction(chunk, i);
|
336
|
+
if (j !== -1 /* NO_MATCH */) {
|
337
|
+
if (j > charCount && streaming) {
|
338
|
+
return i;
|
339
|
+
}
|
340
|
+
/*@__INLINE__*/
|
341
|
+
triggerTextCallback();
|
342
|
+
if (processingInstructionsEnabled) {
|
343
|
+
i = triggerDataCallback(chunk, chunkOffset, 7 /* PROCESSING_INSTRUCTION */, dataToken, processingInstructionCallback, i, j, 2, 2);
|
344
|
+
}
|
345
|
+
else {
|
346
|
+
i = triggerDataCallback(chunk, chunkOffset, 8 /* COMMENT */, dataToken, commentCallback, i, j, 1, 1);
|
347
|
+
}
|
348
|
+
continue;
|
349
|
+
}
|
350
|
+
// DTD
|
351
|
+
j = takeDtd(chunk, i);
|
352
|
+
if (j !== -1 /* NO_MATCH */) {
|
353
|
+
if (j > charCount && streaming) {
|
354
|
+
return i;
|
355
|
+
}
|
356
|
+
/*@__INLINE__*/
|
357
|
+
triggerTextCallback();
|
358
|
+
if (cdataEnabled) {
|
359
|
+
i = Math.min(j, charCount);
|
360
|
+
}
|
361
|
+
else {
|
362
|
+
i = triggerDataCallback(chunk, chunkOffset, 8 /* COMMENT */, dataToken, commentCallback, i, j, 2, 1, decodeText);
|
363
|
+
}
|
364
|
+
continue;
|
365
|
+
}
|
366
|
+
}
|
367
|
+
// Concat with existing text
|
368
|
+
if (textStart === -1) {
|
369
|
+
textStart = i;
|
370
|
+
}
|
371
|
+
textEnd = takeText(chunk, i + 1);
|
372
|
+
if (textEnd === -1) {
|
373
|
+
textEnd = charCount;
|
374
|
+
break;
|
375
|
+
}
|
376
|
+
i = textEnd;
|
377
|
+
}
|
378
|
+
if (streaming) {
|
379
|
+
if (textStart !== -1) {
|
380
|
+
return textStart;
|
381
|
+
}
|
382
|
+
return i;
|
383
|
+
}
|
384
|
+
/*@__INLINE__*/
|
385
|
+
triggerTextCallback();
|
386
|
+
return i;
|
387
|
+
}
|
388
|
+
/**
|
389
|
+
* Populates `dataToken` and passes it to `dataCallback`.
|
390
|
+
*/
|
391
|
+
function triggerDataCallback(chunk, chunkOffset, tokenType, dataToken, dataCallback, start, end, offsetStart, offsetEnd, decodeData) {
|
392
|
+
var charCount = chunk.length;
|
393
|
+
var index = Math.min(end, charCount);
|
394
|
+
if (!dataCallback) {
|
395
|
+
return index;
|
396
|
+
}
|
397
|
+
var dataStart = start + offsetStart;
|
398
|
+
var dataEnd = Math.min(end - offsetEnd, charCount);
|
399
|
+
var rawData = chunk.substring(dataStart, dataEnd);
|
400
|
+
dataToken.tokenType = tokenType;
|
401
|
+
dataToken.rawData = rawData;
|
402
|
+
dataToken.data = decodeData != null ? decodeData(rawData) : rawData;
|
403
|
+
dataToken.start = chunkOffset + start;
|
404
|
+
dataToken.end = chunkOffset + index;
|
405
|
+
dataToken.dataStart = chunkOffset + dataStart;
|
406
|
+
dataToken.dataEnd = chunkOffset + dataEnd;
|
407
|
+
dataCallback(dataToken);
|
408
|
+
return index;
|
409
|
+
}
|
package/lib/tokens.d.ts
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
import { IAttributeToken, IDataToken, IEndTagToken, IStartTagToken, Token } from './parser-types';
|
2
|
+
/**
|
3
|
+
* Clones an arbitrary token.
|
4
|
+
*/
|
5
|
+
export declare function clone(this: Token): any;
|
6
|
+
export declare function createStartTagToken(): IStartTagToken;
|
7
|
+
export declare function createEndTagToken(): IEndTagToken;
|
8
|
+
export declare function createDataToken(): IDataToken;
|
9
|
+
export declare function createAttributeToken(): IAttributeToken;
|
package/lib/tokens.js
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
import { __assign } from "tslib";
|
2
|
+
/**
|
3
|
+
* Clones an arbitrary token.
|
4
|
+
*/
|
5
|
+
export function clone() {
|
6
|
+
var token = __assign({}, this);
|
7
|
+
if (token.tokenType === 1 /* START_TAG */) {
|
8
|
+
var attributes = token.attributes = __assign({}, token.attributes);
|
9
|
+
for (var i = 0; i < attributes.length; ++i) {
|
10
|
+
attributes[i] = __assign({}, attributes[i]);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
return token;
|
14
|
+
}
|
15
|
+
export function createStartTagToken() {
|
16
|
+
return {
|
17
|
+
tokenType: 1 /* START_TAG */,
|
18
|
+
name: '',
|
19
|
+
rawName: '',
|
20
|
+
attributes: { length: 0 },
|
21
|
+
selfClosing: false,
|
22
|
+
start: 0,
|
23
|
+
end: 0,
|
24
|
+
nameStart: 0,
|
25
|
+
nameEnd: 0,
|
26
|
+
clone: clone,
|
27
|
+
};
|
28
|
+
}
|
29
|
+
export function createEndTagToken() {
|
30
|
+
return {
|
31
|
+
tokenType: 101 /* END_TAG */,
|
32
|
+
name: '',
|
33
|
+
rawName: '',
|
34
|
+
start: 0,
|
35
|
+
end: 0,
|
36
|
+
nameStart: 0,
|
37
|
+
nameEnd: 0,
|
38
|
+
clone: clone,
|
39
|
+
};
|
40
|
+
}
|
41
|
+
export function createDataToken() {
|
42
|
+
return {
|
43
|
+
tokenType: 3 /* TEXT */,
|
44
|
+
data: '',
|
45
|
+
rawData: '',
|
46
|
+
start: 0,
|
47
|
+
end: 0,
|
48
|
+
dataStart: 0,
|
49
|
+
dataEnd: 0,
|
50
|
+
clone: clone,
|
51
|
+
};
|
52
|
+
}
|
53
|
+
export function createAttributeToken() {
|
54
|
+
return {
|
55
|
+
tokenType: 2 /* ATTRIBUTE */,
|
56
|
+
name: '',
|
57
|
+
rawName: '',
|
58
|
+
value: '',
|
59
|
+
rawValue: '',
|
60
|
+
quoted: false,
|
61
|
+
start: 0,
|
62
|
+
end: 0,
|
63
|
+
nameStart: 0,
|
64
|
+
nameEnd: 0,
|
65
|
+
valueStart: 0,
|
66
|
+
valueEnd: 0,
|
67
|
+
clone: clone,
|
68
|
+
};
|
69
|
+
}
|
package/package.json
CHANGED
@@ -1,6 +1,80 @@
|
|
1
1
|
{
|
2
2
|
"name": "tag-soup-ng",
|
3
|
-
"version": "
|
4
|
-
"description": "
|
5
|
-
"
|
3
|
+
"version": "1.1.14",
|
4
|
+
"description": "The fastest pure JS SAX/DOM XML/HTML parser.",
|
5
|
+
"main": "./lib/index-cjs.js",
|
6
|
+
"module": "./lib/index.js",
|
7
|
+
"types": "./lib/index.d.ts",
|
8
|
+
"sideEffects": false,
|
9
|
+
"files": [
|
10
|
+
"lib"
|
11
|
+
],
|
12
|
+
"scripts": {
|
13
|
+
"build": "tsc && rimraf './lib/CharCode.*' && npm run rollup && npm run terser",
|
14
|
+
"rollup": "rollup --external @smikhalevski/object-pool,speedy-entities,tokenizer-dsl,tslib --input ./lib/index.js --file ./lib/index-cjs.js --format cjs --plugin @rollup/plugin-node-resolve",
|
15
|
+
"terser": "terser --compress --mangle toplevel --output ./lib/index-cjs.js -- ./lib/index-cjs.js",
|
16
|
+
"clean": "rimraf ./lib ./docs",
|
17
|
+
"test": "jest --detectOpenHandles",
|
18
|
+
"perf": "[ -d ./lib ] || npm run build && node --expose-gc --max-old-space-size=4096 ./node_modules/.bin/toofast ./src/test/perf.js",
|
19
|
+
"docs": "typedoc ./src/main/index.ts",
|
20
|
+
"publish-docs": "[ -d ./docs ] && [[ ! $(git status --porcelain) ]] && branch=$(git rev-parse --abbrev-ref HEAD) && sha=$(git rev-parse --short HEAD) && t=$(mktemp -d) && cp -R ./docs/ $t && git checkout ghpages && ls -A | grep -wv .git | xargs rm -rf && cp -R $t/ . && git add . && git commit -m \"Updated docs ($sha)\" && git push && git checkout $branch",
|
21
|
+
"release-docs": "npm run clean && npm run docs && npm run publish-docs"
|
22
|
+
},
|
23
|
+
"repository": {
|
24
|
+
"type": "git",
|
25
|
+
"url": "git+https://github.com/zlxtesting/tag-soup-ng.git"
|
26
|
+
},
|
27
|
+
"keywords": [
|
28
|
+
"tiny",
|
29
|
+
"small",
|
30
|
+
"forgiving",
|
31
|
+
"stream",
|
32
|
+
"fast",
|
33
|
+
"sax",
|
34
|
+
"dom",
|
35
|
+
"html",
|
36
|
+
"xml",
|
37
|
+
"parser"
|
38
|
+
],
|
39
|
+
"author": "zlxtesting",
|
40
|
+
"license": "MIT",
|
41
|
+
"bugs": {
|
42
|
+
"url": "https://github.com/zlxtesting/tag-soup-ng/issues"
|
43
|
+
},
|
44
|
+
"homepage": "https://github.com/zlxtesting/tag-soup-ng#readme",
|
45
|
+
"jest": {
|
46
|
+
"preset": "ts-jest",
|
47
|
+
"globals": {
|
48
|
+
"ts-jest": {
|
49
|
+
"diagnostics": {
|
50
|
+
"ignoreCodes": [
|
51
|
+
151001
|
52
|
+
]
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
},
|
57
|
+
"devDependencies": {
|
58
|
+
"@rollup/plugin-node-resolve": "^13.1.3",
|
59
|
+
"@smikhalevski/perf-test": "^1.0.0",
|
60
|
+
"@types/jest": "^27.4.1",
|
61
|
+
"htmlparser-benchmark": "^1.1.3",
|
62
|
+
"htmlparser2": "^7.2.0",
|
63
|
+
"jest": "^27.5.1",
|
64
|
+
"parse5": "^6.0.1",
|
65
|
+
"rimraf": "^3.0.2",
|
66
|
+
"rollup": "^2.70.1",
|
67
|
+
"sax": "^1.2.4",
|
68
|
+
"terser": "^5.12.1",
|
69
|
+
"toofast": "^1.0.0",
|
70
|
+
"ts-jest": "^27.1.3",
|
71
|
+
"typedoc": "^0.22.13",
|
72
|
+
"typescript": "^4.6.2"
|
73
|
+
},
|
74
|
+
"dependencies": {
|
75
|
+
"@smikhalevski/object-pool": "^1.0.0",
|
76
|
+
"speedy-entities": "^1.1.3",
|
77
|
+
"tokenizer-dsl": "^3.0.0",
|
78
|
+
"tslib": "^2.3.0"
|
79
|
+
}
|
6
80
|
}
|