Advertisement
stuppid_bot

Untitled

Dec 22nd, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. querystring = new (function QueryString() {
  2.     var self = this;
  3.  
  4.     /**
  5.      * Декодирует компонент URI.
  6.      *
  7.      * @param {string} str Исходная строка.
  8.      * @return {string}
  9.      */
  10.     self.unescape = function (str) {
  11.         return decodeURIComponent(str.replace(/\+/g, ' '));
  12.     };
  13.  
  14.     /**
  15.      * Парсит URI-параметры.
  16.      *
  17.      * @param {string} params Исходная строка.
  18.      * @param {string} sep Разделитель параметров.
  19.      * @param {string} eq Разделитель пар ключ-значение.
  20.      * @return {object}
  21.      */
  22.     self.parse = function (str, sep, eq) {
  23.         sep = sep || '&';
  24.         eq = eq || '=';
  25.         var pairs = str.split(sep);
  26.         var pos;
  27.         var keys;
  28.         var value;
  29.         var name;
  30.         var j;
  31.         var cur;
  32.         var item;
  33.         var isList;
  34.         var ret = {};
  35.         for (var i = 0; i < pairs.length; ++i) {
  36.             pos = pairs[i].indexOf(eq);
  37.             pos = pos == -1 ? pairs[i].length : pos
  38.             keys = parseFieldName(pairs[i].slice(0, pos));
  39.             value = self.unescape(pairs[i].slice(++pos));
  40.             j = 0;
  41.             cur = ret;
  42.             for (;;) {
  43.                 item = keys[j];
  44.                 if (j) {
  45.                     isList = /^(|\d|[1-9]\d+)$/.test(item);
  46.                     if (!cur[name]) {
  47.                         cur[name] = isList ? [] : {};
  48.                     }
  49.                     cur = cur[name];
  50.                     if (cur.constructor == Array && !isList) {
  51.                         throw 'Array index error';
  52.                     }
  53.                     name = isList ? (item == '' ? cur.length : parseInt(item)) : self.unescape(item);
  54.                 }
  55.                 else {
  56.                     name = self.unescape(item);
  57.                 }
  58.                 if (++j == keys.length) {
  59.                     break;
  60.                 }
  61.             }
  62.             cur[name] = value;
  63.         }
  64.         return ret;
  65.     };
  66.  
  67.     /**
  68.      * Разбивает имя параметра на части:
  69.      * foo[bar] -> ['foo', 'bar']
  70.      *
  71.      * @param {string} str Имя параметра.
  72.      * @return {array}
  73.      */
  74.     function parseFieldName(str) {
  75.         var slices = [];
  76.         var p;
  77.         var p1 = 0;
  78.         var err = false;
  79.         var ret = [];
  80.         while (~(p = str.indexOf('[', p1))) {
  81.             if (!slices.length) {
  82.                 slices.push(0, p);
  83.             }
  84.             err = p1 && p != p1;
  85.             if (!err) {
  86.                 err = (p1 = str.indexOf(']', ++p)) == -1;
  87.             }
  88.             if (err) {
  89.                 break;
  90.             }
  91.             slices.push(p, p1++);
  92.         }
  93.         err = p1 && p1 != str.length;
  94.         if (err) {
  95.             throw 'Invalid field name: ' + str;
  96.         }
  97.         for (var i = 0; i < slices.length; i += 2) {
  98.             ret.push(str.slice(slices[i], slices[i + 1]));
  99.         }
  100.         return ret.length ? ret : [str];
  101.     }
  102.  
  103.     /**
  104.      * Создает из объекта строку с параметрами.
  105.      *
  106.      * @param {string} obj Параметры.
  107.      * @param {string} sep Разделитель параметров.
  108.      * @param {string} eq Разделитель пар ключ-значение.
  109.      * @return {string}
  110.      */
  111.     self.stringify = function (obj, sep, eq) {
  112.         var pairs = [];
  113.         var name;
  114.         var value;
  115.         eq = eq || '=';
  116.         for (var i in obj) {
  117.             if (obj.hasOwnProperty(i)) {
  118.                 name = encodeURIComponent(i);
  119.                 value = encodeURIComponent(obj[i]);
  120.                 // вложенные массивы
  121.                 pairs.push(name + eq + value);
  122.             }
  123.         }
  124.         return pairs.join(sep || '&');
  125.     };
  126. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement