diff options
author | nyamatongwe <unknown> | 2008-07-06 06:54:59 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2008-07-06 06:54:59 +0000 |
commit | 7668701d9daa8a4df70cd9ba123d42043a4fbd24 (patch) | |
tree | b2f93d61b74c985aed82b45e105896177e5001ed /src | |
parent | 7434ebca8b4467adf800f0943d0dd2d6bd11cee9 (diff) | |
download | scintilla-mirror-7668701d9daa8a4df70cd9ba123d42043a4fbd24.tar.gz |
Patches from Jason Oster in bug #2010095.
Diffstat (limited to 'src')
-rw-r--r-- | src/LexHTML.cxx | 154 |
1 files changed, 113 insertions, 41 deletions
diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index 659f13766..59bd87c68 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -268,7 +268,7 @@ static int classifyTagHTML(unsigned int start, unsigned int end, // if the current language is XML, I can fold any tag // if the current language is HTML, I don't want to fold certain tags (input, meta, etc.) //...to find it in the list of no-container-tags - tagDontFold = (!isXml) && (NULL != strstr("meta link img area br hr input ",s)); + tagDontFold = (!isXml) && (NULL != strstr("meta link img area br hr input ", s)); //now we can remove the trailing space s[i] = '\0'; @@ -469,23 +469,50 @@ static bool isPHPStringState(int state) { (state == SCE_HPHP_COMPLEX_VARIABLE); } -static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler) { - int j = i; - while (j < lengthDoc && (styler[j] != '\r' && styler[j] != '\n')) - j++; - phpStringDelimiter[0] = styler.SafeGetCharAt(j); - if ((phpStringDelimiter[0] == '\r') && (styler.SafeGetCharAt(j + 1) == '\n')) - phpStringDelimiter[0] = '\n'; +static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler, bool &isSimpleString) { + int j; + const int beginning = i - 1; + bool isValidSimpleString = false; while (i < lengthDoc && (styler[i] == ' ' || styler[i] == '\t')) i++; - for (j = i; j < lengthDoc && styler[j] != '\n' && styler[j] != '\r'; j++) { + + char ch = styler.SafeGetCharAt(i); + const char chNext = styler.SafeGetCharAt(i + 1); + if (!IsPhpWordStart(ch)) { + if (ch == '\'' && IsPhpWordStart(chNext)) { + i++; + ch = chNext; + isSimpleString = true; + } else { + phpStringDelimiter[0] = '\0'; + return beginning; + } + } + phpStringDelimiter[0] = ch; + i++; + + for (j = i; j < lengthDoc && !isLineEnd(styler[j]); j++) { + if (!IsPhpWordChar(styler[j])) { + if (isSimpleString && (styler[j] == '\'') && isLineEnd(styler.SafeGetCharAt(j + 1))) { + isValidSimpleString = true; + j++; + break; + } else { + phpStringDelimiter[0] = '\0'; + return beginning; + } + } if (j - i < phpStringDelimiterSize - 2) phpStringDelimiter[j-i+1] = styler[j]; else i++; } - phpStringDelimiter[j-i+1] = '\0'; + if (isSimpleString && !isValidSimpleString) { + phpStringDelimiter[0] = '\0'; + return beginning; + } + phpStringDelimiter[j-i+1 - (isSimpleString ? 1 : 0)] = '\0'; return j - 1; } @@ -516,7 +543,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } // String can be heredoc, must find a delimiter first - while (startPos > 0 && isPHPStringState(state) && state != SCE_HPHP_SIMPLESTRING) { + while (startPos > 0 && isPHPStringState(state)) { startPos--; length++; state = styler.StyleAt(startPos); @@ -696,6 +723,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HP_STRING: case SCE_HP_TRIPLE: case SCE_HP_TRIPLEDOUBLE: + case SCE_HPHP_HSTRING: + case SCE_HPHP_SIMPLESTRING: + case SCE_HPHP_COMMENT: + case SCE_HPHP_COMMENTLINE: break; default : // check if the closing tag is a script tag @@ -1077,7 +1108,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (!tagDontFold){ + if (!tagDontFold) { if (tagClosing) { levelCurrent--; } else { @@ -1125,8 +1156,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (!tagDontFold){ - if (tagClosing){ + if (!tagDontFold) { + if (tagClosing) { levelCurrent--; } else { levelCurrent++; @@ -1151,8 +1182,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (!tagDontFold){ - if (tagClosing){ + if (!tagDontFold) { + if (tagClosing) { levelCurrent--; } else { levelCurrent++; @@ -1225,8 +1256,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_H_DEFAULT; } tagOpened = false; - if (!tagDontFold){ - if (tagClosing){ + if (!tagDontFold) { + if (tagClosing) { levelCurrent--; } else { levelCurrent++; @@ -1585,10 +1616,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HPHP_HSTRING; strcpy(phpStringDelimiter, "\""); } else if (styler.Match(i, "<<<")) { - state = SCE_HPHP_HSTRING; - i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler); + bool isSimpleString = false; + i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString); + if (strlen(phpStringDelimiter)) state = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING); } else if (ch == '\'') { state = SCE_HPHP_SIMPLESTRING; + strcpy(phpStringDelimiter, "\'"); } else if (ch == '$' && IsPhpWordStart(chNext)) { state = SCE_HPHP_VARIABLE; } else if (IsOperator(ch)) { @@ -1643,26 +1676,46 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_HSTRING_VARIABLE; } else if (styler.Match(i, phpStringDelimiter)) { + if (phpStringDelimiter[0] == '\"') { + styler.ColourTo(i, StateToPrint); + state = SCE_HPHP_DEFAULT; + } else if (isLineEnd(chPrev)) { const int psdLength = strlen(phpStringDelimiter); - if ((psdLength > 1) && ((i + psdLength) < lengthDoc)) - i += psdLength - 1; - styler.ColourTo(i, StateToPrint); - state = SCE_HPHP_DEFAULT; + const char chAfterPsd = styler.SafeGetCharAt(i + psdLength); + const char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1); + if (isLineEnd(chAfterPsd) || + (chAfterPsd == ';' && isLineEnd(chAfterPsd2))) { + i += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1; + styler.ColourTo(i, StateToPrint); + state = SCE_HPHP_DEFAULT; + } + } } break; case SCE_HPHP_SIMPLESTRING: - if (ch == '\\') { - // skip the next char - i++; - } else if (ch == '\'') { - styler.ColourTo(i, StateToPrint); - state = SCE_HPHP_DEFAULT; + if (phpStringDelimiter[0] == '\'') { + if (ch == '\\') { + // skip the next char + i++; + } else if (ch == '\'') { + styler.ColourTo(i, StateToPrint); + state = SCE_HPHP_DEFAULT; + } + } else if (isLineEnd(chPrev) && styler.Match(i, phpStringDelimiter)) { + const int psdLength = strlen(phpStringDelimiter); + const char chAfterPsd = styler.SafeGetCharAt(i + psdLength); + const char chAfterPsd2 = styler.SafeGetCharAt(i + psdLength + 1); + if (isLineEnd(chAfterPsd) || + (chAfterPsd == ';' && isLineEnd(chAfterPsd2))) { + i += (((i + psdLength) < lengthDoc) ? psdLength : lengthDoc) - 1; + styler.ColourTo(i, StateToPrint); + state = SCE_HPHP_DEFAULT; + } } break; case SCE_HPHP_HSTRING_VARIABLE: - if (!IsPhpWordChar(ch)) { - styler.ColourTo(i - 1, StateToPrint); - i--; // strange but it works + if (!IsPhpWordChar(chNext)) { + styler.ColourTo(i, StateToPrint); state = SCE_HPHP_HSTRING; } break; @@ -1691,10 +1744,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HPHP_HSTRING; strcpy(phpStringDelimiter, "\""); } else if (styler.Match(i, "<<<")) { - state = SCE_HPHP_HSTRING; - i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler); + bool isSimpleString = false; + i = FindPhpStringDelimiter(phpStringDelimiter, sizeof(phpStringDelimiter), i + 3, lengthDoc, styler, isSimpleString); + if (strlen(phpStringDelimiter)) state = (isSimpleString ? SCE_HPHP_SIMPLESTRING : SCE_HPHP_HSTRING); } else if (ch == '\'') { state = SCE_HPHP_SIMPLESTRING; + strcpy(phpStringDelimiter, "\'"); } else if (ch == '$' && IsPhpWordStart(chNext)) { state = SCE_HPHP_VARIABLE; } else if (IsOperator(ch)) { @@ -1750,8 +1805,24 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } } - StateToPrint = statePrintForState(state, inScriptType); + switch (state) { + case SCE_HJ_WORD: + classifyWordHTJS(styler.GetStartSegment(), lengthDoc - 1, keywords2, styler, inScriptType); + break; + case SCE_HB_WORD: + classifyWordHTVB(styler.GetStartSegment(), lengthDoc - 1, keywords3, styler, inScriptType); + break; + case SCE_HP_WORD: + classifyWordHTPy(styler.GetStartSegment(), lengthDoc - 1, keywords4, styler, prevWord, inScriptType); + break; + case SCE_HPHP_WORD: + classifyWordHTPHP(styler.GetStartSegment(), lengthDoc - 1, keywords5, styler); + break; + default: + StateToPrint = statePrintForState(state, inScriptType); styler.ColourTo(lengthDoc - 1, StateToPrint); + break; + } // Fill in the real level of the next line, keeping the current flags as they will be filled in later if (fold) { @@ -1763,13 +1834,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty static void ColouriseXMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { // Passing in true because we're lexing XML - ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists,styler, true); + ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, true); } static void ColouriseHTMLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { // Passing in false because we're notlexing XML - ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists,styler, false); + ColouriseHyperTextDoc(startPos, length, initStyle, keywordlists, styler, false); } static bool isASPScript(int state) { @@ -2066,9 +2137,10 @@ static void ColourisePHPDoc(unsigned int startPos, int length, int initStyle, Wo } static void ColourisePHPScriptDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], - Accessor &styler) { - if(startPos == 0) initStyle = SCE_HPHP_DEFAULT; - ColouriseHTMLDoc(startPos,length,initStyle,keywordlists,styler); + Accessor &styler) { + if (startPos == 0) + initStyle = SCE_HPHP_DEFAULT; + ColouriseHTMLDoc(startPos, length, initStyle, keywordlists, styler); } static const char * const htmlWordListDesc[] = { |