~ubuntu-branches/ubuntu/hoary/kvirc/hoary

« back to all changes in this revision

Viewing changes to src/kvirc/script/kvi_syntaxhighlighter.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Robin Verduijn
  • Date: 2004-12-14 15:32:19 UTC
  • mfrom: (0.2.1 upstream) (1.1.1 warty)
  • Revision ID: james.westby@ubuntu.com-20041214153219-fdink3gyp2s20b6g
Tags: 2:2.1.3.1-2
* Change Recommends on xmms to a Suggests.
* Rebuild against KDE 3.3.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// =============================================================================
 
2
//
 
3
//      --- kvi_syntaxhighlighter.cpp ---
 
4
//
 
5
//   This file is part of the KVIrc IRC client distribution
 
6
//   Copyright (C) 2003 Robin Verduijn <robin@debian.org>
 
7
//
 
8
//   This program is FREE software. You can redistribute it and/or
 
9
//   modify it under the terms of the GNU General Public License
 
10
//   as published by the Free Software Foundation; either version 2
 
11
//   of the License, or (at your opinion) any later version.
 
12
//
 
13
//   This program is distributed in the HOPE that it will be USEFUL,
 
14
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
16
//   See the GNU General Public License for more details.
 
17
//
 
18
//   You should have received a copy of the GNU General Public License
 
19
//   along with this program. If not, write to the Free Software Foundation,
 
20
//   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
21
//
 
22
// =============================================================================
 
23
 
 
24
#define _KVI_DEBUG_CHECK_RANGE_
 
25
#define _KVI_DEBUG_CLASS_NAME_ "KviSyntaxHighlighter"
 
26
 
 
27
#define _KVI_SCRIPTEDITORWIDGET_CPP_
 
28
 
 
29
#include "kvi_config.h"
 
30
#include "kvi_options.h"
 
31
#include "kvi_syntaxhighlighter.h"
 
32
 
 
33
#define KVI_SYNTAX_STATE_NEWCOMMAND 0
 
34
#define KVI_SYNTAX_STATE_INCOMMAND  1
 
35
#define KVI_SYNTAX_STATE_INSTRING   2
 
36
#define KVI_SYNTAX_STATE_INCOMMENT  3
 
37
 
 
38
KviSyntaxHighlighter::KviSyntaxHighlighter(QTextEdit *textEdit)
 
39
        : QSyntaxHighlighter(textEdit)
 
40
{
 
41
        // Nothing here
 
42
}
 
43
 
 
44
KviSyntaxHighlighter::~KviSyntaxHighlighter()
 
45
{
 
46
        // Nothing here
 
47
}
 
48
 
 
49
int KviSyntaxHighlighter::highlightParagraph(const QString &text, int /* ignored */)
 
50
{
 
51
        const char *pC = text.ascii();
 
52
        QColor *clr = 0;
 
53
 
 
54
        m_textState = KVI_SYNTAX_STATE_NEWCOMMAND;
 
55
        int current = 0;
 
56
        int len     = 0;
 
57
 
 
58
        while( (*pC) && (*pC != '\n') ) {
 
59
                len = extractNextWord(pC);
 
60
                clr = getColor(pC, len);
 
61
                pC += len;
 
62
                if( clr )
 
63
                        setFormat(current, len, *clr);
 
64
                current += len;
 
65
        }
 
66
 
 
67
        return KVI_SYNTAX_STATE_NEWCOMMAND;
 
68
}
 
69
 
 
70
int KviSyntaxHighlighter::extractNextWord(const char *s)
 
