2015-08-24 2 views
2

Я пытаюсь реализовать синтаксический маркер для уценки для моего проекта в PySide. current code охватывает основные, жирные, курсивные, кодовые блоки и некоторые пользовательские теги. Ниже приведена выдержка из соответствующей части текущего кода.Реализация подсветки синтаксиса для заголовков меток в PySide/PyQt

Что блокирует меня прямо сейчас, как реализовать выделение заголовков (подчеркнуто с ===, для основного названия, или --- для подзаголовков). Метод, который используется Qt/PySide для выделения текста, - highlightBlock, который обрабатывает только одну строку за раз.

class MySyntaxHighlighter(QtGui.QSyntaxHighlighter): 
    def highlightBlock(self, text): 
     # do something with this line of text 
     self.setCurrentBlockState(0) 
     startIndex = 0 
     if self.previousBlockState() != 1: 
      startIndex = self.blockStartExpression.indexIn(text) 

     while startIndex >= 0: 
      endIndex = self.blockEndExpression.indexIn(
       text, startIndex) 
      ... 

Существует способ, чтобы восстановить previousBlockState, что полезно, когда блок имеет определенное начало (например, ~~~ синтаксиса в начале кодового-блока). К сожалению, ничто не определяет начало названия, за исключением подчеркивания с === или ---, которые имеют место на следующей строке. Все примеры, которые я нашел, обрабатывают только случаи, когда есть определенный старт выражения, и поэтому previousBlockState дает вам информацию (как в примере выше).

Вопрос: Есть ли способ восстановить текст следующей строки, внутри highlightBlock? Чтобы выполнить прогноз, в некотором смысле.

Я, хотя о восстановлении обрабатываемого документа, и найти текущий блок в документе, затем найти следующую строку и выполнить проверку регулярного выражения. Это, однако, будет нарушено, если в документе есть строка с той же формулировкой, что и название. Кроме того, систематически делать это для всех строк документа. Заранее благодарю за любое предложение.

+1

Просьба не ссылаться на код на внешних сайтах: поместить соответствующий код в вопрос непосредственно. – ekhumoro

+1

Я никогда не использовал 'QSyntaxHighlighter', но казалось бы, что если' self.currentBlock() 'дает вам выделение блока, тогда' self.currentBlock(). Next(). Text() 'должен дать вам текст следующего блока. – ekhumoro

+0

@ekhumoro да, это было! Я чувствую себя глупо, не найдя этого в документации. Я слишком много смотрел на класс 'QSyntaxHighlighter' и не исследовал достаточно. Итак, могу ли я принять комментарий :) Имейте upvote, по крайней мере –

ответ

1

Если self.currentBlock() дает блок быть выделен, то:

self.currentBlock().next().text() 

должно дать вам текст следующего блока.