| '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;
 |