⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexhtml.cxx.svn-base

📁 Notepad++ is a generic source code editor (it tries to be anyway) and Notepad replacement written in
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
				state = SCE_HPHP_NUMBER;
			} else if (iswordstart(ch)) {
				state = SCE_HPHP_WORD;
			} else if (ch == '/' && chNext == '*') {
				i++;
				state = SCE_HPHP_COMMENT;
			} else if (ch == '/' && chNext == '/') {
				i++;
				state = SCE_HPHP_COMMENTLINE;
			} else if (ch == '#') {
				state = SCE_HPHP_COMMENTLINE;
			} else if (ch == '\"') {
				state = SCE_HPHP_HSTRING;
				strcpy(phpStringDelimiter, "\"");
			} else if (styler.Match(i, "<<<")) {
				state = SCE_HPHP_HSTRING;
				i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler);
			} else if (ch == '\'') {
				state = SCE_HPHP_SIMPLESTRING;
			} else if (ch == '$' && IsPhpWordStart(chNext)) {
				state = SCE_HPHP_VARIABLE;
			} else if (isoperator(ch)) {
				state = SCE_HPHP_OPERATOR;
			} else if ((state == SCE_HPHP_OPERATOR) && (isspacechar(ch))) {
				state = SCE_HPHP_DEFAULT;
			}
			break;
			///////////// end - PHP state handling
		}

		// Some of the above terminated their lexeme but since the same character starts
		// the same class again, only reenter if non empty segment.

		bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());
		if (state == SCE_HB_DEFAULT) {    // One of the above succeeded
			if ((ch == '\"') && (nonEmptySegment)) {
				state = SCE_HB_STRING;
			} else if (ch == '\'') {
				state = SCE_HB_COMMENTLINE;
			} else if (iswordstart(ch)) {
				state = SCE_HB_WORD;
			} else if (isoperator(ch)) {
				styler.ColourTo(i, SCE_HB_DEFAULT);
			}
		} else if (state == SCE_HBA_DEFAULT) {    // One of the above succeeded
			if ((ch == '\"') && (nonEmptySegment)) {
				state = SCE_HBA_STRING;
			} else if (ch == '\'') {
				state = SCE_HBA_COMMENTLINE;
			} else if (iswordstart(ch)) {
				state = SCE_HBA_WORD;
			} else if (isoperator(ch)) {
				styler.ColourTo(i, SCE_HBA_DEFAULT);
			}
		} else if (state == SCE_HJ_DEFAULT) {    // One of the above succeeded
			if (ch == '/' && chNext == '*') {
				if (styler.SafeGetCharAt(i + 2) == '*')
					state = SCE_HJ_COMMENTDOC;
				else
					state = SCE_HJ_COMMENT;
			} else if (ch == '/' && chNext == '/') {
				state = SCE_HJ_COMMENTLINE;
			} else if ((ch == '\"') && (nonEmptySegment)) {
				state = SCE_HJ_DOUBLESTRING;
			} else if ((ch == '\'') && (nonEmptySegment)) {
				state = SCE_HJ_SINGLESTRING;
			} else if (iswordstart(ch)) {
				state = SCE_HJ_WORD;
			} else if (isoperator(ch)) {
				styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));
			}
		}
	}

	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, levelPrev | flagsNext);
	}
}

static bool isASPScript(int state) {
	return
		(state >= SCE_HJA_START && state <= SCE_HJA_REGEX) ||
		(state >= SCE_HBA_START && state <= SCE_HBA_STRINGEOL) ||
		(state >= SCE_HPA_DEFAULT && state <= SCE_HPA_IDENTIFIER);
}

