def highlightBlock(self, text: str): """Highlight of a comment block""" # for every pattern for pattern, char_format in self.highlightingRules: # Create a regular expression from the retrieved pattern expression = QRegExp(pattern) # Check what index that expression occurs at with the ENTIRE text index = expression.indexIn(text) # While the index is greater than 0 while index >= 0: # Get the length of how long the expression is true, # set the format from the start to the length with # the text format length = expression.matchedLength() self.setFormat(index, length, char_format) # Set index to where the expression ends in the text index = expression.indexIn(text, index + length) # Do multi-line strings self.match_multiline(text, self.oql_start_comment, self.oql_end_comment, 1, Qt.gray)
def highlightBlock(self, text): for rule in self.highlightingRules: expression = QRegExp(rule.pattern) index = expression.indexIn(text) while index >= 0: length = expression.matchedLength() self.setFormat(index, length, rule.format) index = expression.indexIn(text, index + length) self.setCurrentBlockState(0)
def match_multiline(self, text: str, start_delimiter: QRegExp, end_delimiter: QRegExp, in_state: int, style: Qt) -> bool: """Do highlighting of multi-line strings. ``delimiter`` should be a ``QRegExp`` for triple-single-quotes or triple-double-quotes, and ``in_state`` should be a unique integer to represent the corresponding state changes when inside those strings. Returns True if we're still inside a multi-line string when this function is finished. """ # If inside triple-single quotes, start at 0 if self.previousBlockState() == in_state: start = 0 add = 0 # Otherwise, look for the delimiter on this line else: start = start_delimiter.indexIn(text) # Move past this match add = start_delimiter.matchedLength() # As long as there's a delimiter match on this line... while start >= 0: # Look for the ending delimiter end = end_delimiter.indexIn(text, start + add) # Ending delimiter on this line? if end >= add: length = end - start + add + end_delimiter.matchedLength() self.setCurrentBlockState(0) # No; multi-line string else: self.setCurrentBlockState(in_state) length = len(text) - start + add # Apply formatting self.setFormat(start, length, style) # Look for the next match start = end_delimiter.indexIn(text, start + length) # Return True if still inside a multi-line string, False otherwise return self.currentBlockState() == in_state
def highlightBlock(self, text): # for every pattern for pattern, char_format in self.highlightingRules: # Create a regular expression from the retrieved pattern expression = QRegExp(pattern) # Check what index that expression occurs at with the ENTIRE text index = expression.indexIn(text) # While the index is greater than 0 while index >= 0: # Get the length of how long the expression is true, # set the format from the start to the length with # the text format length = expression.matchedLength() self.setFormat(index, length, char_format) # Set index to where the expression ends in the text index = expression.indexIn(text, index + length) self.setCurrentBlockState(0) start_index = 0 if self.previousBlockState() != 1: start_index = self.value_start_expression.indexIn(text) while start_index >= 0: end_index = self.value_end_expression.indexIn(text, start_index) if end_index == -1: self.setCurrentBlockState(1) comment_length = len(text) - start_index else: comment_length = \ end_index - start_index + \ self.value_end_expression.matchedLength() self.setFormat(start_index, comment_length, self.value_format) start_index = self.value_start_expression.indexIn( text, start_index + comment_length)
def set_text_bold(widget, pattern): """ Set bold text when word match with pattern :param widget: QTextEdit :param pattern: Text to find used as pattern for QRegExp (String) :return: """ cursor = widget.textCursor() format_ = QTextCharFormat() format_.setFontWeight(QFont.Bold) regex = QRegExp(pattern) pos = 0 index = regex.indexIn(widget.toPlainText(), pos) while index != -1: # Set cursor at begin of match cursor.setPosition(index, 0) pos = index + regex.matchedLength() # Set cursor at end of match cursor.setPosition(pos, 1) # Select the matched text and apply the desired format cursor.mergeCharFormat(format_) # Move to the next match index = regex.indexIn(widget.toPlainText(), pos)
class XMLHighlighter(QSyntaxHighlighter): def __init__(self, parent=None): super(XMLHighlighter, self).__init__(parent) keyword_format = QTextCharFormat() keyword_format.setForeground(Qt.darkMagenta) keyword_patterns = ["\\b?xml\\b", "/>", ">", "<"] self.highlightingRules = [(QRegExp(pattern), keyword_format) for pattern in keyword_patterns] xml_element_format = QTextCharFormat() xml_element_format.setForeground(QColor("#117700")) self.highlightingRules.append( (QRegExp("\\b[A-Za-z0-9_\-]+(?=[\s/>])"), xml_element_format)) nominatim_area_format = QTextCharFormat() nominatim_area_format.setFontItalic(True) nominatim_area_format.setFontWeight(QFont.Bold) nominatim_area_format.setForeground(QColor("#FF7C00")) self.highlightingRules.append( (QRegExp("\{\{[A-Za-z0-9:, ]*\}\}"), nominatim_area_format)) xml_attribute_format = QTextCharFormat() xml_attribute_format.setFontItalic(True) xml_attribute_format.setForeground(QColor("#2020D2")) self.highlightingRules.append( (QRegExp("\\b[A-Za-z0-9_]+(?=\\=)"), xml_attribute_format)) self.value_format = QTextCharFormat() self.value_format.setForeground(Qt.red) self.value_start_expression = QRegExp("\"") self.value_end_expression = QRegExp("\"(?=[\s></])") single_line_comment_format = QTextCharFormat() single_line_comment_format.setForeground(Qt.gray) self.highlightingRules.append( (QRegExp("<!--[^\n]*-->"), single_line_comment_format)) def highlightBlock(self, text): # for every pattern for pattern, char_format in self.highlightingRules: # Create a regular expression from the retrieved pattern expression = QRegExp(pattern) # Check what index that expression occurs at with the ENTIRE text index = expression.indexIn(text) # While the index is greater than 0 while index >= 0: # Get the length of how long the expression is true, # set the format from the start to the length with # the text format length = expression.matchedLength() self.setFormat(index, length, char_format) # Set index to where the expression ends in the text index = expression.indexIn(text, index + length) self.setCurrentBlockState(0) start_index = 0 if self.previousBlockState() != 1: start_index = self.value_start_expression.indexIn(text) while start_index >= 0: end_index = self.value_end_expression.indexIn(text, start_index) if end_index == -1: self.setCurrentBlockState(1) comment_length = len(text) - start_index else: comment_length = \ end_index - start_index + \ self.value_end_expression.matchedLength() self.setFormat(start_index, comment_length, self.value_format) start_index = self.value_start_expression.indexIn( text, start_index + comment_length)