diff options
Diffstat (limited to 'src/LexScriptol.cxx')
-rw-r--r-- | src/LexScriptol.cxx | 429 |
1 files changed, 203 insertions, 226 deletions
diff --git a/src/LexScriptol.cxx b/src/LexScriptol.cxx index fda10e316..faaa2d46d 100644 --- a/src/LexScriptol.cxx +++ b/src/LexScriptol.cxx @@ -19,32 +19,31 @@ static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { - char s[100]; - bool wordIsNumber = isdigit(styler[start]) != 0; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) - { - s[i] = styler[start + i]; - s[i + 1] = '\0'; - } - char chAttr = SCE_P_IDENTIFIER; - if (0 == strcmp(prevWord, "class")) chAttr = SCE_P_CLASSNAME; - else if (wordIsNumber) chAttr = SCE_P_NUMBER; - else if (keywords.InList(s)) chAttr = SCE_P_WORD; + char s[100]; + bool wordIsNumber = isdigit(styler[start]) != 0; + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) + { + s[i] = styler[start + i]; + s[i + 1] = '\0'; + } + char chAttr = SCE_SCRIPTOL_IDENTIFIER; + if (0 == strcmp(prevWord, "class")) chAttr = SCE_SCRIPTOL_CLASSNAME; + else if (wordIsNumber) chAttr = SCE_SCRIPTOL_NUMBER; + else if (keywords.InList(s)) chAttr = SCE_SCRIPTOL_KEYWORD; else for (unsigned int i = 0; i < end - start + 1; i++) // test dotted idents { - if (styler[start + i] == '.') + if (styler[start + i] == '.') { - styler.ColourTo(start + i - 1, chAttr); - styler.ColourTo(start + i, SCE_P_OPERATOR); - } - } - styler.ColourTo(end, chAttr); - strcpy(prevWord, s); + styler.ColourTo(start + i - 1, chAttr); + styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR); + } + } + styler.ColourTo(end, chAttr); + strcpy(prevWord, s); } static bool IsSolComment(Accessor &styler, int pos, int len) { -// return len > 0 && styler[pos]=='`'; char c; if(len > 0) { @@ -63,60 +62,62 @@ static bool IsSolComment(Accessor &styler, int pos, int len) return false; } -static bool IsSolStringStart(char ch, char /*chNext*/) +static bool IsSolStringStart(char ch) { if (ch == '\'' || ch == '"') return true; - //chNext = chNext; // for future use - - return false; + return false; } -static bool IsSolWordStart(char ch, char chNext) +static bool IsSolWordStart(char ch) { - return (iswordchar(ch) && !IsSolStringStart(ch, chNext)); + return (iswordchar(ch) && !IsSolStringStart(ch)); } -/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */ + static int GetSolStringState(Accessor &styler, int i, int *nextIndex) { char ch = styler.SafeGetCharAt(i); char chNext = styler.SafeGetCharAt(i + 1); - if (ch != '"' && ch != '\'') { - *nextIndex = i + 1; - return SCE_P_DEFAULT; + if (ch != '\"' && ch != '\'') + { + *nextIndex = i + 1; + return SCE_SCRIPTOL_DEFAULT; } - + // ch is either single or double quotes in string + // code below seem non-sense but is here for future extensions if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) - { - *nextIndex = i + 3; - if (ch == '"') return SCE_P_TRIPLEDOUBLE; - else return SCE_P_TRIPLE; + { + *nextIndex = i + 3; + if(ch == '\"') return SCE_SCRIPTOL_TRIPLE; + if(ch == '\'') return SCE_SCRIPTOL_TRIPLE; + return SCE_SCRIPTOL_STRING; } - else - { - *nextIndex = i + 1; - if (ch == '"') return SCE_P_STRING; - else return SCE_P_CHARACTER; + else + { + *nextIndex = i + 1; + if (ch == '"') return SCE_SCRIPTOL_STRING; + else return SCE_SCRIPTOL_STRING; } } + static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle, - WordList *keywordlists[], Accessor &styler) + WordList *keywordlists[], Accessor &styler) { int lengthDoc = startPos + length; + char stringType = '\"'; - // Backtrack to previous line in case need to fix its tab whinging if (startPos > 0) - { - int lineCurrent = styler.GetLine(startPos); - if (lineCurrent > 0) { - startPos = styler.LineStart(lineCurrent-1); - if (startPos == 0) initStyle = SCE_P_DEFAULT; - else initStyle = styler.StyleAt(startPos-1); - } + int lineCurrent = styler.GetLine(startPos); + if (lineCurrent > 0) + { + startPos = styler.LineStart(lineCurrent-1); + if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT; + else initStyle = styler.StyleAt(startPos-1); + } } styler.StartAt(startPos, 127); @@ -126,241 +127,216 @@ static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle, int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level"); char prevWord[200]; prevWord[0] = '\0'; - if (length == 0) return ; + if (length == 0) return; int state = initStyle & 31; int nextIndex = 0; - char chPrev = ' '; - //char chPrev2 = ' '; - char chNext = styler[startPos]; + char chPrev = ' '; + char chPrev2 = ' '; + char chNext = styler[startPos]; styler.StartSegment(startPos); bool atStartLine = true; int spaceFlags = 0; for (int i = startPos; i < lengthDoc; i++) - { + { - if (atStartLine) - { + if (atStartLine) + { char chBad = static_cast<char>(64); char chGood = static_cast<char>(0); char chFlags = chGood; if (whingeLevel == 1) { - chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood; + chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood; } else if (whingeLevel == 2) { - chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood; + chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood; } else if (whingeLevel == 3) { - chFlags = (spaceFlags & wsSpace) ? chBad : chGood; + chFlags = (spaceFlags & wsSpace) ? chBad : chGood; } else if (whingeLevel == 4) { - chFlags = (spaceFlags & wsTab) ? chBad : chGood; + chFlags = (spaceFlags & wsTab) ? chBad : chGood; } styler.SetFlags(chFlags, static_cast<char>(state)); atStartLine = false; } - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); - if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) - { - if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) - { - styler.ColourTo(i, state); - } - atStartLine = true; - } + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) + { + if ((state == SCE_SCRIPTOL_DEFAULT) || + (state == SCE_SCRIPTOL_TRIPLE) || + (state == SCE_SCRIPTOL_COMMENTBLOCK)) + { + styler.ColourTo(i, state); + } + atStartLine = true; + } - if (styler.IsLeadByte(ch)) - { - chNext = styler.SafeGetCharAt(i + 2); - chPrev = ' '; - //chPrev2 = ' '; - i += 1; - continue; - } + if (styler.IsLeadByte(ch)) + { + chNext = styler.SafeGetCharAt(i + 2); + chPrev = ' '; + chPrev2 = ' '; + i += 1; + continue; + } - if (state == SCE_P_STRINGEOL) - { - if (ch != '\r' && ch != '\n') + if (state == SCE_SCRIPTOL_STRINGEOL) + { + if (ch != '\r' && ch != '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; + styler.ColourTo(i - 1, state); + state = SCE_SCRIPTOL_DEFAULT; } - } + } - if (state == SCE_P_DEFAULT) - { - if (IsSolWordStart(ch, chNext)) + if (state == SCE_SCRIPTOL_DEFAULT) + { + if (IsSolWordStart(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_P_WORD; + styler.ColourTo(i - 1, state); + state = SCE_SCRIPTOL_KEYWORD; } else if (ch == '`') { - styler.ColourTo(i - 1, state); - state = SCE_P_COMMENTLINE; + styler.ColourTo(i - 1, state); + state = SCE_SCRIPTOL_COMMENTLINE; } else if (ch == '/') { - styler.ColourTo(i - 1, state); - if(chNext == '/') state = SCE_P_COMMENTLINE; - if(chNext == '*') state = SCE_P_COMMENTBLOCK; + styler.ColourTo(i - 1, state); + if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE; + if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK; } - else if (ch == '=' && chNext == 'b') - { - // =begin indicates the start of a comment (doc) block - if(styler.SafeGetCharAt(i + 2) == 'e' && styler.SafeGetCharAt(i + 3) == 'g' && styler.SafeGetCharAt(i + 4) == 'i' && styler.SafeGetCharAt(i + 5) == 'n') - { - styler.ColourTo(i - 1, state); - state = SCE_P_TRIPLEDOUBLE; //SCE_C_COMMENT; - } - } - else if (IsSolStringStart(ch, chNext)) + else if (IsSolStringStart(ch)) { styler.ColourTo(i - 1, state); state = GetSolStringState(styler, i, &nextIndex); + if(state == SCE_SCRIPTOL_STRING) + { + stringType = ch; + } if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - //chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); + i = nextIndex - 1; + ch = ' '; + chPrev = ' '; + chNext = styler.SafeGetCharAt(i + 1); } - } + } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_P_OPERATOR); - } + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR); + } } - else if (state == SCE_P_WORD) + else if (state == SCE_SCRIPTOL_KEYWORD) { if (!iswordchar(ch)) { ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord); - state = SCE_P_DEFAULT; + state = SCE_SCRIPTOL_DEFAULT; if (ch == '`') { - state = chNext == '`' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; + state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE; } - else if (IsSolStringStart(ch, chNext)) + else if (IsSolStringStart(ch)) { styler.ColourTo(i - 1, state); state = GetSolStringState(styler, i, &nextIndex); - if (nextIndex != i + 1) + if (nextIndex != i + 1) { - i = nextIndex - 1; - ch = ' '; - //chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } + i = nextIndex - 1; + ch = ' '; + chPrev = ' '; + chNext = styler.SafeGetCharAt(i + 1); + } } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_P_OPERATOR); + styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR); } } } else { - if (state == SCE_P_COMMENTLINE) + if (state == SCE_SCRIPTOL_COMMENTLINE || + state == SCE_SCRIPTOL_PERSISTENT || + state == SCE_SCRIPTOL_CSTYLE) { - if (ch == '\r' || ch == '\n') + if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_P_DEFAULT; + styler.ColourTo(i - 1, state); + state = SCE_SCRIPTOL_DEFAULT; } } - else if(state == SCE_P_COMMENTBLOCK) + else if(state == SCE_SCRIPTOL_COMMENTBLOCK) { - if(ch == '*' && chNext == '/') state = SCE_P_DEFAULT; + if(chPrev == '*' && ch == '/') + { + styler.ColourTo(i, state); + state = SCE_SCRIPTOL_DEFAULT; + } } - else if (state == SCE_P_STRING) + else if ((state == SCE_SCRIPTOL_STRING) || + (state == SCE_SCRIPTOL_CHARACTER)) { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) + if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; - } + styler.ColourTo(i - 1, state); + state = SCE_SCRIPTOL_STRINGEOL; + } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); } - } - else if (ch == '\"') - { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } - else if (state == SCE_P_CHARACTER) - { - if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) - { - styler.ColourTo(i - 1, state); - state = SCE_P_STRINGEOL; } - else if (ch == '\\') - { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') - { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } - else if (ch == '\'') + else if ((ch == '\"') || (ch == '\'')) { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } - /* - else if (state == SCE_P_TRIPLE) + // must match the entered quote type + if(ch == stringType) + { + styler.ColourTo(i, state); + state = SCE_SCRIPTOL_DEFAULT; + } + } + } + else if (state == SCE_SCRIPTOL_TRIPLE) { - if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') + if ((ch == '\'' && chPrev == '\'' && chPrev2 == '\'') || + (ch == '\"' && chPrev == '\"' && chPrev2 == '\"')) { styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } - } - else if (state == SCE_P_TRIPLEDOUBLE) - { - // =end terminates the comment block - if (ch == 'd' && chPrev == 'n' && chPrev2 == 'e') - { - if (styler.SafeGetCharAt(i - 3) == '=') - { - styler.ColourTo(i, state); - state = SCE_P_DEFAULT; - } + state = SCE_SCRIPTOL_DEFAULT; } - } - */ - } - //chPrev2 = chPrev; - chPrev = ch; + } + + } + chPrev2 = chPrev; + chPrev = ch; } - if (state == SCE_P_WORD) - { - ClassifyWordSol(styler.GetStartSegment(), lengthDoc-1, keywords, styler, prevWord); + if (state == SCE_SCRIPTOL_KEYWORD) + { + ClassifyWordSol(styler.GetStartSegment(), + lengthDoc-1, keywords, styler, prevWord); } - else - { - styler.ColourTo(lengthDoc-1, state); + else + { + styler.ColourTo(lengthDoc-1, state); } } @@ -369,57 +345,58 @@ static void FoldSolDoc(unsigned int startPos, int length, int initStyle, { int lengthDoc = startPos + length; - // Backtrack to previous line in case need to fix its fold status int lineCurrent = styler.GetLine(startPos); - if (startPos > 0) { - if (lineCurrent > 0) + if (startPos > 0) { - lineCurrent--; - startPos = styler.LineStart(lineCurrent); - if (startPos == 0) - initStyle = SCE_P_DEFAULT; - else - initStyle = styler.StyleAt(startPos-1); - } + if (lineCurrent > 0) + { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + if (startPos == 0) + initStyle = SCE_SCRIPTOL_DEFAULT; + else + initStyle = styler.StyleAt(startPos-1); + } } int state = initStyle & 31; int spaceFlags = 0; int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment); - if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) - indentCurrent |= SC_FOLDLEVELWHITEFLAG; + if ((state == SCE_SCRIPTOL_TRIPLE)) + indentCurrent |= SC_FOLDLEVELWHITEFLAG; char chNext = styler[startPos]; for (int i = startPos; i < lengthDoc; i++) - { + { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); int style = styler.StyleAt(i) & 31; if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) - { - int lev = indentCurrent; - int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment); - if ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE)) - indentNext |= SC_FOLDLEVELWHITEFLAG; - if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) - { - // Only non whitespace lines can be headers - if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) - { - lev |= SC_FOLDLEVELHEADERFLAG; - } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { - // Line after is blank so check the next - maybe should continue further? - int spaceFlags2 = 0; - int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment); - if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) + int lev = indentCurrent; + int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment); + if (style == SCE_SCRIPTOL_TRIPLE) + indentNext |= SC_FOLDLEVELWHITEFLAG; + if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { - lev |= SC_FOLDLEVELHEADERFLAG; - } - } - } - indentCurrent = indentNext; - styler.SetLevel(lineCurrent, lev); - lineCurrent++; + // Only non whitespace lines can be headers + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) + { + lev |= SC_FOLDLEVELHEADERFLAG; + } + else if (indentNext & SC_FOLDLEVELWHITEFLAG) + { + // Line after is blank so check the next - maybe should continue further? + int spaceFlags2 = 0; + int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment); + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) + { + lev |= SC_FOLDLEVELHEADERFLAG; + } + } + } + indentCurrent = indentNext; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; } } } |