Spaces:
Runtime error
Runtime error
const RE_PLUS = /\+/g | |
const HEX = [ | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, | |
0, 1, 1, 1, 1, 1, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
] | |
function Decoder () { | |
this.buffer = undefined | |
} | |
Decoder.prototype.write = function (str) { | |
// Replace '+' with ' ' before decoding | |
str = str.replace(RE_PLUS, ' ') | |
let res = '' | |
let i = 0; let p = 0; const len = str.length | |
for (; i < len; ++i) { | |
if (this.buffer !== undefined) { | |
if (!HEX[str.charCodeAt(i)]) { | |
res += '%' + this.buffer | |
this.buffer = undefined | |
--i // retry character | |
} else { | |
this.buffer += str[i] | |
++p | |
if (this.buffer.length === 2) { | |
res += String.fromCharCode(parseInt(this.buffer, 16)) | |
this.buffer = undefined | |
} | |
} | |
} else if (str[i] === '%') { | |
if (i > p) { | |
res += str.substring(p, i) | |
p = i | |
} | |
this.buffer = '' | |
++p | |
} | |
} | |
if (p < len && this.buffer === undefined) { res += str.substring(p) } | |
return res | |
} | |
Decoder.prototype.reset = function () { | |
this.buffer = undefined | |
} | |
module.exports = Decoder | |