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.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							1.0 KiB
						
					
					
				
			
		
		
	
	
							40 lines
						
					
					
						
							1.0 KiB
						
					
					
				| var punycode = require('punycode');
 | |
| var revEntities = require('./reversed.json');
 | |
| 
 | |
| module.exports = encode;
 | |
| 
 | |
| function encode (str, opts) {
 | |
|     if (typeof str !== 'string') {
 | |
|         throw new TypeError('Expected a String');
 | |
|     }
 | |
|     if (!opts) opts = {};
 | |
| 
 | |
|     var numeric = true;
 | |
|     if (opts.named) numeric = false;
 | |
|     if (opts.numeric !== undefined) numeric = opts.numeric;
 | |
| 
 | |
|     var special = opts.special || {
 | |
|         '"': true, "'": true,
 | |
|         '<': true, '>': true,
 | |
|         '&': true
 | |
|     };
 | |
| 
 | |
|     var codePoints = punycode.ucs2.decode(str);
 | |
|     var chars = [];
 | |
|     for (var i = 0; i < codePoints.length; i++) {
 | |
|         var cc = codePoints[i];
 | |
|         var c = punycode.ucs2.encode([ cc ]);
 | |
|         var e = revEntities[cc];
 | |
|         if (e && (cc >= 127 || special[c]) && !numeric) {
 | |
|             chars.push('&' + (/;$/.test(e) ? e : e + ';'));
 | |
|         }
 | |
|         else if (cc < 32 || cc >= 127 || special[c]) {
 | |
|             chars.push('&#' + cc + ';');
 | |
|         }
 | |
|         else {
 | |
|             chars.push(c);
 | |
|         }
 | |
|     }
 | |
|     return chars.join('');
 | |
| }
 |