aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/LexHTML.cxx41
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)) {