UNPKG

ares-ide

Version:

A browser-based code editor and UI designer for Enyo 2 projects

142 lines (137 loc) 3.81 kB
var jsencoding = require('../deps/encoding/encoding'); var RE_ENCODED = /%([a-fA-F0-9]{2})/g; function encodedReplacer(match, byte) { return String.fromCharCode(parseInt(byte, 16)); } exports.parseParams = function(str) { var res = [], state = 'key', charset = '', inquote = false, escaping = false, p = 0, tmp = ''; for (var i = 0; i < str.length; ++i) { if (str[i] === '\\' && inquote) { if (escaping) escaping = false; else { escaping = true; continue; } } else if (str[i] === '"') { if (!escaping) { if (inquote) { inquote = false; state = 'key'; } else inquote = true; continue; } else escaping = false; } else { escaping = false; if ((state === 'charset' || state === 'lang') && str[i] === "'") { if (state === 'charset') { state = 'lang'; charset = tmp.substring(1); } else state = 'value'; tmp = ''; continue; } else if (state === 'key' && (str[i] === '*' || str[i] === '=')) { if (str[i] === '*') state = 'charset'; else state = 'value'; res[p] = [tmp, undefined]; tmp = ''; continue; } else if (!inquote && str[i] === ';') { state = 'key'; if (charset) { if (tmp.length && jsencoding.encodingExists(charset)) { try { tmp = jsencoding.TextDecoder(charset) .decode(new Buffer(tmp.replace(RE_ENCODED, encodedReplacer), 'binary')); } catch(e) {} } charset = ''; } if (res[p] === undefined) res[p] = tmp; else res[p][1] = tmp; tmp = ''; ++p; continue; } else if (!inquote && (str[i] === ' ' || str[i] === '\t')) continue; } tmp += str[i]; } if (tmp.length) { if (charset && jsencoding.encodingExists(charset)) { try { tmp = jsencoding.TextDecoder(charset) .decode(new Buffer(tmp.replace(RE_ENCODED, encodedReplacer), 'binary')); } catch(e) {} } if (res[p] === undefined) res[p] = tmp; else res[p][1] = tmp; } return res; }; exports.Decoder = Decoder; var 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 ], RE_PLUS = /\+/g; function Decoder() { this.buffer = undefined; } Decoder.prototype.write = function(str) { // Replace '+' with ' ' before decoding str = str.replace(RE_PLUS, ' '); var res = ''; var i = 0, p = 0, 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; };