################################################################################
#
# 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