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
			| 
											2 years ago
										 | 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; | ||
|  |             } | ||
|  |         } | ||
|  |     }); | ||
|  | } |