| 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 || !str.length) { |
| 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 || !str.length) { |
| 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) { |
| if (!str || !str.length) { |
| return ''; |
| } |
| var strLength = str.length; |
| 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) { |
| if (!str || !str.length) { |
| return ''; |
| } |
| var strLenght = str.length; |
| 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; |