entities
Version:
Encode & decode XML and HTML entities with ease & speed
205 lines • 8.85 kB
TypeScript
/**
* Decoding mode for named entities.
*/
export declare enum DecodingMode {
/** Entities in text nodes that can end with any character. */
Legacy = 0,
/** Only allow entities terminated with a semicolon. */
Strict = 1,
/** Entities in attributes have limitations on ending characters. */
Attribute = 2
}
/**
* Decodes an HTML string.
* @param htmlString The string to decode.
* @param mode The decoding mode.
* @returns The decoded string.
*/
export declare function decodeHTML(htmlString: string, mode?: DecodingMode): string;
/**
* Decodes an HTML string in an attribute.
* @param htmlAttribute The string to decode.
* @returns The decoded string.
*/
export declare function decodeHTMLAttribute(htmlAttribute: string): string;
/**
* Decodes an HTML string, requiring all entities to be terminated by a
* semicolon.
* @param htmlString The string to decode.
* @returns The decoded string.
*/
export declare function decodeHTMLStrict(htmlString: string): string;
/**
* Decodes an XML string, requiring all entities to be terminated by a
* semicolon.
* @param xmlString The string to decode.
* @returns The decoded string.
*/
export declare function decodeXML(xmlString: string): string;
/**
* Producers for character reference errors as defined in the HTML spec.
*/
export interface EntityErrorProducer {
missingSemicolonAfterCharacterReference(): void;
absenceOfDigitsInNumericCharacterReference(consumedCharacters: number): void;
/**
* Validate the accumulated numeric value, before Unicode replacement.
* Values beyond the JavaScript number range are positive infinity.
*/
validateNumericCharacterReference(code: number): void;
}
/**
* Token decoder with support of writing partial entities; the shared base
* of `HtmlEntityDecoder` and `XmlEntityDecoder`. Numeric entities are
* identical in both document types and are handled here; named entities are
* left to the subclasses.
*
* The decoder is driven by a tokenizer: after a `&`, write the following
* input (possibly in chunks). `write` returns the number of characters
* consumed once the entity is decided, or -1 while more input is needed.
* Rejection may surface later than strictly possible (the decoder buffers
* until a terminator or the name-length limit), but emitted code points,
* consumed counts, and final return values are exact.
*/
declare abstract class EntityDecoderBase {
/**
* The function that is called when a codepoint is decoded.
*
* For multi-byte named entities, this will be called multiple times,
* with the second codepoint, and the same `consumed` value.
* @param codepoint The decoded codepoint.
* @param consumed The number of bytes consumed by the decoder.
*/
protected readonly emitCodePoint: (cp: number, consumed: number) => void;
/** An object that is used to produce errors. */
protected readonly errors?: EntityErrorProducer | undefined;
/** The current state of the decoder. */
protected state: number;
/** Characters that were consumed while parsing an entity. */
protected consumed: number;
/** Accumulated numeric code point, or a packed partial XML name. */
protected result: number;
/** The mode in which the decoder is operating. */
protected decodeMode: DecodingMode;
/** Replacement rules for numeric character references. */
protected readonly replaceNumericCodePoint: (codePoint: number) => number;
constructor(
/**
* The function that is called when a codepoint is decoded.
*
* For multi-byte named entities, this will be called multiple times,
* with the second codepoint, and the same `consumed` value.
* @param codepoint The decoded codepoint.
* @param consumed The number of bytes consumed by the decoder.
*/
emitCodePoint: (cp: number, consumed: number) => void,
/** An object that is used to produce errors. */
errors?: EntityErrorProducer | undefined);
/**
* Switches between the numeric decimal and hexadecimal states.
*
* Equivalent to the `Numeric character reference state` in the HTML spec.
* @param input The string containing the entity (or a continuation of the entity).
* @param offset The current offset.
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
*/
private stateNumericStart;
/**
* Parses a hexadecimal numeric entity.
*
* Equivalent to the `Hexadecimal character reference state` in the HTML spec.
* @param input The string containing the entity (or a continuation of the entity).
* @param offset The current offset.
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
*/
private stateNumericHex;
/**
* Parses a decimal numeric entity.
*
* Equivalent to the `Decimal character reference state` in the HTML spec.
* @param input The string containing the entity (or a continuation of the entity).
* @param offset The current offset.
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
*/
private stateNumericDecimal;
/**
* Validate and emit a numeric entity.
*
* Implements the logic from the `Hexadecimal character reference start
* state` and `Numeric character reference end state` in the HTML spec.
* @param lastCp The last code point of the entity. Used to see if the
* entity was terminated with a semicolon.
* @param expectedLength The minimum number of characters that should be
* consumed. Used to validate that at least one digit
* was consumed.
* @returns The number of characters that were consumed.
*/
private emitNumericEntity;
/**
* Resets the instance to make it reusable.
* @param decodeMode Entity decoding mode to use.
*/
startEntity(decodeMode: DecodingMode): void;
/**
* Write an entity to the decoder. This can be called multiple times with partial entities.
* If the entity is incomplete, the decoder will return -1.
* @param input The string containing the entity (or a continuation of the entity).
* @param offset The offset at which the entity begins. Should be 0 if this is not the first call.
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
*/
write(input: string, offset: number): number;
/**
* Decode a named entity.
* @param input The string containing the entity (or a continuation of the entity).
* @param offset The current offset.
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
*/
protected abstract stateNamedEntity(input: string, offset: number): number;
/**
* Resolve a named entity that was still incomplete when the input
* ended.
* @returns The number of characters that were consumed.
*/
protected abstract endNamedEntity(): number;
/**
* Signal to the parser that the end of the input was reached.
*
* Remaining data will be emitted and relevant errors will be produced.
* @returns The number of characters consumed.
*/
end(): number;
}
/**
* Streaming decoder for HTML entities.
*
* When the entity fits inside the current chunk (the common case), the
* lookup runs directly on the chunk via the same length-probe scheme as the
* synchronous decoder; chunk-boundary runs use a reusable character buffer.
*/
export declare class HtmlEntityDecoder extends EntityDecoderBase {
/** Total name characters seen for the current named entity. */
private runLength;
/** Reused for ASCII alphanumerics; the 32nd character rules out an exact match. */
private readonly nameBuffer;
/**
* Emit the replacement for a matched slot. Values are at most two
* UTF-16 code units; like previous versions, each unit is emitted as
* its own callback (surrogate halves included).
* @param slot The matched slot.
*/
private emitSlot;
startEntity(decodeMode: DecodingMode): void;
protected stateNamedEntity(input: string, offset: number): number;
protected endNamedEntity(): number;
}
/**
* Streaming decoder for XML entities: the five predefined named entities
* plus numeric character references.
*/
export declare class XmlEntityDecoder extends EntityDecoderBase {
protected readonly replaceNumericCodePoint: (codePoint: number) => number;
protected stateNamedEntity(input: string, offset: number): number;
protected endNamedEntity(): number;
}
export { replaceCodePoint, replaceCodePointXML } from "./decode-codepoint.js";
//# sourceMappingURL=decode.d.ts.map