diff options
| author | Shipwreckt <me@shipwreckt.co.uk> | 2025-10-31 20:02:14 +0000 |
|---|---|---|
| committer | Shipwreckt <me@shipwreckt.co.uk> | 2025-10-31 20:02:14 +0000 |
| commit | 7a52ddeba2a68388b544f529d2d92104420f77b0 (patch) | |
| tree | 15ddd47457a2cb4a96060747437d36474e4f6b4e /node_modules/entities/src/index.ts | |
| parent | 53d6ae2b5568437afa5e4995580a3fb679b7b91b (diff) | |
Changed from static to 11ty!
Diffstat (limited to 'node_modules/entities/src/index.ts')
| -rw-r--r-- | node_modules/entities/src/index.ts | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/node_modules/entities/src/index.ts b/node_modules/entities/src/index.ts new file mode 100644 index 0000000..6440562 --- /dev/null +++ b/node_modules/entities/src/index.ts @@ -0,0 +1,188 @@ +import { decodeXML, decodeHTML, DecodingMode } from "./decode.js"; +import { encodeHTML, encodeNonAsciiHTML } from "./encode.js"; +import { + encodeXML, + escapeUTF8, + escapeAttribute, + escapeText, +} from "./escape.js"; + +/** The level of entities to support. */ +export enum EntityLevel { + /** Support only XML entities. */ + XML = 0, + /** Support HTML entities, which are a superset of XML entities. */ + HTML = 1, +} + +export enum EncodingMode { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * XML will be escaped. + */ + UTF8, + /** + * The output consists only of ASCII characters. Characters that need + * escaping within HTML, and characters that aren't ASCII characters will + * be escaped. + */ + ASCII, + /** + * Encode all characters that have an equivalent entity, as well as all + * characters that are not ASCII characters. + */ + Extensive, + /** + * Encode all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Attribute, + /** + * Encode all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + */ + Text, +} + +export interface DecodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Decoding mode. If `Legacy`, will support legacy entities not terminated + * with a semicolon (`;`). + * + * Always `Strict` for XML. For HTML, set this to `true` if you are parsing + * an attribute value. + * + * The deprecated `decodeStrict` function defaults this to `Strict`. + * + * @default {@link DecodingMode.Legacy} + */ + mode?: DecodingMode | undefined; +} + +/** + * Decodes a string with entities. + * + * @param input String to decode. + * @param options Decoding options. + */ +export function decode( + input: string, + options: DecodingOptions | EntityLevel = EntityLevel.XML, +): string { + const level = typeof options === "number" ? options : options.level; + + if (level === EntityLevel.HTML) { + const mode = typeof options === "object" ? options.mode : undefined; + return decodeHTML(input, mode); + } + + return decodeXML(input); +} + +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param input String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export function decodeStrict( + input: string, + options: DecodingOptions | EntityLevel = EntityLevel.XML, +): string { + const normalizedOptions = + typeof options === "number" ? { level: options } : options; + normalizedOptions.mode ??= DecodingMode.Strict; + + return decode(input, normalizedOptions); +} + +/** + * Options for `encode`. + */ +export interface EncodingOptions { + /** + * The level of entities to support. + * @default {@link EntityLevel.XML} + */ + level?: EntityLevel; + /** + * Output format. + * @default {@link EncodingMode.Extensive} + */ + mode?: EncodingMode; +} + +/** + * Encodes a string with entities. + * + * @param input String to encode. + * @param options Encoding options. + */ +export function encode( + input: string, + options: EncodingOptions | EntityLevel = EntityLevel.XML, +): string { + const { mode = EncodingMode.Extensive, level = EntityLevel.XML } = + typeof options === "number" ? { level: options } : options; + + switch (mode) { + case EncodingMode.UTF8: { + return escapeUTF8(input); + } + case EncodingMode.Attribute: { + return escapeAttribute(input); + } + case EncodingMode.Text: { + return escapeText(input); + } + case EncodingMode.ASCII: { + return level === EntityLevel.HTML + ? encodeNonAsciiHTML(input) + : encodeXML(input); + } + // eslint-disable-next-line unicorn/no-useless-switch-case + case EncodingMode.Extensive: + default: { + return level === EntityLevel.HTML + ? encodeHTML(input) + : encodeXML(input); + } + } +} + +export { + encodeXML, + escape, + escapeUTF8, + escapeAttribute, + escapeText, +} from "./escape.js"; + +export { + encodeHTML, + encodeNonAsciiHTML, + // Legacy aliases (deprecated) + encodeHTML as encodeHTML4, + encodeHTML as encodeHTML5, +} from "./encode.js"; + +export { + EntityDecoder, + DecodingMode, + decodeXML, + decodeHTML, + decodeHTMLStrict, + decodeHTMLAttribute, + // Legacy aliases (deprecated) + decodeHTML as decodeHTML4, + decodeHTML as decodeHTML5, + decodeHTMLStrict as decodeHTML4Strict, + decodeHTMLStrict as decodeHTML5Strict, + decodeXML as decodeXMLStrict, +} from "./decode.js"; |
