Pyom.1.00a/
Pyom.1.00a/pysrc/miniboa/
# -*- coding: utf-8 -*- line endings: unix -*-
#------------------------------------------------------------------------------
#   miniboa/terminal.py
#   Copyright 2009 Jim Storch
#   Licensed under the Apache License, Version 2.0 (the "License"); you may
#   not use this file except in compliance with the License. You may obtain a
#   copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#   License for the specific language governing permissions and limitations
#   under the License.
#------------------------------------------------------------------------------
# Changes made by pR0Ps.CM[at]gmail[dot]com on 18/07/2012
# -Updated for use with Python 3.x
# -Repackaged into a single file to simplify distribution
# -Other misc fixes and changes
#
# Report any bugs in this implementation to me (email above)
#------------------------------------------------------------------------------
# Additional changes by Quixadhal on 2014.06.16
# -Re-split code into multiple files, for ease of maintenance
# -Rewrote terminal system
#
# Pinkfish style color codes are now available, as used in various
# LPMUD systems, as well as the I3 intermud network.
#
# Briefly, a color token is surrounded by the special symbol %^, which
# acts as a seperator for multiple tokens in a row.  So, an example like
#
# A %^RED%^red apple%^RESET%^ and a %^BOLD%^BLUE%^blue ball%^RESET%^.
#
# Would result in "red apple" and "blue ball" being colored, and
# "blue ball" would also be in bold.
#
# Some terminals will amke that actual bold, others will make it a
# brighter blue color.
#
# The replacement is dependant on the terminal type passed in, which
# defaults to ANSI, but can be "unknown" to strip colors, or
# "i3" or "imc2" for the intermud networks, or "mxp" for that.
#------------------------------------------------------------------------------

"""
Support for color and formatting for various terminals or
terminal-like systems
"""

import re
from miniboa.colors import _TERMINAL_TYPES, _COLOR_TOKENS, _COLOR_MAP

_PARA_BREAK = re.compile(r"(\n\s*\n)", re.MULTILINE)

def word_wrap(text, columns = 80, indent = 4, padding = 2):
    """
    Given a block of text, breaks into a list of lines wrapped to
    length.
    """
    paragraphs = _PARA_BREAK.split(text)
    lines = []
    columns -= padding
    for para in paragraphs:
        if para.isspace():
            continue
        line = ' ' * indent
        linelen = len(line)
        for word in para.split():
            bareword = colorize(word, None)
            if (linelen + 1 + len(bareword)) > columns:
                lines.append(line)
                line = ' ' * padding
                linelen = len(line)
                line += word
                linelen += len(bareword)
            else:
                line += ' ' + word
                linelen += len(bareword) + 1
        if not line.isspace():
            lines.append(line)
    return lines

def colorize(text, terminal = 'ansi'):
    """
    Given a chunk of text, replace color tokesn with the appropriate
    color codes for the given terminal type
    """
    if text == None or text == '':
        return text
    if terminal == None or terminal not in _TERMINAL_TYPES:
        terminal = 'unknown'
    words = text.split('%^')
    for word in words:
        if word == '':
            continue
        if word not in _COLOR_TOKENS:
            continue
        if word not in _COLOR_MAP[terminal]:
            continue
        i = words.index(word)
        words[i] = _COLOR_MAP[terminal][word]
    return ''.join(words)

def escape(text):
    """
    Escape all the color tokens in the given text chunk, so they
    can be safely printed through the color parser
    """
    if text == None or text == '':
        return text
    text = text.replace('%^', '%%^^')
    return text