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

'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