// SciTE - Scintilla based Text Editor // LexHTML.cxx - lexer for HTML // Copyright 1998-2000 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #include #include #include #include #include #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" enum { eScriptNone, eScriptJS, eScriptVBS, eScriptPython }; static int segIsScriptingIndicator(StylingContext &styler, unsigned int start, unsigned int end, int prevValue) { char s[100]; s[0] = '\0'; for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = tolower(styler[start + i]); s[i + 1] = '\0'; } //Platform::DebugPrintf("Scripting indicator [%s]\n", s); if (strstr(s, "vbs")) return eScriptVBS; if (strstr(s, "pyth")) return eScriptPython; if (strstr(s, "javas")) return eScriptJS; if (strstr(s, "jscr")) return eScriptJS; return prevValue; } static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') || (styler[start] == '-') || (styler[start] == '#'); char chAttr = SCE_H_ATTRIBUTEUNKNOWN; if (wordIsNumber) { chAttr = SCE_H_NUMBER; } else { char s[100]; s[0] = '\0'; for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = tolower(styler[start + i]); s[i + 1] = '\0'; } if (keywords.InList(s)) chAttr = SCE_H_ATTRIBUTE; } styler.ColourTo(end, chAttr); } static int classifyTagHTML(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { char s[100]; // Copy after the '<' unsigned int i = 0; for (unsigned int cPos=start; cPos <= end && i < 30; cPos++) { char ch = styler[cPos]; if (ch != '<') s[i++] = tolower(ch); } s[i] = '\0'; char chAttr = SCE_H_TAGUNKNOWN; if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment chAttr = SCE_H_COMMENT; } else if (s[0] == '/') { // Closing tag if (keywords.InList(s + 1)) chAttr = SCE_H_TAG; } else { if (keywords.InList(s)) { chAttr = SCE_H_TAG; if (0 == strcmp(s, "script")) chAttr = SCE_H_SCRIPT; } } styler.ColourTo(end, chAttr); return chAttr; } static void classifyWordHTJS(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; } char chAttr = SCE_HJ_WORD; if (wordIsNumber) chAttr = SCE_HJ_NUMBER; else { if (keywords.InList(s)) chAttr = SCE_HJ_KEYWORD; } styler.ColourTo(end, chAttr); } static void classifyWordHTJSA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; } char chAttr = SCE_HJA_WORD; if (wordIsNumber) chAttr = SCE_HJA_NUMBER; else { if (keywords.InList(s)) chAttr = SCE_HJA_KEYWORD; } styler.ColourTo(end, chAttr); } static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = tolower(styler[start + i]); s[i + 1] = '\0'; } char chAttr = SCE_HB_IDENTIFIER; if (wordIsNumber) chAttr = SCE_HB_NUMBER; else { if (keywords.InList(s)) { chAttr = SCE_HB_WORD; if (strcmp(s, "rem") == 0) chAttr = SCE_HB_COMMENTLINE; } } styler.ColourTo(end, chAttr); if (chAttr == SCE_HB_COMMENTLINE) return SCE_HB_COMMENTLINE; else return SCE_HB_DEFAULT; } static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = tolower(styler[start + i]); s[i + 1] = '\0'; } char chAttr = SCE_HBA_IDENTIFIER; if (wordIsNumber) chAttr = SCE_HBA_NUMBER; else { if (keywords.InList(s)) { chAttr = SCE_HBA_WORD; if (strcmp(s, "rem") == 0) chAttr = SCE_HBA_COMMENTLINE; } } styler.ColourTo(end, chAttr); if (chAttr == SCE_HBA_COMMENTLINE) return SCE_HBA_COMMENTLINE; else return SCE_HBA_DEFAULT; } static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; } char chAttr = SCE_HP_IDENTIFIER; if (0 == strcmp(prevWord, "class")) chAttr = SCE_HP_CLASSNAME; else if (0 == strcmp(prevWord, "def")) chAttr = SCE_HP_DEFNAME; else if (wordIsNumber) chAttr = SCE_HP_NUMBER; else if (keywords.InList(s)) chAttr = SCE_HP_WORD; styler.ColourTo(end, chAttr); strcpy(prevWord, s); } static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { s[i] = styler[start + i]; s[i + 1] = '\0'; } char chAttr = SCE_HPA_IDENTIFIER; if (0 == strcmp(prevWord, "class")) chAttr = SCE_HPA_CLASSNAME; else if (0 == strcmp(prevWord, "def")) chAttr = SCE_HPA_DEFNAME; else if (wordIsNumber) chAttr = SCE_HPA_NUMBER; else if (keywords.InList(s)) chAttr = SCE_HPA_WORD; styler.ColourTo(end, chAttr); strcpy(prevWord, s); } inline bool ishtmlwordchar(char ch) { return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#'; } static bool InTagState(int state) { return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN || state == SCE_H_SCRIPT || state == SCE_H_ATTRIBUTE || state == SCE_H_ATTRIBUTEUNKNOWN || state == SCE_H_NUMBER || state == SCE_H_OTHER || state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING; } static bool isLineEnd(char ch) { return ch == '\r' || ch == '\n'; } static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], StylingContext &styler) { WordList &keywords=*keywordlists[0]; WordList &keywords2=*keywordlists[1]; WordList &keywords3=*keywordlists[2]; WordList &keywords4=*keywordlists[3]; // Lexer for HTML requires more lexical states (7 bits worth) than most lexers styler.StartAt(startPos, 127); bool lastTagWasScript = false; char prevWord[200]; prevWord[0] = '\0'; int scriptLanguage = eScriptJS; int state = initStyle; // If inside a tag, it may be a script tage, so reread from the start to ensure any language tas are seen if (InTagState(state)) { while ((startPos > 1) && (InTagState(styler.StyleAt(startPos - 1)))) { startPos--; } state = SCE_H_DEFAULT; } styler.StartAt(startPos, 127); int lineState = eScriptVBS; int lineCurrent = styler.GetLine(startPos); if (lineCurrent > 0) lineState = styler.GetLineState(lineCurrent); int defaultScript = lineState &0xff; int beforeASP = (lineState >> 8) &0xff; int inASP = (lineState >> 16) &0xff; char chPrev = ' '; char chPrev2 = ' '; styler.StartSegment(startPos); int lengthDoc = startPos + length; for (int i = startPos; i <= lengthDoc; i++) { char ch = styler[i]; char chNext = styler.SafeGetCharAt(i + 1); char chNext2 = styler.SafeGetCharAt(i + 2); if (styler.IsLeadByte(ch)) { chPrev2 = ' '; chPrev = ' '; i += 1; continue; } if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { // New line -> record any line state onto /next/ line lineCurrent++; styler.SetLineState(lineCurrent, defaultScript | (beforeASP << 8) | (inASP << 16)); } // Handle ASP even within other constructs as it is a preprocessor if ((ch == '<') && (chNext == '%')) { beforeASP = state; styler.ColourTo(i - 1, state); if (chNext2 == '@') { styler.ColourTo(i + 2, SCE_H_ASP); state = SCE_H_ASPAT; i+=2; } else { if (defaultScript == eScriptVBS) state = SCE_HBA_START; else if (defaultScript == eScriptPython) state = SCE_HPA_START; else state = SCE_HJA_START; if (chNext2 == '=') { styler.ColourTo(i + 2, SCE_H_ASP); i+=2; } else { styler.ColourTo(i + 1, SCE_H_ASP); i++; } } inASP = 1; continue; } if (inASP && (ch == '%') && (chNext == '>')) { if (state == SCE_H_ASPAT) defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, defaultScript); // Bounce out of any ASP mode if (state == SCE_HJA_WORD) { classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); } else if (state == SCE_HBA_WORD) { classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); } else if (state == SCE_HPA_WORD) { classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); } else { styler.ColourTo(i - 1, state); } //if (state == SCE_H_ASPAT) // styler.ColourTo(i+1, SCE_H_ASPAT); //else styler.ColourTo(i+1, SCE_H_ASP); i++; state = beforeASP; beforeASP = SCE_H_DEFAULT; inASP = 0; continue; } if (state == SCE_H_DEFAULT) { if (ch == '<') { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; if (chNext == '?') { styler.ColourTo(i + 1, SCE_H_XMLSTART); i++; ch = chNext; } } else if (ch == '&') { styler.ColourTo(i - 1, SCE_H_DEFAULT); state = SCE_H_ENTITY; } } else if (state == SCE_H_COMMENT) { if ((ch == '>') && (chPrev == '-')) { styler.ColourTo(i, state); state = SCE_H_DEFAULT; } } else if (state == SCE_H_ENTITY) { if (ch == ';') { styler.ColourTo(i, state); state = SCE_H_DEFAULT; } } else if (state == SCE_H_TAGUNKNOWN) { if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler); lastTagWasScript = eClass == SCE_H_SCRIPT; if (lastTagWasScript) { scriptLanguage = eScriptJS; eClass = SCE_H_TAG; } if (ch == '>') { styler.ColourTo(i, SCE_H_TAG); if (lastTagWasScript) { if (scriptLanguage == eScriptVBS) state = SCE_HB_START; else if (scriptLanguage == eScriptPython) state = SCE_HP_START; else state = SCE_HJ_START; } else { state = SCE_H_DEFAULT; } } else { if (eClass == SCE_H_COMMENT) { state = SCE_H_COMMENT; } else { state = SCE_H_OTHER; } } } } else if (state == SCE_H_ATTRIBUTE) { if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { if (lastTagWasScript) scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, scriptLanguage); classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler); if (ch == '>') { styler.ColourTo(i, SCE_H_TAG); if (lastTagWasScript) { if (scriptLanguage == eScriptVBS) state = SCE_HB_START; else if (scriptLanguage == eScriptPython) state = SCE_HP_START; else state = SCE_HJ_START; } else { state = SCE_H_DEFAULT; } } else { state = SCE_H_OTHER; } } } else if (state == SCE_H_ASP) { if ((ch == '>') && (chPrev == '%')) { styler.ColourTo(i, state); state = SCE_H_DEFAULT; } } else if (state == SCE_H_ASPAT) { if ((ch == '>') && (chPrev == '%')) { styler.ColourTo(i, state); state = SCE_H_DEFAULT; } } else if (state == SCE_H_OTHER) { if (ch == '>') { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_H_TAG); if (lastTagWasScript) { if (scriptLanguage == eScriptVBS) state = SCE_HB_START; else if (scriptLanguage == eScriptPython) state = SCE_HP_START; else state = SCE_HJ_START; } else { state = SCE_H_DEFAULT; } } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_H_DOUBLESTRING; } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_H_SINGLESTRING; } else if (ch == '/' && chNext == '>') { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } else if (ch == '?' && chNext == '>') { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_XMLEND); i++; ch = chNext; state = SCE_H_DEFAULT; } else if (ishtmlwordchar(ch)) { styler.ColourTo(i - 1, state); state = SCE_H_ATTRIBUTE; } } else if (state == SCE_H_DOUBLESTRING) { if (ch == '\"') { if (lastTagWasScript) scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage); styler.ColourTo(i, SCE_H_DOUBLESTRING); state = SCE_H_OTHER; } } else if (state == SCE_H_SINGLESTRING) { if (ch == '\'') { if (lastTagWasScript) scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage); styler.ColourTo(i, SCE_H_SINGLESTRING); state = SCE_H_OTHER; } } else if (state == SCE_HJ_DEFAULT || state == SCE_HJ_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HJ_WORD; } else if (ch == '/' && chNext == '*') { styler.ColourTo(i - 1, state); if (chNext2 == '*') state = SCE_HJ_COMMENTDOC; else state = SCE_HJ_COMMENT; } else if (ch == '/' && chNext == '/') { styler.ColourTo(i - 1, state); state = SCE_HJ_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_HJ_DOUBLESTRING; } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_HJ_SINGLESTRING; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HJ_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HJ_SYMBOLS); state = SCE_HJ_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HJ_START) { styler.ColourTo(i - 1, state); state = SCE_HJ_DEFAULT; } } } else if (state == SCE_HJ_WORD) { if (!iswordchar(ch)) { classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler); //styler.ColourTo(i - 1, eHTJSKeyword); state = SCE_HJ_DEFAULT; if (ch == '/' && chNext == '*') { if (chNext2 == '*') state = SCE_HJ_COMMENTDOC; else state = SCE_HJ_COMMENT; } else if (ch == '/' && chNext == '/') { state = SCE_HJ_COMMENTLINE; } else if (ch == '\"') { state = SCE_HJ_DOUBLESTRING; } else if (ch == '\'') { state = SCE_HJ_SINGLESTRING; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HJ_SYMBOLS); state = SCE_HJ_DEFAULT; } } } else if (state == SCE_HJ_COMMENT) { if (ch == '/' && chPrev == '*') { state = SCE_HJ_DEFAULT; styler.ColourTo(i, SCE_HJ_COMMENT); } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } } else if (state == SCE_HJ_COMMENTDOC) { if (ch == '/' && chPrev == '*') { state = SCE_HJ_DEFAULT; styler.ColourTo(i, SCE_HJ_COMMENTDOC); } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } } else if (state == SCE_HJ_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE); state = SCE_HJ_DEFAULT; } else if ((ch == '<') && (chNext == '/')) { // Common to hide end script tag in comment styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE); state = SCE_H_TAGUNKNOWN; } } else if (state == SCE_HJ_DOUBLESTRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; } } else if (ch == '\"') { styler.ColourTo(i, SCE_HJ_DOUBLESTRING); state = SCE_HJ_DEFAULT; i++; ch = chNext; } else if (isLineEnd(ch)) { styler.ColourTo(i-1, state); state = SCE_HJ_STRINGEOL; } } else if (state == SCE_HJ_SINGLESTRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; } } else if (ch == '\'') { styler.ColourTo(i, SCE_HJ_SINGLESTRING); state = SCE_HJ_DEFAULT; i++; ch = chNext; } else if (isLineEnd(ch)) { styler.ColourTo(i-1, state); state = SCE_HJ_STRINGEOL; } } else if (state == SCE_HJ_STRINGEOL) { if (!isLineEnd(ch)) { styler.ColourTo(i - 1, state); state = SCE_HJ_DEFAULT; } else if (!isLineEnd(chNext)) { styler.ColourTo(i, state); state = SCE_HJ_DEFAULT; } } else if (state == SCE_HJA_DEFAULT || state == SCE_HJA_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HJA_WORD; } else if (ch == '/' && chNext == '*') { styler.ColourTo(i - 1, state); if (chNext2 == '*') state = SCE_HJA_COMMENTDOC; else state = SCE_HJA_COMMENT; } else if (ch == '/' && chNext == '/') { styler.ColourTo(i - 1, state); state = SCE_HJA_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_HJA_DOUBLESTRING; } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_HJA_SINGLESTRING; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HJA_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HJA_SYMBOLS); state = SCE_HJA_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HJA_START) { styler.ColourTo(i - 1, state); state = SCE_HJA_DEFAULT; } } } else if (state == SCE_HJA_WORD) { if (!iswordchar(ch)) { classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); //styler.ColourTo(i - 1, eHTJSKeyword); state = SCE_HJA_DEFAULT; if (ch == '/' && chNext == '*') { if (chNext2 == '*') state = SCE_HJA_COMMENTDOC; else state = SCE_HJA_COMMENT; } else if (ch == '/' && chNext == '/') { state = SCE_HJA_COMMENTLINE; } else if (ch == '\"') { state = SCE_HJA_DOUBLESTRING; } else if (ch == '\'') { state = SCE_HJA_SINGLESTRING; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HJA_SYMBOLS); state = SCE_HJA_DEFAULT; } } } else if (state == SCE_HJA_COMMENT) { if (ch == '/' && chPrev == '*') { state = SCE_HJA_DEFAULT; styler.ColourTo(i, SCE_HJA_COMMENT); } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } } else if (state == SCE_HJA_COMMENTDOC) { if (ch == '/' && chPrev == '*') { state = SCE_HJA_DEFAULT; styler.ColourTo(i, SCE_HJA_COMMENTDOC); } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } } else if (state == SCE_HJA_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE); state = SCE_HJA_DEFAULT; } else if ((ch == '<') && (chNext == '/')) { // Common to hide end script tag in comment styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE); state = SCE_H_TAGUNKNOWN; } } else if (state == SCE_HJA_DOUBLESTRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; } } else if (ch == '\"') { styler.ColourTo(i, SCE_HJA_DOUBLESTRING); state = SCE_HJA_DEFAULT; i++; ch = chNext; } else if (isLineEnd(ch)) { styler.ColourTo(i-1, state); state = SCE_HJA_STRINGEOL; } } else if (state == SCE_HJA_SINGLESTRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; } } else if (ch == '\'') { styler.ColourTo(i, SCE_HJA_SINGLESTRING); state = SCE_HJA_DEFAULT; i++; ch = chNext; } else if (isLineEnd(ch)) { styler.ColourTo(i-1, state); state = SCE_HJA_STRINGEOL; } } else if (state == SCE_HJA_STRINGEOL) { if (!isLineEnd(ch)) { styler.ColourTo(i - 1, state); state = SCE_HJA_DEFAULT; } else if (!isLineEnd(chNext)) { styler.ColourTo(i, state); state = SCE_HJA_DEFAULT; } } else if (state == SCE_HB_DEFAULT || state == SCE_HB_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HB_WORD; } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_HB_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_HB_STRING; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HB_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HB_DEFAULT); state = SCE_HB_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HB_START) { styler.ColourTo(i - 1, state); state = SCE_HB_DEFAULT; } } } else if (state == SCE_HB_WORD) { if (!iswordchar(ch)) { state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler); if (state == SCE_HB_DEFAULT) { if (ch == '\"') { state = SCE_HB_STRING; } else if (ch == '\'') { state = SCE_HB_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HB_DEFAULT); state = SCE_HB_DEFAULT; } } } } else if (state == SCE_HB_STRING) { if (ch == '\"') { styler.ColourTo(i, state); state = SCE_HB_DEFAULT; i++; ch = chNext; } else if (ch == '\r' || ch == '\n') { styler.ColourTo(i-1, state); state = SCE_HB_STRINGEOL; } } else if (state == SCE_HB_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_HB_DEFAULT; } else if ((ch == '<') && (chNext == '/')) { // Common to hide end script tag in comment styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } } else if (state == SCE_HB_STRINGEOL) { if (!isLineEnd(ch)) { styler.ColourTo(i - 1, state); state = SCE_HB_DEFAULT; } else if (!isLineEnd(chNext)) { styler.ColourTo(i, state); state = SCE_HB_DEFAULT; } } else if (state == SCE_HBA_DEFAULT || state == SCE_HBA_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HBA_WORD; } else if (ch == '\'') { styler.ColourTo(i - 1, state); state = SCE_HBA_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); state = SCE_HBA_STRING; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HBA_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HBA_DEFAULT); state = SCE_HBA_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HBA_START) { styler.ColourTo(i - 1, state); state = SCE_HBA_DEFAULT; } } } else if (state == SCE_HBA_WORD) { if (!iswordchar(ch)) { state = classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); if (state == SCE_HBA_DEFAULT) { if (ch == '\"') { state = SCE_HBA_STRING; } else if (ch == '\'') { state = SCE_HBA_COMMENTLINE; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HBA_DEFAULT); state = SCE_HBA_DEFAULT; } } } } else if (state == SCE_HBA_STRING) { if (ch == '\"') { styler.ColourTo(i, state); state = SCE_HBA_DEFAULT; i++; ch = chNext; } else if (ch == '\r' || ch == '\n') { styler.ColourTo(i-1, state); state = SCE_HBA_STRINGEOL; } } else if (state == SCE_HBA_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_HBA_DEFAULT; } else if ((ch == '<') && (chNext == '/')) { // Common to hide end script tag in comment styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } } else if (state == SCE_HBA_STRINGEOL) { if (!isLineEnd(ch)) { styler.ColourTo(i - 1, state); state = SCE_HBA_DEFAULT; } else if (!isLineEnd(chNext)) { styler.ColourTo(i, state); state = SCE_HBA_DEFAULT; } } else if (state == SCE_HP_DEFAULT || state == SCE_HP_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HP_WORD; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HP_COMMENTLINE; } else if (ch == '#') { styler.ColourTo(i - 1, state); state = SCE_HP_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_HP_TRIPLEDOUBLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HP_STRING; } } else if (ch == '\'') { styler.ColourTo(i - 1, state); if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_HP_TRIPLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HP_CHARACTER; } } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HP_OPERATOR); } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HP_START) { styler.ColourTo(i - 1, state); state = SCE_HP_DEFAULT; } } } else if (state == SCE_HP_WORD) { if (!iswordchar(ch)) { classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); state = SCE_HP_DEFAULT; if (ch == '#') { state = SCE_HP_COMMENTLINE; } else if (ch == '\"') { if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_HP_TRIPLEDOUBLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HP_STRING; } } else if (ch == '\'') { if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_HP_TRIPLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HP_CHARACTER; } } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HP_OPERATOR); } } } else if (state == SCE_HP_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_HP_DEFAULT; } } else if (state == SCE_HP_STRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { styler.ColourTo(i, state); state = SCE_HP_DEFAULT; } } else if (state == SCE_HP_CHARACTER) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { styler.ColourTo(i, state); state = SCE_HP_DEFAULT; } } else if (state == SCE_HP_TRIPLE) { if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { styler.ColourTo(i, state); state = SCE_HP_DEFAULT; } } else if (state == SCE_HP_TRIPLEDOUBLE) { if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { styler.ColourTo(i, state); state = SCE_HP_DEFAULT; } } else if (state == SCE_HPA_DEFAULT || state == SCE_HPA_START) { if (iswordstart(ch)) { styler.ColourTo(i - 1, state); state = SCE_HPA_WORD; } else if ((ch == '<') && (chNext == '/')) { styler.ColourTo(i - 1, state); state = SCE_H_TAGUNKNOWN; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { styler.ColourTo(i - 1, state); state = SCE_HPA_COMMENTLINE; } else if (ch == '#') { styler.ColourTo(i - 1, state); state = SCE_HPA_COMMENTLINE; } else if (ch == '\"') { styler.ColourTo(i - 1, state); if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_HPA_TRIPLEDOUBLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HPA_STRING; } } else if (ch == '\'') { styler.ColourTo(i - 1, state); if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_HPA_TRIPLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HPA_CHARACTER; } } else if (isoperator(ch)) { styler.ColourTo(i - 1, state); styler.ColourTo(i, SCE_HPA_OPERATOR); } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HPA_START) { styler.ColourTo(i - 1, state); state = SCE_HPA_DEFAULT; } } } else if (state == SCE_HPA_WORD) { if (!iswordchar(ch)) { classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); state = SCE_HPA_DEFAULT; if (ch == '#') { state = SCE_HPA_COMMENTLINE; } else if (ch == '\"') { if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_HPA_TRIPLEDOUBLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HPA_STRING; } } else if (ch == '\'') { if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_HPA_TRIPLE; ch = ' '; chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { state = SCE_HPA_CHARACTER; } } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HPA_OPERATOR); } } } else if (state == SCE_HPA_COMMENTLINE) { if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); state = SCE_HPA_DEFAULT; } } else if (state == SCE_HPA_STRING) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { styler.ColourTo(i, state); state = SCE_HPA_DEFAULT; } } else if (state == SCE_HPA_CHARACTER) { if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { styler.ColourTo(i, state); state = SCE_HPA_DEFAULT; } } else if (state == SCE_HPA_TRIPLE) { if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { styler.ColourTo(i, state); state = SCE_HPA_DEFAULT; } } else if (state == SCE_HPA_TRIPLEDOUBLE) { if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { styler.ColourTo(i, state); state = SCE_HPA_DEFAULT; } } if (state == SCE_HB_DEFAULT) { // One of the above succeeded if (ch == '\"') { state = SCE_HB_STRING; } else if (ch == '\'') { state = SCE_HB_COMMENTLINE; } else if (iswordstart(ch)) { state = SCE_HB_WORD; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HB_DEFAULT); } } if (state == SCE_HBA_DEFAULT) { // One of the above succeeded if (ch == '\"') { state = SCE_HBA_STRING; } else if (ch == '\'') { state = SCE_HBA_COMMENTLINE; } else if (iswordstart(ch)) { state = SCE_HBA_WORD; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HBA_DEFAULT); } } if (state == SCE_HJ_DEFAULT) { // One of the above succeeded if (ch == '/' && chNext == '*') { if (styler.SafeGetCharAt(i + 2) == '*') state = SCE_HJ_COMMENTDOC; else state = SCE_HJ_COMMENT; } else if (ch == '/' && chNext == '/') { state = SCE_HJ_COMMENTLINE; } else if (ch == '\"') { state = SCE_HJ_DOUBLESTRING; } else if (ch == '\'') { state = SCE_HJ_SINGLESTRING; } else if (iswordstart(ch)) { state = SCE_HJ_WORD; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HJ_SYMBOLS); } } if (state == SCE_HJA_DEFAULT) { // One of the above succeeded if (ch == '/' && chNext == '*') { if (styler.SafeGetCharAt(i + 2) == '*') state = SCE_HJA_COMMENTDOC; else state = SCE_HJA_COMMENT; } else if (ch == '/' && chNext == '/') { state = SCE_HJA_COMMENTLINE; } else if (ch == '\"') { state = SCE_HJA_DOUBLESTRING; } else if (ch == '\'') { state = SCE_HJA_SINGLESTRING; } else if (iswordstart(ch)) { state = SCE_HJA_WORD; } else if (isoperator(ch)) { styler.ColourTo(i, SCE_HJA_SYMBOLS); } } chPrev2 = chPrev; chPrev = ch; } styler.ColourTo(lengthDoc - 1, state); } static LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc); static LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc);