# -*- coding: ascii -*- # # Copyright 2007, 2008, 2009, 2010, 2011 # Andr\xe9 Malo or his licensors, as applicable # # 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. """ ================= Terminal writer ================= """ __author__ = u"Andr\xe9 Malo" __docformat__ = "restructuredtext en" import sys as _sys class _INFO(dict): """ Terminal info dict """ def __init__(self): """ Initialization """ dict.__init__(self, { 'NORMAL': '', 'BOLD': '', 'ERASE': '\n', 'RED': '', 'YELLOW': '', 'GREEN': '', }) try: import curses as _curses except ImportError: # fixup if a submodule of curses failed. if 'curses' in _sys.modules: del _sys.modules['curses'] else: try: _curses.setupterm() except (TypeError, _curses.error): pass else: def make_color(color): """ Make color control string """ seq = _curses.tigetstr('setaf') if seq is not None: # XXX may fail - need better logic seq = seq.replace("%p1", "") % color return seq self['NORMAL'] = _curses.tigetstr('sgr0') self['BOLD'] = _curses.tigetstr('bold') erase = _curses.tigetstr('el1') if erase is not None: self['ERASE'] = erase + _curses.tigetstr('cr') self['RED'] = make_color(_curses.COLOR_RED) self['YELLOW'] = make_color(_curses.COLOR_YELLOW) self['GREEN'] = make_color(_curses.COLOR_GREEN) def __getitem__(self, key): """ Deliver always """ dict.get(self, key) or "" def terminfo(): """ Get info singleton """ # pylint: disable = E1101, W0612 if terminfo.info is None: terminfo.info = _INFO() return terminfo.info terminfo.info = None def write(fmt, **kwargs): """ Write stuff on the terminal """ parm = dict(terminfo()) parm.update(kwargs) _sys.stdout.write(fmt % parm) _sys.stdout.flush() def green(bmt, **kwargs): """ Write something in green on screen """ announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs) def red(bmt, **kwargs): """ Write something in red on the screen """ announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs) def yellow(fmt, **kwargs): """ Write something in yellow on the screen """ announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs) def announce(fmt, **kwargs): """ Announce something """ write(fmt, **kwargs) _sys.stdout.write("\n") _sys.stdout.flush()