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.
		
		
		
		
		
			
		
			
				
					104 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					104 lines
				
				1.8 KiB
			| 
											3 years ago
										 | '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; |