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
);