def __init__(self, parent=None):
QtCore.
QObject.__init__
(self, parent
)
self.mappings = {}
def addToDocument(self, doc):
self.connect(doc, QtCore.SIGNAL("contentsChange(int, int, int)"), self.highlight)
def addMapping(self, pattern, format):
self.mappings[pattern] = format
def highlight(self, position, removed, added):
doc = self.sender()
block = doc.findBlock(position)
if not block.isValid():
return
if added > removed:
endBlock = doc.findBlock(position + added)
else:
endBlock = block
while block.isValid() and not (endBlock < block):
self.highlightBlock(block)
block = block.next()
def highlightBlock(self, block):
layout = block.layout()
text = block.text()
overrides = []
for pattern in self.mappings:
expression
= QtCore.
QRegExp(pattern
) i = text.indexOf(expression)
while i >= 0:
range.start = i
range.length = expression.matchedLength()
range.format = self.mappings[pattern]
overrides.append(range)
i = text.indexOf(expression, i + expression.matchedLength())
layout.setAdditionalFormats(overrides)
block.document().markContentsDirty(block.position(), block.length())
class Highlighter(QtCore.QObject):
def __init__(self, parent=None):
QtCore.QObject.__init__(self, parent)
self.mappings = {}
def addToDocument(self, doc):
self.connect(doc, QtCore.SIGNAL("contentsChange(int, int, int)"), self.highlight)
def addMapping(self, pattern, format):
self.mappings[pattern] = format
def highlight(self, position, removed, added):
doc = self.sender()
block = doc.findBlock(position)
if not block.isValid():
return
endBlock = QtGui.QTextBlock()
if added > removed:
endBlock = doc.findBlock(position + added)
else:
endBlock = block
while block.isValid() and not (endBlock < block):
self.highlightBlock(block)
block = block.next()
def highlightBlock(self, block):
layout = block.layout()
text = block.text()
overrides = []
for pattern in self.mappings:
expression = QtCore.QRegExp(pattern)
i = text.indexOf(expression)
while i >= 0:
range = QtGui.QTextLayout.FormatRange()
range.start = i
range.length = expression.matchedLength()
range.format = self.mappings[pattern]
overrides.append(range)
i = text.indexOf(expression, i + expression.matchedLength())
layout.setAdditionalFormats(overrides)
block.document().markContentsDirty(block.position(), block.length())
To copy to clipboard, switch view to plain text mode
Bookmarks