brack
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Всем доброго времени суток, помогите новичку: нужена подсветка и api для typoscript пробовал те подсветки что уже в проге но ни одна не подошла, решил написать свой лексер. основная часть лексера списана с LexConf.cxx свой лексер назвал LexTS.cxx вот собственно код нового лексера: Цитата: #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdio.h> #include <stdarg.h> #include "Platform.h" #include "PropSet.h" #include "Accessor.h" #include "KeyWords.h" #include "Scintilla.h" #include "SciLexer.h" #ifdef SCI_NAMESPACE using namespace Scintilla; #endif static void ColouriseTSDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) { int state = SCE_TS_DEFAULT; char chNext = styler[startPos]; int lengthDoc = startPos+length; // create a buffer large enough to take the largest chunk... char *buffer = new char[length]; int bufferCount = 0; // this assumes that we have 10 keyword list in typoscript.properties WordList &keywords = *keywordLists[0]; WordList &tlo = *keywordLists[1]; WordList &objects = *keywordLists[2]; WordList &stdwrap = *keywordLists[3]; WordList &imgResource = *keywordLists[4]; WordList &imageLinkWrap = *keywordLists[5]; WordList &textStyle = *keywordLists[6]; WordList &encapseLines = *keywordLists[7]; WordList &filelink = *keywordLists[8]; WordList &conditionkeywords = *keywordLists[9]; // go through all provided text segment // using the hand-written state machine shown below styler.StartAt(startPos); styler.StartSegment(startPos); for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); switch(state) { case SCE_TS_DEFAULT: if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { // whitespace is simply ignored here... styler.ColourTo(i,SCE_TS_DEFAULT); break; } else if( ch == '#' || ch == '/' ) { // signals the start of a comment... state = SCE_TS_COMMENT; styler.ColourTo(i,SCE_TS_COMMENT); } else if( ispunct(ch) ) { // stay in TS_OPERATOR state until we find a non-alphanumeric if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) { buffer[bufferCount++] = static_cast<char>(tolower(ch)); } else { state = SCE_TS_DEFAULT; buffer[bufferCount] = '\0'; // check if the buffer contains a keyword, and highlight it if it is a keyword... if(keywords.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_KEYWORDS ); } else if(tlo.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_TLO ); } else if(objects.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_OBJECTS ); } else if(stdwrap.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_STDWRAP ); } else if(imgResource.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_IMGRESOURCE ); } else if(imageLinkWrap.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_IMAGELINKWRAP ); } else if(textStyle.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_TEXTSTYLE ); } else if(encapseLines.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_ENCAPSELINES ); } else if(filelink.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_FILELINK ); } else if(conditionkeywords.InList(buffer)) { styler.ColourTo(i-1,SCE_TS_CONDITIONKEYWORDS ); } else { styler.ColourTo(i-1,SCE_TS_DEFAULT); } // push back the faulty character chNext = styler[i--]; } } else if( isdigit(ch) ) { // signals the start of a number bufferCount = 0; buffer[bufferCount++] = ch; //styler.ColourTo(i,SCE_TS_NUMBER); state = SCE_TS_NUMBER; } else { // style it the default style.. styler.ColourTo(i,SCE_TS_DEFAULT); } break; case SCE_TS_COMMENT: // if we find a newline here, // we simply go to default state // else continue to work on it... if( ch == '\n' || ch == '\r' ) { state = SCE_TS_DEFAULT; } else { styler.ColourTo(i,SCE_TS_COMMENT); } break; case SCE_TS_NUMBER: // stay in TS_NUMBER state until we find a non-numeric if( isdigit(ch) || ch == '.') { buffer[bufferCount++] = ch; } else { state = SCE_TS_DEFAULT; buffer[bufferCount] = '\0'; // Colourize here... if( strchr(buffer,'.') ) { // it is an IP address... styler.ColourTo(i-1,SCE_TS_IP); } else { // normal number styler.ColourTo(i-1,SCE_TS_NUMBER); } // push back a character chNext = styler[i--]; } break; } } delete []buffer; } static const char * const tsWordListDesc[] = { "Keywords", "Tlo", "Objects", "Stdwrap", "ImgResource", "ImageLinkWrap", "TextStyle", "EncapseLines", "Filelink", "Conditionkeywords", 0 }; LexerModule lmTS(SCLEX_TS, ColouriseTSDoc, "TS", 0, tsWordListDesc); | Следуя рецомендациям здесь: http://scintilla.sourceforge.net/SciTELexer.html прописал лексер везде где надо, создал для него typoscript.properties и подключил в SciTEGlobal.properties соответсвующий фильтр, language menu и тд ... а включаешь... не работает. Бьюсь над этой темой уже больше недели, чего только не перепробовал, какие только лексеры не пробовал клонировать и корректировать... Может кто посмотрит и посоветует где копать? |