commerceml-parser
Version:
Parser for CommerceML standard developed by 1c.ru
108 lines (107 loc) • 3.31 kB
TypeScript
/// <reference types="node" />
import X2JS from 'x2js';
import { SaxesTag } from 'saxes';
import Emittery from 'emittery';
import { Readable } from 'stream';
export interface CommerceMlRule {
start: string[];
include?: string[][];
}
export interface CommerceMlRules extends Record<string, CommerceMlRule> {
}
/**
* Saxes event which is buffered and returned by low level parseChunk() generator.
*/
export interface SaxesEvent {
type: 'opentag' | 'text' | 'closetag' | 'end';
tag?: SaxesTag;
text?: string;
}
/**
* CommerceML event which is buffered and returned by top level parse() generator.
*/
export interface ParserEvent {
type: string;
data?: unknown;
}
export declare abstract class CommerceMlAbstractParser {
/**
* Current position in the xml file.
* Array of tag names.
*/
protected xPath: string[];
/**
* Current open tag name.
* Last tag name in xPath array.
*/
protected openTag: string;
/**
* Current parser rule key which is processed.
*/
protected currentRuleKey: string;
/**
* XML content collected starting from the openTag (inclusive) till the close tag (inclusive).
*/
protected xml: string;
/**
* Indicates whether current XML node should be collected according to parser rules.
*/
protected collectCurrentNode: boolean;
/**
* List of currently opened tags.
* i.e. xpath.
*/
protected openTags: string[];
/**
* Buffer of parser events collected from one parsed chunk.
* @protected
*/
protected events: ParserEvent[];
/**
* Serial synchronous Event emitter.
* @protected
*/
protected eventEmitter: Emittery;
/**
* XML to plain JS objects convertor.
* @protected
*/
protected x2js: X2JS;
/**
* CommerceML rules defines which XML tags should be collected and returned.
* @protected
*/
protected abstract rules: CommerceMlRules;
parse(readable: Readable): Promise<void>;
parseIterable(iterable: Iterable<string>): Promise<void>;
onEnd(callback: () => void | Promise<void>): void;
/**
* Generator method.
* Parses one chunk of the iterable input (Readable stream in the string data reading mode).
* @see https://nodejs.org/api/stream.html#stream_event_data
* @param iterable Iterable or Readable stream in the string data reading mode.
* @returns Array of SaxesParser events
* @throws Error if a SaxesParser error event was emitted.
*/
parseChunk(iterable: Iterable<string>): AsyncGenerator<SaxesEvent[], void, undefined>;
/**
* Processes parser events.
* @param events Collected parser events during one XML chunk parsing.
* @protected
*/
protected processParserEvents(events: ParserEvent[]): Promise<void>;
/**
* SAX 'opentag' event handler.
* @param tag
*/
protected onOpenTag(tag: SaxesTag): void;
/**
*
*/
protected shallCollect(): boolean;
protected addEventToBuffer(): void;
protected onText(text: string): void;
protected onCloseTag(tag: SaxesTag): void;
protected isCurrentXPathEqualsToRuleXPath(xPath: string[]): boolean;
protected isCurrentXPathStartsWithRuleXPath(xPath: string[]): boolean;
}