[Html_ajax-svn] [178] implementation and examples for Urlencoded serializer

Joshua Eichorn josh at bluga.net
Wed Nov 9 10:13:53 CST 2005


You don't need to put @version and @author tags on each method.  The 
class tags are enough unless the values are different for that one method.
-josh
arpad at bluga.net wrote:

> Revision
>     178
> Author
>     arpad
> Date
>     2005-11-09 00:23:53 -0600 (Wed, 09 Nov 2005)
>
>
>       Log Message
>
>implementation and examples for Urlencoded serializer
>
>
>       Added Paths
>
>     * trunk/AJAX/Serializer/Urlencoded.php
>       <#trunkAJAXSerializerUrlencodedphp>
>     * trunk/examples/serialize.url.examples.php
>       <#trunkexamplesserializeurlexamplesphp>
>     * trunk/js/UrlSerializer.js <#trunkjsUrlSerializerjs>
>
>
>       Diff
>
>
>         Added: trunk/AJAX/Serializer/Urlencoded.php (177 => 178)
>
>--- trunk/AJAX/Serializer/Urlencoded.php	2005-11-09 06:18:06 UTC (rev 177)
>+++ trunk/AJAX/Serializer/Urlencoded.php	2005-11-09 06:23:53 UTC (rev 178)
>@@ -0,0 +1,33 @@
>+<?php
>+// $Id$
>+if (!function_exists('http_build_query')) {
>+    require_once 'PHP/Compat/functions/http_build_query.php';
>+}
>+
>+/**
>+ * URL Encoding Serializer
>+ *
>+ * @category   HTML
>+ * @package    AJAX
>+ * @author     Arpad Ray <arpad at rajeczy.com>
>+ * @copyright  2005 Arpad Ray
>+ * @license    http://www.opensource.org/licenses/lgpl-license.php  LGPL
>+ * @version    Release: @package_version@
>+ * @link       http://pear.php.net/package/HTML_AJAX
>+ */
>+class HTML_AJAX_Serialize_Urlencoded
>+{
>+    
>+    function serialize($input) 
>+    {
>+        return http_build_query(array('_HTML_AJAX' => $input));
>+    }
>+
>+    function unserialize($input) 
>+    {
>+        parse_str($input, $ret);
>+        return (isset($ret['_HTML_AJAX']) ? $ret['_HTML_AJAX'] : null);
>+    }
>+}
>+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
>+?>
>
>
>         Added: trunk/examples/serialize.url.examples.php (177 => 178)
>
>--- trunk/examples/serialize.url.examples.php	2005-11-09 06:18:06 UTC (rev 177)
>+++ trunk/examples/serialize.url.examples.php	2005-11-09 06:23:53 UTC (rev 178)
>@@ -0,0 +1,69 @@
>+<script type="text/javascript" src="../js/UrlSerializer.js"></script>
>+<script type="text/javascript" src="../js/util.js"></script>
>+<script type="text/javascript">
>+
>+</script>
>+<?php
>+
>+$examples = array(
>+    '$foo = null;',
>+    '$foo = true;',
>+    '$foo = "foobar";',
>+    '$foo = 337;',
>+    '$foo = 99.99;',
>+    '$foo = array("a" => 1, "b" => 2, 3);',
>+    '$foo = array(1,2,array(1,2,3));',
>+    'class Foo { var $foo; var $bar; }' 
>+    . '$foo = new Foo; $foo->foo = "hello"; $foo->bar = array("world","universe");'
>+);
>+
>+require_once '../AJAX/Serializer/Urlencoded.php';
>+$sr = new HTML_AJAX_Serialize_Urlencoded;
>+echo '<h1><a name="pos">Positives</a> | <a href="#neg">Negatives</a></h1>';
>+$c = count($examples);
>+for ($i = 0; $i < $c; $i++) {
>+    echo "<strong>PHP Code:</strong>\n<pre>$examples[$i]</pre>\n<strong>PHP value:</strong><pre>\n";
>+    eval($examples[$i]);
>+    var_dump($foo);
>+    $sfoo = $sr->serialize($foo);
>+    echo "</pre>\n<strong>Unserialized in PHP:</strong>\n<pre>";
>+    var_dump($sr->unserialize($sfoo));
>+    echo "</pre>\n<strong>Unserialized in JS:</strong>\n<pre>\n",
>+         '<script type="text/javascript">',
>+         'var jsr = new HTML_AJAX_Serialize_Urlencoded();',
>+         'var sfoo = unescape("', urlencode($sfoo), '"); var usfoo = jsr.unserialize(sfoo); if (jsr.error) {',
>+         'document.write("Error: " + jsr.getError() + "\n"); } document.write(HTML_AJAX_Util.varDump(usfoo) + ',
>+         '"</pre>\n<strong>Serialized in PHP:</strong>\n<pre>', $sfoo, '</pre>\n',
>+         '\n<strong>Serialized in JS:</strong>\n<pre>" + jsr.serialize(usfoo));',
>+         "\n</script>\n</pre>\n<hr />\n\n";
>+}
>+
>+$bad_examples = array(
>+    'x',
>+    'x-1',
>+    'x=1x=2',
>+    'x=1&',
>+    'x[=]1',
>+    '[]x=1',
>+    '_HTML_AJAX]]=1',
>+    '_HTML_AJAX[[=1',
>+    '_HTML_AJAX][=1',
>+    '_HTML_AJAX[=]1',
>+    '_HTML_AJAX[=1]',
>+    '_HTML_AJAX[0]=1&_HTML_AJAX]]=1',
>+    '_HTML_AJAX[0[1]]=1',
>+    '_HTML_AJAX[0[1]=1'
>+);
>+
>+echo '<h1><a href="#pos">Positives</a> | <a name="neg">Negatives</a></h1>';
>+foreach ($bad_examples as $sfoo) {
>+    echo "</pre>\n<strong>Invalidly serialized:</strong>\n<pre>", $sfoo, "</pre>\n",
>+         "<strong>Unserialized in JS:</strong>\n<pre>\n",
>+         '<script type="text/javascript">',
>+         'var sfoo = unescape("', urlencode($sfoo), '"); var usfoo = jsr.unserialize(sfoo); if (jsr.error) {',
>+         'document.write("Error: " + jsr.getError() + "\n"); } document.write(HTML_AJAX_Util.varDump(usfoo));',
>+         "</script>\n</pre>\n<hr />\n\n";
>+}
>+
>+
>+?>
>
>
>         Added: trunk/js/UrlSerializer.js (177 => 178)
>
>--- trunk/js/UrlSerializer.js	2005-11-09 06:18:06 UTC (rev 177)
>+++ trunk/js/UrlSerializer.js	2005-11-09 06:23:53 UTC (rev 178)
>@@ -0,0 +1,167 @@
>+/***************************************************************************
>+
>+    This class can be used to serialize and unserialize data in a
>+    format compatible with PHP's handling of HTTP query strings.
>+    Due to limitations of the format, all input is serialized as an
>+    array or a string. e.g. An object with another object as a
>+    property will be serialized as a multidimensional array, where
>+    every element is an array or a string.
>+    
>+    Copyright (C) 2005 Arpad Ray <arpad at rajeczy.com>
>+
>+    This library is free software; you can redistribute it and/or
>+    modify it under the terms of the GNU Lesser General Public
>+    License as published by the Free Software Foundation; either
>+    version 2.1 of the License, or (at your option) any later version.
>+
>+    This library is distributed in the hope that it will be useful,
>+    but WITHOUT ANY WARRANTY; without even the implied warranty of
>+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+    Lesser General Public License for more details.
>+
>+    You should have received a copy of the GNU Lesser General Public
>+    License along with this library; if not, write to:
>+    Free Software Foundation, Inc.,
>+    51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>+
>+***************************************************************************/
>+
>+// {{{ var HTML_AJAX_Serialize_Urlencoded
>+function HTML_AJAX_Serialize_Urlencoded() {}
>+HTML_AJAX_Serialize_Urlencoded.prototype = {
>+    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
>+    base: '_HTML_AJAX',
>+    _keys: [],
>+    _count: 0,
>+    error: false,
>+    message: "",
>+    cont: "",
>+    // {{{ serialize
>+    /**
>+     *  Serializes a variable (calls _serialize().)
>+     *
>+     *  @param     mixed  inp the variable to serialize
>+     *  @return    string   a string representation of the input, 
>+     *                      which can be reconstructed by unserialize()
>+     *  @author Arpad Ray <arpad at rajeczy.com>
>+     *  @version 0.0.1
>+     */
>+    serialize: function(input) {
>+        if (typeof input == 'undefined') {
>+            return '';
>+        }
>+        var ret = this.base;
>+        for (i in this._keys) {
>+            ret += '[' + escape(this._keys[i]) + ']'; 
>+        }
>+        ret += '=';
>+        switch (HTML_AJAX_Util.getType(input)) {
>+            case 'string': 
>+            case 'number':
>+                ret += escape(input.toString());
>+                break;
>+            case 'boolean':
>+                ret += (input ? '1' : '0');
>+                break;
>+            case 'array':
>+            case 'object':
>+                ret = '';
>+                for (i in input) {
>+                    this._keys.push(i);
>+                    ret += this.serialize(input[i]) + '&';
>+                    this._keys.pop();
>+                }
>+                ret = ret.substr(0, ret.length - 1);
>+        }
>+        return ret;
>+    },
>+    // }}}
>+    // {{{ unserialize
>+    /**
>+     *  Reconstructs a serialized variable
>+     *
>+     *  @param    string inp the string to reconstruct
>+     *  @return   array an array containing the variable represented by the input string, or void on failure
>+     *  @author Arpad Ray <arpad at rajeczy.com>
>+     *  @version 0.0.1
>+     */
>+    unserialize: function(input) {
>+        if (!input.length || input.length == 0) {
>+            // null
>+            return;
>+        }
>+        if (!/^(?:_HTML_AJAX(?:\[[^\[\]]*\])*=[^&]*(?:&|$))+$/.test(input)) {
>+            this.raiseError("invalidly formed input", input);
>+            return;
>+        }
>+        input = input.split("&");
>+        var pos, key, keys, val, _HTML_AJAX = [];
>+        if (input.length == 1) {
>+            if (input[0].substr(0, this.base.length + 1) != this.base + '=') {
>+                this.raiseError("invalid input base", input);
>+                return;    
>+            }
>+            return unescape(input[0].substr(this.base.length + 1));
>+        }
>+        for (var i in input) {
>+            pos = input[i].indexOf("=");
>+            if (pos < 1 || input[i].length - pos - 1 < 1) {
>+                this.raiseError("input is too short", input[i]);
>+                return;
>+            }
>+            key = unescape(input[i].substr(0, pos));
>+            val = unescape(input[i].substr(pos + 1));
>+            key = key.replace(/\[((?:\d*\D+)+)\]/g, '["$1"]');
>+            keys = key.split(']');
>+            for (j in keys) {
>+                if (!keys[j].length || keys[j].length == 0) {
>+                    continue;
>+                }
>+                try {
>+                    if (eval('typeof ' + keys[j] + ']') == 'undefined') {
>+                        eval(keys[j] + ']=[];');
>+                    }
>+                } catch (e) {
>+                    this.raiseError("error evaluating key", input);
>+                    return; 
>+                }
>+            }
>+            try {
>+                eval(key + '="' + val + '";');
>+            } catch (e) {
>+                this.raiseError("error evaluating value", input);
>+                return; 
>+            }
>+        }
>+        return _HTML_AJAX;
>+    },
>+    // }}}
>+    // {{{ getError
>+    /**
>+    *  Gets the last error message
>+    *
>+    *  @return    string   the last error message from unserialize()
>+    *  @author Arpad Ray <arpad at rajeczy.com>
>+    *  @version 0.0.3
>+    */    
>+    getError: function() {
>+        return this.message + "\n" + this.cont;
>+    },
>+    // }}}
>+    // {{{ raiseError
>+    /**
>+    *  Raises an eror (called by unserialize().)
>+    *
>+    *  @param    string    message    the error message
>+    *  @param    string    cont       the remaining unserialized content
>+    *  @author Arpad Ray <arpad at rajeczy.com>
>+    *  @version 0.0.3
>+    */    
>+    raiseError: function(message, cont) {
>+        this.error = 1;
>+        this.message = message;
>+        this.cont = cont;
>+    }
>+    // }}}
>+}
>+// }}}
>\ No newline at end of file
>
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Html_ajax-svn mailing list
>Html_ajax-svn at lists.bluga.net
>http://lists.bluga.net/mailman/listinfo/html_ajax-svn
>  
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.bluga.net/pipermail/html_ajax-svn/attachments/20051109/692f444a/attachment-0001.html


More information about the Html_ajax-svn mailing list