83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
|
#-*-coding:utf-8-*-
|
|||
|
import sys, re
|
|||
|
from PyQt4.QtGui import *
|
|||
|
from PyQt4.QtCore import *
|
|||
|
|
|||
|
class MyHighlighter( QSyntaxHighlighter ):
|
|||
|
|
|||
|
def __init__( self, parent, theme ):
|
|||
|
|
|||
|
QSyntaxHighlighter.__init__( self, parent )
|
|||
|
self.parent = parent
|
|||
|
|
|||
|
self.parenthesis_color = [Qt.red, Qt.green, Qt.blue]
|
|||
|
|
|||
|
def textFormat(self, color):
|
|||
|
init_format = QTextCharFormat()
|
|||
|
brush = QBrush( color, Qt.SolidPattern )
|
|||
|
init_format.setForeground( brush )
|
|||
|
return init_format
|
|||
|
|
|||
|
|
|||
|
def highlightBlock( self, text ):
|
|||
|
|
|||
|
''' ( ( ) )
|
|||
|
paren_level ___0___|__1__|__2_|__1_|__0
|
|||
|
'''
|
|||
|
|
|||
|
paren_level = self.previousBlockState()
|
|||
|
if paren_level == -1: # 若是沒有上次的狀態,就設為0
|
|||
|
paren_level = 0
|
|||
|
paren_size = 1
|
|||
|
|
|||
|
|
|||
|
|
|||
|
iterator = re.finditer("[()]", text)
|
|||
|
|
|||
|
paran_and_offset = [{"paren": match.group(0), "offset": match.start()} for match in iterator]
|
|||
|
|
|||
|
print(paran_and_offset)
|
|||
|
for i in paran_and_offset:
|
|||
|
if i["paren"] == QString('('):
|
|||
|
print("paren_level %d" % paren_level)
|
|||
|
self.setFormat( i["offset"], paren_size , self.textFormat(self.parenthesis_color[paren_level]) )
|
|||
|
paren_level += 1
|
|||
|
elif i["paren"] == QString(')'):
|
|||
|
print(paren_level)
|
|||
|
paren_level -= 1
|
|||
|
self.setFormat( i["offset"], paren_size , self.textFormat(self.parenthesis_color[paren_level]) )
|
|||
|
else:
|
|||
|
pass
|
|||
|
|
|||
|
self.setCurrentBlockState(paren_level)
|
|||
|
|
|||
|
class HighlightingRule():
|
|||
|
|
|||
|
def __init__( self, pattern, format ):
|
|||
|
|
|||
|
self.pattern = pattern
|
|||
|
self.format = format
|
|||
|
|
|||
|
class TestApp( QMainWindow ):
|
|||
|
|
|||
|
def __init__(self):
|
|||
|
|
|||
|
QMainWindow.__init__(self)
|
|||
|
font = QFont()
|
|||
|
font.setFamily( "Noto Sans Mono" )
|
|||
|
font.setFixedPitch( True )
|
|||
|
font.setPointSize( 11 )
|
|||
|
editor = QTextEdit()
|
|||
|
editor.setFont( font )
|
|||
|
highlighter = MyHighlighter( editor, "Classic" )
|
|||
|
self.setCentralWidget( editor )
|
|||
|
self.setWindowTitle( "Syntax Highlighter" )
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
app = QApplication( sys.argv )
|
|||
|
window = TestApp()
|
|||
|
window.show()
|
|||
|
sys.exit( app.exec_() )
|
|||
|
|