📄 lexhtml.cxx
字号:
} 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 + -