diff options
Diffstat (limited to 'src/LexHTML.cxx')
| -rw-r--r-- | src/LexHTML.cxx | 882 | 
1 files changed, 224 insertions, 658 deletions
| diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index 506f9a491..26b9111b7 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -3,11 +3,11 @@  // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>  // The License.txt file describes the conditions under which this software may be distributed. -#include <stdlib.h>  -#include <string.h>  -#include <ctype.h>  -#include <stdio.h>  -#include <stdarg.h>  +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <stdarg.h>  #include "Platform.h" @@ -17,7 +17,13 @@  #include "Scintilla.h"  #include "SciLexer.h" +#define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START) +#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START) +#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START) +  enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML }; +enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc }; +  static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) {  	char s[30 + 1];  	s[0] = '\0'; @@ -57,6 +63,23 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u  	return iResult;  } +static int statePrintForState(int state, int inScriptType) +{ +	int StateToPrint; + +	if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { +		StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_PYTHON); +	} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { +		StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_VBS); +	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) { +		StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_JS); +	} else { +		StateToPrint = state; +	} + +	return StateToPrint; +} +  static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {  	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') ||  	                    (styler[start] == '-') || (styler[start] == '#'); @@ -114,7 +137,7 @@ static int classifyTagHTML(unsigned int start, unsigned int end,  }  static void classifyWordHTJS(unsigned int start, unsigned int end, -                             WordList &keywords, Accessor &styler) { +                             WordList &keywords, Accessor &styler, int inScriptType) {  	char chAttr = SCE_HJ_WORD;  	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber) @@ -128,28 +151,10 @@ static void classifyWordHTJS(unsigned int start, unsigned int end,  		if (keywords.InList(s))  			chAttr = SCE_HJ_KEYWORD;  	} -	styler.ColourTo(end, chAttr); +	styler.ColourTo(end, statePrintForState(chAttr, inScriptType));  } -static void classifyWordHTJSA(unsigned int start, unsigned int end, -                              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; -	} -	styler.ColourTo(end, chAttr); -} - -static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { +static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, int inScriptType) {  	char chAttr = SCE_HB_IDENTIFIER;  	bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');  	if (wordIsNumber) @@ -166,38 +171,14 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw  				chAttr = SCE_HB_COMMENTLINE;  		}  	} -	styler.ColourTo(end, chAttr); +	styler.ColourTo(end, statePrintForState(chAttr, inScriptType));  	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, Accessor &styler) { -	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) -				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, Accessor &styler, char *prevWord) { +static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) {  	bool wordIsNumber = isdigit(styler[start]);  	char s[30 + 1];  	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -213,33 +194,13 @@ static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &key  		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, Accessor &styler, char *prevWord) { -	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'; -	} -	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); +	styler.ColourTo(end, statePrintForState(chAttr, inScriptType));  	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) { +static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {  	char chAttr = SCE_HPHP_DEFAULT;  	bool wordIsNumber = isdigit(styler[start]);  	if (wordIsNumber) @@ -257,25 +218,26 @@ static void classifyWordHTPHPA(unsigned int start, unsigned int end, WordList &k  }  // Return the first state to reach when entering a scripting language -static int StateForScript(int scriptLanguage, int inScriptTag) { +static int StateForScript(int scriptLanguage) { +	int Result;  	switch (scriptLanguage) {  	case eScriptVBS: -		if (inScriptTag) -			return SCE_HB_START; -		else -			return SCE_HBA_START; +		Result = SCE_HB_START; +		break;  	case eScriptPython: -		if (inScriptTag) -			return SCE_HP_START; -		else -			return SCE_HPA_START; +		Result = SCE_HP_START; +		break;  	case eScriptPHP: -		return SCE_HPHP_DEFAULT; +		Result = SCE_HPHP_DEFAULT; +		break;  	case eScriptXML: -		return SCE_H_TAGUNKNOWN; +		Result = SCE_H_TAGUNKNOWN; +		break;  	default : -		return SCE_HJ_START; +		Result = SCE_HJ_START; +		break;  	} +	return Result;  }  inline bool ishtmlwordchar(char ch) { @@ -305,11 +267,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  	// 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; +	int StateToPrint = state;  	// 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)) { @@ -324,10 +286,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  	int lineCurrent = styler.GetLine(startPos);  	if (lineCurrent > 0)  		lineState = styler.GetLineState(lineCurrent); -	int beforeNonHTML = (lineState & 0x01) >> 0; -	int inNonHTML = (lineState & 0x02) >> 1; -	int inScriptTag = (lineState & 0x04) >> 2; -	int defaultScript = (lineState & 0xF0) >> 4; +	int inScriptType  = (lineState >> 0) & 0x03; // 2 bits +	int defaultScript = (lineState >> 4) & 0x0F; // 4 bits +	int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits + +	bool fold = styler.GetPropertyInt("fold"); +	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; +	int levelCurrent = levelPrev; +	int visChars = 0;  	char chPrev = ' ';  	char chPrev2 = ' '; @@ -338,6 +304,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		char chNext = styler.SafeGetCharAt(i + 1);  		char chNext2 = styler.SafeGetCharAt(i + 2); +		// decide what is the current state to print (depending of the script tag) +		StateToPrint = statePrintForState(state,inScriptType); + +		if (fold && !isspace(ch)) +			visChars++; +  		// Handle DBCS codepages  		if (styler.IsLeadByte(ch)) {  			chPrev2 = ' '; @@ -348,44 +320,47 @@ 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 +			if (fold) { +				int lev = levelPrev; +				if (visChars == 0) +					lev |= SC_FOLDLEVELWHITEFLAG; +				if ((levelCurrent > levelPrev) && (visChars > 0)) +					lev |= SC_FOLDLEVELHEADERFLAG; +				styler.SetLevel(lineCurrent, lev); +				visChars = 0; +				levelPrev = levelCurrent; +			}  			lineCurrent++;  			styler.SetLineState(lineCurrent, -			                    (beforeNonHTML & 0x01) | ((inNonHTML & 0x01) << 1) | ((inScriptTag & 0x01) << 2) | ((defaultScript & 0x0F) << 4)); +			                    ((inScriptType  & 0x03) << 0) | +			                    ((defaultScript & 0x0F) << 4) | +			                    ((beforePreProc & 0xFF) << 8));  		} -		if (inScriptTag && (ch == '<') && (chNext == '/')) { +		if (fold && (ch == '{') || (ch == '}')) { +			levelCurrent += (ch == '{') ? 1 : -1; +		} + +		// generic end of script processing +		if ((inScriptType == eNonHtmlScript) && (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); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_H_TAGUNKNOWN; -				inNonHTML = 0; -				inScriptTag = 0; -				i++; +				inScriptType = eHtml; +				i+=2;  				continue;  				break;  			} @@ -394,22 +369,32 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		/////////////////////////////////////  		// 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); +			styler.ColourTo(i - 1, StateToPrint); +			beforePreProc = state; +			scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP); +			i++; +			i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 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; +			state = StateForScript(scriptLanguage); +			if (inScriptType == eNonHtmlScript) +				inScriptType = eNonHtmlScriptPreProc; +			else +				inScriptType = eNonHtmlPreProc;  			continue;  		} +  		// handle the start of ASP pre-processor = Non-HTML  		if ((ch == '<') && (chNext == '%')) { -			styler.ColourTo(i - 1, state); -			beforeNonHTML = state; +				styler.ColourTo(i - 1, StateToPrint); +			beforePreProc = state; +			if (inScriptType == eNonHtmlScript) +				inScriptType = eNonHtmlScriptPreProc; +			else +				inScriptType = eNonHtmlPreProc; +  			if (chNext2 == '@') {  				i += 2; // place as if it was the second next char treated  				state = SCE_H_ASPAT; @@ -421,92 +406,47 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					i++; // place as if it was the next char treated  				} -				state = StateForScript(defaultScript, inScriptTag); +				state = StateForScript(defaultScript);  			}  			styler.ColourTo(i, SCE_H_ASP); -			inNonHTML = 1; -			inScriptTag = 0;  			continue;  		} -		///////////////////////////////////// -		///////////////////////////////////// -		// 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 (((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && ((ch == '?') || (ch == '%')) && (chNext == '>')) {  			if (state == SCE_H_ASPAT) {  				defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, defaultScript);  			}  			// Bounce out of any ASP mode  			switch (state) { -			case SCE_HJA_WORD: -				classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); +			case SCE_HJ_WORD: +				classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);  				break; -			case SCE_HBA_WORD: -				classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); +			case SCE_HB_WORD: +				classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);  				break; -			case SCE_HPA_WORD: -				classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); +			case SCE_HP_WORD: +				classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType);  				break;  			case SCE_HPHP_WORD: -				classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); +				classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);  				break;  			default : -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				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; -			} -			beforeNonHTML = SCE_H_DEFAULT; -			inNonHTML = 0; -			inScriptTag = 0; +			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 = beforePreProc; +			if (inScriptType == eNonHtmlScriptPreProc) +				inScriptType = eNonHtmlScript; +			else +				inScriptType = eHtml;  			continue;  		}  		///////////////////////////////////// @@ -514,7 +454,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		switch (state) {  		case SCE_H_DEFAULT:  			if (ch == '<') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_H_TAGUNKNOWN;  			} else if (ch == '&') {  				styler.ColourTo(i - 1, SCE_H_DEFAULT); @@ -522,20 +462,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			}  			break;  		case SCE_H_COMMENT: -			if ((ch == '>') && (chPrev == '-')) { -				styler.ColourTo(i, state); +			if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) { +				styler.ColourTo(i, StateToPrint);  				state = SCE_H_DEFAULT;  			}  			break;  		case SCE_H_CDATA:  			if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_H_DEFAULT;  			}  			break;  		case SCE_H_ENTITY:  			if (ch == ';') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_H_DEFAULT;  			}  			if (ch != '#' && !isalnum(ch)) {	// Should check that '#' follows '&', but it is unlikely anyway... @@ -546,16 +486,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		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) { -					inScriptTag = 1; -					scriptLanguage = eScriptJS; // default to javascript +				if (eClass == SCE_H_SCRIPT) { +					inScriptType = eNonHtmlScript; +					scriptLanguage = defaultScript;  					eClass = SCE_H_TAG;  				}  				if ((ch == '>') && (eClass != SCE_H_COMMENT)) {  					styler.ColourTo(i, SCE_H_TAG); -					if (lastTagWasScript) { -						state = StateForScript(scriptLanguage, inScriptTag); +					if (inScriptType == eNonHtmlScript) { +						state = StateForScript(scriptLanguage);  					} else {  						state = SCE_H_DEFAULT;  					} @@ -572,14 +511,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			break;  		case SCE_H_ATTRIBUTE:  			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { -				if (lastTagWasScript) { +				if (inScriptType == eNonHtmlScript) {  					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) { -						state = StateForScript(scriptLanguage, inScriptTag); +					if (inScriptType == eNonHtmlScript) { +						state = StateForScript(scriptLanguage);  					} else {  						state = SCE_H_DEFAULT;  					} @@ -590,39 +529,39 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			break;  		case SCE_H_OTHER:  			if (ch == '>') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				styler.ColourTo(i, SCE_H_TAG); -				if (lastTagWasScript) { -					state = StateForScript(scriptLanguage, inScriptTag); +				if (inScriptType == eNonHtmlScript) { +					state = StateForScript(scriptLanguage);  				} else {  					state = SCE_H_DEFAULT;  				}  			} else if (ch == '\"') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_H_DOUBLESTRING;  			} else if (ch == '\'') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_H_SINGLESTRING;  			} else if (ch == '/' && chNext == '>') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				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, StateToPrint);  				styler.ColourTo(i + 1, SCE_H_XMLEND);  				i++;  				ch = chNext;  				state = SCE_H_DEFAULT;  			} else if (ishtmlwordchar(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_H_ATTRIBUTE;  			}  			break;  		case SCE_H_DOUBLESTRING:  			if (ch == '\"') { -				if (lastTagWasScript) { +				if (inScriptType == eNonHtmlScript) {  					scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);  				}  				styler.ColourTo(i, SCE_H_DOUBLESTRING); @@ -631,7 +570,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			break;  		case SCE_H_SINGLESTRING:  			if (ch == '\'') { -				if (lastTagWasScript) { +				if (inScriptType == eNonHtmlScript) {  					scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage);  				}  				styler.ColourTo(i, SCE_H_SINGLESTRING); @@ -642,49 +581,45 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		case SCE_HJ_START:  		case SCE_HJ_SYMBOLS:  			if (iswordstart(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_WORD;  			} else if (ch == '/' && chNext == '*') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				if (chNext2 == '*')  					state = SCE_HJ_COMMENTDOC;  				else  					state = SCE_HJ_COMMENT;  			} else if (ch == '/' && chNext == '/') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_COMMENTLINE;  			} else if (ch == '\"') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_DOUBLESTRING;  			} else if (ch == '\'') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_SINGLESTRING; -			} 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.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_COMMENTLINE;  			} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_COMMENTLINE;  				i += 2;  			} else if (isoperator(ch)) { -				styler.ColourTo(i - 1, state); -				styler.ColourTo(i, SCE_HJ_SYMBOLS); +				styler.ColourTo(i - 1, StateToPrint); +				styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));  				state = SCE_HJ_DEFAULT;  			} else if ((ch == ' ') || (ch == '\t')) {  				if (state == SCE_HJ_START) { -					styler.ColourTo(i - 1, state); +					styler.ColourTo(i - 1, StateToPrint);  					state = SCE_HJ_DEFAULT;  				}  			}  			break;  		case SCE_HJ_WORD:  			if (!iswordchar(ch)) { -				classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler); +				classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType);  				//styler.ColourTo(i - 1, eHTJSKeyword);  				state = SCE_HJ_DEFAULT;  				if (ch == '/' && chNext == '*') { @@ -699,11 +634,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				} else if (ch == '\'') {  					state = SCE_HJ_SINGLESTRING;  				} else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { -					styler.ColourTo(i - 1, state); +					styler.ColourTo(i - 1, StateToPrint);  					state = SCE_HJ_COMMENTLINE;  					i += 2;  				} else if (isoperator(ch)) { -					styler.ColourTo(i, SCE_HJ_SYMBOLS); +					styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));  					state = SCE_HJ_DEFAULT;  				}  			} @@ -711,26 +646,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  		case SCE_HJ_COMMENT:  		case SCE_HJ_COMMENTDOC:  			if (ch == '/' && chPrev == '*') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HJ_DEFAULT; -			} 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;  			}  			break;  		case SCE_HJ_COMMENTLINE:  			if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE); +				styler.ColourTo(i - 1, statePrintForState(SCE_HJ_COMMENTLINE, inScriptType));  				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; -				inScriptTag = 0;  			}  			break;  		case SCE_HJ_DOUBLESTRING: @@ -739,12 +662,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					i++;  				}  			} else if (ch == '\"') { -				styler.ColourTo(i, SCE_HJ_DOUBLESTRING); +				styler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType));  				state = SCE_HJ_DEFAULT;  				i++;  				ch = chNext; +			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, StateToPrint); +				state = SCE_HJ_COMMENTLINE; +				i += 2;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_STRINGEOL;  			}  			break; @@ -754,206 +681,64 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					i++;  				}  			} else if (ch == '\'') { -				styler.ColourTo(i, SCE_HJ_SINGLESTRING); +				styler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType));  				state = SCE_HJ_DEFAULT;  				i++;  				ch = chNext; +			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) { +				styler.ColourTo(i - 1, StateToPrint); +				state = SCE_HJ_COMMENTLINE; +				i += 2;  			} else if (isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_STRINGEOL;  			}  			break;  		case SCE_HJ_STRINGEOL:  			if (!isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HJ_DEFAULT;  			} else if (!isLineEnd(chNext)) { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HJ_DEFAULT;  			}  			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; -			} 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; -				inScriptTag = 0; -			} else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && -			           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); -				state = SCE_HJA_DEFAULT; -			} else if ((ch == ' ') || (ch == '\t')) { -				if (state == SCE_HJA_START) { -					styler.ColourTo(i - 1, state); -					state = SCE_HJA_DEFAULT; -				} -			} -			break; -		case 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 ((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; -				} -			} -			break; -		case SCE_HJA_COMMENT: -		case SCE_HJA_COMMENTDOC: -			if (ch == '/' && chPrev == '*') { -				styler.ColourTo(i, state); -				state = SCE_HJA_DEFAULT; -			} 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; -			} -			break; -		case 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; -				inScriptTag = 0; -			} -			break; -		case 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 ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { -				styler.ColourTo(i - 1, state); -				state = SCE_HJA_COMMENTLINE; -				i += 2; -			} else if (isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); -				state = SCE_HJA_STRINGEOL; -			} -			break; -		case 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 ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { -				styler.ColourTo(i - 1, state); -				state = SCE_HJA_COMMENTLINE; -				i += 2; -			} else if (isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); -				state = SCE_HJA_STRINGEOL; -			} -			break; -		case 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; -			} -			break;  		case SCE_HB_DEFAULT:  		case SCE_HB_START:  			if (iswordstart(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_WORD;  			} else if (ch == '\'') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_COMMENTLINE;  			} else if (ch == '\"') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_STRING; -			} 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.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_COMMENTLINE;  			} else if (isoperator(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				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); +					styler.ColourTo(i - 1, StateToPrint);  					state = SCE_HB_DEFAULT;  				}  			}  			break;  		case SCE_HB_WORD:  			if (!iswordchar(ch)) { -				state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler); +				state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType);  				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); +						styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT,inScriptType));  						state = SCE_HB_DEFAULT;  					}  				} @@ -961,129 +746,44 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			break;  		case SCE_HB_STRING:  			if (ch == '\"') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HB_DEFAULT;  				i++;  				ch = chNext;  			} else if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_STRINGEOL;  			}  			break;  		case SCE_HB_COMMENTLINE:  			if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				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; -				inScriptTag = 0;  			}  			break;  		case SCE_HB_STRINGEOL:  			if (!isLineEnd(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HB_DEFAULT;  			} else if (!isLineEnd(chNext)) { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HB_DEFAULT;  			}  			break; -		case SCE_HBA_DEFAULT: -		case 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; -				inScriptTag = 0; -			} 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; -				} -			} -			break; -		case 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; -					} -				} -			} -			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); -				state = SCE_HBA_STRINGEOL; -			} -			break; -		case 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; -				inScriptTag = 0; -			} -			break; -		case 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; -			} -			break;  		case SCE_HP_DEFAULT:  		case SCE_HP_START:  			if (iswordstart(ch)) { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				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.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HP_COMMENTLINE;  			} else if (ch == '#') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HP_COMMENTLINE;  			} else if (ch == '\"') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				if (chNext == '\"' && chNext2 == '\"') {  					i += 2;  					state = SCE_HP_TRIPLEDOUBLE; @@ -1091,10 +791,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					chPrev = ' ';  					chNext = styler.SafeGetCharAt(i + 1);  				} else { -					state = SCE_HP_STRING; +					state = statePrintForState(SCE_HP_STRING,inScriptType);  				}  			} else if (ch == '\'') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				if (chNext == '\'' && chNext2 == '\'') {  					i += 2;  					state = SCE_HP_TRIPLE; @@ -1105,18 +805,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					state = SCE_HP_CHARACTER;  				}  			} else if (isoperator(ch)) { -				styler.ColourTo(i - 1, state); -				styler.ColourTo(i, SCE_HP_OPERATOR); +				styler.ColourTo(i - 1, StateToPrint); +				styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));  			} else if ((ch == ' ') || (ch == '\t')) {  				if (state == SCE_HP_START) { -					styler.ColourTo(i - 1, state); +					styler.ColourTo(i - 1, StateToPrint);  					state = SCE_HP_DEFAULT;  				}  			}  			break;  		case SCE_HP_WORD:  			if (!iswordchar(ch)) { -				classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); +				classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType);  				state = SCE_HP_DEFAULT;  				if (ch == '#') {  					state = SCE_HP_COMMENTLINE; @@ -1141,15 +841,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  						state = SCE_HP_CHARACTER;  					}  				} else if (isoperator(ch)) { -					styler.ColourTo(i, SCE_HP_OPERATOR); +					styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType));  				}  			}  			break;  		case SCE_HP_COMMENTLINE:  			if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HP_DEFAULT; -			} +  		}  			break;  		case SCE_HP_STRING:  			if (ch == '\\') { @@ -1159,7 +859,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					chNext = styler.SafeGetCharAt(i + 1);  				}  			} else if (ch == '\"') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HP_DEFAULT;  			}  			break; @@ -1171,143 +871,22 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					chNext = styler.SafeGetCharAt(i + 1);  				}  			} else if (ch == '\'') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HP_DEFAULT;  			}  			break;  		case SCE_HP_TRIPLE:  			if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HP_DEFAULT;  			}  			break;  		case SCE_HP_TRIPLEDOUBLE:  			if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HP_DEFAULT;  			}  			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.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; -				} -			} -			break; -		case 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); -				} -			} -			break; -		case SCE_HPA_COMMENTLINE: -			if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, state); -				state = SCE_HPA_DEFAULT; -			} -			break; -		case 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; -			} -			break; -		case 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; -			} -			break; -		case SCE_HPA_TRIPLE: -			if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { -				styler.ColourTo(i, state); -				state = SCE_HPA_DEFAULT; -			} -			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)) { @@ -1326,11 +905,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				} 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; +				classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);  			}  			break;  		case SCE_HPHP_NUMBER: @@ -1347,13 +922,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  			break;  		case SCE_HPHP_COMMENT:  			if (ch == '/' && chPrev == '*') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HPHP_DEFAULT;  			}  			break;  		case SCE_HPHP_COMMENTLINE:  			if (ch == '\r' || ch == '\n') { -				styler.ColourTo(i - 1, state); +				styler.ColourTo(i - 1, StateToPrint);  				state = SCE_HPHP_DEFAULT;  			}  			break; @@ -1365,7 +940,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					chNext = styler.SafeGetCharAt(i + 1);  				}  			} else if (ch == '\"') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HPHP_DEFAULT;  			} else if (chNext == '\r' || chNext == '\n') {  				styler.ColourTo(i - 1, SCE_HPHP_STRINGEOL); @@ -1383,14 +958,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  					chNext = styler.SafeGetCharAt(i + 1);  				}  			} else if (ch == '\'') { -				styler.ColourTo(i, state); +				styler.ColourTo(i, StateToPrint);  				state = SCE_HPHP_DEFAULT;  			}  			break;  		case SCE_HPHP_STRINGEOL:  			break;  		case SCE_HPHP_DEFAULT: -			styler.ColourTo(i - 1, state); +			styler.ColourTo(i - 1, StateToPrint);  			if (isdigit(ch)) {  				state = SCE_HPHP_NUMBER;  			} else if (iswordstart(ch)) { @@ -1451,29 +1026,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty  				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); +	StateToPrint = statePrintForState(state,inScriptType); +	styler.ColourTo(lengthDoc - 1, StateToPrint); + +	// Fill in the real level of the next line, keeping the current flags as they will be filled in later +	if (fold) { +		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; +		//styler.SetLevel(lineCurrent, levelCurrent | flagsNext); +		styler.SetLevel(lineCurrent, levelPrev | flagsNext); + +	}  }  LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc); | 
