OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / LexHTML.cxx
diff --git a/ext/scintilla/src/LexHTML.cxx b/ext/scintilla/src/LexHTML.cxx
new file mode 100644 (file)
index 0000000..20ce6fd
--- /dev/null
@@ -0,0 +1,2184 @@
+// Scintilla source code edit control\r
+/** @file LexHTML.cxx\r
+ ** Lexer for HTML.\r
+ **/\r
+// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>\r
+// The License.txt file describes the conditions under which this software may be distributed.\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+\r
+#include "Platform.h"\r
+\r
+#include "PropSet.h"\r
+#include "Accessor.h"\r
+#include "StyleContext.h"\r
+#include "KeyWords.h"\r
+#include "Scintilla.h"\r
+#include "SciLexer.h"\r
+#include "CharacterSet.h"\r
+\r
+#ifdef SCI_NAMESPACE\r
+using namespace Scintilla;\r
+#endif\r
+\r
+#define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START)\r
+#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START)\r
+#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START)\r
+\r
+enum script_type { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock, eScriptComment };\r
+enum script_mode { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc };\r
+\r
+static inline bool IsAWordChar(const int ch) {\r
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');\r
+}\r
+\r
+static inline bool IsAWordStart(const int ch) {\r
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');\r
+}\r
+\r
+inline bool IsOperator(int ch) {\r
+       if (isascii(ch) && isalnum(ch))\r
+               return false;\r
+       // '.' left out as it is used to make up numbers\r
+       if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||\r
+               ch == '(' || ch == ')' || ch == '-' || ch == '+' ||\r
+               ch == '=' || ch == '|' || ch == '{' || ch == '}' ||\r
+               ch == '[' || ch == ']' || ch == ':' || ch == ';' ||\r
+               ch == '<' || ch == '>' || ch == ',' || ch == '/' ||\r
+               ch == '?' || ch == '!' || ch == '.' || ch == '~')\r
+               return true;\r
+       return false;\r
+}\r
+\r
+static inline int MakeLowerCase(int ch) {\r
+       if (ch < 'A' || ch > 'Z')\r
+               return ch;\r
+       else\r
+               return ch - 'A' + 'a';\r
+}\r
+\r
+static void GetTextSegment(Accessor &styler, unsigned int start, unsigned int end, char *s, size_t len) {\r
+       size_t i = 0;\r
+       for (; (i < end - start + 1) && (i < len-1); i++) {\r
+               s[i] = static_cast<char>(MakeLowerCase(styler[start + i]));\r
+       }\r
+       s[i] = '\0';\r
+}\r
+\r
+static script_type segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, script_type prevValue) {\r
+       char s[100];\r
+       GetTextSegment(styler, start, end, s, sizeof(s));\r
+       //Platform::DebugPrintf("Scripting indicator [%s]\n", s);\r
+       if (strstr(s, "src"))   // External script\r
+               return eScriptNone;\r
+       if (strstr(s, "vbs"))\r
+               return eScriptVBS;\r
+       if (strstr(s, "pyth"))\r
+               return eScriptPython;\r
+       if (strstr(s, "javas"))\r
+               return eScriptJS;\r
+       if (strstr(s, "jscr"))\r
+               return eScriptJS;\r
+       if (strstr(s, "php"))\r
+               return eScriptPHP;\r
+       if (strstr(s, "xml")) {\r
+               const char *xml = strstr(s, "xml");\r
+               for (const char *t=s; t<xml; t++) {\r
+                       if (!IsASpace(*t)) {\r
+                               return prevValue;\r
+                       }\r
+               }\r
+               return eScriptXML;\r
+       }\r
+\r
+       return prevValue;\r
+}\r
+\r
+static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) {\r
+       int iResult = 0;\r
+       char s[100];\r
+       GetTextSegment(styler, start, end, s, sizeof(s));\r
+       if (0 == strncmp(s, "php", 3)) {\r
+               iResult = 3;\r
+       }\r
+\r
+       return iResult;\r
+}\r
+\r
+static script_type ScriptOfState(int state) {\r
+       if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {\r
+               return eScriptPython;\r
+       } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {\r
+               return eScriptVBS;\r
+       } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {\r
+               return eScriptJS;\r
+       } else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {\r
+               return eScriptPHP;\r
+       } else if ((state >= SCE_H_SGML_DEFAULT) && (state < SCE_H_SGML_BLOCK_DEFAULT)) {\r
+               return eScriptSGML;\r
+       } else if (state == SCE_H_SGML_BLOCK_DEFAULT) {\r
+               return eScriptSGMLblock;\r
+       } else {\r
+               return eScriptNone;\r
+       }\r
+}\r
+\r
+static int statePrintForState(int state, script_mode inScriptType) {\r
+       int StateToPrint = state;\r
+\r
+       if (state >= SCE_HJ_START) {\r
+               if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {\r
+                       StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_PYTHON);\r
+               } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {\r
+                       StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_VBS);\r
+               } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {\r
+                       StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_JS);\r
+               }\r
+       }\r
+\r
+       return StateToPrint;\r
+}\r
+\r
+static int stateForPrintState(int StateToPrint) {\r
+       int state;\r
+\r
+       if ((StateToPrint >= SCE_HPA_START) && (StateToPrint <= SCE_HPA_IDENTIFIER)) {\r
+               state = StateToPrint - SCE_HA_PYTHON;\r
+       } else if ((StateToPrint >= SCE_HBA_START) && (StateToPrint <= SCE_HBA_STRINGEOL)) {\r
+               state = StateToPrint - SCE_HA_VBS;\r
+       } else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_REGEX)) {\r
+               state = StateToPrint - SCE_HA_JS;\r
+       } else {\r
+               state = StateToPrint;\r
+       }\r
+\r
+       return state;\r
+}\r
+\r
+static inline bool IsNumber(unsigned int start, Accessor &styler) {\r
+       return IsADigit(styler[start]) || (styler[start] == '.') ||\r
+              (styler[start] == '-') || (styler[start] == '#');\r
+}\r
+\r
+static inline bool isStringState(int state) {\r
+       bool bResult;\r
+\r
+       switch (state) {\r
+       case SCE_HJ_DOUBLESTRING:\r
+       case SCE_HJ_SINGLESTRING:\r
+       case SCE_HJA_DOUBLESTRING:\r
+       case SCE_HJA_SINGLESTRING:\r
+       case SCE_HB_STRING:\r
+       case SCE_HBA_STRING:\r
+       case SCE_HP_STRING:\r
+       case SCE_HP_CHARACTER:\r
+       case SCE_HP_TRIPLE:\r
+       case SCE_HP_TRIPLEDOUBLE:\r
+       case SCE_HPA_STRING:\r
+       case SCE_HPA_CHARACTER:\r
+       case SCE_HPA_TRIPLE:\r
+       case SCE_HPA_TRIPLEDOUBLE:\r
+       case SCE_HPHP_HSTRING:\r
+       case SCE_HPHP_SIMPLESTRING:\r
+       case SCE_HPHP_HSTRING_VARIABLE:\r
+       case SCE_HPHP_COMPLEX_VARIABLE:\r
+               bResult = true;\r
+               break;\r
+       default :\r
+               bResult = false;\r
+               break;\r
+       }\r
+       return bResult;\r
+}\r
+\r
+static inline bool stateAllowsTermination(int state) {\r
+       bool allowTermination = !isStringState(state);\r
+       if (allowTermination) {\r
+               switch (state) {\r
+               case SCE_HB_COMMENTLINE:\r
+               case SCE_HPHP_COMMENT:\r
+               case SCE_HP_COMMENTLINE:\r
+               case SCE_HPA_COMMENTLINE:\r
+                       allowTermination = false;\r
+               }\r
+       }\r
+       return allowTermination;\r
+}\r
+\r
+// not really well done, since it's only comments that should lex the %> and <%\r
+static inline bool isCommentASPState(int state) {\r
+       bool bResult;\r
+\r
+       switch (state) {\r
+       case SCE_HJ_COMMENT:\r
+       case SCE_HJ_COMMENTLINE:\r
+       case SCE_HJ_COMMENTDOC:\r
+       case SCE_HB_COMMENTLINE:\r
+       case SCE_HP_COMMENTLINE:\r
+       case SCE_HPHP_COMMENT:\r
+       case SCE_HPHP_COMMENTLINE:\r
+               bResult = true;\r
+               break;\r
+       default :\r
+               bResult = false;\r
+               break;\r
+       }\r
+       return bResult;\r
+}\r
+\r
+static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\r
+       bool wordIsNumber = IsNumber(start, styler);\r
+       char chAttr = SCE_H_ATTRIBUTEUNKNOWN;\r
+       if (wordIsNumber) {\r
+               chAttr = SCE_H_NUMBER;\r
+       } else {\r
+               char s[100];\r
+               GetTextSegment(styler, start, end, s, sizeof(s));\r
+               if (keywords.InList(s))\r
+                       chAttr = SCE_H_ATTRIBUTE;\r
+       }\r
+       if ((chAttr == SCE_H_ATTRIBUTEUNKNOWN) && !keywords)\r
+               // No keywords -> all are known\r
+               chAttr = SCE_H_ATTRIBUTE;\r
+       styler.ColourTo(end, chAttr);\r
+}\r
+\r
+static int classifyTagHTML(unsigned int start, unsigned int end,\r
+                           WordList &keywords, Accessor &styler, bool &tagDontFold,\r
+                          bool caseSensitive, bool isXml, bool allowScripts) {\r
+       char s[30 + 2];\r
+       // Copy after the '<'\r
+       unsigned int i = 0;\r
+       for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) {\r
+               char ch = styler[cPos];\r
+               if ((ch != '<') && (ch != '/')) {\r
+                       s[i++] = caseSensitive ? ch : static_cast<char>(MakeLowerCase(ch));\r
+               }\r
+       }\r
+\r
+       //The following is only a quick hack, to see if this whole thing would work\r
+       //we first need the tagname with a trailing space...\r
+       s[i] = ' ';\r
+       s[i+1] = '\0';\r
+\r
+       // if the current language is XML, I can fold any tag\r
+       // if the current language is HTML, I don't want to fold certain tags (input, meta, etc.)\r
+       //...to find it in the list of no-container-tags\r
+       tagDontFold = (!isXml) && (NULL != strstr("meta link img area br hr input ", s));\r
+\r
+       //now we can remove the trailing space\r
+       s[i] = '\0';\r
+\r
+       // No keywords -> all are known\r
+       // Name of a closing tag starts at s + 1\r
+       char chAttr = SCE_H_TAGUNKNOWN;\r
+       if (s[0] == '!') {\r
+               chAttr = SCE_H_SGML_DEFAULT;\r
+       } else if (!keywords || keywords.InList(s[0] == '/' ? s + 1 : s)) {\r
+               chAttr = SCE_H_TAG;\r
+       }\r
+       styler.ColourTo(end, chAttr);\r
+       if (chAttr == SCE_H_TAG) {\r
+               if (allowScripts && 0 == strcmp(s, "script")) {\r
+                       chAttr = SCE_H_SCRIPT;\r
+               } else if (!isXml && 0 == strcmp(s, "comment")) {\r
+                       chAttr = SCE_H_COMMENT;\r
+               }\r
+       }\r
+       return chAttr;\r
+}\r
+\r
+static void classifyWordHTJS(unsigned int start, unsigned int end,\r
+                             WordList &keywords, Accessor &styler, script_mode inScriptType) {\r
+       char chAttr = SCE_HJ_WORD;\r
+       bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.');\r
+       if (wordIsNumber)\r
+               chAttr = SCE_HJ_NUMBER;\r
+       else {\r
+               char s[30 + 1];\r
+               unsigned int i = 0;\r
+               for (; i < end - start + 1 && i < 30; i++) {\r
+                       s[i] = styler[start + i];\r
+               }\r
+               s[i] = '\0';\r
+               if (keywords.InList(s))\r
+                       chAttr = SCE_HJ_KEYWORD;\r
+       }\r
+       styler.ColourTo(end, statePrintForState(chAttr, inScriptType));\r
+}\r
+\r
+static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, script_mode inScriptType) {\r
+       char chAttr = SCE_HB_IDENTIFIER;\r
+       bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.');\r
+       if (wordIsNumber)\r
+               chAttr = SCE_HB_NUMBER;\r
+       else {\r
+               char s[100];\r
+               GetTextSegment(styler, start, end, s, sizeof(s));\r
+               if (keywords.InList(s)) {\r
+                       chAttr = SCE_HB_WORD;\r
+                       if (strcmp(s, "rem") == 0)\r
+                               chAttr = SCE_HB_COMMENTLINE;\r
+               }\r
+       }\r
+       styler.ColourTo(end, statePrintForState(chAttr, inScriptType));\r
+       if (chAttr == SCE_HB_COMMENTLINE)\r
+               return SCE_HB_COMMENTLINE;\r
+       else\r
+               return SCE_HB_DEFAULT;\r
+}\r
+\r
+static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, script_mode inScriptType) {\r
+       bool wordIsNumber = IsADigit(styler[start]);\r
+       char s[30 + 1];\r
+       unsigned int i = 0;\r
+       for (; i < end - start + 1 && i < 30; i++) {\r
+               s[i] = styler[start + i];\r
+       }\r
+       s[i] = '\0';\r
+       char chAttr = SCE_HP_IDENTIFIER;\r
+       if (0 == strcmp(prevWord, "class"))\r
+               chAttr = SCE_HP_CLASSNAME;\r
+       else if (0 == strcmp(prevWord, "def"))\r
+               chAttr = SCE_HP_DEFNAME;\r
+       else if (wordIsNumber)\r
+               chAttr = SCE_HP_NUMBER;\r
+       else if (keywords.InList(s))\r
+               chAttr = SCE_HP_WORD;\r
+       styler.ColourTo(end, statePrintForState(chAttr, inScriptType));\r
+       strcpy(prevWord, s);\r
+}\r
+\r
+// Update the word colour to default or keyword\r
+// Called when in a PHP word\r
+static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\r
+       char chAttr = SCE_HPHP_DEFAULT;\r
+       bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.' && start+1 <= end && IsADigit(styler[start+1]));\r
+       if (wordIsNumber)\r
+               chAttr = SCE_HPHP_NUMBER;\r
+       else {\r
+               char s[100];\r
+               GetTextSegment(styler, start, end, s, sizeof(s));\r
+               if (keywords.InList(s))\r
+                       chAttr = SCE_HPHP_WORD;\r
+       }\r
+       styler.ColourTo(end, chAttr);\r
+}\r
+\r
+static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {\r
+       char s[30 + 1];\r
+       unsigned int i = 0;\r
+       for (; i < end - start + 1 && i < 30; i++) {\r
+               s[i] = styler[start + i];\r
+       }\r
+       s[i] = '\0';\r
+       return keywords.InList(s);\r
+}\r
+\r
+static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) {\r
+       char s[30 + 1];\r
+       unsigned int i = 0;\r
+       for (; i < end - start + 1 && i < 30; i++) {\r
+               s[i] = styler[start + i];\r
+       }\r
+       s[i] = '\0';\r
+       return (0 == strcmp(s, "[CDATA["));\r
+}\r
+\r
+// Return the first state to reach when entering a scripting language\r
+static int StateForScript(script_type scriptLanguage) {\r
+       int Result;\r
+       switch (scriptLanguage) {\r
+       case eScriptVBS:\r
+               Result = SCE_HB_START;\r
+               break;\r
+       case eScriptPython:\r
+               Result = SCE_HP_START;\r
+               break;\r
+       case eScriptPHP:\r
+               Result = SCE_HPHP_DEFAULT;\r
+               break;\r
+       case eScriptXML:\r
+               Result = SCE_H_TAGUNKNOWN;\r
+               break;\r
+       case eScriptSGML:\r
+               Result = SCE_H_SGML_DEFAULT;\r
+               break;\r
+       case eScriptComment:\r
+               Result = SCE_H_COMMENT;\r
+               break;\r
+       default :\r
+               Result = SCE_HJ_START;\r
+               break;\r
+       }\r
+       return Result;\r
+}\r
+\r
+static inline bool ishtmlwordchar(int ch) {\r
+       return !isascii(ch) ||\r
+               (isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#');\r
+}\r
+\r
+static inline bool issgmlwordchar(int ch) {\r
+       return !isascii(ch) ||\r
+               (isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '[');\r
+}\r
+\r
+static inline bool IsPhpWordStart(int ch) {\r
+       return (isascii(ch) && (isalpha(ch) || (ch == '_'))) || (ch >= 0x7f);\r
+}\r
+\r
+static inline bool IsPhpWordChar(int ch) {\r
+       return IsADigit(ch) || IsPhpWordStart(ch);\r
+}\r
+\r
+static bool InTagState(int state) {\r
+       return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN ||\r
+              state == SCE_H_SCRIPT ||\r
+              state == SCE_H_ATTRIBUTE || state == SCE_H_ATTRIBUTEUNKNOWN ||\r
+              state == SCE_H_NUMBER || state == SCE_H_OTHER ||\r
+              state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING;\r
+}\r
+\r
+static bool IsCommentState(const int state) {\r
+       return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT;\r
+}\r
+\r
+static bool IsScriptCommentState(const int state) {\r
+       return state == SCE_HJ_COMMENT || state == SCE_HJ_COMMENTLINE || state == SCE_HJA_COMMENT ||\r
+                  state == SCE_HJA_COMMENTLINE || state == SCE_HB_COMMENTLINE || state == SCE_HBA_COMMENTLINE;\r
+}\r
+\r
+static bool isLineEnd(int ch) {\r
+       return ch == '\r' || ch == '\n';\r
+}\r
+\r
+static bool isOKBeforeRE(int ch) {\r
+       return (ch == '(') || (ch == '=') || (ch == ',');\r
+}\r
+\r
+static bool isPHPStringState(int state) {\r
+       return\r
+           (state == SCE_HPHP_HSTRING) ||\r
+           (state == SCE_HPHP_SIMPLESTRING) ||\r
+           (state == SCE_HPHP_HSTRING_VARIABLE) ||\r
+           (state == SCE_HPHP_COMPLEX_VARIABLE);\r
+}\r
+\r
+static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler, bool &isSimpleString) {\r
+       int j;\r
+       const int beginning = i - 1;\r
+       bool isValidSimpleString = false;\r
+\r
+       while (i < lengthDoc && (styler[i] == ' ' || styler[i] == '\t'))\r
+               i++;\r
+\r
+       char ch = styler.SafeGetCharAt(i);\r
+       const char chNext = styler.SafeGetCharAt(i + 1);\r
+       if (!IsPhpWordStart(ch)) {\r
+               if (ch == '\'' && IsPhpWordStart(chNext)) {\r
+                       i++;\r
+                       ch = chNext;\r
+                       isSimpleString = true;\r
+               } else {\r
+                       phpStringDelimiter[0] = '\0';\r
+                       return beginning;\r
+               }\r
+       }\r
+       phpStringDelimiter[0] = ch;\r
+       i++;\r
+\r
+       for (j = i; j < lengthDoc && !isLineEnd(styler[j]); j++) {\r
+               if (!IsPhpWordChar(styler[j])) {\r
+                       if (isSimpleString && (styler[j] == '\'') && isLineEnd(styler.SafeGetCharAt(j + 1))) {\r
+                               isValidSimpleString = true;\r
+                               j++;\r
+                               break;\r
+                       } else {\r
+                               phpStringDelimiter[0] = '\0';\r
+                               return beginning;\r
+                       }\r
+               }\r
+               if (j - i < phpStringDelimiterSize - 2)\r
+                       phpStringDelimiter[j-i+1] = styler[j];\r
+               else\r
+                       i++;\r
+       }\r
+       if (isSimpleString && !isValidSimpleString) {\r
+               phpStringDelimiter[0] = '\0';\r
+               return beginning;\r
+       }\r
+       phpStringDelimiter[j-i+1 - (isSimpleString ? 1 : 0)] = '\0';\r
+       return j - 1;\r
+}\r
+\r
+static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+                                  Accessor &styler, bool isXml) {\r
+       WordList &keywords = *keywordlists[0];\r
+       WordList &keywords2 = *keywordlists[1];\r
+       WordList &keywords3 = *keywordlists[2];\r
+       WordList &keywords4 = *keywordlists[3];\r
+       WordList &keywords5 = *keywordlists[4];\r
+       WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords\r
+\r
+       // Lexer for HTML requires more lexical states (8 bits worth) than most lexers\r
+       styler.StartAt(startPos, static_cast<char>(STYLE_MAX));\r
+       char prevWord[200];\r
+       prevWord[0] = '\0';\r
+       char phpStringDelimiter[200]; // PHP is not limited in length, we are\r
+       phpStringDelimiter[0] = '\0';\r
+       int StateToPrint = initStyle;\r
+       int state = stateForPrintState(StateToPrint);\r
+\r
+       // If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen\r
+       if (InTagState(state)) {\r
+               while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {\r
+                       startPos--;\r
+                       length++;\r
+               }\r
+               state = SCE_H_DEFAULT;\r
+       }\r
+       // String can be heredoc, must find a delimiter first. Reread from beginning of line containing the string, to get the correct lineState\r
+       if (isPHPStringState(state)) {\r
+               while (startPos > 0 && (isPHPStringState(state) || !isLineEnd(styler[startPos - 1]))) {\r
+                       startPos--;\r
+                       length++;\r
+                       state = styler.StyleAt(startPos);\r
+               }\r
+               if (startPos == 0)\r
+                       state = SCE_H_DEFAULT;\r
+       }\r
+       styler.StartAt(startPos, static_cast<char>(STYLE_MAX));\r
+\r
+       int lineCurrent = styler.GetLine(startPos);\r
+       int lineState;\r
+       if (lineCurrent > 0) {\r
+               lineState = styler.GetLineState(lineCurrent);\r
+       } else {\r
+               // Default client and ASP scripting language is JavaScript\r
+               lineState = eScriptJS << 8;\r
+               lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4;\r
+       }\r
+       script_mode inScriptType = script_mode((lineState >> 0) & 0x03); // 2 bits of scripting mode\r
+       bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag\r
+       bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag\r
+       bool tagDontFold = false; //some HTML tags should not be folded\r
+       script_type aspScript = script_type((lineState >> 4) & 0x0F); // 4 bits of script name\r
+       script_type clientScript = script_type((lineState >> 8) & 0x0F); // 4 bits of script name\r
+       int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state\r
+\r
+       script_type scriptLanguage = ScriptOfState(state);\r
+       // If eNonHtmlScript coincides with SCE_H_COMMENT, assume eScriptComment\r
+       if (inScriptType == eNonHtmlScript && state == SCE_H_COMMENT) {\r
+               scriptLanguage = eScriptComment;\r
+       }\r
+\r
+       const bool foldHTML = styler.GetPropertyInt("fold.html", 0) != 0;\r
+       const bool fold = foldHTML && styler.GetPropertyInt("fold", 0);\r
+       const bool foldHTMLPreprocessor = foldHTML && styler.GetPropertyInt("fold.html.preprocessor", 1);\r
+       const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;\r
+       const bool foldComment = fold && styler.GetPropertyInt("fold.hypertext.comment", 0) != 0;\r
+       const bool foldHeredoc = fold && styler.GetPropertyInt("fold.hypertext.heredoc", 0) != 0;\r
+       const bool caseSensitive = styler.GetPropertyInt("html.tags.case.sensitive", 0) != 0;\r
+       const bool allowScripts = styler.GetPropertyInt("lexer.xml.allow.scripts", 1) != 0;\r
+\r
+       const CharacterSet setHTMLWord(CharacterSet::setAlphaNum, ".-_:!#", 0x80, true);\r
+       const CharacterSet setTagContinue(CharacterSet::setAlphaNum, ".-_:!#[", 0x80, true);\r
+       const CharacterSet setAttributeContinue(CharacterSet::setAlphaNum, ".-_:!#/", 0x80, true);\r
+\r
+       int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;\r
+       int levelCurrent = levelPrev;\r
+       int visibleChars = 0;\r
+\r
+       int chPrev = ' ';\r
+       int ch = ' ';\r
+       int chPrevNonWhite = ' ';\r
+       // look back to set chPrevNonWhite properly for better regex colouring\r
+       if (scriptLanguage == eScriptJS && startPos > 0) {\r
+               int back = startPos;\r
+               int style = 0;\r
+               while (--back) {\r
+                       style = styler.StyleAt(back);\r
+                       if (style < SCE_HJ_DEFAULT || style > SCE_HJ_COMMENTDOC)\r
+                               // includes SCE_HJ_COMMENT & SCE_HJ_COMMENTLINE\r
+                               break;\r
+               }\r
+               if (style == SCE_HJ_SYMBOLS) {\r
+                       chPrevNonWhite = static_cast<unsigned char>(styler.SafeGetCharAt(back));\r
+               }\r
+       }\r
+\r
+       styler.StartSegment(startPos);\r
+       const int lengthDoc = startPos + length;\r
+       for (int i = startPos; i < lengthDoc; i++) {\r
+               const int chPrev2 = chPrev;\r
+               chPrev = ch;\r
+               if (!IsASpace(ch) && state != SCE_HJ_COMMENT &&\r
+                       state != SCE_HJ_COMMENTLINE && state != SCE_HJ_COMMENTDOC)\r
+                       chPrevNonWhite = ch;\r
+               ch = static_cast<unsigned char>(styler[i]);\r
+               int chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+               const int chNext2 = static_cast<unsigned char>(styler.SafeGetCharAt(i + 2));\r
+\r
+               // Handle DBCS codepages\r
+               if (styler.IsLeadByte(static_cast<char>(ch))) {\r
+                       chPrev = ' ';\r
+                       i += 1;\r
+                       continue;\r
+               }\r
+\r
+               if ((!IsASpace(ch) || !foldCompact) && fold)\r
+                       visibleChars++;\r
+\r
+               // decide what is the current state to print (depending of the script tag)\r
+               StateToPrint = statePrintForState(state, inScriptType);\r
+\r
+               // handle script folding\r
+               if (fold) {\r
+                       switch (scriptLanguage) {\r
+                       case eScriptJS:\r
+                       case eScriptPHP:\r
+                               //not currently supported                               case eScriptVBS:\r
+\r
+                               if ((state != SCE_HPHP_COMMENT) && (state != SCE_HPHP_COMMENTLINE) && (state != SCE_HJ_COMMENT) && (state != SCE_HJ_COMMENTLINE) && (state != SCE_HJ_COMMENTDOC) && (!isStringState(state))) {\r
+                               //Platform::DebugPrintf("state=%d, StateToPrint=%d, initStyle=%d\n", state, StateToPrint, initStyle);\r
+                               //if ((state == SCE_HPHP_OPERATOR) || (state == SCE_HPHP_DEFAULT) || (state == SCE_HJ_SYMBOLS) || (state == SCE_HJ_START) || (state == SCE_HJ_DEFAULT)) {\r
+                                       if ((ch == '{') || (ch == '}') || (foldComment && (ch == '/') && (chNext == '*'))) {\r
+                                               levelCurrent += ((ch == '{') || (ch == '/')) ? 1 : -1;\r
+                                       }\r
+                               } else if (((state == SCE_HPHP_COMMENT) || (state == SCE_HJ_COMMENT)) && foldComment && (ch == '*') && (chNext == '/')) {\r
+                                       levelCurrent--;\r
+                               }\r
+                               break;\r
+                       case eScriptPython:\r
+                               if (state != SCE_HP_COMMENTLINE) {\r
+                                       if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) {\r
+                                               levelCurrent++;\r
+                                       } else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {\r
+                                               // check if the number of tabs is lower than the level\r
+                                               int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;\r
+                                               for (int j = 0; Findlevel > 0; j++) {\r
+                                                       char chTmp = styler.SafeGetCharAt(i + j + 1);\r
+                                                       if (chTmp == '\t') {\r
+                                                               Findlevel -= 8;\r
+                                                       } else if (chTmp == ' ') {\r
+                                                               Findlevel--;\r
+                                                       } else {\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if (Findlevel > 0) {\r
+                                                       levelCurrent -= Findlevel / 8;\r
+                                                       if (Findlevel % 8)\r
+                                                               levelCurrent--;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {\r
+                       // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)\r
+                       // Avoid triggering two times on Dos/Win\r
+                       // New line -> record any line state onto /next/ line\r
+                       if (fold) {\r
+                               int lev = levelPrev;\r
+                               if (visibleChars == 0)\r
+                                       lev |= SC_FOLDLEVELWHITEFLAG;\r
+                               if ((levelCurrent > levelPrev) && (visibleChars > 0))\r
+                                       lev |= SC_FOLDLEVELHEADERFLAG;\r
+\r
+                               styler.SetLevel(lineCurrent, lev);\r
+                               visibleChars = 0;\r
+                               levelPrev = levelCurrent;\r
+                       }\r
+                       lineCurrent++;\r
+                       styler.SetLineState(lineCurrent,\r
+                                           ((inScriptType & 0x03) << 0) |\r
+                                           ((tagOpened & 0x01) << 2) |\r
+                                           ((tagClosing & 0x01) << 3) |\r
+                                           ((aspScript & 0x0F) << 4) |\r
+                                           ((clientScript & 0x0F) << 8) |\r
+                                           ((beforePreProc & 0xFF) << 12));\r
+               }\r
+\r
+               // generic end of script processing\r
+               else if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) {\r
+                       // Check if it's the end of the script tag (or any other HTML tag)\r
+                       switch (state) {\r
+                               // in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!)\r
+                       case SCE_H_DOUBLESTRING:\r
+                       case SCE_H_SINGLESTRING:\r
+                       case SCE_HJ_COMMENT:\r
+                       case SCE_HJ_COMMENTDOC:\r
+                       //case SCE_HJ_COMMENTLINE: // removed as this is a common thing done to hide\r
+                       // the end of script marker from some JS interpreters.\r
+                       case SCE_HB_COMMENTLINE:\r
+                       case SCE_HBA_COMMENTLINE:\r
+                       case SCE_HJ_DOUBLESTRING:\r
+                       case SCE_HJ_SINGLESTRING:\r
+                       case SCE_HJ_REGEX:\r
+                       case SCE_HB_STRING:\r
+                       case SCE_HBA_STRING:\r
+                       case SCE_HP_STRING:\r
+                       case SCE_HP_TRIPLE:\r
+                       case SCE_HP_TRIPLEDOUBLE:\r
+                       case SCE_HPHP_HSTRING:\r
+                       case SCE_HPHP_SIMPLESTRING:\r
+                       case SCE_HPHP_COMMENT:\r
+                       case SCE_HPHP_COMMENTLINE:\r
+                               break;\r
+                       default :\r
+                               // check if the closing tag is a script tag\r
+                               if (const char *tag =\r
+                                               state == SCE_HJ_COMMENTLINE || isXml ? "script" :\r
+                                               state == SCE_H_COMMENT ? "comment" : 0) {\r
+                                       int j = i + 2;\r
+                                       int chr;\r
+                                       do {\r
+                                               chr = static_cast<int>(*tag++);\r
+                                       } while (chr != 0 && chr == MakeLowerCase(styler.SafeGetCharAt(j++)));\r
+                                       if (chr != 0) break;\r
+                               }\r
+                               // closing tag of the script (it's a closing HTML tag anyway)\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_TAGUNKNOWN;\r
+                               inScriptType = eHtml;\r
+                               scriptLanguage = eScriptNone;\r
+                               clientScript = eScriptJS;\r
+                               i += 2;\r
+                               visibleChars += 2;\r
+                               tagClosing = true;\r
+                               continue;\r
+                       }\r
+               }\r
+\r
+               /////////////////////////////////////\r
+               // handle the start of PHP pre-processor = Non-HTML\r
+               else if ((state != SCE_H_ASPAT) &&\r
+                        !isPHPStringState(state) &&\r
+                        (state != SCE_HPHP_COMMENT) &&\r
+                        (ch == '<') &&\r
+                        (chNext == '?') &&\r
+                                !IsScriptCommentState(state) ) {\r
+                       scriptLanguage = segIsScriptingIndicator(styler, i + 2, i + 6, eScriptPHP);\r
+                       if (scriptLanguage != eScriptPHP && isStringState(state)) continue;\r
+                       styler.ColourTo(i - 1, StateToPrint);\r
+                       beforePreProc = state;\r
+                       i++;\r
+                       visibleChars++;\r
+                       i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 6);\r
+                       if (scriptLanguage == eScriptXML)\r
+                               styler.ColourTo(i, SCE_H_XMLSTART);\r
+                       else\r
+                               styler.ColourTo(i, SCE_H_QUESTION);\r
+                       state = StateForScript(scriptLanguage);\r
+                       if (inScriptType == eNonHtmlScript)\r
+                               inScriptType = eNonHtmlScriptPreProc;\r
+                       else\r
+                               inScriptType = eNonHtmlPreProc;\r
+                       // Fold whole script, but not if the XML first tag (all XML-like tags in this case)\r
+                       if (foldHTMLPreprocessor && (scriptLanguage != eScriptXML)) {\r
+                               levelCurrent++;\r
+                       }\r
+                       // should be better\r
+                       ch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\r
+                       continue;\r
+               }\r
+\r
+               // handle the start of ASP pre-processor = Non-HTML\r
+               else if (!isCommentASPState(state) && (ch == '<') && (chNext == '%') && !isPHPStringState(state)) {\r
+                       styler.ColourTo(i - 1, StateToPrint);\r
+                       beforePreProc = state;\r
+                       if (inScriptType == eNonHtmlScript)\r
+                               inScriptType = eNonHtmlScriptPreProc;\r
+                       else\r
+                               inScriptType = eNonHtmlPreProc;\r
+\r
+                       if (chNext2 == '@') {\r
+                               i += 2; // place as if it was the second next char treated\r
+                               visibleChars += 2;\r
+                               state = SCE_H_ASPAT;\r
+                       } else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {\r
+                               styler.ColourTo(i + 3, SCE_H_ASP);\r
+                               state = SCE_H_XCCOMMENT;\r
+                               scriptLanguage = eScriptVBS;\r
+                               continue;\r
+                       } else {\r
+                               if (chNext2 == '=') {\r
+                                       i += 2; // place as if it was the second next char treated\r
+                                       visibleChars += 2;\r
+                               } else {\r
+                                       i++; // place as if it was the next char treated\r
+                                       visibleChars++;\r
+                               }\r
+\r
+                               state = StateForScript(aspScript);\r
+                       }\r
+                       scriptLanguage = eScriptVBS;\r
+                       styler.ColourTo(i, SCE_H_ASP);\r
+                       // fold whole script\r
+                       if (foldHTMLPreprocessor)\r
+                               levelCurrent++;\r
+                       // should be better\r
+                       ch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\r
+                       continue;\r
+               }\r
+\r
+               /////////////////////////////////////\r
+               // handle the start of SGML language (DTD)\r
+               else if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) &&\r
+                                (chPrev == '<') &&\r
+                                (ch == '!') &&\r
+                                (StateToPrint != SCE_H_CDATA) &&\r
+                                (!IsCommentState(StateToPrint)) &&\r
+                                (!IsScriptCommentState(StateToPrint)) ) {\r
+                       beforePreProc = state;\r
+                       styler.ColourTo(i - 2, StateToPrint);\r
+                       if ((chNext == '-') && (chNext2 == '-')) {\r
+                               state = SCE_H_COMMENT; // wait for a pending command\r
+                               styler.ColourTo(i + 2, SCE_H_COMMENT);\r
+                               i += 2; // follow styling after the --\r
+                       } else if (isWordCdata(i + 1, i + 7, styler)) {\r
+                               state = SCE_H_CDATA;\r
+                       } else {\r
+                               styler.ColourTo(i, SCE_H_SGML_DEFAULT); // <! is default\r
+                               scriptLanguage = eScriptSGML;\r
+                               state = SCE_H_SGML_COMMAND; // wait for a pending command\r
+                       }\r
+                       // fold whole tag (-- when closing the tag)\r
+                       if (foldHTMLPreprocessor)\r
+                               levelCurrent++;\r
+                       continue;\r
+               }\r
+\r
+               // handle the end of a pre-processor = Non-HTML\r
+               else if ((\r
+                            ((inScriptType == eNonHtmlPreProc)\r
+                             || (inScriptType == eNonHtmlScriptPreProc)) && (\r
+                                ((scriptLanguage != eScriptNone) && stateAllowsTermination(state) && ((ch == '%') || (ch == '?')))\r
+                            ) && (chNext == '>')) ||\r
+                        ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {\r
+                       if (state == SCE_H_ASPAT) {\r
+                               aspScript = segIsScriptingIndicator(styler,\r
+                                                                   styler.GetStartSegment(), i - 1, aspScript);\r
+                       }\r
+                       // Bounce out of any ASP mode\r
+                       switch (state) {\r
+                       case SCE_HJ_WORD:\r
+                               classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);\r
+                               break;\r
+                       case SCE_HB_WORD:\r
+                               classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);\r
+                               break;\r
+                       case SCE_HP_WORD:\r
+                               classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType);\r
+                               break;\r
+                       case SCE_HPHP_WORD:\r
+                               classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);\r
+                               break;\r
+                       case SCE_H_XCCOMMENT:\r
+                               styler.ColourTo(i - 1, state);\r
+                               break;\r
+                       default :\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               break;\r
+                       }\r
+                       if (scriptLanguage != eScriptSGML) {\r
+                               i++;\r
+                               visibleChars++;\r
+                       }\r
+                       if (ch == '%')\r
+                               styler.ColourTo(i, SCE_H_ASP);\r
+                       else if (scriptLanguage == eScriptXML)\r
+                               styler.ColourTo(i, SCE_H_XMLEND);\r
+                       else if (scriptLanguage == eScriptSGML)\r
+                               styler.ColourTo(i, SCE_H_SGML_DEFAULT);\r
+                       else\r
+                               styler.ColourTo(i, SCE_H_QUESTION);\r
+                       state = beforePreProc;\r
+                       if (inScriptType == eNonHtmlScriptPreProc)\r
+                               inScriptType = eNonHtmlScript;\r
+                       else\r
+                               inScriptType = eHtml;\r
+                       // Unfold all scripting languages, except for XML tag\r
+                       if (foldHTMLPreprocessor && (scriptLanguage != eScriptXML)) {\r
+                               levelCurrent--;\r
+                       }\r
+                       scriptLanguage = eScriptNone;\r
+                       continue;\r
+               }\r
+               /////////////////////////////////////\r
+\r
+               switch (state) {\r
+               case SCE_H_DEFAULT:\r
+                       if (ch == '<') {\r
+                               // in HTML, fold on tag open and unfold on tag close\r
+                               tagOpened = true;\r
+                               tagClosing = (chNext == '/');\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               if (chNext != '!')\r
+                                       state = SCE_H_TAGUNKNOWN;\r
+                       } else if (ch == '&') {\r
+                               styler.ColourTo(i - 1, SCE_H_DEFAULT);\r
+                               state = SCE_H_ENTITY;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_DEFAULT:\r
+               case SCE_H_SGML_BLOCK_DEFAULT:\r
+//                     if (scriptLanguage == eScriptSGMLblock)\r
+//                             StateToPrint = SCE_H_SGML_BLOCK_DEFAULT;\r
+\r
+                       if (ch == '\"') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_SGML_DOUBLESTRING;\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_SGML_SIMPLESTRING;\r
+                       } else if ((ch == '-') && (chPrev == '-')) {\r
+                               if (static_cast<int>(styler.GetStartSegment()) <= (i - 2)) {\r
+                                       styler.ColourTo(i - 2, StateToPrint);\r
+                               }\r
+                               state = SCE_H_SGML_COMMENT;\r
+                       } else if (isascii(ch) && isalpha(ch) && (chPrev == '%')) {\r
+                               styler.ColourTo(i - 2, StateToPrint);\r
+                               state = SCE_H_SGML_ENTITY;\r
+                       } else if (ch == '#') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_SGML_SPECIAL;\r
+                       } else if (ch == '[') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               scriptLanguage = eScriptSGMLblock;\r
+                               state = SCE_H_SGML_BLOCK_DEFAULT;\r
+                       } else if (ch == ']') {\r
+                               if (scriptLanguage == eScriptSGMLblock) {\r
+                                       styler.ColourTo(i, StateToPrint);\r
+                                       scriptLanguage = eScriptSGML;\r
+                               } else {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       styler.ColourTo(i, SCE_H_SGML_ERROR);\r
+                               }\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       } else if (scriptLanguage == eScriptSGMLblock) {\r
+                               if ((ch == '!') && (chPrev == '<')) {\r
+                                       styler.ColourTo(i - 2, StateToPrint);\r
+                                       styler.ColourTo(i, SCE_H_SGML_DEFAULT);\r
+                                       state = SCE_H_SGML_COMMAND;\r
+                               } else if (ch == '>') {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       styler.ColourTo(i, SCE_H_SGML_DEFAULT);\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_COMMAND:\r
+                       if ((ch == '-') && (chPrev == '-')) {\r
+                               styler.ColourTo(i - 2, StateToPrint);\r
+                               state = SCE_H_SGML_COMMENT;\r
+                       } else if (!issgmlwordchar(ch)) {\r
+                               if (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       state = SCE_H_SGML_1ST_PARAM;\r
+                               } else {\r
+                                       state = SCE_H_SGML_ERROR;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_1ST_PARAM:\r
+                       // wait for the beginning of the word\r
+                       if ((ch == '-') && (chPrev == '-')) {\r
+                               if (scriptLanguage == eScriptSGMLblock) {\r
+                                       styler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT);\r
+                               } else {\r
+                                       styler.ColourTo(i - 2, SCE_H_SGML_DEFAULT);\r
+                               }\r
+                               state = SCE_H_SGML_1ST_PARAM_COMMENT;\r
+                       } else if (issgmlwordchar(ch)) {\r
+                               if (scriptLanguage == eScriptSGMLblock) {\r
+                                       styler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT);\r
+                               } else {\r
+                                       styler.ColourTo(i - 1, SCE_H_SGML_DEFAULT);\r
+                               }\r
+                               // find the length of the word\r
+                               int size = 1;\r
+                               while (setHTMLWord.Contains(static_cast<unsigned char>(styler.SafeGetCharAt(i + size))))\r
+                                       size++;\r
+                               styler.ColourTo(i + size - 1, StateToPrint);\r
+                               i += size - 1;\r
+                               visibleChars += size - 1;\r
+                               ch = static_cast<unsigned char>(styler.SafeGetCharAt(i));\r
+                               if (scriptLanguage == eScriptSGMLblock) {\r
+                                       state = SCE_H_SGML_BLOCK_DEFAULT;\r
+                               } else {\r
+                                       state = SCE_H_SGML_DEFAULT;\r
+                               }\r
+                               continue;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_ERROR:\r
+                       if ((ch == '-') && (chPrev == '-')) {\r
+                               styler.ColourTo(i - 2, StateToPrint);\r
+                               state = SCE_H_SGML_COMMENT;\r
+                       }\r
+               case SCE_H_SGML_DOUBLESTRING:\r
+                       if (ch == '\"') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_SIMPLESTRING:\r
+                       if (ch == '\'') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_COMMENT:\r
+                       if ((ch == '-') && (chPrev == '-')) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_H_CDATA:\r
+                       if ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_DEFAULT;\r
+                               levelCurrent--;\r
+                       }\r
+                       break;\r
+               case SCE_H_COMMENT:\r
+                       if ((scriptLanguage != eScriptComment) && (chPrev2 == '-') && (chPrev == '-') && (ch == '>')) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_DEFAULT;\r
+                               levelCurrent--;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_1ST_PARAM_COMMENT:\r
+                       if ((ch == '-') && (chPrev == '-')) {\r
+                               styler.ColourTo(i, SCE_H_SGML_COMMENT);\r
+                               state = SCE_H_SGML_1ST_PARAM;\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_SPECIAL:\r
+                       if (!(isascii(ch) && isupper(ch))) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               if (isalnum(ch)) {\r
+                                       state = SCE_H_SGML_ERROR;\r
+                               } else {\r
+                                       state = SCE_H_SGML_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_H_SGML_ENTITY:\r
+                       if (ch == ';') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       } else if (!(isascii(ch) && isalnum(ch)) && ch != '-' && ch != '.') {\r
+                               styler.ColourTo(i, SCE_H_SGML_ERROR);\r
+                               state = SCE_H_SGML_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_H_ENTITY:\r
+                       if (ch == ';') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_DEFAULT;\r
+                       }\r
+                       if (ch != '#' && !(isascii(ch) && isalnum(ch))  // Should check that '#' follows '&', but it is unlikely anyway...\r
+                               && ch != '.' && ch != '-' && ch != '_' && ch != ':') { // valid in XML\r
+                               styler.ColourTo(i, SCE_H_TAGUNKNOWN);\r
+                               state = SCE_H_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_H_TAGUNKNOWN:\r
+                       if (!setTagContinue.Contains(ch) && !((ch == '/') && (chPrev == '<'))) {\r
+                               int eClass = classifyTagHTML(styler.GetStartSegment(),\r
+                                       i - 1, keywords, styler, tagDontFold, caseSensitive, isXml, allowScripts);\r
+                               if (eClass == SCE_H_SCRIPT || eClass == SCE_H_COMMENT) {\r
+                                       if (!tagClosing) {\r
+                                               inScriptType = eNonHtmlScript;\r
+                                               scriptLanguage = eClass == SCE_H_SCRIPT ? clientScript : eScriptComment;\r
+                                       } else {\r
+                                               scriptLanguage = eScriptNone;\r
+                                       }\r
+                                       eClass = SCE_H_TAG;\r
+                               }\r
+                               if (ch == '>') {\r
+                                       styler.ColourTo(i, eClass);\r
+                                       if (inScriptType == eNonHtmlScript) {\r
+                                               state = StateForScript(scriptLanguage);\r
+                                       } else {\r
+                                               state = SCE_H_DEFAULT;\r
+                                       }\r
+                                       tagOpened = false;\r
+                                       if (!tagDontFold) {\r
+                                               if (tagClosing) {\r
+                                                       levelCurrent--;\r
+                                               } else {\r
+                                                       levelCurrent++;\r
+                                               }\r
+                                       }\r
+                                       tagClosing = false;\r
+                               } else if (ch == '/' && chNext == '>') {\r
+                                       if (eClass == SCE_H_TAGUNKNOWN) {\r
+                                               styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);\r
+                                       } else {\r
+                                               styler.ColourTo(i - 1, StateToPrint);\r
+                                               styler.ColourTo(i + 1, SCE_H_TAGEND);\r
+                                       }\r
+                                       i++;\r
+                                       ch = chNext;\r
+                                       state = SCE_H_DEFAULT;\r
+                                       tagOpened = false;\r
+                               } else {\r
+                                       if (eClass != SCE_H_TAGUNKNOWN) {\r
+                                               if (eClass == SCE_H_SGML_DEFAULT) {\r
+                                                       state = SCE_H_SGML_DEFAULT;\r
+                                               } else {\r
+                                                       state = SCE_H_OTHER;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_H_ATTRIBUTE:\r
+                       if (!setAttributeContinue.Contains(ch)) {\r
+                               if (inScriptType == eNonHtmlScript) {\r
+                                       int scriptLanguagePrev = scriptLanguage;\r
+                                       clientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);\r
+                                       scriptLanguage = clientScript;\r
+                                       if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))\r
+                                               inScriptType = eHtml;\r
+                               }\r
+                               classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler);\r
+                               if (ch == '>') {\r
+                                       styler.ColourTo(i, SCE_H_TAG);\r
+                                       if (inScriptType == eNonHtmlScript) {\r
+                                               state = StateForScript(scriptLanguage);\r
+                                       } else {\r
+                                               state = SCE_H_DEFAULT;\r
+                                       }\r
+                                       tagOpened = false;\r
+                                       if (!tagDontFold) {\r
+                                               if (tagClosing) {\r
+                                                       levelCurrent--;\r
+                                               } else {\r
+                                                       levelCurrent++;\r
+                                               }\r
+                                       }\r
+                                       tagClosing = false;\r
+                               } else if (ch == '=') {\r
+                                       styler.ColourTo(i, SCE_H_OTHER);\r
+                                       state = SCE_H_VALUE;\r
+                               } else {\r
+                                       state = SCE_H_OTHER;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_H_OTHER:\r
+                       if (ch == '>') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i, SCE_H_TAG);\r
+                               if (inScriptType == eNonHtmlScript) {\r
+                                       state = StateForScript(scriptLanguage);\r
+                               } else {\r
+                                       state = SCE_H_DEFAULT;\r
+                               }\r
+                               tagOpened = false;\r
+                               if (!tagDontFold) {\r
+                                       if (tagClosing) {\r
+                                               levelCurrent--;\r
+                                       } else {\r
+                                               levelCurrent++;\r
+                                       }\r
+                               }\r
+                               tagClosing = false;\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_DOUBLESTRING;\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_SINGLESTRING;\r
+                       } else if (ch == '=') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_H_VALUE;\r
+                       } else if (ch == '/' && chNext == '>') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i + 1, SCE_H_TAGEND);\r
+                               i++;\r
+                               ch = chNext;\r
+                               state = SCE_H_DEFAULT;\r
+                               tagOpened = false;\r
+                       } else if (ch == '?' && chNext == '>') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i + 1, SCE_H_XMLEND);\r
+                               i++;\r
+                               ch = chNext;\r
+                               state = SCE_H_DEFAULT;\r
+                       } else if (setHTMLWord.Contains(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_H_ATTRIBUTE;\r
+                       }\r
+                       break;\r
+               case SCE_H_DOUBLESTRING:\r
+                       if (ch == '\"') {\r
+                               if (inScriptType == eNonHtmlScript) {\r
+                                       scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);\r
+                               }\r
+                               styler.ColourTo(i, SCE_H_DOUBLESTRING);\r
+                               state = SCE_H_OTHER;\r
+                       }\r
+                       break;\r
+               case SCE_H_SINGLESTRING:\r
+                       if (ch == '\'') {\r
+                               if (inScriptType == eNonHtmlScript) {\r
+                                       scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);\r
+                               }\r
+                               styler.ColourTo(i, SCE_H_SINGLESTRING);\r
+                               state = SCE_H_OTHER;\r
+                       }\r
+                       break;\r
+               case SCE_H_VALUE:\r
+                       if (!setHTMLWord.Contains(ch)) {\r
+                               if (ch == '\"' && chPrev == '=') {\r
+                                       // Should really test for being first character\r
+                                       state = SCE_H_DOUBLESTRING;\r
+                               } else if (ch == '\'' && chPrev == '=') {\r
+                                       state = SCE_H_SINGLESTRING;\r
+                               } else {\r
+                                       if (IsNumber(styler.GetStartSegment(), styler)) {\r
+                                               styler.ColourTo(i - 1, SCE_H_NUMBER);\r
+                                       } else {\r
+                                               styler.ColourTo(i - 1, StateToPrint);\r
+                                       }\r
+                                       if (ch == '>') {\r
+                                               styler.ColourTo(i, SCE_H_TAG);\r
+                                               if (inScriptType == eNonHtmlScript) {\r
+                                                       state = StateForScript(scriptLanguage);\r
+                                               } else {\r
+                                                       state = SCE_H_DEFAULT;\r
+                                               }\r
+                                               tagOpened = false;\r
+                                               if (!tagDontFold) {\r
+                                                       if (tagClosing) {\r
+                                                               levelCurrent--;\r
+                                                       } else {\r
+                                                               levelCurrent++;\r
+                                                       }\r
+                                               }\r
+                                               tagClosing = false;\r
+                                       } else {\r
+                                               state = SCE_H_OTHER;\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HJ_DEFAULT:\r
+               case SCE_HJ_START:\r
+               case SCE_HJ_SYMBOLS:\r
+                       if (IsAWordStart(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_WORD;\r
+                       } else if (ch == '/' && chNext == '*') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               if (chNext2 == '*')\r
+                                       state = SCE_HJ_COMMENTDOC;\r
+                               else\r
+                                       state = SCE_HJ_COMMENT;\r
+                       } else if (ch == '/' && chNext == '/') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                       } else if (ch == '/' && isOKBeforeRE(chPrevNonWhite)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_REGEX;\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_DOUBLESTRING;\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_SINGLESTRING;\r
+                       } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\r
+                                  styler.SafeGetCharAt(i + 3) == '-') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                       } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                               i += 2;\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\r
+                               state = SCE_HJ_DEFAULT;\r
+                       } else if ((ch == ' ') || (ch == '\t')) {\r
+                               if (state == SCE_HJ_START) {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       state = SCE_HJ_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HJ_WORD:\r
+                       if (!IsAWordChar(ch)) {\r
+                               classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);\r
+                               //styler.ColourTo(i - 1, eHTJSKeyword);\r
+                               state = SCE_HJ_DEFAULT;\r
+                               if (ch == '/' && chNext == '*') {\r
+                                       if (chNext2 == '*')\r
+                                               state = SCE_HJ_COMMENTDOC;\r
+                                       else\r
+                                               state = SCE_HJ_COMMENT;\r
+                               } else if (ch == '/' && chNext == '/') {\r
+                                       state = SCE_HJ_COMMENTLINE;\r
+                               } else if (ch == '\"') {\r
+                                       state = SCE_HJ_DOUBLESTRING;\r
+                               } else if (ch == '\'') {\r
+                                       state = SCE_HJ_SINGLESTRING;\r
+                               } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       state = SCE_HJ_COMMENTLINE;\r
+                                       i += 2;\r
+                               } else if (IsOperator(ch)) {\r
+                                       styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\r
+                                       state = SCE_HJ_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HJ_COMMENT:\r
+               case SCE_HJ_COMMENTDOC:\r
+                       if (ch == '/' && chPrev == '*') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HJ_DEFAULT;\r
+                               ch = ' ';\r
+                       }\r
+                       break;\r
+               case SCE_HJ_COMMENTLINE:\r
+                       if (ch == '\r' || ch == '\n') {\r
+                               styler.ColourTo(i - 1, statePrintForState(SCE_HJ_COMMENTLINE, inScriptType));\r
+                               state = SCE_HJ_DEFAULT;\r
+                               ch = ' ';\r
+                       }\r
+                       break;\r
+               case SCE_HJ_DOUBLESTRING:\r
+                       if (ch == '\\') {\r
+                               if (chNext == '\"' || chNext == '\'' || chNext == '\\') {\r
+                                       i++;\r
+                               }\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType));\r
+                               state = SCE_HJ_DEFAULT;\r
+                       } else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                               i += 2;\r
+                       } else if (isLineEnd(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_STRINGEOL;\r
+                       }\r
+                       break;\r
+               case SCE_HJ_SINGLESTRING:\r
+                       if (ch == '\\') {\r
+                               if (chNext == '\"' || chNext == '\'' || chNext == '\\') {\r
+                                       i++;\r
+                               }\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType));\r
+                               state = SCE_HJ_DEFAULT;\r
+                       } else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                               i += 2;\r
+                       } else if (isLineEnd(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_STRINGEOL;\r
+                       }\r
+                       break;\r
+               case SCE_HJ_STRINGEOL:\r
+                       if (!isLineEnd(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HJ_DEFAULT;\r
+                       } else if (!isLineEnd(chNext)) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HJ_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HJ_REGEX:\r
+                       if (ch == '\r' || ch == '\n' || ch == '/') {\r
+                               if (ch == '/') {\r
+                                       while (isascii(chNext) && islower(chNext)) {   // gobble regex flags\r
+                                               i++;\r
+                                               ch = chNext;\r
+                                               chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                                       }\r
+                               }\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HJ_DEFAULT;\r
+                       } else if (ch == '\\') {\r
+                               // Gobble up the quoted character\r
+                               if (chNext == '\\' || chNext == '/') {\r
+                                       i++;\r
+                                       ch = chNext;\r
+                                       chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HB_DEFAULT:\r
+               case SCE_HB_START:\r
+                       if (IsAWordStart(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_WORD;\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_COMMENTLINE;\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_STRING;\r
+                       } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\r
+                                  styler.SafeGetCharAt(i + 3) == '-') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_COMMENTLINE;\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));\r
+                               state = SCE_HB_DEFAULT;\r
+                       } else if ((ch == ' ') || (ch == '\t')) {\r
+                               if (state == SCE_HB_START) {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       state = SCE_HB_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HB_WORD:\r
+                       if (!IsAWordChar(ch)) {\r
+                               state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);\r
+                               if (state == SCE_HB_DEFAULT) {\r
+                                       if (ch == '\"') {\r
+                                               state = SCE_HB_STRING;\r
+                                       } else if (ch == '\'') {\r
+                                               state = SCE_HB_COMMENTLINE;\r
+                                       } else if (IsOperator(ch)) {\r
+                                               styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));\r
+                                               state = SCE_HB_DEFAULT;\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HB_STRING:\r
+                       if (ch == '\"') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HB_DEFAULT;\r
+                       } else if (ch == '\r' || ch == '\n') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_STRINGEOL;\r
+                       }\r
+                       break;\r
+               case SCE_HB_COMMENTLINE:\r
+                       if (ch == '\r' || ch == '\n') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HB_STRINGEOL:\r
+                       if (!isLineEnd(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HB_DEFAULT;\r
+                       } else if (!isLineEnd(chNext)) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HB_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HP_DEFAULT:\r
+               case SCE_HP_START:\r
+                       if (IsAWordStart(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HP_WORD;\r
+                       } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') &&\r
+                                  styler.SafeGetCharAt(i + 3) == '-') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HP_COMMENTLINE;\r
+                       } else if (ch == '#') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HP_COMMENTLINE;\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               if (chNext == '\"' && chNext2 == '\"') {\r
+                                       i += 2;\r
+                                       state = SCE_HP_TRIPLEDOUBLE;\r
+                                       ch = ' ';\r
+                                       chPrev = ' ';\r
+                                       chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                               } else {\r
+                                       //                                      state = statePrintForState(SCE_HP_STRING,inScriptType);\r
+                                       state = SCE_HP_STRING;\r
+                               }\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               if (chNext == '\'' && chNext2 == '\'') {\r
+                                       i += 2;\r
+                                       state = SCE_HP_TRIPLE;\r
+                                       ch = ' ';\r
+                                       chPrev = ' ';\r
+                                       chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                               } else {\r
+                                       state = SCE_HP_CHARACTER;\r
+                               }\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));\r
+                       } else if ((ch == ' ') || (ch == '\t')) {\r
+                               if (state == SCE_HP_START) {\r
+                                       styler.ColourTo(i - 1, StateToPrint);\r
+                                       state = SCE_HP_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HP_WORD:\r
+                       if (!IsAWordChar(ch)) {\r
+                               classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType);\r
+                               state = SCE_HP_DEFAULT;\r
+                               if (ch == '#') {\r
+                                       state = SCE_HP_COMMENTLINE;\r
+                               } else if (ch == '\"') {\r
+                                       if (chNext == '\"' && chNext2 == '\"') {\r
+                                               i += 2;\r
+                                               state = SCE_HP_TRIPLEDOUBLE;\r
+                                               ch = ' ';\r
+                                               chPrev = ' ';\r
+                                               chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                                       } else {\r
+                                               state = SCE_HP_STRING;\r
+                                       }\r
+                               } else if (ch == '\'') {\r
+                                       if (chNext == '\'' && chNext2 == '\'') {\r
+                                               i += 2;\r
+                                               state = SCE_HP_TRIPLE;\r
+                                               ch = ' ';\r
+                                               chPrev = ' ';\r
+                                               chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                                       } else {\r
+                                               state = SCE_HP_CHARACTER;\r
+                                       }\r
+                               } else if (IsOperator(ch)) {\r
+                                       styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HP_COMMENTLINE:\r
+                       if (ch == '\r' || ch == '\n') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HP_STRING:\r
+                       if (ch == '\\') {\r
+                               if (chNext == '\"' || chNext == '\'' || chNext == '\\') {\r
+                                       i++;\r
+                                       ch = chNext;\r
+                                       chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                               }\r
+                       } else if (ch == '\"') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HP_CHARACTER:\r
+                       if (ch == '\\') {\r
+                               if (chNext == '\"' || chNext == '\'' || chNext == '\\') {\r
+                                       i++;\r
+                                       ch = chNext;\r
+                                       chNext = static_cast<unsigned char>(styler.SafeGetCharAt(i + 1));\r
+                               }\r
+                       } else if (ch == '\'') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HP_TRIPLE:\r
+                       if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HP_TRIPLEDOUBLE:\r
+                       if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HP_DEFAULT;\r
+                       }\r
+                       break;\r
+                       ///////////// start - PHP state handling\r
+               case SCE_HPHP_WORD:\r
+                       if (!IsAWordChar(ch)) {\r
+                               classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);\r
+                               if (ch == '/' && chNext == '*') {\r
+                                       i++;\r
+                                       state = SCE_HPHP_COMMENT;\r
+                               } else if (ch == '/' && chNext == '/') {\r
+                                       i++;\r
+                                       state = SCE_HPHP_COMMENTLINE;\r
+                               } else if (ch == '#') {\r
+                                       state = SCE_HPHP_COMMENTLINE;\r
+                               } else if (ch == '\"') {\r
+                                       state = SCE_HPHP_HSTRING;\r
+                                       strcpy(phpStringDelimiter, "\"");\r
+                               } else if (styler.Match(i, "<<<")) {\r
+                                       bool isSimpleString = false;\r
+                                       i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString);\r
+                                       if (strlen(phpStringDelimiter)) {\r
+                                               state = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING);\r
+                                               if (foldHeredoc) levelCurrent++;\r
+                                       }\r
+                               } else if (ch == '\'') {\r
+                                       state = SCE_HPHP_SIMPLESTRING;\r
+                                       strcpy(phpStringDelimiter, "\'");\r
+                               } else if (ch == '$' && IsPhpWordStart(chNext)) {\r
+                                       state = SCE_HPHP_VARIABLE;\r
+                               } else if (IsOperator(ch)) {\r
+                                       state = SCE_HPHP_OPERATOR;\r
+                               } else {\r
+                                       state = SCE_HPHP_DEFAULT;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_NUMBER:\r
+                       // recognize bases 8,10 or 16 integers OR floating-point numbers\r
+                       if (!IsADigit(ch)\r
+                               && strchr(".xXabcdefABCDEF", ch) == NULL\r
+                               && ((ch != '-' && ch != '+') || (chPrev != 'e' && chPrev != 'E'))) {\r
+                               styler.ColourTo(i - 1, SCE_HPHP_NUMBER);\r
+                               if (IsOperator(ch))\r
+                                       state = SCE_HPHP_OPERATOR;\r
+                               else\r
+                                       state = SCE_HPHP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_VARIABLE:\r
+                       if (!IsPhpWordChar(chNext)) {\r
+                               styler.ColourTo(i, SCE_HPHP_VARIABLE);\r
+                               state = SCE_HPHP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_COMMENT:\r
+                       if (ch == '/' && chPrev == '*') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HPHP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_COMMENTLINE:\r
+                       if (ch == '\r' || ch == '\n') {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HPHP_DEFAULT;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_HSTRING:\r
+                       if (ch == '\\' && (phpStringDelimiter[0] == '\"' || chNext == '$' || chNext == '{')) {\r
+                               // skip the next char\r
+                               i++;\r
+                       } else if (((ch == '{' && chNext == '$') || (ch == '$' && chNext == '{'))\r
+                               && IsPhpWordStart(chNext2)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HPHP_COMPLEX_VARIABLE;\r
+                       } else if (ch == '$' && IsPhpWordStart(chNext)) {\r
+                               styler.ColourTo(i - 1, StateToPrint);\r
+                               state = SCE_HPHP_HSTRING_VARIABLE;\r
+                       } else if (styler.Match(i, phpStringDelimiter)) {\r
+                               if (phpStringDelimiter[0] == '\"') {\r
+                                       styler.ColourTo(i, StateToPrint);\r
+                                       state = SCE_HPHP_DEFAULT;\r
+                               } else if (isLineEnd(chPrev)) {\r
+                               const int psdLength = strlen(phpStringDelimiter);\r
+                                       const char chAfterPsd = styler.SafeGetCharAt(i + psdLength);\r
+                                       const char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1);\r
+                                       if (isLineEnd(chAfterPsd) ||\r
+                                               (chAfterPsd == ';' && isLineEnd(chAfterPsd2))) {\r
+                                                       i += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1;\r
+                                               styler.ColourTo(i, StateToPrint);\r
+                                               state = SCE_HPHP_DEFAULT;\r
+                                               if (foldHeredoc) levelCurrent--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_SIMPLESTRING:\r
+                       if (phpStringDelimiter[0] == '\'') {\r
+                               if (ch == '\\') {\r
+                                       // skip the next char\r
+                                       i++;\r
+                               } else if (ch == '\'') {\r
+                                       styler.ColourTo(i, StateToPrint);\r
+                                       state = SCE_HPHP_DEFAULT;\r
+                               }\r
+                       } else if (isLineEnd(chPrev) && styler.Match(i, phpStringDelimiter)) {\r
+                               const int psdLength = strlen(phpStringDelimiter);\r
+                               const char chAfterPsd = styler.SafeGetCharAt(i + psdLength);\r
+                               const char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1);\r
+                               if (isLineEnd(chAfterPsd) ||\r
+                               (chAfterPsd == ';' && isLineEnd(chAfterPsd2))) {\r
+                                       i += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1;\r
+                                       styler.ColourTo(i, StateToPrint);\r
+                                       state = SCE_HPHP_DEFAULT;\r
+                                       if (foldHeredoc) levelCurrent--;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_HSTRING_VARIABLE:\r
+                       if (!IsPhpWordChar(chNext)) {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HPHP_HSTRING;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_COMPLEX_VARIABLE:\r
+                       if (ch == '}') {\r
+                               styler.ColourTo(i, StateToPrint);\r
+                               state = SCE_HPHP_HSTRING;\r
+                       }\r
+                       break;\r
+               case SCE_HPHP_OPERATOR:\r
+               case SCE_HPHP_DEFAULT:\r
+                       styler.ColourTo(i - 1, StateToPrint);\r
+                       if (IsADigit(ch) || (ch == '.' && IsADigit(chNext))) {\r
+                               state = SCE_HPHP_NUMBER;\r
+                       } else if (IsAWordStart(ch)) {\r
+                               state = SCE_HPHP_WORD;\r
+                       } else if (ch == '/' && chNext == '*') {\r
+                               i++;\r
+                               state = SCE_HPHP_COMMENT;\r
+                       } else if (ch == '/' && chNext == '/') {\r
+                               i++;\r
+                               state = SCE_HPHP_COMMENTLINE;\r
+                       } else if (ch == '#') {\r
+                               state = SCE_HPHP_COMMENTLINE;\r
+                       } else if (ch == '\"') {\r
+                               state = SCE_HPHP_HSTRING;\r
+                               strcpy(phpStringDelimiter, "\"");\r
+                       } else if (styler.Match(i, "<<<")) {\r
+                               bool isSimpleString = false;\r
+                               i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString);\r
+                               if (strlen(phpStringDelimiter)) {\r
+                                       state = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING);\r
+                                       if (foldHeredoc) levelCurrent++;\r
+                               }\r
+                       } else if (ch == '\'') {\r
+                               state = SCE_HPHP_SIMPLESTRING;\r
+                               strcpy(phpStringDelimiter, "\'");\r
+                       } else if (ch == '$' && IsPhpWordStart(chNext)) {\r
+                               state = SCE_HPHP_VARIABLE;\r
+                       } else if (IsOperator(ch)) {\r
+                               state = SCE_HPHP_OPERATOR;\r
+                       } else if ((state == SCE_HPHP_OPERATOR) && (IsASpace(ch))) {\r
+                               state = SCE_HPHP_DEFAULT;\r
+                       }\r
+                       break;\r
+                       ///////////// end - PHP state handling\r
+               }\r
+\r
+               // Some of the above terminated their lexeme but since the same character starts\r
+               // the same class again, only reenter if non empty segment.\r
+\r
+               bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());\r
+               if (state == SCE_HB_DEFAULT) {    // One of the above succeeded\r
+                       if ((ch == '\"') && (nonEmptySegment)) {\r
+                               state = SCE_HB_STRING;\r
+                       } else if (ch == '\'') {\r
+                               state = SCE_HB_COMMENTLINE;\r
+                       } else if (IsAWordStart(ch)) {\r
+                               state = SCE_HB_WORD;\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i, SCE_HB_DEFAULT);\r
+                       }\r
+               } else if (state == SCE_HBA_DEFAULT) {    // One of the above succeeded\r
+                       if ((ch == '\"') && (nonEmptySegment)) {\r
+                               state = SCE_HBA_STRING;\r
+                       } else if (ch == '\'') {\r
+                               state = SCE_HBA_COMMENTLINE;\r
+                       } else if (IsAWordStart(ch)) {\r
+                               state = SCE_HBA_WORD;\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i, SCE_HBA_DEFAULT);\r
+                       }\r
+               } else if (state == SCE_HJ_DEFAULT) {    // One of the above succeeded\r
+                       if (ch == '/' && chNext == '*') {\r
+                               if (styler.SafeGetCharAt(i + 2) == '*')\r
+                                       state = SCE_HJ_COMMENTDOC;\r
+                               else\r
+                                       state = SCE_HJ_COMMENT;\r
+                       } else if (ch == '/' && chNext == '/') {\r
+                               state = SCE_HJ_COMMENTLINE;\r
+                       } else if ((ch == '\"') && (nonEmptySegment)) {\r
+                               state = SCE_HJ_DOUBLESTRING;\r
+                       } else if ((ch == '\'') && (nonEmptySegment)) {\r
+                               state = SCE_HJ_SINGLESTRING;\r
+                       } else if (IsAWordStart(ch)) {\r
+                               state = SCE_HJ_WORD;\r
+                       } else if (IsOperator(ch)) {\r
+                               styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));\r
+                       }\r
+               }\r
+       }\r
+\r
+       switch (state) {\r
+       case SCE_HJ_WORD:\r
+               classifyWordHTJS(styler.GetStartSegment(), lengthDoc - 1, keywords2, styler, inScriptType);\r
+               break;\r
+       case SCE_HB_WORD:\r
+               classifyWordHTVB(styler.GetStartSegment(), lengthDoc - 1, keywords3, styler, inScriptType);\r
+               break;\r
+       case SCE_HP_WORD:\r
+               classifyWordHTPy(styler.GetStartSegment(), lengthDoc - 1, keywords4, styler, prevWord, inScriptType);\r
+               break;\r
+       case SCE_HPHP_WORD:\r
+               classifyWordHTPHP(styler.GetStartSegment(), lengthDoc - 1, keywords5, styler);\r
+               break;\r
+       default:\r
+               StateToPrint = statePrintForState(state, inScriptType);\r
+               styler.ColourTo(lengthDoc - 1, StateToPrint);\r
+               break;\r
+       }\r
+\r
+       // Fill in the real level of the next line, keeping the current flags as they will be filled in later\r
+       if (fold) {\r
+               int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;\r
+               styler.SetLevel(lineCurrent, levelPrev | flagsNext);\r
+       }\r
+}\r
+\r
+static void ColouriseXMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+                                  Accessor &styler) {\r
+       // Passing in true because we're lexing XML\r
+       ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, true);\r
+}\r
+\r
+static void ColouriseHTMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+                                  Accessor &styler) {\r
+       // Passing in false because we're notlexing XML\r
+       ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, false);\r
+}\r
+\r
+static bool isASPScript(int state) {\r
+       return\r
+               (state >= SCE_HJA_START && state <= SCE_HJA_REGEX) ||\r
+               (state >= SCE_HBA_START && state <= SCE_HBA_STRINGEOL) ||\r
+               (state >= SCE_HPA_DEFAULT && state <= SCE_HPA_IDENTIFIER);\r
+}\r
+\r
+static void ColouriseHBAPiece(StyleContext &sc, WordList *keywordlists[]) {\r
+       WordList &keywordsVBS = *keywordlists[2];\r
+       if (sc.state == SCE_HBA_WORD) {\r
+               if (!IsAWordChar(sc.ch)) {\r
+                       char s[100];\r
+                       sc.GetCurrentLowered(s, sizeof(s));\r
+                       if (keywordsVBS.InList(s)) {\r
+                               if (strcmp(s, "rem") == 0) {\r
+                                       sc.ChangeState(SCE_HBA_COMMENTLINE);\r
+                                       if (sc.atLineEnd) {\r
+                                               sc.SetState(SCE_HBA_DEFAULT);\r
+                                       }\r
+                               } else {\r
+                                       sc.SetState(SCE_HBA_DEFAULT);\r
+                               }\r
+                       } else {\r
+                               sc.ChangeState(SCE_HBA_IDENTIFIER);\r
+                               sc.SetState(SCE_HBA_DEFAULT);\r
+                       }\r
+               }\r
+       } else if (sc.state == SCE_HBA_NUMBER) {\r
+               if (!IsAWordChar(sc.ch)) {\r
+                       sc.SetState(SCE_HBA_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HBA_STRING) {\r
+               if (sc.ch == '\"') {\r
+                       sc.ForwardSetState(SCE_HBA_DEFAULT);\r
+               } else if (sc.ch == '\r' || sc.ch == '\n') {\r
+                       sc.ChangeState(SCE_HBA_STRINGEOL);\r
+                       sc.ForwardSetState(SCE_HBA_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HBA_COMMENTLINE) {\r
+               if (sc.ch == '\r' || sc.ch == '\n') {\r
+                       sc.SetState(SCE_HBA_DEFAULT);\r
+               }\r
+       }\r
+\r
+       if (sc.state == SCE_HBA_DEFAULT) {\r
+               if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {\r
+                       sc.SetState(SCE_HBA_NUMBER);\r
+               } else if (IsAWordStart(sc.ch)) {\r
+                       sc.SetState(SCE_HBA_WORD);\r
+               } else if (sc.ch == '\'') {\r
+                       sc.SetState(SCE_HBA_COMMENTLINE);\r
+               } else if (sc.ch == '\"') {\r
+                       sc.SetState(SCE_HBA_STRING);\r
+               }\r
+       }\r
+}\r
+\r
+static void ColouriseHTMLPiece(StyleContext &sc, WordList *keywordlists[]) {\r
+       WordList &keywordsTags = *keywordlists[0];\r
+       if (sc.state == SCE_H_COMMENT) {\r
+               if (sc.Match("-->")) {\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_H_ENTITY) {\r
+               if (sc.ch == ';') {\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               } else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)    // Should check that '#' follows '&', but it is unlikely anyway...\r
+                       && sc.ch != '.' && sc.ch != '-' && sc.ch != '_' && sc.ch != ':') { // valid in XML\r
+                       sc.ChangeState(SCE_H_TAGUNKNOWN);\r
+                       sc.SetState(SCE_H_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_H_TAGUNKNOWN) {\r
+               if (!ishtmlwordchar(sc.ch) && !((sc.ch == '/') && (sc.chPrev == '<')) && sc.ch != '[') {\r
+                       char s[100];\r
+                       sc.GetCurrentLowered(s, sizeof(s));\r
+                       if (s[1] == '/') {\r
+                               if (keywordsTags.InList(s + 2)) {\r
+                                       sc.ChangeState(SCE_H_TAG);\r
+                               }\r
+                       } else {\r
+                               if (keywordsTags.InList(s + 1)) {\r
+                                       sc.ChangeState(SCE_H_TAG);\r
+                               }\r
+                       }\r
+                       if (sc.ch == '>') {\r
+                               sc.ForwardSetState(SCE_H_DEFAULT);\r
+                       } else if (sc.Match('/', '>')) {\r
+                               sc.SetState(SCE_H_TAGEND);\r
+                               sc.Forward();\r
+                               sc.ForwardSetState(SCE_H_DEFAULT);\r
+                       } else {\r
+                               sc.SetState(SCE_H_OTHER);\r
+                       }\r
+               }\r
+       } else if (sc.state == SCE_H_ATTRIBUTE) {\r
+               if (!ishtmlwordchar(sc.ch)) {\r
+                       char s[100];\r
+                       sc.GetCurrentLowered(s, sizeof(s));\r
+                       if (!keywordsTags.InList(s)) {\r
+                               sc.ChangeState(SCE_H_ATTRIBUTEUNKNOWN);\r
+                       }\r
+                       sc.SetState(SCE_H_OTHER);\r
+               }\r
+       } else if (sc.state == SCE_H_OTHER) {\r
+               if (sc.ch == '>') {\r
+                       sc.SetState(SCE_H_TAG);\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               } else if (sc.Match('/', '>')) {\r
+                       sc.SetState(SCE_H_TAG);\r
+                       sc.Forward();\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               } else if (sc.chPrev == '=') {\r
+                       sc.SetState(SCE_H_VALUE);\r
+               }\r
+       } else if (sc.state == SCE_H_DOUBLESTRING) {\r
+               if (sc.ch == '\"') {\r
+                       sc.ForwardSetState(SCE_H_OTHER);\r
+               }\r
+       } else if (sc.state == SCE_H_SINGLESTRING) {\r
+               if (sc.ch == '\'') {\r
+                       sc.ForwardSetState(SCE_H_OTHER);\r
+               }\r
+       } else if (sc.state == SCE_H_NUMBER) {\r
+               if (!IsADigit(sc.ch)) {\r
+                       sc.SetState(SCE_H_OTHER);\r
+               }\r
+       }\r
+\r
+       if (sc.state == SCE_H_DEFAULT) {\r
+               if (sc.ch == '<') {\r
+                       if (sc.Match("<!--"))\r
+                               sc.SetState(SCE_H_COMMENT);\r
+                       else\r
+                               sc.SetState(SCE_H_TAGUNKNOWN);\r
+               } else if (sc.ch == '&') {\r
+                       sc.SetState(SCE_H_ENTITY);\r
+               }\r
+       } else if ((sc.state == SCE_H_OTHER) || (sc.state == SCE_H_VALUE)) {\r
+               if (sc.ch == '\"' && sc.chPrev == '=') {\r
+                       sc.SetState(SCE_H_DOUBLESTRING);\r
+               } else if (sc.ch == '\'' && sc.chPrev == '=') {\r
+                       sc.SetState(SCE_H_SINGLESTRING);\r
+               } else if (IsADigit(sc.ch)) {\r
+                       sc.SetState(SCE_H_NUMBER);\r
+               } else if (sc.ch == '>') {\r
+                       sc.SetState(SCE_H_TAG);\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               } else if (ishtmlwordchar(sc.ch)) {\r
+                       sc.SetState(SCE_H_ATTRIBUTE);\r
+               }\r
+       }\r
+}\r
+\r
+static void ColouriseASPPiece(StyleContext &sc, WordList *keywordlists[]) {\r
+       // Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT\r
+       if ((sc.state == SCE_H_ASPAT || isASPScript(sc.state)) && sc.Match('%', '>')) {\r
+               sc.SetState(SCE_H_ASP);\r
+               sc.Forward();\r
+               sc.ForwardSetState(SCE_H_DEFAULT);\r
+       }\r
+\r
+       // Handle some ASP script\r
+       if (sc.state >= SCE_HBA_START && sc.state <= SCE_HBA_STRINGEOL) {\r
+               ColouriseHBAPiece(sc, keywordlists);\r
+       } else if (sc.state >= SCE_H_DEFAULT && sc.state <= SCE_H_SGML_BLOCK_DEFAULT) {\r
+               ColouriseHTMLPiece(sc, keywordlists);\r
+       }\r
+\r
+       // Enter new sc.state\r
+       if ((sc.state == SCE_H_DEFAULT) || (sc.state == SCE_H_TAGUNKNOWN)) {\r
+               if (sc.Match('<', '%')) {\r
+                       if (sc.state == SCE_H_TAGUNKNOWN)\r
+                               sc.ChangeState(SCE_H_ASP);\r
+                       else\r
+                               sc.SetState(SCE_H_ASP);\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       if (sc.ch == '@') {\r
+                               sc.ForwardSetState(SCE_H_ASPAT);\r
+                       } else {\r
+                               if (sc.ch == '=') {\r
+                                       sc.Forward();\r
+                               }\r
+                               sc.SetState(SCE_HBA_DEFAULT);\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+static void ColouriseASPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+                                  Accessor &styler) {\r
+       // Lexer for HTML requires more lexical states (8 bits worth) than most lexers\r
+       StyleContext sc(startPos, length, initStyle, styler, static_cast<char>(STYLE_MAX));\r
+       for (; sc.More(); sc.Forward()) {\r
+               ColouriseASPPiece(sc, keywordlists);\r
+       }\r
+       sc.Complete();\r
+}\r
+\r
+static void ColourisePHPPiece(StyleContext &sc, WordList *keywordlists[]) {\r
+       // Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT\r
+       if (sc.state >= SCE_HPHP_DEFAULT && sc.state <= SCE_HPHP_OPERATOR) {\r
+               if (!isPHPStringState(sc.state) &&\r
+                       (sc.state != SCE_HPHP_COMMENT) &&\r
+                       (sc.Match('?', '>'))) {\r
+                       sc.SetState(SCE_H_QUESTION);\r
+                       sc.Forward();\r
+                       sc.ForwardSetState(SCE_H_DEFAULT);\r
+               }\r
+       }\r
+\r
+       if (sc.state >= SCE_H_DEFAULT && sc.state <= SCE_H_SGML_BLOCK_DEFAULT) {\r
+               ColouriseHTMLPiece(sc, keywordlists);\r
+       }\r
+\r
+       // Handle some PHP script\r
+       if (sc.state == SCE_HPHP_WORD) {\r
+               if (!IsPhpWordChar(static_cast<char>(sc.ch))) {\r
+                       sc.SetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_COMMENTLINE) {\r
+               if (sc.ch == '\r' || sc.ch == '\n') {\r
+                       sc.SetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_COMMENT) {\r
+               if (sc.Match('*', '/')) {\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.SetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_HSTRING) {\r
+               if (sc.ch == '\"') {\r
+                       sc.ForwardSetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_SIMPLESTRING) {\r
+               if (sc.ch == '\'') {\r
+                       sc.ForwardSetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_VARIABLE) {\r
+               if (!IsPhpWordChar(static_cast<char>(sc.ch))) {\r
+                       sc.SetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       } else if (sc.state == SCE_HPHP_OPERATOR) {\r
+               sc.SetState(SCE_HPHP_DEFAULT);\r
+       }\r
+\r
+       // Enter new sc.state\r
+       if ((sc.state == SCE_H_DEFAULT) || (sc.state == SCE_H_TAGUNKNOWN)) {\r
+               if (sc.Match("<?php")) {\r
+                       sc.SetState(SCE_H_QUESTION);\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.Forward();\r
+                       sc.SetState(SCE_HPHP_DEFAULT);\r
+               }\r
+       }\r
+       if (sc.state == SCE_HPHP_DEFAULT) {\r
+               if (IsPhpWordStart(static_cast<char>(sc.ch))) {\r
+                       sc.SetState(SCE_HPHP_WORD);\r
+               } else if (sc.ch == '#') {\r
+                       sc.SetState(SCE_HPHP_COMMENTLINE);\r
+               } else if (sc.Match("<!--")) {\r
+                       sc.SetState(SCE_HPHP_COMMENTLINE);\r
+               } else if (sc.Match('/', '/')) {\r
+                       sc.SetState(SCE_HPHP_COMMENTLINE);\r
+               } else if (sc.Match('/', '*')) {\r
+                       sc.SetState(SCE_HPHP_COMMENT);\r
+               } else if (sc.ch == '\"') {\r
+                       sc.SetState(SCE_HPHP_HSTRING);\r
+               } else if (sc.ch == '\'') {\r
+                       sc.SetState(SCE_HPHP_SIMPLESTRING);\r
+               } else if (sc.ch == '$' && IsPhpWordStart(static_cast<char>(sc.chNext))) {\r
+                       sc.SetState(SCE_HPHP_VARIABLE);\r
+               } else if (IsOperator(static_cast<char>(sc.ch))) {\r
+                       sc.SetState(SCE_HPHP_OPERATOR);\r
+               }\r
+       }\r
+}\r
+\r
+static void ColourisePHPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+                                  Accessor &styler) {\r
+       // Lexer for HTML requires more lexical states (8 bits worth) than most lexers\r
+       StyleContext sc(startPos, length, initStyle, styler, static_cast<char>(STYLE_MAX));\r
+       for (; sc.More(); sc.Forward()) {\r
+               ColourisePHPPiece(sc, keywordlists);\r
+       }\r
+       sc.Complete();\r
+}\r
+\r
+static void ColourisePHPScriptDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],\r
+        Accessor &styler) {\r
+       if (startPos == 0)\r
+               initStyle = SCE_HPHP_DEFAULT;\r
+       ColouriseHTMLDoc(startPos, length, initStyle, keywordlists, styler);\r
+}\r
+\r
+static const char * const htmlWordListDesc[] = {\r
+       "HTML elements and attributes",\r
+       "JavaScript keywords",\r
+       "VBScript keywords",\r
+       "Python keywords",\r
+       "PHP keywords",\r
+       "SGML and DTD keywords",\r
+       0,\r
+};\r
+\r
+static const char * const phpscriptWordListDesc[] = {\r
+       "", //Unused\r
+       "", //Unused\r
+       "", //Unused\r
+       "", //Unused\r
+       "PHP keywords",\r
+       "", //Unused\r
+       0,\r
+};\r
+\r
+LexerModule lmHTML(SCLEX_HTML, ColouriseHTMLDoc, "hypertext", 0, htmlWordListDesc, 8);\r
+LexerModule lmXML(SCLEX_XML, ColouriseXMLDoc, "xml", 0, htmlWordListDesc, 8);\r
+// SCLEX_ASP and SCLEX_PHP should not be used in new code: use SCLEX_HTML instead.\r
+LexerModule lmASP(SCLEX_ASP, ColouriseASPDoc, "asp", 0, htmlWordListDesc, 8);\r
+LexerModule lmPHP(SCLEX_PHP, ColourisePHPDoc, "php", 0, htmlWordListDesc, 8);\r
+LexerModule lmPHPSCRIPT(SCLEX_PHPSCRIPT, ColourisePHPScriptDoc, "phpscript", 0, phpscriptWordListDesc, 8);\r