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.
		
		
		
		
		
			
		
			
				
					116 lines
				
				3.1 KiB
			
		
		
			
		
	
	
					116 lines
				
				3.1 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | var UTF8_ACCEPT = 12 | ||
|  | var UTF8_REJECT = 0 | ||
|  | var UTF8_DATA = [ | ||
|  |   // The first part of the table maps bytes to character to a transition.
 | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | ||
|  |   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | ||
|  |   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | ||
|  |   4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | ||
|  |   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | ||
|  |   6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, | ||
|  |   10, 9, 9, 9, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | ||
|  | 
 | ||
|  |   // The second part of the table maps a state to a new state when adding a
 | ||
|  |   // transition.
 | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   12, 0, 0, 0, 0, 24, 36, 48, 60, 72, 84, 96, | ||
|  |   0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  |   0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
|  | 
 | ||
|  |   // The third part maps the current transition to a mask that needs to apply
 | ||
|  |   // to the byte.
 | ||
|  |   0x7F, 0x3F, 0x3F, 0x3F, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07 | ||
|  | ] | ||
|  | 
 | ||
|  | function decodeURIComponent (uri) { | ||
|  |   var percentPosition = uri.indexOf('%') | ||
|  |   if (percentPosition === -1) return uri | ||
|  | 
 | ||
|  |   var length = uri.length | ||
|  |   var decoded = '' | ||
|  |   var last = 0 | ||
|  |   var codepoint = 0 | ||
|  |   var startOfOctets = percentPosition | ||
|  |   var state = UTF8_ACCEPT | ||
|  | 
 | ||
|  |   while (percentPosition > -1 && percentPosition < length) { | ||
|  |     var high = hexCodeToInt(uri[percentPosition + 1], 4) | ||
|  |     var low = hexCodeToInt(uri[percentPosition + 2], 0) | ||
|  |     var byte = high | low | ||
|  |     var type = UTF8_DATA[byte] | ||
|  |     state = UTF8_DATA[256 + state + type] | ||
|  |     codepoint = (codepoint << 6) | (byte & UTF8_DATA[364 + type]) | ||
|  | 
 | ||
|  |     if (state === UTF8_ACCEPT) { | ||
|  |       decoded += uri.slice(last, startOfOctets) | ||
|  | 
 | ||
|  |       decoded += (codepoint <= 0xFFFF) | ||
|  |         ? String.fromCharCode(codepoint) | ||
|  |         : String.fromCharCode( | ||
|  |           (0xD7C0 + (codepoint >> 10)), | ||
|  |           (0xDC00 + (codepoint & 0x3FF)) | ||
|  |         ) | ||
|  | 
 | ||
|  |       codepoint = 0 | ||
|  |       last = percentPosition + 3 | ||
|  |       percentPosition = startOfOctets = uri.indexOf('%', last) | ||
|  |     } else if (state === UTF8_REJECT) { | ||
|  |       return null | ||
|  |     } else { | ||
|  |       percentPosition += 3 | ||
|  |       if (percentPosition < length && uri.charCodeAt(percentPosition) === 37) continue | ||
|  |       return null | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return decoded + uri.slice(last) | ||
|  | } | ||
|  | 
 | ||
|  | var HEX = { | ||
|  |   '0': 0, | ||
|  |   '1': 1, | ||
|  |   '2': 2, | ||
|  |   '3': 3, | ||
|  |   '4': 4, | ||
|  |   '5': 5, | ||
|  |   '6': 6, | ||
|  |   '7': 7, | ||
|  |   '8': 8, | ||
|  |   '9': 9, | ||
|  |   'a': 10, | ||
|  |   'A': 10, | ||
|  |   'b': 11, | ||
|  |   'B': 11, | ||
|  |   'c': 12, | ||
|  |   'C': 12, | ||
|  |   'd': 13, | ||
|  |   'D': 13, | ||
|  |   'e': 14, | ||
|  |   'E': 14, | ||
|  |   'f': 15, | ||
|  |   'F': 15 | ||
|  | } | ||
|  | 
 | ||
|  | function hexCodeToInt (c, shift) { | ||
|  |   var i = HEX[c] | ||
|  |   return i === undefined ? 255 : i << shift | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = decodeURIComponent |