|
@@ -121,7 +121,8 @@ void HGMarkdownHighlighter::updateBlockUserData(int p_blockNum, const QString &p
|
|
|
|
|
|
|
|
void HGMarkdownHighlighter::highlightBlock(const QString &text)
|
|
void HGMarkdownHighlighter::highlightBlock(const QString &text)
|
|
|
{
|
|
{
|
|
|
- int blockNum = currentBlock().blockNumber();
|
|
|
|
|
|
|
+ QTextBlock curBlock = currentBlock();
|
|
|
|
|
+ int blockNum = curBlock.blockNumber();
|
|
|
if (m_blockHLResultReady && m_blockHighlights.size() > blockNum) {
|
|
if (m_blockHLResultReady && m_blockHighlights.size() > blockNum) {
|
|
|
// units are sorted by start position and length.
|
|
// units are sorted by start position and length.
|
|
|
const QVector<HLUnit> &units = m_blockHighlights[blockNum];
|
|
const QVector<HLUnit> &units = m_blockHighlights[blockNum];
|
|
@@ -161,14 +162,20 @@ void HGMarkdownHighlighter::highlightBlock(const QString &text)
|
|
|
updateBlockUserData(blockNum, text);
|
|
updateBlockUserData(blockNum, text);
|
|
|
|
|
|
|
|
// If it is a block inside HTML comment, just skip it.
|
|
// If it is a block inside HTML comment, just skip it.
|
|
|
- if (isBlockInsideCommentRegion(currentBlock())) {
|
|
|
|
|
|
|
+ if (isBlockInsideCommentRegion(curBlock)) {
|
|
|
setCurrentBlockState(HighlightBlockState::Comment);
|
|
setCurrentBlockState(HighlightBlockState::Comment);
|
|
|
goto exit;
|
|
goto exit;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// PEG Markdown Highlight does not handle the ``` code block correctly.
|
|
// PEG Markdown Highlight does not handle the ``` code block correctly.
|
|
|
setCurrentBlockState(HighlightBlockState::Normal);
|
|
setCurrentBlockState(HighlightBlockState::Normal);
|
|
|
- highlightCodeBlock(text);
|
|
|
|
|
|
|
+ highlightCodeBlock(curBlock, text);
|
|
|
|
|
+
|
|
|
|
|
+ if (currentBlockState() == HighlightBlockState::Normal
|
|
|
|
|
+ && isVerbatimBlock(curBlock)) {
|
|
|
|
|
+ setCurrentBlockState(HighlightBlockState::Verbatim);
|
|
|
|
|
+ goto exit;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// PEG Markdown Highlight does not handle links with spaces in the URL.
|
|
// PEG Markdown Highlight does not handle links with spaces in the URL.
|
|
|
// Links in the URL should be encoded to %20. We just let it be here and won't
|
|
// Links in the URL should be encoded to %20. We just let it be here and won't
|
|
@@ -328,6 +335,31 @@ void HGMarkdownHighlighter::initImageRegionsFromResult()
|
|
|
emit imageLinksUpdated(m_imageRegions);
|
|
emit imageLinksUpdated(m_imageRegions);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void HGMarkdownHighlighter::initVerbatimBlocksFromResult()
|
|
|
|
|
+{
|
|
|
|
|
+ m_verbatimBlocks.clear();
|
|
|
|
|
+ if (!result) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pmh_element *elem = result[pmh_VERBATIM];
|
|
|
|
|
+ while (elem != NULL) {
|
|
|
|
|
+ if (elem->end <= elem->pos) {
|
|
|
|
|
+ elem = elem->next;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // [firstBlock, lastBlock].
|
|
|
|
|
+ int firstBlock = document->findBlock(elem->pos).blockNumber();
|
|
|
|
|
+ int lastBlock = document->findBlock(elem->end - 1).blockNumber();
|
|
|
|
|
+ for (int i = firstBlock; i <= lastBlock; ++i) {
|
|
|
|
|
+ m_verbatimBlocks.insert(i);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ elem = elem->next;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void HGMarkdownHighlighter::initHeaderRegionsFromResult()
|
|
void HGMarkdownHighlighter::initHeaderRegionsFromResult()
|
|
|
{
|
|
{
|
|
|
// From Qt5.7, the capacity is preserved.
|
|
// From Qt5.7, the capacity is preserved.
|
|
@@ -404,7 +436,7 @@ void HGMarkdownHighlighter::initBlockHighlihgtOne(unsigned long pos,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void HGMarkdownHighlighter::highlightCodeBlock(const QString &text)
|
|
|
|
|
|
|
+void HGMarkdownHighlighter::highlightCodeBlock(const QTextBlock &p_block, const QString &text)
|
|
|
{
|
|
{
|
|
|
VTextBlockData *blockData = currentBlockData();
|
|
VTextBlockData *blockData = currentBlockData();
|
|
|
Q_ASSERT(blockData);
|
|
Q_ASSERT(blockData);
|
|
@@ -418,7 +450,7 @@ void HGMarkdownHighlighter::highlightCodeBlock(const QString &text)
|
|
|
&& preState != HighlightBlockState::CodeBlockStart) {
|
|
&& preState != HighlightBlockState::CodeBlockStart) {
|
|
|
// Need to find a new code block start.
|
|
// Need to find a new code block start.
|
|
|
index = codeBlockStartExp.indexIn(text);
|
|
index = codeBlockStartExp.indexIn(text);
|
|
|
- if (index >= 0) {
|
|
|
|
|
|
|
+ if (index >= 0 && !isVerbatimBlock(p_block)) {
|
|
|
// Start a new code block.
|
|
// Start a new code block.
|
|
|
length = text.length();
|
|
length = text.length();
|
|
|
state = HighlightBlockState::CodeBlockStart;
|
|
state = HighlightBlockState::CodeBlockStart;
|
|
@@ -533,6 +565,8 @@ void HGMarkdownHighlighter::parse(bool p_fast)
|
|
|
initImageRegionsFromResult();
|
|
initImageRegionsFromResult();
|
|
|
|
|
|
|
|
initHeaderRegionsFromResult();
|
|
initHeaderRegionsFromResult();
|
|
|
|
|
+
|
|
|
|
|
+ initVerbatimBlocksFromResult();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (result) {
|
|
if (result) {
|
|
@@ -630,6 +664,11 @@ bool HGMarkdownHighlighter::updateCodeBlocks()
|
|
|
// Only handle complete codeblocks.
|
|
// Only handle complete codeblocks.
|
|
|
QTextBlock block = document->firstBlock();
|
|
QTextBlock block = document->firstBlock();
|
|
|
while (block.isValid()) {
|
|
while (block.isValid()) {
|
|
|
|
|
+ if (!inBlock && isVerbatimBlock(block)) {
|
|
|
|
|
+ block = block.next();
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
QString text = block.text();
|
|
QString text = block.text();
|
|
|
if (inBlock) {
|
|
if (inBlock) {
|
|
|
item.m_text = item.m_text + "\n" + text;
|
|
item.m_text = item.m_text + "\n" + text;
|