1 /*
2     SPDX-FileCopyrightText: 2016 Volker Krause <vkrause@kde.org>
3 
4     SPDX-License-Identifier: MIT
5 */
6 
7 #ifndef KSYNTAXHIGHLIGHTING_QSYNTAXHIGHLIGHTER_H
8 #define KSYNTAXHIGHLIGHTING_QSYNTAXHIGHLIGHTER_H
9 
10 #include "ksyntaxhighlighting_export.h"
11 
12 #include "abstracthighlighter.h"
13 
14 #include <QSyntaxHighlighter>
15 
16 namespace KSyntaxHighlighting
17 {
18 class SyntaxHighlighterPrivate;
19 
20 /** A QSyntaxHighlighter implementation for use with QTextDocument.
21  *  This supports partial re-highlighting during editing and
22  *  tracks syntax-based code folding regions.
23  *
24  *  @since 5.28
25  */
26 class KSYNTAXHIGHLIGHTING_EXPORT SyntaxHighlighter : public QSyntaxHighlighter, public AbstractHighlighter
27 {
28     Q_OBJECT
29 public:
30     explicit SyntaxHighlighter(QObject *parent = nullptr);
31     explicit SyntaxHighlighter(QTextDocument *document);
32     ~SyntaxHighlighter() override;
33 
34     void setDefinition(const Definition &def) override;
35 
36     /** Returns whether there is a folding region beginning at @p startBlock.
37      *  This only considers syntax-based folding regions,
38      *  not indention-based ones as e.g. found in Python.
39      *
40      *  @see findFoldingRegionEnd
41      */
42     bool startsFoldingRegion(const QTextBlock &startBlock) const;
43 
44     /** Finds the end of the folding region starting at @p startBlock.
45      *  If multiple folding regions begin at @p startBlock, the end of
46      *  the last/innermost one is returned.
47      *  This returns an invalid block if no folding region end is found,
48      *  which typically indicates an unterminated region and thus folding
49      *  until the document end.
50      *  This method performs a sequential search starting at @p startBlock
51      *  for the matching folding region end, which is a potentially expensive
52      *  operation.
53      *
54      *  @see startsFoldingRegion
55      */
56     QTextBlock findFoldingRegionEnd(const QTextBlock &startBlock) const;
57 
58 protected:
59     void highlightBlock(const QString &text) override;
60     void applyFormat(int offset, int length, const Format &format) override;
61     void applyFolding(int offset, int length, FoldingRegion region) override;
62 
63 private:
64     Q_DECLARE_PRIVATE_D(AbstractHighlighter::d_ptr, SyntaxHighlighter)
65 };
66 }
67 
68 #endif // KSYNTAXHIGHLIGHTING_QSYNTAXHIGHLIGHTER_H
69