]> git.cworth.org Git - apitrace/blob - scripts/highlight.py
Fix highlight.py on Windows.
[apitrace] / scripts / highlight.py
1 ##########################################################################
2 #
3 # Copyright 2011 Jose Fonseca
4 # Copyright 2008-2009 VMware, Inc.
5 # All Rights Reserved.
6 #
7 # Permission is hereby granted, free of charge, to any person obtaining a copy
8 # of this software and associated documentation files (the "Software"), to deal
9 # in the Software without restriction, including without limitation the rights
10 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 # copies of the Software, and to permit persons to whom the Software is
12 # furnished to do so, subject to the following conditions:
13 #
14 # The above copyright notice and this permission notice shall be included in
15 # all copies or substantial portions of the Software.
16 #
17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 # THE SOFTWARE.
24 #
25 ##########################################################################/
26
27
28 import sys
29 import platform
30
31
32 class PlainHighlighter:
33     '''Plain formatter'''
34
35     black = None
36     red = None
37     green = None
38     yellow = None
39     blue = None
40     magenta = None
41     cyan = None
42     white = None
43
44     def __init__(self, stream):
45         self.stream = stream
46
47     def write(self, text):
48         self.stream.write(text)
49
50     def flush(self):
51         self.stream.flush()
52
53     def normal(self):
54         pass
55
56     def color(self, color):
57         pass
58
59     def bold(self):
60         pass
61
62     def italic(self):
63         pass
64
65
66 class AnsiHighlighter(PlainHighlighter):
67     '''Highlighter for plain-text files which outputs ANSI escape codes. See
68     http://en.wikipedia.org/wiki/ANSI_escape_code for more information
69     concerning ANSI escape codes.
70     '''
71
72     _csi = '\33['
73
74     _normal = '0m'
75     _bold = '1m'
76     _italic = '3m'
77
78     black = 0
79     red = 1
80     green = 2
81     yellow = 3
82     blue = 4
83     magenta = 5
84     cyan = 6
85     white = 7
86
87     def __init__(self, stream):
88         PlainHighlighter.__init__(self, stream)
89         self.isatty = stream.isatty()
90
91     def _escape(self, code):
92         if self.isatty:
93             self.stream.write(self._csi + code)
94
95     def normal(self):
96         self._escape(self._normal)
97
98     def color(self, color):
99         self._escape(str(30 + color) + 'm')
100
101     def bold(self):
102         self._escape(self._bold)
103
104     def italic(self):
105         self._escape(self._italic)
106
107
108 class WindowsConsoleHighlighter(PlainHighlighter):
109     '''Highlighter for the Windows Console. See 
110     http://code.activestate.com/recipes/496901/ for more information.
111     '''
112
113     INVALID_HANDLE_VALUE = -1
114     STD_INPUT_HANDLE  = -10
115     STD_OUTPUT_HANDLE = -11
116     STD_ERROR_HANDLE  = -12
117
118     FOREGROUND_BLUE      = 0x01
119     FOREGROUND_GREEN     = 0x02
120     FOREGROUND_RED       = 0x04
121     FOREGROUND_INTENSITY = 0x08
122     BACKGROUND_BLUE      = 0x10
123     BACKGROUND_GREEN     = 0x20
124     BACKGROUND_RED       = 0x40
125     BACKGROUND_INTENSITY = 0x80
126
127     COMMON_LVB_LEADING_BYTE = 0x0100
128     COMMON_LVB_TRAILING_BYTE = 0x0200
129     COMMON_LVB_GRID_HORIZONTAL = 0x0400
130     COMMON_LVB_GRID_LVERTICAL = 0x0800
131     COMMON_LVB_GRID_RVERTICAL = 0x1000
132     COMMON_LVB_REVERSE_VIDEO = 0x4000
133     COMMON_LVB_UNDERSCORE = 0x8000
134
135     _normal = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
136     _bold   = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY
137     _italic = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
138
139     black   = 0
140     red     =                                      FOREGROUND_RED
141     green   =                   FOREGROUND_GREEN                 
142     blue    = FOREGROUND_BLUE                                    
143     white   = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
144
145     def __init__(self, stream):
146         PlainHighlighter.__init__(self, stream)
147
148         if stream is sys.stdin:
149             nStdHandle = self.STD_INPUT_HANDLE
150         elif stream is sys.stdout:
151             nStdHandle = self.STD_OUTPUT_HANDLE
152         elif stream is sys.stderr:
153             nStdHandle = self.STD_ERROR_HANDLE
154         else:
155             nStdHandle = None
156
157         if nStdHandle is not None:
158             import ctypes
159             self._handle = ctypes.windll.kernel32.GetStdHandle(nStdHandle)
160         else:
161             self._handle = self.INVALID_HANDLE_VALUE
162
163         self._attribute = self.white
164
165     def _setAttribute(self, attr):
166         if self._handle != self.INVALID_HANDLE_VALUE:
167             import ctypes
168             ctypes.windll.kernel32.SetConsoleTextAttribute(self._handle, attr)
169         self._attribute = attr
170
171     def normal(self):
172         self._setAttribute(self._normal)
173
174     def color(self, color):
175         intensity = self._attribute & self.FOREGROUND_INTENSITY
176         self._setAttribute(color | intensity)
177
178     def bold(self):
179         self._setAttribute(self._attribute | self.FOREGROUND_INTENSITY)
180
181     def italic(self):
182         pass
183
184
185 def Highlighter(stream = sys.stdout):
186     if platform.system() == 'Windows':
187         return WindowsConsoleHighlighter(stream)
188     else:
189         return AnsiHighlighter(stream)
190
191
192 __all__ = [
193     'Highlighter',
194 ]