diff options
| author | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 | 
|---|---|---|
| committer | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 | 
| commit | e44a7e37b6c7b5961adaffc62b9042b8d442938e (patch) | |
| tree | 95b67c356e93163467db2451f2b8cce84ed5d582 /includes/js/dojox/rpc/tests/resources | |
| parent | a62b9742ee5e28bcec6872d88f50f25b820914f6 (diff) | |
| download | semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.gz semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.bz2 | |
New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit
git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f
Diffstat (limited to 'includes/js/dojox/rpc/tests/resources')
22 files changed, 1279 insertions, 0 deletions
| diff --git a/includes/js/dojox/rpc/tests/resources/JSON.php b/includes/js/dojox/rpc/tests/resources/JSON.php new file mode 100644 index 0000000..4a21ce7 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/JSON.php @@ -0,0 +1,724 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/**  + * Converts to and from JSON format. + *  + * JSON (JavaScript Object Notation) is a lightweight data-interchange + * format. It is easy for humans to read and write. It is easy for machines + * to parse and generate. It is based on a subset of the JavaScript + * Programming Language, Standard ECMA-262 3rd Edition - December 1999. + * This feature can also be found in  Python. JSON is a text format that is + * completely language independent but uses conventions that are familiar + * to programmers of the C-family of languages, including C, C++, C#, Java, + * JavaScript, Perl, TCL, and many others. These properties make JSON an + * ideal data-interchange language. + *  + * This package provides a simple encoder and decoder for JSON notation. It + * is intended for use with client-side Javascript applications that make + * use of HTTPRequest to perform server communication functions - data can + * be encoded into JSON notation for use in a client-side javascript, or + * decoded from incoming Javascript requests. JSON format is native to + * Javascript, and can be directly eval()'ed with no further parsing + * overhead + * + * All strings should be in ASCII or UTF-8 format! + * + * LICENSE: Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: Redistributions of source code must retain the + * above copyright notice, this list of conditions and the following + * disclaimer. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + *  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + *  + * @category    + * @package     Services_JSON + * @author      Michal Migurski <mike-json@teczno.com> + * @author      Matt Knapp <mdknapp[at]gmail[dot]com> + * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com> + * @copyright   2005 Michal Migurski + * @license     http://www.opensource.org/licenses/bsd-license.php + * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE',   1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR',  2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR',  4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ',  8); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 10); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_STRICT_TYPE', 11); + +/**  + * Converts to and from JSON format. + * + * Brief example of use: + * + * <code> + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + *  + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + *  + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * </code> + */ +class Services_JSON +{ +   /** +    * constructs a new JSON instance +    * +    * @param    int     $use    object behavior: when encoding or decoding, +    *                           be loose or strict about object/array usage +    * +    *                           possible values: +    *                           - SERVICES_JSON_STRICT_TYPE: strict typing, default. +    *                                                        "{...}" syntax creates objects in decode(). +    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing. +    *                                                        "{...}" syntax creates associative arrays in decode(). +    */ +    function Services_JSON($use = SERVICES_JSON_STRICT_TYPE) +    { +        $this->use = $use; +    } + +   /** +    * convert a string from one UTF-16 char to one UTF-8 char +    * +    * Normally should be handled by mb_convert_encoding, but +    * provides a slower PHP-only method for installations +    * that lack the multibye string extension. +    * +    * @param    string  $utf16  UTF-16 character +    * @return   string  UTF-8 character +    * @access   private +    */ +    function utf162utf8($utf16) +    { +        // oh please oh please oh please oh please oh please +        if(function_exists('mb_convert_encoding')) +            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); +         +        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + +        switch(true) { +            case ((0x7F & $bytes) == $bytes): +                // this case should never be reached, because we are in ASCII range +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return chr(0x7F & $bytes); + +            case (0x07FF & $bytes) == $bytes: +                // return a 2-byte UTF-8 character +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return chr(0xC0 | (($bytes >> 6) & 0x1F)) +                     . chr(0x80 | ($bytes & 0x3F)); + +            case (0xFFFF & $bytes) == $bytes: +                // return a 3-byte UTF-8 character +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return chr(0xE0 | (($bytes >> 12) & 0x0F)) +                     . chr(0x80 | (($bytes >> 6) & 0x3F)) +                     . chr(0x80 | ($bytes & 0x3F)); +        } + +        // ignoring UTF-32 for now, sorry +        return ''; +    }         + +   /** +    * convert a string from one UTF-8 char to one UTF-16 char +    * +    * Normally should be handled by mb_convert_encoding, but +    * provides a slower PHP-only method for installations +    * that lack the multibye string extension. +    * +    * @param    string  $utf8   UTF-8 character +    * @return   string  UTF-16 character +    * @access   private +    */ +    function utf82utf16($utf8) +    { +        // oh please oh please oh please oh please oh please +        if(function_exists('mb_convert_encoding')) +            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); +         +        switch(strlen($utf8)) { +            case 1: +                // this case should never be reached, because we are in ASCII range +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return $ut8; + +            case 2: +                // return a UTF-16 character from a 2-byte UTF-8 char +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return chr(0x07 & (ord($utf8{0}) >> 2)) +                     . chr((0xC0 & (ord($utf8{0}) << 6)) +                         | (0x3F & ord($utf8{1}))); +                 +            case 3: +                // return a UTF-16 character from a 3-byte UTF-8 char +                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                return chr((0xF0 & (ord($utf8{0}) << 4)) +                         | (0x0F & (ord($utf8{1}) >> 2))) +                     . chr((0xC0 & (ord($utf8{1}) << 6)) +                         | (0x7F & ord($utf8{2}))); +        } + +        // ignoring UTF-32 for now, sorry +        return ''; +    }         + +   /** +    * encodes an arbitrary variable into JSON format +    * +    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded. +    *                           see argument 1 to Services_JSON() above for array-parsing behavior. +    *                           if var is a strng, note that encode() always expects it +    *                           to be in ASCII or UTF-8 format! +    * +    * @return   string  JSON string representation of input var +    * @access   public +    */ +    function encode($var) +    { +        switch (gettype($var)) { +            case 'boolean': +                return $var ? 'true' : 'false'; +             +            case 'NULL': +                return 'null'; +             +            case 'integer': +                return (int) $var; +                 +            case 'double': +            case 'float': +                return (float) $var; +                 +            case 'string': +                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT +                $ascii = ''; +                $strlen_var = strlen($var); + +               /* +                * Iterate over every character in the string, +                * escaping with a slash or encoding to UTF-8 where necessary +                */ +                for ($c = 0; $c < $strlen_var; ++$c) { +                     +                    $ord_var_c = ord($var{$c}); +                     +                    switch (true) { +                        case $ord_var_c == 0x08: +                            $ascii .= '\b'; +                            break; +                        case $ord_var_c == 0x09: +                            $ascii .= '\t'; +                            break; +                        case $ord_var_c == 0x0A: +                            $ascii .= '\n'; +                            break; +                        case $ord_var_c == 0x0C: +                            $ascii .= '\f'; +                            break; +                        case $ord_var_c == 0x0D: +                            $ascii .= '\r'; +                            break; + +                        case $ord_var_c == 0x22: +                        case $ord_var_c == 0x2F: +                        case $ord_var_c == 0x5C: +                            // double quote, slash, slosh +                            $ascii .= '\\'.$var{$c}; +                            break; +                             +                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): +                            // characters U-00000000 - U-0000007F (same as ASCII) +                            $ascii .= $var{$c}; +                            break; +                         +                        case (($ord_var_c & 0xE0) == 0xC0): +                            // characters U-00000080 - U-000007FF, mask 110XXXXX +                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                            $char = pack('C*', $ord_var_c, ord($var{$c + 1})); +                            $c += 1; +                            $utf16 = $this->utf82utf16($char); +                            $ascii .= sprintf('\u%04s', bin2hex($utf16)); +                            break; +     +                        case (($ord_var_c & 0xF0) == 0xE0): +                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX +                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                            $char = pack('C*', $ord_var_c, +                                         ord($var{$c + 1}), +                                         ord($var{$c + 2})); +                            $c += 2; +                            $utf16 = $this->utf82utf16($char); +                            $ascii .= sprintf('\u%04s', bin2hex($utf16)); +                            break; +     +                        case (($ord_var_c & 0xF8) == 0xF0): +                            // characters U-00010000 - U-001FFFFF, mask 11110XXX +                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                            $char = pack('C*', $ord_var_c, +                                         ord($var{$c + 1}), +                                         ord($var{$c + 2}), +                                         ord($var{$c + 3})); +                            $c += 3; +                            $utf16 = $this->utf82utf16($char); +                            $ascii .= sprintf('\u%04s', bin2hex($utf16)); +                            break; +     +                        case (($ord_var_c & 0xFC) == 0xF8): +                            // characters U-00200000 - U-03FFFFFF, mask 111110XX +                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                            $char = pack('C*', $ord_var_c, +                                         ord($var{$c + 1}), +                                         ord($var{$c + 2}), +                                         ord($var{$c + 3}), +                                         ord($var{$c + 4})); +                            $c += 4; +                            $utf16 = $this->utf82utf16($char); +                            $ascii .= sprintf('\u%04s', bin2hex($utf16)); +                            break; +     +                        case (($ord_var_c & 0xFE) == 0xFC): +                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X +                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                            $char = pack('C*', $ord_var_c, +                                         ord($var{$c + 1}), +                                         ord($var{$c + 2}), +                                         ord($var{$c + 3}), +                                         ord($var{$c + 4}), +                                         ord($var{$c + 5})); +                            $c += 5; +                            $utf16 = $this->utf82utf16($char); +                            $ascii .= sprintf('\u%04s', bin2hex($utf16)); +                            break; +                    } +                } +                 +                return '"'.$ascii.'"'; +                 +            case 'array': +               /* +                * As per JSON spec if any array key is not an integer +                * we must treat the the whole array as an object. We +                * also try to catch a sparsely populated associative +                * array with numeric keys here because some JS engines +                * will create an array with empty indexes up to +                * max_index which can cause memory issues and because +                * the keys, which may be relevant, will be remapped +                * otherwise. +                *  +                * As per the ECMA and JSON specification an object may +                * have any string as a property. Unfortunately due to +                * a hole in the ECMA specification if the key is a +                * ECMA reserved word or starts with a digit the +                * parameter is only accessible using ECMAScript's +                * bracket notation. +                */ +                 +                // treat as a JSON object   +                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { +                    return '{' . +                           join(',', array_map(array($this, 'name_value'), +                                               array_keys($var), +                                               array_values($var))) +                           . '}'; +                } + +                // treat it like a regular array +                return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; +                 +            case 'object': +                $vars = get_object_vars($var); +                return '{' . +                       join(',', array_map(array($this, 'name_value'), +                                           array_keys($vars), +                                           array_values($vars))) +                       . '}'; + +            default: +                return ''; +        } +    } +     +   /** +    * array-walking function for use in generating JSON-formatted name-value pairs +    * +    * @param    string  $name   name of key to use +    * @param    mixed   $value  reference to an array element to be encoded +    * +    * @return   string  JSON-formatted name-value pair, like '"name":value' +    * @access   private +    */ +    function name_value($name, $value) +    { +        return $this->encode(strval($name)) . ':' . $this->encode($value); +    }         + +   /** +    * reduce a string by removing leading and trailing comments and whitespace +    * +    * @param    $str    string      string value to strip of comments and whitespace +    * +    * @return   string  string value stripped of comments and whitespace +    * @access   private +    */ +    function reduce_string($str) +    { +        $str = preg_replace(array( +         +                // eliminate single line comments in '// ...' form +                '#^\s*//(.+)$#m', +     +                // eliminate multi-line comments in '/* ... */' form, at start of string +                '#^\s*/\*(.+)\*/#Us', +     +                // eliminate multi-line comments in '/* ... */' form, at end of string +                '#/\*(.+)\*/\s*$#Us' +     +            ), '', $str); +         +        // eliminate extraneous space +        return trim($str); +    } + +   /** +    * decodes a JSON string into appropriate variable +    * +    * @param    string  $str    JSON-formatted string +    * +    * @return   mixed   number, boolean, string, array, or object +    *                   corresponding to given JSON input string. +    *                   See argument 1 to Services_JSON() above for object-output behavior. +    *                   Note that decode() always returns strings +    *                   in ASCII or UTF-8 format! +    * @access   public +    */ +    function decode($str) +    { +        $str = $this->reduce_string($str); +     +        switch (strtolower($str)) { +            case 'true': +                return true; + +            case 'false': +                return false; +             +            case 'null': +                return null; +             +            default: +                if (is_numeric($str)) { +                    // Lookie-loo, it's a number + +                    // This would work on its own, but I'm trying to be +                    // good about returning integers where appropriate: +                    // return (float)$str; + +                    // Return float or int, as appropriate +                    return ((float)$str == (integer)$str) +                        ? (integer)$str +                        : (float)$str; +                     +                } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { +                    // STRINGS RETURNED IN UTF-8 FORMAT +                    $delim = substr($str, 0, 1); +                    $chrs = substr($str, 1, -1); +                    $utf8 = ''; +                    $strlen_chrs = strlen($chrs); +                     +                    for ($c = 0; $c < $strlen_chrs; ++$c) { +                     +                        $substr_chrs_c_2 = substr($chrs, $c, 2); +                        $ord_chrs_c = ord($chrs{$c}); +                         +                        switch (true) { +                            case $substr_chrs_c_2 == '\b': +                                $utf8 .= chr(0x08); +                                ++$c; +                                break; +                            case $substr_chrs_c_2 == '\t': +                                $utf8 .= chr(0x09); +                                ++$c; +                                break; +                            case $substr_chrs_c_2 == '\n': +                                $utf8 .= chr(0x0A); +                                ++$c; +                                break; +                            case $substr_chrs_c_2 == '\f': +                                $utf8 .= chr(0x0C); +                                ++$c; +                                break; +                            case $substr_chrs_c_2 == '\r': +                                $utf8 .= chr(0x0D); +                                ++$c; +                                break; + +                            case $substr_chrs_c_2 == '\\"': +                            case $substr_chrs_c_2 == '\\\'': +                            case $substr_chrs_c_2 == '\\\\': +                            case $substr_chrs_c_2 == '\\/': +                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || +                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) { +                                    $utf8 .= $chrs{++$c}; +                                } +                                break; +                                 +                            case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): +                                // single, escaped unicode character +                                $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) +                                       . chr(hexdec(substr($chrs, ($c + 4), 2))); +                                $utf8 .= $this->utf162utf8($utf16); +                                $c += 5; +                                break; +         +                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): +                                $utf8 .= $chrs{$c}; +                                break; +         +                            case ($ord_chrs_c & 0xE0) == 0xC0: +                                // characters U-00000080 - U-000007FF, mask 110XXXXX +                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                                $utf8 .= substr($chrs, $c, 2); +                                ++$c; +                                break; +     +                            case ($ord_chrs_c & 0xF0) == 0xE0: +                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX +                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                                $utf8 .= substr($chrs, $c, 3); +                                $c += 2; +                                break; +     +                            case ($ord_chrs_c & 0xF8) == 0xF0: +                                // characters U-00010000 - U-001FFFFF, mask 11110XXX +                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                                $utf8 .= substr($chrs, $c, 4); +                                $c += 3; +                                break; +     +                            case ($ord_chrs_c & 0xFC) == 0xF8: +                                // characters U-00200000 - U-03FFFFFF, mask 111110XX +                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                                $utf8 .= substr($chrs, $c, 5); +                                $c += 4; +                                break; +     +                            case ($ord_chrs_c & 0xFE) == 0xFC: +                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X +                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +                                $utf8 .= substr($chrs, $c, 6); +                                $c += 5; +                                break; + +                        } + +                    } +                     +                    return $utf8; +                 +                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { +                    // array, or object notation + +                    if ($str{0} == '[') { +                        $stk = array(SERVICES_JSON_IN_ARR); +                        $arr = array(); +                    } else { +                        if ($this->use == SERVICES_JSON_LOOSE_TYPE) { +                            $stk = array(SERVICES_JSON_IN_OBJ); +                            $obj = array(); +                        } else { +                            $stk = array(SERVICES_JSON_IN_OBJ); +                            $obj = new stdClass(); +                        } +                    } +                     +                    array_push($stk, array('what'  => SERVICES_JSON_SLICE, +                                           'where' => 0, +                                           'delim' => false)); + +                    $chrs = substr($str, 1, -1); +                    $chrs = $this->reduce_string($chrs); +                     +                    if ($chrs == '') { +                        if (reset($stk) == SERVICES_JSON_IN_ARR) { +                            return $arr; + +                        } else { +                            return $obj; + +                        } +                    } + +                    //print("\nparsing {$chrs}\n"); +                     +                    $strlen_chrs = strlen($chrs); +                     +                    for ($c = 0; $c <= $strlen_chrs; ++$c) { +                     +                        $top = end($stk); +                        $substr_chrs_c_2 = substr($chrs, $c, 2); +                     +                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { +                            // found a comma that is not inside a string, array, etc., +                            // OR we've reached the end of the character list +                            $slice = substr($chrs, $top['where'], ($c - $top['where'])); +                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); +                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + +                            if (reset($stk) == SERVICES_JSON_IN_ARR) { +                                // we are in an array, so just push an element onto the stack +                                array_push($arr, $this->decode($slice)); + +                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { +                                // we are in an object, so figure +                                // out the property name and set an +                                // element in an associative array, +                                // for now +                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { +                                    // "name":value pair +                                    $key = $this->decode($parts[1]); +                                    $val = $this->decode($parts[2]); + +                                    if ($this->use == SERVICES_JSON_LOOSE_TYPE) { +                                        $obj[$key] = $val; +                                    } else { +                                        $obj->$key = $val; +                                    } +                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { +                                    // name:value pair, where name is unquoted +                                    $key = $parts[1]; +                                    $val = $this->decode($parts[2]); + +                                    if ($this->use == SERVICES_JSON_LOOSE_TYPE) { +                                        $obj[$key] = $val; +                                    } else { +                                        $obj->$key = $val; +                                    } +                                } + +                            } + +                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { +                            // found a quote, and we are not inside a string +                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); +                            //print("Found start of string at {$c}\n"); + +                        } elseif (($chrs{$c} == $top['delim']) && +                                 ($top['what'] == SERVICES_JSON_IN_STR) && +                                 (($chrs{$c - 1} != '\\') || +                                 ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) { +                            // found a quote, we're in a string, and it's not escaped +                            array_pop($stk); +                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + +                        } elseif (($chrs{$c} == '[') && +                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { +                            // found a left-bracket, and we are in an array, object, or slice +                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); +                            //print("Found start of array at {$c}\n"); + +                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { +                            // found a right-bracket, and we're in an array +                            array_pop($stk); +                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + +                        } elseif (($chrs{$c} == '{') && +                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { +                            // found a left-brace, and we are in an array, object, or slice +                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); +                            //print("Found start of object at {$c}\n"); + +                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { +                            // found a right-brace, and we're in an object +                            array_pop($stk); +                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + +                        } elseif (($substr_chrs_c_2 == '/*') && +                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { +                            // found a comment start, and we are in an array, object, or slice +                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); +                            $c++; +                            //print("Found start of comment at {$c}\n"); + +                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { +                            // found a comment end, and we're in one now +                            array_pop($stk); +                            $c++; +                             +                            for ($i = $top['where']; $i <= $c; ++$i) +                                $chrs = substr_replace($chrs, ' ', $i, 1); +                             +                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + +                        } +                     +                    } +                     +                    if (reset($stk) == SERVICES_JSON_IN_ARR) { +                        return $arr; + +                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { +                        return $obj; + +                    } +                 +                } +        } +    } +     +} +     +?>
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery b/includes/js/dojox/rpc/tests/resources/bigQuery new file mode 100644 index 0000000..e8f9429 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery @@ -0,0 +1 @@ +[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery5 b/includes/js/dojox/rpc/tests/resources/bigQuery5 new file mode 100644 index 0000000..e77ca8d --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery5 @@ -0,0 +1 @@ +[1,2,3,4,5]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/echo.php b/includes/js/dojox/rpc/tests/resources/echo.php new file mode 100644 index 0000000..b38a3ee --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echo.php @@ -0,0 +1,7 @@ +<?php +	if (!$_REQUEST["message"]){ +		print "ERROR: message property not found"; +	}else{ +		print $_REQUEST["message"]; +	} +?> diff --git a/includes/js/dojox/rpc/tests/resources/echoJson.php b/includes/js/dojox/rpc/tests/resources/echoJson.php new file mode 100644 index 0000000..52b5d03 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echoJson.php @@ -0,0 +1,8 @@ +<?php +	if (!$_REQUEST["message"]){ +		print "ERROR: message property not found"; +	}else{ +		header("Content-Type: application/json"); +		print $_REQUEST["message"]; +	} +?> diff --git a/includes/js/dojox/rpc/tests/resources/fakestore.php b/includes/js/dojox/rpc/tests/resources/fakestore.php new file mode 100644 index 0000000..075926a --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/fakestore.php @@ -0,0 +1,36 @@ +<?php +	session_start(); +	$fn = preg_replace("/\W/","",$_REQUEST["location"]);	 +	switch ($_SERVER["REQUEST_METHOD"]) { +		case "GET" :  +			if (isset($_SESSION[$fn])) { +				print($_SESSION[$fn]); +			} +			else { +				$fh = fopen($fn, 'r'); +				print(fread($fh, filesize($fn))); +				fclose($fh); +			} +			break; +		case "PUT" :  +			$contents = file_get_contents('php://input'); +			print($contents); +			$_SESSION[$fn]=$contents; +			break; +		case "POST" :  +			if (isset($_SESSION[$fn])) { +				$old = $_SESSION[$fn]; +			} +			else { +				$fh = fopen($fn, 'r'); +				$old = fread($fh, filesize($fn)); +				fclose($fh); +			} +			$contents = file_get_contents('php://input'); +			$_SESSION[$fn]=$old . $contents; +			break; +		case "DELETE" :  +			$_SESSION[$fn]="deleted"; +			break; +	} +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc10.php b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php new file mode 100644 index 0000000..fc99b75 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php @@ -0,0 +1,47 @@ +<?php +	require_once("./JSON.php"); +	 +	// FIXME: doesn't look like we really need Pear at all +	// which decreases the testing burden.  +	// Commenting out.the require and the new File() call. + +	// NOTE: File.php is installed via Pear using: +	//	%> sudo pear install File +	// Your server will also need the Pear library directory included in PHP's +	// include_path configuration directive +	// require_once('File.php'); + +	// ensure that we don't try to send "html" down to the client +	header("Content-Type: text/plain"); + +	$json = new Services_JSON; +	//$fp = new File(); + +	$results = array(); +	$results['error'] = null; + +	$jsonRequest = file_get_contents('php://input'); +	//$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + +	$req = $json->decode($jsonRequest); + +	$method = $req->method; +	$params = $req->params; + +	switch($method) { +		case "postJsonRpc10EchoNamed": +		case "postJsonRpc10Echo":  +			$results['result']=$params[0];			 +			break; +		default: +			$results['result']=""; +			$results['error']="JSON-RPC 1.0 METHOD NOT FOUND"; +			break; +	} + +	$results['id'] = $req->id; + +	$encoded = $json->encode($results); + +	print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc11.php b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php new file mode 100644 index 0000000..1c91e51 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php @@ -0,0 +1,52 @@ +<?php +	require_once("./JSON.php"); +	 +	// FIXME: doesn't look like we really need Pear at all +	// which decreases the testing burden.  +	// Commenting out.the require and the new File() call. + +	// NOTE: File.php is installed via Pear using: +	//	%> sudo pear install File +	// Your server will also need the Pear library directory included in PHP's +	// include_path configuration directive +	// require_once('File.php'); + +	// ensure that we don't try to send "html" down to the client +	header("Content-Type: text/plain"); + +	$json = new Services_JSON; +	//$fp = new File(); + +	$results = array(); +	$results['error'] = null; + +	$jsonRequest = file_get_contents('php://input'); +	//$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + +	$req = $json->decode($jsonRequest); + +	$method = $req->method; +	$params = $req->params; + +	switch($method) { +		case "rawPostJsonRpc11Echo":  +			if (is_array($params)){ +				$results['result']=$params; +			}else{ +				$results['result']=$params->message;			 +			} +			break; +		default: +			$results['result']=""; +			$results['error']=array(); +			$results['error']['code']=-32601; +			$results['error']["message"]="The requested remote-procedure does not exist / is not available."; +			break; +	} + +	$results['id'] = $req->id; + +	$encoded = $json->encode($results); + +	print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc12.php b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php new file mode 100644 index 0000000..8fad2e5 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php @@ -0,0 +1,53 @@ +<?php +	require_once("./JSON.php"); +	 +	// FIXME: doesn't look like we really need Pear at all +	// which decreases the testing burden.  +	// Commenting out.the require and the new File() call. + +	// NOTE: File.php is installed via Pear using: +	//	%> sudo pear install File +	// Your server will also need the Pear library directory included in PHP's +	// include_path configuration directive +	// require_once('File.php'); + +	// ensure that we don't try to send "html" down to the client +	header("Content-Type: text/plain"); + +	$json = new Services_JSON; +	//$fp = new File(); + +	$results = array(); +	$results['error'] = null; + +	$jsonRequest = file_get_contents('php://input'); +	//$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + +	$req = $json->decode($jsonRequest); + +	$method = $req->method; +	$params = $req->params; + +	switch($method) { +		case "postJsonRpc12Echo": +		case "postJsonRpc12EchoNamed": +			if (is_array($params)){ +				$results['result']=$params; +			}else{ +				$results['result']=$params->message;			 +			} +			break; +		default: +			$results['result']=""; +			$results['error']=array(); +			$results['error']['code']=-32601; +			$results['error']["message"]="The requested remote-procedure does not exist / is not available."; +			break; +	} + +	$results['id'] = $req->id; + +	$encoded = $json->encode($results); + +	print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php new file mode 100644 index 0000000..7db9153 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php @@ -0,0 +1,38 @@ +<?php +	require_once("./JSON.php"); +	 +	$json = new Services_JSON; +	$method = $_REQUEST["method"]; +	$id = $_REQUEST["id"]; +	$params = $_REQUEST["params"]; +	$result = ""; + +	switch ($method){ +		case "postJsonRpc10Echo": +		case "getJsonRpc10Echo": +		case "postJsonRpc10EchoNamed": +		case "getJsonRpc10EchoNamed": +			$p = $json->decode($params); +			$result = "{id:" . $id . ", 'result':'" . $p[0]. "', error:''}"; +			break; +		case "postJsonRpc12Echo": +		case "getJsonRpc12Echo": +		case "postJsonRpc12EchoNamed": +		case "getJsonRpc12EchoNamed": +			$p = $json->decode($params); +		 +			if ($p->message){ +				$d = $p->message; +			}else{ +				$d=$p[0]; +			} +			$result = "{id:" . $id . ", 'result':'" . $d . "'}"; +			break; +		default:  +			$result = "{id:'1','error':'Unknown Method', 'result':'this result only here for this test, shouldnt be here in real code'}"; +			break;	 +	} + +	print $result; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php @@ -0,0 +1,23 @@ +<?php +	$jsonp = false; +	$result = ""; + +	if ($_REQUEST["testCallbackParam"]){ +		$jsonp=true; +		$result .= $_REQUEST['testCallbackParam'] . "('"; +	} + +	if (!$_REQUEST["message"]){ +		$result .= "ERROR: message property not found"; +	} + +	$result .= $_REQUEST["message"]; + +	if ($jsonp) { +		$result .= "');"; +	} + +	print $result; + + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps @@ -0,0 +1,23 @@ +<?php +	$jsonp = false; +	$result = ""; + +	if ($_REQUEST["testCallbackParam"]){ +		$jsonp=true; +		$result .= $_REQUEST['testCallbackParam'] . "('"; +	} + +	if (!$_REQUEST["message"]){ +		$result .= "ERROR: message property not found"; +	} + +	$result .= $_REQUEST["message"]; + +	if ($jsonp) { +		$result .= "');"; +	} + +	print $result; + + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php new file mode 100644 index 0000000..251f38e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php @@ -0,0 +1,37 @@ +<?php +        require_once("./JSON.php"); +        $json = new Services_JSON; + +	$id = $_REQUEST['id']; +	$method = $_REQUEST['method']; +	$params = $json->decode($_REQUEST['params']); +	$callback = $_REQUEST["callback"]; + +	switch($method){ +		case "jsonpJsonRpc10EchoNamed": +		case "jsonpJsonRpc11Echo": +		case "jsonpJsonRpc11EchoNamed": +		case "jsonpJsonRpc10Echo": +			if ( ($method=="jsonpJsonRpc10EchoNamed")||($method=="jsonpJsonRpc11EchoNamed")){ +				$message = $params->message; +			}else{ +				$message = $params[0]; +			} +			if ($message){ +				switch($method){ +					case "jsonpJsonRpc11Echo": +					case "jsonpJsonRpc11EchoNamed": +						$res = "{'id': '$id', result: '$message'}"; +						break; +					default:  +						$res = "{'id': '$id', result: '$message', 'error':''}"; +						break; +				} +			}else{ +				$res = "{'id': '$id', error: {'code': 100, 'message':'no message provided'}}"; +			} +	} + +	print "$callback($res)"; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/obj1 b/includes/js/dojox/rpc/tests/resources/obj1 new file mode 100644 index 0000000..ff02ba8 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1 @@ -0,0 +1 @@ +{"id":"obj1","name":"Object 1","updated":1202755814406,"obj":{"foo":"bar"},"obj dup":{"$ref":"obj1.obj"},"testArray":[1,2,3,4]}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj1testArray b/includes/js/dojox/rpc/tests/resources/obj1testArray new file mode 100644 index 0000000..0c624c1 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1testArray @@ -0,0 +1 @@ +[1,2,3,undefined,4]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj3 b/includes/js/dojox/rpc/tests/resources/obj3 new file mode 100644 index 0000000..21cb328 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj3 @@ -0,0 +1 @@ +{"id":"obj3","name":"Object 3"}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj4 b/includes/js/dojox/rpc/tests/resources/obj4 new file mode 100644 index 0000000..a429ecf --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj4 @@ -0,0 +1 @@ +{"id":"obj4","name":"Object 4"}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/query b/includes/js/dojox/rpc/tests/resources/query new file mode 100644 index 0000000..cd18d6e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/query @@ -0,0 +1,6 @@ +[
 +	{id:"obj1",name:"Object 1"}, 
 +	{id:"obj2",name:"Object 2"},
 +	{$ref:"obj3"}, 
 +	{$ref:"obj4"}
 +]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/rawEcho.php b/includes/js/dojox/rpc/tests/resources/rawEcho.php new file mode 100644 index 0000000..e0c15c0 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/rawEcho.php @@ -0,0 +1,5 @@ +<?php +        print file_get_contents('php://input'); + +?> + diff --git a/includes/js/dojox/rpc/tests/resources/res b/includes/js/dojox/rpc/tests/resources/res new file mode 100644 index 0000000..3c22137 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/res @@ -0,0 +1 @@ +deleted
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/store.php b/includes/js/dojox/rpc/tests/resources/store.php new file mode 100644 index 0000000..941e113 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/store.php @@ -0,0 +1,24 @@ +<?php +	$fn = preg_replace("/\W/","",$_REQUEST["location"]);	 +	switch ($_SERVER["REQUEST_METHOD"]) { +		case "GET" :  +			$fh = fopen($fn, 'r'); +			print(fread($fh, filesize($fn))); +			break; +		case "PUT" :  +			$fh = fopen($fn, 'w'); +			$contents = file_get_contents('php://input'); +			print($contents); +			fwrite($fh, $contents); +			break; +		case "POST" :  +			$fh = fopen($fn, "a+"); +			fwrite($fh, file_get_contents('php://input')); +			break; +		case "DELETE" :  +			$fh = fopen($fn, 'w'); +			fwrite($fh, "deleted"); +			break; +	} +	fclose($fh); +?> diff --git a/includes/js/dojox/rpc/tests/resources/test.smd b/includes/js/dojox/rpc/tests/resources/test.smd new file mode 100644 index 0000000..6ad56be --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/test.smd @@ -0,0 +1,189 @@ +{ +	transport: "POST", +	envelope: "URL", +	strictParameters: false, +	parameters: { +                appId: {}, +                outputType: { +                        default: "json" +                }, + +                ignoreErrors: { +                        optional: true +                } +        }, + +        services: { +                postEcho: { +                        target: "echo.php", +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, + +                getEcho: { +			transport: "GET", +                        target: "echo.php", + +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, +                getEchoJson: { +			transport: "GET", +                        target: "echoJson.php", +			contentType:"application/json", +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, +                getPathEcho: { +			transport: "GET", +			envelope: "PATH", +			target: "echo.php?message=", + +			parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, +		restStore: { +			transport: "REST", +			contentType:"text/plain", +			target: "fakestore.php",  +                        parameters: [ +                                {name: "location", type: "string", optional: true} +                        ] +                }, +		jsonRestStore: { +				transport: "REST", +                        target: "fakestore.php", +						contentType:"application/json", +                        parameters: [ +                                {name: "location", type: "string", optional: true} +                        ] +                }, + + + +                postJsonEcho: { +			transport: "POST", +			envelope: "JSON", +                        target: "rawEcho.php", + +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, + +                jsonpEcho: { +			transport: "JSONP", +                        target: "jsonpEcho.php", +			callbackParamName: "testCallbackParam", + +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, + +                postJsonRpc10Echo: { +			transport: "POST", +			envelope: "JSON-RPC-1.0", +			target: "jsonRpc10.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                postJsonRpc10EchoNamed: { +			transport: "POST", +			envelope: "JSON-RPC-1.0", +			target: "jsonRpc10.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                jsonpJsonRpc12Echo: { +			transport: "JSONP", +			envelope: "JSON-RPC-2.0", +			target: "jsonpJsonRpcEcho.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                jsonpJsonRpc12EchoNamed: { +			transport: "JSONP", +			envelope: "JSON-RPC-2.0", +			target: "jsonpJsonRpcEcho.php", + +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, + +                postJsonRpc10ForcedError: { +			envelope: "JSON-RPC-1.0", +			transport: "POST", +			target: "jsonRpc10.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                postJsonRpc12Echo: { +			transport: "POST", +			envelope: "JSON-RPC-2.0", +			target: "jsonRpc12.php", + +                        parameters: [ +                                {name: "message", type: "string", optional: true} +                        ] +                }, + +                getJsonRpc12Echo: { +			transport: "GET", +			envelope: "JSON-RPC-2.0", +			target: "jsonRpcPostGetEcho.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                postJsonRpc12EchoNamed: { +			transport: "POST", +			envelope: "JSON-RPC-2.0", +			target: "jsonRpcPostGetEcho.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + +                getJsonRpc12EchoNamed: { +			transport: "GET", +			envelope: "JSON-RPC-2.0", +			target: "jsonRpcPostGetEcho.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                }, + + +                postJsonRpc12ForcedError: { +			envelope: "JSON-RPC-2.0", +			transport: "POST", +			target: "jsonRpc12.php", + +                        parameters: [ +                                {type: "string", optional: true} +                        ] +                } +	}	 +} | 
