diff options
-rw-r--r-- | include/Scintilla.h | 1 | ||||
-rw-r--r-- | include/Scintilla.iface | 3 | ||||
-rw-r--r-- | src/CellBuffer.cxx | 9 | ||||
-rw-r--r-- | src/CellBuffer.h | 2 | ||||
-rw-r--r-- | src/ContractionState.cxx | 6 | ||||
-rw-r--r-- | src/ContractionState.h | 4 | ||||
-rw-r--r-- | src/Document.h | 1 | ||||
-rw-r--r-- | src/Editor.cxx | 13 | ||||
-rw-r--r-- | src/Editor.h | 1 | ||||
-rw-r--r-- | src/LexHTML.cxx | 882 |
10 files changed, 262 insertions, 660 deletions
diff --git a/include/Scintilla.h b/include/Scintilla.h index 34c1f75b3..d79441309 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -33,6 +33,7 @@ void Scintilla_RegisterClasses(HINSTANCE hInstance); #define SCI_ADDSTYLEDTEXT SCI_START + 2 #define SCI_INSERTTEXT SCI_START + 3 #define SCI_CLEARALL SCI_START + 4 +#define SCI_CLEARDOCUMENTSTYLE SCI_START + 5 #define SCI_GETLENGTH SCI_START + 6 #define SCI_GETCHARAT SCI_START + 7 #define SCI_GETCURRENTPOS SCI_START + 8 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 4d53f35b5..824477c98 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -63,6 +63,9 @@ fun void InsertText=2003(position pos, string text) # Delete all text in the document fun void ClearAll=2004(,) +# Set all style bytes to 0, remove all folding information +fun void ClearDocumentStyle=2005(,) + # The number of characters in the document get int GetLength=2006(,) diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx index 130b289e6..68bcde2ed 100644 --- a/src/CellBuffer.cxx +++ b/src/CellBuffer.cxx @@ -186,6 +186,12 @@ void LineVector::ExpandLevels(int sizeNew) { } } +void LineVector::ClearLevels() { + delete []levels; + levels = 0; + sizeLevels = 0; +} + void LineVector::InsertValue(int pos, int value) { //Platform::DebugPrintf("InsertValue[%d] = %d\n", pos, value); if ((lines + 2) >= size) { @@ -1070,3 +1076,6 @@ int CellBuffer::GetLevel(int line) { } } +void CellBuffer::ClearLevels() { + lv.ClearLevels(); +} diff --git a/src/CellBuffer.h b/src/CellBuffer.h index acac9fa2f..4a1ecb398 100644 --- a/src/CellBuffer.h +++ b/src/CellBuffer.h @@ -58,6 +58,7 @@ public: void Expand(int sizeNew); void ExpandLevels(int sizeNew=-1); + void ClearLevels(); void InsertValue(int pos, int value); void SetValue(int pos, int value); void Remove(int pos); @@ -220,6 +221,7 @@ public: int SetLevel(int line, int level); int GetLevel(int line); + void ClearLevels(); }; #define CELL_SIZE 2 diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx index 0b987b81b..0558b4c36 100644 --- a/src/ContractionState.cxx +++ b/src/ContractionState.cxx @@ -200,3 +200,9 @@ bool ContractionState::SetExpanded(int lineDoc, bool expanded) { } return false; } + +void ContractionState::ShowAll() { + delete []lines; + lines = 0; + size = 0; +} diff --git a/src/ContractionState.h b/src/ContractionState.h index 9e17a7693..2c344efee 100644 --- a/src/ContractionState.h +++ b/src/ContractionState.h @@ -42,9 +42,11 @@ public: bool GetVisible(int lineDoc) const; bool SetVisible(int lineDocStart, int lineDocEnd, bool visible); - + bool GetExpanded(int lineDoc) const; bool SetExpanded(int lineDoc, bool expanded); + + void ShowAll(); }; #endif diff --git a/src/Document.h b/src/Document.h index b8f24ebe1..524cce605 100644 --- a/src/Document.h +++ b/src/Document.h @@ -156,6 +156,7 @@ public: int SetLevel(int line, int level); int GetLevel(int line) { return cb.GetLevel(line); } + void ClearLevels() { cb.ClearLevels(); } int GetLastChild(int lineParent, int level=-1); int GetFoldParent(int line); diff --git a/src/Editor.cxx b/src/Editor.cxx index e7e415c7b..118bc42d2 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1502,6 +1502,13 @@ void Editor::ClearAll() { SetVerticalScrollPos(); } +void Editor::ClearDocumentStyle() { + pdoc->StartStyling(0, '\377'); + pdoc->SetStyleFor(pdoc->Length(), 0); + cs.ShowAll(); + pdoc->ClearLevels(); +} + void Editor::Cut() { Copy(); ClearSelection(); @@ -3347,7 +3354,11 @@ LRESULT Editor::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) { ClearAll(); return 0; - case SCI_SETUNDOCOLLECTION: + case SCI_CLEARDOCUMENTSTYLE: + ClearDocumentStyle(); + return 0; + + case SCI_SETUNDOCOLLECTION: pdoc->SetUndoCollection(wParam); return 0; diff --git a/src/Editor.h b/src/Editor.h index fb5ac9d8b..6297c5de7 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -209,6 +209,7 @@ protected: // ScintillaBase subclass needs access to much of Editor virtual void AddCharUTF(char *s, unsigned int len); void ClearSelection(); void ClearAll(); + void ClearDocumentStyle(); void Cut(); void PasteRectangular(int pos, const char *ptr, int len); virtual void Copy() = 0; diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index 506f9a491..26b9111b7 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -3,11 +3,11 @@ // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> // The License.txt file describes the conditions under which this software may be distributed. -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <stdio.h> -#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <stdarg.h> #include "Platform.h" @@ -17,7 +17,13 @@ #include "Scintilla.h" #include "SciLexer.h" +#define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START) +#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START) +#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START) + enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML }; +enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc }; + static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) { char s[30 + 1]; s[0] = '\0'; @@ -57,6 +63,23 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u return iResult; } +static int statePrintForState(int state, int inScriptType) +{ + int StateToPrint; + + if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_PYTHON); + } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_VBS); + } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript)?0:SCE_HA_JS); + } else { + StateToPrint = state; + } + + return StateToPrint; +} + static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') || (styler[start] == '-') || (styler[start] == '#'); @@ -114,7 +137,7 @@ static int classifyTagHTML(unsigned int start, unsigned int end, } static void classifyWordHTJS(unsigned int start, unsigned int end, - WordList &keywords, Accessor &styler) { + WordList &keywords, Accessor &styler, int inScriptType) { char chAttr = SCE_HJ_WORD; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); if (wordIsNumber) @@ -128,28 +151,10 @@ static void classifyWordHTJS(unsigned int start, unsigned int end, if (keywords.InList(s)) chAttr = SCE_HJ_KEYWORD; } - styler.ColourTo(end, chAttr); + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); } -static void classifyWordHTJSA(unsigned int start, unsigned int end, - WordList &keywords, Accessor &styler) { - char chAttr = SCE_HJA_WORD; - bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); - if (wordIsNumber) - chAttr = SCE_HJA_NUMBER; - else { - char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { - s[i] = styler[start + i]; - s[i + 1] = '\0'; - } - if (keywords.InList(s)) - chAttr = SCE_HJA_KEYWORD; - } - styler.ColourTo(end, chAttr); -} - -static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { +static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, int inScriptType) { char chAttr = SCE_HB_IDENTIFIER; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); if (wordIsNumber) @@ -166,38 +171,14 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw chAttr = SCE_HB_COMMENTLINE; } } - styler.ColourTo(end, chAttr); + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); if (chAttr == SCE_HB_COMMENTLINE) return SCE_HB_COMMENTLINE; else return SCE_HB_DEFAULT; } -static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { - char chAttr = SCE_HBA_IDENTIFIER; - bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); - if (wordIsNumber) - chAttr = SCE_HBA_NUMBER; - else { - char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { - s[i] = static_cast<char>(tolower(styler[start + i])); - s[i + 1] = '\0'; - } - if (keywords.InList(s)) { - chAttr = SCE_HBA_WORD; - if (strcmp(s, "rem") == 0) - chAttr = SCE_HBA_COMMENTLINE; - } - } - styler.ColourTo(end, chAttr); - if (chAttr == SCE_HBA_COMMENTLINE) - return SCE_HBA_COMMENTLINE; - else - return SCE_HBA_DEFAULT; -} - -static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { +static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) { bool wordIsNumber = isdigit(styler[start]); char s[30 + 1]; for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -213,33 +194,13 @@ static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &key chAttr = SCE_HP_NUMBER; else if (keywords.InList(s)) chAttr = SCE_HP_WORD; - styler.ColourTo(end, chAttr); - strcpy(prevWord, s); -} - -static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) { - bool wordIsNumber = isdigit(styler[start]); - char s[30 + 1]; - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { - s[i] = styler[start + i]; - s[i + 1] = '\0'; - } - char chAttr = SCE_HPA_IDENTIFIER; - if (0 == strcmp(prevWord, "class")) - chAttr = SCE_HPA_CLASSNAME; - else if (0 == strcmp(prevWord, "def")) - chAttr = SCE_HPA_DEFNAME; - else if (wordIsNumber) - chAttr = SCE_HPA_NUMBER; - else if (keywords.InList(s)) - chAttr = SCE_HPA_WORD; - styler.ColourTo(end, chAttr); + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); strcpy(prevWord, s); } // Update the word colour to default or keyword // Called when in a PHP word -static void classifyWordHTPHPA(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { +static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { char chAttr = SCE_HPHP_DEFAULT; bool wordIsNumber = isdigit(styler[start]); if (wordIsNumber) @@ -257,25 +218,26 @@ static void classifyWordHTPHPA(unsigned int start, unsigned int end, WordList &k } // Return the first state to reach when entering a scripting language -static int StateForScript(int scriptLanguage, int inScriptTag) { +static int StateForScript(int scriptLanguage) { + int Result; switch (scriptLanguage) { case eScriptVBS: - if (inScriptTag) - return SCE_HB_START; - else - return SCE_HBA_START; + Result = SCE_HB_START; + break; case eScriptPython: - if (inScriptTag) - return SCE_HP_START; - else - return SCE_HPA_START; + Result = SCE_HP_START; + break; case eScriptPHP: - return SCE_HPHP_DEFAULT; + Result = SCE_HPHP_DEFAULT; + break; case eScriptXML: - return SCE_H_TAGUNKNOWN; + Result = SCE_H_TAGUNKNOWN; + break; default : - return SCE_HJ_START; + Result = SCE_HJ_START; + break; } + return Result; } inline bool ishtmlwordchar(char ch) { @@ -305,11 +267,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty // Lexer for HTML requires more lexical states (7 bits worth) than most lexers styler.StartAt(startPos, 127); - bool lastTagWasScript = false; char prevWord[200]; prevWord[0] = '\0'; int scriptLanguage = eScriptJS; int state = initStyle; + int StateToPrint = state; // If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen if (InTagState(state)) { @@ -324,10 +286,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty int lineCurrent = styler.GetLine(startPos); if (lineCurrent > 0) lineState = styler.GetLineState(lineCurrent); - int beforeNonHTML = (lineState & 0x01) >> 0; - int inNonHTML = (lineState & 0x02) >> 1; - int inScriptTag = (lineState & 0x04) >> 2; - int defaultScript = (lineState & 0xF0) >> 4; + int inScriptType = (lineState >> 0) & 0x03; // 2 bits + int defaultScript = (lineState >> 4) & 0x0F; // 4 bits + int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits + + bool fold = styler.GetPropertyInt("fold"); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + int visChars = 0; char chPrev = ' '; char chPrev2 = ' '; @@ -338,6 +304,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty char chNext = styler.SafeGetCharAt(i + 1); char chNext2 = styler.SafeGetCharAt(i + 2); + // decide what is the current state to print (depending of the script tag) + StateToPrint = statePrintForState(state,inScriptType); + + if (fold && !isspace(ch)) + visChars++; + // Handle DBCS codepages if (styler.IsLeadByte(ch)) { chPrev2 = ' '; @@ -348,44 +320,47 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { // New line -> record any line state onto /next/ line + if (fold) { + int lev = levelPrev; + if (visChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + styler.SetLevel(lineCurrent, lev); + visChars = 0; + levelPrev = levelCurrent; + } lineCurrent++; styler.SetLineState(lineCurrent, - (beforeNonHTML & 0x01) | ((inNonHTML & 0x01) << 1) | ((inScriptTag & 0x01) << 2) | ((defaultScript & 0x0F) << 4)); + ((inScriptType & 0x03) << 0) | + ((defaultScript & 0x0F) << 4) | + ((beforePreProc & 0xFF) << 8)); } - if (inScriptTag && (ch == '<') && (chNext == '/')) { + if (fold && (ch == '{') || (ch == '}')) { + levelCurrent += (ch == '{') ? 1 : -1; + } + + // generic end of script processing + if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) { // Check if it's the end of the script tag (or any other HTML tag) switch (state) { // in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!) case SCE_H_DOUBLESTRING: case SCE_H_SINGLESTRING: - case SCE_HJ_COMMENTLINE: case SCE_HJ_DOUBLESTRING: case SCE_HJ_SINGLESTRING: - case SCE_HJA_COMMENTLINE: - case SCE_HJA_DOUBLESTRING: - case SCE_HJA_SINGLESTRING: - case SCE_HB_COMMENTLINE: case SCE_HB_STRING: - case SCE_HBA_COMMENTLINE: - case SCE_HBA_STRING: - case SCE_HP_COMMENTLINE: case SCE_HP_STRING: case SCE_HP_TRIPLE: case SCE_HP_TRIPLEDOUBLE: - case SCE_HPA_COMMENTLINE: - case SCE_HPA_STRING: - case SCE_HPA_TRIPLE: - case SCE_HPA_TRIPLEDOUBLE: break; default : // maybe we should check here if it's a tag and if it's SCRIPT - - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_H_TAGUNKNOWN; - inNonHTML = 0; - inScriptTag = 0; - i++; + inScriptType = eHtml; + i+=2; continue; break; } @@ -394,22 +369,32 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty ///////////////////////////////////// // handle the start of PHP pre-processor = Non-HTML if ((ch == '<') && (chNext == '?')) { - styler.ColourTo(i - 1, state); - beforeNonHTML = state; - scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i + 10, eScriptPHP); - i += 1 + PrintScriptingIndicatorOffset(styler, i + 2, i + 10); + styler.ColourTo(i - 1, StateToPrint); + beforePreProc = state; + scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP); + i++; + i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 10); if (scriptLanguage == eScriptXML) styler.ColourTo(i, SCE_H_XMLSTART); else styler.ColourTo(i, SCE_H_QUESTION); - state = StateForScript(scriptLanguage, inScriptTag); - inNonHTML = 1; + state = StateForScript(scriptLanguage); + if (inScriptType == eNonHtmlScript) + inScriptType = eNonHtmlScriptPreProc; + else + inScriptType = eNonHtmlPreProc; continue; } + // handle the start of ASP pre-processor = Non-HTML if ((ch == '<') && (chNext == '%')) { - styler.ColourTo(i - 1, state); - beforeNonHTML = state; + styler.ColourTo(i - 1, StateToPrint); + beforePreProc = state; + if (inScriptType == eNonHtmlScript) + inScriptType = eNonHtmlScriptPreProc; + else + inScriptType = eNonHtmlPreProc; + if (chNext2 == '@') { i += 2; // place as if it was the second next char treated state = SCE_H_ASPAT; @@ -421,92 +406,47 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty i++; // place as if it was the next char treated } - state = StateForScript(defaultScript, inScriptTag); + state = StateForScript(defaultScript); } styler.ColourTo(i, SCE_H_ASP); - inNonHTML = 1; - inScriptTag = 0; continue; } - ///////////////////////////////////// - ///////////////////////////////////// - // handle of end of a pre-processor = Non-HTML - /* this code is probably un-used (kept for safety) - if (inNonHTML && inScriptTag && (ch == '<') && (chNext == '/')) { - // Bounce out of any ASP mode - switch (state) - { - case SCE_HJA_WORD: - classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); - break; - case SCE_HBA_WORD: - classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); - break; - case SCE_HPA_WORD: - classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); - break; - case SCE_HPHP_WORD: - classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); - break; - default : - styler.ColourTo(i - 1, state); - break; - } - if ((ch == '<') && (chNext == '/')) { - state = SCE_H_TAGUNKNOWN; - } else { - i++; - if (ch == '%') - styler.ColourTo(i, SCE_H_ASP); - else - // styler.ColourTo(i, SCE_H_XMLEND); - styler.ColourTo(i, SCE_HPHP_); - state = beforeNonHTML; - } - beforeNonHTML = SCE_H_DEFAULT; - inNonHTML = 0; - inScriptTag = 0; - continue; - } - */ + // handle the end of a pre-processor = Non-HTML - if (inNonHTML && ((ch == '?') || (ch == '%')) && (chNext == '>')) { + if (((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && ((ch == '?') || (ch == '%')) && (chNext == '>')) { if (state == SCE_H_ASPAT) { defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, defaultScript); } // Bounce out of any ASP mode switch (state) { - case SCE_HJA_WORD: - classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); + case SCE_HJ_WORD: + classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType); break; - case SCE_HBA_WORD: - classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); + case SCE_HB_WORD: + classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType); break; - case SCE_HPA_WORD: - classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); + case SCE_HP_WORD: + classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType); break; case SCE_HPHP_WORD: - classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); + classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler); break; default : - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); break; } - if ((ch == '<') && (chNext == '/')) { - state = SCE_H_TAGUNKNOWN; - } else { - i++; - if (ch == '%') - styler.ColourTo(i, SCE_H_ASP); - else if (scriptLanguage == eScriptXML) - styler.ColourTo(i, SCE_H_XMLEND); - else - styler.ColourTo(i, SCE_H_QUESTION); - state = beforeNonHTML; - } - beforeNonHTML = SCE_H_DEFAULT; - inNonHTML = 0; - inScriptTag = 0; + i++; + if (ch == '%') + styler.ColourTo(i, SCE_H_ASP); + else if (scriptLanguage == eScriptXML) + styler.ColourTo(i, SCE_H_XMLEND); + else + styler.ColourTo(i, SCE_H_QUESTION); + state = beforePreProc; + if (inScriptType == eNonHtmlScriptPreProc) + inScriptType = eNonHtmlScript; + else + inScriptType = eHtml; continue; } ///////////////////////////////////// @@ -514,7 +454,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty switch (state) { case SCE_H_DEFAULT: if (ch == '<') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_H_TAGUNKNOWN; } else if (ch == '&') { styler.ColourTo(i - 1, SCE_H_DEFAULT); @@ -522,20 +462,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } break; case SCE_H_COMMENT: - if ((ch == '>') && (chPrev == '-')) { - styler.ColourTo(i, state); + if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) { + styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; } break; case SCE_H_CDATA: if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; } break; case SCE_H_ENTITY: if (ch == ';') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_H_DEFAULT; } if (ch != '#' && !isalnum(ch)) { // Should check that '#' follows '&', but it is unlikely anyway... @@ -546,16 +486,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_H_TAGUNKNOWN: if (!ishtmlwordchar(ch) && ch != '/' && ch != '-' && ch != '[') { int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler); - lastTagWasScript = eClass == SCE_H_SCRIPT; - if (lastTagWasScript) { - inScriptTag = 1; - scriptLanguage = eScriptJS; // default to javascript + if (eClass == SCE_H_SCRIPT) { + inScriptType = eNonHtmlScript; + scriptLanguage = defaultScript; eClass = SCE_H_TAG; } if ((ch == '>') && (eClass != SCE_H_COMMENT)) { styler.ColourTo(i, SCE_H_TAG); - if (lastTagWasScript) { - state = StateForScript(scriptLanguage, inScriptTag); + if (inScriptType == eNonHtmlScript) { + state = StateForScript(scriptLanguage); } else { state = SCE_H_DEFAULT; } @@ -572,14 +511,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_H_ATTRIBUTE: if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') { - if (lastTagWasScript) { + if (inScriptType == eNonHtmlScript) { scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage); } classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler); if (ch == '>') { styler.ColourTo(i, SCE_H_TAG); - if (lastTagWasScript) { - state = StateForScript(scriptLanguage, inScriptTag); + if (inScriptType == eNonHtmlScript) { + state = StateForScript(scriptLanguage); } else { state = SCE_H_DEFAULT; } @@ -590,39 +529,39 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_H_OTHER: if (ch == '>') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); styler.ColourTo(i, SCE_H_TAG); - if (lastTagWasScript) { - state = StateForScript(scriptLanguage, inScriptTag); + if (inScriptType == eNonHtmlScript) { + state = StateForScript(scriptLanguage); } else { state = SCE_H_DEFAULT; } } else if (ch == '\"') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_H_DOUBLESTRING; } else if (ch == '\'') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_H_SINGLESTRING; } else if (ch == '/' && chNext == '>') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); styler.ColourTo(i + 1, SCE_H_TAGEND); i++; ch = chNext; state = SCE_H_DEFAULT; } else if (ch == '?' && chNext == '>') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); styler.ColourTo(i + 1, SCE_H_XMLEND); i++; ch = chNext; state = SCE_H_DEFAULT; } else if (ishtmlwordchar(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_H_ATTRIBUTE; } break; case SCE_H_DOUBLESTRING: if (ch == '\"') { - if (lastTagWasScript) { + if (inScriptType == eNonHtmlScript) { scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage); } styler.ColourTo(i, SCE_H_DOUBLESTRING); @@ -631,7 +570,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_H_SINGLESTRING: if (ch == '\'') { - if (lastTagWasScript) { + if (inScriptType == eNonHtmlScript) { scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i, scriptLanguage); } styler.ColourTo(i, SCE_H_SINGLESTRING); @@ -642,49 +581,45 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HJ_START: case SCE_HJ_SYMBOLS: if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_WORD; } else if (ch == '/' && chNext == '*') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); if (chNext2 == '*') state = SCE_HJ_COMMENTDOC; else state = SCE_HJ_COMMENT; } else if (ch == '/' && chNext == '/') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_COMMENTLINE; } else if (ch == '\"') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_DOUBLESTRING; } else if (ch == '\'') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_SINGLESTRING; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_COMMENTLINE; } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_COMMENTLINE; i += 2; } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_HJ_SYMBOLS); + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType)); state = SCE_HJ_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HJ_START) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_DEFAULT; } } break; case SCE_HJ_WORD: if (!iswordchar(ch)) { - classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler); + classifyWordHTJS(styler.GetStartSegment(), i - 1, keywords2, styler, inScriptType); //styler.ColourTo(i - 1, eHTJSKeyword); state = SCE_HJ_DEFAULT; if (ch == '/' && chNext == '*') { @@ -699,11 +634,11 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else if (ch == '\'') { state = SCE_HJ_SINGLESTRING; } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_COMMENTLINE; i += 2; } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HJ_SYMBOLS); + styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType)); state = SCE_HJ_DEFAULT; } } @@ -711,26 +646,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty case SCE_HJ_COMMENT: case SCE_HJ_COMMENTDOC: if (ch == '/' && chPrev == '*') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HJ_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i + 1, SCE_H_TAGEND); - i++; - ch = chNext; - state = SCE_H_DEFAULT; - inScriptTag = 0; } break; case SCE_HJ_COMMENTLINE: if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE); + styler.ColourTo(i - 1, statePrintForState(SCE_HJ_COMMENTLINE, inScriptType)); state = SCE_HJ_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - // Common to hide end script tag in comment - styler.ColourTo(i - 1, SCE_HJ_COMMENTLINE); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; } break; case SCE_HJ_DOUBLESTRING: @@ -739,12 +662,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty i++; } } else if (ch == '\"') { - styler.ColourTo(i, SCE_HJ_DOUBLESTRING); + styler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType)); state = SCE_HJ_DEFAULT; i++; ch = chNext; + } else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_HJ_COMMENTLINE; + i += 2; } else if (isLineEnd(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_STRINGEOL; } break; @@ -754,206 +681,64 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty i++; } } else if (ch == '\'') { - styler.ColourTo(i, SCE_HJ_SINGLESTRING); + styler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType)); state = SCE_HJ_DEFAULT; i++; ch = chNext; + } else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) { + styler.ColourTo(i - 1, StateToPrint); + state = SCE_HJ_COMMENTLINE; + i += 2; } else if (isLineEnd(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_STRINGEOL; } break; case SCE_HJ_STRINGEOL: if (!isLineEnd(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HJ_DEFAULT; } else if (!isLineEnd(chNext)) { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HJ_DEFAULT; } break; - case SCE_HJA_DEFAULT: - case SCE_HJA_START: - case SCE_HJA_SYMBOLS: - if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_WORD; - } else if (ch == '/' && chNext == '*') { - styler.ColourTo(i - 1, state); - if (chNext2 == '*') - state = SCE_HJA_COMMENTDOC; - else - state = SCE_HJA_COMMENT; - } else if (ch == '/' && chNext == '/') { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - } else if (ch == '\"') { - styler.ColourTo(i - 1, state); - state = SCE_HJA_DOUBLESTRING; - } else if (ch == '\'') { - styler.ColourTo(i - 1, state); - state = SCE_HJA_SINGLESTRING; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; - } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && - styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - i += 2; - } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_HJA_SYMBOLS); - state = SCE_HJA_DEFAULT; - } else if ((ch == ' ') || (ch == '\t')) { - if (state == SCE_HJA_START) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_DEFAULT; - } - } - break; - case SCE_HJA_WORD: - if (!iswordchar(ch)) { - classifyWordHTJSA(styler.GetStartSegment(), i - 1, keywords2, styler); - //styler.ColourTo(i - 1, eHTJSKeyword); - state = SCE_HJA_DEFAULT; - if (ch == '/' && chNext == '*') { - if (chNext2 == '*') - state = SCE_HJA_COMMENTDOC; - else - state = SCE_HJA_COMMENT; - } else if (ch == '/' && chNext == '/') { - state = SCE_HJA_COMMENTLINE; - } else if (ch == '\"') { - state = SCE_HJA_DOUBLESTRING; - } else if (ch == '\'') { - state = SCE_HJA_SINGLESTRING; - } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - i += 2; - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HJA_SYMBOLS); - state = SCE_HJA_DEFAULT; - } - } - break; - case SCE_HJA_COMMENT: - case SCE_HJA_COMMENTDOC: - if (ch == '/' && chPrev == '*') { - styler.ColourTo(i, state); - state = SCE_HJA_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i + 1, SCE_H_TAGEND); - i++; - ch = chNext; - state = SCE_H_DEFAULT; - inScriptTag = 0; - } - break; - case SCE_HJA_COMMENTLINE: - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE); - state = SCE_HJA_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - // Common to hide end script tag in comment - styler.ColourTo(i - 1, SCE_HJA_COMMENTLINE); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; - } - break; - case SCE_HJA_DOUBLESTRING: - if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - } - } else if (ch == '\"') { - styler.ColourTo(i, SCE_HJA_DOUBLESTRING); - state = SCE_HJA_DEFAULT; - i++; - ch = chNext; - } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - i += 2; - } else if (isLineEnd(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_STRINGEOL; - } - break; - case SCE_HJA_SINGLESTRING: - if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - } - } else if (ch == '\'') { - styler.ColourTo(i, SCE_HJA_SINGLESTRING); - state = SCE_HJA_DEFAULT; - i++; - ch = chNext; - } else if ((ch == '-') && (chNext == '-') && (chNext2 == '>')) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_COMMENTLINE; - i += 2; - } else if (isLineEnd(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_STRINGEOL; - } - break; - case SCE_HJA_STRINGEOL: - if (!isLineEnd(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HJA_DEFAULT; - } else if (!isLineEnd(chNext)) { - styler.ColourTo(i, state); - state = SCE_HJA_DEFAULT; - } - break; case SCE_HB_DEFAULT: case SCE_HB_START: if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_WORD; } else if (ch == '\'') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_COMMENTLINE; } else if (ch == '\"') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_STRING; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_COMMENTLINE; } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); styler.ColourTo(i, SCE_HB_DEFAULT); state = SCE_HB_DEFAULT; } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HB_START) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_DEFAULT; } } break; case SCE_HB_WORD: if (!iswordchar(ch)) { - state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler); + state = classifyWordHTVB(styler.GetStartSegment(), i - 1, keywords3, styler, inScriptType); if (state == SCE_HB_DEFAULT) { if (ch == '\"') { state = SCE_HB_STRING; } else if (ch == '\'') { state = SCE_HB_COMMENTLINE; } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HB_DEFAULT); + styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT,inScriptType)); state = SCE_HB_DEFAULT; } } @@ -961,129 +746,44 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_HB_STRING: if (ch == '\"') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HB_DEFAULT; i++; ch = chNext; } else if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_STRINGEOL; } break; case SCE_HB_COMMENTLINE: if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - // Common to hide end script tag in comment - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; } break; case SCE_HB_STRINGEOL: if (!isLineEnd(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HB_DEFAULT; } else if (!isLineEnd(chNext)) { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HB_DEFAULT; } break; - case SCE_HBA_DEFAULT: - case SCE_HBA_START: - if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HBA_WORD; - } else if (ch == '\'') { - styler.ColourTo(i - 1, state); - state = SCE_HBA_COMMENTLINE; - } else if (ch == '\"') { - styler.ColourTo(i - 1, state); - state = SCE_HBA_STRING; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; - } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && - styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); - state = SCE_HBA_COMMENTLINE; - } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_HBA_DEFAULT); - state = SCE_HBA_DEFAULT; - } else if ((ch == ' ') || (ch == '\t')) { - if (state == SCE_HBA_START) { - styler.ColourTo(i - 1, state); - state = SCE_HBA_DEFAULT; - } - } - break; - case SCE_HBA_WORD: - if (!iswordchar(ch)) { - state = classifyWordHTVBA(styler.GetStartSegment(), i - 1, keywords3, styler); - if (state == SCE_HBA_DEFAULT) { - if (ch == '\"') { - state = SCE_HBA_STRING; - } else if (ch == '\'') { - state = SCE_HBA_COMMENTLINE; - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HBA_DEFAULT); - state = SCE_HBA_DEFAULT; - } - } - } - break; - case SCE_HBA_STRING: - if (ch == '\"') { - styler.ColourTo(i, state); - state = SCE_HBA_DEFAULT; - i++; - ch = chNext; - } else if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_HBA_STRINGEOL; - } - break; - case SCE_HBA_COMMENTLINE: - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_HBA_DEFAULT; - } else if ((ch == '<') && (chNext == '/')) { - // Common to hide end script tag in comment - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; - } - break; - case SCE_HBA_STRINGEOL: - if (!isLineEnd(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HBA_DEFAULT; - } else if (!isLineEnd(chNext)) { - styler.ColourTo(i, state); - state = SCE_HBA_DEFAULT; - } - break; case SCE_HP_DEFAULT: case SCE_HP_START: if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HP_WORD; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HP_COMMENTLINE; } else if (ch == '#') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HP_COMMENTLINE; } else if (ch == '\"') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_HP_TRIPLEDOUBLE; @@ -1091,10 +791,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty chPrev = ' '; chNext = styler.SafeGetCharAt(i + 1); } else { - state = SCE_HP_STRING; + state = statePrintForState(SCE_HP_STRING,inScriptType); } } else if (ch == '\'') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_HP_TRIPLE; @@ -1105,18 +805,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HP_CHARACTER; } } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_HP_OPERATOR); + styler.ColourTo(i - 1, StateToPrint); + styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType)); } else if ((ch == ' ') || (ch == '\t')) { if (state == SCE_HP_START) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HP_DEFAULT; } } break; case SCE_HP_WORD: if (!iswordchar(ch)) { - classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); + classifyWordHTPy(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord, inScriptType); state = SCE_HP_DEFAULT; if (ch == '#') { state = SCE_HP_COMMENTLINE; @@ -1141,15 +841,15 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty state = SCE_HP_CHARACTER; } } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HP_OPERATOR); + styler.ColourTo(i, statePrintForState(SCE_HP_OPERATOR, inScriptType)); } } break; case SCE_HP_COMMENTLINE: if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HP_DEFAULT; - } + } break; case SCE_HP_STRING: if (ch == '\\') { @@ -1159,7 +859,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HP_DEFAULT; } break; @@ -1171,143 +871,22 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HP_DEFAULT; } break; case SCE_HP_TRIPLE: if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HP_DEFAULT; } break; case SCE_HP_TRIPLEDOUBLE: if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HP_DEFAULT; } break; - case SCE_HPA_DEFAULT: - case SCE_HPA_START: - if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_HPA_WORD; - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; - } else if ((ch == '<') && (chNext == '!') && (chNext2 == '-') && - styler.SafeGetCharAt(i + 3) == '-') { - styler.ColourTo(i - 1, state); - state = SCE_HPA_COMMENTLINE; - } else if (ch == '#') { - styler.ColourTo(i - 1, state); - state = SCE_HPA_COMMENTLINE; - } else if (ch == '\"') { - styler.ColourTo(i - 1, state); - if (chNext == '\"' && chNext2 == '\"') { - i += 2; - state = SCE_HPA_TRIPLEDOUBLE; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } else { - state = SCE_HPA_STRING; - } - } else if (ch == '\'') { - styler.ColourTo(i - 1, state); - if (chNext == '\'' && chNext2 == '\'') { - i += 2; - state = SCE_HPA_TRIPLE; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } else { - state = SCE_HPA_CHARACTER; - } - } else if (isoperator(ch)) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_HPA_OPERATOR); - } else if ((ch == ' ') || (ch == '\t')) { - if (state == SCE_HPA_START) { - styler.ColourTo(i - 1, state); - state = SCE_HPA_DEFAULT; - } - } - break; - case SCE_HPA_WORD: - if (!iswordchar(ch)) { - classifyWordHTPyA(styler.GetStartSegment(), i - 1, keywords4, styler, prevWord); - state = SCE_HPA_DEFAULT; - if (ch == '#') { - state = SCE_HPA_COMMENTLINE; - } else if (ch == '\"') { - if (chNext == '\"' && chNext2 == '\"') { - i += 2; - state = SCE_HPA_TRIPLEDOUBLE; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } else { - state = SCE_HPA_STRING; - } - } else if (ch == '\'') { - if (chNext == '\'' && chNext2 == '\'') { - i += 2; - state = SCE_HPA_TRIPLE; - ch = ' '; - chPrev = ' '; - chNext = styler.SafeGetCharAt(i + 1); - } else { - state = SCE_HPA_CHARACTER; - } - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HPA_OPERATOR); - } - } - break; - case SCE_HPA_COMMENTLINE: - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_HPA_DEFAULT; - } - break; - case SCE_HPA_STRING: - if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\"') { - styler.ColourTo(i, state); - state = SCE_HPA_DEFAULT; - } - break; - case SCE_HPA_CHARACTER: - if (ch == '\\') { - if (chNext == '\"' || chNext == '\'' || chNext == '\\') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } - } else if (ch == '\'') { - styler.ColourTo(i, state); - state = SCE_HPA_DEFAULT; - } - break; - case SCE_HPA_TRIPLE: - if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { - styler.ColourTo(i, state); - state = SCE_HPA_DEFAULT; - } - break; - case SCE_HPA_TRIPLEDOUBLE: - if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { - styler.ColourTo(i, state); - state = SCE_HPA_DEFAULT; - } - break; ///////////// start - PHP state handling case SCE_HPHP_WORD: if (!iswordchar(ch)) { @@ -1326,11 +905,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty } else { state = SCE_HPHP_DEFAULT; } - classifyWordHTPHPA(styler.GetStartSegment(), i - 1, keywords5, styler); - } else if ((ch == '<') && (chNext == '/')) { - styler.ColourTo(i - 1, state); - state = SCE_H_TAGUNKNOWN; - inScriptTag = 0; + classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler); } break; case SCE_HPHP_NUMBER: @@ -1347,13 +922,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty break; case SCE_HPHP_COMMENT: if (ch == '/' && chPrev == '*') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HPHP_DEFAULT; } break; case SCE_HPHP_COMMENTLINE: if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); state = SCE_HPHP_DEFAULT; } break; @@ -1365,7 +940,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HPHP_DEFAULT; } else if (chNext == '\r' || chNext == '\n') { styler.ColourTo(i - 1, SCE_HPHP_STRINGEOL); @@ -1383,14 +958,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { - styler.ColourTo(i, state); + styler.ColourTo(i, StateToPrint); state = SCE_HPHP_DEFAULT; } break; case SCE_HPHP_STRINGEOL: break; case SCE_HPHP_DEFAULT: - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, StateToPrint); if (isdigit(ch)) { state = SCE_HPHP_NUMBER; } else if (iswordstart(ch)) { @@ -1451,29 +1026,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty styler.ColourTo(i, SCE_HJ_SYMBOLS); } } - if (state == SCE_HJA_DEFAULT) { // One of the above succeeded - if (ch == '/' && chNext == '*') { - if (styler.SafeGetCharAt(i + 2) == '*') - state = SCE_HJA_COMMENTDOC; - else - state = SCE_HJA_COMMENT; - } else if (ch == '/' && chNext == '/') { - state = SCE_HJA_COMMENTLINE; - } else if (ch == '\"') { - state = SCE_HJA_DOUBLESTRING; - } else if (ch == '\'') { - state = SCE_HJA_SINGLESTRING; - } else if (iswordstart(ch)) { - state = SCE_HJA_WORD; - } else if (isoperator(ch)) { - styler.ColourTo(i, SCE_HJA_SYMBOLS); - } - } chPrev2 = chPrev; chPrev = ch; } - styler.ColourTo(lengthDoc - 1, state); + StateToPrint = statePrintForState(state,inScriptType); + styler.ColourTo(lengthDoc - 1, StateToPrint); + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + if (fold) { + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + //styler.SetLevel(lineCurrent, levelCurrent | flagsNext); + styler.SetLevel(lineCurrent, levelPrev | flagsNext); + + } } LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc); |