var ALPHA_INDEX = { '<': '<', '>': '>', '"': '"', '&apos': '\'', '&': '&', '<': '<', '>': '>', '"': '"', ''': '\'', '&': '&' }; var CHAR_INDEX = { 60: 'lt', 62: 'gt', 34: 'quot', 39: 'apos', 38: 'amp' }; var CHAR_S_INDEX = { '<': '<', '>': '>', '"': '"', '\'': ''', '&': '&' }; /** * @constructor */ function XmlEntities() {} /** * @param {String} str * @returns {String} */ XmlEntities.prototype.encode = function(str) { if (str.length === 0) { return ''; } return str.replace(/<|>|"|'|&/g, function(s) { return CHAR_S_INDEX[s]; }); }; /** * @param {String} str * @returns {String} */ XmlEntities.encode = function(str) { return new XmlEntities().encode(str); }; /** * @param {String} str * @returns {String} */ XmlEntities.prototype.decode = function(str) { if (str.length === 0) { return ''; } return str.replace(/&#?[0-9a-zA-Z]+;?/g, function(s) { if (s.charAt(1) === '#') { var code = s.charAt(2).toLowerCase() === 'x' ? parseInt(s.substr(3), 16) : parseInt(s.substr(2)); if (isNaN(code) || code < -32768 || code > 65535) { return ''; } return String.fromCharCode(code); } return ALPHA_INDEX[s] || s; }); }; /** * @param {String} str * @returns {String} */ XmlEntities.decode = function(str) { return new XmlEntities().decode(str); }; /** * @param {String} str * @returns {String} */ XmlEntities.prototype.encodeNonUTF = function(str) { var strLength = str.length; if (strLength === 0) { return ''; } var result = ''; var i = 0; while (i < strLength) { var c = str.charCodeAt(i); var alpha = CHAR_INDEX[c]; if (alpha) { result += "&" + alpha + ";"; i++; continue; } if (c < 32 || c > 126) { result += '&#' + c + ';'; } else { result += str.charAt(i); } i++; } return result; }; /** * @param {String} str * @returns {String} */ XmlEntities.encodeNonUTF = function(str) { return new XmlEntities().encodeNonUTF(str); }; /** * @param {String} str * @returns {String} */ XmlEntities.prototype.encodeNonASCII = function(str) { var strLenght = str.length; if (strLenght === 0) { return ''; } var result = ''; var i = 0; while (i < strLenght) { var c = str.charCodeAt(i); if (c <= 255) { result += str[i++]; continue; } result += '&#' + c + ';'; i++; } return result; }; /** * @param {String} str * @returns {String} */ XmlEntities.encodeNonASCII = function(str) { return new XmlEntities().encodeNonASCII(str); }; module.exports = XmlEntities;