diff options
author | nyamatongwe <unknown> | 2004-03-02 10:19:31 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2004-03-02 10:19:31 +0000 |
commit | d55a46cf27af16763ffe7bfba1bd23d8a7bddc51 (patch) | |
tree | 962651f7804f2e29dcf6c311a69f518f9c033f46 /src | |
parent | d1d11b4866fe9045f35bc28963430b9b6a9c622d (diff) | |
download | scintilla-mirror-d55a46cf27af16763ffe7bfba1bd23d8a7bddc51.tar.gz |
Patches from Jakub for PHP complex variables and here docs.
Diffstat (limited to 'src')
-rw-r--r-- | src/LexHTML.cxx | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index e84ff6aa6..dafac8058 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -420,6 +420,19 @@ 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; + phpStringDelimiter[0] = '\n'; + for (j = i; j < lengthDoc && styler[j] != '\n' && styler[j] != '\r'; j++) { + if (j - i < phpStringDelimiterSize - 2) + phpStringDelimiter[j-i+1] = styler[j]; + else + i++; + } + phpStringDelimiter[j-i+1] = '\0'; + return j; +} + static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { WordList &keywords = *keywordlists[0]; @@ -433,6 +446,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty styler.StartAt(startPos, STYLE_MAX); char prevWord[200]; prevWord[0] = '\0'; + char phpStringDelimiter[200]; // PHP is not limited in length, we are + phpStringDelimiter[0] = '\0'; int StateToPrint = initStyle; int state = stateForPrintState(StateToPrint); @@ -444,6 +459,12 @@ 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) { + startPos--; + length++; + state = styler.StyleAt(startPos); + } styler.StartAt(startPos, STYLE_MAX); int lineCurrent = styler.GetLine(startPos); @@ -1456,6 +1477,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty 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)) { @@ -1498,17 +1523,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } break; case SCE_HPHP_HSTRING: - if (ch == '\\') { + if (ch == '\\' && (phpStringDelimiter[0] == '\"' || chNext == '$' || chNext == '{')) { // skip the next char i++; - } else if (ch == '$' && ((chPrev == '{' && chPrev2 != '\\' && IsPhpWordStart(chNext)) - || (chNext == '{' && IsPhpWordStart(chNext2)))) { - styler.ColourTo(i - (chNext == '{' ? 1 : 2), StateToPrint); + } else if (((ch == '{' && chNext == '$') || (ch == '$' && chNext == '{')) + && IsPhpWordStart(chNext2)) { + styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_COMPLEX_VARIABLE; } else if (ch == '$' && IsPhpWordStart(chNext)) { styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_HSTRING_VARIABLE; - } else if (ch == '\"') { + } else if (styler.Match(i, phpStringDelimiter)) { + if (strlen(phpStringDelimiter) > 1) + i += strlen(phpStringDelimiter) - 1; styler.ColourTo(i, StateToPrint); state = SCE_HPHP_DEFAULT; } @@ -1552,6 +1579,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty 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)) { |