瀏覽代碼

Add colored output

Colored output uses colorama, so it should strip all colors if stderr
can't handle them (e.g. it is redirected to a file).
Ryan C. Thompson 7 年之前
父節點
當前提交
f255f58589
共有 1 個文件被更改,包括 33 次插入15 次删除
  1. 33 15
      roll.py

+ 33 - 15
roll.py

@@ -9,6 +9,23 @@ import operator
 from numbers import Number
 from numbers import Number
 from random import SystemRandom
 from random import SystemRandom
 from pyparsing import Regex, oneOf, Optional, Group, Combine, Literal, CaselessLiteral, ZeroOrMore, StringStart, StringEnd, opAssoc, infixNotation, ParseException, Empty, pyparsing_common, ParseResults, White, Suppress
 from pyparsing import Regex, oneOf, Optional, Group, Combine, Literal, CaselessLiteral, ZeroOrMore, StringStart, StringEnd, opAssoc, infixNotation, ParseException, Empty, pyparsing_common, ParseResults, White, Suppress
+
+try:
+    import colorama
+    colorama.init()
+    from colors import color
+except ImportError:
+    # Fall back to no color
+    def color(s, *args, **kwargs):
+        '''Fake color function that does nothing.
+
+        Used when the colors module cannot be imported.'''
+        return s
+
+EXPR_COLOR = "green"
+RESULT_COLOR = "red"
+DETAIL_COLOR = "yellow"
+
 logFormatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
 logFormatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 logger.setLevel(logging.INFO)
 logger.setLevel(logging.INFO)
@@ -191,9 +208,9 @@ def format_dice_roll_list(rolls, always_list=False):
     if len(rolls) == 0:
     if len(rolls) == 0:
         raise ValueError('Need at least one die rolled')
         raise ValueError('Need at least one die rolled')
     elif len(rolls) == 1 and not always_list:
     elif len(rolls) == 1 and not always_list:
-        return str(rolls[0])
+        return color(str(rolls[0]), DETAIL_COLOR)
     else:
     else:
-        return '[' + ",".join(map(str, rolls)) + ']'
+        return '[' + color(" ".join(map(str, rolls)), DETAIL_COLOR) + ']'
 
 
 @attr.s
 @attr.s
 class DiceRolled(object):
 class DiceRolled(object):
@@ -220,7 +237,7 @@ class DiceRolled(object):
 
 
     def __str__(self):
     def __str__(self):
         if self.roll_desc:
         if self.roll_desc:
-            prefix = '{roll} rolled'.format(roll=self.roll_desc)
+            prefix = '{roll} rolled'.format(roll=color(self.roll_desc, EXPR_COLOR))
         else:
         else:
             prefix = 'Rolled'
             prefix = 'Rolled'
         if self.dropped_results:
         if self.dropped_results:
@@ -228,9 +245,9 @@ class DiceRolled(object):
         else:
         else:
             drop = ''
             drop = ''
         if self.success_count is not None:
         if self.success_count is not None:
-            tot = ', Total successes: ' + str(self.total())
+            tot = ', Total successes: ' + color(str(self.total()), DETAIL_COLOR)
         elif len(self.dice_results) > 1:
         elif len(self.dice_results) > 1:
-            tot = ', Total: ' + str(self.total())
+            tot = ', Total: ' + color(str(self.total()), DETAIL_COLOR)
         else:
         else:
             tot = ''
             tot = ''
         return '{prefix}: {results}{drop}{tot}'.format(
         return '{prefix}: {results}{drop}{tot}'.format(
@@ -702,9 +719,9 @@ if __name__ == '__main__':
             # on the command line only roll expressions are valid.
             # on the command line only roll expressions are valid.
             expr = expr_parser.parseString(expr_string, True)
             expr = expr_parser.parseString(expr_string, True)
             result = eval_expr(expr)
             result = eval_expr(expr)
-            logger.info("Total roll for {expr!r}: {result}".format(
-                expr=expr_as_str(expr),
-                result=result
+            logger.info('Total roll for {expr}: {result}'.format(
+                expr=color(expr_as_str(expr), EXPR_COLOR),
+                result=color(result, RESULT_COLOR),
             ))
             ))
         except Exception as exc:
         except Exception as exc:
             logger.error("Error while rolling: %s", repr(exc))
             logger.error("Error while rolling: %s", repr(exc))
@@ -728,27 +745,28 @@ if __name__ == '__main__':
                 elif 'delete' in parsed:
                 elif 'delete' in parsed:
                     vname = parsed['varname']
                     vname = parsed['varname']
                     if vname in env:
                     if vname in env:
-                        logger.info('Deleting saved value for {var!r}.'.format(var=vname))
+                        logger.info('Deleting saved value for "{var}".'.format(var=color(vname, RESULT_COLOR)))
                         del env[vname]
                         del env[vname]
                     else:
                     else:
-                        logger.error('Variable {var!r} is not defined.'.format(var=vname))
+                        logger.error('Variable "{var}" is not defined.'.format(var=color(vname, RESULT_COLOR)))
                 elif re.search("\\S", expr_string):
                 elif re.search("\\S", expr_string):
                     if 'assignment' in parsed:
                     if 'assignment' in parsed:
                         # We have an assignment operation
                         # We have an assignment operation
                         vname = parsed['varname']
                         vname = parsed['varname']
                         if var_name_allowed(vname):
                         if var_name_allowed(vname):
                             env[vname] = expr_as_str(parsed['expr'])
                             env[vname] = expr_as_str(parsed['expr'])
-                            logger.info('Saving {var} as {expr!r}'.format(
-                                var=vname, expr=env[vname],
+                            logger.info('Saving "{var}" as "{expr}"'.format(
+                                var=color(vname, RESULT_COLOR),
+                                expr=color(env[vname], EXPR_COLOR),
                             ))
                             ))
                         else:
                         else:
                             logger.error('You cannot use {!r} as a variable name.'.format(vname))
                             logger.error('You cannot use {!r} as a variable name.'.format(vname))
                     else:
                     else:
                         # Just an expression to evaluate
                         # Just an expression to evaluate
                         result = eval_expr(parsed['expr'], env)
                         result = eval_expr(parsed['expr'], env)
-                        logger.info('Total roll for {expr!r}: {result}'.format(
-                            expr=expr_as_str(parsed, env),
-                            result=result,
+                        logger.info('Total roll for {expr}: {result}'.format(
+                            expr=color(expr_as_str(parsed, env), EXPR_COLOR),
+                            result=color(result, RESULT_COLOR),
                         ))
                         ))
                 print('', file=sys.stderr)
                 print('', file=sys.stderr)
             except KeyboardInterrupt:
             except KeyboardInterrupt: