'use strict'; var extend = require('extend-shallow'); var regexCache = {}; var all; var charSets = { default: { '"': '"', '"': '"', ''': '\'', ''': '\'', '&': '&', '&': '&', '>': '>', '>': '>', '<': '<', '<': '<' }, extras: { '¢': '¢', '¢': '¢', '©': '©', '©': '©', '€': '€', '€': '€', '£': '£', '£': '£', '®': '®', '®': '®', '¥': '¥', '¥': '¥' } }; // don't merge char sets unless "all" is explicitly called Object.defineProperty(charSets, 'all', { get: function() { return all || (all = extend({}, charSets.default, charSets.extras)); } }); /** * Convert HTML entities to HTML characters. * * @param {String} `str` String with HTML entities to un-escape. * @return {String} */ function unescape(str, type) { if (!isString(str)) return ''; var chars = charSets[type || 'default']; var regex = toRegex(type, chars); return str.replace(regex, function(m) { return chars[m]; }); } function toRegex(type, chars) { if (regexCache[type]) { return regexCache[type]; } var keys = Object.keys(chars).join('|'); var regex = new RegExp('(?=(' + keys + '))\\1', 'g'); regexCache[type] = regex; return regex; } /** * Returns true if str is a non-empty string */ function isString(str) { return str && typeof str === 'string'; } /** * Expose charSets */ unescape.chars = charSets.default; unescape.extras = charSets.extras; // don't trip the "charSets" getter unless it's explicitly called Object.defineProperty(unescape, 'all', { get: function() { return charSets.all; } }); /** * Expose `unescape` */ module.exports = unescape;