index.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. var named_references_1 = require("./named-references");
  15. var numeric_unicode_map_1 = require("./numeric-unicode-map");
  16. var surrogate_pairs_1 = require("./surrogate-pairs");
  17. var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 });
  18. var encodeRegExps = {
  19. specialChars: /[<>'"&]/g,
  20. nonAscii: /[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,
  21. nonAsciiPrintable: /[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,
  22. nonAsciiPrintableOnly: /[\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,
  23. extensive: /[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g
  24. };
  25. var defaultEncodeOptions = {
  26. mode: 'specialChars',
  27. level: 'all',
  28. numeric: 'decimal'
  29. };
  30. /** Encodes all the necessary (specified by `level`) characters in the text */
  31. function encode(text, _a) {
  32. var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e;
  33. if (!text) {
  34. return '';
  35. }
  36. var encodeRegExp = encodeRegExps[mode];
  37. var references = allNamedReferences[level].characters;
  38. var isHex = numeric === 'hexadecimal';
  39. encodeRegExp.lastIndex = 0;
  40. var _b = encodeRegExp.exec(text);
  41. var _c;
  42. if (_b) {
  43. _c = '';
  44. var _d = 0;
  45. do {
  46. if (_d !== _b.index) {
  47. _c += text.substring(_d, _b.index);
  48. }
  49. var _e = _b[0];
  50. var result_1 = references[_e];
  51. if (!result_1) {
  52. var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0);
  53. result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';';
  54. }
  55. _c += result_1;
  56. _d = _b.index + _e.length;
  57. } while ((_b = encodeRegExp.exec(text)));
  58. if (_d !== text.length) {
  59. _c += text.substring(_d);
  60. }
  61. }
  62. else {
  63. _c =
  64. text;
  65. }
  66. return _c;
  67. }
  68. exports.encode = encode;
  69. var defaultDecodeOptions = {
  70. scope: 'body',
  71. level: 'all'
  72. };
  73. var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g;
  74. var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g;
  75. var baseDecodeRegExps = {
  76. xml: {
  77. strict: strict,
  78. attribute: attribute,
  79. body: named_references_1.bodyRegExps.xml
  80. },
  81. html4: {
  82. strict: strict,
  83. attribute: attribute,
  84. body: named_references_1.bodyRegExps.html4
  85. },
  86. html5: {
  87. strict: strict,
  88. attribute: attribute,
  89. body: named_references_1.bodyRegExps.html5
  90. }
  91. };
  92. var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 });
  93. var fromCharCode = String.fromCharCode;
  94. var outOfBoundsChar = fromCharCode(65533);
  95. var defaultDecodeEntityOptions = {
  96. level: 'all'
  97. };
  98. /** Decodes a single entity */
  99. function decodeEntity(entity, _a) {
  100. var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b;
  101. if (!entity) {
  102. return '';
  103. }
  104. var _b = entity;
  105. var decodeEntityLastChar_1 = entity[entity.length - 1];
  106. if (false
  107. && decodeEntityLastChar_1 === '=') {
  108. _b =
  109. entity;
  110. }
  111. else if (false
  112. && decodeEntityLastChar_1 !== ';') {
  113. _b =
  114. entity;
  115. }
  116. else {
  117. var decodeResultByReference_1 = allNamedReferences[level].entities[entity];
  118. if (decodeResultByReference_1) {
  119. _b = decodeResultByReference_1;
  120. }
  121. else if (entity[0] === '&' && entity[1] === '#') {
  122. var decodeSecondChar_1 = entity[2];
  123. var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X'
  124. ? parseInt(entity.substr(3), 16)
  125. : parseInt(entity.substr(2));
  126. _b =
  127. decodeCode_1 >= 0x10ffff
  128. ? outOfBoundsChar
  129. : decodeCode_1 > 65535
  130. ? surrogate_pairs_1.fromCodePoint(decodeCode_1)
  131. : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1);
  132. }
  133. }
  134. return _b;
  135. }
  136. exports.decodeEntity = decodeEntity;
  137. /** Decodes all entities in the text */
  138. function decode(text, _a) {
  139. var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b;
  140. if (!text) {
  141. return '';
  142. }
  143. var decodeRegExp = decodeRegExps[level][scope];
  144. var references = allNamedReferences[level].entities;
  145. var isAttribute = scope === 'attribute';
  146. var isStrict = scope === 'strict';
  147. decodeRegExp.lastIndex = 0;
  148. var replaceMatch_1 = decodeRegExp.exec(text);
  149. var replaceResult_1;
  150. if (replaceMatch_1) {
  151. replaceResult_1 = '';
  152. var replaceLastIndex_1 = 0;
  153. do {
  154. if (replaceLastIndex_1 !== replaceMatch_1.index) {
  155. replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index);
  156. }
  157. var replaceInput_1 = replaceMatch_1[0];
  158. var decodeResult_1 = replaceInput_1;
  159. var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1];
  160. if (isAttribute
  161. && decodeEntityLastChar_2 === '=') {
  162. decodeResult_1 = replaceInput_1;
  163. }
  164. else if (isStrict
  165. && decodeEntityLastChar_2 !== ';') {
  166. decodeResult_1 = replaceInput_1;
  167. }
  168. else {
  169. var decodeResultByReference_2 = references[replaceInput_1];
  170. if (decodeResultByReference_2) {
  171. decodeResult_1 = decodeResultByReference_2;
  172. }
  173. else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') {
  174. var decodeSecondChar_2 = replaceInput_1[2];
  175. var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X'
  176. ? parseInt(replaceInput_1.substr(3), 16)
  177. : parseInt(replaceInput_1.substr(2));
  178. decodeResult_1 =
  179. decodeCode_2 >= 0x10ffff
  180. ? outOfBoundsChar
  181. : decodeCode_2 > 65535
  182. ? surrogate_pairs_1.fromCodePoint(decodeCode_2)
  183. : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2);
  184. }
  185. }
  186. replaceResult_1 += decodeResult_1;
  187. replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length;
  188. } while ((replaceMatch_1 = decodeRegExp.exec(text)));
  189. if (replaceLastIndex_1 !== text.length) {
  190. replaceResult_1 += text.substring(replaceLastIndex_1);
  191. }
  192. }
  193. else {
  194. replaceResult_1 =
  195. text;
  196. }
  197. return replaceResult_1;
  198. }
  199. exports.decode = decode;