aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/LexScriptol.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/LexScriptol.cxx')
-rw-r--r--src/LexScriptol.cxx429
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++;
}
}
}