| | |
| | | 'use strict'; |
| | | var $ = require('../internals/export'); |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var toString = require('../internals/to-string'); |
| | | |
| | | var fromCharCode = String.fromCharCode; |
| | | var charAt = uncurryThis(''.charAt); |
| | | var exec = uncurryThis(/./.exec); |
| | | var stringSlice = uncurryThis(''.slice); |
| | | |
| | | var hex2 = /^[\da-f]{2}$/i; |
| | | var hex4 = /^[\da-f]{4}$/i; |
| | | |
| | |
| | | var result = ''; |
| | | var length = str.length; |
| | | var index = 0; |
| | | var chr, slice; |
| | | var chr, part; |
| | | while (index < length) { |
| | | chr = str.charAt(index++); |
| | | chr = charAt(str, index++); |
| | | if (chr === '%') { |
| | | if (str.charAt(index) === 'u') { |
| | | slice = str.slice(index + 1, index + 5); |
| | | if (hex4.test(slice)) { |
| | | result += fromCharCode(parseInt(slice, 16)); |
| | | if (charAt(str, index) === 'u') { |
| | | part = stringSlice(str, index + 1, index + 5); |
| | | if (exec(hex4, part)) { |
| | | result += fromCharCode(parseInt(part, 16)); |
| | | index += 5; |
| | | continue; |
| | | } |
| | | } else { |
| | | slice = str.slice(index, index + 2); |
| | | if (hex2.test(slice)) { |
| | | result += fromCharCode(parseInt(slice, 16)); |
| | | part = stringSlice(str, index, index + 2); |
| | | if (exec(hex2, part)) { |
| | | result += fromCharCode(parseInt(part, 16)); |
| | | index += 2; |
| | | continue; |
| | | } |