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