summaryrefslogtreecommitdiff
path: root/node_modules/entities/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/entities/src/index.ts')
-rw-r--r--node_modules/entities/src/index.ts188
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";