web/res/douglascrockford-JSON-js/json_parse_state.js
author Raphael Velt <raph.velt@gmail.com>
Thu, 02 Feb 2012 14:45:30 +0100
changeset 491 ae626ab315b9
parent 266 bb7a2f8202b9
permissions -rwxr-xr-x
Added Live for BPI Des Livres aux Machines
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
266
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     1
/*
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     2
    http://www.JSON.org/json_parse_state.js
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     3
    2011-02-23
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     4
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     5
    Public Domain.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     6
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     7
    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     8
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     9
    This file creates a json_parse function.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    10
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    11
        json_parse(text, reviver)
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    12
            This method parses a JSON text to produce an object or array.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    13
            It can throw a SyntaxError exception.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    14
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    15
            The optional reviver parameter is a function that can filter and
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    16
            transform the results. It receives each of the keys and values,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    17
            and its return value is used instead of the original value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    18
            If it returns what it received, then the structure is not modified.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    19
            If it returns undefined then the member is deleted.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    20
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    21
            Example:
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    22
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    23
            // Parse the text. Values that look like ISO date strings will
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    24
            // be converted to Date objects.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    25
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    26
            myData = json_parse(text, function (key, value) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    27
                var a;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    28
                if (typeof value === 'string') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    29
                    a =
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    30
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    31
                    if (a) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    32
                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    33
                            +a[5], +a[6]));
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    34
                    }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    35
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    36
                return value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    37
            });
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    38
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    39
    This is a reference implementation. You are free to copy, modify, or
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    40
    redistribute.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    41
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    42
    This code should be minified before deployment.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    43
    See http://javascript.crockford.com/jsmin.html
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    44
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    45
    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    46
    NOT CONTROL.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    47
*/
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    48
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    49
/*jslint regexp: false*/
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    50
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    51
/*members "", "\"", ",", "\/", ":", "[", "\\", "]", acomma, avalue, b,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    52
    call, colon, container, exec, f, false, firstavalue, firstokey,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    53
    fromCharCode, go, hasOwnProperty, key, length, n, null, ocomma, okey,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    54
    ovalue, pop, prototype, push, r, replace, slice, state, t, test, true,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    55
    value, "{", "}"
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    56
*/
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    57
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    58
var json_parse = (function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    59
    "use strict";
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    60
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    61
// This function creates a JSON parse function that uses a state machine rather
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    62
// than the dangerous eval function to parse a JSON text.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    63
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    64
    var state,      // The state of the parser, one of
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    65
                    // 'go'         The starting state
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    66
                    // 'ok'         The final, accepting state
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    67
                    // 'firstokey'  Ready for the first key of the object or
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    68
                    //              the closing of an empty object
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    69
                    // 'okey'       Ready for the next key of the object
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    70
                    // 'colon'      Ready for the colon
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    71
                    // 'ovalue'     Ready for the value half of a key/value pair
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    72
                    // 'ocomma'     Ready for a comma or closing }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    73
                    // 'firstavalue' Ready for the first value of an array or
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    74
                    //              an empty array
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    75
                    // 'avalue'     Ready for the next value of an array
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    76
                    // 'acomma'     Ready for a comma or closing ]
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    77
        stack,      // The stack, for controlling nesting.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    78
        container,  // The current container object or array
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    79
        key,        // The current key
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    80
        value,      // The current value
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    81
        escapes = { // Escapement translation table
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    82
            '\\': '\\',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    83
            '"': '"',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    84
            '/': '/',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    85
            't': '\t',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    86
            'n': '\n',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    87
            'r': '\r',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    88
            'f': '\f',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    89
            'b': '\b'
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    90
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    91
        string = {   // The actions for string tokens
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    92
            go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    93
                state = 'ok';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    94
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    95
            firstokey: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    96
                key = value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    97
                state = 'colon';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    98
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    99
            okey: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   100
                key = value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   101
                state = 'colon';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   102
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   103
            ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   104
                state = 'ocomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   105
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   106
            firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   107
                state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   108
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   109
            avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   110
                state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   111
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   112
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   113
        number = {   // The actions for number tokens
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   114
            go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   115
                state = 'ok';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   116
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   117
            ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   118
                state = 'ocomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   119
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   120
            firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   121
                state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   122
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   123
            avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   124
                state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   125
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   126
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   127
        action = {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   128
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   129
// The action table describes the behavior of the machine. It contains an
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   130
// object for each token. Each object contains a method that is called when
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   131
// a token is matched in a state. An object will lack a method for illegal
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   132
// states.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   133
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   134
            '{': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   135
                go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   136
                    stack.push({state: 'ok'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   137
                    container = {};
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   138
                    state = 'firstokey';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   139
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   140
                ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   141
                    stack.push({container: container, state: 'ocomma', key: key});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   142
                    container = {};
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   143
                    state = 'firstokey';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   144
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   145
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   146
                    stack.push({container: container, state: 'acomma'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   147
                    container = {};
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   148
                    state = 'firstokey';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   149
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   150
                avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   151
                    stack.push({container: container, state: 'acomma'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   152
                    container = {};
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   153
                    state = 'firstokey';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   154
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   155
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   156
            '}': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   157
                firstokey: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   158
                    var pop = stack.pop();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   159
                    value = container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   160
                    container = pop.container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   161
                    key = pop.key;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   162
                    state = pop.state;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   163
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   164
                ocomma: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   165
                    var pop = stack.pop();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   166
                    container[key] = value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   167
                    value = container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   168
                    container = pop.container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   169
                    key = pop.key;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   170
                    state = pop.state;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   171
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   172
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   173
            '[': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   174
                go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   175
                    stack.push({state: 'ok'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   176
                    container = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   177
                    state = 'firstavalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   178
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   179
                ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   180
                    stack.push({container: container, state: 'ocomma', key: key});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   181
                    container = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   182
                    state = 'firstavalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   183
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   184
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   185
                    stack.push({container: container, state: 'acomma'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   186
                    container = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   187
                    state = 'firstavalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   188
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   189
                avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   190
                    stack.push({container: container, state: 'acomma'});
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   191
                    container = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   192
                    state = 'firstavalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   193
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   194
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   195
            ']': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   196
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   197
                    var pop = stack.pop();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   198
                    value = container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   199
                    container = pop.container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   200
                    key = pop.key;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   201
                    state = pop.state;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   202
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   203
                acomma: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   204
                    var pop = stack.pop();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   205
                    container.push(value);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   206
                    value = container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   207
                    container = pop.container;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   208
                    key = pop.key;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   209
                    state = pop.state;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   210
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   211
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   212
            ':': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   213
                colon: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   214
                    if (Object.hasOwnProperty.call(container, key)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   215
                        throw new SyntaxError('Duplicate key "' + key + '"');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   216
                    }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   217
                    state = 'ovalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   218
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   219
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   220
            ',': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   221
                ocomma: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   222
                    container[key] = value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   223
                    state = 'okey';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   224
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   225
                acomma: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   226
                    container.push(value);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   227
                    state = 'avalue';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   228
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   229
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   230
            'true': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   231
                go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   232
                    value = true;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   233
                    state = 'ok';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   234
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   235
                ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   236
                    value = true;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   237
                    state = 'ocomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   238
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   239
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   240
                    value = true;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   241
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   242
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   243
                avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   244
                    value = true;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   245
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   246
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   247
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   248
            'false': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   249
                go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   250
                    value = false;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   251
                    state = 'ok';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   252
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   253
                ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   254
                    value = false;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   255
                    state = 'ocomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   256
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   257
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   258
                    value = false;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   259
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   260
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   261
                avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   262
                    value = false;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   263
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   264
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   265
            },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   266
            'null': {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   267
                go: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   268
                    value = null;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   269
                    state = 'ok';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   270
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   271
                ovalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   272
                    value = null;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   273
                    state = 'ocomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   274
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   275
                firstavalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   276
                    value = null;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   277
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   278
                },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   279
                avalue: function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   280
                    value = null;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   281
                    state = 'acomma';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   282
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   283
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   284
        };
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   285
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   286
    function debackslashify(text) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   287
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   288
// Remove and replace any backslash escapement.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   289
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   290
        return text.replace(/\\(?:u(.{4})|([^u]))/g, function (a, b, c) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   291
            return b ? String.fromCharCode(parseInt(b, 16)) : escapes[c];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   292
        });
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   293
    }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   294
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   295
    return function (source, reviver) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   296
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   297
// A regular expression is used to extract tokens from the JSON text.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   298
// The extraction process is cautious.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   299
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   300
        var r,          // The result of the exec method.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   301
            tx = /^[\x20\t\n\r]*(?:([,:\[\]{}]|true|false|null)|(-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)|"((?:[^\r\n\t\\\"]|\\(?:["\\\/trnfb]|u[0-9a-fA-F]{4}))*)")/;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   302
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   303
// Set the starting state.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   304
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   305
        state = 'go';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   306
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   307
// The stack records the container, key, and state for each object or array
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   308
// that contains another object or array while processing nested structures.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   309
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   310
        stack = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   311
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   312
// If any error occurs, we will catch it and ultimately throw a syntax error.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   313
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   314
        try {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   315
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   316
// For each token...
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   317
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   318
            for (;;) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   319
                r = tx.exec(source);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   320
                if (!r) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   321
                    break;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   322
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   323
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   324
// r is the result array from matching the tokenizing regular expression.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   325
//  r[0] contains everything that matched, including any initial whitespace.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   326
//  r[1] contains any punctuation that was matched, or true, false, or null.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   327
//  r[2] contains a matched number, still in string form.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   328
//  r[3] contains a matched string, without quotes but with ecapement.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   329
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   330
                if (r[1]) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   331
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   332
// Token: Execute the action for this state and token.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   333
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   334
                    action[r[1]][state]();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   335
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   336
                } else if (r[2]) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   337
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   338
// Number token: Convert the number string into a number value and execute
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   339
// the action for this state and number.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   340
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   341
                    value = +r[2];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   342
                    number[state]();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   343
                } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   344
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   345
// String token: Replace the escapement sequences and execute the action for
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   346
// this state and string.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   347
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   348
                    value = debackslashify(r[3]);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   349
                    string[state]();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   350
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   351
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   352
// Remove the token from the string. The loop will continue as long as there
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   353
// are tokens. This is a slow process, but it allows the use of ^ matching,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   354
// which assures that no illegal tokens slip through.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   355
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   356
                source = source.slice(r[0].length);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   357
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   358
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   359
// If we find a state/token combination that is illegal, then the action will
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   360
// cause an error. We handle the error by simply changing the state.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   361
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   362
        } catch (e) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   363
            state = e;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   364
        }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   365
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   366
// The parsing is finished. If we are not in the final 'ok' state, or if the
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   367
// remaining source contains anything except whitespace, then we did not have
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   368
//a well-formed JSON text.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   369
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   370
        if (state !== 'ok' || /[^\x20\t\n\r]/.test(source)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   371
            throw state instanceof SyntaxError ? state : new SyntaxError('JSON');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   372
        }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   373
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   374
// If there is a reviver function, we recursively walk the new structure,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   375
// passing each name/value pair to the reviver function for possible
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   376
// transformation, starting with a temporary root object that holds the current
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   377
// value in an empty key. If there is not a reviver function, we simply return
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   378
// that value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   379
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   380
        return typeof reviver === 'function' ? (function walk(holder, key) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   381
            var k, v, value = holder[key];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   382
            if (value && typeof value === 'object') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   383
                for (k in value) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   384
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   385
                        v = walk(value, k);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   386
                        if (v !== undefined) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   387
                            value[k] = v;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   388
                        } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   389
                            delete value[k];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   390
                        }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   391
                    }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   392
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   393
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   394
            return reviver.call(holder, key, value);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   395
        }({'': value}, '')) : value;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   396
    };
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   397
}());