| | |
| | | 'use strict'; |
| | | var $ = require('../internals/export'); |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var toString = require('../internals/to-string'); |
| | | |
| | | var charAt = uncurryThis(''.charAt); |
| | | var charCodeAt = uncurryThis(''.charCodeAt); |
| | | var exec = uncurryThis(/./.exec); |
| | | var numberToString = uncurryThis(1.0.toString); |
| | | var toUpperCase = uncurryThis(''.toUpperCase); |
| | | |
| | | var raw = /[\w*+\-./@]/; |
| | | |
| | | var hex = function (code, length) { |
| | | var result = code.toString(16); |
| | | var result = numberToString(code, 16); |
| | | while (result.length < length) result = '0' + result; |
| | | return result; |
| | | }; |
| | |
| | | var index = 0; |
| | | var chr, code; |
| | | while (index < length) { |
| | | chr = str.charAt(index++); |
| | | if (raw.test(chr)) { |
| | | chr = charAt(str, index++); |
| | | if (exec(raw, chr)) { |
| | | result += chr; |
| | | } else { |
| | | code = chr.charCodeAt(0); |
| | | code = charCodeAt(chr, 0); |
| | | if (code < 256) { |
| | | result += '%' + hex(code, 2); |
| | | } else { |
| | | result += '%u' + hex(code, 4).toUpperCase(); |
| | | result += '%u' + toUpperCase(hex(code, 4)); |
| | | } |
| | | } |
| | | } return result; |