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.
		
		
		
		
		
			
		
			
				
					
					
						
							33 lines
						
					
					
						
							1.0 KiB
						
					
					
				
			
		
		
	
	
							33 lines
						
					
					
						
							1.0 KiB
						
					
					
				var punycode = require('punycode');
 | 
						|
var entities = require('./entities.json');
 | 
						|
 | 
						|
module.exports = decode;
 | 
						|
 | 
						|
function decode (str) {
 | 
						|
    if (typeof str !== 'string') {
 | 
						|
        throw new TypeError('Expected a String');
 | 
						|
    }
 | 
						|
 | 
						|
    return str.replace(/&(#?[^;\W]+;?)/g, function (_, match) {
 | 
						|
        var m;
 | 
						|
        if (m = /^#(\d+);?$/.exec(match)) {
 | 
						|
            return punycode.ucs2.encode([ parseInt(m[1], 10) ]);
 | 
						|
        } else if (m = /^#[Xx]([A-Fa-f0-9]+);?/.exec(match)) {
 | 
						|
            return punycode.ucs2.encode([ parseInt(m[1], 16) ]);
 | 
						|
        } else {
 | 
						|
            // named entity
 | 
						|
            var hasSemi = /;$/.test(match);
 | 
						|
            var withoutSemi = hasSemi ? match.replace(/;$/, '') : match;
 | 
						|
            var target = entities[withoutSemi] || (hasSemi && entities[match]);
 | 
						|
 | 
						|
            if (typeof target === 'number') {
 | 
						|
                return punycode.ucs2.encode([ target ]);
 | 
						|
            } else if (typeof target === 'string') {
 | 
						|
                return target;
 | 
						|
            } else {
 | 
						|
                return '&' + match;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    });
 | 
						|
}
 |