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