我正在尝试为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 内恢复下一行的文字?从某种意义上说,要进行前瞻。
我虽然要恢复当前正在处理的文档,并找到文档中的当前块,然后找到下一行并对其进行正则表达式检查。但是,如果文档中有一行与标题具有完全相同的措辞,则会中断。另外,系统地对文档中的所有行执行此操作会变得非常慢。提前感谢任何建议。
答案 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()
应该为您提供以下块的文本。