Comparing version 4.2.0 to 4.3.0
@@ -0,3 +1,4 @@ | ||
export declare const fromCodePoint: (...codePoints: number[]) => string; | ||
export declare function replaceCodePoint(codePoint: number): number; | ||
export default function decodeCodePoint(codePoint: number): string; | ||
//# sourceMappingURL=decode_codepoint.d.ts.map |
@@ -5,3 +5,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.replaceCodePoint = void 0; | ||
exports.replaceCodePoint = exports.fromCodePoint = void 0; | ||
var decodeMap = new Map([ | ||
@@ -37,3 +37,3 @@ [0, 65533], | ||
]); | ||
var fromCodePoint = | ||
exports.fromCodePoint = | ||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins | ||
@@ -59,5 +59,5 @@ (_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) { | ||
function decodeCodePoint(codePoint) { | ||
return fromCodePoint(replaceCodePoint(codePoint)); | ||
return (0, exports.fromCodePoint)(replaceCodePoint(codePoint)); | ||
} | ||
exports.default = decodeCodePoint; | ||
//# sourceMappingURL=decode_codepoint.js.map |
import htmlDecodeTree from "./generated/decode-data-html.js"; | ||
import xmlDecodeTree from "./generated/decode-data-xml.js"; | ||
import { default as decodeCodePoint, replaceCodePoint } from "./decode_codepoint.js"; | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint, replaceCodePoint }; | ||
import decodeCodePoint from "./decode_codepoint.js"; | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint }; | ||
export { replaceCodePoint, fromCodePoint } from "./decode_codepoint.js"; | ||
export declare enum BinTrieFlags { | ||
@@ -6,0 +7,0 @@ VALUE_LENGTH = 49152, |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -29,3 +6,3 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.decodeXML = exports.decodeHTMLStrict = exports.decodeHTML = exports.determineBranch = exports.BinTrieFlags = exports.replaceCodePoint = exports.decodeCodePoint = exports.xmlDecodeTree = exports.htmlDecodeTree = void 0; | ||
exports.decodeXML = exports.decodeHTMLStrict = exports.decodeHTML = exports.determineBranch = exports.BinTrieFlags = exports.fromCodePoint = exports.replaceCodePoint = exports.decodeCodePoint = exports.xmlDecodeTree = exports.htmlDecodeTree = void 0; | ||
var decode_data_html_js_1 = __importDefault(require("./generated/decode-data-html.js")); | ||
@@ -35,5 +12,19 @@ exports.htmlDecodeTree = decode_data_html_js_1.default; | ||
exports.xmlDecodeTree = decode_data_xml_js_1.default; | ||
var decode_codepoint_js_1 = __importStar(require("./decode_codepoint.js")); | ||
Object.defineProperty(exports, "decodeCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_1.default; } }); | ||
Object.defineProperty(exports, "replaceCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_1.replaceCodePoint; } }); | ||
var decode_codepoint_js_1 = __importDefault(require("./decode_codepoint.js")); | ||
exports.decodeCodePoint = decode_codepoint_js_1.default; | ||
var decode_codepoint_js_2 = require("./decode_codepoint.js"); | ||
Object.defineProperty(exports, "replaceCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.replaceCodePoint; } }); | ||
Object.defineProperty(exports, "fromCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.fromCodePoint; } }); | ||
var CharCodes; | ||
(function (CharCodes) { | ||
CharCodes[CharCodes["NUM"] = 35] = "NUM"; | ||
CharCodes[CharCodes["SEMI"] = 59] = "SEMI"; | ||
CharCodes[CharCodes["ZERO"] = 48] = "ZERO"; | ||
CharCodes[CharCodes["NINE"] = 57] = "NINE"; | ||
CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A"; | ||
CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F"; | ||
CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X"; | ||
/** Bit that needs to be set to convert an upper case ASCII character to lower case */ | ||
CharCodes[CharCodes["To_LOWER_BIT"] = 32] = "To_LOWER_BIT"; | ||
})(CharCodes || (CharCodes = {})); | ||
var BinTrieFlags; | ||
@@ -56,3 +47,3 @@ (function (BinTrieFlags) { | ||
// If we have a numeric entity, handle this separately. | ||
if (str.charCodeAt(strIdx) === 35 /* NUM */) { | ||
if (str.charCodeAt(strIdx) === CharCodes.NUM) { | ||
// Skip the leading "&#". For hex entities, also skip the leading "x". | ||
@@ -62,3 +53,3 @@ var start = strIdx + 1; | ||
var cp = str.charCodeAt(start); | ||
if ((cp | 32 /* To_LOWER_BIT */) === 120 /* LOWER_X */) { | ||
if ((cp | CharCodes.To_LOWER_BIT) === CharCodes.LOWER_X) { | ||
base = 16; | ||
@@ -70,10 +61,10 @@ strIdx += 1; | ||
cp = str.charCodeAt(++strIdx); | ||
while ((cp >= 48 /* ZERO */ && cp <= 57 /* NINE */) || | ||
while ((cp >= CharCodes.ZERO && cp <= CharCodes.NINE) || | ||
(base === 16 && | ||
(cp | 32 /* To_LOWER_BIT */) >= 97 /* LOWER_A */ && | ||
(cp | 32 /* To_LOWER_BIT */) <= 102 /* LOWER_F */)); | ||
(cp | CharCodes.To_LOWER_BIT) >= CharCodes.LOWER_A && | ||
(cp | CharCodes.To_LOWER_BIT) <= CharCodes.LOWER_F)); | ||
if (start !== strIdx) { | ||
var entity = str.substring(start, strIdx); | ||
var parsed = parseInt(entity, base); | ||
if (str.charCodeAt(strIdx) === 59 /* SEMI */) { | ||
if (str.charCodeAt(strIdx) === CharCodes.SEMI) { | ||
strIdx += 1; | ||
@@ -102,3 +93,3 @@ } | ||
// If we have a legacy entity while parsing strictly, just skip the number of bytes | ||
if (!strict || str.charCodeAt(strIdx) === 59 /* SEMI */) { | ||
if (!strict || str.charCodeAt(strIdx) === CharCodes.SEMI) { | ||
resultIdx = treeIdx; | ||
@@ -105,0 +96,0 @@ excess = 0; |
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using XML entities. | ||
* | ||
* If a character has no equivalent entity, a | ||
* numeric hexadecimal reference (eg. `ü`) will be used. | ||
*/ | ||
export declare function encodeXML(str: string): string; | ||
/** | ||
* Encodes all entities and non-ASCII characters in the input. | ||
@@ -28,34 +20,2 @@ * | ||
export declare function encodeNonAsciiHTML(data: string): string; | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using numeric hexadecimal reference (eg. `ü`). | ||
* | ||
* Have a look at `escapeUTF8` if you want a more concise output at the expense | ||
* of reduced transportability. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escape: typeof encodeXML; | ||
/** | ||
* Encodes all characters not valid in XML documents using XML entities. | ||
* | ||
* Note that the output will be character-set dependent. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeUTF8: (data: string) => string; | ||
/** | ||
* Encodes all characters that have to be escaped in HTML attributes, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeAttribute: (data: string) => string; | ||
/** | ||
* Encodes all characters that have to be escaped in HTML text, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeText: (data: string) => string; | ||
//# sourceMappingURL=encode.d.ts.map |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0; | ||
var encode_trie_js_1 = require("./encode-trie.js"); | ||
exports.encodeNonAsciiHTML = exports.encodeHTML = void 0; | ||
var encode_html_js_1 = __importDefault(require("./generated/encode-html.js")); | ||
var escape_js_1 = require("./escape.js"); | ||
var htmlReplacer = /[\t\n!-,./:-@[-`\f{-}$\x80-\uFFFF]/g; | ||
var xmlReplacer = /["&'<>$\x80-\uFFFF]/g; | ||
var xmlCodeMap = new Map([ | ||
[34, """], | ||
[38, "&"], | ||
[39, "'"], | ||
[60, "<"], | ||
[62, ">"], | ||
]); | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using XML entities. | ||
* | ||
* If a character has no equivalent entity, a | ||
* numeric hexadecimal reference (eg. `ü`) will be used. | ||
*/ | ||
function encodeXML(str) { | ||
var ret = ""; | ||
var lastIdx = 0; | ||
var match; | ||
while ((match = xmlReplacer.exec(str)) !== null) { | ||
var i = match.index; | ||
var char = str.charCodeAt(i); | ||
var next = xmlCodeMap.get(char); | ||
if (next !== undefined) { | ||
ret += str.substring(lastIdx, i) + next; | ||
lastIdx = i + 1; | ||
} | ||
else { | ||
ret += "".concat(str.substring(lastIdx, i), "&#x").concat((0, encode_trie_js_1.getCodePoint)(str, i).toString(16), ";"); | ||
// Increase by 1 if we have a surrogate pair | ||
lastIdx = xmlReplacer.lastIndex += Number((char & 65408) === 0xd800); | ||
} | ||
} | ||
return ret + str.substr(lastIdx); | ||
} | ||
exports.encodeXML = encodeXML; | ||
/** | ||
* Encodes all entities and non-ASCII characters in the input. | ||
@@ -53,3 +21,3 @@ * | ||
function encodeHTML(data) { | ||
return (0, encode_trie_js_1.encodeHTMLTrieRe)(htmlReplacer, data); | ||
return encodeHTMLTrieRe(htmlReplacer, data); | ||
} | ||
@@ -65,63 +33,45 @@ exports.encodeHTML = encodeHTML; | ||
function encodeNonAsciiHTML(data) { | ||
return (0, encode_trie_js_1.encodeHTMLTrieRe)(xmlReplacer, data); | ||
return encodeHTMLTrieRe(escape_js_1.xmlReplacer, data); | ||
} | ||
exports.encodeNonAsciiHTML = encodeNonAsciiHTML; | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using numeric hexadecimal reference (eg. `ü`). | ||
* | ||
* Have a look at `escapeUTF8` if you want a more concise output at the expense | ||
* of reduced transportability. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
exports.escape = encodeXML; | ||
function getEscaper(regex, map) { | ||
return function escape(data) { | ||
var match; | ||
var lastIdx = 0; | ||
var result = ""; | ||
while ((match = regex.exec(data))) { | ||
if (lastIdx !== match.index) { | ||
result += data.substring(lastIdx, match.index); | ||
function encodeHTMLTrieRe(regExp, str) { | ||
var ret = ""; | ||
var lastIdx = 0; | ||
var match; | ||
while ((match = regExp.exec(str)) !== null) { | ||
var i = match.index; | ||
ret += str.substring(lastIdx, i); | ||
var char = str.charCodeAt(i); | ||
var next = encode_html_js_1.default.get(char); | ||
if (typeof next === "object") { | ||
// We are in a branch. Try to match the next char. | ||
if (i + 1 < str.length) { | ||
var nextChar = str.charCodeAt(i + 1); | ||
var value = typeof next.n === "number" | ||
? next.n === nextChar | ||
? next.o | ||
: undefined | ||
: next.n.get(nextChar); | ||
if (value !== undefined) { | ||
ret += value; | ||
lastIdx = regExp.lastIndex += 1; | ||
continue; | ||
} | ||
} | ||
// We know that this chararcter will be in the map. | ||
result += map.get(match[0].charCodeAt(0)); | ||
// Every match will be of length 1 | ||
lastIdx = match.index + 1; | ||
next = next.v; | ||
} | ||
return result + data.substring(lastIdx); | ||
}; | ||
// We might have a tree node without a value; skip and use a numeric entitiy. | ||
if (next !== undefined) { | ||
ret += next; | ||
lastIdx = i + 1; | ||
} | ||
else { | ||
var cp = (0, escape_js_1.getCodePoint)(str, i); | ||
ret += "&#x".concat(cp.toString(16), ";"); | ||
// Increase by 1 if we have a surrogate pair | ||
lastIdx = regExp.lastIndex += Number(cp !== char); | ||
} | ||
} | ||
return ret + str.substr(lastIdx); | ||
} | ||
/** | ||
* Encodes all characters not valid in XML documents using XML entities. | ||
* | ||
* Note that the output will be character-set dependent. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
exports.escapeUTF8 = getEscaper(/[&<>'"]/g, xmlCodeMap); | ||
/** | ||
* Encodes all characters that have to be escaped in HTML attributes, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
exports.escapeAttribute = getEscaper(/["&\u00A0]/g, new Map([ | ||
[34, """], | ||
[38, "&"], | ||
[160, " "], | ||
])); | ||
/** | ||
* Encodes all characters that have to be escaped in HTML text, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
exports.escapeText = getEscaper(/[&<>\u00A0]/g, new Map([ | ||
[38, "&"], | ||
[60, "<"], | ||
[62, ">"], | ||
[160, " "], | ||
])); | ||
//# sourceMappingURL=encode.js.map |
@@ -0,3 +1,4 @@ | ||
export declare const fromCodePoint: (...codePoints: number[]) => string; | ||
export declare function replaceCodePoint(codePoint: number): number; | ||
export default function decodeCodePoint(codePoint: number): string; | ||
//# sourceMappingURL=decode_codepoint.d.ts.map |
@@ -33,3 +33,3 @@ // Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 | ||
]); | ||
const fromCodePoint = | ||
export const fromCodePoint = | ||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins | ||
@@ -36,0 +36,0 @@ (_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) { |
import htmlDecodeTree from "./generated/decode-data-html.js"; | ||
import xmlDecodeTree from "./generated/decode-data-xml.js"; | ||
import { default as decodeCodePoint, replaceCodePoint } from "./decode_codepoint.js"; | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint, replaceCodePoint }; | ||
import decodeCodePoint from "./decode_codepoint.js"; | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint }; | ||
export { replaceCodePoint, fromCodePoint } from "./decode_codepoint.js"; | ||
export declare enum BinTrieFlags { | ||
@@ -6,0 +7,0 @@ VALUE_LENGTH = 49152, |
import htmlDecodeTree from "./generated/decode-data-html.js"; | ||
import xmlDecodeTree from "./generated/decode-data-xml.js"; | ||
import { default as decodeCodePoint, replaceCodePoint, } from "./decode_codepoint.js"; | ||
import decodeCodePoint from "./decode_codepoint.js"; | ||
// Re-export for use by eg. htmlparser2 | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint, replaceCodePoint }; | ||
export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint }; | ||
export { replaceCodePoint, fromCodePoint } from "./decode_codepoint.js"; | ||
var CharCodes; | ||
(function (CharCodes) { | ||
CharCodes[CharCodes["NUM"] = 35] = "NUM"; | ||
CharCodes[CharCodes["SEMI"] = 59] = "SEMI"; | ||
CharCodes[CharCodes["ZERO"] = 48] = "ZERO"; | ||
CharCodes[CharCodes["NINE"] = 57] = "NINE"; | ||
CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A"; | ||
CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F"; | ||
CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X"; | ||
/** Bit that needs to be set to convert an upper case ASCII character to lower case */ | ||
CharCodes[CharCodes["To_LOWER_BIT"] = 32] = "To_LOWER_BIT"; | ||
})(CharCodes || (CharCodes = {})); | ||
export var BinTrieFlags; | ||
@@ -23,3 +36,3 @@ (function (BinTrieFlags) { | ||
// If we have a numeric entity, handle this separately. | ||
if (str.charCodeAt(strIdx) === 35 /* NUM */) { | ||
if (str.charCodeAt(strIdx) === CharCodes.NUM) { | ||
// Skip the leading "&#". For hex entities, also skip the leading "x". | ||
@@ -29,3 +42,3 @@ let start = strIdx + 1; | ||
let cp = str.charCodeAt(start); | ||
if ((cp | 32 /* To_LOWER_BIT */) === 120 /* LOWER_X */) { | ||
if ((cp | CharCodes.To_LOWER_BIT) === CharCodes.LOWER_X) { | ||
base = 16; | ||
@@ -37,10 +50,10 @@ strIdx += 1; | ||
cp = str.charCodeAt(++strIdx); | ||
while ((cp >= 48 /* ZERO */ && cp <= 57 /* NINE */) || | ||
while ((cp >= CharCodes.ZERO && cp <= CharCodes.NINE) || | ||
(base === 16 && | ||
(cp | 32 /* To_LOWER_BIT */) >= 97 /* LOWER_A */ && | ||
(cp | 32 /* To_LOWER_BIT */) <= 102 /* LOWER_F */)); | ||
(cp | CharCodes.To_LOWER_BIT) >= CharCodes.LOWER_A && | ||
(cp | CharCodes.To_LOWER_BIT) <= CharCodes.LOWER_F)); | ||
if (start !== strIdx) { | ||
const entity = str.substring(start, strIdx); | ||
const parsed = parseInt(entity, base); | ||
if (str.charCodeAt(strIdx) === 59 /* SEMI */) { | ||
if (str.charCodeAt(strIdx) === CharCodes.SEMI) { | ||
strIdx += 1; | ||
@@ -69,3 +82,3 @@ } | ||
// If we have a legacy entity while parsing strictly, just skip the number of bytes | ||
if (!strict || str.charCodeAt(strIdx) === 59 /* SEMI */) { | ||
if (!strict || str.charCodeAt(strIdx) === CharCodes.SEMI) { | ||
resultIdx = treeIdx; | ||
@@ -72,0 +85,0 @@ excess = 0; |
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using XML entities. | ||
* | ||
* If a character has no equivalent entity, a | ||
* numeric hexadecimal reference (eg. `ü`) will be used. | ||
*/ | ||
export declare function encodeXML(str: string): string; | ||
/** | ||
* Encodes all entities and non-ASCII characters in the input. | ||
@@ -28,34 +20,2 @@ * | ||
export declare function encodeNonAsciiHTML(data: string): string; | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using numeric hexadecimal reference (eg. `ü`). | ||
* | ||
* Have a look at `escapeUTF8` if you want a more concise output at the expense | ||
* of reduced transportability. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escape: typeof encodeXML; | ||
/** | ||
* Encodes all characters not valid in XML documents using XML entities. | ||
* | ||
* Note that the output will be character-set dependent. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeUTF8: (data: string) => string; | ||
/** | ||
* Encodes all characters that have to be escaped in HTML attributes, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeAttribute: (data: string) => string; | ||
/** | ||
* Encodes all characters that have to be escaped in HTML text, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export declare const escapeText: (data: string) => string; | ||
//# sourceMappingURL=encode.d.ts.map |
@@ -1,39 +0,5 @@ | ||
import { encodeHTMLTrieRe, getCodePoint } from "./encode-trie.js"; | ||
import htmlTrie from "./generated/encode-html.js"; | ||
import { xmlReplacer, getCodePoint } from "./escape.js"; | ||
const htmlReplacer = /[\t\n!-,./:-@[-`\f{-}$\x80-\uFFFF]/g; | ||
const xmlReplacer = /["&'<>$\x80-\uFFFF]/g; | ||
const xmlCodeMap = new Map([ | ||
[34, """], | ||
[38, "&"], | ||
[39, "'"], | ||
[60, "<"], | ||
[62, ">"], | ||
]); | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using XML entities. | ||
* | ||
* If a character has no equivalent entity, a | ||
* numeric hexadecimal reference (eg. `ü`) will be used. | ||
*/ | ||
export function encodeXML(str) { | ||
let ret = ""; | ||
let lastIdx = 0; | ||
let match; | ||
while ((match = xmlReplacer.exec(str)) !== null) { | ||
const i = match.index; | ||
const char = str.charCodeAt(i); | ||
const next = xmlCodeMap.get(char); | ||
if (next !== undefined) { | ||
ret += str.substring(lastIdx, i) + next; | ||
lastIdx = i + 1; | ||
} | ||
else { | ||
ret += `${str.substring(lastIdx, i)}&#x${getCodePoint(str, i).toString(16)};`; | ||
// Increase by 1 if we have a surrogate pair | ||
lastIdx = xmlReplacer.lastIndex += Number((char & 65408) === 0xd800); | ||
} | ||
} | ||
return ret + str.substr(lastIdx); | ||
} | ||
/** | ||
* Encodes all entities and non-ASCII characters in the input. | ||
@@ -61,60 +27,42 @@ * | ||
} | ||
/** | ||
* Encodes all non-ASCII characters, as well as characters not valid in XML | ||
* documents using numeric hexadecimal reference (eg. `ü`). | ||
* | ||
* Have a look at `escapeUTF8` if you want a more concise output at the expense | ||
* of reduced transportability. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export const escape = encodeXML; | ||
function getEscaper(regex, map) { | ||
return function escape(data) { | ||
let match; | ||
let lastIdx = 0; | ||
let result = ""; | ||
while ((match = regex.exec(data))) { | ||
if (lastIdx !== match.index) { | ||
result += data.substring(lastIdx, match.index); | ||
function encodeHTMLTrieRe(regExp, str) { | ||
let ret = ""; | ||
let lastIdx = 0; | ||
let match; | ||
while ((match = regExp.exec(str)) !== null) { | ||
const i = match.index; | ||
ret += str.substring(lastIdx, i); | ||
const char = str.charCodeAt(i); | ||
let next = htmlTrie.get(char); | ||
if (typeof next === "object") { | ||
// We are in a branch. Try to match the next char. | ||
if (i + 1 < str.length) { | ||
const nextChar = str.charCodeAt(i + 1); | ||
const value = typeof next.n === "number" | ||
? next.n === nextChar | ||
? next.o | ||
: undefined | ||
: next.n.get(nextChar); | ||
if (value !== undefined) { | ||
ret += value; | ||
lastIdx = regExp.lastIndex += 1; | ||
continue; | ||
} | ||
} | ||
// We know that this chararcter will be in the map. | ||
result += map.get(match[0].charCodeAt(0)); | ||
// Every match will be of length 1 | ||
lastIdx = match.index + 1; | ||
next = next.v; | ||
} | ||
return result + data.substring(lastIdx); | ||
}; | ||
// We might have a tree node without a value; skip and use a numeric entitiy. | ||
if (next !== undefined) { | ||
ret += next; | ||
lastIdx = i + 1; | ||
} | ||
else { | ||
const cp = getCodePoint(str, i); | ||
ret += `&#x${cp.toString(16)};`; | ||
// Increase by 1 if we have a surrogate pair | ||
lastIdx = regExp.lastIndex += Number(cp !== char); | ||
} | ||
} | ||
return ret + str.substr(lastIdx); | ||
} | ||
/** | ||
* Encodes all characters not valid in XML documents using XML entities. | ||
* | ||
* Note that the output will be character-set dependent. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export const escapeUTF8 = getEscaper(/[&<>'"]/g, xmlCodeMap); | ||
/** | ||
* Encodes all characters that have to be escaped in HTML attributes, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export const escapeAttribute = getEscaper(/["&\u00A0]/g, new Map([ | ||
[34, """], | ||
[38, "&"], | ||
[160, " "], | ||
])); | ||
/** | ||
* Encodes all characters that have to be escaped in HTML text, | ||
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. | ||
* | ||
* @param data String to escape. | ||
*/ | ||
export const escapeText = getEscaper(/[&<>\u00A0]/g, new Map([ | ||
[38, "&"], | ||
[60, "<"], | ||
[62, ">"], | ||
[160, " "], | ||
])); | ||
//# sourceMappingURL=encode.js.map |
@@ -99,4 +99,5 @@ /** The level of entities to support. */ | ||
export declare function encode(data: string, options?: EncodingOptions | EntityLevel): string; | ||
export { encodeXML, encodeHTML, encodeNonAsciiHTML, escape, escapeUTF8, escapeAttribute, escapeText, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; | ||
export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; | ||
export { encodeHTML, encodeNonAsciiHTML, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; | ||
export { decodeXML, decodeHTML, decodeHTMLStrict, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode.js"; | ||
//# sourceMappingURL=index.d.ts.map |
import { decodeXML, decodeHTML, decodeHTMLStrict } from "./decode.js"; | ||
import { encodeXML, escapeUTF8, encodeHTML, encodeNonAsciiHTML, escapeAttribute, escapeText, } from "./encode.js"; | ||
import { encodeHTML, encodeNonAsciiHTML } from "./encode.js"; | ||
import { encodeXML, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; | ||
/** The level of entities to support. */ | ||
@@ -105,3 +106,4 @@ export var EntityLevel; | ||
} | ||
export { encodeXML, encodeHTML, encodeNonAsciiHTML, escape, escapeUTF8, escapeAttribute, escapeText, | ||
export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; | ||
export { encodeHTML, encodeNonAsciiHTML, | ||
// Legacy aliases (deprecated) | ||
@@ -108,0 +110,0 @@ encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; |
@@ -99,4 +99,5 @@ /** The level of entities to support. */ | ||
export declare function encode(data: string, options?: EncodingOptions | EntityLevel): string; | ||
export { encodeXML, encodeHTML, encodeNonAsciiHTML, escape, escapeUTF8, escapeAttribute, escapeText, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; | ||
export { encodeXML, escape, escapeUTF8, escapeAttribute, escapeText, } from "./escape.js"; | ||
export { encodeHTML, encodeNonAsciiHTML, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode.js"; | ||
export { decodeXML, decodeHTML, decodeHTMLStrict, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode.js"; | ||
//# sourceMappingURL=index.d.ts.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = exports.EncodingMode = exports.DecodingMode = exports.EntityLevel = void 0; | ||
exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.escape = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = exports.EncodingMode = exports.DecodingMode = exports.EntityLevel = void 0; | ||
var decode_js_1 = require("./decode.js"); | ||
var encode_js_1 = require("./encode.js"); | ||
var escape_js_1 = require("./escape.js"); | ||
/** The level of entities to support. */ | ||
@@ -99,7 +100,7 @@ var EntityLevel; | ||
if (opts.mode === EncodingMode.UTF8) | ||
return (0, encode_js_1.escapeUTF8)(data); | ||
return (0, escape_js_1.escapeUTF8)(data); | ||
if (opts.mode === EncodingMode.Attribute) | ||
return (0, encode_js_1.escapeAttribute)(data); | ||
return (0, escape_js_1.escapeAttribute)(data); | ||
if (opts.mode === EncodingMode.Text) | ||
return (0, encode_js_1.escapeText)(data); | ||
return (0, escape_js_1.escapeText)(data); | ||
if (opts.level === EntityLevel.HTML) { | ||
@@ -112,13 +113,14 @@ if (opts.mode === EncodingMode.ASCII) { | ||
// ASCII and Extensive are equivalent | ||
return (0, encode_js_1.encodeXML)(data); | ||
return (0, escape_js_1.encodeXML)(data); | ||
} | ||
exports.encode = encode; | ||
var escape_js_2 = require("./escape.js"); | ||
Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return escape_js_2.encodeXML; } }); | ||
Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } }); | ||
Object.defineProperty(exports, "escapeUTF8", { enumerable: true, get: function () { return escape_js_2.escapeUTF8; } }); | ||
Object.defineProperty(exports, "escapeAttribute", { enumerable: true, get: function () { return escape_js_2.escapeAttribute; } }); | ||
Object.defineProperty(exports, "escapeText", { enumerable: true, get: function () { return escape_js_2.escapeText; } }); | ||
var encode_js_2 = require("./encode.js"); | ||
Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_js_2.encodeXML; } }); | ||
Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_js_2.encodeHTML; } }); | ||
Object.defineProperty(exports, "encodeNonAsciiHTML", { enumerable: true, get: function () { return encode_js_2.encodeNonAsciiHTML; } }); | ||
Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_js_2.escape; } }); | ||
Object.defineProperty(exports, "escapeUTF8", { enumerable: true, get: function () { return encode_js_2.escapeUTF8; } }); | ||
Object.defineProperty(exports, "escapeAttribute", { enumerable: true, get: function () { return encode_js_2.escapeAttribute; } }); | ||
Object.defineProperty(exports, "escapeText", { enumerable: true, get: function () { return encode_js_2.escapeText; } }); | ||
// Legacy aliases (deprecated) | ||
@@ -125,0 +127,0 @@ Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_js_2.encodeHTML; } }); |
{ | ||
"name": "entities", | ||
"version": "4.2.0", | ||
"version": "4.3.0", | ||
"description": "Encode & decode XML and HTML entities with ease & speed", | ||
@@ -30,2 +30,6 @@ "author": "Felix Boehm <me@feedic.com>", | ||
"import": "./lib/esm/decode.js" | ||
}, | ||
"./lib/escape.js": { | ||
"require": "./lib/escape.js", | ||
"import": "./lib/esm/escape.js" | ||
} | ||
@@ -50,3 +54,3 @@ }, | ||
"ts-jest": "^27.1.4", | ||
"typedoc": "^0.22.13", | ||
"typedoc": "^0.22.14", | ||
"typescript": "^4.6.3" | ||
@@ -65,4 +69,4 @@ }, | ||
"build": "npm run build:cjs && npm run build:esm", | ||
"build:cjs": "tsc", | ||
"build:esm": "tsc --module esnext --target es2019 --outDir lib/esm && echo '{\"type\":\"module\"}' > lib/esm/package.json", | ||
"build:cjs": "tsc --sourceRoot https://raw.githubusercontent.com/fb55/entities/$(git rev-parse HEAD)/src/", | ||
"build:esm": "npm run build:cjs -- --module esnext --target es2019 --outDir lib/esm && echo '{\"type\":\"module\"}' > lib/esm/package.json", | ||
"build:docs": "typedoc --hideGenerator src/index.ts", | ||
@@ -69,0 +73,0 @@ "build:trie": "ts-node scripts/write-decode-map.ts", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
730095
2157