static void ColouriseHBAPiece(StyleContext &sc, WordList *keywordlists[]) {
	WordList &keywordsVBS = *keywordlists[2];
	if (sc.state == SCE_HBA_WORD) {
		if (!IsAWordChar(sc.ch)) {
			char s[100];
			sc.GetCurrentLowered(s, sizeof(s));
			if (keywordsVBS.InList(s)) {
				if (strcmp(s, "rem") == 0) {
					sc.ChangeState(SCE_HBA_COMMENTLINE);
					if (sc.atLineEnd) {
						sc.SetState(SCE_HBA_DEFAULT);
					}
				} else {
					sc.SetState(SCE_HBA_DEFAULT);
				}
			} else {
				sc.ChangeState(SCE_HBA_IDENTIFIER);
				sc.SetState(SCE_HBA_DEFAULT);
			}
		}
	} else if (sc.state == SCE_HBA_NUMBER) {
		if (!IsAWordChar(sc.ch)) {
			sc.SetState(SCE_HBA_DEFAULT);
		}
	} else if (sc.state == SCE_HBA_STRING) {
		if (sc.ch == '\"') {
			sc.ForwardSetState(SCE_HBA_DEFAULT);
		} else if (sc.ch == '\r' || sc.ch == '\n') {
			sc.ChangeState(SCE_HBA_STRINGEOL);
			sc.ForwardSetState(SCE_HBA_DEFAULT);
		}
	} else if (sc.state == SCE_HBA_COMMENTLINE) {
		if (sc.ch == '\r' || sc.ch == '\n') {
			sc.SetState(SCE_HBA_DEFAULT);
		}
	}

	if (sc.state == SCE_HBA_DEFAULT) {
		if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
			sc.SetState(SCE_HBA_NUMBER);
		} else if (IsAWordStart(sc.ch)) {
			sc.SetState(SCE_HBA_WORD);
		} else if (sc.ch == '\'') {
			sc.SetState(SCE_HBA_COMMENTLINE);
		} else if (sc.ch == '\"') {
			sc.SetState(SCE_HBA_STRING);
		}
	}
}

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.ch != '.' && sc.ch != '-' && sc.ch != '_' && sc.ch != ':') { // valid in XML
			sc.ChangeState(SCE_H_TAGUNKNOWN);
			sc.SetState(SCE_H_DEFAULT);
		}
	} else if (sc.state == SCE_H_TAGUNKNOWN) {
		if (!ishtmlwordchar(static_cast<char>(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(static_cast<char>(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.chPrev == '=') {
			sc.SetState(SCE_H_VALUE);
		}
	} 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.chPrev == '=') {
			sc.SetState(SCE_H_DOUBLESTRING);
		} else if (sc.ch == '\'' && sc.chPrev == '=') {
			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(static_cast<char>(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('%', '>')) {
		sc.SetState(SCE_H_ASP);
		sc.Forward();
		sc.ForwardSetState(SCE_H_DEFAULT);
	}

	// 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) || (sc.state == SCE_H_TAGUNKNOWN)) {
		if (sc.Match('<', '%')) {
			if (sc.state == SCE_H_TAGUNKNOWN)
				sc.ChangeState(SCE_H_ASP);
			else
				sc.SetState(SCE_H_ASP);
			sc.Forward();
			sc.Forward();
			if (sc.ch == '@') {
				sc.ForwardSetState(SCE_H_ASPAT);
			} else {
				if (sc.ch == '=') {
					sc.Forward();
				}
				sc.SetState(SCE_HBA_DEFAULT);
			}
		}
	}
}

static void ColouriseASPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                                  Accessor &styler) {
	// Lexer for HTML requires more lexical states (7 bits worth) than most lexers
	StyleContext sc(startPos, length, initStyle, styler, 0x7f);
	for (; sc.More(); sc.Forward()) {
		ColouriseASPPiece(sc, keywordlists);
	}
	sc.Complete();
}

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) &&
			(sc.state != SCE_HPHP_COMMENT) &&
			(sc.Match('?', '>'))) {
			sc.SetState(SCE_H_QUESTION);
			sc.Forward();
			sc.ForwardSetState(SCE_H_DEFAULT);
		}
	}

	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 (!IsPhpWordChar(static_cast<char>(sc.ch))) {
			sc.SetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_COMMENTLINE) {
		if (sc.ch == '\r' || sc.ch == '\n') {
			sc.SetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_COMMENT) {
		if (sc.Match('*', '/')) {
			sc.Forward();
			sc.Forward();
			sc.SetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_HSTRING) {
		if (sc.ch == '\"') {
			sc.ForwardSetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_SIMPLESTRING) {
		if (sc.ch == '\'') {
			sc.ForwardSetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_VARIABLE) {
		if (!IsPhpWordChar(static_cast<char>(sc.ch))) {
			sc.SetState(SCE_HPHP_DEFAULT);
		}
	} else if (sc.state == SCE_HPHP_OPERATOR) {
		sc.SetState(SCE_HPHP_DEFAULT);
	}

	// Enter new sc.state
	if ((sc.state == SCE_H_DEFAULT) || (sc.state == SCE_H_TAGUNKNOWN)) {
		if (sc.Match("<?php")) {
			sc.SetState(SCE_H_QUESTION);
			sc.Forward();
			sc.Forward();
			sc.Forward();
			sc.Forward();
			sc.Forward();
			sc.SetState(SCE_HPHP_DEFAULT);
		}
	}
	if (sc.state == SCE_HPHP_DEFAULT) {
		if (IsPhpWordStart(static_cast<char>(sc.ch))) {
			sc.SetState(SCE_HPHP_WORD);
		} else if (sc.ch == '#') {
			sc.SetState(SCE_HPHP_COMMENTLINE);
		} else if (sc.Match("<!--")) {
			sc.SetState(SCE_HPHP_COMMENTLINE);
		} else if (sc.Match('/', '/')) {
			sc.SetState(SCE_HPHP_COMMENTLINE);
		} else if (sc.Match('/', '*')) {
			sc.SetState(SCE_HPHP_COMMENT);
		} else if (sc.ch == '\"') {
			sc.SetState(SCE_HPHP_HSTRING);
		} else if (sc.ch == '\'') {
			sc.SetState(SCE_HPHP_SIMPLESTRING);
		} else if (sc.ch == '$' && IsPhpWordStart(static_cast<char>(sc.chNext))) {
			sc.SetState(SCE_HPHP_VARIABLE);
		} else if (isoperator(static_cast<char>(sc.ch))) {
			sc.SetState(SCE_HPHP_OPERATOR);
		}
	}
}

static void ColourisePHPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                                  Accessor &styler) {
	// Lexer for HTML requires more lexical states (7 bits worth) than most lexers
	StyleContext sc(startPos, length, initStyle, styler, 0x7f);
	for (; sc.More(); sc.Forward()) {
		ColourisePHPPiece(sc, keywordlists);
	}
	sc.Complete();
}

static void ColourisePHPScriptDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                                               Accessor &styler) {
	if(startPos == 0) initStyle = SCE_HPHP_DEFAULT;
		ColouriseHyperTextDoc(startPos,length,initStyle,keywordlists,styler);
}

static const char * const htmlWordListDesc[] = {
	"HTML elements and attributes",
	"JavaScript keywords",
	"VBScript keywords",
	"Python keywords",
	"PHP keywords",
	"SGML and DTD keywords",
	0,
};

static const char * const phpscriptWordListDesc[] = {
	"", //Unused
	"", //Unused
	"", //Unused
	"", //Unused
	"PHP keywords",
	"", //Unused
	0,
};

LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext", 0, htmlWordListDesc, 7);
LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml", 0, htmlWordListDesc, 7);
// SCLEX_ASP and SCLEX_PHP should not be used in new code: use SCLEX_HTML instead.
LexerModule lmASP(SCLEX_ASP, ColouriseASPDoc, "asp", 0, htmlWordListDesc, 7);
LexerModule lmPHP(SCLEX_PHP, ColourisePHPDoc, "php", 0, htmlWordListDesc, 7);
LexerModule lmPHPSCRIPT(SCLEX_PHPSCRIPT, ColourisePHPScriptDoc, "phpscript", 0, phpscriptWordListDesc, 7);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -