1/*
2 * Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com)
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#include "HighlighterManager.h"
18#include <QFileInfo>
19#include <QObject>
20#include "qsynedit/highlighter/cpp.h"
21#include "qsynedit/highlighter/asm.h"
22#include "qsynedit/highlighter/glsl.h"
23#include "qsynedit/Constants.h"
24#include "colorscheme.h"
25
26HighlighterManager highlighterManager;
27
28HighlighterManager::HighlighterManager()
29{
30
31}
32
33QSynedit::PHighlighter HighlighterManager::getHighlighter(const QString &filename)
34{
35 QFileInfo info(filename);
36 QString suffix = info.suffix();
37 if (suffix.isEmpty() || suffix == "c" || suffix == "cpp" || suffix == "cxx"
38 || suffix == "cc" || suffix == "h" || suffix == "hpp"
39 || suffix == "hxx" || suffix == "hh" || suffix == "C"
40 || suffix == "CPP" || suffix =="H" || suffix == "c++"
41 || suffix == "h++") {
42 return getCppHighlighter();
43 } else if (suffix == "vs" || suffix == "fs" || suffix == "frag") {
44 return getGLSLHighlighter();
45 }
46 return QSynedit::PHighlighter();
47}
48
49QSynedit::PHighlighter HighlighterManager::copyHighlighter(QSynedit::PHighlighter highlighter)
50{
51 if (!highlighter)
52 return QSynedit::PHighlighter();
53 if (highlighter->getName() == SYN_HIGHLIGHTER_CPP)
54 return getCppHighlighter();
55 else if (highlighter->getName() == SYN_HIGHLIGHTER_ASM)
56 return getAsmHighlighter();
57 else if (highlighter->getName() == SYN_HIGHLIGHTER_GLSL)
58 return getGLSLHighlighter();
59 //todo
60 return QSynedit::PHighlighter();
61}
62
63QSynedit::PHighlighter HighlighterManager::getCppHighlighter()
64{
65 QSynedit::CppHighlighter* highlighter = new QSynedit::CppHighlighter();
66 highlighter->asmAttribute()->setForeground(Qt::blue);
67 highlighter->charAttribute()->setForeground(Qt::black);
68 highlighter->commentAttribute()->setForeground(0x8C8C8C);
69 highlighter->commentAttribute()->setStyles(QSynedit::FontStyle::fsItalic);
70 highlighter->classAttribute()->setForeground(0x008080);
71 highlighter->floatAttribute()->setForeground(Qt::darkMagenta);
72 highlighter->functionAttribute()->setForeground(0x00627A);
73 highlighter->globalVarAttribute()->setForeground(0x660E7A);
74 highlighter->hexAttribute()->setForeground(Qt::darkMagenta);
75 highlighter->identifierAttribute()->setForeground(0x080808);
76 highlighter->invalidAttribute()->setForeground(Qt::red);
77 highlighter->localVarAttribute()->setForeground(Qt::black);
78 highlighter->numberAttribute()->setForeground(0x1750EB);
79 highlighter->octAttribute()->setForeground(Qt::darkMagenta);
80 highlighter->preprocessorAttribute()->setForeground(0x1f542e);
81 highlighter->keywordAttribute()->setForeground(0x0033b3);
82 highlighter->whitespaceAttribute()->setForeground(Qt::lightGray);
83 highlighter->stringAttribute()->setForeground(0x007d17);
84 highlighter->stringEscapeSequenceAttribute()->setForeground(Qt::red);
85 highlighter->symbolAttribute()->setForeground(0xc10000);
86 highlighter->variableAttribute()->setForeground(0x400080);
87 QSynedit::PHighlighter pHighlighter=std::make_shared<QSynedit::CppHighlighter>();
88 return pHighlighter;
89}
90
91QSynedit::PHighlighter HighlighterManager::getAsmHighlighter()
92{
93 QSynedit::ASMHighlighter* highlighter = new QSynedit::ASMHighlighter();
94 QSynedit::PHighlighter pHighlighter(highlighter);
95 highlighter->commentAttribute()->setForeground(0x8C8C8C);
96 highlighter->commentAttribute()->setStyles(QSynedit::FontStyle::fsItalic);
97 highlighter->identifierAttribute()->setForeground(0x080808);
98 highlighter->keywordAttribute()->setForeground(0x0033b3);
99 highlighter->numberAttribute()->setForeground(0x1750EB);
100 highlighter->whitespaceAttribute()->setForeground(Qt::lightGray);
101 highlighter->stringAttribute()->setForeground(0x007d17);
102 highlighter->symbolAttribute()->setForeground(0xc10000);
103 return pHighlighter;
104}
105
106QSynedit::PHighlighter HighlighterManager::getGLSLHighlighter()
107{
108 QSynedit::GLSLHighlighter* highlighter = new QSynedit::GLSLHighlighter();
109 QSynedit::PHighlighter pHighlighter(highlighter);
110 highlighter->asmAttribute()->setForeground(Qt::blue);
111 highlighter->charAttribute()->setForeground(Qt::black);
112 highlighter->commentAttribute()->setForeground(0x8C8C8C);
113 highlighter->commentAttribute()->setStyles(QSynedit::FontStyle::fsItalic);
114 highlighter->classAttribute()->setForeground(0x008080);
115 highlighter->floatAttribute()->setForeground(Qt::darkMagenta);
116 highlighter->functionAttribute()->setForeground(0x00627A);
117 highlighter->globalVarAttribute()->setForeground(0x660E7A);
118 highlighter->hexAttribute()->setForeground(Qt::darkMagenta);
119 highlighter->identifierAttribute()->setForeground(0x080808);
120 highlighter->invalidAttribute()->setForeground(Qt::red);
121 highlighter->localVarAttribute()->setForeground(Qt::black);
122 highlighter->numberAttribute()->setForeground(0x1750EB);
123 highlighter->octAttribute()->setForeground(Qt::darkMagenta);
124 highlighter->preprocessorAttribute()->setForeground(0x1f542e);
125 highlighter->keywordAttribute()->setForeground(0x0033b3);
126 highlighter->whitespaceAttribute()->setForeground(Qt::lightGray);
127 highlighter->stringAttribute()->setForeground(0x007d17);
128 highlighter->stringEscapeSequenceAttribute()->setForeground(Qt::red);
129 highlighter->symbolAttribute()->setForeground(0xc10000);
130 highlighter->variableAttribute()->setForeground(0x400080);
131 return pHighlighter;
132}
133
134void HighlighterManager::applyColorScheme(QSynedit::PHighlighter highlighter, const QString &schemeName)
135{
136 if (!highlighter)
137 return;
138 if ( (highlighter->getName() == SYN_HIGHLIGHTER_CPP)
139 || (highlighter->getName() == SYN_HIGHLIGHTER_ASM)
140 ) {
141 for (QString name: highlighter->attributes().keys()) {
142 PColorSchemeItem item = pColorManager->getItem(schemeName,name);
143 if (item) {
144 QSynedit::PHighlighterAttribute attr = highlighter->attributes()[name];
145 attr->setBackground(item->background());
146 attr->setForeground(item->foreground());
147 QSynedit::FontStyles styles = QSynedit::FontStyle::fsNone;
148 styles.setFlag(QSynedit::FontStyle::fsBold, item->bold());
149 styles.setFlag(QSynedit::FontStyle::fsItalic, item->italic());
150 styles.setFlag(QSynedit::FontStyle::fsUnderline, item->underlined());
151 styles.setFlag(QSynedit::FontStyle::fsStrikeOut, item->strikeout());
152 attr->setStyles(styles);
153 }
154 }
155 }
156}
157