71
{
 
72
        int len = 0;
 
73
        // Spaces and tabs
 
74
        if( (*s == ' ') || (*s == '\t') ) {
 
75
                len++;
 
76
                s++;
 
77
                while( ( *s == ' ') || (*s == '\t') ) {
 
78
                        len++;
 
79
                        s++;
 
80
                }
 
81
                return len;
 
82
        }
 
83
 
 
84
        if( (*s == '#') && m_textState == KVI_SYNTAX_STATE_NEWCOMMAND ) {
 
85
                len++;
 
86
                s++;
 
87
                while( (*s) && (*s != ' ') && (*s != '\t') && (*s != ';') && (*s != '\n') ) {
 
88
                        len++;
 
89
                        s++;
 
90
                }
 
91
                return len;
 
92
        }
 
93
 
 
94
        if( m_textState == KVI_SYNTAX_STATE_INCOMMENT ) {
 
95
                while( (*s) && (*s != ' ') && (*s != '\t') && (*s != ';') && (*s != '\n') ) {
 
96
                        len++;
 
97
                        s++;
 
98
                }
 
99
                return len;
 
100
        }
 
101
 
 
102
        if( *s == '\\' ) {
 
103
                // Escape!
 
104
                len++;
 
105
                s++;
 
106
                if( *s && (*s != '\n') && (*s != ' ') && (*s != '\t') )
 
107
                        len++;
 
108
                return len;
 
109
        }
 
110
 
 
111
        if( *s == '"' )
 
112
                return 1;
 
113
 
 
114
        if( isalnum(*s) || (*s == '_') || (*s == '.') ) {
 
115
                // Command or normal text
 
116
                s++;
 
117
                len++;
 
118
                while( *s && (isalnum(*s) || (*s == '_') || (*s == '.')) ) {
 
119
                        s++;
 
120
                        len++;
 
121
                }
 
122
                return len;
 
123
        }
 
124
 
 
125
        if( (*s == '%') || (*s == '$') ) {
 
126
                // Variable or identifier
 
127
                s++;
 
128
                len++;
 
129
                while( *s && (isalnum(*s) || (*s == '_') || (*s == '.') || (*s == ':')) ) {
 
130
                        s++;
 
131
                        len++;
 
132
                }
 
133
                return len;
 
134
        }
 
135
 
 
136
        if( (*s == '{') || (*s == '}') )
 
137
                return 1;
 
138
 
 
139
        if( (*s == '(') || (*s == ')') || (*s == '[') ||
 
140
                (*s == ']') || (*s == ',') || (*s == ':') ||
 
141
                (*s == ';') || (*s == '=') || (*s == '-') ||
 
142
                (*s == '<') || (*s == '>') || (*s == '&') ||
 
143
                (*s == '|') || (*s == '+') || (*s == '*') ||
 
144
                (*s == '/') || (*s == '!') || (*s == '^')
 
145
        ) {
 
146
                len++;
 
147
                s++;
 
148
                while(
 
149
                        (*s == '(') || (*s == ')') || (*s == '[') ||
 
150
                        (*s == ']') || (*s == ',') || (*s == ':') ||
 
151
                        (*s == ';') || (*s == '=') || (*s == '-') ||
 
152
                        (*s == '<') || (*s == '>') || (*s == '&') ||
 
153
                        (*s == '|') || (*s == '+') || (*s == '*') ||
 
154
                        (*s == '/') || (*s == '!') || (*s == '^')
 
155
                ) {
 
156
                        len++;
 
157
                        s++;
 
158
                }
 
159
                return len;
 
160
        }
 
161
 
 
162
        // Senseless string
 
163
        s++;
 
164
        len++;
 
165
        while( (*s) && (isalnum(*s)) ) {
 
166
                len++;
 
167
                s++;
 
168
        }
 
169
        return len;
 
170
}
 
171
 
 
172
QColor *KviSyntaxHighlighter::getColor(const char *s, int len)
 
173
{
 
174
        if( (*s == ' ') || (*s == '\t') )
 
175
                return 0;
 
176
 
 
177
        if( m_textState == KVI_SYNTAX_STATE_NEWCOMMAND ) {
 
178
                if( *s == '#' ) {
 
179
                        m_textState = KVI_SYNTAX_STATE_INCOMMENT;
 
180
                        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_COMMENT];
 
181
                } else {
 
182
                        m_textState = KVI_SYNTAX_STATE_INCOMMAND;
 
183
                        if( isalnum(*s) || (*s == '_') || (*s == '.') )
 
184
                                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_COMMAND];
 
185
                }
 
186
        } else if( m_textState == KVI_SYNTAX_STATE_INCOMMENT ) {
 
187
                if( (*s != ';') && (*s != '\n') )
 
188
                        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_COMMENT];
 
189
        }
 
190
 
 
191
        if( *s == '"' ) {
 
192
                if( m_textState != KVI_SYNTAX_STATE_INSTRING )
 
193
                        m_textState = KVI_SYNTAX_STATE_INSTRING;
 
194
                else
 
195
                        m_textState = KVI_SYNTAX_STATE_INCOMMAND;
 
196
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_STRING];
 
197
        }
 
198
 
 
199
        if( m_textState == KVI_SYNTAX_STATE_INSTRING )
 
200
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_STRING];
 
201
 
 
202
        if( *s == ';' )
 
203
                m_textState = KVI_SYNTAX_STATE_NEWCOMMAND;
 
204
 
 
205
        if( *s == '\\' )
 
206
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_ESCAPE];
 
207
 
 
208
        if( (*s == '{') || (*s == '}') )
 
209
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_BRACE];
 
210
        if( *s == '%' ) {
 
211
                s++;
 
212
                if( (!*s) && (!(isalnum(*s))) && (*s != '_') && (*s != '.') )
 
213
                        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_OPERATOR];
 
214
                if( islower(*s) )
 
215
                        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_LOCVAR]; // Local variable
 
216
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_GLOBVAR];
 
217
        }
 
218
        if( *s == '$' ) {
 
219
                s++;
 
220
                len--;
 
221
                if( len && (*s == 't') || (*s == 'T') ) {
 
222
                        s++;
 
223
                        len--;
 
224
                        if( len && (*s == 'h') || (*s == 'H') ) {
 
225
                                s++;
 
226
                                len--;
 
227
                                if( kvi_strEqualCIN(s, "is", len) )
 
228
                                        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_THIS];
 
229
                        }
 
230
                }
 
231
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_IDENT];
 
232
        }
 
233
 
 
234
        if( (*s == '(') || (*s == ')') || (*s == '[') ||
 
235
                (*s == ']') || (*s == ',') || (*s == ':') ||
 
236
                (*s == ';') || (*s == '=') || (*s == '-') ||
 
237
                (*s == '<') || (*s == '>') || (*s == '&') ||
 
238
                (*s == '|') || (*s == '+') || (*s == '*') ||
 
239
                (*s == '/') || (*s == '!') || (*s == '^')
 
240
        ) {
 
241
                return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_OPERATOR];
 
242
        }
 
243
        return g_pOptions->m_pScriptEditorClr[KVI_SCRIPTEDITOR_CLR_TEXT];
 
244
}