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
							 |