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