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
						
					
					
				'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
 |