1 from __future__
import division
, absolute_import
, unicode_literals
3 from PyQt4
import QtCore
, QtGui
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
14 def highlight_document(edit
, filename
):
21 lexer
= get_lexer_for_filename(filename
, stripnl
=False)
25 style
= get_style_by_name("default")
27 font
= doc
.defaultFont()
28 base_format
= QtGui
.QTextCharFormat()
29 base_format
.setFont(font
)
32 window
= edit
.window()
33 if hasattr(window
, "processEvents"):
34 processEvents
= window
.processEvents
36 processEvents
= QtCore
.QCoreApplication
.processEvents
38 def get_token_format(token
):
39 if token
in token_formats
:
40 return token_formats
[token
]
43 parent_format
= get_token_format(token
.parent
)
45 parent_format
= base_format
47 format
= QtGui
.QTextCharFormat(parent_format
)
49 if style
.styles_token(token
):
50 tstyle
= style
.style_for_token(token
)
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
62 text
= doc
.toPlainText()
65 block
= doc
.firstBlock()
66 assert(isinstance(block
, QtGui
.QTextBlock
))
68 block_len
= block
.length()
71 for token
, ttext
in lex(text
, lexer
):
72 format_len
= len(ttext
)
73 format
= get_token_format(token
)
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
84 block
.layout().setAdditionalFormats(block_formats
)
85 doc
.markContentsDirty(block
.position(), block
.length())
86 block
= block
.next() # pylint: disable=next-method-called
88 block_len
= block
.length()
92 if block_count
% 100 == 0:
96 if __name__
== "__main__":
98 app
= QtGui
.QApplication(sys
.argv
)
100 python
= QtGui
.QPlainTextEdit()
101 f
= open(__file__
, 'r')
102 python
.setPlainText(f
.read())
105 python
.setWindowTitle('python')
107 highlight_document(python
, __file__
)
109 sys
.exit(app
.exec_())