1 // Scintilla source code edit control
5 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
18 #include "StyleContext.h"
20 #include "Scintilla.h"
23 #define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START)
24 #define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START)
25 #define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START)
27 enum script_type
{ eScriptNone
= 0, eScriptJS
, eScriptVBS
, eScriptPython
, eScriptPHP
, eScriptXML
, eScriptSGML
, eScriptSGMLblock
};
28 enum script_mode
{ eHtml
= 0, eNonHtmlScript
, eNonHtmlPreProc
, eNonHtmlScriptPreProc
};
30 static inline bool IsAWordChar(const int ch
) {
31 return (ch
< 0x80) && (isalnum(ch
) || ch
== '.' || ch
== '_');
34 static inline bool IsAWordStart(const int ch
) {
35 return (ch
< 0x80) && (isalnum(ch
) || ch
== '_');
38 static script_type
segIsScriptingIndicator(Accessor
&styler
, unsigned int start
, unsigned int end
, script_type prevValue
) {
41 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
42 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
45 //Platform::DebugPrintf("Scripting indicator [%s]\n", s);
46 if (strstr(s
, "src")) // External script
50 if (strstr(s
, "pyth"))
52 if (strstr(s
, "javas"))
54 if (strstr(s
, "jscr"))
64 static int PrintScriptingIndicatorOffset(Accessor
&styler
, unsigned int start
, unsigned int end
) {
68 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
69 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
72 if (0 == strncmp(s
, "php", 3)) {
79 static script_type
ScriptOfState(int state
) {
80 if ((state
>= SCE_HP_START
) && (state
<= SCE_HP_IDENTIFIER
)) {
82 } else if ((state
>= SCE_HB_START
) && (state
<= SCE_HB_STRINGEOL
)) {
84 } else if ((state
>= SCE_HJ_START
) && (state
<= SCE_HJ_REGEX
)) {
86 } else if ((state
>= SCE_HPHP_DEFAULT
) && (state
<= SCE_HPHP_COMMENTLINE
)) {
88 } else if ((state
>= SCE_H_SGML_DEFAULT
) && (state
< SCE_H_SGML_BLOCK_DEFAULT
)) {
90 } else if (state
== SCE_H_SGML_BLOCK_DEFAULT
) {
91 return eScriptSGMLblock
;
97 static int statePrintForState(int state
, script_mode inScriptType
) {
100 if ((state
>= SCE_HP_START
) && (state
<= SCE_HP_IDENTIFIER
)) {
101 StateToPrint
= state
+ ((inScriptType
== eNonHtmlScript
) ? 0 : SCE_HA_PYTHON
);
102 } else if ((state
>= SCE_HB_START
) && (state
<= SCE_HB_STRINGEOL
)) {
103 StateToPrint
= state
+ ((inScriptType
== eNonHtmlScript
) ? 0 : SCE_HA_VBS
);
104 } else if ((state
>= SCE_HJ_START
) && (state
<= SCE_HJ_REGEX
)) {
105 StateToPrint
= state
+ ((inScriptType
== eNonHtmlScript
) ? 0 : SCE_HA_JS
);
107 StateToPrint
= state
;
113 static int stateForPrintState(int StateToPrint
) {
116 if ((StateToPrint
>= SCE_HPA_START
) && (StateToPrint
<= SCE_HPA_IDENTIFIER
)) {
117 state
= StateToPrint
- SCE_HA_PYTHON
;
118 } else if ((StateToPrint
>= SCE_HBA_START
) && (StateToPrint
<= SCE_HBA_STRINGEOL
)) {
119 state
= StateToPrint
- SCE_HA_VBS
;
120 } else if ((StateToPrint
>= SCE_HJA_START
) && (StateToPrint
<= SCE_HJA_REGEX
)) {
121 state
= StateToPrint
- SCE_HA_JS
;
123 state
= StateToPrint
;
129 static inline bool IsNumber(unsigned int start
, Accessor
&styler
) {
130 return IsADigit(styler
[start
]) || (styler
[start
] == '.') ||
131 (styler
[start
] == '-') || (styler
[start
] == '#');
134 static inline bool isStringState(int state
) {
138 case SCE_HJ_DOUBLESTRING
:
139 case SCE_HJ_SINGLESTRING
:
140 case SCE_HJA_DOUBLESTRING
:
141 case SCE_HJA_SINGLESTRING
:
146 case SCE_HPHP_HSTRING
:
147 case SCE_HPHP_SIMPLESTRING
:
157 // not really well done, since it's only comments that should lex the %> and <%
158 static inline bool isCommentASPState(int state
) {
163 case SCE_HJ_COMMENTLINE
:
164 case SCE_HJ_COMMENTDOC
:
165 case SCE_HB_COMMENTLINE
:
166 case SCE_HP_COMMENTLINE
:
167 case SCE_HPHP_COMMENT
:
168 case SCE_HPHP_COMMENTLINE
:
178 static void classifyAttribHTML(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
179 bool wordIsNumber
= IsNumber(start
, styler
);
180 char chAttr
= SCE_H_ATTRIBUTEUNKNOWN
;
182 chAttr
= SCE_H_NUMBER
;
186 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
187 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
190 if (keywords
.InList(s
))
191 chAttr
= SCE_H_ATTRIBUTE
;
193 if ((chAttr
== SCE_H_ATTRIBUTEUNKNOWN
) && !keywords
)
194 // No keywords -> all are known
195 chAttr
= SCE_H_ATTRIBUTE
;
196 styler
.ColourTo(end
, chAttr
);
199 static int classifyTagHTML(unsigned int start
, unsigned int end
,
200 WordList
&keywords
, Accessor
&styler
, bool &tagDontFold
,
201 bool caseSensitive
) {
203 // Copy after the '<'
205 for (unsigned int cPos
= start
; cPos
<= end
&& i
< 30; cPos
++) {
206 char ch
= styler
[cPos
];
207 if ((ch
!= '<') && (ch
!= '/')) {
208 s
[i
++] = caseSensitive
? ch
: static_cast<char>(tolower(ch
));
212 //The following is only a quick hack, to see if this whole thing would work
213 //we first need the tagname with a trailing space...
217 //...to find it in the list of no-container-tags
218 // (There are many more. We will need a keywordlist in the property file for this)
219 tagDontFold
= (NULL
!= strstr("meta link img area br hr input ",s
));
221 //now we can remove the trailing space
224 bool isScript
= false;
225 char chAttr
= SCE_H_TAGUNKNOWN
;
227 chAttr
= SCE_H_SGML_DEFAULT
;
228 } else if (s
[0] == '/') { // Closing tag
229 if (keywords
.InList(s
+ 1))
232 if (keywords
.InList(s
)) {
234 isScript
= 0 == strcmp(s
, "script");
237 if ((chAttr
== SCE_H_TAGUNKNOWN
) && !keywords
) {
238 // No keywords -> all are known
240 isScript
= 0 == strcmp(s
, "script");
242 styler
.ColourTo(end
, chAttr
);
243 return isScript
? SCE_H_SCRIPT
: chAttr
;
246 static void classifyWordHTJS(unsigned int start
, unsigned int end
,
247 WordList
&keywords
, Accessor
&styler
, script_mode inScriptType
) {
248 char chAttr
= SCE_HJ_WORD
;
249 bool wordIsNumber
= IsADigit(styler
[start
]) || (styler
[start
] == '.');
251 chAttr
= SCE_HJ_NUMBER
;
255 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
256 s
[i
] = styler
[start
+ i
];
259 if (keywords
.InList(s
))
260 chAttr
= SCE_HJ_KEYWORD
;
262 styler
.ColourTo(end
, statePrintForState(chAttr
, inScriptType
));
265 static int classifyWordHTVB(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
, script_mode inScriptType
) {
266 char chAttr
= SCE_HB_IDENTIFIER
;
267 bool wordIsNumber
= IsADigit(styler
[start
]) || (styler
[start
] == '.');
269 chAttr
= SCE_HB_NUMBER
;
273 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
274 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
277 if (keywords
.InList(s
)) {
278 chAttr
= SCE_HB_WORD
;
279 if (strcmp(s
, "rem") == 0)
280 chAttr
= SCE_HB_COMMENTLINE
;
283 styler
.ColourTo(end
, statePrintForState(chAttr
, inScriptType
));
284 if (chAttr
== SCE_HB_COMMENTLINE
)
285 return SCE_HB_COMMENTLINE
;
287 return SCE_HB_DEFAULT
;
290 static void classifyWordHTPy(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
, char *prevWord
, script_mode inScriptType
) {
291 bool wordIsNumber
= IsADigit(styler
[start
]);
294 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
295 s
[i
] = styler
[start
+ i
];
298 char chAttr
= SCE_HP_IDENTIFIER
;
299 if (0 == strcmp(prevWord
, "class"))
300 chAttr
= SCE_HP_CLASSNAME
;
301 else if (0 == strcmp(prevWord
, "def"))
302 chAttr
= SCE_HP_DEFNAME
;
303 else if (wordIsNumber
)
304 chAttr
= SCE_HP_NUMBER
;
305 else if (keywords
.InList(s
))
306 chAttr
= SCE_HP_WORD
;
307 styler
.ColourTo(end
, statePrintForState(chAttr
, inScriptType
));
311 // Update the word colour to default or keyword
312 // Called when in a PHP word
313 static void classifyWordHTPHP(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
314 char chAttr
= SCE_HPHP_DEFAULT
;
315 bool wordIsNumber
= IsADigit(styler
[start
]);
317 chAttr
= SCE_HPHP_NUMBER
;
321 for (; i
< end
- start
+ 1 && i
< 100; i
++) {
322 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
325 if (keywords
.InList(s
))
326 chAttr
= SCE_HPHP_WORD
;
328 styler
.ColourTo(end
, chAttr
);
331 static bool isWordHSGML(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
334 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
335 s
[i
] = styler
[start
+ i
];
338 return keywords
.InList(s
);
341 static bool isWordCdata(unsigned int start
, unsigned int end
, Accessor
&styler
) {
344 for (; i
< end
- start
+ 1 && i
< 30; i
++) {
345 s
[i
] = styler
[start
+ i
];
348 return (0 == strcmp(s
, "[CDATA["));
351 // Return the first state to reach when entering a scripting language
352 static int StateForScript(script_type scriptLanguage
) {
354 switch (scriptLanguage
) {
356 Result
= SCE_HB_START
;
359 Result
= SCE_HP_START
;
362 Result
= SCE_HPHP_DEFAULT
;
365 Result
= SCE_H_TAGUNKNOWN
;
368 Result
= SCE_H_SGML_DEFAULT
;
371 Result
= SCE_HJ_START
;
377 static inline bool ishtmlwordchar(char ch
) {
378 return !isascii(ch
) ||
379 (isalnum(ch
) || ch
== '.' || ch
== '-' || ch
== '_' || ch
== ':' || ch
== '!' || ch
== '#');
382 static inline bool issgmlwordchar(char ch
) {
383 return !isascii(ch
) ||
384 (isalnum(ch
) || ch
== '.' || ch
== '_' || ch
== ':' || ch
== '!' || ch
== '#' || ch
== '[');
387 static inline bool IsPhpWordStart(const unsigned char ch
) {
388 return (isascii(ch
) && (isalpha(ch
) || (ch
== '_'))) || (ch
>= 0x7f);
391 static inline bool IsPhpWordChar(char ch
) {
392 return IsADigit(ch
) || IsPhpWordStart(ch
);
395 static bool InTagState(int state
) {
396 return state
== SCE_H_TAG
|| state
== SCE_H_TAGUNKNOWN
||
397 state
== SCE_H_SCRIPT
||
398 state
== SCE_H_ATTRIBUTE
|| state
== SCE_H_ATTRIBUTEUNKNOWN
||
399 state
== SCE_H_NUMBER
|| state
== SCE_H_OTHER
||
400 state
== SCE_H_DOUBLESTRING
|| state
== SCE_H_SINGLESTRING
;
403 static bool IsCommentState(const int state
) {
404 return state
== SCE_H_COMMENT
|| state
== SCE_H_SGML_COMMENT
;
407 static bool isLineEnd(char ch
) {
408 return ch
== '\r' || ch
== '\n';
411 static bool isOKBeforeRE(char ch
) {
412 return (ch
== '(') || (ch
== '=') || (ch
== ',');
415 static bool isPHPStringState(int state
) {
417 (state
== SCE_HPHP_HSTRING
) ||
418 (state
== SCE_HPHP_SIMPLESTRING
) ||
419 (state
== SCE_HPHP_HSTRING_VARIABLE
);
422 static void ColouriseHyperTextDoc(unsigned int startPos
, int length
, int initStyle
, WordList
*keywordlists
[],
424 WordList
&keywords
= *keywordlists
[0];
425 WordList
&keywords2
= *keywordlists
[1];
426 WordList
&keywords3
= *keywordlists
[2];
427 WordList
&keywords4
= *keywordlists
[3];
428 WordList
&keywords5
= *keywordlists
[4];
429 WordList
&keywords6
= *keywordlists
[5]; // SGML (DTD) keywords
431 // Lexer for HTML requires more lexical states (7 bits worth) than most lexers
432 styler
.StartAt(startPos
, STYLE_MAX
);
435 int StateToPrint
= initStyle
;
436 int state
= stateForPrintState(StateToPrint
);
438 // If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen
439 if (InTagState(state
)) {
440 while ((startPos
> 0) && (InTagState(styler
.StyleAt(startPos
- 1)))) {
444 state
= SCE_H_DEFAULT
;
446 styler
.StartAt(startPos
, STYLE_MAX
);
448 int lineCurrent
= styler
.GetLine(startPos
);
450 if (lineCurrent
> 0) {
451 lineState
= styler
.GetLineState(lineCurrent
);
453 // Default client and ASP scripting language is JavaScript
454 lineState
= eScriptJS
<< 8;
455 lineState
|= styler
.GetPropertyInt("asp.default.language", eScriptJS
) << 4;
457 script_mode inScriptType
= script_mode((lineState
>> 0) & 0x03); // 2 bits of scripting mode
458 bool tagOpened
= (lineState
>> 2) & 0x01; // 1 bit to know if we are in an opened tag
459 bool tagClosing
= (lineState
>> 3) & 0x01; // 1 bit to know if we are in a closing tag
460 bool tagDontFold
= false; //some HTML tags should not be folded
461 script_type aspScript
= script_type((lineState
>> 4) & 0x0F); // 4 bits of script name
462 script_type clientScript
= script_type((lineState
>> 8) & 0x0F); // 4 bits of script name
463 int beforePreProc
= (lineState
>> 12) & 0xFF; // 8 bits of state
465 script_type scriptLanguage
= ScriptOfState(state
);
467 const bool foldHTML
= styler
.GetPropertyInt("fold.html", 0) != 0;
468 const bool fold
= foldHTML
&& styler
.GetPropertyInt("fold", 0);
469 const bool foldHTMLPreprocessor
= foldHTML
&& styler
.GetPropertyInt("fold.html.preprocessor", 1);
470 const bool foldCompact
= styler
.GetPropertyInt("fold.compact", 1) != 0;
471 const bool caseSensitive
= styler
.GetPropertyInt("html.tags.case.sensitive", 0) != 0;
473 int levelPrev
= styler
.LevelAt(lineCurrent
) & SC_FOLDLEVELNUMBERMASK
;
474 int levelCurrent
= levelPrev
;
475 int visibleChars
= 0;
479 char chPrevNonWhite
= ' ';
480 styler
.StartSegment(startPos
);
481 const int lengthDoc
= startPos
+ length
;
482 for (int i
= startPos
; i
< lengthDoc
; i
++) {
483 const char chPrev2
= chPrev
;
485 if (ch
!= ' ' && ch
!= '\t')
488 char chNext
= styler
.SafeGetCharAt(i
+ 1);
489 const char chNext2
= styler
.SafeGetCharAt(i
+ 2);
491 // Handle DBCS codepages
492 if (styler
.IsLeadByte(ch
)) {
498 if ((!isspacechar(ch
) || !foldCompact
) && fold
)
501 // decide what is the current state to print (depending of the script tag)
502 StateToPrint
= statePrintForState(state
, inScriptType
);
504 // handle script folding
506 switch (scriptLanguage
) {
509 //not currently supported case eScriptVBS:
511 if ((state
!= SCE_HPHP_COMMENT
) && (state
!= SCE_HPHP_COMMENTLINE
) && (state
!= SCE_HJ_COMMENT
) && (state
!= SCE_HJ_COMMENTLINE
) && (state
!= SCE_HJ_COMMENTDOC
) && (!isStringState(state
))) {
512 //Platform::DebugPrintf("state=%d, StateToPrint=%d, initStyle=%d\n", state, StateToPrint, initStyle);
513 //if ((state == SCE_HPHP_OPERATOR) || (state == SCE_HPHP_DEFAULT) || (state == SCE_HJ_SYMBOLS) || (state == SCE_HJ_START) || (state == SCE_HJ_DEFAULT)) {
514 if ((ch
== '{') || (ch
== '}')) {
515 levelCurrent
+= (ch
== '{') ? 1 : -1;
520 if (state
!= SCE_HP_COMMENTLINE
) {
521 if ((ch
== ':') && ((chNext
== '\n') || (chNext
== '\r' && chNext2
== '\n'))) {
523 } else if ((ch
== '\n') && !((chNext
== '\r') && (chNext2
== '\n')) && (chNext
!= '\n')) {
524 // check if the number of tabs is lower than the level
525 int Findlevel
= (levelCurrent
& ~SC_FOLDLEVELBASE
) * 8;
526 for (int j
= 0; Findlevel
> 0; j
++) {
527 char chTmp
= styler
.SafeGetCharAt(i
+ j
+ 1);
530 } else if (chTmp
== ' ') {
538 levelCurrent
-= Findlevel
/ 8;
550 if ((ch
== '\r' && chNext
!= '\n') || (ch
== '\n')) {
551 // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
552 // Avoid triggering two times on Dos/Win
553 // New line -> record any line state onto /next/ line
556 if (visibleChars
== 0)
557 lev
|= SC_FOLDLEVELWHITEFLAG
;
558 if ((levelCurrent
> levelPrev
) && (visibleChars
> 0))
559 lev
|= SC_FOLDLEVELHEADERFLAG
;
561 styler
.SetLevel(lineCurrent
, lev
);
563 levelPrev
= levelCurrent
;
566 styler
.SetLineState(lineCurrent
,
567 ((inScriptType
& 0x03) << 0) |
568 ((tagOpened
& 0x01) << 2) |
569 ((tagClosing
& 0x01) << 3) |
570 ((aspScript
& 0x0F) << 4) |
571 ((clientScript
& 0x0F) << 8) |
572 ((beforePreProc
& 0xFF) << 12));
575 // generic end of script processing
576 else if ((inScriptType
== eNonHtmlScript
) && (ch
== '<') && (chNext
== '/')) {
577 // Check if it's the end of the script tag (or any other HTML tag)
579 // in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!)
580 case SCE_H_DOUBLESTRING
:
581 case SCE_H_SINGLESTRING
:
583 case SCE_HJ_COMMENTDOC
:
584 // SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
585 // the end of script marker from some JS interpreters.
586 //case SCE_HJ_COMMENTLINE:
587 case SCE_HJ_DOUBLESTRING
:
588 case SCE_HJ_SINGLESTRING
:
593 case SCE_HP_TRIPLEDOUBLE
:
596 // closing tag of the script (it's a closing HTML tag anyway)
597 styler
.ColourTo(i
- 1, StateToPrint
);
598 state
= SCE_H_TAGUNKNOWN
;
599 inScriptType
= eHtml
;
600 scriptLanguage
= eScriptNone
;
601 clientScript
= eScriptJS
;
609 /////////////////////////////////////
610 // handle the start of PHP pre-processor = Non-HTML
611 else if ((state
!= SCE_H_ASPAT
) &&
612 !isPHPStringState(state
) &&
613 (state
!= SCE_HPHP_COMMENT
) &&
616 styler
.ColourTo(i
- 1, StateToPrint
);
617 beforePreProc
= state
;
618 scriptLanguage
= segIsScriptingIndicator(styler
, styler
.GetStartSegment() + 2, i
+ 10, eScriptPHP
);
621 i
+= PrintScriptingIndicatorOffset(styler
, styler
.GetStartSegment() + 2, i
+ 10);
622 if (scriptLanguage
== eScriptXML
)
623 styler
.ColourTo(i
, SCE_H_XMLSTART
);
625 styler
.ColourTo(i
, SCE_H_QUESTION
);
626 state
= StateForScript(scriptLanguage
);
627 if (inScriptType
== eNonHtmlScript
)
628 inScriptType
= eNonHtmlScriptPreProc
;
630 inScriptType
= eNonHtmlPreProc
;
632 if (foldHTMLPreprocessor
){
634 if (scriptLanguage
== eScriptXML
)
635 levelCurrent
--; // no folding of the XML first tag (all XML-like tags in this case)
638 ch
= styler
.SafeGetCharAt(i
);
642 // handle the start of ASP pre-processor = Non-HTML
643 else if (!isCommentASPState(state
) && (ch
== '<') && (chNext
== '%')) {
644 styler
.ColourTo(i
- 1, StateToPrint
);
645 beforePreProc
= state
;
646 if (inScriptType
== eNonHtmlScript
)
647 inScriptType
= eNonHtmlScriptPreProc
;
649 inScriptType
= eNonHtmlPreProc
;
651 if (chNext2
== '@') {
652 i
+= 2; // place as if it was the second next char treated
655 } else if ((chNext2
== '-') && (styler
.SafeGetCharAt(i
+ 3) == '-')) {
656 styler
.ColourTo(i
+ 3, SCE_H_ASP
);
657 state
= SCE_H_XCCOMMENT
;
658 scriptLanguage
= eScriptVBS
;
661 if (chNext2
== '=') {
662 i
+= 2; // place as if it was the second next char treated
665 i
++; // place as if it was the next char treated
669 state
= StateForScript(aspScript
);
671 scriptLanguage
= eScriptVBS
;
672 styler
.ColourTo(i
, SCE_H_ASP
);
674 if (foldHTMLPreprocessor
)
677 ch
= styler
.SafeGetCharAt(i
);
681 /////////////////////////////////////
682 // handle the start of SGML language (DTD)
683 else if (((scriptLanguage
== eScriptNone
) || (scriptLanguage
== eScriptXML
)) &&
686 (StateToPrint
!= SCE_H_CDATA
) && (!IsCommentState(StateToPrint
))) {
687 beforePreProc
= state
;
688 styler
.ColourTo(i
- 2, StateToPrint
);
689 if ((chNext
== '-') && (chNext2
== '-')) {
690 state
= SCE_H_COMMENT
; // wait for a pending command
692 else if (isWordCdata(i
+ 1, i
+ 7, styler
)) {
695 styler
.ColourTo(i
, SCE_H_SGML_DEFAULT
); // <! is default
696 scriptLanguage
= eScriptSGML
;
697 state
= SCE_H_SGML_COMMAND
; // wait for a pending command
699 // fold whole tag (-- when closing the tag)
700 if (foldHTMLPreprocessor
)
705 // handle the end of a pre-processor = Non-HTML
707 ((inScriptType
== eNonHtmlPreProc
)
708 || (inScriptType
== eNonHtmlScriptPreProc
)) && (
709 ((scriptLanguage
== eScriptPHP
) && (ch
== '?') && !isPHPStringState(state
) && (state
!= SCE_HPHP_COMMENT
)) ||
710 ((scriptLanguage
!= eScriptNone
) && !isStringState(state
) &&
712 ) && (chNext
== '>')) ||
713 ((scriptLanguage
== eScriptSGML
) && (ch
== '>') && (state
!= SCE_H_SGML_COMMENT
))) {
714 if (state
== SCE_H_ASPAT
) {
715 aspScript
= segIsScriptingIndicator(styler
,
716 styler
.GetStartSegment(), i
- 1, aspScript
);
718 // Bounce out of any ASP mode
721 classifyWordHTJS(styler
.GetStartSegment(), i
- 1, keywords2
, styler
, inScriptType
);
724 classifyWordHTVB(styler
.GetStartSegment(), i
- 1, keywords3
, styler
, inScriptType
);
727 classifyWordHTPy(styler
.GetStartSegment(), i
- 1, keywords4
, styler
, prevWord
, inScriptType
);
730 classifyWordHTPHP(styler
.GetStartSegment(), i
- 1, keywords5
, styler
);
732 case SCE_H_XCCOMMENT
:
733 styler
.ColourTo(i
- 1, state
);
736 styler
.ColourTo(i
- 1, StateToPrint
);
739 if (scriptLanguage
!= eScriptSGML
) {
744 styler
.ColourTo(i
, SCE_H_ASP
);
745 else if (scriptLanguage
== eScriptXML
)
746 styler
.ColourTo(i
, SCE_H_XMLEND
);
747 else if (scriptLanguage
== eScriptSGML
)
748 styler
.ColourTo(i
, SCE_H_SGML_DEFAULT
);
750 styler
.ColourTo(i
, SCE_H_QUESTION
);
751 state
= beforePreProc
;
752 if (inScriptType
== eNonHtmlScriptPreProc
)
753 inScriptType
= eNonHtmlScript
;
755 inScriptType
= eHtml
;
756 scriptLanguage
= eScriptNone
;
757 // unfold all scripting languages
758 if (foldHTMLPreprocessor
)
762 /////////////////////////////////////
767 // in HTML, fold on tag open and unfold on tag close
769 tagClosing
= (chNext
== '/');
770 styler
.ColourTo(i
- 1, StateToPrint
);
772 state
= SCE_H_TAGUNKNOWN
;
773 } else if (ch
== '&') {
774 styler
.ColourTo(i
- 1, SCE_H_DEFAULT
);
775 state
= SCE_H_ENTITY
;
778 case SCE_H_SGML_DEFAULT
:
779 case SCE_H_SGML_BLOCK_DEFAULT
:
780 // if (scriptLanguage == eScriptSGMLblock)
781 // StateToPrint = SCE_H_SGML_BLOCK_DEFAULT;
784 styler
.ColourTo(i
- 1, StateToPrint
);
785 state
= SCE_H_SGML_DOUBLESTRING
;
786 } else if (ch
== '\'') {
787 styler
.ColourTo(i
- 1, StateToPrint
);
788 state
= SCE_H_SGML_SIMPLESTRING
;
789 } else if ((ch
== '-') && (chPrev
== '-')) {
790 styler
.ColourTo(i
- 2, StateToPrint
);
791 state
= SCE_H_SGML_COMMENT
;
792 } else if (isascii(ch
) && isalpha(ch
) && (chPrev
== '%')) {
793 styler
.ColourTo(i
- 2, StateToPrint
);
794 state
= SCE_H_SGML_ENTITY
;
795 } else if (ch
== '#') {
796 styler
.ColourTo(i
- 1, StateToPrint
);
797 state
= SCE_H_SGML_SPECIAL
;
798 } else if (ch
== '[') {
799 styler
.ColourTo(i
- 1, StateToPrint
);
800 scriptLanguage
= eScriptSGMLblock
;
801 state
= SCE_H_SGML_BLOCK_DEFAULT
;
802 } else if (ch
== ']') {
803 if (scriptLanguage
== eScriptSGMLblock
) {
804 styler
.ColourTo(i
, StateToPrint
);
805 scriptLanguage
= eScriptSGML
;
807 styler
.ColourTo(i
- 1, StateToPrint
);
808 styler
.ColourTo(i
, SCE_H_SGML_ERROR
);
810 state
= SCE_H_SGML_DEFAULT
;
811 } else if (scriptLanguage
== eScriptSGMLblock
) {
812 if ((ch
== '!') && (chPrev
== '<')) {
813 styler
.ColourTo(i
- 2, StateToPrint
);
814 styler
.ColourTo(i
, SCE_H_SGML_DEFAULT
);
815 state
= SCE_H_SGML_COMMAND
;
816 } else if (ch
== '>') {
817 styler
.ColourTo(i
- 1, StateToPrint
);
818 styler
.ColourTo(i
, SCE_H_SGML_DEFAULT
);
822 case SCE_H_SGML_COMMAND
:
823 if ((ch
== '-') && (chPrev
== '-')) {
824 styler
.ColourTo(i
- 2, StateToPrint
);
825 state
= SCE_H_SGML_COMMENT
;
826 } else if (!issgmlwordchar(ch
)) {
827 if (isWordHSGML(styler
.GetStartSegment(), i
- 1, keywords6
, styler
)) {
828 styler
.ColourTo(i
- 1, StateToPrint
);
829 state
= SCE_H_SGML_1ST_PARAM
;
831 state
= SCE_H_SGML_ERROR
;
835 case SCE_H_SGML_1ST_PARAM
:
836 // wait for the beginning of the word
837 if ((ch
== '-') && (chPrev
== '-')) {
838 if (scriptLanguage
== eScriptSGMLblock
) {
839 styler
.ColourTo(i
- 2, SCE_H_SGML_BLOCK_DEFAULT
);
841 styler
.ColourTo(i
- 2, SCE_H_SGML_DEFAULT
);
843 state
= SCE_H_SGML_1ST_PARAM_COMMENT
;
844 } else if (issgmlwordchar(ch
)) {
845 if (scriptLanguage
== eScriptSGMLblock
) {
846 styler
.ColourTo(i
- 1, SCE_H_SGML_BLOCK_DEFAULT
);
848 styler
.ColourTo(i
- 1, SCE_H_SGML_DEFAULT
);
850 // find the length of the word
852 while (ishtmlwordchar(styler
.SafeGetCharAt(i
+ size
)))
854 styler
.ColourTo(i
+ size
- 1, StateToPrint
);
856 visibleChars
+= size
- 1;
857 ch
= styler
.SafeGetCharAt(i
);
858 if (scriptLanguage
== eScriptSGMLblock
) {
859 state
= SCE_H_SGML_BLOCK_DEFAULT
;
861 state
= SCE_H_SGML_DEFAULT
;
866 case SCE_H_SGML_ERROR
:
867 if ((ch
== '-') && (chPrev
== '-')) {
868 styler
.ColourTo(i
- 2, StateToPrint
);
869 state
= SCE_H_SGML_COMMENT
;
871 case SCE_H_SGML_DOUBLESTRING
:
873 styler
.ColourTo(i
, StateToPrint
);
874 state
= SCE_H_SGML_DEFAULT
;
877 case SCE_H_SGML_SIMPLESTRING
:
879 styler
.ColourTo(i
, StateToPrint
);
880 state
= SCE_H_SGML_DEFAULT
;
883 case SCE_H_SGML_COMMENT
:
884 if ((ch
== '-') && (chPrev
== '-')) {
885 styler
.ColourTo(i
, StateToPrint
);
886 state
= SCE_H_SGML_DEFAULT
;
890 if ((chPrev2
== ']') && (chPrev
== ']') && (ch
== '>')) {
891 styler
.ColourTo(i
, StateToPrint
);
892 state
= SCE_H_DEFAULT
;
897 if ((chPrev2
== '-') && (chPrev
== '-') && (ch
== '>')) {
898 styler
.ColourTo(i
, StateToPrint
);
899 state
= SCE_H_DEFAULT
;
903 case SCE_H_SGML_1ST_PARAM_COMMENT
:
904 if ((ch
== '-') && (chPrev
== '-')) {
905 styler
.ColourTo(i
, SCE_H_SGML_COMMENT
);
906 state
= SCE_H_SGML_1ST_PARAM
;
909 case SCE_H_SGML_SPECIAL
:
910 if (!(isascii(ch
) && isupper(ch
))) {
911 styler
.ColourTo(i
- 1, StateToPrint
);
913 state
= SCE_H_SGML_ERROR
;
915 state
= SCE_H_SGML_DEFAULT
;
919 case SCE_H_SGML_ENTITY
:
921 styler
.ColourTo(i
, StateToPrint
);
922 state
= SCE_H_SGML_DEFAULT
;
923 } else if (!(isascii(ch
) && isalnum(ch
)) && ch
!= '-' && ch
!= '.') {
924 styler
.ColourTo(i
, SCE_H_SGML_ERROR
);
925 state
= SCE_H_SGML_DEFAULT
;
930 styler
.ColourTo(i
, StateToPrint
);
931 state
= SCE_H_DEFAULT
;
933 if (ch
!= '#' && !(isascii(ch
) && isalnum(ch
))) { // Should check that '#' follows '&', but it is unlikely anyway...
934 styler
.ColourTo(i
, SCE_H_TAGUNKNOWN
);
935 state
= SCE_H_DEFAULT
;
938 case SCE_H_TAGUNKNOWN
:
939 if (!ishtmlwordchar(ch
) && !((ch
== '/') && (chPrev
== '<')) && ch
!= '[') {
940 int eClass
= classifyTagHTML(styler
.GetStartSegment(),
941 i
- 1, keywords
, styler
, tagDontFold
, caseSensitive
);
942 if (eClass
== SCE_H_SCRIPT
) {
944 inScriptType
= eNonHtmlScript
;
945 scriptLanguage
= clientScript
;
948 scriptLanguage
= eScriptNone
;
953 styler
.ColourTo(i
, eClass
);
954 if (inScriptType
== eNonHtmlScript
) {
955 state
= StateForScript(scriptLanguage
);
957 state
= SCE_H_DEFAULT
;
968 } else if (ch
== '/' && chNext
== '>') {
969 if (eClass
== SCE_H_TAGUNKNOWN
) {
970 styler
.ColourTo(i
+ 1, SCE_H_TAGUNKNOWN
);
972 styler
.ColourTo(i
- 1, StateToPrint
);
973 styler
.ColourTo(i
+ 1, SCE_H_TAGEND
);
977 state
= SCE_H_DEFAULT
;
980 if (eClass
!= SCE_H_TAGUNKNOWN
) {
981 if (eClass
== SCE_H_SGML_DEFAULT
) {
982 state
= SCE_H_SGML_DEFAULT
;
990 case SCE_H_ATTRIBUTE
:
991 if (!ishtmlwordchar(ch
) && ch
!= '/' && ch
!= '-') {
992 if (inScriptType
== eNonHtmlScript
) {
993 int scriptLanguagePrev
= scriptLanguage
;
994 clientScript
= segIsScriptingIndicator(styler
, styler
.GetStartSegment(), i
- 1, scriptLanguage
);
995 scriptLanguage
= clientScript
;
996 if ((scriptLanguagePrev
!= scriptLanguage
) && (scriptLanguage
== eScriptNone
))
997 inScriptType
= eHtml
;
999 classifyAttribHTML(styler
.GetStartSegment(), i
- 1, keywords
, styler
);
1001 styler
.ColourTo(i
, SCE_H_TAG
);
1002 if (inScriptType
== eNonHtmlScript
) {
1003 state
= StateForScript(scriptLanguage
);
1005 state
= SCE_H_DEFAULT
;
1016 } else if (ch
== '=') {
1017 styler
.ColourTo(i
, SCE_H_OTHER
);
1018 state
= SCE_H_VALUE
;
1020 state
= SCE_H_OTHER
;
1026 styler
.ColourTo(i
- 1, StateToPrint
);
1027 styler
.ColourTo(i
, SCE_H_TAG
);
1028 if (inScriptType
== eNonHtmlScript
) {
1029 state
= StateForScript(scriptLanguage
);
1031 state
= SCE_H_DEFAULT
;
1042 } else if (ch
== '\"') {
1043 styler
.ColourTo(i
- 1, StateToPrint
);
1044 state
= SCE_H_DOUBLESTRING
;
1045 } else if (ch
== '\'') {
1046 styler
.ColourTo(i
- 1, StateToPrint
);
1047 state
= SCE_H_SINGLESTRING
;
1048 } else if (ch
== '=') {
1049 styler
.ColourTo(i
, StateToPrint
);
1050 state
= SCE_H_VALUE
;
1051 } else if (ch
== '/' && chNext
== '>') {
1052 styler
.ColourTo(i
- 1, StateToPrint
);
1053 styler
.ColourTo(i
+ 1, SCE_H_TAGEND
);
1056 state
= SCE_H_DEFAULT
;
1058 } else if (ch
== '?' && chNext
== '>') {
1059 styler
.ColourTo(i
- 1, StateToPrint
);
1060 styler
.ColourTo(i
+ 1, SCE_H_XMLEND
);
1063 state
= SCE_H_DEFAULT
;
1064 } else if (ishtmlwordchar(ch
)) {
1065 styler
.ColourTo(i
- 1, StateToPrint
);
1066 state
= SCE_H_ATTRIBUTE
;
1069 case SCE_H_DOUBLESTRING
:
1071 if (inScriptType
== eNonHtmlScript
) {
1072 scriptLanguage
= segIsScriptingIndicator(styler
, styler
.GetStartSegment(), i
, scriptLanguage
);
1074 styler
.ColourTo(i
, SCE_H_DOUBLESTRING
);
1075 state
= SCE_H_OTHER
;
1078 case SCE_H_SINGLESTRING
:
1080 if (inScriptType
== eNonHtmlScript
) {
1081 scriptLanguage
= segIsScriptingIndicator(styler
, styler
.GetStartSegment(), i
, scriptLanguage
);
1083 styler
.ColourTo(i
, SCE_H_SINGLESTRING
);
1084 state
= SCE_H_OTHER
;
1088 if (!ishtmlwordchar(ch
)) {
1089 if (ch
== '\"' && chPrev
== '=') {
1090 // Should really test for being first character
1091 state
= SCE_H_DOUBLESTRING
;
1092 } else if (ch
== '\'' && chPrev
== '=') {
1093 state
= SCE_H_SINGLESTRING
;
1095 if (IsNumber(styler
.GetStartSegment(), styler
)) {
1096 styler
.ColourTo(i
- 1, SCE_H_NUMBER
);
1098 styler
.ColourTo(i
- 1, StateToPrint
);
1101 styler
.ColourTo(i
, SCE_H_TAG
);
1102 if (inScriptType
== eNonHtmlScript
) {
1103 state
= StateForScript(scriptLanguage
);
1105 state
= SCE_H_DEFAULT
;
1117 state
= SCE_H_OTHER
;
1122 case SCE_HJ_DEFAULT
:
1124 case SCE_HJ_SYMBOLS
:
1125 if (iswordstart(ch
)) {
1126 styler
.ColourTo(i
- 1, StateToPrint
);
1127 state
= SCE_HJ_WORD
;
1128 } else if (ch
== '/' && chNext
== '*') {
1129 styler
.ColourTo(i
- 1, StateToPrint
);
1131 state
= SCE_HJ_COMMENTDOC
;
1133 state
= SCE_HJ_COMMENT
;
1134 } else if (ch
== '/' && chNext
== '/') {
1135 styler
.ColourTo(i
- 1, StateToPrint
);
1136 state
= SCE_HJ_COMMENTLINE
;
1137 } else if (ch
== '/' && isOKBeforeRE(chPrevNonWhite
)) {
1138 styler
.ColourTo(i
- 1, StateToPrint
);
1139 state
= SCE_HJ_REGEX
;
1140 } else if (ch
== '\"') {
1141 styler
.ColourTo(i
- 1, StateToPrint
);
1142 state
= SCE_HJ_DOUBLESTRING
;
1143 } else if (ch
== '\'') {
1144 styler
.ColourTo(i
- 1, StateToPrint
);
1145 state
= SCE_HJ_SINGLESTRING
;
1146 } else if ((ch
== '<') && (chNext
== '!') && (chNext2
== '-') &&
1147 styler
.SafeGetCharAt(i
+ 3) == '-') {
1148 styler
.ColourTo(i
- 1, StateToPrint
);
1149 state
= SCE_HJ_COMMENTLINE
;
1150 } else if ((ch
== '-') && (chNext
== '-') && (chNext2
== '>')) {
1151 styler
.ColourTo(i
- 1, StateToPrint
);
1152 state
= SCE_HJ_COMMENTLINE
;
1154 } else if (isoperator(ch
)) {
1155 styler
.ColourTo(i
- 1, StateToPrint
);
1156 styler
.ColourTo(i
, statePrintForState(SCE_HJ_SYMBOLS
, inScriptType
));
1157 state
= SCE_HJ_DEFAULT
;
1158 } else if ((ch
== ' ') || (ch
== '\t')) {
1159 if (state
== SCE_HJ_START
) {
1160 styler
.ColourTo(i
- 1, StateToPrint
);
1161 state
= SCE_HJ_DEFAULT
;
1166 if (!iswordchar(ch
)) {
1167 classifyWordHTJS(styler
.GetStartSegment(), i
- 1, keywords2
, styler
, inScriptType
);
1168 //styler.ColourTo(i - 1, eHTJSKeyword);
1169 state
= SCE_HJ_DEFAULT
;
1170 if (ch
== '/' && chNext
== '*') {
1172 state
= SCE_HJ_COMMENTDOC
;
1174 state
= SCE_HJ_COMMENT
;
1175 } else if (ch
== '/' && chNext
== '/') {
1176 state
= SCE_HJ_COMMENTLINE
;
1177 } else if (ch
== '\"') {
1178 state
= SCE_HJ_DOUBLESTRING
;
1179 } else if (ch
== '\'') {
1180 state
= SCE_HJ_SINGLESTRING
;
1181 } else if ((ch
== '-') && (chNext
== '-') && (chNext2
== '>')) {
1182 styler
.ColourTo(i
- 1, StateToPrint
);
1183 state
= SCE_HJ_COMMENTLINE
;
1185 } else if (isoperator(ch
)) {
1186 styler
.ColourTo(i
, statePrintForState(SCE_HJ_SYMBOLS
, inScriptType
));
1187 state
= SCE_HJ_DEFAULT
;
1191 case SCE_HJ_COMMENT
:
1192 case SCE_HJ_COMMENTDOC
:
1193 if (ch
== '/' && chPrev
== '*') {
1194 styler
.ColourTo(i
, StateToPrint
);
1195 state
= SCE_HJ_DEFAULT
;
1198 case SCE_HJ_COMMENTLINE
:
1199 if (ch
== '\r' || ch
== '\n') {
1200 styler
.ColourTo(i
- 1, statePrintForState(SCE_HJ_COMMENTLINE
, inScriptType
));
1201 state
= SCE_HJ_DEFAULT
;
1204 case SCE_HJ_DOUBLESTRING
:
1206 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1209 } else if (ch
== '\"') {
1210 styler
.ColourTo(i
, statePrintForState(SCE_HJ_DOUBLESTRING
, inScriptType
));
1211 state
= SCE_HJ_DEFAULT
;
1212 } else if ((inScriptType
== eNonHtmlScript
) && (ch
== '-') && (chNext
== '-') && (chNext2
== '>')) {
1213 styler
.ColourTo(i
- 1, StateToPrint
);
1214 state
= SCE_HJ_COMMENTLINE
;
1216 } else if (isLineEnd(ch
)) {
1217 styler
.ColourTo(i
- 1, StateToPrint
);
1218 state
= SCE_HJ_STRINGEOL
;
1221 case SCE_HJ_SINGLESTRING
:
1223 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1226 } else if (ch
== '\'') {
1227 styler
.ColourTo(i
, statePrintForState(SCE_HJ_SINGLESTRING
, inScriptType
));
1228 state
= SCE_HJ_DEFAULT
;
1229 } else if ((inScriptType
== eNonHtmlScript
) && (ch
== '-') && (chNext
== '-') && (chNext2
== '>')) {
1230 styler
.ColourTo(i
- 1, StateToPrint
);
1231 state
= SCE_HJ_COMMENTLINE
;
1233 } else if (isLineEnd(ch
)) {
1234 styler
.ColourTo(i
- 1, StateToPrint
);
1235 state
= SCE_HJ_STRINGEOL
;
1238 case SCE_HJ_STRINGEOL
:
1239 if (!isLineEnd(ch
)) {
1240 styler
.ColourTo(i
- 1, StateToPrint
);
1241 state
= SCE_HJ_DEFAULT
;
1242 } else if (!isLineEnd(chNext
)) {
1243 styler
.ColourTo(i
, StateToPrint
);
1244 state
= SCE_HJ_DEFAULT
;
1248 if (ch
== '\r' || ch
== '\n' || ch
== '/') {
1249 styler
.ColourTo(i
, StateToPrint
);
1250 state
= SCE_HJ_DEFAULT
;
1251 } else if (ch
== '\\') {
1252 // Gobble up the quoted character
1253 if (chNext
== '\\' || chNext
== '/') {
1256 chNext
= styler
.SafeGetCharAt(i
+ 1);
1260 case SCE_HB_DEFAULT
:
1262 if (iswordstart(ch
)) {
1263 styler
.ColourTo(i
- 1, StateToPrint
);
1264 state
= SCE_HB_WORD
;
1265 } else if (ch
== '\'') {
1266 styler
.ColourTo(i
- 1, StateToPrint
);
1267 state
= SCE_HB_COMMENTLINE
;
1268 } else if (ch
== '\"') {
1269 styler
.ColourTo(i
- 1, StateToPrint
);
1270 state
= SCE_HB_STRING
;
1271 } else if ((ch
== '<') && (chNext
== '!') && (chNext2
== '-') &&
1272 styler
.SafeGetCharAt(i
+ 3) == '-') {
1273 styler
.ColourTo(i
- 1, StateToPrint
);
1274 state
= SCE_HB_COMMENTLINE
;
1275 } else if (isoperator(ch
)) {
1276 styler
.ColourTo(i
- 1, StateToPrint
);
1277 styler
.ColourTo(i
, statePrintForState(SCE_HB_DEFAULT
, inScriptType
));
1278 state
= SCE_HB_DEFAULT
;
1279 } else if ((ch
== ' ') || (ch
== '\t')) {
1280 if (state
== SCE_HB_START
) {
1281 styler
.ColourTo(i
- 1, StateToPrint
);
1282 state
= SCE_HB_DEFAULT
;
1287 if (!iswordchar(ch
)) {
1288 state
= classifyWordHTVB(styler
.GetStartSegment(), i
- 1, keywords3
, styler
, inScriptType
);
1289 if (state
== SCE_HB_DEFAULT
) {
1291 state
= SCE_HB_STRING
;
1292 } else if (ch
== '\'') {
1293 state
= SCE_HB_COMMENTLINE
;
1294 } else if (isoperator(ch
)) {
1295 styler
.ColourTo(i
, statePrintForState(SCE_HB_DEFAULT
, inScriptType
));
1296 state
= SCE_HB_DEFAULT
;
1303 styler
.ColourTo(i
, StateToPrint
);
1304 state
= SCE_HB_DEFAULT
;
1305 } else if (ch
== '\r' || ch
== '\n') {
1306 styler
.ColourTo(i
- 1, StateToPrint
);
1307 state
= SCE_HB_STRINGEOL
;
1310 case SCE_HB_COMMENTLINE
:
1311 if (ch
== '\r' || ch
== '\n') {
1312 styler
.ColourTo(i
- 1, StateToPrint
);
1313 state
= SCE_HB_DEFAULT
;
1316 case SCE_HB_STRINGEOL
:
1317 if (!isLineEnd(ch
)) {
1318 styler
.ColourTo(i
- 1, StateToPrint
);
1319 state
= SCE_HB_DEFAULT
;
1320 } else if (!isLineEnd(chNext
)) {
1321 styler
.ColourTo(i
, StateToPrint
);
1322 state
= SCE_HB_DEFAULT
;
1325 case SCE_HP_DEFAULT
:
1327 if (iswordstart(ch
)) {
1328 styler
.ColourTo(i
- 1, StateToPrint
);
1329 state
= SCE_HP_WORD
;
1330 } else if ((ch
== '<') && (chNext
== '!') && (chNext2
== '-') &&
1331 styler
.SafeGetCharAt(i
+ 3) == '-') {
1332 styler
.ColourTo(i
- 1, StateToPrint
);
1333 state
= SCE_HP_COMMENTLINE
;
1334 } else if (ch
== '#') {
1335 styler
.ColourTo(i
- 1, StateToPrint
);
1336 state
= SCE_HP_COMMENTLINE
;
1337 } else if (ch
== '\"') {
1338 styler
.ColourTo(i
- 1, StateToPrint
);
1339 if (chNext
== '\"' && chNext2
== '\"') {
1341 state
= SCE_HP_TRIPLEDOUBLE
;
1344 chNext
= styler
.SafeGetCharAt(i
+ 1);
1346 // state = statePrintForState(SCE_HP_STRING,inScriptType);
1347 state
= SCE_HP_STRING
;
1349 } else if (ch
== '\'') {
1350 styler
.ColourTo(i
- 1, StateToPrint
);
1351 if (chNext
== '\'' && chNext2
== '\'') {
1353 state
= SCE_HP_TRIPLE
;
1356 chNext
= styler
.SafeGetCharAt(i
+ 1);
1358 state
= SCE_HP_CHARACTER
;
1360 } else if (isoperator(ch
)) {
1361 styler
.ColourTo(i
- 1, StateToPrint
);
1362 styler
.ColourTo(i
, statePrintForState(SCE_HP_OPERATOR
, inScriptType
));
1363 } else if ((ch
== ' ') || (ch
== '\t')) {
1364 if (state
== SCE_HP_START
) {
1365 styler
.ColourTo(i
- 1, StateToPrint
);
1366 state
= SCE_HP_DEFAULT
;
1371 if (!iswordchar(ch
)) {
1372 classifyWordHTPy(styler
.GetStartSegment(), i
- 1, keywords4
, styler
, prevWord
, inScriptType
);
1373 state
= SCE_HP_DEFAULT
;
1375 state
= SCE_HP_COMMENTLINE
;
1376 } else if (ch
== '\"') {
1377 if (chNext
== '\"' && chNext2
== '\"') {
1379 state
= SCE_HP_TRIPLEDOUBLE
;
1382 chNext
= styler
.SafeGetCharAt(i
+ 1);
1384 state
= SCE_HP_STRING
;
1386 } else if (ch
== '\'') {
1387 if (chNext
== '\'' && chNext2
== '\'') {
1389 state
= SCE_HP_TRIPLE
;
1392 chNext
= styler
.SafeGetCharAt(i
+ 1);
1394 state
= SCE_HP_CHARACTER
;
1396 } else if (isoperator(ch
)) {
1397 styler
.ColourTo(i
, statePrintForState(SCE_HP_OPERATOR
, inScriptType
));
1401 case SCE_HP_COMMENTLINE
:
1402 if (ch
== '\r' || ch
== '\n') {
1403 styler
.ColourTo(i
- 1, StateToPrint
);
1404 state
= SCE_HP_DEFAULT
;
1409 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1412 chNext
= styler
.SafeGetCharAt(i
+ 1);
1414 } else if (ch
== '\"') {
1415 styler
.ColourTo(i
, StateToPrint
);
1416 state
= SCE_HP_DEFAULT
;
1419 case SCE_HP_CHARACTER
:
1421 if (chNext
== '\"' || chNext
== '\'' || chNext
== '\\') {
1424 chNext
= styler
.SafeGetCharAt(i
+ 1);
1426 } else if (ch
== '\'') {
1427 styler
.ColourTo(i
, StateToPrint
);
1428 state
= SCE_HP_DEFAULT
;
1432 if (ch
== '\'' && chPrev
== '\'' && chPrev2
== '\'') {
1433 styler
.ColourTo(i
, StateToPrint
);
1434 state
= SCE_HP_DEFAULT
;
1437 case SCE_HP_TRIPLEDOUBLE
:
1438 if (ch
== '\"' && chPrev
== '\"' && chPrev2
== '\"') {
1439 styler
.ColourTo(i
, StateToPrint
);
1440 state
= SCE_HP_DEFAULT
;
1443 ///////////// start - PHP state handling
1445 if (!iswordchar(ch
)) {
1446 classifyWordHTPHP(styler
.GetStartSegment(), i
- 1, keywords5
, styler
);
1447 if (ch
== '/' && chNext
== '*') {
1449 state
= SCE_HPHP_COMMENT
;
1450 } else if (ch
== '/' && chNext
== '/') {
1452 state
= SCE_HPHP_COMMENTLINE
;
1453 } else if (ch
== '#') {
1454 state
= SCE_HPHP_COMMENTLINE
;
1455 } else if (ch
== '\"') {
1456 state
= SCE_HPHP_HSTRING
;
1457 } else if (ch
== '\'') {
1458 state
= SCE_HPHP_SIMPLESTRING
;
1459 } else if (ch
== '$' && IsPhpWordStart(chNext
)) {
1460 state
= SCE_HPHP_VARIABLE
;
1461 } else if (isoperator(ch
)) {
1462 state
= SCE_HPHP_OPERATOR
;
1464 state
= SCE_HPHP_DEFAULT
;
1468 case SCE_HPHP_NUMBER
:
1469 if (!IsADigit(ch
)) {
1470 styler
.ColourTo(i
- 1, SCE_HPHP_NUMBER
);
1472 state
= SCE_HPHP_OPERATOR
;
1474 state
= SCE_HPHP_DEFAULT
;
1477 case SCE_HPHP_VARIABLE
:
1478 if (!IsPhpWordChar(ch
)) {
1479 styler
.ColourTo(i
- 1, SCE_HPHP_VARIABLE
);
1481 state
= SCE_HPHP_OPERATOR
;
1483 state
= SCE_HPHP_DEFAULT
;
1486 case SCE_HPHP_COMMENT
:
1487 if (ch
== '/' && chPrev
== '*') {
1488 styler
.ColourTo(i
, StateToPrint
);
1489 state
= SCE_HPHP_DEFAULT
;
1492 case SCE_HPHP_COMMENTLINE
:
1493 if (ch
== '\r' || ch
== '\n') {
1494 styler
.ColourTo(i
- 1, StateToPrint
);
1495 state
= SCE_HPHP_DEFAULT
;
1498 case SCE_HPHP_HSTRING
:
1500 // skip the next char
1502 } else if (ch
== '$' && IsPhpWordStart(chNext
)) {
1503 styler
.ColourTo(i
- 1, StateToPrint
);
1504 state
= SCE_HPHP_HSTRING_VARIABLE
;
1505 } else if (ch
== '\"') {
1506 styler
.ColourTo(i
, StateToPrint
);
1507 state
= SCE_HPHP_DEFAULT
;
1510 case SCE_HPHP_SIMPLESTRING
:
1512 // skip the next char
1514 } else if (ch
== '\'') {
1515 styler
.ColourTo(i
, StateToPrint
);
1516 state
= SCE_HPHP_DEFAULT
;
1519 case SCE_HPHP_HSTRING_VARIABLE
:
1520 if (!IsPhpWordChar(ch
)) {
1521 styler
.ColourTo(i
- 1, StateToPrint
);
1522 i
--; // strange but it works
1523 state
= SCE_HPHP_HSTRING
;
1526 case SCE_HPHP_OPERATOR
:
1527 case SCE_HPHP_DEFAULT
:
1528 styler
.ColourTo(i
- 1, StateToPrint
);
1530 state
= SCE_HPHP_NUMBER
;
1531 } else if (iswordstart(ch
)) {
1532 state
= SCE_HPHP_WORD
;
1533 } else if (ch
== '/' && chNext
== '*') {
1535 state
= SCE_HPHP_COMMENT
;
1536 } else if (ch
== '/' && chNext
== '/') {
1538 state
= SCE_HPHP_COMMENTLINE
;
1539 } else if (ch
== '#') {
1540 state
= SCE_HPHP_COMMENTLINE
;
1541 } else if (ch
== '\"') {
1542 state
= SCE_HPHP_HSTRING
;
1543 } else if (ch
== '\'') {
1544 state
= SCE_HPHP_SIMPLESTRING
;
1545 } else if (ch
== '$' && IsPhpWordStart(chNext
)) {
1546 state
= SCE_HPHP_VARIABLE
;
1547 } else if (isoperator(ch
)) {
1548 state
= SCE_HPHP_OPERATOR
;
1549 } else if ((state
== SCE_HPHP_OPERATOR
) && (isspacechar(ch
))) {
1550 state
= SCE_HPHP_DEFAULT
;
1553 ///////////// end - PHP state handling
1556 // Some of the above terminated their lexeme but since the same character starts
1557 // the same class again, only reenter if non empty segment.
1559 bool nonEmptySegment
= i
>= static_cast<int>(styler
.GetStartSegment());
1560 if (state
== SCE_HB_DEFAULT
) { // One of the above succeeded
1561 if ((ch
== '\"') && (nonEmptySegment
)) {
1562 state
= SCE_HB_STRING
;
1563 } else if (ch
== '\'') {
1564 state
= SCE_HB_COMMENTLINE
;
1565 } else if (iswordstart(ch
)) {
1566 state
= SCE_HB_WORD
;
1567 } else if (isoperator(ch
)) {
1568 styler
.ColourTo(i
, SCE_HB_DEFAULT
);
1570 } else if (state
== SCE_HBA_DEFAULT
) { // One of the above succeeded
1571 if ((ch
== '\"') && (nonEmptySegment
)) {
1572 state
= SCE_HBA_STRING
;
1573 } else if (ch
== '\'') {
1574 state
= SCE_HBA_COMMENTLINE
;
1575 } else if (iswordstart(ch
)) {
1576 state
= SCE_HBA_WORD
;
1577 } else if (isoperator(ch
)) {
1578 styler
.ColourTo(i
, SCE_HBA_DEFAULT
);
1580 } else if (state
== SCE_HJ_DEFAULT
) { // One of the above succeeded
1581 if (ch
== '/' && chNext
== '*') {
1582 if (styler
.SafeGetCharAt(i
+ 2) == '*')
1583 state
= SCE_HJ_COMMENTDOC
;
1585 state
= SCE_HJ_COMMENT
;
1586 } else if (ch
== '/' && chNext
== '/') {
1587 state
= SCE_HJ_COMMENTLINE
;
1588 } else if ((ch
== '\"') && (nonEmptySegment
)) {
1589 state
= SCE_HJ_DOUBLESTRING
;
1590 } else if ((ch
== '\'') && (nonEmptySegment
)) {
1591 state
= SCE_HJ_SINGLESTRING
;
1592 } else if (iswordstart(ch
)) {
1593 state
= SCE_HJ_WORD
;
1594 } else if (isoperator(ch
)) {
1595 styler
.ColourTo(i
, statePrintForState(SCE_HJ_SYMBOLS
, inScriptType
));
1600 StateToPrint
= statePrintForState(state
, inScriptType
);
1601 styler
.ColourTo(lengthDoc
- 1, StateToPrint
);
1603 // Fill in the real level of the next line, keeping the current flags as they will be filled in later
1605 int flagsNext
= styler
.LevelAt(lineCurrent
) & ~SC_FOLDLEVELNUMBERMASK
;
1606 styler
.SetLevel(lineCurrent
, levelPrev
| flagsNext
);
1610 static bool isASPScript(int state
) {
1612 (state
>= SCE_HJA_START
&& state
<= SCE_HJA_REGEX
) ||
1613 (state
>= SCE_HBA_START
&& state
<= SCE_HBA_STRINGEOL
) ||
1614 (state
>= SCE_HPA_DEFAULT
&& state
<= SCE_HPA_IDENTIFIER
);
1617 static void ColouriseHBAPiece(StyleContext
&sc
, WordList
*keywordlists
[]) {
1618 WordList
&keywordsVBS
= *keywordlists
[2];
1619 if (sc
.state
== SCE_HBA_WORD
) {
1620 if (!IsAWordChar(sc
.ch
)) {
1622 sc
.GetCurrentLowered(s
, sizeof(s
));
1623 if (keywordsVBS
.InList(s
)) {
1624 if (strcmp(s
, "rem") == 0) {
1625 sc
.ChangeState(SCE_HBA_COMMENTLINE
);
1627 sc
.SetState(SCE_HBA_DEFAULT
);
1630 sc
.SetState(SCE_HBA_DEFAULT
);
1633 sc
.ChangeState(SCE_HBA_IDENTIFIER
);
1634 sc
.SetState(SCE_HBA_DEFAULT
);
1637 } else if (sc
.state
== SCE_HBA_NUMBER
) {
1638 if (!IsAWordChar(sc
.ch
)) {
1639 sc
.SetState(SCE_HBA_DEFAULT
);
1641 } else if (sc
.state
== SCE_HBA_STRING
) {
1642 if (sc
.ch
== '\"') {
1643 sc
.ForwardSetState(SCE_HBA_DEFAULT
);
1644 } else if (sc
.ch
== '\r' || sc
.ch
== '\n') {
1645 sc
.ChangeState(SCE_HBA_STRINGEOL
);
1646 sc
.ForwardSetState(SCE_HBA_DEFAULT
);
1648 } else if (sc
.state
== SCE_HBA_COMMENTLINE
) {
1649 if (sc
.ch
== '\r' || sc
.ch
== '\n') {
1650 sc
.SetState(SCE_HBA_DEFAULT
);
1654 if (sc
.state
== SCE_HBA_DEFAULT
) {
1655 if (IsADigit(sc
.ch
) || (sc
.ch
== '.' && IsADigit(sc
.chNext
))) {
1656 sc
.SetState(SCE_HBA_NUMBER
);
1657 } else if (IsAWordStart(sc
.ch
)) {
1658 sc
.SetState(SCE_HBA_WORD
);
1659 } else if (sc
.ch
== '\'') {
1660 sc
.SetState(SCE_HBA_COMMENTLINE
);
1661 } else if (sc
.ch
== '\"') {
1662 sc
.SetState(SCE_HBA_STRING
);
1667 static void ColouriseHTMLPiece(StyleContext
&sc
, WordList
*keywordlists
[]) {
1668 WordList
&keywordsTags
= *keywordlists
[0];
1669 if (sc
.state
== SCE_H_COMMENT
) {
1670 if (sc
.Match("-->")) {
1673 sc
.ForwardSetState(SCE_H_DEFAULT
);
1675 } else if (sc
.state
== SCE_H_ENTITY
) {
1677 sc
.ForwardSetState(SCE_H_DEFAULT
);
1678 } else if (sc
.ch
!= '#' && (sc
.ch
< 0x80) && !isalnum(sc
.ch
)) { // Should check that '#' follows '&', but it is unlikely anyway...
1679 sc
.ChangeState(SCE_H_TAGUNKNOWN
);
1680 sc
.SetState(SCE_H_DEFAULT
);
1682 } else if (sc
.state
== SCE_H_TAGUNKNOWN
) {
1683 if (!ishtmlwordchar(static_cast<char>(sc
.ch
)) && !((sc
.ch
== '/') && (sc
.chPrev
== '<')) && sc
.ch
!= '[') {
1685 sc
.GetCurrentLowered(s
, sizeof(s
));
1687 if (keywordsTags
.InList(s
+ 2)) {
1688 sc
.ChangeState(SCE_H_TAG
);
1691 if (keywordsTags
.InList(s
+ 1)) {
1692 sc
.ChangeState(SCE_H_TAG
);
1696 sc
.ForwardSetState(SCE_H_DEFAULT
);
1697 } else if (sc
.Match('/', '>')) {
1698 sc
.SetState(SCE_H_TAGEND
);
1700 sc
.ForwardSetState(SCE_H_DEFAULT
);
1702 sc
.SetState(SCE_H_OTHER
);
1705 } else if (sc
.state
== SCE_H_ATTRIBUTE
) {
1706 if (!ishtmlwordchar(static_cast<char>(sc
.ch
))) {
1708 sc
.GetCurrentLowered(s
, sizeof(s
));
1709 if (!keywordsTags
.InList(s
)) {
1710 sc
.ChangeState(SCE_H_ATTRIBUTEUNKNOWN
);
1712 sc
.SetState(SCE_H_OTHER
);
1714 } else if (sc
.state
== SCE_H_OTHER
) {
1716 sc
.SetState(SCE_H_TAG
);
1717 sc
.ForwardSetState(SCE_H_DEFAULT
);
1718 } else if (sc
.Match('/', '>')) {
1719 sc
.SetState(SCE_H_TAG
);
1721 sc
.ForwardSetState(SCE_H_DEFAULT
);
1722 } else if (sc
.chPrev
== '=') {
1723 sc
.SetState(SCE_H_VALUE
);
1725 } else if (sc
.state
== SCE_H_DOUBLESTRING
) {
1726 if (sc
.ch
== '\"') {
1727 sc
.ForwardSetState(SCE_H_OTHER
);
1729 } else if (sc
.state
== SCE_H_SINGLESTRING
) {
1730 if (sc
.ch
== '\'') {
1731 sc
.ForwardSetState(SCE_H_OTHER
);
1733 } else if (sc
.state
== SCE_H_NUMBER
) {
1734 if (!IsADigit(sc
.ch
)) {
1735 sc
.SetState(SCE_H_OTHER
);
1739 if (sc
.state
== SCE_H_DEFAULT
) {
1741 if (sc
.Match("<!--"))
1742 sc
.SetState(SCE_H_COMMENT
);
1744 sc
.SetState(SCE_H_TAGUNKNOWN
);
1745 } else if (sc
.ch
== '&') {
1746 sc
.SetState(SCE_H_ENTITY
);
1748 } else if ((sc
.state
== SCE_H_OTHER
) || (sc
.state
== SCE_H_VALUE
)) {
1749 if (sc
.ch
== '\"' && sc
.chPrev
== '=') {
1750 sc
.SetState(SCE_H_DOUBLESTRING
);
1751 } else if (sc
.ch
== '\'' && sc
.chPrev
== '=') {
1752 sc
.SetState(SCE_H_SINGLESTRING
);
1753 } else if (IsADigit(sc
.ch
)) {
1754 sc
.SetState(SCE_H_NUMBER
);
1755 } else if (sc
.ch
== '>') {
1756 sc
.SetState(SCE_H_TAG
);
1757 sc
.ForwardSetState(SCE_H_DEFAULT
);
1758 } else if (ishtmlwordchar(static_cast<char>(sc
.ch
))) {
1759 sc
.SetState(SCE_H_ATTRIBUTE
);
1764 static void ColouriseASPPiece(StyleContext
&sc
, WordList
*keywordlists
[]) {
1765 // Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT
1766 if ((sc
.state
== SCE_H_ASPAT
|| isASPScript(sc
.state
)) && sc
.Match('%', '>')) {
1767 sc
.SetState(SCE_H_ASP
);
1769 sc
.ForwardSetState(SCE_H_DEFAULT
);
1772 // Handle some ASP script
1773 if (sc
.state
>= SCE_HBA_START
&& sc
.state
<= SCE_HBA_STRINGEOL
) {
1774 ColouriseHBAPiece(sc
, keywordlists
);
1775 } else if (sc
.state
>= SCE_H_DEFAULT
&& sc
.state
<= SCE_H_SGML_BLOCK_DEFAULT
) {
1776 ColouriseHTMLPiece(sc
, keywordlists
);
1779 // Enter new sc.state
1780 if ((sc
.state
== SCE_H_DEFAULT
) || (sc
.state
== SCE_H_TAGUNKNOWN
)) {
1781 if (sc
.Match('<', '%')) {
1782 if (sc
.state
== SCE_H_TAGUNKNOWN
)
1783 sc
.ChangeState(SCE_H_ASP
);
1785 sc
.SetState(SCE_H_ASP
);
1789 sc
.ForwardSetState(SCE_H_ASPAT
);
1794 sc
.SetState(SCE_HBA_DEFAULT
);
1800 static void ColouriseASPDoc(unsigned int startPos
, int length
, int initStyle
, WordList
*keywordlists
[],
1802 // Lexer for HTML requires more lexical states (7 bits worth) than most lexers
1803 StyleContext
sc(startPos
, length
, initStyle
, styler
, 0x7f);
1804 for (; sc
.More(); sc
.Forward()) {
1805 ColouriseASPPiece(sc
, keywordlists
);
1810 static void ColourisePHPPiece(StyleContext
&sc
, WordList
*keywordlists
[]) {
1811 // Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT
1812 if (sc
.state
>= SCE_HPHP_DEFAULT
&& sc
.state
<= SCE_HPHP_OPERATOR
) {
1813 if (!isPHPStringState(sc
.state
) &&
1814 (sc
.state
!= SCE_HPHP_COMMENT
) &&
1815 (sc
.Match('?', '>'))) {
1816 sc
.SetState(SCE_H_QUESTION
);
1818 sc
.ForwardSetState(SCE_H_DEFAULT
);
1822 if (sc
.state
>= SCE_H_DEFAULT
&& sc
.state
<= SCE_H_SGML_BLOCK_DEFAULT
) {
1823 ColouriseHTMLPiece(sc
, keywordlists
);
1826 // Handle some PHP script
1827 if (sc
.state
== SCE_HPHP_WORD
) {
1828 if (!IsPhpWordChar(static_cast<char>(sc
.ch
))) {
1829 sc
.SetState(SCE_HPHP_DEFAULT
);
1831 } else if (sc
.state
== SCE_HPHP_COMMENTLINE
) {
1832 if (sc
.ch
== '\r' || sc
.ch
== '\n') {
1833 sc
.SetState(SCE_HPHP_DEFAULT
);
1835 } else if (sc
.state
== SCE_HPHP_COMMENT
) {
1836 if (sc
.Match('*', '/')) {
1839 sc
.SetState(SCE_HPHP_DEFAULT
);
1841 } else if (sc
.state
== SCE_HPHP_HSTRING
) {
1842 if (sc
.ch
== '\"') {
1843 sc
.ForwardSetState(SCE_HPHP_DEFAULT
);
1845 } else if (sc
.state
== SCE_HPHP_SIMPLESTRING
) {
1846 if (sc
.ch
== '\'') {
1847 sc
.ForwardSetState(SCE_HPHP_DEFAULT
);
1849 } else if (sc
.state
== SCE_HPHP_VARIABLE
) {
1850 if (!IsPhpWordChar(static_cast<char>(sc
.ch
))) {
1851 sc
.SetState(SCE_HPHP_DEFAULT
);
1853 } else if (sc
.state
== SCE_HPHP_OPERATOR
) {
1854 sc
.SetState(SCE_HPHP_DEFAULT
);
1857 // Enter new sc.state
1858 if ((sc
.state
== SCE_H_DEFAULT
) || (sc
.state
== SCE_H_TAGUNKNOWN
)) {
1859 if (sc
.Match("<?php")) {
1860 sc
.SetState(SCE_H_QUESTION
);
1866 sc
.SetState(SCE_HPHP_DEFAULT
);
1869 if (sc
.state
== SCE_HPHP_DEFAULT
) {
1870 if (IsPhpWordStart(static_cast<char>(sc
.ch
))) {
1871 sc
.SetState(SCE_HPHP_WORD
);
1872 } else if (sc
.ch
== '#') {
1873 sc
.SetState(SCE_HPHP_COMMENTLINE
);
1874 } else if (sc
.Match("<!--")) {
1875 sc
.SetState(SCE_HPHP_COMMENTLINE
);
1876 } else if (sc
.Match('/', '/')) {
1877 sc
.SetState(SCE_HPHP_COMMENTLINE
);
1878 } else if (sc
.Match('/', '*')) {
1879 sc
.SetState(SCE_HPHP_COMMENT
);
1880 } else if (sc
.ch
== '\"') {
1881 sc
.SetState(SCE_HPHP_HSTRING
);
1882 } else if (sc
.ch
== '\'') {
1883 sc
.SetState(SCE_HPHP_SIMPLESTRING
);
1884 } else if (sc
.ch
== '$' && IsPhpWordStart(static_cast<char>(sc
.chNext
))) {
1885 sc
.SetState(SCE_HPHP_VARIABLE
);
1886 } else if (isoperator(static_cast<char>(sc
.ch
))) {
1887 sc
.SetState(SCE_HPHP_OPERATOR
);
1892 static void ColourisePHPDoc(unsigned int startPos
, int length
, int initStyle
, WordList
*keywordlists
[],
1894 // Lexer for HTML requires more lexical states (7 bits worth) than most lexers
1895 StyleContext
sc(startPos
, length
, initStyle
, styler
, 0x7f);
1896 for (; sc
.More(); sc
.Forward()) {
1897 ColourisePHPPiece(sc
, keywordlists
);
1902 static const char * const htmlWordListDesc
[] = {
1903 "HTML elements and attributes",
1904 "JavaScript keywords",
1905 "VBScript keywords",
1908 "SGML and DTD keywords",
1912 LexerModule
lmHTML(SCLEX_HTML
, ColouriseHyperTextDoc
, "hypertext", 0, htmlWordListDesc
);
1913 LexerModule
lmXML(SCLEX_XML
, ColouriseHyperTextDoc
, "xml", 0, htmlWordListDesc
);
1914 LexerModule
lmASP(SCLEX_ASP
, ColouriseASPDoc
, "asp", 0, htmlWordListDesc
);
1915 LexerModule
lmPHP(SCLEX_PHP
, ColourisePHPDoc
, "php", 0, htmlWordListDesc
);