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: renderers.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.
#
# Rendering of values for display in the OLC menu.
#
# Author: Stendec
#
################################################################################

from data import *
from types import *

from mud import format_string

try:
	from colour import highlight_color
except: highlight_color = lambda v: v.replace('{','{{')

################################################################################
# Basic Renderer Functions
################################################################################

def fancy_key(key):
	'''Attempt to make a key name fancy. If it's in an array of default names, return the
		 corresponding fancy name. Otherwise, convert underscores to spaces and make it
		 title case.'''
	if fancy_keys.has_key(key): return fancy_keys[key]
	else: return key.replace('_',' ').title()

def render_bool(sock, data, key, value):
	'''Render a boolean value for the automatic OLC system.'''
	return ': {c' + (value and 'yes' or 'no')

def render_number(sock, data, key, value):
	'''Render a number value for the automatic OLC system.'''
	if type(value) == float:
		 p = data.k(key, 'places')
		 if p: return ': {c' + str(int(value)) + ('%f' % round(value-int(value),p))[1:p+2]
	return ': {c' + str(value)

def render_list(sock, data, key, value):
	'''Render a list for the automatic OLC system. Strings are
		 output without being escaped and surrounded in quotation
		 marks.'''
	val = ''
	for i in value:
		val += '{D, {c'
		if type(i) == str: val += i
		else: val += str(i)
	return ': {c' + val[6:]

def render_string(sock, data, key, value):
	'''Render a string value for the automatic OLC system.'''
	n = data.k(key,'name')
	if n is None: n = fancy_key(key)
	
	if value.endswith('\r\n'): value = value[:-2]
	
	if data.k(key, 'same-line'): prefix = ' ' * (15-len(n)) + ': {c'
	else:
		prefix = ':\r\n{c'
		value = format_string(value, False, sock.cols)
	if value == '': return prefix[:-1] + 'D' + (data.k(key, 'empty') or '<NONE>')
	
	# Should we be post-processing the text?
	func = data.k(key, 'process')
	if data.k(key,'nocolor') or func is 'no-color': value = highlight_color(value)
	elif type(func) in (FunctionType,LambdaType,BuiltinFunctionType,BuiltinMethodType,type(str.upper)): value = func(value)
	
	return prefix + value

def render_subitem(sock, data, key, value):
	'''Render a subitem key for the automatic OLC system.'''
	return ' menu'

def render_choice_list(sock, data, key, value):
	'''Render a list of choices for the automatic OLC system.'''
	c = data.k(key, 'choices')
	val = ''
	if type(c) == dict:
		for i in value: val += '{D, {c' + str(c[i])
	else:
		for i in value: val += '{D, {c' + str(i)
	return ': {c' + val[6:]

def render_choice(sock, data, key, value):
	'''Render a choice for the automatic OLC system.'''
	w = data.k(key, 'width')
	if w is None: w = '0'
	else: w = str(w)
	c = data.k(key, 'choices')
	if type(c) == dict: return ('{y[{c%'+w+'s{y]') % str(c[value])
	else: return ('{y[{c%'+w+'s{y]') % str(value)

def render_choice_select(sock, data, key, value):
	'''Render a list of choices to select from for the prompt after selecting a key.'''
	buf = []
	longest = 0
	
	c = data.k(key, 'choices')
	if type(c) == dict:
		ks = sorted(c.keys())
		for i in range(0, len(ks)):
			b = '  {c%2d{y) {g%s' % (i, c[ks[i]])
			longest = max(longest, len(b) - 6)
			buf.append(b)
	else:
		c = sorted(c)
		for i in range(0, len(c)):
			b = '  {c%2d{y) {g%s' % (i, c[i])
			longest = max(longest, len(b) - 6)
			buf.append(b)
	
	# Get the screen width, if supported.
	if hasattr(sock, 'cols'): w = sock.cols
	else: w = 80
	num_cols = w / longest
	
	# Print the list out
	i = 0
	longest += 6
	val = ''
	for b in buf:
		val += b + ' ' * (longest - len(b))
		i += 1
		if i >= num_cols:
			val += '\r\n'
			i = 0
	if val.endswith('\r\n'): val = val[:-2]
	return val