diff options
Diffstat (limited to 'mediawiki/PHPSerialize.py')
-rw-r--r-- | mediawiki/PHPSerialize.py | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/mediawiki/PHPSerialize.py b/mediawiki/PHPSerialize.py deleted file mode 100644 index d25b71bd..00000000 --- a/mediawiki/PHPSerialize.py +++ /dev/null @@ -1,149 +0,0 @@ -import types, string - -""" -Serialize class for the PHP serialization format. - -@version v0.4 BETA -@author Scott Hurring; scott at hurring dot com -@copyright Copyright (c) 2005 Scott Hurring -@license http://opensource.org/licenses/gpl-license.php GNU Public License -$Id: PHPSerialize.py,v 1.1 2006/01/08 21:53:19 shurring Exp $ - -Most recent version can be found at: -http://hurring.com/code/python/phpserialize/ - -Usage: -# Create an instance of the serialize engine -s = PHPSerialize() -# serialize some python data into a string -serialized_string = s.serialize(string) -# encode a session list (php's session_encode) -serialized_string = s.session_encode(list) - -See README.txt for more information. -""" - -class PHPSerialize(object): - """ - Class to serialize data using the PHP Serialize format. - - Usage: - serialized_string = PHPSerialize().serialize(data) - serialized_string = PHPSerialize().session_encode(list) - """ - - def __init__(self): - pass - - def session_encode(self, session): - """Thanks to Ken Restivo for suggesting the addition - of session_encode - """ - out = "" - for (k,v) in session.items(): - out = out + "%s|%s" % (k, self.serialize(v)) - return out - - def serialize(self, data): - return self.serialize_value(data) - - def is_int(self, data): - """ - Determine if a string var looks like an integer - TODO: Make this do what PHP does, instead of a hack - """ - try: - int(data) - return True - except: - return False - - def serialize_key(self, data): - """ - Serialize a key, which follows different rules than when - serializing values. Many thanks to Todd DeLuca for pointing - out that keys are serialized differently than values! - - From http://us2.php.net/manual/en/language.types.array.php - A key may be either an integer or a string. - If a key is the standard representation of an integer, it will be - interpreted as such (i.e. "8" will be interpreted as int 8, - while "08" will be interpreted as "08"). - Floats in key are truncated to integer. - """ - # Integer, Long, Float, Boolean => integer - if type(data) is types.IntType or type(data) is types.LongType \ - or type(data) is types.FloatType or type(data) is types.BooleanType: - return "i:%s;" % int(data) - - # String => string or String => int (if string looks like int) - elif type(data) is types.StringType: - if self.is_int(data): - return "i:%s;" % int(data) - else: - return "s:%i:\"%s\";" % (len(data), data); - - # None / NULL => empty string - elif type(data) is types.NoneType: - return "s:0:\"\";" - - # I dont know how to serialize this - else: - raise Exception("Unknown / Unhandled key type (%s)!" % type(data)) - - - def serialize_value(self, data): - """ - Serialize a value. - """ - - # Integer => integer - if type(data) is types.IntType: - return "i:%s;" % data - - # Float, Long => double - elif type(data) is types.FloatType or type(data) is types.LongType: - return "d:%s;" % data - - # String => string or String => int (if string looks like int) - # Thanks to Todd DeLuca for noticing that PHP strings that - # look like integers are serialized as ints by PHP - elif type(data) is types.StringType: - if self.is_int(data): - return "i:%s;" % int(data) - else: - return "s:%i:\"%s\";" % (len(data), data); - - # None / NULL - elif type(data) is types.NoneType: - return "N;"; - - # Tuple and List => array - # The 'a' array type is the only kind of list supported by PHP. - # array keys are automagically numbered up from 0 - elif type(data) is types.ListType or type(data) is types.TupleType: - i = 0 - out = [] - # All arrays must have keys - for k in data: - out.append(self.serialize_key(i)) - out.append(self.serialize_value(k)) - i += 1 - return "a:%i:{%s}" % (len(data), "".join(out)) - - # Dict => array - # Dict is the Python analogy of a PHP array - elif type(data) is types.DictType: - out = [] - for k in data: - out.append(self.serialize_key(k)) - out.append(self.serialize_value(data[k])) - return "a:%i:{%s}" % (len(data), "".join(out)) - - # Boolean => bool - elif type(data) is types.BooleanType: - return "b:%i;" % (data == 1) - - # I dont know how to serialize this - else: - raise Exception("Unknown / Unhandled data type (%s)!" % type(data)) |