]> git.saurik.com Git - wxWidgets.git/blob - contrib/src/stc/scintilla/src/LexHTML.cxx
This commit includes the following changes:
[wxWidgets.git] / contrib / src / stc / scintilla / src / LexHTML.cxx
1 // SciTE - Scintilla based Text Editor
2 // LexHTML.cxx - lexer for HTML
3 // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
4 // The License.txt file describes the conditions under which this software may be distributed.
5
6 #include <stdlib.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <stdio.h>
10 #include <stdarg.h>
11
12 #include "Platform.h"
13
14 #include "PropSet.h"
15 #include "Accessor.h"
16 #include "KeyWords.h"
17 #include "Scintilla.h"
18 #include "SciLexer.h"
19
20 enum { eScriptNone, eScriptJS, eScriptVBS, eScriptPython };
21 static int segIsScriptingIndicator(StylingContext &styler, unsigned int start, unsigned int end, int prevValue) {
22 char s[100];
23 s[0] = '\0';
24 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
25 s[i] = tolower(styler[start + i]);
26 s[i + 1] = '\0';
27 }
28 //Platform::DebugPrintf("Scripting indicator [%s]\n", s);
29 if (strstr(s, "vbs"))
30 return eScriptVBS;
31 if (strstr(s, "pyth"))
32 return eScriptPython;
33 if (strstr(s, "javas"))
34 return eScriptJS;
35 if (strstr(s, "jscr"))
36 return eScriptJS;
37
38 return prevValue;
39 }
40
41 static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) {
42 bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') ||
43 (styler[start] == '-') || (styler[start] == '#');
44 char chAttr = SCE_H_ATTRIBUTEUNKNOWN;
45 if (wordIsNumber) {
46 chAttr = SCE_H_NUMBER;
47 } else {
48 char s[100];
49 s[0] = '\0';
50 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
51 s[i] = tolower(styler[start + i]);
52 s[i + 1] = '\0';
53 }
54 if (keywords.InList(s))
55 chAttr = SCE_H_ATTRIBUTE;
56 }
57 styler.ColourTo(end, chAttr);
58 }
59
60 static int classifyTagHTML(unsigned int start, unsigned int end,
61 WordList &keywords, StylingContext &styler) {
62 char s[100];
63 // Copy after the '<'
64 unsigned int i = 0;
65 for (unsigned int cPos=start; cPos <= end && i < 30; cPos++) {
66 char ch = styler[cPos];
67 if (ch != '<')
68 s[i++] = tolower(ch);
69 }
70 s[i] = '\0';
71 char chAttr = SCE_H_TAGUNKNOWN;
72 if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment
73 chAttr = SCE_H_COMMENT;
74 } else if (s[0] == '/') { // Closing tag
75 if (keywords.InList(s + 1))
76 chAttr = SCE_H_TAG;
77 } else {
78 if (keywords.InList(s)) {
79 chAttr = SCE_H_TAG;
80 if (0 == strcmp(s, "script"))
81 chAttr = SCE_H_SCRIPT;
82 }
83 }
84 styler.ColourTo(end, chAttr);
85 return chAttr;
86 }
87
88 static void classifyWordHTJS(unsigned int start, unsigned int end,
89 WordList &keywords, StylingContext &styler) {
90 char s[100];
91 bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
92 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
93 s[i] = styler[start + i];
94 s[i + 1] = '\0';
95 }
96 char chAttr = SCE_HJ_WORD;
97 if (wordIsNumber)
98 chAttr = SCE_HJ_NUMBER;
99 else {
100 if (keywords.InList(s))
101 chAttr = SCE_HJ_KEYWORD;
102 }
103 styler.ColourTo(end, chAttr);
104 }
105
106 static void classifyWordHTJSA(unsigned int start, unsigned int end,
107 WordList &keywords, StylingContext &styler) {
108 char s[100];
109 bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
110 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
111 s[i] = styler[start + i];
112 s[i + 1] = '\0';
113 }
114 char chAttr = SCE_HJA_WORD;
115 if (wordIsNumber)
116 chAttr = SCE_HJA_NUMBER;
117 else {
118 if (keywords.InList(s))
119 chAttr = SCE_HJA_KEYWORD;
120 }
121 styler.ColourTo(end, chAttr);
122 }
123
124 static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) {
125 char s[100];
126 bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
127 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
128 s[i] = tolower(styler[start + i]);
129 s[i + 1] = '\0';
130 }
131 char chAttr = SCE_HB_IDENTIFIER;
132 if (wordIsNumber)
133 chAttr = SCE_HB_NUMBER;
134 else {
135 if (keywords.InList(s)) {
136 chAttr = SCE_HB_WORD;
137 if (strcmp(s, "rem") == 0)
138 chAttr = SCE_HB_COMMENTLINE;
139 }
140 }
141 styler.ColourTo(end, chAttr);
142 if (chAttr == SCE_HB_COMMENTLINE)
143 return SCE_HB_COMMENTLINE;
144 else
145 return SCE_HB_DEFAULT;
146 }
147
148 static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) {
149 char s[100];
150 bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
151 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
152 s[i] = tolower(styler[start + i]);
153 s[i + 1] = '\0';
154 }
155 char chAttr = SCE_HBA_IDENTIFIER;
156 if (wordIsNumber)
157 chAttr = SCE_HBA_NUMBER;
158 else {
159 if (keywords.InList(s)) {
160 chAttr = SCE_HBA_WORD;
161 if (strcmp(s, "rem") == 0)
162 chAttr = SCE_HBA_COMMENTLINE;
163 }
164 }
165 styler.ColourTo(end, chAttr);
166 if (chAttr == SCE_HBA_COMMENTLINE)
167 return SCE_HBA_COMMENTLINE;
168 else
169 return SCE_HBA_DEFAULT;
170 }
171
172 static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) {
173 char s[100];
174 bool wordIsNumber = isdigit(styler[start]);
175 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
176 s[i] = styler[start + i];
177 s[i + 1] = '\0';
178 }
179 char chAttr = SCE_HP_IDENTIFIER;
180 if (0 == strcmp(prevWord, "class"))
181 chAttr = SCE_HP_CLASSNAME;
182 else if (0 == strcmp(prevWord, "def"))
183 chAttr = SCE_HP_DEFNAME;
184 else if (wordIsNumber)
185 chAttr = SCE_HP_NUMBER;
186 else if (keywords.InList(s))
187 chAttr = SCE_HP_WORD;
188 styler.ColourTo(end, chAttr);
189 strcpy(prevWord, s);
190 }
191
192 static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) {
193 char s[100];
194 bool wordIsNumber = isdigit(styler[start]);
195 for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
196 s[i] = styler[start + i];
197 s[i + 1] = '\0';
198 }
199 char chAttr = SCE_HPA_IDENTIFIER;
200 if (0 == strcmp(prevWord, "class"))
201 chAttr = SCE_HPA_CLASSNAME;
202 else if (0 == strcmp(prevWord, "def"))
203 chAttr = SCE_HPA_DEFNAME;
204 else if (wordIsNumber)
205 chAttr = SCE_HPA_NUMBER;
206 else if (keywords.InList(s))
207 chAttr = SCE_HPA_WORD;
208 styler.ColourTo(end, chAttr);
209 strcpy(prevWord, s);
210 }
211
212 inline bool ishtmlwordchar(char ch) {
213 return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#';
214 }
215
216 static bool InTagState(int state) {
217 return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN ||
218 state == SCE_H_SCRIPT ||
219 state == SCE_H_ATTRIBUTE || state == SCE_H_ATTRIBUTEUNKNOWN ||
220 state == SCE_H_NUMBER || state == SCE_H_OTHER ||
221 state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING;
222 }
223
224 static bool isLineEnd(char ch) {
225 return ch == '\r' || ch == '\n';
226 }
227
228 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
229 StylingContext &styler) {
230
231 WordList &keywords=*keywordlists[0];
232 WordList &keywords2=*keywordlists[1];
233 WordList &keywords3=*keywordlists[2];
234 WordList &keywords4=*keywordlists[3];
235
236 // Lexer for HTML requires more lexical states (7 bits worth) than most lexers
237 styler.StartAt(startPos, 127);
238 bool lastTagWasScript = false;
239 char prevWord[200];
240 prevWord[0] = '\0';
241 int scriptLanguage = eScriptJS;
242 int state = initStyle;
243 // If inside a tag, it may be a script tage, so reread from the start to ensure any language tas are seen
244 if (InTagState(state)) {
245 while ((startPos > 1) && (InTagState(styler.StyleAt(startPos - 1)))) {
246 startPos--;
247 }
248 state = SCE_H_DEFAULT;
249 }
250 styler.StartAt(startPos, 127);
251
252 int lineState = eScriptVBS;
253 int lineCurrent = styler.GetLine(startPos);
254 if (lineCurrent > 0)
255 lineState = styler.GetLineState(lineCurrent);
256 int defaultScript = lineState &0xff;
257 int beforeASP = (lineState >> 8) &0xff;
258 int inASP = (lineState >> 16) &0xff;
259
260 char chPrev = ' ';
261 char chPrev2 = ' ';
262 styler.StartSegment(startPos);
263 int lengthDoc = startPos + length;
264 for (int i = startPos; i <= lengthDoc; i++) {
265 char ch = styler[i];
266 char chNext = styler.SafeGetCharAt(i + 1);
267 char chNext2 = styler.SafeGetCharAt(i + 2);
268
269 if (styler.IsLeadByte(ch)) {
270 chPrev2 = ' ';
271 chPrev = ' ';
272 i += 1;
273 continue;
274 }
275
276 if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
277 // New line -> record any line state onto /next/ line
278 lineCurrent++;
279 styler.SetLineState(lineCurrent,
280 defaultScript | (beforeASP << 8) | (inASP << 16));
281 }
282
283 // Handle ASP even within other constructs as it is a preprocessor
284 if ((ch == '<') && (chNext == '%')) {
285 beforeASP = state;
286 styler.ColourTo(i - 1, state);
287 if (chNext2 == '@') {
288 styler.ColourTo(i + 2, SCE_H_ASP);
289 state = SCE_H_ASPAT;
290 i+=2;
291 } else {
292 if (defaultScript == eScriptVBS)
293 state = SCE_HBA_START;
294 else if (defaultScript == eScriptPython)
295 state = SCE_HPA_START;
296 else
297 state = SCE_HJA_START;
298 if (chNext2 == '=') {
299 styler.ColourTo(i + 2, SCE_H_ASP);
300 i+=2;
301 } else {
302 styler.ColourTo(i + 1, SCE_H_ASP);
303 i++;
304 }
305 }
306 inASP = 1;
307 continue;
308 }
309 if (inASP && (ch == '%') && (chNext == '>')) {
310 if (state == SCE_H_ASPAT)
311 defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, defaultScript);
312 // Bounce out of any ASP mode
313 if (state == SCE_HJA_WORD) {
314 classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler);
315 } else if (state == SCE_HBA_WORD) {
316 classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler);
317 } else if (state == SCE_HPA_WORD) {
318 classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord);
319 } else {
320 styler.ColourTo(i - 1, state);
321 }
322 //if (state == SCE_H_ASPAT)
323 // styler.ColourTo(i+1, SCE_H_ASPAT);
324 //else
325 styler.ColourTo(i+1, SCE_H_ASP);
326 i++;
327 state = beforeASP;
328 beforeASP = SCE_H_DEFAULT;
329 inASP = 0;
330 continue;
331 }
332
333 if (state == SCE_H_DEFAULT) {
334 if (ch == '<') {
335 styler.ColourTo(i - 1, state);
336 state = SCE_H_TAGUNKNOWN;
337 if (chNext == '?') {
338 styler.ColourTo(i + 1, SCE_H_XMLSTART);
339 i++;
340 ch = chNext;
341 }
342 } else if (ch == '&') {
343 styler.ColourTo(i - 1, SCE_H_DEFAULT);
344 state = SCE_H_ENTITY;
345 }
346 } else if (state == SCE_H_COMMENT) {
347 if ((ch == '>') && (chPrev == '-')) {
348 styler.ColourTo(i, state);
349 state = SCE_H_DEFAULT;
350 }
351 } else if (state == SCE_H_ENTITY) {
352 if (ch == ';') {
353 styler.ColourTo(i, state);
354 state = SCE_H_DEFAULT;
355 }
356 } else if (state == SCE_H_TAGUNKNOWN) {
357 if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
358 int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);
359 lastTagWasScript = eClass == SCE_H_SCRIPT;
360 if (lastTagWasScript) {
361 scriptLanguage = eScriptJS;
362 eClass = SCE_H_TAG;
363 }
364 if (ch == '>') {
365 styler.ColourTo(i, SCE_H_TAG);
366 if (lastTagWasScript) {
367 if (scriptLanguage == eScriptVBS)
368 state = SCE_HB_START;
369 else if (scriptLanguage == eScriptPython)
370 state = SCE_HP_START;
371 else
372 state = SCE_HJ_START;
373 } else {
374 state = SCE_H_DEFAULT;
375 }
376 } else {
377 if (eClass == SCE_H_COMMENT) {
378 state = SCE_H_COMMENT;
379 } else {
380 state = SCE_H_OTHER;
381 }
382 }
383 }
384 } else if (state == SCE_H_ATTRIBUTE) {
385 if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
386 if (lastTagWasScript)
387 scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, scriptLanguage);
388 classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler);
389 if (ch == '>') {
390 styler.ColourTo(i, SCE_H_TAG);
391 if (lastTagWasScript) {
392 if (scriptLanguage == eScriptVBS)
393 state = SCE_HB_START;
394 else if (scriptLanguage == eScriptPython)
395 state = SCE_HP_START;
396 else
397 state = SCE_HJ_START;
398 } else {
399 state = SCE_H_DEFAULT;
400 }
401 } else {
402 state = SCE_H_OTHER;
403 }
404 }
405 } else if (state == SCE_H_ASP) {
406 if ((ch == '>') && (chPrev == '%')) {
407 styler.ColourTo(i, state);
408 state = SCE_H_DEFAULT;
409 }
410 } else if (state == SCE_H_ASPAT) {
411 if ((ch == '>') && (chPrev == '%')) {
412 styler.ColourTo(i, state);
413 state = SCE_H_DEFAULT;
414 }
415 } else if (state == SCE_H_OTHER) {
416 if (ch == '>') {
417 styler.ColourTo(i - 1, state);
418 styler.ColourTo(i, SCE_H_TAG);
419 if (lastTagWasScript) {
420 if (scriptLanguage == eScriptVBS)
421 state = SCE_HB_START;
422 else if (scriptLanguage == eScriptPython)
423 state = SCE_HP_START;
424 else
425 state = SCE_HJ_START;
426 } else {
427 state = SCE_H_DEFAULT;
428 }
429 } else if (ch == '\"') {
430 styler.ColourTo(i - 1, state);
431 state = SCE_H_DOUBLESTRING;
432 } else if (ch == '\'') {
433 styler.ColourTo(i - 1, state);
434 state = SCE_H_SINGLESTRING;
435 } else if (ch == '/' && chNext == '>') {
436 styler.ColourTo(i - 1, state);
437 styler.ColourTo(i + 1, SCE_H_TAGEND);
438 i++;
439 ch = chNext;
440 state = SCE_H_DEFAULT;
441 } else if (ch == '?' && chNext == '>') {
442 styler.ColourTo(i - 1, state);
443 styler.ColourTo(i + 1, SCE_H_XMLEND);
444 i++;
445 ch = chNext;
446 state = SCE_H_DEFAULT;
447 } else if (ishtmlwordchar(ch)) {
448 styler.ColourTo(i - 1, state);
449 state = SCE_H_ATTRIBUTE;
450 }
451 } else if (state == SCE_H_DOUBLESTRING) {
452 if (ch == '\"') {
453 if (lastTagWasScript)
454 scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);
455 styler.ColourTo(i, SCE_H_DOUBLESTRING);
456 state = SCE_H_OTHER;
457 }
458 } else if (state == SCE_H_SINGLESTRING) {
459 if (ch == '\'') {
460 if (lastTagWasScript)
461 scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);
462 styler.ColourTo(i, SCE_H_SINGLESTRING);
463 state = SCE_H_OTHER;
464 }
465 } else if (state == SCE_HJ_DEFAULT || state == SCE_HJ_START) {
466 if (iswordstart(ch)) {
467 styler.ColourTo(i - 1, state);
468 state = SCE_HJ_WORD;
469 } else if (ch == '/' && chNext == '*') {
470 styler.ColourTo(i - 1, state);
471 if (chNext2 == '*')
472 state = SCE_HJ_COMMENTDOC;
473 else
474 state = SCE_HJ_COMMENT;
475 } else if (ch == '/' && chNext == '/') {
476 styler.ColourTo(i - 1, state);
477 state = SCE_HJ_COMMENTLINE;
478 } else if (ch == '\"') {
479 styler.ColourTo(i - 1, state);
480 state = SCE_HJ_DOUBLESTRING;
481 } else if (ch == '\'') {
482 styler.ColourTo(i - 1, state);
483 state = SCE_HJ_SINGLESTRING;
484 } else if ((ch == '<') && (chNext == '/')) {
485 styler.ColourTo(i - 1, state);
486 state = SCE_H_TAGUNKNOWN;
487 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
488 styler.SafeGetCharAt(i + 3) == '-') {
489 styler.ColourTo(i - 1, state);
490 state = SCE_HJ_COMMENTLINE;
491 } else if (isoperator(ch)) {
492 styler.ColourTo(i - 1, state);
493 styler.ColourTo(i, SCE_HJ_SYMBOLS);
494 state = SCE_HJ_DEFAULT;
495 } else if ((ch == ' ') || (ch == '\t')) {
496 if (state == SCE_HJ_START) {
497 styler.ColourTo(i - 1, state);
498 state = SCE_HJ_DEFAULT;
499 }
500 }
501 } else if (state == SCE_HJ_WORD) {
502 if (!iswordchar(ch)) {
503 classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler);
504 //styler.ColourTo(i - 1, eHTJSKeyword);
505 state = SCE_HJ_DEFAULT;
506 if (ch == '/' && chNext == '*') {
507 if (chNext2 == '*')
508 state = SCE_HJ_COMMENTDOC;
509 else
510 state = SCE_HJ_COMMENT;
511 } else if (ch == '/' && chNext == '/') {
512 state = SCE_HJ_COMMENTLINE;
513 } else if (ch == '\"') {
514 state = SCE_HJ_DOUBLESTRING;
515 } else if (ch == '\'') {
516 state = SCE_HJ_SINGLESTRING;
517 } else if (isoperator(ch)) {
518 styler.ColourTo(i, SCE_HJ_SYMBOLS);
519 state = SCE_HJ_DEFAULT;
520 }
521 }
522 } else if (state == SCE_HJ_COMMENT) {
523 if (ch == '/' && chPrev == '*') {
524 state = SCE_HJ_DEFAULT;
525 styler.ColourTo(i, SCE_HJ_COMMENT);
526 } else if ((ch == '<') && (chNext == '/')) {
527 styler.ColourTo(i - 1, state);
528 styler.ColourTo(i + 1, SCE_H_TAGEND);
529 i++;
530 ch = chNext;
531 state = SCE_H_DEFAULT;
532 }
533 } else if (state == SCE_HJ_COMMENTDOC) {
534 if (ch == '/' && chPrev == '*') {
535 state = SCE_HJ_DEFAULT;
536 styler.ColourTo(i, SCE_HJ_COMMENTDOC);
537 } else if ((ch == '<') && (chNext == '/')) {
538 styler.ColourTo(i - 1, state);
539 styler.ColourTo(i + 1, SCE_H_TAGEND);
540 i++;
541 ch = chNext;
542 state = SCE_H_DEFAULT;
543 }
544 } else if (state == SCE_HJ_COMMENTLINE) {
545 if (ch == '\r' || ch == '\n') {
546 styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE);
547 state = SCE_HJ_DEFAULT;
548 } else if ((ch == '<') && (chNext == '/')) {
549 // Common to hide end script tag in comment
550 styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE);
551 state = SCE_H_TAGUNKNOWN;
552 }
553 } else if (state == SCE_HJ_DOUBLESTRING) {
554 if (ch == '\\') {
555 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
556 i++;
557 }
558 } else if (ch == '\"') {
559 styler.ColourTo(i, SCE_HJ_DOUBLESTRING);
560 state = SCE_HJ_DEFAULT;
561 i++;
562 ch = chNext;
563 } else if (isLineEnd(ch)) {
564 styler.ColourTo(i-1, state);
565 state = SCE_HJ_STRINGEOL;
566 }
567 } else if (state == SCE_HJ_SINGLESTRING) {
568 if (ch == '\\') {
569 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
570 i++;
571 }
572 } else if (ch == '\'') {
573 styler.ColourTo(i, SCE_HJ_SINGLESTRING);
574 state = SCE_HJ_DEFAULT;
575 i++;
576 ch = chNext;
577 } else if (isLineEnd(ch)) {
578 styler.ColourTo(i-1, state);
579 state = SCE_HJ_STRINGEOL;
580 }
581 } else if (state == SCE_HJ_STRINGEOL) {
582 if (!isLineEnd(ch)) {
583 styler.ColourTo(i - 1, state);
584 state = SCE_HJ_DEFAULT;
585 } else if (!isLineEnd(chNext)) {
586 styler.ColourTo(i, state);
587 state = SCE_HJ_DEFAULT;
588 }
589 } else if (state == SCE_HJA_DEFAULT || state == SCE_HJA_START) {
590 if (iswordstart(ch)) {
591 styler.ColourTo(i - 1, state);
592 state = SCE_HJA_WORD;
593 } else if (ch == '/' && chNext == '*') {
594 styler.ColourTo(i - 1, state);
595 if (chNext2 == '*')
596 state = SCE_HJA_COMMENTDOC;
597 else
598 state = SCE_HJA_COMMENT;
599 } else if (ch == '/' && chNext == '/') {
600 styler.ColourTo(i - 1, state);
601 state = SCE_HJA_COMMENTLINE;
602 } else if (ch == '\"') {
603 styler.ColourTo(i - 1, state);
604 state = SCE_HJA_DOUBLESTRING;
605 } else if (ch == '\'') {
606 styler.ColourTo(i - 1, state);
607 state = SCE_HJA_SINGLESTRING;
608 } else if ((ch == '<') && (chNext == '/')) {
609 styler.ColourTo(i - 1, state);
610 state = SCE_H_TAGUNKNOWN;
611 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
612 styler.SafeGetCharAt(i + 3) == '-') {
613 styler.ColourTo(i - 1, state);
614 state = SCE_HJA_COMMENTLINE;
615 } else if (isoperator(ch)) {
616 styler.ColourTo(i - 1, state);
617 styler.ColourTo(i, SCE_HJA_SYMBOLS);
618 state = SCE_HJA_DEFAULT;
619 } else if ((ch == ' ') || (ch == '\t')) {
620 if (state == SCE_HJA_START) {
621 styler.ColourTo(i - 1, state);
622 state = SCE_HJA_DEFAULT;
623 }
624 }
625 } else if (state == SCE_HJA_WORD) {
626 if (!iswordchar(ch)) {
627 classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler);
628 //styler.ColourTo(i - 1, eHTJSKeyword);
629 state = SCE_HJA_DEFAULT;
630 if (ch == '/' && chNext == '*') {
631 if (chNext2 == '*')
632 state = SCE_HJA_COMMENTDOC;
633 else
634 state = SCE_HJA_COMMENT;
635 } else if (ch == '/' && chNext == '/') {
636 state = SCE_HJA_COMMENTLINE;
637 } else if (ch == '\"') {
638 state = SCE_HJA_DOUBLESTRING;
639 } else if (ch == '\'') {
640 state = SCE_HJA_SINGLESTRING;
641 } else if (isoperator(ch)) {
642 styler.ColourTo(i, SCE_HJA_SYMBOLS);
643 state = SCE_HJA_DEFAULT;
644 }
645 }
646 } else if (state == SCE_HJA_COMMENT) {
647 if (ch == '/' && chPrev == '*') {
648 state = SCE_HJA_DEFAULT;
649 styler.ColourTo(i, SCE_HJA_COMMENT);
650 } else if ((ch == '<') && (chNext == '/')) {
651 styler.ColourTo(i - 1, state);
652 styler.ColourTo(i + 1, SCE_H_TAGEND);
653 i++;
654 ch = chNext;
655 state = SCE_H_DEFAULT;
656 }
657 } else if (state == SCE_HJA_COMMENTDOC) {
658 if (ch == '/' && chPrev == '*') {
659 state = SCE_HJA_DEFAULT;
660 styler.ColourTo(i, SCE_HJA_COMMENTDOC);
661 } else if ((ch == '<') && (chNext == '/')) {
662 styler.ColourTo(i - 1, state);
663 styler.ColourTo(i + 1, SCE_H_TAGEND);
664 i++;
665 ch = chNext;
666 state = SCE_H_DEFAULT;
667 }
668 } else if (state == SCE_HJA_COMMENTLINE) {
669 if (ch == '\r' || ch == '\n') {
670 styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE);
671 state = SCE_HJA_DEFAULT;
672 } else if ((ch == '<') && (chNext == '/')) {
673 // Common to hide end script tag in comment
674 styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE);
675 state = SCE_H_TAGUNKNOWN;
676 }
677 } else if (state == SCE_HJA_DOUBLESTRING) {
678 if (ch == '\\') {
679 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
680 i++;
681 }
682 } else if (ch == '\"') {
683 styler.ColourTo(i, SCE_HJA_DOUBLESTRING);
684 state = SCE_HJA_DEFAULT;
685 i++;
686 ch = chNext;
687 } else if (isLineEnd(ch)) {
688 styler.ColourTo(i-1, state);
689 state = SCE_HJA_STRINGEOL;
690 }
691 } else if (state == SCE_HJA_SINGLESTRING) {
692 if (ch == '\\') {
693 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
694 i++;
695 }
696 } else if (ch == '\'') {
697 styler.ColourTo(i, SCE_HJA_SINGLESTRING);
698 state = SCE_HJA_DEFAULT;
699 i++;
700 ch = chNext;
701 } else if (isLineEnd(ch)) {
702 styler.ColourTo(i-1, state);
703 state = SCE_HJA_STRINGEOL;
704 }
705 } else if (state == SCE_HJA_STRINGEOL) {
706 if (!isLineEnd(ch)) {
707 styler.ColourTo(i - 1, state);
708 state = SCE_HJA_DEFAULT;
709 } else if (!isLineEnd(chNext)) {
710 styler.ColourTo(i, state);
711 state = SCE_HJA_DEFAULT;
712 }
713 } else if (state == SCE_HB_DEFAULT || state == SCE_HB_START) {
714 if (iswordstart(ch)) {
715 styler.ColourTo(i - 1, state);
716 state = SCE_HB_WORD;
717 } else if (ch == '\'') {
718 styler.ColourTo(i - 1, state);
719 state = SCE_HB_COMMENTLINE;
720 } else if (ch == '\"') {
721 styler.ColourTo(i - 1, state);
722 state = SCE_HB_STRING;
723 } else if ((ch == '<') && (chNext == '/')) {
724 styler.ColourTo(i - 1, state);
725 state = SCE_H_TAGUNKNOWN;
726 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
727 styler.SafeGetCharAt(i + 3) == '-') {
728 styler.ColourTo(i - 1, state);
729 state = SCE_HB_COMMENTLINE;
730 } else if (isoperator(ch)) {
731 styler.ColourTo(i - 1, state);
732 styler.ColourTo(i, SCE_HB_DEFAULT);
733 state = SCE_HB_DEFAULT;
734 } else if ((ch == ' ') || (ch == '\t')) {
735 if (state == SCE_HB_START) {
736 styler.ColourTo(i - 1, state);
737 state = SCE_HB_DEFAULT;
738 }
739 }
740 } else if (state == SCE_HB_WORD) {
741 if (!iswordchar(ch)) {
742 state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler);
743 if (state == SCE_HB_DEFAULT) {
744 if (ch == '\"') {
745 state = SCE_HB_STRING;
746 } else if (ch == '\'') {
747 state = SCE_HB_COMMENTLINE;
748 } else if (isoperator(ch)) {
749 styler.ColourTo(i, SCE_HB_DEFAULT);
750 state = SCE_HB_DEFAULT;
751 }
752 }
753 }
754 } else if (state == SCE_HB_STRING) {
755 if (ch == '\"') {
756 styler.ColourTo(i, state);
757 state = SCE_HB_DEFAULT;
758 i++;
759 ch = chNext;
760 } else if (ch == '\r' || ch == '\n') {
761 styler.ColourTo(i-1, state);
762 state = SCE_HB_STRINGEOL;
763 }
764 } else if (state == SCE_HB_COMMENTLINE) {
765 if (ch == '\r' || ch == '\n') {
766 styler.ColourTo(i - 1, state);
767 state = SCE_HB_DEFAULT;
768 } else if ((ch == '<') && (chNext == '/')) {
769 // Common to hide end script tag in comment
770 styler.ColourTo(i - 1, state);
771 state = SCE_H_TAGUNKNOWN;
772 }
773 } else if (state == SCE_HB_STRINGEOL) {
774 if (!isLineEnd(ch)) {
775 styler.ColourTo(i - 1, state);
776 state = SCE_HB_DEFAULT;
777 } else if (!isLineEnd(chNext)) {
778 styler.ColourTo(i, state);
779 state = SCE_HB_DEFAULT;
780 }
781 } else if (state == SCE_HBA_DEFAULT || state == SCE_HBA_START) {
782 if (iswordstart(ch)) {
783 styler.ColourTo(i - 1, state);
784 state = SCE_HBA_WORD;
785 } else if (ch == '\'') {
786 styler.ColourTo(i - 1, state);
787 state = SCE_HBA_COMMENTLINE;
788 } else if (ch == '\"') {
789 styler.ColourTo(i - 1, state);
790 state = SCE_HBA_STRING;
791 } else if ((ch == '<') && (chNext == '/')) {
792 styler.ColourTo(i - 1, state);
793 state = SCE_H_TAGUNKNOWN;
794 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
795 styler.SafeGetCharAt(i + 3) == '-') {
796 styler.ColourTo(i - 1, state);
797 state = SCE_HBA_COMMENTLINE;
798 } else if (isoperator(ch)) {
799 styler.ColourTo(i - 1, state);
800 styler.ColourTo(i, SCE_HBA_DEFAULT);
801 state = SCE_HBA_DEFAULT;
802 } else if ((ch == ' ') || (ch == '\t')) {
803 if (state == SCE_HBA_START) {
804 styler.ColourTo(i - 1, state);
805 state = SCE_HBA_DEFAULT;
806 }
807 }
808 } else if (state == SCE_HBA_WORD) {
809 if (!iswordchar(ch)) {
810 state = classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler);
811 if (state == SCE_HBA_DEFAULT) {
812 if (ch == '\"') {
813 state = SCE_HBA_STRING;
814 } else if (ch == '\'') {
815 state = SCE_HBA_COMMENTLINE;
816 } else if (isoperator(ch)) {
817 styler.ColourTo(i, SCE_HBA_DEFAULT);
818 state = SCE_HBA_DEFAULT;
819 }
820 }
821 }
822 } else if (state == SCE_HBA_STRING) {
823 if (ch == '\"') {
824 styler.ColourTo(i, state);
825 state = SCE_HBA_DEFAULT;
826 i++;
827 ch = chNext;
828 } else if (ch == '\r' || ch == '\n') {
829 styler.ColourTo(i-1, state);
830 state = SCE_HBA_STRINGEOL;
831 }
832 } else if (state == SCE_HBA_COMMENTLINE) {
833 if (ch == '\r' || ch == '\n') {
834 styler.ColourTo(i - 1, state);
835 state = SCE_HBA_DEFAULT;
836 } else if ((ch == '<') && (chNext == '/')) {
837 // Common to hide end script tag in comment
838 styler.ColourTo(i - 1, state);
839 state = SCE_H_TAGUNKNOWN;
840 }
841 } else if (state == SCE_HBA_STRINGEOL) {
842 if (!isLineEnd(ch)) {
843 styler.ColourTo(i - 1, state);
844 state = SCE_HBA_DEFAULT;
845 } else if (!isLineEnd(chNext)) {
846 styler.ColourTo(i, state);
847 state = SCE_HBA_DEFAULT;
848 }
849 } else if (state == SCE_HP_DEFAULT || state == SCE_HP_START) {
850 if (iswordstart(ch)) {
851 styler.ColourTo(i - 1, state);
852 state = SCE_HP_WORD;
853 } else if ((ch == '<') && (chNext == '/')) {
854 styler.ColourTo(i - 1, state);
855 state = SCE_H_TAGUNKNOWN;
856 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
857 styler.SafeGetCharAt(i + 3) == '-') {
858 styler.ColourTo(i - 1, state);
859 state = SCE_HP_COMMENTLINE;
860 } else if (ch == '#') {
861 styler.ColourTo(i - 1, state);
862 state = SCE_HP_COMMENTLINE;
863 } else if (ch == '\"') {
864 styler.ColourTo(i - 1, state);
865 if (chNext == '\"' && chNext2 == '\"') {
866 i += 2;
867 state = SCE_HP_TRIPLEDOUBLE;
868 ch = ' ';
869 chPrev = ' ';
870 chNext = styler.SafeGetCharAt(i + 1);
871 } else {
872 state = SCE_HP_STRING;
873 }
874 } else if (ch == '\'') {
875 styler.ColourTo(i - 1, state);
876 if (chNext == '\'' && chNext2 == '\'') {
877 i += 2;
878 state = SCE_HP_TRIPLE;
879 ch = ' ';
880 chPrev = ' ';
881 chNext = styler.SafeGetCharAt(i + 1);
882 } else {
883 state = SCE_HP_CHARACTER;
884 }
885 } else if (isoperator(ch)) {
886 styler.ColourTo(i - 1, state);
887 styler.ColourTo(i, SCE_HP_OPERATOR);
888 } else if ((ch == ' ') || (ch == '\t')) {
889 if (state == SCE_HP_START) {
890 styler.ColourTo(i - 1, state);
891 state = SCE_HP_DEFAULT;
892 }
893 }
894 } else if (state == SCE_HP_WORD) {
895 if (!iswordchar(ch)) {
896 classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord);
897 state = SCE_HP_DEFAULT;
898 if (ch == '#') {
899 state = SCE_HP_COMMENTLINE;
900 } else if (ch == '\"') {
901 if (chNext == '\"' && chNext2 == '\"') {
902 i += 2;
903 state = SCE_HP_TRIPLEDOUBLE;
904 ch = ' ';
905 chPrev = ' ';
906 chNext = styler.SafeGetCharAt(i + 1);
907 } else {
908 state = SCE_HP_STRING;
909 }
910 } else if (ch == '\'') {
911 if (chNext == '\'' && chNext2 == '\'') {
912 i += 2;
913 state = SCE_HP_TRIPLE;
914 ch = ' ';
915 chPrev = ' ';
916 chNext = styler.SafeGetCharAt(i + 1);
917 } else {
918 state = SCE_HP_CHARACTER;
919 }
920 } else if (isoperator(ch)) {
921 styler.ColourTo(i, SCE_HP_OPERATOR);
922 }
923 }
924 } else if (state == SCE_HP_COMMENTLINE) {
925 if (ch == '\r' || ch == '\n') {
926 styler.ColourTo(i - 1, state);
927 state = SCE_HP_DEFAULT;
928 }
929 } else if (state == SCE_HP_STRING) {
930 if (ch == '\\') {
931 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
932 i++;
933 ch = chNext;
934 chNext = styler.SafeGetCharAt(i + 1);
935 }
936 } else if (ch == '\"') {
937 styler.ColourTo(i, state);
938 state = SCE_HP_DEFAULT;
939 }
940 } else if (state == SCE_HP_CHARACTER) {
941 if (ch == '\\') {
942 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
943 i++;
944 ch = chNext;
945 chNext = styler.SafeGetCharAt(i + 1);
946 }
947 } else if (ch == '\'') {
948 styler.ColourTo(i, state);
949 state = SCE_HP_DEFAULT;
950 }
951 } else if (state == SCE_HP_TRIPLE) {
952 if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
953 styler.ColourTo(i, state);
954 state = SCE_HP_DEFAULT;
955 }
956 } else if (state == SCE_HP_TRIPLEDOUBLE) {
957 if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {
958 styler.ColourTo(i, state);
959 state = SCE_HP_DEFAULT;
960 }
961 } else if (state == SCE_HPA_DEFAULT || state == SCE_HPA_START) {
962 if (iswordstart(ch)) {
963 styler.ColourTo(i - 1, state);
964 state = SCE_HPA_WORD;
965 } else if ((ch == '<') && (chNext == '/')) {
966 styler.ColourTo(i - 1, state);
967 state = SCE_H_TAGUNKNOWN;
968 } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&
969 styler.SafeGetCharAt(i + 3) == '-') {
970 styler.ColourTo(i - 1, state);
971 state = SCE_HPA_COMMENTLINE;
972 } else if (ch == '#') {
973 styler.ColourTo(i - 1, state);
974 state = SCE_HPA_COMMENTLINE;
975 } else if (ch == '\"') {
976 styler.ColourTo(i - 1, state);
977 if (chNext == '\"' && chNext2 == '\"') {
978 i += 2;
979 state = SCE_HPA_TRIPLEDOUBLE;
980 ch = ' ';
981 chPrev = ' ';
982 chNext = styler.SafeGetCharAt(i + 1);
983 } else {
984 state = SCE_HPA_STRING;
985 }
986 } else if (ch == '\'') {
987 styler.ColourTo(i - 1, state);
988 if (chNext == '\'' && chNext2 == '\'') {
989 i += 2;
990 state = SCE_HPA_TRIPLE;
991 ch = ' ';
992 chPrev = ' ';
993 chNext = styler.SafeGetCharAt(i + 1);
994 } else {
995 state = SCE_HPA_CHARACTER;
996 }
997 } else if (isoperator(ch)) {
998 styler.ColourTo(i - 1, state);
999 styler.ColourTo(i, SCE_HPA_OPERATOR);
1000 } else if ((ch == ' ') || (ch == '\t')) {
1001 if (state == SCE_HPA_START) {
1002 styler.ColourTo(i - 1, state);
1003 state = SCE_HPA_DEFAULT;
1004 }
1005 }
1006 } else if (state == SCE_HPA_WORD) {
1007 if (!iswordchar(ch)) {
1008 classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord);
1009 state = SCE_HPA_DEFAULT;
1010 if (ch == '#') {
1011 state = SCE_HPA_COMMENTLINE;
1012 } else if (ch == '\"') {
1013 if (chNext == '\"' && chNext2 == '\"') {
1014 i += 2;
1015 state = SCE_HPA_TRIPLEDOUBLE;
1016 ch = ' ';
1017 chPrev = ' ';
1018 chNext = styler.SafeGetCharAt(i + 1);
1019 } else {
1020 state = SCE_HPA_STRING;
1021 }
1022 } else if (ch == '\'') {
1023 if (chNext == '\'' && chNext2 == '\'') {
1024 i += 2;
1025 state = SCE_HPA_TRIPLE;
1026 ch = ' ';
1027 chPrev = ' ';
1028 chNext = styler.SafeGetCharAt(i + 1);
1029 } else {
1030 state = SCE_HPA_CHARACTER;
1031 }
1032 } else if (isoperator(ch)) {
1033 styler.ColourTo(i, SCE_HPA_OPERATOR);
1034 }
1035 }
1036 } else if (state == SCE_HPA_COMMENTLINE) {
1037 if (ch == '\r' || ch == '\n') {
1038 styler.ColourTo(i - 1, state);
1039 state = SCE_HPA_DEFAULT;
1040 }
1041 } else if (state == SCE_HPA_STRING) {
1042 if (ch == '\\') {
1043 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
1044 i++;
1045 ch = chNext;
1046 chNext = styler.SafeGetCharAt(i + 1);
1047 }
1048 } else if (ch == '\"') {
1049 styler.ColourTo(i, state);
1050 state = SCE_HPA_DEFAULT;
1051 }
1052 } else if (state == SCE_HPA_CHARACTER) {
1053 if (ch == '\\') {
1054 if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
1055 i++;
1056 ch = chNext;
1057 chNext = styler.SafeGetCharAt(i + 1);
1058 }
1059 } else if (ch == '\'') {
1060 styler.ColourTo(i, state);
1061 state = SCE_HPA_DEFAULT;
1062 }
1063 } else if (state == SCE_HPA_TRIPLE) {
1064 if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
1065 styler.ColourTo(i, state);
1066 state = SCE_HPA_DEFAULT;
1067 }
1068 } else if (state == SCE_HPA_TRIPLEDOUBLE) {
1069 if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {
1070 styler.ColourTo(i, state);
1071 state = SCE_HPA_DEFAULT;
1072 }
1073 }
1074 if (state == SCE_HB_DEFAULT) { // One of the above succeeded
1075 if (ch == '\"') {
1076 state = SCE_HB_STRING;
1077 } else if (ch == '\'') {
1078 state = SCE_HB_COMMENTLINE;
1079 } else if (iswordstart(ch)) {
1080 state = SCE_HB_WORD;
1081 } else if (isoperator(ch)) {
1082 styler.ColourTo(i, SCE_HB_DEFAULT);
1083 }
1084 }
1085 if (state == SCE_HBA_DEFAULT) { // One of the above succeeded
1086 if (ch == '\"') {
1087 state = SCE_HBA_STRING;
1088 } else if (ch == '\'') {
1089 state = SCE_HBA_COMMENTLINE;
1090 } else if (iswordstart(ch)) {
1091 state = SCE_HBA_WORD;
1092 } else if (isoperator(ch)) {
1093 styler.ColourTo(i, SCE_HBA_DEFAULT);
1094 }
1095 }
1096 if (state == SCE_HJ_DEFAULT) { // One of the above succeeded
1097 if (ch == '/' && chNext == '*') {
1098 if (styler.SafeGetCharAt(i + 2) == '*')
1099 state = SCE_HJ_COMMENTDOC;
1100 else
1101 state = SCE_HJ_COMMENT;
1102 } else if (ch == '/' && chNext == '/') {
1103 state = SCE_HJ_COMMENTLINE;
1104 } else if (ch == '\"') {
1105 state = SCE_HJ_DOUBLESTRING;
1106 } else if (ch == '\'') {
1107 state = SCE_HJ_SINGLESTRING;
1108 } else if (iswordstart(ch)) {
1109 state = SCE_HJ_WORD;
1110 } else if (isoperator(ch)) {
1111 styler.ColourTo(i, SCE_HJ_SYMBOLS);
1112 }
1113 }
1114 if (state == SCE_HJA_DEFAULT) { // One of the above succeeded
1115 if (ch == '/' && chNext == '*') {
1116 if (styler.SafeGetCharAt(i + 2) == '*')
1117 state = SCE_HJA_COMMENTDOC;
1118 else
1119 state = SCE_HJA_COMMENT;
1120 } else if (ch == '/' && chNext == '/') {
1121 state = SCE_HJA_COMMENTLINE;
1122 } else if (ch == '\"') {
1123 state = SCE_HJA_DOUBLESTRING;
1124 } else if (ch == '\'') {
1125 state = SCE_HJA_SINGLESTRING;
1126 } else if (iswordstart(ch)) {
1127 state = SCE_HJA_WORD;
1128 } else if (isoperator(ch)) {
1129 styler.ColourTo(i, SCE_HJA_SYMBOLS);
1130 }
1131 }
1132 chPrev2 = chPrev;
1133 chPrev = ch;
1134 }
1135 styler.ColourTo(lengthDoc - 1, state);
1136 }
1137
1138 LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc);
1139 LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc);