23 #include "htmlhighlighter.h"
25 namespace KPIMTextEdit {
27 class HtmlHighlighterPrivate
52 HtmlHighlighterPrivate()
54 colors[DocType] = QColor(192, 192, 192);
55 colors[Entity] = QColor(128, 128, 128);
56 colors[Tag] = QColor(136, 18, 128);
57 colors[Comment] = QColor( 35, 110, 37);
58 colors[AttributeName] = QColor(153, 69, 0);
59 colors[AttributeValue] = QColor( 36, 36, 170);
61 QHash<int, QColor> colors;
65 HtmlHighlighter::HtmlHighlighter(QTextDocument *document)
66 : QSyntaxHighlighter(document),d(new HtmlHighlighterPrivate)
70 HtmlHighlighter::~HtmlHighlighter()
75 void HtmlHighlighter::highlightBlock(
const QString &text)
77 int state = previousBlockState();
78 int len = text.length();
84 case HtmlHighlighterPrivate::State_Text:
87 QChar ch = text.at(pos);
88 if (ch == QLatin1Char(
'<')) {
89 if (text.mid(pos, 4) == QLatin1String(
"<!--")) {
90 state = HtmlHighlighterPrivate::State_Comment;
92 if (text.mid(pos, 9).toUpper() == QLatin1String(
"<!DOCTYPE"))
93 state = HtmlHighlighterPrivate::State_DocType;
95 state = HtmlHighlighterPrivate::State_TagStart;
98 }
else if (ch == QLatin1Char(
'&')) {
100 while (pos < len && text.at(pos++) != QLatin1Char(
';'))
102 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::Entity]);
110 case HtmlHighlighterPrivate::State_Comment:
113 if (text.mid(pos, 3) == QLatin1String(
"-->")) {
115 state = HtmlHighlighterPrivate::State_Text;
121 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::Comment]);
124 case HtmlHighlighterPrivate::State_DocType:
127 QChar ch = text.at(pos);
129 if (ch == QLatin1Char(
'>')) {
130 state = HtmlHighlighterPrivate::State_Text;
134 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::DocType]);
138 case HtmlHighlighterPrivate::State_TagStart:
141 QChar ch = text.at(pos);
143 if (ch == QLatin1Char(
'>')) {
144 state = HtmlHighlighterPrivate::State_Text;
149 state = HtmlHighlighterPrivate::State_TagName;
156 case HtmlHighlighterPrivate::State_TagName:
159 QChar ch = text.at(pos);
163 state = HtmlHighlighterPrivate::State_InsideTag;
166 if (ch == QLatin1Char(
'>')) {
167 state = HtmlHighlighterPrivate::State_Text;
171 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::Tag]);
175 case HtmlHighlighterPrivate::State_InsideTag:
179 QChar ch = text.at(pos);
182 if (ch == QLatin1Char(
'/'))
185 if (ch == QLatin1Char(
'>')) {
186 state = HtmlHighlighterPrivate::State_Text;
192 state = HtmlHighlighterPrivate::State_AttributeName;
201 case HtmlHighlighterPrivate::State_AttributeName:
205 QChar ch = text.at(pos);
208 if (ch == QLatin1Char(
'=')) {
209 state = HtmlHighlighterPrivate::State_AttributeValue;
213 if (ch == QLatin1Char(
'>') || ch == QLatin1Char(
'/')) {
214 state = HtmlHighlighterPrivate::State_InsideTag;
219 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::AttributeName]);
223 case HtmlHighlighterPrivate::State_AttributeValue:
228 QChar ch = text.at(pos);
232 if (ch == QLatin1Char(
'\'')) {
233 state = HtmlHighlighterPrivate::State_SingleQuote;
238 if (ch == QLatin1Char(
'"')) {
239 state = HtmlHighlighterPrivate::State_DoubleQuote;
247 if (state == HtmlHighlighterPrivate::State_AttributeValue) {
252 QChar ch = text.at(pos);
255 if (ch == QLatin1Char(
'>') || ch == QLatin1Char(
'/'))
259 state = HtmlHighlighterPrivate::State_InsideTag;
260 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::AttributeValue]);
266 case HtmlHighlighterPrivate::State_SingleQuote:
270 QChar ch = text.at(pos);
272 if (ch == QLatin1Char(
'\''))
276 state = HtmlHighlighterPrivate::State_InsideTag;
278 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::AttributeValue]);
282 case HtmlHighlighterPrivate::State_DoubleQuote:
286 QChar ch = text.at(pos);
288 if (ch == QLatin1Char(
'"'))
292 state = HtmlHighlighterPrivate::State_InsideTag;
294 setFormat(start, pos - start, d->colors[HtmlHighlighterPrivate::AttributeValue]);
300 setCurrentBlockState(state);
304 #include "moc_htmlhighlighter.cpp"