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