diff options
| author | nyamatongwe <devnull@localhost> | 2000-07-08 13:51:28 +0000 | 
|---|---|---|
| committer | nyamatongwe <devnull@localhost> | 2000-07-08 13:51:28 +0000 | 
| commit | ed0545bea646d94a29a05b56fd5d998d05a4a30d (patch) | |
| tree | 21c5fa7d4bfbb8e44e3ed5af9d5f0c35d4d2afc5 /src | |
| parent | 5b811e9f08cc34de8328e1776c7d845680e1801d (diff) | |
| download | scintilla-mirror-ed0545bea646d94a29a05b56fd5d998d05a4a30d.tar.gz | |
Included Steve Lhomme's PHP updates for the HTML lexer.
Diffstat (limited to 'src')
| -rw-r--r-- | src/LexHTML.cxx | 742 | 
1 files changed, 532 insertions, 210 deletions
| diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index e9451383b..506f9a491 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -17,15 +17,15 @@  #include "Scintilla.h"  #include "SciLexer.h" -enum { eScriptNone, eScriptJS, eScriptVBS, eScriptPython }; +enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML };  static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) { -	char s[100]; +	char s[30 + 1];  	s[0] = '\0';  	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {  		s[i] = static_cast<char>(tolower(styler[start + i]));  		s[i + 1] = '\0';  	} -//Platform::DebugPrintf("Scripting indicator [%s]\n", s); +	//Platform::DebugPrintf("Scripting indicator [%s]\n", s);  	if (strstr(s, "vbs"))  		return eScriptVBS;  	if (strstr(s, "pyth")) @@ -34,10 +34,29 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne  		return eScriptJS;  	if (strstr(s, "jscr"))  		return eScriptJS; -		 +	if (strstr(s, "php")) +		return eScriptPHP; +	if (strstr(s, "xml")) +		return eScriptXML; +  	return prevValue;  } +static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) { +	int iResult = 0; +	char s[30 + 1]; +	s[0] = '\0'; +	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +		s[i] = static_cast<char>(tolower(styler[start + i])); +		s[i + 1] = '\0'; +	} +	if (0 == strncmp(s, "php", 3)) { +		iResult = 3; +	} + +	return iResult; +} +  static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {  	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') ||  	                    (styler[start] == '-') || (styler[start] == '#'); @@ -45,7 +64,7 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k  	if (wordIsNumber) {  		chAttr = SCE_H_NUMBER;  	} else { -		char s[100]; +		char s[30 + 1];  		s[0] = '\0';  		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {  			s[i] = static_cast<char>(tolower(styler[start + i])); @@ -61,11 +80,11 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k  }  static int classifyTagHTML(unsigned int start, unsigned int end, -                         WordList &keywords, Accessor &styler) { -	char s[100]; +                           WordList &keywords, Accessor &styler) { +	char s[30 + 1];  	// Copy after the '<'  	unsigned int i = 0; -	for (unsigned int cPos=start; cPos <= end && i < 30; cPos++) { +	for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) {  		char ch = styler[cPos];  		if (ch != '<')  			s[i++] = static_cast<char>(tolower(ch)); @@ -82,8 +101,9 @@ static int classifyTagHTML(unsigned int start, unsigned int end,  	} else {  		if (keywords.InList(s)) {  			chAttr = SCE_H_TAG; -			if (0 == strcmp(s, "script")) -				chAttr = SCE_H_SCRIPT; +		} +		if (0 == strcmp(s, "script")) { +			chAttr = SCE_H_SCRIPT;  		}  	}  	if ((chAttr == SCE_H_TAGUNKNOWN) && !keywords) @@ -95,16 +115,16 @@ static int classifyTagHTML(unsigned int start, unsigned int end,  static void classifyWordHTJS(unsigned int start, unsigned int end,                               WordList &keywords, Accessor &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; +	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber)  		chAttr = SCE_HJ_NUMBER;  	else { +		char s[30 + 1]; +		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +			s[i] = styler[start + i]; +			s[i + 1] = '\0'; +		}  		if (keywords.InList(s))  			chAttr = SCE_HJ_KEYWORD;  	} @@ -112,17 +132,17 @@ static void classifyWordHTJS(unsigned int start, unsigned int end,  }  static void classifyWordHTJSA(unsigned int start, unsigned int end, -                             WordList &keywords, Accessor &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'; -	} +                              WordList &keywords, Accessor &styler) {  	char chAttr = SCE_HJA_WORD; +	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber)  		chAttr = SCE_HJA_NUMBER;  	else { +		char s[30 + 1]; +		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +			s[i] = styler[start + i]; +			s[i + 1] = '\0'; +		}  		if (keywords.InList(s))  			chAttr = SCE_HJA_KEYWORD;  	} @@ -130,16 +150,16 @@ static void classifyWordHTJSA(unsigned int start, unsigned int end,  }  static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &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] = static_cast<char>(tolower(styler[start + i])); -		s[i + 1] = '\0'; -	}  	char chAttr = SCE_HB_IDENTIFIER; +	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber)  		chAttr = SCE_HB_NUMBER;  	else { +		char s[30 + 1]; +		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +			s[i] = static_cast<char>(tolower(styler[start + i])); +			s[i + 1] = '\0'; +		}  		if (keywords.InList(s)) {  			chAttr = SCE_HB_WORD;  			if (strcmp(s, "rem") == 0) @@ -154,16 +174,16 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw  }  static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, Accessor &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] = static_cast<char>(tolower(styler[start + i])); -		s[i + 1] = '\0'; -	}  	char chAttr = SCE_HBA_IDENTIFIER; +	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber)  		chAttr = SCE_HBA_NUMBER;  	else { +		char s[30 + 1]; +		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +			s[i] = static_cast<char>(tolower(styler[start + i])); +			s[i + 1] = '\0'; +		}  		if (keywords.InList(s)) {  			chAttr = SCE_HBA_WORD;  			if (strcmp(s, "rem") == 0) @@ -178,8 +198,8 @@ static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &key  }  static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { -	char s[100];  	bool wordIsNumber = isdigit(styler[start]); +	char s[30 + 1];  	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {  		s[i] = styler[start + i];  		s[i + 1] = '\0'; @@ -198,8 +218,8 @@ static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &key  }  static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { -	char s[100];  	bool wordIsNumber = isdigit(styler[start]); +	char s[30 + 1];  	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {  		s[i] = styler[start + i];  		s[i + 1] = '\0'; @@ -217,30 +237,72 @@ static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &ke  	strcpy(prevWord, s);  } +// Update the word colour to default or keyword +// Called when in a PHP word +static void classifyWordHTPHPA(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { +	char chAttr = SCE_HPHP_DEFAULT; +	bool wordIsNumber = isdigit(styler[start]); +	if (wordIsNumber) +		chAttr = SCE_HPHP_NUMBER; +	else { +		char s[30 + 1]; +		for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { +			s[i] = styler[start + i]; +			s[i + 1] = '\0'; +		} +		if (keywords.InList(s)) +			chAttr = SCE_HPHP_WORD; +	} +	styler.ColourTo(end, chAttr); +} + +// Return the first state to reach when entering a scripting language +static int StateForScript(int scriptLanguage, int inScriptTag) { +	switch (scriptLanguage) { +	case eScriptVBS: +		if (inScriptTag) +			return SCE_HB_START; +		else +			return SCE_HBA_START; +	case eScriptPython: +		if (inScriptTag) +			return SCE_HP_START; +		else +			return SCE_HPA_START; +	case eScriptPHP: +		return SCE_HPHP_DEFAULT; +	case eScriptXML: +		return SCE_H_TAGUNKNOWN; +	default : +		return SCE_HJ_START; +	} +} +  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; +	       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[],  -	Accessor &styler) { -	 -	WordList &keywords=*keywordlists[0]; -	WordList &keywords2=*keywordlists[1]; -	WordList &keywords3=*keywordlists[2]; -	WordList &keywords4=*keywordlists[3]; -	 +static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], +                                  Accessor &styler) { + +	WordList &keywords = *keywordlists[0]; +	WordList &keywords2 = *keywordlists[1]; +	WordList &keywords3 = *keywordlists[2]; +	WordList &keywords4 = *keywordlists[3]; +	WordList &keywords5 = *keywordlists[4]; +  	// Lexer for HTML requires more lexical states (7 bits worth) than most lexers  	styler.StartAt(startPos, 127);  	bool lastTagWasScript = false; @@ -248,7 +310,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  	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 inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen  	if (InTagState(state)) {  		while ((startPos > 1) && (InTagState(styler.StyleAt(startPos - 1)))) {  			startPos--; @@ -261,10 +324,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  	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; -	 +	int beforeNonHTML = (lineState & 0x01) >> 0; +	int inNonHTML = (lineState & 0x02) >> 1; +	int inScriptTag = (lineState & 0x04) >> 2; +	int defaultScript = (lineState & 0xF0) >> 4; +  	char chPrev = ' ';  	char chPrev2 = ' ';  	styler.StartSegment(startPos); @@ -274,6 +338,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		char chNext = styler.SafeGetCharAt(i + 1);  		char chNext2 = styler.SafeGetCharAt(i + 2); +		// Handle DBCS codepages  		if (styler.IsLeadByte(ch)) {  			chPrev2 = ' ';  			chPrev = ' '; @@ -284,84 +349,191 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		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)); +			styler.SetLineState(lineCurrent, +			                    (beforeNonHTML & 0x01) | ((inNonHTML & 0x01) << 1) | ((inScriptTag & 0x01) << 2) | ((defaultScript & 0x0F) << 4));  		} -		 -		// Handle ASP even within other constructs as it is a preprocessor + +		if (inScriptTag && (ch == '<') && (chNext == '/')) { +			// Check if it's the end of the script tag (or any other HTML tag) +			switch (state) { +				// in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!) +			case SCE_H_DOUBLESTRING: +			case SCE_H_SINGLESTRING: +			case SCE_HJ_COMMENTLINE: +			case SCE_HJ_DOUBLESTRING: +			case SCE_HJ_SINGLESTRING: +			case SCE_HJA_COMMENTLINE: +			case SCE_HJA_DOUBLESTRING: +			case SCE_HJA_SINGLESTRING: +			case SCE_HB_COMMENTLINE: +			case SCE_HB_STRING: +			case SCE_HBA_COMMENTLINE: +			case SCE_HBA_STRING: +			case SCE_HP_COMMENTLINE: +			case SCE_HP_STRING: +			case SCE_HP_TRIPLE: +			case SCE_HP_TRIPLEDOUBLE: +			case SCE_HPA_COMMENTLINE: +			case SCE_HPA_STRING: +			case SCE_HPA_TRIPLE: +			case SCE_HPA_TRIPLEDOUBLE: +				break; +			default : +				// maybe we should check here if it's a tag and if it's SCRIPT + +				styler.ColourTo(i - 1, state); +				state = SCE_H_TAGUNKNOWN; +				inNonHTML = 0; +				inScriptTag = 0; +				i++; +				continue; +				break; +			} +		} + +		///////////////////////////////////// +		// handle the start of PHP pre-processor = Non-HTML +		if ((ch == '<') && (chNext == '?')) { +			styler.ColourTo(i - 1, state); +			beforeNonHTML = state; +			scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i + 10, eScriptPHP); +			i += 1 + PrintScriptingIndicatorOffset(styler, i + 2, i + 10); +			if (scriptLanguage == eScriptXML) +				styler.ColourTo(i, SCE_H_XMLSTART); +			else +				styler.ColourTo(i, SCE_H_QUESTION); +			state = StateForScript(scriptLanguage, inScriptTag); +			inNonHTML = 1; +			continue; +		} +		// handle the start of ASP pre-processor = Non-HTML  		if ((ch == '<') && (chNext == '%')) { -			beforeASP = state;  			styler.ColourTo(i - 1, state); +			beforeNonHTML = state;  			if (chNext2 == '@') { -				styler.ColourTo(i + 2, SCE_H_ASP); +				i += 2; // place as if it was the second next char treated  				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++; +					i += 2; // place as if it was the second next char treated +				} +				else { +					i++; // place as if it was the next char treated  				} + +				state = StateForScript(defaultScript, inScriptTag);  			} -			inASP = 1; +			styler.ColourTo(i, SCE_H_ASP); +			inNonHTML = 1; +			inScriptTag = 0;  			continue;  		} -		if (inASP && (ch == '%') && (chNext == '>')) { -			if (state == SCE_H_ASPAT) -				defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, defaultScript); +		///////////////////////////////////// +		///////////////////////////////////// +		// handle of end of a pre-processor = Non-HTML +		/* this code is probably un-used (kept for safety) +				if (inNonHTML && inScriptTag && (ch == '<') && (chNext == '/')) { +					// Bounce out of any ASP mode +					switch (state) +					{ +						case SCE_HJA_WORD: +							classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); +							break; +						case SCE_HBA_WORD: +							classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); +							break; +						case SCE_HPA_WORD: +							classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); +							break; +						case SCE_HPHP_WORD: +							classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); +							break; +						default : +							styler.ColourTo(i - 1, state); +							break; +					} +					if ((ch == '<') && (chNext == '/')) { +						state = SCE_H_TAGUNKNOWN; +					} else { +						i++; +						if (ch == '%') +							styler.ColourTo(i, SCE_H_ASP); +						else +		//					styler.ColourTo(i, SCE_H_XMLEND); +							styler.ColourTo(i, SCE_HPHP_); +						state = beforeNonHTML; +					} +					beforeNonHTML = SCE_H_DEFAULT; +					inNonHTML = 0; +					inScriptTag = 0; +					continue; +				} +		*/ +		// handle the end of a pre-processor = Non-HTML +		if (inNonHTML && ((ch == '?') || (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) { +			switch (state) { +			case SCE_HJA_WORD:  				classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); -			} else if (state == SCE_HBA_WORD) { +				break; +			case SCE_HBA_WORD:  				classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); -			} else if (state == SCE_HPA_WORD) { +				break; +			case SCE_HPA_WORD:  				classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); -			} else { +				break; +			case SCE_HPHP_WORD: +				classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); +				break; +			default :  				styler.ColourTo(i - 1, state); +				break; +			} +			if ((ch == '<') && (chNext == '/')) { +				state = SCE_H_TAGUNKNOWN; +			} else { +				i++; +				if (ch == '%') +					styler.ColourTo(i, SCE_H_ASP); +				else if (scriptLanguage == eScriptXML) +					styler.ColourTo(i, SCE_H_XMLEND); +				else +					styler.ColourTo(i, SCE_H_QUESTION); +				state = beforeNonHTML;  			} -			//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; +			beforeNonHTML = SCE_H_DEFAULT; +			inNonHTML = 0; +			inScriptTag = 0;  			continue;  		} -		 -		if (state == SCE_H_DEFAULT) { +		///////////////////////////////////// + +		switch (state) { +		case 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) { +			break; +		case SCE_H_COMMENT:  			if ((ch == '>') && (chPrev == '-')) {  				styler.ColourTo(i, state);  				state = SCE_H_DEFAULT;  			} -		} else if (state == SCE_H_CDATA) { +			break; +		case SCE_H_CDATA:  			if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) {  				styler.ColourTo(i, state);  				state = SCE_H_DEFAULT;  			} -		} else if (state == SCE_H_ENTITY) { +			break; +		case SCE_H_ENTITY:  			if (ch == ';') {  				styler.ColourTo(i, state);  				state = SCE_H_DEFAULT; @@ -370,23 +542,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, SCE_H_TAGUNKNOWN);  				state = SCE_H_DEFAULT;  			} -		} else if (state == SCE_H_TAGUNKNOWN) { +			break; +		case SCE_H_TAGUNKNOWN:  			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-' && ch != '[') {  				int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);  				lastTagWasScript = eClass == SCE_H_SCRIPT;  				if (lastTagWasScript) { -					scriptLanguage = eScriptJS; +					inScriptTag = 1; +					scriptLanguage = eScriptJS; // default to javascript  					eClass = SCE_H_TAG;  				}  				if ((ch == '>') && (eClass != SCE_H_COMMENT)) {  					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; +						state = StateForScript(scriptLanguage, inScriptTag);  					} else {  						state = SCE_H_DEFAULT;  					} @@ -400,20 +569,17 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					}  				}  			} -		} else if (state == SCE_H_ATTRIBUTE) { +			break; +		case SCE_H_ATTRIBUTE:  			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { -				if (lastTagWasScript) -					scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i-1, scriptLanguage); +				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; +						state = StateForScript(scriptLanguage, inScriptTag);  					} else {  						state = SCE_H_DEFAULT;  					} @@ -421,27 +587,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					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) { +			break; +		case 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; +					state = StateForScript(scriptLanguage, inScriptTag);  				} else {  					state = SCE_H_DEFAULT;  				} @@ -467,21 +619,28 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i - 1, state);  				state = SCE_H_ATTRIBUTE;  			} -		} else if (state == SCE_H_DOUBLESTRING) { +			break; +		case SCE_H_DOUBLESTRING:  			if (ch == '\"') { -				if (lastTagWasScript) +				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) { +			break; +		case SCE_H_SINGLESTRING:  			if (ch == '\'') { -				if (lastTagWasScript) +				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) { +			break; +		case SCE_HJ_DEFAULT: +		case SCE_HJ_START: +		case SCE_HJ_SYMBOLS:  			if (iswordstart(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HJ_WORD; @@ -503,10 +662,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			} else if ((ch == '<') && (chNext == '/')) {  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HJ_COMMENTLINE; +			} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, state); +				state = SCE_HJ_COMMENTLINE; +				i += 2;  			} else if (isoperator(ch)) {  				styler.ColourTo(i - 1, state);  				styler.ColourTo(i, SCE_HJ_SYMBOLS); @@ -517,7 +681,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HJ_DEFAULT;  				}  			} -		} else if (state == SCE_HJ_WORD) { +			break; +		case SCE_HJ_WORD:  			if (!iswordchar(ch)) {  				classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler);  				//styler.ColourTo(i - 1, eHTJSKeyword); @@ -533,34 +698,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HJ_DOUBLESTRING;  				} else if (ch == '\'') {  					state = SCE_HJ_SINGLESTRING; +				} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +					styler.ColourTo(i - 1, state); +					state = SCE_HJ_COMMENTLINE; +					i += 2;  				} 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) { +			break; +		case SCE_HJ_COMMENT: +		case SCE_HJ_COMMENTDOC:  			if (ch == '/' && chPrev == '*') { +				styler.ColourTo(i, state);  				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; +				inScriptTag = 0;  			} -		} else if (state == SCE_HJ_COMMENTLINE) { +			break; +		case SCE_HJ_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE);  				state = SCE_HJ_DEFAULT; @@ -568,8 +730,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				// Common to hide end script tag in comment  				styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} -		} else if (state == SCE_HJ_DOUBLESTRING) { +			break; +		case SCE_HJ_DOUBLESTRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -580,10 +744,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				i++;  				ch = chNext;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i-1, state); +				styler.ColourTo(i - 1, state);  				state = SCE_HJ_STRINGEOL;  			} -		} else if (state == SCE_HJ_SINGLESTRING) { +			break; +		case SCE_HJ_SINGLESTRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -594,10 +759,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				i++;  				ch = chNext;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i-1, state); +				styler.ColourTo(i - 1, state);  				state = SCE_HJ_STRINGEOL;  			} -		} else if (state == SCE_HJ_STRINGEOL) { +			break; +		case SCE_HJ_STRINGEOL:  			if (!isLineEnd(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HJ_DEFAULT; @@ -605,7 +771,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HJ_DEFAULT;  			} -		} else if (state == SCE_HJA_DEFAULT || state == SCE_HJA_START) { +			break; +		case SCE_HJA_DEFAULT: +		case SCE_HJA_START: +		case SCE_HJA_SYMBOLS:  			if (iswordstart(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HJA_WORD; @@ -627,10 +796,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			} else if ((ch == '<') && (chNext == '/')) {  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HJA_COMMENTLINE; +			} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, state); +				state = SCE_HJA_COMMENTLINE; +				i += 2;  			} else if (isoperator(ch)) {  				styler.ColourTo(i - 1, state);  				styler.ColourTo(i, SCE_HJA_SYMBOLS); @@ -641,7 +815,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HJA_DEFAULT;  				}  			} -		} else if (state == SCE_HJA_WORD) { +			break; +		case SCE_HJA_WORD:  			if (!iswordchar(ch)) {  				classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler);  				//styler.ColourTo(i - 1, eHTJSKeyword); @@ -657,34 +832,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HJA_DOUBLESTRING;  				} else if (ch == '\'') {  					state = SCE_HJA_SINGLESTRING; +				} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +					styler.ColourTo(i - 1, state); +					state = SCE_HJA_COMMENTLINE; +					i += 2;  				} 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) { +			break; +		case SCE_HJA_COMMENT: +		case SCE_HJA_COMMENTDOC:  			if (ch == '/' && chPrev == '*') { +				styler.ColourTo(i, state);  				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; +				inScriptTag = 0;  			} -		} else if (state == SCE_HJA_COMMENTLINE) { +			break; +		case SCE_HJA_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE);  				state = SCE_HJA_DEFAULT; @@ -692,8 +864,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				// Common to hide end script tag in comment  				styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} -		} else if (state == SCE_HJA_DOUBLESTRING) { +			break; +		case SCE_HJA_DOUBLESTRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -703,11 +877,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				state = SCE_HJA_DEFAULT;  				i++;  				ch = chNext; +			} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, state); +				state = SCE_HJA_COMMENTLINE; +				i += 2;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i-1, state); +				styler.ColourTo(i - 1, state);  				state = SCE_HJA_STRINGEOL;  			} -		} else if (state == SCE_HJA_SINGLESTRING) { +			break; +		case SCE_HJA_SINGLESTRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -717,11 +896,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				state = SCE_HJA_DEFAULT;  				i++;  				ch = chNext; +			} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, state); +				state = SCE_HJA_COMMENTLINE; +				i += 2;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i-1, state); +				styler.ColourTo(i - 1, state);  				state = SCE_HJA_STRINGEOL;  			} -		} else if (state == SCE_HJA_STRINGEOL) { +			break; +		case SCE_HJA_STRINGEOL:  			if (!isLineEnd(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HJA_DEFAULT; @@ -729,7 +913,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HJA_DEFAULT;  			} -		} else if (state == SCE_HB_DEFAULT || state == SCE_HB_START) { +			break; +		case SCE_HB_DEFAULT: +		case SCE_HB_START:  			if (iswordstart(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HB_WORD; @@ -742,8 +928,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			} else if ((ch == '<') && (chNext == '/')) {  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HB_COMMENTLINE;  			} else if (isoperator(ch)) { @@ -756,7 +943,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HB_DEFAULT;  				}  			} -		} else if (state == SCE_HB_WORD) { +			break; +		case SCE_HB_WORD:  			if (!iswordchar(ch)) {  				state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler);  				if (state == SCE_HB_DEFAULT) { @@ -770,17 +958,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					}  				}  			} -		} else if (state == SCE_HB_STRING) { +			break; +		case 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); +				styler.ColourTo(i - 1, state);  				state = SCE_HB_STRINGEOL;  			} -		} else if (state == SCE_HB_COMMENTLINE) { +			break; +		case SCE_HB_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, state);  				state = SCE_HB_DEFAULT; @@ -788,8 +978,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				// Common to hide end script tag in comment  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} -		} else if (state == SCE_HB_STRINGEOL) { +			break; +		case SCE_HB_STRINGEOL:  			if (!isLineEnd(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HB_DEFAULT; @@ -797,7 +989,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HB_DEFAULT;  			} -		} else if (state == SCE_HBA_DEFAULT || state == SCE_HBA_START) { +			break; +		case SCE_HBA_DEFAULT: +		case SCE_HBA_START:  			if (iswordstart(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HBA_WORD; @@ -810,8 +1004,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			} else if ((ch == '<') && (chNext == '/')) {  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HBA_COMMENTLINE;  			} else if (isoperator(ch)) { @@ -824,7 +1019,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HBA_DEFAULT;  				}  			} -		} else if (state == SCE_HBA_WORD) { +			break; +		case SCE_HBA_WORD:  			if (!iswordchar(ch)) {  				state = classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler);  				if (state == SCE_HBA_DEFAULT) { @@ -838,17 +1034,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					}  				}  			} -		} else if (state == SCE_HBA_STRING) { +			break; +		case 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); +				styler.ColourTo(i - 1, state);  				state = SCE_HBA_STRINGEOL;  			} -		} else if (state == SCE_HBA_COMMENTLINE) { +			break; +		case SCE_HBA_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, state);  				state = SCE_HBA_DEFAULT; @@ -856,8 +1054,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				// Common to hide end script tag in comment  				styler.ColourTo(i - 1, state);  				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0;  			} -		} else if (state == SCE_HBA_STRINGEOL) { +			break; +		case SCE_HBA_STRINGEOL:  			if (!isLineEnd(ch)) {  				styler.ColourTo(i - 1, state);  				state = SCE_HBA_DEFAULT; @@ -865,15 +1065,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HBA_DEFAULT;  			} -		} else if (state == SCE_HP_DEFAULT || state == SCE_HP_START) { +			break; +		case SCE_HP_DEFAULT: +		case 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; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HP_COMMENTLINE;  			} else if (ch == '#') { @@ -910,7 +1113,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HP_DEFAULT;  				}  			} -		} else if (state == SCE_HP_WORD) { +			break; +		case SCE_HP_WORD:  			if (!iswordchar(ch)) {  				classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord);  				state = SCE_HP_DEFAULT; @@ -940,12 +1144,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					styler.ColourTo(i, SCE_HP_OPERATOR);  				}  			} -		} else if (state == SCE_HP_COMMENTLINE) { +			break; +		case SCE_HP_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, state);  				state = SCE_HP_DEFAULT;  			} -		} else if (state == SCE_HP_STRING) { +			break; +		case SCE_HP_STRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -956,7 +1162,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HP_DEFAULT;  			} -		} else if (state == SCE_HP_CHARACTER) { +			break; +		case SCE_HP_CHARACTER:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -967,25 +1174,30 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HP_DEFAULT;  			} -		} else if (state == SCE_HP_TRIPLE) { +			break; +		case SCE_HP_TRIPLE:  			if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {  				styler.ColourTo(i, state);  				state = SCE_HP_DEFAULT;  			} -		} else if (state == SCE_HP_TRIPLEDOUBLE) { +			break; +		case 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) { +			break; +		case SCE_HPA_DEFAULT: +		case 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; +				inScriptTag = 0;  			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -				styler.SafeGetCharAt(i + 3) == '-') { +			           styler.SafeGetCharAt(i + 3) == '-') {  				styler.ColourTo(i - 1, state);  				state = SCE_HPA_COMMENTLINE;  			} else if (ch == '#') { @@ -1022,7 +1234,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HPA_DEFAULT;  				}  			} -		} else if (state == SCE_HPA_WORD) { +			break; +		case SCE_HPA_WORD:  			if (!iswordchar(ch)) {  				classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord);  				state = SCE_HPA_DEFAULT; @@ -1052,12 +1265,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					styler.ColourTo(i, SCE_HPA_OPERATOR);  				}  			} -		} else if (state == SCE_HPA_COMMENTLINE) { +			break; +		case SCE_HPA_COMMENTLINE:  			if (ch == '\r' || ch == '\n') {  				styler.ColourTo(i - 1, state);  				state = SCE_HPA_DEFAULT;  			} -		} else if (state == SCE_HPA_STRING) { +			break; +		case SCE_HPA_STRING:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -1068,7 +1283,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HPA_DEFAULT;  			} -		} else if (state == SCE_HPA_CHARACTER) { +			break; +		case SCE_HPA_CHARACTER:  			if (ch == '\\') {  				if (chNext == '\"' || chNext == '\'' || chNext == '\\') {  					i++; @@ -1079,17 +1295,122 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				styler.ColourTo(i, state);  				state = SCE_HPA_DEFAULT;  			} -		} else if (state == SCE_HPA_TRIPLE) { +			break; +		case SCE_HPA_TRIPLE:  			if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {  				styler.ColourTo(i, state);  				state = SCE_HPA_DEFAULT;  			} -		} else if (state == SCE_HPA_TRIPLEDOUBLE) { +			break; +		case SCE_HPA_TRIPLEDOUBLE:  			if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {  				styler.ColourTo(i, state);  				state = SCE_HPA_DEFAULT;  			} +			break; +			///////////// start - PHP state handling +		case SCE_HPHP_WORD: +			if (!iswordchar(ch)) { +				if (ch == '/' && chNext == '*') { +					state = SCE_HPHP_COMMENT; +				} else if (ch == '/' && chNext == '/') { +					state = SCE_HPHP_COMMENTLINE; +				} else if (ch == '\"') { +					state = SCE_HPHP_HSTRING; +				} else if (ch == '\'') { +					state = SCE_HPHP_SIMPLESTRING; +				} else if (ch == '$') { +					state = SCE_HPHP_VARIABLE; +				} else if (isoperator(ch)) { +					state = SCE_HPHP_DEFAULT; +				} else { +					state = SCE_HPHP_DEFAULT; +				} +				classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); +			} else if ((ch == '<') && (chNext == '/')) { +				styler.ColourTo(i - 1, state); +				state = SCE_H_TAGUNKNOWN; +				inScriptTag = 0; +			} +			break; +		case SCE_HPHP_NUMBER: +			if (!isdigit(ch)) { +				styler.ColourTo(i - 1, SCE_HPHP_NUMBER); +				state = SCE_HPHP_DEFAULT; +			} +			break; +		case SCE_HPHP_VARIABLE: +			if (!iswordchar(ch)) { +				styler.ColourTo(i - 1, SCE_HPHP_VARIABLE); +				state = SCE_HPHP_DEFAULT; +			} +			break; +		case SCE_HPHP_COMMENT: +			if (ch == '/' && chPrev == '*') { +				styler.ColourTo(i, state); +				state = SCE_HPHP_DEFAULT; +			} +			break; +		case SCE_HPHP_COMMENTLINE: +			if (ch == '\r' || ch == '\n') { +				styler.ColourTo(i - 1, state); +				state = SCE_HPHP_DEFAULT; +			} +			break; +		case SCE_HPHP_HSTRING: +			if (ch == '\\') { +				if (chNext == '\"' || chNext == '\'' || chNext == '\\') { +					i++; +					ch = chNext; +					chNext = styler.SafeGetCharAt(i + 1); +				} +			} else if (ch == '\"') { +				styler.ColourTo(i, state); +				state = SCE_HPHP_DEFAULT; +			} else if (chNext == '\r' || chNext == '\n') { +				styler.ColourTo(i - 1, SCE_HPHP_STRINGEOL); +				state = SCE_HPHP_STRINGEOL; +			} +			break; +		case SCE_HPHP_SIMPLESTRING: +			if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { +				styler.ColourTo(i - 1, SCE_HPHP_STRINGEOL); +				state = SCE_HPHP_STRINGEOL; +			} else if (ch == '\\') { +				if (chNext == '\"' || chNext == '\'' || chNext == '\\') { +					i++; +					ch = chNext; +					chNext = styler.SafeGetCharAt(i + 1); +				} +			} else if (ch == '\'') { +				styler.ColourTo(i, state); +				state = SCE_HPHP_DEFAULT; +			} +			break; +		case SCE_HPHP_STRINGEOL: +			break; +		case SCE_HPHP_DEFAULT: +			styler.ColourTo(i - 1, state); +			if (isdigit(ch)) { +				state = SCE_HPHP_NUMBER; +			} else if (iswordstart(ch)) { +				state = SCE_HPHP_WORD; +			} else if (ch == '/' && chNext == '*') { +				state = SCE_HPHP_COMMENT; +			} else if (ch == '/' && chNext == '/') { +				state = SCE_HPHP_COMMENTLINE; +			} else if (ch == '\"') { +				state = SCE_HPHP_HSTRING; +			} else if (ch == '\'') { +				state = SCE_HPHP_SIMPLESTRING; +			} else if (ch == '$') { +				state = SCE_HPHP_VARIABLE; +			} +			break; +			///////////// end - PHP state handling  		} + +  		if (state == SCE_HB_DEFAULT) {    // One of the above succeeded  			if (ch == '\"') {  				state = SCE_HB_STRING; @@ -1151,6 +1472,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		chPrev2 = chPrev;  		chPrev = ch;  	} +  	styler.ColourTo(lengthDoc - 1, state);  } | 
