diff options
| author | nyamatongwe <unknown> | 2001-11-10 02:48:46 +0000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2001-11-10 02:48:46 +0000 | 
| commit | a3af6cd9d4a006b30d9dd6cbf0d922aa9776ab7f (patch) | |
| tree | 327cbc776088cfbf18430bcd0203fda074e36bb2 /src | |
| parent | 4618be21c0ec2e5af65dc3d6dd3263b88ef9d628 (diff) | |
| download | scintilla-mirror-a3af6cd9d4a006b30d9dd6cbf0d922aa9776ab7f.tar.gz | |
The PHP and ASP lexers process some HTML now.
Diffstat (limited to 'src')
| -rw-r--r-- | src/LexHTML.cxx | 112 | 
1 files changed, 108 insertions, 4 deletions
| diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index 551e7015a..82bc1d942 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -1607,6 +1607,101 @@ static void ColouriseHBAPiece(StyleContext &sc, WordList *keywordlists[]) {  	}  } +static void ColouriseHTMLPiece(StyleContext &sc, WordList *keywordlists[]) { +	WordList &keywordsTags = *keywordlists[0]; +	if (sc.state == SCE_H_COMMENT) { +		if (sc.Match("-->")) { +			sc.Forward(); +			sc.Forward(); +			sc.ForwardSetState(SCE_H_DEFAULT); +		} +	} else if (sc.state == SCE_H_ENTITY) { +		if (sc.ch == ';') { +			sc.ForwardSetState(SCE_H_DEFAULT); +		} else if (sc.ch != '#' && (sc.ch < 0x80) && !isalnum(sc.ch)) {	// Should check that '#' follows '&', but it is unlikely anyway... +			sc.ChangeState(SCE_H_TAGUNKNOWN); +			sc.SetState(SCE_H_DEFAULT); +		} +	} else if (sc.state == SCE_H_TAGUNKNOWN) { +		if (!ishtmlwordchar(sc.ch) && !((sc.ch == '/') && (sc.chPrev == '<')) && sc.ch != '[') { +			char s[100]; +			sc.GetCurrentLowered(s, sizeof(s)); +			if (s[1] == '/') { +				if (keywordsTags.InList(s + 2)) { +					sc.ChangeState(SCE_H_TAG); +				} +			} else { +				if (keywordsTags.InList(s + 1)) { +					sc.ChangeState(SCE_H_TAG); +				} +			} +			if (sc.ch == '>') { +				sc.ForwardSetState(SCE_H_DEFAULT); +			} else if (sc.Match('/', '>')) { +				sc.SetState(SCE_H_TAGEND); +				sc.Forward(); +				sc.ForwardSetState(SCE_H_DEFAULT); +			} else { +				sc.SetState(SCE_H_OTHER); +			} +		} +	} else if (sc.state == SCE_H_ATTRIBUTE) { +		if (!ishtmlwordchar(sc.ch)) { +			char s[100]; +			sc.GetCurrentLowered(s, sizeof(s)); +			if (!keywordsTags.InList(s)) { +				sc.ChangeState(SCE_H_ATTRIBUTEUNKNOWN); +			} +			sc.SetState(SCE_H_OTHER); +		} +	} else if (sc.state == SCE_H_OTHER) { +		if (sc.ch == '>') { +			sc.SetState(SCE_H_TAG); +			sc.ForwardSetState(SCE_H_DEFAULT); +		} else if (sc.Match('/', '>')) { +			sc.SetState(SCE_H_TAG); +			sc.Forward(); +			sc.ForwardSetState(SCE_H_DEFAULT); +		} +	} else if (sc.state == SCE_H_DOUBLESTRING) { +		if (sc.ch == '\"') { +			sc.ForwardSetState(SCE_H_OTHER); +		} +	} else if (sc.state == SCE_H_SINGLESTRING) { +		if (sc.ch == '\'') { +			sc.ForwardSetState(SCE_H_OTHER); +		} +	} else if (sc.state == SCE_H_NUMBER) { +		if (!IsADigit(sc.ch)) { +			sc.SetState(SCE_H_OTHER); +		} +	} +	 +	if (sc.state == SCE_H_DEFAULT) { +		if (sc.ch == '<') { +			if (sc.Match("<!--")) +				sc.SetState(SCE_H_COMMENT); +			else +				sc.SetState(SCE_H_TAGUNKNOWN); +		} else if (sc.ch == '&') { +			sc.SetState(SCE_H_ENTITY); +		} +	} else if ((sc.state == SCE_H_OTHER) || (sc.state == SCE_H_VALUE)) { +		if (sc.ch == '\"') { +			sc.SetState(SCE_H_DOUBLESTRING); +		} else if (sc.ch == '\'') { +			sc.SetState(SCE_H_SINGLESTRING); +		} else if (IsADigit(sc.ch)) { +			sc.SetState(SCE_H_NUMBER); +		} else if (sc.ch == '>') { +			sc.SetState(SCE_H_TAG); +			sc.ForwardSetState(SCE_H_DEFAULT); +		} else if (ishtmlwordchar(sc.ch)) { +			sc.SetState(SCE_H_ATTRIBUTE); +		} +	} +} +  static void ColouriseASPPiece(StyleContext &sc, WordList *keywordlists[]) {  	// Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT  	if ((sc.state == SCE_H_ASPAT || isASPScript(sc.state)) && sc.Match('%', '>')) { @@ -1618,12 +1713,17 @@ static void ColouriseASPPiece(StyleContext &sc, WordList *keywordlists[]) {  	// Handle some ASP script  	if (sc.state >= SCE_HBA_START && sc.state <= SCE_HBA_STRINGEOL) {  		ColouriseHBAPiece(sc, keywordlists); +	} else if (sc.state >= SCE_H_DEFAULT && sc.state <= SCE_H_SGML_BLOCK_DEFAULT) { +		ColouriseHTMLPiece(sc, keywordlists);  	}  	// Enter new sc.state -	if (sc.state == SCE_H_DEFAULT) { +	if ((sc.state == SCE_H_DEFAULT) || (sc.state == SCE_H_TAGUNKNOWN)) {  		if (sc.Match('<', '%')) { -			sc.SetState(SCE_H_ASP); +			if (sc.state == SCE_H_TAGUNKNOWN) +				sc.ChangeState(SCE_H_ASP); +			else +				sc.SetState(SCE_H_ASP);  			sc.Forward();  			sc.Forward();  			if (sc.ch == '@') { @@ -1648,7 +1748,7 @@ static void ColouriseASPDoc(unsigned int startPos, int length, int initStyle, Wo  	sc.Complete();  } -static void ColourisePHPPiece(StyleContext &sc, WordList *[]) { +static void ColourisePHPPiece(StyleContext &sc, WordList *keywordlists[]) {  	// Possibly exit current state to either SCE_H_DEFAULT or SCE_HBA_DEFAULT  	if (sc.state >= SCE_HPHP_DEFAULT && sc.state <= SCE_HPHP_OPERATOR) {  		if (!isPHPStringState(sc.state) &&  @@ -1660,6 +1760,10 @@ static void ColourisePHPPiece(StyleContext &sc, WordList *[]) {  		}  	}  +	if (sc.state >= SCE_H_DEFAULT && sc.state <= SCE_H_SGML_BLOCK_DEFAULT) { +		ColouriseHTMLPiece(sc, keywordlists); +	} +	  	// Handle some PHP script  	if (sc.state == SCE_HPHP_WORD) {  		if (!IsAWordStart(sc.ch)) { @@ -1692,7 +1796,7 @@ static void ColourisePHPPiece(StyleContext &sc, WordList *[]) {  	}  	// Enter new sc.state -	if (sc.state == SCE_H_DEFAULT) { +	if ((sc.state == SCE_H_DEFAULT) || (sc.state == SCE_H_TAGUNKNOWN)) {  		if (sc.Match("<?php")) {  			sc.SetState(SCE_H_QUESTION);  			sc.Forward(); | 
