]>
git.saurik.com Git - wxWidgets.git/blob - contrib/src/stc/scintilla/src/LexHTML.cxx
653aa4653fbba29ad79a24f237cfd43528e76d2d
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.
17 #include "Scintilla.h"
20 enum { eScriptNone
, eScriptJS
, eScriptVBS
, eScriptPython
};
21 static int segIsScriptingIndicator(Accessor
&styler
, unsigned int start
, unsigned int end
, int prevValue
) {
24 for (unsigned int i
= 0; i
< end
- start
+ 1 && i
< 30; i
++) {
25 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
28 //Platform::DebugPrintf("Scripting indicator [%s]\n", s);
31 if (strstr(s
, "pyth"))
33 if (strstr(s
, "javas"))
35 if (strstr(s
, "jscr"))
41 static void classifyAttribHTML(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
42 bool wordIsNumber
= isdigit(styler
[start
]) || (styler
[start
] == '.') ||
43 (styler
[start
] == '-') || (styler
[start
] == '#');
44 char chAttr
= SCE_H_ATTRIBUTEUNKNOWN
;
46 chAttr
= SCE_H_NUMBER
;
50 for (unsigned int i
= 0; i
< end
- start
+ 1 && i
< 30; i
++) {
51 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
54 if (keywords
.InList(s
))
55 chAttr
= SCE_H_ATTRIBUTE
;
57 styler
.ColourTo(end
, chAttr
);
60 static int classifyTagHTML(unsigned int start
, unsigned int end
,
61 WordList
&keywords
, Accessor
&styler
) {
65 for (unsigned int cPos
=start
; cPos
<= end
&& i
< 30; cPos
++) {
66 char ch
= styler
[cPos
];
68 s
[i
++] = static_cast<char>(tolower(ch
));
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))
78 if (keywords
.InList(s
)) {
80 if (0 == strcmp(s
, "script"))
81 chAttr
= SCE_H_SCRIPT
;
84 styler
.ColourTo(end
, chAttr
);
88 static void classifyWordHTJS(unsigned int start
, unsigned int end
,
89 WordList
&keywords
, Accessor
&styler
) {
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
];
96 char chAttr
= SCE_HJ_WORD
;
98 chAttr
= SCE_HJ_NUMBER
;
100 if (keywords
.InList(s
))
101 chAttr
= SCE_HJ_KEYWORD
;
103 styler
.ColourTo(end
, chAttr
);
106 static void classifyWordHTJSA(unsigned int start
, unsigned int end
,
107 WordList
&keywords
, Accessor
&styler
) {
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
];
114 char chAttr
= SCE_HJA_WORD
;
116 chAttr
= SCE_HJA_NUMBER
;
118 if (keywords
.InList(s
))
119 chAttr
= SCE_HJA_KEYWORD
;
121 styler
.ColourTo(end
, chAttr
);
124 static int classifyWordHTVB(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
126 bool wordIsNumber
= isdigit(styler
[start
]) || (styler
[start
] == '.');
127 for (unsigned int i
= 0; i
< end
- start
+ 1 && i
< 30; i
++) {
128 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
131 char chAttr
= SCE_HB_IDENTIFIER
;
133 chAttr
= SCE_HB_NUMBER
;
135 if (keywords
.InList(s
)) {
136 chAttr
= SCE_HB_WORD
;
137 if (strcmp(s
, "rem") == 0)
138 chAttr
= SCE_HB_COMMENTLINE
;
141 styler
.ColourTo(end
, chAttr
);
142 if (chAttr
== SCE_HB_COMMENTLINE
)
143 return SCE_HB_COMMENTLINE
;
145 return SCE_HB_DEFAULT
;
148 static int classifyWordHTVBA(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
150 bool wordIsNumber
= isdigit(styler
[start
]) || (styler
[start
] == '.');
151 for (unsigned int i
= 0; i
< end
- start
+ 1 && i
< 30; i
++) {
152 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
155 char chAttr
= SCE_HBA_IDENTIFIER
;
157 chAttr
= SCE_HBA_NUMBER
;
159 if (keywords
.InList(s
)) {
160 chAttr
= SCE_HBA_WORD
;
161 if (strcmp(s
, "rem") == 0)
162 chAttr
= SCE_HBA_COMMENTLINE
;
165 styler
.ColourTo(end
, chAttr
);
166 if (chAttr
== SCE_HBA_COMMENTLINE
)
167 return SCE_HBA_COMMENTLINE
;
169 return SCE_HBA_DEFAULT
;
172 static void classifyWordHTPy(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
, char *prevWord
) {
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
];
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
);
192 static void classifyWordHTPyA(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
, char *prevWord
) {
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
];
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
);
212 inline bool ishtmlwordchar(char ch
) {
213 return isalnum(ch
) || ch
== '.' || ch
== '-' || ch
== '_' || ch
== ':' || ch
== '!' || ch
== '#';
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
;
224 static bool isLineEnd(char ch
) {
225 return ch
== '\r' || ch
== '\n';
228 static void ColouriseHyperTextDoc(unsigned int startPos
, int length
, int initStyle
, WordList
*keywordlists
[],
231 WordList
&keywords
=*keywordlists
[0];
232 WordList
&keywords2
=*keywordlists
[1];
233 WordList
&keywords3
=*keywordlists
[2];
234 WordList
&keywords4
=*keywordlists
[3];
236 // Lexer for HTML requires more lexical states (7 bits worth) than most lexers
237 styler
.StartAt(startPos
, 127);
238 bool lastTagWasScript
= false;
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)))) {
248 state
= SCE_H_DEFAULT
;
250 styler
.StartAt(startPos
, 127);
252 int lineState
= eScriptVBS
;
253 int lineCurrent
= styler
.GetLine(startPos
);
255 lineState
= styler
.GetLineState(lineCurrent
);
256 int defaultScript
= lineState
&0xff;
257 int beforeASP
= (lineState
>> 8) &0xff;
258 int inASP
= (lineState
>> 16) &0xff;
262 styler
.StartSegment(startPos
);
263 int lengthDoc
= startPos
+ length
;
264 for (int i
= startPos
; i
< lengthDoc
; i
++) {
266 char chNext
= styler
.SafeGetCharAt(i
+ 1);
267 char chNext2
= styler
.SafeGetCharAt(i
+ 2);
269 if (styler
.IsLeadByte(ch
)) {
276 if ((ch
== '\r' && chNext
!= '\n') || (ch
== '\n')) {
277 // New line -> record any line state onto /next/ line
279 styler
.SetLineState(lineCurrent
,
280 defaultScript
| (beforeASP
<< 8) | (inASP
<< 16));
283 // Handle ASP even within other constructs as it is a preprocessor
284 if ((ch
== '<') && (chNext
== '%')) {
286 styler
.ColourTo(i
- 1, state
);
287 if (chNext2
== '@') {
288 styler
.ColourTo(i
+ 2, SCE_H_ASP
);
292 if (defaultScript
== eScriptVBS
)
293 state
= SCE_HBA_START
;
294 else if (defaultScript
== eScriptPython
)
295 state
= SCE_HPA_START
;
297 state
= SCE_HJA_START
;
298 if (chNext2
== '=') {
299 styler
.ColourTo(i
+ 2, SCE_H_ASP
);
302 styler
.ColourTo(i
+ 1, SCE_H_ASP
);
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
);
320 styler
.ColourTo(i
- 1, state
);
322 //if (state == SCE_H_ASPAT)
323 // styler.ColourTo(i+1, SCE_H_ASPAT);
325 styler
.ColourTo(i
+1, SCE_H_ASP
);
328 beforeASP
= SCE_H_DEFAULT
;
333 if (state
== SCE_H_DEFAULT
) {
335 styler
.ColourTo(i
- 1, state
);
336 state
= SCE_H_TAGUNKNOWN
;
338 styler
.ColourTo(i
+ 1, SCE_H_XMLSTART
);
342 } else if (ch
== '&') {
343 styler
.ColourTo(i
- 1, SCE_H_DEFAULT
);
344 state
= SCE_H_ENTITY
;
346 } else if (state
== SCE_H_COMMENT
) {
347 if ((ch
== '>') && (chPrev
== '-')) {
348 styler
.ColourTo(i
, state
);
349 state
= SCE_H_DEFAULT
;
351 } else if (state
== SCE_H_ENTITY
) {
353 styler
.ColourTo(i
, state
);
354 state
= SCE_H_DEFAULT
;
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
;
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
;
372 state
= SCE_HJ_START
;
374 state
= SCE_H_DEFAULT
;
377 if (eClass
== SCE_H_COMMENT
) {
378 state
= SCE_H_COMMENT
;
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
);
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
;
397 state
= SCE_HJ_START
;
399 state
= SCE_H_DEFAULT
;
405 } else if (state
== SCE_H_ASP
) {
406 if ((ch
== '>') && (chPrev
== '%')) {
407 styler
.ColourTo(i
, state
);
408 state
= SCE_H_DEFAULT
;
410 } else if (state
== SCE_H_ASPAT
) {
411 if ((ch
== '>') && (chPrev
== '%')) {
412 styler
.ColourTo(i
, state
);
413 state
= SCE_H_DEFAULT
;
415 } else if (state
== SCE_H_OTHER
) {
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
;
425 state
= SCE_HJ_START
;
427 state
= SCE_H_DEFAULT
;
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
);
440 state
= SCE_H_DEFAULT
;
441 } else if (ch
== '?' && chNext
== '>') {
442 styler
.ColourTo(i
- 1, state
);
443 styler
.ColourTo(i
+ 1, SCE_H_XMLEND
);
446 state
= SCE_H_DEFAULT
;
447 } else if (ishtmlwordchar(ch
)) {
448 styler
.ColourTo(i
- 1, state
);
449 state
= SCE_H_ATTRIBUTE
;
451 } else if (state
== SCE_H_DOUBLESTRING
) {
453 if (lastTagWasScript
)
454 scriptLanguage
= segIsScriptingIndicator(styler
, styler
.GetStartSegment(), i
, scriptLanguage
);
455 styler
.ColourTo(i
, SCE_H_DOUBLESTRING
);
458 } else if (state
== SCE_H_SINGLESTRING
) {
460 if (lastTagWasScript
)
461 scriptLanguage
= segIsScriptingIndicator(styler
, styler
.GetStartSegment(), i
, scriptLanguage
);
462 styler
.ColourTo(i
, SCE_H_SINGLESTRING
);
465 } else if (state
== SCE_HJ_DEFAULT
|| state
== SCE_HJ_START
) {
466 if (iswordstart(ch
)) {
467 styler
.ColourTo(i
- 1, state
);
469 } else if (ch
== '/' && chNext
== '*') {
470 styler
.ColourTo(i
- 1, state
);
472 state
= SCE_HJ_COMMENTDOC
;
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
;
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
== '*') {
508 state
= SCE_HJ_COMMENTDOC
;
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
;
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
);
531 state
= SCE_H_DEFAULT
;
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
);
542 state
= SCE_H_DEFAULT
;
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
;
553 } else if (state
== SCE_HJ_DOUBLESTRING
) {
555 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
558 } else if (ch
== '\"') {
559 styler
.ColourTo(i
, SCE_HJ_DOUBLESTRING
);
560 state
= SCE_HJ_DEFAULT
;
563 } else if (isLineEnd(ch
)) {
564 styler
.ColourTo(i
-1, state
);
565 state
= SCE_HJ_STRINGEOL
;
567 } else if (state
== SCE_HJ_SINGLESTRING
) {
569 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
572 } else if (ch
== '\'') {
573 styler
.ColourTo(i
, SCE_HJ_SINGLESTRING
);
574 state
= SCE_HJ_DEFAULT
;
577 } else if (isLineEnd(ch
)) {
578 styler
.ColourTo(i
-1, state
);
579 state
= SCE_HJ_STRINGEOL
;
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
;
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
);
596 state
= SCE_HJA_COMMENTDOC
;
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
;
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
== '*') {
632 state
= SCE_HJA_COMMENTDOC
;
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
;
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
);
655 state
= SCE_H_DEFAULT
;
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
);
666 state
= SCE_H_DEFAULT
;
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
;
677 } else if (state
== SCE_HJA_DOUBLESTRING
) {
679 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
682 } else if (ch
== '\"') {
683 styler
.ColourTo(i
, SCE_HJA_DOUBLESTRING
);
684 state
= SCE_HJA_DEFAULT
;
687 } else if (isLineEnd(ch
)) {
688 styler
.ColourTo(i
-1, state
);
689 state
= SCE_HJA_STRINGEOL
;
691 } else if (state
== SCE_HJA_SINGLESTRING
) {
693 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
696 } else if (ch
== '\'') {
697 styler
.ColourTo(i
, SCE_HJA_SINGLESTRING
);
698 state
= SCE_HJA_DEFAULT
;
701 } else if (isLineEnd(ch
)) {
702 styler
.ColourTo(i
-1, state
);
703 state
= SCE_HJA_STRINGEOL
;
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
;
713 } else if (state
== SCE_HB_DEFAULT
|| state
== SCE_HB_START
) {
714 if (iswordstart(ch
)) {
715 styler
.ColourTo(i
- 1, state
);
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
;
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
) {
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
;
754 } else if (state
== SCE_HB_STRING
) {
756 styler
.ColourTo(i
, state
);
757 state
= SCE_HB_DEFAULT
;
760 } else if (ch
== '\r' || ch
== '\n') {
761 styler
.ColourTo(i
-1, state
);
762 state
= SCE_HB_STRINGEOL
;
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
;
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
;
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
;
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
) {
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
;
822 } else if (state
== SCE_HBA_STRING
) {
824 styler
.ColourTo(i
, state
);
825 state
= SCE_HBA_DEFAULT
;
828 } else if (ch
== '\r' || ch
== '\n') {
829 styler
.ColourTo(i
-1, state
);
830 state
= SCE_HBA_STRINGEOL
;
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
;
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
;
849 } else if (state
== SCE_HP_DEFAULT
|| state
== SCE_HP_START
) {
850 if (iswordstart(ch
)) {
851 styler
.ColourTo(i
- 1, state
);
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
== '\"') {
867 state
= SCE_HP_TRIPLEDOUBLE
;
870 chNext
= styler
.SafeGetCharAt(i
+ 1);
872 state
= SCE_HP_STRING
;
874 } else if (ch
== '\'') {
875 styler
.ColourTo(i
- 1, state
);
876 if (chNext
== '\'' && chNext2
== '\'') {
878 state
= SCE_HP_TRIPLE
;
881 chNext
= styler
.SafeGetCharAt(i
+ 1);
883 state
= SCE_HP_CHARACTER
;
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
;
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
;
899 state
= SCE_HP_COMMENTLINE
;
900 } else if (ch
== '\"') {
901 if (chNext
== '\"' && chNext2
== '\"') {
903 state
= SCE_HP_TRIPLEDOUBLE
;
906 chNext
= styler
.SafeGetCharAt(i
+ 1);
908 state
= SCE_HP_STRING
;
910 } else if (ch
== '\'') {
911 if (chNext
== '\'' && chNext2
== '\'') {
913 state
= SCE_HP_TRIPLE
;
916 chNext
= styler
.SafeGetCharAt(i
+ 1);
918 state
= SCE_HP_CHARACTER
;
920 } else if (isoperator(ch
)) {
921 styler
.ColourTo(i
, SCE_HP_OPERATOR
);
924 } else if (state
== SCE_HP_COMMENTLINE
) {
925 if (ch
== '\r' || ch
== '\n') {
926 styler
.ColourTo(i
- 1, state
);
927 state
= SCE_HP_DEFAULT
;
929 } else if (state
== SCE_HP_STRING
) {
931 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
934 chNext
= styler
.SafeGetCharAt(i
+ 1);
936 } else if (ch
== '\"') {
937 styler
.ColourTo(i
, state
);
938 state
= SCE_HP_DEFAULT
;
940 } else if (state
== SCE_HP_CHARACTER
) {
942 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
945 chNext
= styler
.SafeGetCharAt(i
+ 1);
947 } else if (ch
== '\'') {
948 styler
.ColourTo(i
, state
);
949 state
= SCE_HP_DEFAULT
;
951 } else if (state
== SCE_HP_TRIPLE
) {
952 if (ch
== '\'' && chPrev
== '\'' && chPrev2
== '\'') {
953 styler
.ColourTo(i
, state
);
954 state
= SCE_HP_DEFAULT
;
956 } else if (state
== SCE_HP_TRIPLEDOUBLE
) {
957 if (ch
== '\"' && chPrev
== '\"' && chPrev2
== '\"') {
958 styler
.ColourTo(i
, state
);
959 state
= SCE_HP_DEFAULT
;
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
== '\"') {
979 state
= SCE_HPA_TRIPLEDOUBLE
;
982 chNext
= styler
.SafeGetCharAt(i
+ 1);
984 state
= SCE_HPA_STRING
;
986 } else if (ch
== '\'') {
987 styler
.ColourTo(i
- 1, state
);
988 if (chNext
== '\'' && chNext2
== '\'') {
990 state
= SCE_HPA_TRIPLE
;
993 chNext
= styler
.SafeGetCharAt(i
+ 1);
995 state
= SCE_HPA_CHARACTER
;
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
;
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
;
1011 state
= SCE_HPA_COMMENTLINE
;
1012 } else if (ch
== '\"') {
1013 if (chNext
== '\"' && chNext2
== '\"') {
1015 state
= SCE_HPA_TRIPLEDOUBLE
;
1018 chNext
= styler
.SafeGetCharAt(i
+ 1);
1020 state
= SCE_HPA_STRING
;
1022 } else if (ch
== '\'') {
1023 if (chNext
== '\'' && chNext2
== '\'') {
1025 state
= SCE_HPA_TRIPLE
;
1028 chNext
= styler
.SafeGetCharAt(i
+ 1);
1030 state
= SCE_HPA_CHARACTER
;
1032 } else if (isoperator(ch
)) {
1033 styler
.ColourTo(i
, SCE_HPA_OPERATOR
);
1036 } else if (state
== SCE_HPA_COMMENTLINE
) {
1037 if (ch
== '\r' || ch
== '\n') {
1038 styler
.ColourTo(i
- 1, state
);
1039 state
= SCE_HPA_DEFAULT
;
1041 } else if (state
== SCE_HPA_STRING
) {
1043 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1046 chNext
= styler
.SafeGetCharAt(i
+ 1);
1048 } else if (ch
== '\"') {
1049 styler
.ColourTo(i
, state
);
1050 state
= SCE_HPA_DEFAULT
;
1052 } else if (state
== SCE_HPA_CHARACTER
) {
1054 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1057 chNext
= styler
.SafeGetCharAt(i
+ 1);
1059 } else if (ch
== '\'') {
1060 styler
.ColourTo(i
, state
);
1061 state
= SCE_HPA_DEFAULT
;
1063 } else if (state
== SCE_HPA_TRIPLE
) {
1064 if (ch
== '\'' && chPrev
== '\'' && chPrev2
== '\'') {
1065 styler
.ColourTo(i
, state
);
1066 state
= SCE_HPA_DEFAULT
;
1068 } else if (state
== SCE_HPA_TRIPLEDOUBLE
) {
1069 if (ch
== '\"' && chPrev
== '\"' && chPrev2
== '\"') {
1070 styler
.ColourTo(i
, state
);
1071 state
= SCE_HPA_DEFAULT
;
1074 if (state
== SCE_HB_DEFAULT
) { // One of the above succeeded
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
);
1085 if (state
== SCE_HBA_DEFAULT
) { // One of the above succeeded
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
);
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
;
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
);
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
;
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
);
1135 styler
.ColourTo(lengthDoc
- 1, state
);
1138 LexerModule
lmHTML(SCLEX_HTML
, ColouriseHyperTextDoc
);
1139 LexerModule
lmXML(SCLEX_XML
, ColouriseHyperTextDoc
);