"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 };