在PySide / PyQt中为降价标题实现语法高亮显示

时间:2015-08-24 09:51:51

标签: qt pyqt qt4 pyside

我正在尝试为PySide中的项目实现markdown的语法高亮显示。 current code涵盖了基本的,带有粗体,斜体的代码块和一些自定义标记。以下是当前代码相关部分的摘录。

现在阻止我的是如何实现标题的突出显示(主题为===加下划线,子标题为---)。 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 个答案:

答案 0 :(得分:1)

如果Public Function ReDimPreserve(aArrayToPreserve, nNewFirstUBound, nNewLastUBound) ReDimPreserve = False 'check if its in array first If IsArray(aArrayToPreserve) Then 'create new array ReDim aPreservedArray(nNewFirstUBound, nNewLastUBound) 'get old lBound/uBound nOldFirstUBound = UBound(aArrayToPreserve, 1) nOldLastUBound = UBound(aArrayToPreserve, 2) 'loop through first For nFirst = LBound(aArrayToPreserve, 1) To nNewFirstUBound For nLast = LBound(aArrayToPreserve, 2) To nNewLastUBound 'if its in range, then append to new array the same way If nOldFirstUBound >= nFirst And nOldLastUBound >= nLast Then aPreservedArray(nFirst, nLast) = aArrayToPreserve(nFirst, nLast) End If Next Next 'return the array redimmed If IsArray(aPreservedArray) Then ReDimPreserve = aPreservedArray End If End Function 为您提供了突出显示的块,则:

self.currentBlock()

应该为您提供以下块的文本。