aboutsummaryrefslogtreecommitdiff
path: root/js/lib/common.js
blob: 06486d339d2592be634553c8f38898ed757a0615 (plain)
  1. "use strict";
  2. /* global unescape */
  3. var entityToChar = require('./html5-entities.js').entityToChar;
  4. var ENTITY = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});";
  5. var reBackslashOrAmp = /[\\&]/;
  6. var ESCAPABLE = '[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]';
  7. var reEntityOrEscapedChar = new RegExp('\\\\' + ESCAPABLE + '|' + ENTITY, 'gi');
  8. var XMLSPECIAL = '[&<>"]';
  9. var reXmlSpecial = new RegExp(XMLSPECIAL, 'g');
  10. var reXmlSpecialOrEntity = new RegExp(ENTITY + '|' + XMLSPECIAL, 'gi');
  11. var unescapeChar = function(s) {
  12. if (s[0] === '\\') {
  13. return s[1];
  14. } else {
  15. return entityToChar(s);
  16. }
  17. };
  18. // Replace entities and backslash escapes with literal characters.
  19. var unescapeString = function(s) {
  20. if (reBackslashOrAmp.test(s)) {
  21. return s.replace(reEntityOrEscapedChar, unescapeChar);
  22. } else {
  23. return s;
  24. }
  25. };
  26. var normalizeURI = function(uri) {
  27. return encodeURI(unescape(uri));
  28. };
  29. var replaceUnsafeChar = function(s) {
  30. switch (s) {
  31. case '&':
  32. return '&amp;';
  33. case '<':
  34. return '&lt;';
  35. case '>':
  36. return '&gt;';
  37. case '"':
  38. return '&quot;';
  39. default:
  40. return s;
  41. }
  42. };
  43. var escapeXml = function(s, preserve_entities) {
  44. if (reXmlSpecial.test(s)) {
  45. if (preserve_entities) {
  46. return s.replace(reXmlSpecialOrEntity, replaceUnsafeChar);
  47. } else {
  48. return s.replace(reXmlSpecial, replaceUnsafeChar);
  49. }
  50. } else {
  51. return s;
  52. }
  53. };
  54. module.exports = { unescapeString: unescapeString,
  55. normalizeURI: normalizeURI,
  56. escapeXml: escapeXml
  57. };