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++;  		}  	}  } | 
