blob: c365e534ab125e6acdbae7f95ba40d34991950cf (
plain)
- "use strict";
- var entityToChar = require('./html5-entities.js').entityToChar;
- var ENTITY = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});";
- var reBackslashOrAmp = /[\\&]/;
- var ESCAPABLE = '[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]';
- var reEntityOrEscapedChar = new RegExp('\\\\' + ESCAPABLE + '|' + ENTITY, 'gi');
- var XMLSPECIAL = '[&<>"]';
- var reXmlSpecial = new RegExp(XMLSPECIAL, 'g');
- var reXmlSpecialOrEntity = new RegExp(ENTITY + '|' + XMLSPECIAL, 'gi');
- var unescapeChar = function(s) {
- if (s[0] === '\\') {
- return s[1];
- } else {
- return entityToChar(s);
- }
- };
- // Replace entities and backslash escapes with literal characters.
- var unescapeString = function(s) {
- if (reBackslashOrAmp.test(s)) {
- return s.replace(reEntityOrEscapedChar, unescapeChar);
- } else {
- return s;
- }
- };
- var normalizeURI = function(uri) {
- try {
- return encodeURI(decodeURI(uri));
- }
- catch(err) {
- return uri;
- }
- };
- var replaceUnsafeChar = function(s) {
- switch (s) {
- case '&':
- return '&';
- case '<':
- return '<';
- case '>':
- return '>';
- case '"':
- return '"';
- default:
- return s;
- }
- };
- var escapeXml = function(s, preserve_entities) {
- if (reXmlSpecial.test(s)) {
- if (preserve_entities) {
- return s.replace(reXmlSpecialOrEntity, replaceUnsafeChar);
- } else {
- return s.replace(reXmlSpecial, replaceUnsafeChar);
- }
- } else {
- return s;
- }
- };
- module.exports = { unescapeString: unescapeString,
- normalizeURI: normalizeURI,
- escapeXml: escapeXml
- };
|