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