Revision: 4585
Author: KariHusa
Date: Wed Feb  2 05:55:56 2011
Log: monitor: Add coloring to Windows console
http://code.google.com/p/robotframework/source/detail?r=4585

Modified:
 /trunk/src/robot/output/monitor.py

=======================================
--- /trunk/src/robot/output/monitor.py  Wed Feb  2 03:13:47 2011
+++ /trunk/src/robot/output/monitor.py  Wed Feb  2 05:55:56 2011
@@ -13,6 +13,7 @@
 #  limitations under the License.


+import os
 import sys

 from robot import utils
@@ -59,7 +60,7 @@
     def message(self, msg):
         # called by LOGGER
         if self._is_logged(msg.level):
-            self._status_text(msg.level).write_msg(msg.message)
+            self._status_text(msg.level).write_message(msg.message)

     def _status_text(self, text):
         return StatusText(text, self._colors)
@@ -98,11 +99,14 @@

 def StatusText(msg, colors=True):
     if colors:
+        if os.sep == '\\':
+            return DosHiglightedStatusText(msg)
         return HiglightedStatusText(msg)
     return PlainStatusText(msg)


 class PlainStatusText:
+    _highlight_colors = {}

     def __init__(self, msg):
         self._msg = msg
@@ -111,34 +115,107 @@
         return self._msg

     def write_status(self, stream=sys.__stdout__):
-        self.write(' | %s |' % self, stream)
-
-    def write_msg(self, msg):
-        self.write('[ %s ] %s' % (self, msg), stream=sys.__stderr__)
+        self.write(' | %s |' % self._msg, stream)
+
+    def write_message(self, message):
+ self.write('[ %s ] %s' % (self._msg, message), stream=sys.__stderr__)

     def write(self, message, newline=True, stream=sys.__stdout__):
         if newline:
             message += '\n'
-        stream.write(utils.encode_output(message).replace('\t', ' '*8))
+        self._write_encoded_with_tab_replacing(stream, message)
         stream.flush()

+    def _write_encoded_with_tab_replacing(self, stream, message):
+        stream.write(utils.encode_output(message).replace('\t', ' '*8))
+
+    def _get_highlight_color(self, text):
+        if text in self._highlight_colors:
+            return self._highlight_colors[text]
+        raise FrameworkError
+

 class HiglightedStatusText(PlainStatusText):
     ANSI_RED    = '\033[31m'
     ANSI_GREEN  = '\033[32m'
     ANSI_YELLOW = '\033[33m'
     ANSI_RESET  = '\033[0m'
+
+    _highlight_colors = {'FAIL': ANSI_RED,
+                         'ERROR': ANSI_RED,
+                         'WARN': ANSI_YELLOW,
+                         'PASS': ANSI_GREEN}

     def __str__(self):
         color = self._get_highlight_color(self._msg)
         reset = color != '' and self.ANSI_RESET or ''
         return color + self._msg + reset

-    def _get_highlight_color(self, text):
-        if text in ['FAIL','ERROR']:
-            return self.ANSI_RED
-        elif text == 'WARN':
-            return self.ANSI_YELLOW
-        elif text == 'PASS':
-            return self.ANSI_GREEN
-        raise FrameworkError
+
+from ctypes import windll, Structure, c_short, c_ushort, byref
+
+SHORT = c_short
+WORD = c_ushort
+
+class COORD(Structure):
+  _fields_ = [
+    ("X", SHORT),
+    ("Y", SHORT)]
+
+class SMALL_RECT(Structure):
+  _fields_ = [
+    ("Left", SHORT),
+    ("Top", SHORT),
+    ("Right", SHORT),
+    ("Bottom", SHORT)]
+
+class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+  _fields_ = [
+    ("dwSize", COORD),
+    ("dwCursorPosition", COORD),
+    ("wAttributes", WORD),
+    ("srWindow", SMALL_RECT),
+    ("dwMaximumWindowSize", COORD)]
+
+
+class DosHiglightedStatusText(PlainStatusText):
+    FOREGROUND_RED = 0x0004
+    FOREGROUND_YELLOW = 0x0006
+    FOREGROUND_GREEN = 0x0002
+    FOREGROUND_INTENSITY = 0x0008
+    FOREGROUND_GREY = 0x0007
+
+    STD_OUTPUT_HANDLE = -11
+
+    _highlight_colors = {'FAIL': FOREGROUND_RED,
+                         'ERROR': FOREGROUND_RED,
+                         'WARN': FOREGROUND_YELLOW,
+                         'PASS': FOREGROUND_GREEN}
+
+    def write_status(self, newline=True, stream=sys.__stdout__):
+        self._write(None, ' |', '|', newline, stream)
+
+    def write_message(self, message, newline=True, stream=sys.__stderr__):
+        self._write(message, '[', ']', newline, stream)
+
+ def _write(self, message, start_sep, end_sep, newline=True, stream=sys.__stdout__):
+        default_colors = self._get_text_attr()
+        default_fg = default_colors & 0x0007
+        default_bg = default_colors & 0x0070
+        self._write_encoded_with_tab_replacing(stream, start_sep)
+ self._set_text_attr(self._get_highlight_color(self._msg) | self.FOREGROUND_INTENSITY)
+        self._write_encoded_with_tab_replacing(stream, ' %s ' % self._msg)
+ self._set_text_attr(default_fg | default_bg | self.FOREGROUND_INTENSITY)
+        self._write_encoded_with_tab_replacing(stream, end_sep)
+        if message:
+            stream.write(' %s' % message)
+        if newline:
+            self._write_encoded_with_tab_replacing(stream, '\n')
+
+    def _set_text_attr(self, color):
+ windll.kernel32.SetConsoleTextAttribute(windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE), color)
+
+    def _get_text_attr(self):
+        csbi = CONSOLE_SCREEN_BUFFER_INFO()
+ windll.kernel32.GetConsoleScreenBufferInfo(self.STD_OUTPUT_HANDLE, byref(csbi))
+        return csbi.wAttributes

Reply via email to