UNPKG

20.3 kBTypeScriptView Raw
1/**
2 * The list of supported events.
3 */
4export declare const EVENTS: readonly ["xmldecl", "text", "processinginstruction", "doctype", "comment", "opentagstart", "attribute", "opentag", "closetag", "cdata", "error", "end", "ready"];
5/**
6 * Event handler for the
7 *
8 * @param text The text data encountered by the parser.
9 *
10 */
11export declare type XMLDeclHandler = (decl: XMLDecl) => void;
12/**
13 * Event handler for text data.
14 *
15 * @param text The text data encountered by the parser.
16 *
17 */
18export declare type TextHandler = (text: string) => void;
19/**
20 * Event handler for processing instructions.
21 *
22 * @param data The target and body of the processing instruction.
23 */
24export declare type PIHandler = (data: {
25 target: string;
26 body: string;
27}) => void;
28/**
29 * Event handler for doctype.
30 *
31 * @param doctype The doctype contents.
32 */
33export declare type DoctypeHandler = (doctype: string) => void;
34/**
35 * Event handler for comments.
36 *
37 * @param comment The comment contents.
38 */
39export declare type CommentHandler = (comment: string) => void;
40/**
41 * Event handler for the start of an open tag. This is called as soon as we
42 * have a tag name.
43 *
44 * @param tag The tag.
45 */
46export declare type OpenTagStartHandler<O> = (tag: StartTagForOptions<O>) => void;
47export declare type AttributeEventForOptions<O extends SaxesOptions> = O extends {
48 xmlns: true;
49} ? SaxesAttributeNSIncomplete : O extends {
50 xmlns?: false | undefined;
51} ? SaxesAttributePlain : SaxesAttribute;
52/**
53 * Event handler for attributes.
54 */
55export declare type AttributeHandler<O> = (attribute: AttributeEventForOptions<O>) => void;
56/**
57 * Event handler for an open tag. This is called when the open tag is
58 * complete. (We've encountered the ">" that ends the open tag.)
59 *
60 * @param tag The tag.
61 */
62export declare type OpenTagHandler<O> = (tag: TagForOptions<O>) => void;
63/**
64 * Event handler for a close tag. Note that for self-closing tags, this is
65 * called right after ``opentag``.
66 *
67 * @param tag The tag.
68 */
69export declare type CloseTagHandler<O> = (tag: TagForOptions<O>) => void;
70/**
71 * Event handler for a CDATA section. This is called when ending the
72 * CDATA section.
73 *
74 * @param cdata The contents of the CDATA section.
75 */
76export declare type CDataHandler = (cdata: string) => void;
77/**
78 * Event handler for the stream end. This is called when the stream has been
79 * closed with ``close`` or by passing ``null`` to ``write``.
80 */
81export declare type EndHandler = () => void;
82/**
83 * Event handler indicating parser readiness . This is called when the parser
84 * is ready to parse a new document.
85 */
86export declare type ReadyHandler = () => void;
87/**
88 * Event handler indicating an error.
89 *
90 * @param err The error that occurred.
91 */
92export declare type ErrorHandler = (err: Error) => void;
93export declare type EventName = (typeof EVENTS)[number];
94export declare type EventNameToHandler<O, N extends EventName> = {
95 "xmldecl": XMLDeclHandler;
96 "text": TextHandler;
97 "processinginstruction": PIHandler;
98 "doctype": DoctypeHandler;
99 "comment": CommentHandler;
100 "opentagstart": OpenTagStartHandler<O>;
101 "attribute": AttributeHandler<O>;
102 "opentag": OpenTagHandler<O>;
103 "closetag": CloseTagHandler<O>;
104 "cdata": CDataHandler;
105 "error": ErrorHandler;
106 "end": EndHandler;
107 "ready": ReadyHandler;
108}[N];
109/**
110 * This interface defines the structure of attributes when the parser is
111 * processing namespaces (created with ``xmlns: true``).
112 */
113export interface SaxesAttributeNS {
114 /**
115 * The attribute's name. This is the combination of prefix and local name.
116 * For instance ``a:b="c"`` would have ``a:b`` for name.
117 */
118 name: string;
119 /**
120 * The attribute's prefix. For instance ``a:b="c"`` would have ``"a"`` for
121 * ``prefix``.
122 */
123 prefix: string;
124 /**
125 * The attribute's local name. For instance ``a:b="c"`` would have ``"b"`` for
126 * ``local``.
127 */
128 local: string;
129 /** The namespace URI of this attribute. */
130 uri: string;
131 /** The attribute's value. */
132 value: string;
133}
134/**
135 * This is an attribute, as recorded by a parser which parses namespaces but
136 * prior to the URI being resolvable. This is what is passed to the attribute
137 * event handler.
138 */
139export declare type SaxesAttributeNSIncomplete = Exclude<SaxesAttributeNS, "uri">;
140/**
141 * This interface defines the structure of attributes when the parser is
142 * NOT processing namespaces (created with ``xmlns: false``).
143 */
144export interface SaxesAttributePlain {
145 /**
146 * The attribute's name.
147 */
148 name: string;
149 /** The attribute's value. */
150 value: string;
151}
152/**
153 * A saxes attribute, with or without namespace information.
154 */
155export declare type SaxesAttribute = SaxesAttributeNS | SaxesAttributePlain;
156/**
157 * This are the fields that MAY be present on a complete tag.
158 */
159export interface SaxesTag {
160 /**
161 * The tag's name. This is the combination of prefix and global name. For
162 * instance ``<a:b>`` would have ``"a:b"`` for ``name``.
163 */
164 name: string;
165 /**
166 * A map of attribute name to attributes. If namespaces are tracked, the
167 * values in the map are attribute objects. Otherwise, they are strings.
168 */
169 attributes: Record<string, SaxesAttributeNS> | Record<string, string>;
170 /**
171 * The namespace bindings in effect.
172 */
173 ns?: Record<string, string>;
174 /**
175 * The tag's prefix. For instance ``<a:b>`` would have ``"a"`` for
176 * ``prefix``. Undefined if we do not track namespaces.
177 */
178 prefix?: string;
179 /**
180 * The tag's local name. For instance ``<a:b>`` would
181 * have ``"b"`` for ``local``. Undefined if we do not track namespaces.
182 */
183 local?: string;
184 /**
185 * The namespace URI of this tag. Undefined if we do not track namespaces.
186 */
187 uri?: string;
188 /** Whether the tag is self-closing (e.g. ``<foo/>``). */
189 isSelfClosing: boolean;
190}
191/**
192 * This type defines the fields that are present on a tag object when
193 * ``onopentagstart`` is called. This interface is namespace-agnostic.
194 */
195export declare type SaxesStartTag = Pick<SaxesTag, "name" | "attributes" | "ns">;
196/**
197 * This type defines the fields that are present on a tag object when
198 * ``onopentagstart`` is called on a parser that does not processes namespaces.
199 */
200export declare type SaxesStartTagPlain = Pick<SaxesStartTag, "name" | "attributes">;
201/**
202 * This type defines the fields that are present on a tag object when
203 * ``onopentagstart`` is called on a parser that does process namespaces.
204 */
205export declare type SaxesStartTagNS = Required<SaxesStartTag>;
206/**
207 * This are the fields that are present on a complete tag produced by a parser
208 * that does process namespaces.
209 */
210export declare type SaxesTagNS = Required<SaxesTag> & {
211 attributes: Record<string, SaxesAttributeNS>;
212};
213/**
214 * This are the fields that are present on a complete tag produced by a parser
215 * that does not process namespaces.
216 */
217export declare type SaxesTagPlain = Pick<SaxesTag, "name" | "attributes" | "isSelfClosing"> & {
218 attributes: Record<string, string>;
219};
220/**
221 * An XML declaration.
222 */
223export interface XMLDecl {
224 /** The version specified by the XML declaration. */
225 version?: string;
226 /** The encoding specified by the XML declaration. */
227 encoding?: string;
228 /** The value of the standalone parameter */
229 standalone?: string;
230}
231/**
232 * A callback for resolving name prefixes.
233 *
234 * @param prefix The prefix to check.
235 *
236 * @returns The URI corresponding to the prefix, if any.
237 */
238export declare type ResolvePrefix = (prefix: string) => string | undefined;
239export interface CommonOptions {
240 /** Whether to accept XML fragments. Unset means ``false``. */
241 fragment?: boolean;
242 /** Whether to track positions. Unset means ``true``. */
243 position?: boolean;
244 /**
245 * A file name to use for error reporting. "File name" is a loose concept. You
246 * could use a URL to some resource, or any descriptive name you like.
247 */
248 fileName?: string;
249}
250export interface NSOptions {
251 /** Whether to track namespaces. Unset means ``false``. */
252 xmlns?: boolean;
253 /**
254 * A plain object whose key, value pairs define namespaces known before
255 * parsing the XML file. It is not legal to pass bindings for the namespaces
256 * ``"xml"`` or ``"xmlns"``.
257 */
258 additionalNamespaces?: Record<string, string>;
259 /**
260 * A function that will be used if the parser cannot resolve a namespace
261 * prefix on its own.
262 */
263 resolvePrefix?: ResolvePrefix;
264}
265export interface NSOptionsWithoutNamespaces extends NSOptions {
266 xmlns?: false;
267 additionalNamespaces?: undefined;
268 resolvePrefix?: undefined;
269}
270export interface NSOptionsWithNamespaces extends NSOptions {
271 xmlns: true;
272}
273export interface XMLVersionOptions {
274 /**
275 * The default XML version to use. If unspecified, and there is no XML
276 * encoding declaration, the default version is "1.0".
277 */
278 defaultXMLVersion?: "1.0" | "1.1";
279 /**
280 * A flag indicating whether to force the XML version used for parsing to the
281 * value of ``defaultXMLVersion``. When this flag is ``true``,
282 * ``defaultXMLVersion`` must be specified. If unspecified, the default value
283 * of this flag is ``false``.
284 */
285 forceXMLVersion?: boolean;
286}
287export interface NoForcedXMLVersion extends XMLVersionOptions {
288 forceXMLVersion?: false;
289}
290export interface ForcedXMLVersion extends XMLVersionOptions {
291 forceXMLVersion: true;
292 defaultXMLVersion: Exclude<XMLVersionOptions["defaultXMLVersion"], undefined>;
293}
294/**
295 * The entire set of options supported by saxes.
296 */
297export declare type SaxesOptions = CommonOptions & NSOptions & XMLVersionOptions;
298export declare type TagForOptions<O extends SaxesOptions> = O extends {
299 xmlns: true;
300} ? SaxesTagNS : O extends {
301 xmlns?: false | undefined;
302} ? SaxesTagPlain : SaxesTag;
303export declare type StartTagForOptions<O extends SaxesOptions> = O extends {
304 xmlns: true;
305} ? SaxesStartTagNS : O extends {
306 xmlns?: false | undefined;
307} ? SaxesStartTagPlain : SaxesStartTag;
308export declare class SaxesParser<O extends SaxesOptions = {}> {
309 private readonly fragmentOpt;
310 private readonly xmlnsOpt;
311 private readonly trackPosition;
312 private readonly fileName?;
313 private readonly nameStartCheck;
314 private readonly nameCheck;
315 private readonly isName;
316 private readonly ns;
317 private openWakaBang;
318 private text;
319 private name;
320 private piTarget;
321 private entity;
322 private q;
323 private tags;
324 private tag;
325 private topNS;
326 private chunk;
327 private chunkPosition;
328 private i;
329 private prevI;
330 private carriedFromPrevious?;
331 private forbiddenState;
332 private attribList;
333 private state;
334 private reportedTextBeforeRoot;
335 private reportedTextAfterRoot;
336 private closedRoot;
337 private sawRoot;
338 private xmlDeclPossible;
339 private xmlDeclExpects;
340 private entityReturnState?;
341 private processAttribs;
342 private positionAtNewLine;
343 private doctype;
344 private getCode;
345 private isChar;
346 private pushAttrib;
347 private _closed;
348 private currentXMLVersion;
349 private readonly stateTable;
350 private xmldeclHandler?;
351 private textHandler?;
352 private piHandler?;
353 private doctypeHandler?;
354 private commentHandler?;
355 private openTagStartHandler?;
356 private openTagHandler?;
357 private closeTagHandler?;
358 private cdataHandler?;
359 private errorHandler?;
360 private endHandler?;
361 private readyHandler?;
362 private attributeHandler?;
363 /**
364 * Indicates whether or not the parser is closed. If ``true``, wait for
365 * the ``ready`` event to write again.
366 */
367 get closed(): boolean;
368 readonly opt: SaxesOptions;
369 /**
370 * The XML declaration for this document.
371 */
372 xmlDecl: XMLDecl;
373 /**
374 * The line number of the next character to be read by the parser. This field
375 * is one-based. (The first line is numbered 1.)
376 */
377 line: number;
378 /**
379 * The column number of the next character to be read by the parser. *
380 * This field is zero-based. (The first column is 0.)
381 *
382 * This field counts columns by *Unicode character*. Note that this *can*
383 * be different from the index of the character in a JavaScript string due
384 * to how JavaScript handles astral plane characters.
385 *
386 * See [[columnIndex]] for a number that corresponds to the JavaScript index.
387 */
388 column: number;
389 /**
390 * A map of entity name to expansion.
391 */
392 ENTITIES: Record<string, string>;
393 /**
394 * @param opt The parser options.
395 */
396 constructor(opt?: O);
397 _init(): void;
398 /**
399 * The stream position the parser is currently looking at. This field is
400 * zero-based.
401 *
402 * This field is not based on counting Unicode characters but is to be
403 * interpreted as a plain index into a JavaScript string.
404 */
405 get position(): number;
406 /**
407 * The column number of the next character to be read by the parser. *
408 * This field is zero-based. (The first column in a line is 0.)
409 *
410 * This field reports the index at which the next character would be in the
411 * line if the line were represented as a JavaScript string. Note that this
412 * *can* be different to a count based on the number of *Unicode characters*
413 * due to how JavaScript handles astral plane characters.
414 *
415 * See [[column]] for a number that corresponds to a count of Unicode
416 * characters.
417 */
418 get columnIndex(): number;
419 /**
420 * Set an event listener on an event. The parser supports one handler per
421 * event type. If you try to set an event handler over an existing handler,
422 * the old handler is silently overwritten.
423 *
424 * @param name The event to listen to.
425 *
426 * @param handler The handler to set.
427 */
428 on<N extends EventName>(name: N, handler: EventNameToHandler<O, N>): void;
429 /**
430 * Unset an event handler.
431 *
432 * @parma name The event to stop listening to.
433 */
434 off(name: EventName): void;
435 /**
436 * Make an error object. The error object will have a message that contains
437 * the ``fileName`` option passed at the creation of the parser. If position
438 * tracking was turned on, it will also have line and column number
439 * information.
440 *
441 * @param message The message describing the error to report.
442 *
443 * @returns An error object with a properly formatted message.
444 */
445 makeError(message: string): Error;
446 /**
447 * Report a parsing error. This method is made public so that client code may
448 * check for issues that are outside the scope of this project and can report
449 * errors.
450 *
451 * @param message The error to report.
452 *
453 * @returns this
454 */
455 fail(message: string): this;
456 /**
457 * Write a XML data to the parser.
458 *
459 * @param chunk The XML data to write.
460 *
461 * @returns this
462 */
463 write(chunk: string | object | null): this;
464 /**
465 * Close the current stream. Perform final well-formedness checks and reset
466 * the parser tstate.
467 *
468 * @returns this
469 */
470 close(): this;
471 /**
472 * Get a single code point out of the current chunk. This updates the current
473 * position if we do position tracking.
474 *
475 * This is the algorithm to use for XML 1.0.
476 *
477 * @returns The character read.
478 */
479 private getCode10;
480 /**
481 * Get a single code point out of the current chunk. This updates the current
482 * position if we do position tracking.
483 *
484 * This is the algorithm to use for XML 1.1.
485 *
486 * @returns {number} The character read.
487 */
488 private getCode11;
489 /**
490 * Like ``getCode`` but with the return value normalized so that ``NL`` is
491 * returned for ``NL_LIKE``.
492 */
493 private getCodeNorm;
494 private unget;
495 /**
496 * Capture characters into a buffer until encountering one of a set of
497 * characters.
498 *
499 * @param chars An array of codepoints. Encountering a character in the array
500 * ends the capture. (``chars`` may safely contain ``NL``.)
501 *
502 * @return The character code that made the capture end, or ``EOC`` if we hit
503 * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
504 * instead.
505 */
506 private captureTo;
507 /**
508 * Capture characters into a buffer until encountering a character.
509 *
510 * @param char The codepoint that ends the capture. **NOTE ``char`` MAY NOT
511 * CONTAIN ``NL``.** Passing ``NL`` will result in buggy behavior.
512 *
513 * @return ``true`` if we ran into the character. Otherwise, we ran into the
514 * end of the current chunk.
515 */
516 private captureToChar;
517 /**
518 * Capture characters that satisfy ``isNameChar`` into the ``name`` field of
519 * this parser.
520 *
521 * @return The character code that made the test fail, or ``EOC`` if we hit
522 * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
523 * instead.
524 */
525 private captureNameChars;
526 /**
527 * Skip white spaces.
528 *
529 * @return The character that ended the skip, or ``EOC`` if we hit
530 * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
531 * instead.
532 */
533 private skipSpaces;
534 private setXMLVersion;
535 private sBegin;
536 private sBeginWhitespace;
537 private sDoctype;
538 private sDoctypeQuote;
539 private sDTD;
540 private sDTDQuoted;
541 private sDTDOpenWaka;
542 private sDTDOpenWakaBang;
543 private sDTDComment;
544 private sDTDCommentEnding;
545 private sDTDCommentEnded;
546 private sDTDPI;
547 private sDTDPIEnding;
548 private sText;
549 private sEntity;
550 private sOpenWaka;
551 private sOpenWakaBang;
552 private sComment;
553 private sCommentEnding;
554 private sCommentEnded;
555 private sCData;
556 private sCDataEnding;
557 private sCDataEnding2;
558 private sPIFirstChar;
559 private sPIRest;
560 private sPIBody;
561 private sPIEnding;
562 private sXMLDeclNameStart;
563 private sXMLDeclName;
564 private sXMLDeclEq;
565 private sXMLDeclValueStart;
566 private sXMLDeclValue;
567 private sXMLDeclSeparator;
568 private sXMLDeclEnding;
569 private sOpenTag;
570 private sOpenTagSlash;
571 private sAttrib;
572 private sAttribName;
573 private sAttribNameSawWhite;
574 private sAttribValue;
575 private sAttribValueQuoted;
576 private sAttribValueClosed;
577 private sAttribValueUnquoted;
578 private sCloseTag;
579 private sCloseTagSawWhite;
580 private handleTextInRoot;
581 private handleTextOutsideRoot;
582 private pushAttribNS;
583 private pushAttribPlain;
584 /**
585 * End parsing. This performs final well-formedness checks and resets the
586 * parser to a clean state.
587 *
588 * @returns this
589 */
590 private end;
591 /**
592 * Resolve a namespace prefix.
593 *
594 * @param prefix The prefix to resolve.
595 *
596 * @returns The namespace URI or ``undefined`` if the prefix is not defined.
597 */
598 resolve(prefix: string): string | undefined;
599 /**
600 * Parse a qname into its prefix and local name parts.
601 *
602 * @param name The name to parse
603 *
604 * @returns
605 */
606 private qname;
607 private processAttribsNS;
608 private processAttribsPlain;
609 /**
610 * Handle a complete open tag. This parser code calls this once it has seen
611 * the whole tag. This method checks for well-formeness and then emits
612 * ``onopentag``.
613 */
614 private openTag;
615 /**
616 * Handle a complete self-closing tag. This parser code calls this once it has
617 * seen the whole tag. This method checks for well-formeness and then emits
618 * ``onopentag`` and ``onclosetag``.
619 */
620 private openSelfClosingTag;
621 /**
622 * Handle a complete close tag. This parser code calls this once it has seen
623 * the whole tag. This method checks for well-formeness and then emits
624 * ``onclosetag``.
625 */
626 private closeTag;
627 /**
628 * Resolves an entity. Makes any necessary well-formedness checks.
629 *
630 * @param entity The entity to resolve.
631 *
632 * @returns The parsed entity.
633 */
634 private parseEntity;
635}