prefs: apply flake8 suggestions
[git-cola.git] / cola / widgets / highlighter.py
blobe6f07dd6de9307b1a22a5af535c259d9a403078f
1 from __future__ import division, absolute_import, unicode_literals
3 from PyQt4 import QtCore, QtGui
5 have_pygments = True
6 try:
7 from pygments.styles import get_style_by_name
8 from pygments import lex
9 from pygments.util import ClassNotFound
10 from pygments.lexers import get_lexer_for_filename
11 except ImportError:
12 have_pygments = False
14 def highlight_document(edit, filename):
15 doc = edit.document()
17 if not have_pygments:
18 return
20 try:
21 lexer = get_lexer_for_filename(filename, stripnl=False)
22 except ClassNotFound:
23 return
25 style = get_style_by_name("default")
27 font = doc.defaultFont()
28 base_format = QtGui.QTextCharFormat()
29 base_format.setFont(font)
30 token_formats = {}
32 window = edit.window()
33 if hasattr(window, "processEvents"):
34 processEvents = window.processEvents
35 else:
36 processEvents = QtCore.QCoreApplication.processEvents
38 def get_token_format(token):
39 if token in token_formats:
40 return token_formats[token]
42 if token.parent:
43 parent_format = get_token_format(token.parent)
44 else:
45 parent_format = base_format
47 format = QtGui.QTextCharFormat(parent_format)
48 font = format.font()
49 if style.styles_token(token):
50 tstyle = style.style_for_token(token)
51 if tstyle['color']:
52 format.setForeground (QtGui.QColor("#"+tstyle['color']))
53 if tstyle['bold']: font.setWeight(QtGui.QFont.Bold)
54 if tstyle['italic']: font.setItalic (True)
55 if tstyle['underline']: format.setFontUnderline(True)
56 if tstyle['bgcolor']: format.setBackground (QtGui.QColor("#"+tstyle['bgcolor']))
57 # No way to set this for a QTextCharFormat
58 #if tstyle['border']: format.
59 token_formats[token] = format
60 return format
62 text = doc.toPlainText()
64 block_count = 0
65 block = doc.firstBlock()
66 assert(isinstance(block, QtGui.QTextBlock))
67 block_pos = 0
68 block_len = block.length()
69 block_formats = []
71 for token, ttext in lex(text, lexer):
72 format_len = len(ttext)
73 format = get_token_format(token)
74 while format_len > 0:
75 format_range = QtGui.QTextLayout.FormatRange()
76 format_range.start = block_pos
77 format_range.length = min(format_len, block_len)
78 format_range.format = format
79 block_formats.append(format_range)
80 block_len -= format_range.length
81 format_len -= format_range.length
82 block_pos += format_range.length
83 if block_len == 0:
84 block.layout().setAdditionalFormats(block_formats)
85 doc.markContentsDirty(block.position(), block.length())
86 block = block.next() # pylint: disable=next-method-called
87 block_pos = 0
88 block_len = block.length()
89 block_formats = []
91 block_count += 1
92 if block_count % 100 == 0:
93 processEvents()
96 if __name__ == "__main__":
97 import sys
98 app = QtGui.QApplication(sys.argv)
100 python = QtGui.QPlainTextEdit()
101 f = open(__file__, 'r')
102 python.setPlainText(f.read())
103 f.close()
105 python.setWindowTitle('python')
106 python.show()
107 highlight_document(python, __file__)
109 sys.exit(app.exec_())