diff --git a/src/peghighlighterresult.cpp b/src/peghighlighterresult.cpp index 74d450e1..af6861fe 100644 --- a/src/peghighlighterresult.cpp +++ b/src/peghighlighterresult.cpp @@ -2,7 +2,6 @@ #include #include -#include #include "pegmarkdownhighlighter.h" #include "utils/vutils.h" @@ -47,6 +46,8 @@ PegHighlighterResult::PegHighlighterResult(const PegMarkdownHighlighter *p_peg, parseFencedCodeBlocks(p_peg, p_result); parseMathjaxBlocks(p_peg, p_result); + + parseHRuleBlocks(p_peg, p_result); } static bool compHLUnit(const HLUnit &p_a, const HLUnit &p_b) @@ -251,7 +252,7 @@ void PegHighlighterResult::parseMathjaxBlocks(const PegMarkdownHighlighter *p_pe const QTextDocument *doc = p_peg->getDocument(); // Inline equations. - const QVector inlineRegs = p_result->m_inlineEquationRegions; + const QVector &inlineRegs = p_result->m_inlineEquationRegions; for (auto it = inlineRegs.begin(); it != inlineRegs.end(); ++it) { const VElementRegion &r = *it; @@ -278,7 +279,7 @@ void PegHighlighterResult::parseMathjaxBlocks(const PegMarkdownHighlighter *p_pe // Display formulas. // One block may be split into several regions due to list indentation. - const QVector formulaRegs = p_result->m_displayFormulaRegions; + const QVector &formulaRegs = p_result->m_displayFormulaRegions; VMathjaxBlock item; bool inBlock = false; QString marker("$$"); @@ -327,3 +328,26 @@ void PegHighlighterResult::parseMathjaxBlocks(const PegMarkdownHighlighter *p_pe } } } + +void PegHighlighterResult::parseHRuleBlocks(const PegMarkdownHighlighter *p_peg, + const QSharedPointer &p_result) +{ + const QTextDocument *doc = p_peg->getDocument(); + const QVector ®s = p_result->m_hruleRegions; + + for (auto it = regs.begin(); it != regs.end(); ++it) { + QTextBlock block = doc->findBlock(it->m_startPos); + int lastBlock = doc->findBlock(it->m_endPos - 1).blockNumber(); + + while (block.isValid()) { + int blockNumber = block.blockNumber(); + if (blockNumber > lastBlock) { + break; + } + + m_hruleBlocks.insert(blockNumber); + + block = block.next(); + } + } +} diff --git a/src/peghighlighterresult.h b/src/peghighlighterresult.h index fef125cc..95cb0c29 100644 --- a/src/peghighlighterresult.h +++ b/src/peghighlighterresult.h @@ -72,6 +72,8 @@ public: // All MathJax blocks. QVector m_mathjaxBlocks; + QSet m_hruleBlocks; + private: // Parse highlight elements for blocks from one parse result. static void parseBlocksHighlightOne(QVector> &p_blocksHighlights, @@ -84,10 +86,14 @@ private: void parseFencedCodeBlocks(const PegMarkdownHighlighter *p_peg, const QSharedPointer &p_result); - // Parse fenced code blocks from parse results. + // Parse mathjax blocks from parse results. void parseMathjaxBlocks(const PegMarkdownHighlighter *p_peg, const QSharedPointer &p_result); + // Parse HRule blocks from parse results. + void parseHRuleBlocks(const PegMarkdownHighlighter *p_peg, + const QSharedPointer &p_result); + void parseBlocksElementRegionOne(QHash> &p_regs, const QTextDocument *p_doc, unsigned long p_pos, diff --git a/src/pegmarkdownhighlighter.cpp b/src/pegmarkdownhighlighter.cpp index 0b60c2b8..0a008487 100644 --- a/src/pegmarkdownhighlighter.cpp +++ b/src/pegmarkdownhighlighter.cpp @@ -468,6 +468,8 @@ void PegMarkdownHighlighter::updateBlockUserState(const QSharedPointerm_hruleBlocks.contains(p_blockNum)) { + state = HighlightBlockState::HRule; } // Set code block state. diff --git a/src/pegparser.cpp b/src/pegparser.cpp index 4c62862a..29ff6e58 100644 --- a/src/pegparser.cpp +++ b/src/pegparser.cpp @@ -23,6 +23,8 @@ void PegParseResult::parse(QAtomicInt &p_stop, bool p_fast) parseInlineEquationRegions(p_stop); parseDisplayFormulaRegions(p_stop); + + parseHRuleRegions(p_stop); } void PegParseResult::parseImageRegions(QAtomicInt &p_stop) @@ -161,6 +163,29 @@ void PegParseResult::parseDisplayFormulaRegions(QAtomicInt &p_stop) std::sort(m_displayFormulaRegions.begin(), m_displayFormulaRegions.end()); } +void PegParseResult::parseHRuleRegions(QAtomicInt &p_stop) +{ + m_hruleRegions.clear(); + if (isEmpty()) { + return; + } + + pmh_element *elem = m_pmhElements[pmh_HRULE]; + while (elem != NULL) { + if (elem->end <= elem->pos) { + elem = elem->next; + continue; + } + + if (p_stop.load() == 1) { + return; + } + + m_hruleRegions.push_back(VElementRegion(m_offset + elem->pos, m_offset + elem->end)); + elem = elem->next; + } +} + PegParserWorker::PegParserWorker(QObject *p_parent) : QThread(p_parent), diff --git a/src/pegparser.h b/src/pegparser.h index e126ad60..18d9fe18 100644 --- a/src/pegparser.h +++ b/src/pegparser.h @@ -111,6 +111,9 @@ struct PegParseResult // Sorted by start position. QVector m_displayFormulaRegions; + // HRule regions. + QVector m_hruleRegions; + private: void parseImageRegions(QAtomicInt &p_stop); @@ -121,6 +124,8 @@ private: void parseInlineEquationRegions(QAtomicInt &p_stop); void parseDisplayFormulaRegions(QAtomicInt &p_stop); + + void parseHRuleRegions(QAtomicInt &p_stop); }; class PegParserWorker : public QThread diff --git a/src/resources/themes/v_detorte/v_detorte.mdhl b/src/resources/themes/v_detorte/v_detorte.mdhl index 12a0e80f..67a17707 100644 --- a/src/resources/themes/v_detorte/v_detorte.mdhl +++ b/src/resources/themes/v_detorte/v_detorte.mdhl @@ -86,7 +86,8 @@ font-style: bold font-size: +2 HRULE -foreground: 9885ba +foreground: dadada +background: 614145 LIST_BULLET foreground: e37c84 diff --git a/src/resources/themes/v_moonlight/v_moonlight.mdhl b/src/resources/themes/v_moonlight/v_moonlight.mdhl index 5ce3408b..0d9c1e39 100644 --- a/src/resources/themes/v_moonlight/v_moonlight.mdhl +++ b/src/resources/themes/v_moonlight/v_moonlight.mdhl @@ -86,7 +86,8 @@ font-style: bold font-size: +2 HRULE -foreground: 8b90f3 +foreground: abb2bf +background: 493134 LIST_BULLET foreground: e06c75 diff --git a/src/resources/themes/v_native/v_native.mdhl b/src/resources/themes/v_native/v_native.mdhl index 2746930e..266d75f2 100644 --- a/src/resources/themes/v_native/v_native.mdhl +++ b/src/resources/themes/v_native/v_native.mdhl @@ -83,7 +83,8 @@ font-style: bold font-size: +2 HRULE -foreground: 586e75 +foreground: 363636 +background: dac7c9 LIST_BULLET foreground: d33682 diff --git a/src/resources/themes/v_pure/v_pure.mdhl b/src/resources/themes/v_pure/v_pure.mdhl index d6f0f13b..0904d261 100644 --- a/src/resources/themes/v_pure/v_pure.mdhl +++ b/src/resources/themes/v_pure/v_pure.mdhl @@ -84,7 +84,8 @@ font-style: bold font-size: +2 HRULE -foreground: 586e75 +foreground: 222222 +background: dac7c9 LIST_BULLET foreground: d33682 diff --git a/src/vconstants.h b/src/vconstants.h index 54c02f23..ed564cf5 100644 --- a/src/vconstants.h +++ b/src/vconstants.h @@ -119,7 +119,9 @@ enum HighlightBlockState // A fenced code block. CodeBlockStart, CodeBlock, - CodeBlockEnd + CodeBlockEnd, + + HRule }; // Pages to open on start up. diff --git a/src/vtextdocumentlayout.cpp b/src/vtextdocumentlayout.cpp index 41496000..182c9aec 100644 --- a/src/vtextdocumentlayout.cpp +++ b/src/vtextdocumentlayout.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include "vimageresourcemanager2.h" #include "vtextedit.h" @@ -236,6 +235,18 @@ void VTextDocumentLayout::draw(QPainter *p_painter, const PaintContext &p_contex bg); } + // Draw block background for HRULE. + if (block.userState() == HighlightBlockState::HRule) { + QVector fmts = layout->formats(); + if (fmts.size() == 1) { + int x = offset.x(); + int y = offset.y(); + fillBackground(p_painter, + rect.adjusted(x, y, x, y), + fmts[0].format.background()); + } + } + auto selections = formatRangeFromSelection(block, p_context.selections); // Draw the cursor.