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__
|