src/cm/media/js/lib/yui/yui3-3.15.0/build/querystring-parse/querystring-parse.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('querystring-parse', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 * The QueryString module adds support for serializing JavaScript objects into
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 * query strings and parsing JavaScript objects from query strings format.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * The QueryString namespace is added to your YUI instance including static methods
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 * `Y.QueryString.parse(..)` and `Y.QueryString.stringify(..)`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
 * The `querystring` module is a alias for `querystring-parse` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
 * `querystring-stringify`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
 * As their names suggest, `querystring-parse` adds support for parsing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
 * Query String data (`Y.QueryString.parse`) and `querystring-stringify` for serializing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
 * JavaScript data into Query Strings (`Y.QueryString.stringify`).  You may choose to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
 * include either of the submodules individually if you don't need the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
 * complementary functionality, or include the rollup for both.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
 * @module querystring
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
 * @main querystring
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
 * Provides Y.QueryString.parse method to accept Query Strings and return native
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
 * JavaScript objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
 * @module querystring
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
 * @submodule querystring-parse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
 * The QueryString module adds support for serializing JavaScript objects into
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
 * query strings and parsing JavaScript objects from query strings format.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
 * @class QueryString
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
var QueryString = Y.namespace("QueryString"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
// Parse a key=val string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
// These can get pretty hairy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
// example flow:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
// parse(foo[bar][][bla]=baz)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
// return parse(foo[bar][][bla],"baz")
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
// return parse(foo[bar][], {bla : "baz"})
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
// return parse(foo[bar], [{bla:"baz"}])
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
// return parse(foo, {bar:[{bla:"baz"}]})
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
// return {foo:{bar:[{bla:"baz"}]}}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
pieceParser = function (eq) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    return function parsePiece (key, val) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
        var sliced, numVal, head, tail, ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
        if (arguments.length !== 2) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
            // key=val, called from the map/reduce
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
            key = key.split(eq);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
            return parsePiece(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
                QueryString.unescape(key.shift()),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
                QueryString.unescape(key.join(eq))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
            );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
        key = key.replace(/^\s+|\s+$/g, '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
        if (Y.Lang.isString(val)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
            val = val.replace(/^\s+|\s+$/g, '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
            // convert numerals to numbers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
            if (!isNaN(val)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
                numVal = +val;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
                if (val === numVal.toString(10)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
                    val = numVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
        sliced = /(.*)\[([^\]]*)\]$/.exec(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
        if (!sliced) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
            ret = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
            if (key) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
                ret[key] = val;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
            return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
        // ["foo[][bar][][baz]", "foo[][bar][]", "baz"]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
        tail = sliced[2];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
        head = sliced[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
        // array: key[]=val
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
        if (!tail) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
            return parsePiece(head, [val]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
        // obj: key[subkey]=val
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
        ret = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        ret[tail] = val;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
        return parsePiece(head, ret);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
// the reducer function that merges each query piece together into one set of params
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
mergeParams = function(params, addition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    return (
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
        // if it's uncontested, then just return the addition.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        (!params) ? addition
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
        // if the existing value is an array, then concat it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
        : (Y.Lang.isArray(params)) ? params.concat(addition)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        // if the existing value is not an array, and either are not objects, arrayify it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
        : (!Y.Lang.isObject(params) || !Y.Lang.isObject(addition)) ? [params].concat(addition)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        // else merge them as objects, which is a little more complex
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
        : mergeObjects(params, addition)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
// Merge two *objects* together. If this is called, we've already ruled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
// out the simple cases, and need to do the for-in business.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
mergeObjects = function(params, addition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    for (var i in addition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
        if (i && addition.hasOwnProperty(i)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
            params[i] = mergeParams(params[i], addition[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    return params;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
 * Accept Query Strings and return native JavaScript objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
 * @method parse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
 * @param qs {String} Querystring to be parsed into an object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
 * @param sep {String} (optional) Character that should join param k=v pairs together. Default: "&"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
 * @param eq  {String} (optional) Character that should join keys to their values. Default: "="
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
 * @public
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
QueryString.parse = function (qs, sep, eq) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    // wouldn't Y.Array(qs.split()).map(pieceParser(eq)).reduce(mergeParams) be prettier?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    return Y.Array.reduce(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
        Y.Array.map(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
            qs.split(sep || "&"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
            pieceParser(eq || "=")
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        ),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
        {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
        mergeParams
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
 * Provides Y.QueryString.unescape method to be able to override default decoding
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
 * method.  This is important in cases where non-standard delimiters are used, if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
 * the delimiters would not normally be handled properly by the builtin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
 * (en|de)codeURIComponent functions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
 * Default: replace "+" with " ", and then decodeURIComponent behavior.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
 * @method unescape
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
 * @param s {String} String to be decoded.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
 * @public
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
 **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
QueryString.unescape = function (s) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    return decodeURIComponent(s.replace(/\+/g, ' '));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
}, '@VERSION@', {"requires": ["yui-base", "array-extras"]});