Всем доброго времени суток,
помогите новичку: нужена подсветка и api для typoscript пробовал те подсветки что уже в проге но ни одна не подошла, решил написать свой лексер. основная часть лексера списана с LexConf.cxx свой лексер назвал LexTS.cxx вот собственно код нового лексера:
Цитата:
Следуя рецомендациям здесь: http://scintilla.sourceforge.net/SciTELexer.html прописал лексер везде где надо, создал для него typoscript.properties и подключил в SciTEGlobal.properties соответсвующий фильтр, language menu и тд ... а включаешь... не работает. Бьюсь над этой темой уже больше недели, чего только не перепробовал, какие только лексеры не пробовал клонировать и корректировать...
Может кто посмотрит и посоветует где копать?
помогите новичку: нужена подсветка и 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 и тд ... а включаешь... не работает. Бьюсь над этой темой уже больше недели, чего только не перепробовал, какие только лексеры не пробовал клонировать и корректировать...
Может кто посмотрит и посоветует где копать?