/draft/o2/string/submodule/encode.js

https://github.com/v0lkan/o2.js · JavaScript · 138 lines · 117 code · 6 blank · 15 comment · 0 complexity · 9df5369278f5b1240cdcff8d57860115 MD5 · raw file

  1. define([
  2. ], function() {
  3. 'use strict';
  4. /*
  5. * # Module Exports
  6. */
  7. var exports = {},
  8. /*
  9. * # Mappings
  10. */
  11. /*
  12. *
  13. */
  14. xssEncodeNoAmpMap = [
  15. {regExp: /"/g, replace: '"'},
  16. {regExp: /</g, replace: '&#60;'},
  17. {regExp: />/g, replace: '&#62;'},
  18. {regExp: /\'/g, replace: '&#39;'}
  19. ],
  20. /*
  21. *
  22. */
  23. xssEncodeMap = [
  24. {regExp: /"/g, replace: '&#34;'},
  25. {regExp: /&/g, replace: '&amp;'},
  26. {regExp: /</g, replace: '&#60;'},
  27. {regExp: />/g, replace: '&#62;'},
  28. {regExp: /\'/g, replace: '&#39;'}
  29. ],
  30. /*
  31. *
  32. */
  33. encodeMap = [
  34. {regExp: / /g, replace: '&nbsp;'},
  35. {regExp: /"/g, replace: '&#34;'},
  36. {regExp: /&/g, replace: '&amp;'},
  37. {regExp: /</g, replace: '&#60;'},
  38. {regExp: />/g, replace: '&#62;'},
  39. {regExp: /\'/g, replace: '&#39;'}
  40. ],
  41. /*
  42. *
  43. */
  44. //TODO: [[/stuff/, 'repl'],[/stuff2/, 'repl2']] would save space.
  45. decodeMap = [
  46. {regExp: /&#32;|&nbsp;/g, replace: ' '},
  47. {regExp: /&#34;|&quot;|&quott;/g, replace: '"'},
  48. {regExp: /&#39;|&apos;|&aposs;/g, replace: '\''},
  49. {regExp: /&#60;|&lt;/g, replace: '<'},
  50. {regExp: /&#62;|&gt;/g, replace: '>'},
  51. {regExp: /&#38;|&amp;/g, replace: '&'}
  52. ],
  53. /*
  54. *
  55. */
  56. safeHtmlMap = [
  57. {regExp: /"/g, replace: '&quot;'},
  58. {regExp: /'/g, replace: '&#39;'}
  59. ],
  60. /*
  61. * # Common Text
  62. */
  63. kEmpty = '',
  64. kContainer = 'div',
  65. /*
  66. * # Temporary
  67. */
  68. tempDiv = null;
  69. /*
  70. *
  71. */
  72. function processMap(str, map) {
  73. var result = str,
  74. i, len, mapItem;
  75. for (i = 0, len = map.length; i < len; i++) {
  76. mapItem = map[i];
  77. result = result.replace(mapItem.regExp, mapItem.replace);
  78. }
  79. return result;
  80. }
  81. exports.decode = function(str) {
  82. return processMap([kEmpty, str].join(kEmpty), decodeMap);
  83. };
  84. exports.encode = function(str) {
  85. return processMap([kEmpty, str].join(kEmpty), encodeMap);
  86. };
  87. exports.htmlEncode = exports.encode;
  88. exports.encodeSafeHtml = function(str) {
  89. if (!tempDiv) {
  90. tempDiv = document.createElement(kContainer);
  91. }
  92. tempDiv.innerHTML = kEmpty;
  93. tempDiv.appendChild(
  94. document.createTextNode([kEmpty, str].join(kEmpty))
  95. );
  96. return processMap(tempDiv.innerHTML, safeHtmlMap);
  97. };
  98. exports.safeHtmlEncode = exports.encodeSafeHtml;
  99. exports.escape = function(str) {
  100. return encodeURIComponent([kEmpty, str].join(kEmpty));
  101. };
  102. exports.unescape = function(str) {
  103. return decodeURIComponent([kEmpty, str].join(kEmpty));
  104. };
  105. exports.xssEncode = function(str, isAmpersandsPreserved) {
  106. return processMap([kEmpty, str].join(kEmpty),
  107. !!isAmpersandsPreserved ? xssEncodeNoAmpMap : xssEncodeMap
  108. );
  109. };
  110. return exports;
  111. });