Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

82 linhas
2.0 KiB

3 anos atrás
  1. var inverseXML = getInverseObj(require("../maps/xml.json")),
  2. xmlReplacer = getInverseReplacer(inverseXML);
  3. exports.XML = getInverse(inverseXML, xmlReplacer);
  4. var inverseHTML = getInverseObj(require("../maps/entities.json")),
  5. htmlReplacer = getInverseReplacer(inverseHTML);
  6. exports.HTML = getInverse(inverseHTML, htmlReplacer);
  7. function getInverseObj(obj) {
  8. return Object.keys(obj)
  9. .sort()
  10. .reduce(function(inverse, name) {
  11. inverse[obj[name]] = "&" + name + ";";
  12. return inverse;
  13. }, {});
  14. }
  15. function getInverseReplacer(inverse) {
  16. var single = [],
  17. multiple = [];
  18. Object.keys(inverse).forEach(function(k) {
  19. if (k.length === 1) {
  20. single.push("\\" + k);
  21. } else {
  22. multiple.push(k);
  23. }
  24. });
  25. //TODO add ranges
  26. multiple.unshift("[" + single.join("") + "]");
  27. return new RegExp(multiple.join("|"), "g");
  28. }
  29. var re_nonASCII = /[^\0-\x7F]/g,
  30. re_astralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
  31. function singleCharReplacer(c) {
  32. return (
  33. "&#x" +
  34. c
  35. .charCodeAt(0)
  36. .toString(16)
  37. .toUpperCase() +
  38. ";"
  39. );
  40. }
  41. function astralReplacer(c) {
  42. // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
  43. var high = c.charCodeAt(0);
  44. var low = c.charCodeAt(1);
  45. var codePoint = (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;
  46. return "&#x" + codePoint.toString(16).toUpperCase() + ";";
  47. }
  48. function getInverse(inverse, re) {
  49. function func(name) {
  50. return inverse[name];
  51. }
  52. return function(data) {
  53. return data
  54. .replace(re, func)
  55. .replace(re_astralSymbols, astralReplacer)
  56. .replace(re_nonASCII, singleCharReplacer);
  57. };
  58. }
  59. var re_xmlChars = getInverseReplacer(inverseXML);
  60. function escapeXML(data) {
  61. return data
  62. .replace(re_xmlChars, singleCharReplacer)
  63. .replace(re_astralSymbols, astralReplacer)
  64. .replace(re_nonASCII, singleCharReplacer);
  65. }
  66. exports.escape = escapeXML;