nakedmud-mod/
nakedmud-mod/html/tutorials/
nakedmud-mod/html/tutorials/building_extras/
nakedmud-mod/html/tutorials/c/
nakedmud-mod/html/tutorials/reference/
nakedmud-mod/html/tutorials/scripting/
nakedmud-mod/html/tutorials/scripting_extras/
nakedmud-mod/lib/
nakedmud-mod/lib/help/A/
nakedmud-mod/lib/help/B/
nakedmud-mod/lib/help/C/
nakedmud-mod/lib/help/D/
nakedmud-mod/lib/help/G/
nakedmud-mod/lib/help/H/
nakedmud-mod/lib/help/J/
nakedmud-mod/lib/help/L/
nakedmud-mod/lib/help/M/
nakedmud-mod/lib/help/O/
nakedmud-mod/lib/help/P/
nakedmud-mod/lib/help/R/
nakedmud-mod/lib/help/S/
nakedmud-mod/lib/help/W/
nakedmud-mod/lib/logs/
nakedmud-mod/lib/misc/
nakedmud-mod/lib/players/
nakedmud-mod/lib/pymodules/polc/
nakedmud-mod/lib/txt/
nakedmud-mod/lib/world/
nakedmud-mod/lib/world/zones/examples/
nakedmud-mod/lib/world/zones/examples/mproto/
nakedmud-mod/lib/world/zones/examples/oproto/
nakedmud-mod/lib/world/zones/examples/reset/
nakedmud-mod/lib/world/zones/examples/rproto/
nakedmud-mod/lib/world/zones/examples/trigger/
nakedmud-mod/lib/world/zones/limbo/
nakedmud-mod/lib/world/zones/limbo/room/
nakedmud-mod/lib/world/zones/limbo/rproto/
nakedmud-mod/src/alias/
nakedmud-mod/src/dyn_vars/
nakedmud-mod/src/editor/
nakedmud-mod/src/example_module/
nakedmud-mod/src/help2/
nakedmud-mod/src/set_val/
nakedmud-mod/src/socials/
nakedmud-mod/src/time/
################################################################################
#
# Four Worlds
# Copyright (c) 2009-????
#
# Package: polc
#    File: parsers.py
#
# The automatic Python OLC system, capable of generating an online content editor
# for a given Python class or dict by using dictionaries to discover properties.
#
# OLC Response Parsing
#
# Author: Stendec
#
################################################################################

from data import *
from types import *

################################################################################
# Variables
################################################################################
def parse_choice(sock, data, key, val):
	'''Parse a multiple-choice value.'''
	if not val.isdigit(): return False
	val = int(val)

	c = data.k(key,'choices')
	if type(c) is dict: ks = sorted(c.keys())
	else: ks = sorted(c)
	
	# Is it valid?
	if val < 0 or val >= len(ks): return False
	return ks[val]
	
	'''if type(data.opts['_'+key]['choices']) == dict:
		ks = sorted(data.opts['_'+key]['choices'].keys())
		if val < 0 or val >= len(ks): return False
		val = ks[val]
	else:
		if val < 0 or val >= len(data.opts['_'+key]['choices']): return False
		val = data.opts['_'+key]['choices'][val]
	
	# It's okay.
	return val'''

def parse_number(sock, data, key, val):
	'''Parse a numeric value.'''
	if type(data.object) == dict: old = data.object[key]
	else: old = getattr(data.object, key)
	
	# Is val nothing? Return True to get the hell out.
	if val == '': return True
	
	# Convert val into the right type.
	try:
		if		type(old) == int:		val = int(val)
		elif	type(old) == float:	val = float(val)
		elif	type(old) == long:	val = long(val)
	except:
		return False

	# Range check?
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('range'):
		min, max = data.opts['_'+key]['range'].split(',')
		if val < type(old)(min) or val > type(old)(max):
			sock.send("Value must be between %s and %s." % (min, max))
			return False
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('min') and val < data.opts['_'+key]['min']:
		sock.send("Value must be at least: " + str(data.opts['_'+key]['min']))
		return False
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('max') and val > data.opts['_'+key]['max']:
		sock.send("Value must be no more then: " + str(data.opts['_'+key]['max']))
		return False

	# It's okay.
	return val

def parse_list(sock, data, key, val):
	'''Parse a list or tuple.'''
	if type(data.object) == dict: old = data.object[key]
	else: old = getattr(data.object, key)
	
	# Split the list, based on commas.
	val = val.replace(', ',',').split(',')
	
	# Should we be making a tuple?
	if type(old) == tuple:
		val = tuple(val)
	
	# It's okay.
	return val

def parse_string(sock, data, key, val):
	'''Parse a string value.'''
	# Content check?
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('type'):
		if		data.opts['_'+key]['type'] == 'alnum' and not val.isalnum(): return False
		elif	data.opts['_'+key]['type'] == 'alpha' and not val.isalpha(): return False
		elif	data.opts['_'+key]['type'] == 'digit' and not val.isdigit(): return False
	
	# Length check?
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('range'):
		min, max = data.opts['_'+key]['range'].split(',')
		if len(val) < int(min) or len(val) > int(max):
			sock.send("Value must be between %s and %s characters long." % (min, max))
			return False
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('min') and len(val) < data.opts['_'+key]['min']:
		sock.send("Value must be at least %d characters long." % data.opts['_'+key]['min'])
		return False
	if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('max') and len(val) > data.opts['_'+key]['max']:
		sock.send("Value must be no more then %d characters long." % data.opts['_'+key]['max'])
		return False
	
	# It's okay.
	return val