web/res/douglascrockford-JSON-js/json_parse.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.js
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
     3
    2011-03-06
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
/*members "", "\"", "\/", "\\", at, b, call, charAt, f, fromCharCode,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    50
    hasOwnProperty, message, n, name, prototype, push, r, t, text
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    51
*/
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    52
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    53
var json_parse = (function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    54
    "use strict";
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    55
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    56
// This is a function that can parse a JSON text, producing a JavaScript
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    57
// data structure. It is a simple, recursive descent parser. It does not use
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    58
// eval or regular expressions, so it can be used as a model for implementing
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    59
// a JSON parser in other languages.
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
// We are defining the function inside of another function to avoid creating
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    62
// global variables.
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 at,     // The index of the current character
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    65
        ch,     // The current character
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    66
        escapee = {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    67
            '"':  '"',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    68
            '\\': '\\',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    69
            '/':  '/',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    70
            b:    '\b',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    71
            f:    '\f',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    72
            n:    '\n',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    73
            r:    '\r',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    74
            t:    '\t'
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    75
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    76
        text,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    77
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    78
        error = function (m) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    79
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    80
// Call error when something is wrong.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    81
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    82
            throw {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    83
                name:    'SyntaxError',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    84
                message: m,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    85
                at:      at,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    86
                text:    text
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    87
            };
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    88
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    89
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    90
        next = function (c) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    91
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    92
// If a c parameter is provided, verify that it matches the current character.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    93
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    94
            if (c && c !== ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    95
                error("Expected '" + c + "' instead of '" + ch + "'");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    96
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    97
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    98
// Get the next character. When there are no more characters,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
    99
// return the empty string.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   100
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   101
            ch = text.charAt(at);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   102
            at += 1;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   103
            return ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   104
        },
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
        number = function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   107
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   108
// Parse a number value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   109
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   110
            var number,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   111
                string = '';
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
            if (ch === '-') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   114
                string = '-';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   115
                next('-');
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
            while (ch >= '0' && ch <= '9') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   118
                string += ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   119
                next();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   120
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   121
            if (ch === '.') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   122
                string += '.';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   123
                while (next() && ch >= '0' && ch <= '9') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   124
                    string += ch;
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
            if (ch === 'e' || ch === 'E') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   128
                string += ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   129
                next();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   130
                if (ch === '-' || ch === '+') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   131
                    string += ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   132
                    next();
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
                while (ch >= '0' && ch <= '9') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   135
                    string += ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   136
                    next();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   137
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   138
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   139
            number = +string;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   140
            if (!isFinite(number)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   141
                error("Bad number");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   142
            } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   143
                return number;
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
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   146
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   147
        string = function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   148
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   149
// Parse a string value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   150
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   151
            var hex,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   152
                i,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   153
                string = '',
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   154
                uffff;
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
// When parsing for string values, we must look for " and \ characters.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   157
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   158
            if (ch === '"') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   159
                while (next()) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   160
                    if (ch === '"') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   161
                        next();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   162
                        return string;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   163
                    } else if (ch === '\\') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   164
                        next();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   165
                        if (ch === 'u') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   166
                            uffff = 0;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   167
                            for (i = 0; i < 4; i += 1) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   168
                                hex = parseInt(next(), 16);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   169
                                if (!isFinite(hex)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   170
                                    break;
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
                                uffff = uffff * 16 + hex;
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
                            string += String.fromCharCode(uffff);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   175
                        } else if (typeof escapee[ch] === 'string') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   176
                            string += escapee[ch];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   177
                        } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   178
                            break;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   179
                        }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   180
                    } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   181
                        string += ch;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   182
                    }
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
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   185
            error("Bad string");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   186
        },
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   187
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   188
        white = function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   189
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   190
// Skip whitespace.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   191
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   192
            while (ch && ch <= ' ') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   193
                next();
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
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   197
        word = function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   198
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   199
// true, false, or null.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   200
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   201
            switch (ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   202
            case 't':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   203
                next('t');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   204
                next('r');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   205
                next('u');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   206
                next('e');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   207
                return true;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   208
            case 'f':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   209
                next('f');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   210
                next('a');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   211
                next('l');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   212
                next('s');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   213
                next('e');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   214
                return false;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   215
            case 'n':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   216
                next('n');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   217
                next('u');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   218
                next('l');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   219
                next('l');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   220
                return null;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   221
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   222
            error("Unexpected '" + ch + "'");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   223
        },
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
        value,  // Place holder for the value function.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   226
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   227
        array = function () {
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
// Parse an array value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   230
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   231
            var array = [];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   232
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   233
            if (ch === '[') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   234
                next('[');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   235
                white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   236
                if (ch === ']') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   237
                    next(']');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   238
                    return array;   // empty array
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   239
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   240
                while (ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   241
                    array.push(value());
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   242
                    white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   243
                    if (ch === ']') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   244
                        next(']');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   245
                        return array;
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
                    next(',');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   248
                    white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   249
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   250
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   251
            error("Bad array");
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
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   254
        object = function () {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   255
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   256
// Parse an object value.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   257
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   258
            var key,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   259
                object = {};
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
            if (ch === '{') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   262
                next('{');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   263
                white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   264
                if (ch === '}') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   265
                    next('}');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   266
                    return object;   // empty object
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   267
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   268
                while (ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   269
                    key = string();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   270
                    white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   271
                    next(':');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   272
                    if (Object.hasOwnProperty.call(object, key)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   273
                        error('Duplicate key "' + key + '"');
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
                    object[key] = value();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   276
                    white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   277
                    if (ch === '}') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   278
                        next('}');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   279
                        return object;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   280
                    }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   281
                    next(',');
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   282
                    white();
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
            error("Bad object");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   286
        };
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
    value = function () {
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
// Parse a JSON value. It could be an object, an array, a string, a number,
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   291
// or a word.
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
        white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   294
        switch (ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   295
        case '{':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   296
            return object();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   297
        case '[':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   298
            return array();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   299
        case '"':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   300
            return string();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   301
        case '-':
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   302
            return number();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   303
        default:
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   304
            return ch >= '0' && ch <= '9' ? number() : word();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   305
        }
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
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   308
// Return the json_parse function. It will have access to all of the above
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   309
// functions and variables.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   310
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   311
    return function (source, reviver) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   312
        var result;
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
        text = source;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   315
        at = 0;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   316
        ch = ' ';
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   317
        result = value();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   318
        white();
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   319
        if (ch) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   320
            error("Syntax error");
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   321
        }
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
// 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
   324
// 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
   325
// transformation, starting with a temporary root object that holds the result
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   326
// in an empty key. If there is not a reviver function, we simply return the
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   327
// result.
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   328
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   329
        return typeof reviver === 'function' ? (function walk(holder, key) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   330
            var k, v, value = holder[key];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   331
            if (value && typeof value === 'object') {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   332
                for (k in value) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   333
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   334
                        v = walk(value, k);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   335
                        if (v !== undefined) {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   336
                            value[k] = v;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   337
                        } else {
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   338
                            delete value[k];
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   339
                        }
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
                }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   342
            }
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   343
            return reviver.call(holder, key, value);
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   344
        }({'': result}, '')) : result;
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   345
    };
bb7a2f8202b9 Jane McGonigal : jeux video
Samuel Huron <samuel.huron@centrepompidou.fr>
parents:
diff changeset
   346
}());