You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
2.9 KiB
155 lines
2.9 KiB
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;
|
|
|