File: SyntaxHighlighter.h

package info (click to toggle)
camitk 6.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 389,496 kB
  • sloc: cpp: 103,476; sh: 2,448; python: 1,618; xml: 984; makefile: 128; perl: 84; sed: 20
file content (104 lines) | stat: -rw-r--r-- 3,647 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*****************************************************************************
 * $CAMITK_LICENCE_BEGIN$
 *
 * CamiTK - Computer Assisted Medical Intervention ToolKit
 * (c) 2001-2025 Univ. Grenoble Alpes, CNRS, Grenoble INP - UGA, TIMC, 38000 Grenoble, France
 *
 * Visit http://camitk.imag.fr for more information
 *
 * This file is part of CamiTK.
 *
 * CamiTK is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * CamiTK is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with CamiTK.  If not, see <http://www.gnu.org/licenses/>.
 *
 * $CAMITK_LICENCE_END$
 ****************************************************************************/

#ifndef __SYNTAX_HIGHLIGHTER__
#define __SYNTAX_HIGHLIGHTER__

// -- Core stuff
#include "CamiTKAPI.h"

#include <QSyntaxHighlighter>
#include <QRegularExpression>
#include <QTextCharFormat>
#include <QColor>

namespace camitk {
/**
 * @ingroup group_sdk_libraries_core_utils
 *
 * @brief  Base class for syntax highlighting
 *
 * Defines rules for transformation to facilitate new language highlighting.
 *
 * In the inherited class' constructor, just add rules, and that's it!
 * \code {.cpp}
    MyLanguageHighlighter::MyLanguageHighlighter(QTextDocument* parent) : SyntaxHighlighter(parent) {
        // display goto keywords in bold red
        addRule(QRegularExpression("\\bgoto\\b"), QColor("#ff0000"), QFont::Bold);
        ...
    }
 * \endcode
 *
 * You can now highlight any text edit:
 * \code {.cpp}
    QTextEdit* textEdit = new QTextEdit();
    ...
    new MyLanguageHighlighter(textEdit->document());
 * \endcode
 *
 */
class CAMITK_API SyntaxHighlighter : public QSyntaxHighlighter {
    Q_OBJECT

public:
    /// constructor
    /// @param parent (optional) if not given during instantiation, use setDocument(..) afterward
    SyntaxHighlighter(QTextDocument* parent = nullptr) ;

    /// add a new rule (can be done on the fly)
    /// @param regexp to match
    /// @param color text color
    /// @param weight QFont::Normal for normal (default) or QFont::Bold for bold
    /// @param italic false by default
    /// @param backgroundColor transparent by default
    void addRule(QString regexp, QColor color, int weight = QFont::Normal, bool italic = false, QColor backgroundColor = Qt::transparent);

    /// remove an existing rule (can be done on the fly)
    /// @return true if the rule was found and removed
    bool removeRule(QString regexp);

private:
    /// map of regular expression (using a QString to be able to remove it if needed)
    QMap<QString, QRegularExpression> rules;

    /// map of regular expression corresponding text formatting style
    QMap<QString, QTextCharFormat> formatters;

    /// monospace font used for formatting
    QFont monospaceFont;

    /// QSyntaxHighlighter override method called when text is parsed
    /// It will call highlightPattern for all rules
    void highlightBlock(const QString& text) override;

    /// utility function to set the format to a given portion of the text matching the regular expression
    /// (called in highlightBlock for each rule)
    void highlightPattern(const QString& text, const QString& pattern);

};

} // namespace camitk

#endif // #define __SYNTAX_HIGHLIGHTER__