diff options
| author | nyamatongwe <unknown> | 2010-07-13 21:16:48 +1000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2010-07-13 21:16:48 +1000 | 
| commit | fd7c21165bbc5200aa24ef89560a8bb40fd37255 (patch) | |
| tree | b5cdec307f1b412f0527eb826a14b806b58cf006 /src/LexTeX.cxx | |
| parent | d47313970ebf3736afffec781f2f9030fa3c8e1a (diff) | |
| download | scintilla-mirror-fd7c21165bbc5200aa24ef89560a8bb40fd37255.tar.gz | |
Moved lexers into lexers directory.
Diffstat (limited to 'src/LexTeX.cxx')
| -rw-r--r-- | src/LexTeX.cxx | 494 | 
1 files changed, 0 insertions, 494 deletions
| diff --git a/src/LexTeX.cxx b/src/LexTeX.cxx deleted file mode 100644 index 62ade1d75..000000000 --- a/src/LexTeX.cxx +++ /dev/null @@ -1,494 +0,0 @@ -// Scintilla source code edit control - -// File: LexTeX.cxx - general context conformant tex coloring scheme -// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com -// Version: September 28, 2003 - -// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org> -// The License.txt file describes the conditions under which this software may be distributed. - -// This lexer is derived from the one written for the texwork environment (1999++) which in -// turn is inspired on texedit (1991++) which finds its roots in wdt (1986). - -// If you run into strange boundary cases, just tell me and I'll look into it. - - -// TeX Folding code added by instanton (soft_share@126.com) with borrowed code from VisualTeX source by Alex Romanenko. -// Version: June 22, 2007 - -#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" -#include "StyleContext.h" - -#ifdef SCI_NAMESPACE -using namespace Scintilla; -#endif - -// val SCE_TEX_DEFAULT = 0 -// val SCE_TEX_SPECIAL = 1 -// val SCE_TEX_GROUP   = 2 -// val SCE_TEX_SYMBOL  = 3 -// val SCE_TEX_COMMAND = 4 -// val SCE_TEX_TEXT    = 5 - -// Definitions in SciTEGlobal.properties: -// -// TeX Highlighting -// -// # Default -// style.tex.0=fore:#7F7F00 -// # Special -// style.tex.1=fore:#007F7F -// # Group -// style.tex.2=fore:#880000 -// # Symbol -// style.tex.3=fore:#7F7F00 -// # Command -// style.tex.4=fore:#008800 -// # Text -// style.tex.5=fore:#000000 - -// lexer.tex.interface.default=0 -// lexer.tex.comment.process=0 - -// todo: lexer.tex.auto.if - -// Auxiliary functions: - -static inline bool endOfLine(Accessor &styler, unsigned int i) { -	return -      (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ; -} - -static inline bool isTeXzero(int ch) { -	return -      (ch == '%') ; -} - -static inline bool isTeXone(int ch) { -	return -      (ch == '[') || (ch == ']') || (ch == '=') || (ch == '#') || -      (ch == '(') || (ch == ')') || (ch == '<') || (ch == '>') || -      (ch == '"') ; -} - -static inline bool isTeXtwo(int ch) { -	return -      (ch == '{') || (ch == '}') || (ch == '$') ; -} - -static inline bool isTeXthree(int ch) { -	return -      (ch == '~') || (ch == '^') || (ch == '_') || (ch == '&') || -      (ch == '-') || (ch == '+') || (ch == '\"') || (ch == '`') || -      (ch == '/') || (ch == '|') || (ch == '%') ; -} - -static inline bool isTeXfour(int ch) { -	return -      (ch == '\\') ; -} - -static inline bool isTeXfive(int ch) { -	return -      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || -      (ch == '@') || (ch == '!') || (ch == '?') ; -} - -static inline bool isTeXsix(int ch) { -	return -      (ch == ' ') ; -} - -static inline bool isTeXseven(int ch) { -	return -      (ch == '^') ; -} - -// Interface determination - -static int CheckTeXInterface( -    unsigned int startPos, -    int length, -    Accessor &styler, -	int defaultInterface) { - -    char lineBuffer[1024] ; -	unsigned int linePos = 0 ; - -    // some day we can make something lexer.tex.mapping=(all,0)(nl,1)(en,2)... - -    if (styler.SafeGetCharAt(0) == '%') { -        for (unsigned int i = 0; i < startPos + length; i++) { -            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ; -            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { -                lineBuffer[linePos] = '\0'; -                if (strstr(lineBuffer, "interface=all")) { -                    return 0 ; -				} else if (strstr(lineBuffer, "interface=tex")) { -                    return 1 ; -                } else if (strstr(lineBuffer, "interface=nl")) { -                    return 2 ; -                } else if (strstr(lineBuffer, "interface=en")) { -                    return 3 ; -                } else if (strstr(lineBuffer, "interface=de")) { -                    return 4 ; -                } else if (strstr(lineBuffer, "interface=cz")) { -                    return 5 ; -                } else if (strstr(lineBuffer, "interface=it")) { -                    return 6 ; -                } else if (strstr(lineBuffer, "interface=ro")) { -                    return 7 ; -                } else if (strstr(lineBuffer, "interface=latex")) { -					// we will move latex cum suis up to 91+ when more keyword lists are supported -                    return 8 ; -				} else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) { -					// better would be to limit the search to just one line -					return 3 ; -                } else { -                    return defaultInterface ; -                } -            } -		} -    } - -    return defaultInterface ; -} - -static void ColouriseTeXDoc( -    unsigned int startPos, -    int length, -    int, -    WordList *keywordlists[], -    Accessor &styler) { - -	styler.StartAt(startPos) ; -	styler.StartSegment(startPos) ; - -	bool processComment   = styler.GetPropertyInt("lexer.tex.comment.process",   0) == 1 ; -	bool useKeywords      = styler.GetPropertyInt("lexer.tex.use.keywords",      1) == 1 ; -	bool autoIf           = styler.GetPropertyInt("lexer.tex.auto.if",           1) == 1 ; -	int  defaultInterface = styler.GetPropertyInt("lexer.tex.interface.default", 1) ; - -	char key[100] ; -	int  k ; -	bool newifDone = false ; -	bool inComment = false ; - -	int currentInterface = CheckTeXInterface(startPos,length,styler,defaultInterface) ; - -    if (currentInterface == 0) { -        useKeywords = false ; -        currentInterface = 1 ; -    } - -    WordList &keywords = *keywordlists[currentInterface-1] ; - -	StyleContext sc(startPos, length, SCE_TEX_TEXT, styler); - -	bool going = sc.More() ; // needed because of a fuzzy end of file state - -	for (; going; sc.Forward()) { - -		if (! sc.More()) { going = false ; } // we need to go one behind the end of text - -		if (inComment) { -			if (sc.atLineEnd) { -				sc.SetState(SCE_TEX_TEXT) ; -				newifDone = false ; -				inComment = false ; -			} -		} else { -			if (! isTeXfive(sc.ch)) { -				if (sc.state == SCE_TEX_COMMAND) { -					if (sc.LengthCurrent() == 1) { // \<noncstoken> -						if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) { -							sc.Forward(2) ; // \^^ and \^^<token> -						} -						sc.ForwardSetState(SCE_TEX_TEXT) ; -					} else { -						sc.GetCurrent(key, sizeof(key)-1) ; -						k = strlen(key) ; -						memmove(key,key+1,k) ; // shift left over escape token -						key[k] = '\0' ; -						k-- ; -						if (! keywords || ! useKeywords) { -							sc.SetState(SCE_TEX_COMMAND) ; -							newifDone = false ; -						} else if (k == 1) { //\<cstoken> -							sc.SetState(SCE_TEX_COMMAND) ; -							newifDone = false ; -						} else if (keywords.InList(key)) { -    						sc.SetState(SCE_TEX_COMMAND) ; -							newifDone = autoIf && (strcmp(key,"newif") == 0) ; -						} else if (autoIf && ! newifDone && (key[0] == 'i') && (key[1] == 'f') && keywords.InList("if")) { -	    					sc.SetState(SCE_TEX_COMMAND) ; -						} else { -							sc.ChangeState(SCE_TEX_TEXT) ; -							sc.SetState(SCE_TEX_TEXT) ; -							newifDone = false ; -						} -					} -				} -				if (isTeXzero(sc.ch)) { -					sc.SetState(SCE_TEX_SYMBOL); - -					if (!endOfLine(styler,sc.currentPos + 1)) -						sc.ForwardSetState(SCE_TEX_DEFAULT) ; - -					inComment = ! processComment ; -					newifDone = false ; -				} else if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) { -					sc.SetState(SCE_TEX_TEXT) ; -					sc.ForwardSetState(SCE_TEX_TEXT) ; -				} else if (isTeXone(sc.ch)) { -					sc.SetState(SCE_TEX_SPECIAL) ; -					newifDone = false ; -				} else if (isTeXtwo(sc.ch)) { -					sc.SetState(SCE_TEX_GROUP) ; -					newifDone = false ; -				} else if (isTeXthree(sc.ch)) { -					sc.SetState(SCE_TEX_SYMBOL) ; -					newifDone = false ; -				} else if (isTeXfour(sc.ch)) { -					sc.SetState(SCE_TEX_COMMAND) ; -				} else if (isTeXsix(sc.ch)) { -					sc.SetState(SCE_TEX_TEXT) ; -				} else if (sc.atLineEnd) { -					sc.SetState(SCE_TEX_TEXT) ; -					newifDone = false ; -					inComment = false ; -				} else { -					sc.SetState(SCE_TEX_TEXT) ; -				} -			} else if (sc.state != SCE_TEX_COMMAND) { -				sc.SetState(SCE_TEX_TEXT) ; -			} -		} -	} -	sc.ChangeState(SCE_TEX_TEXT) ; -	sc.Complete(); - -} - - -static inline bool isNumber(int ch) { -	return -      (ch == '0') || (ch == '1') || (ch == '2') ||  -      (ch == '3') || (ch == '4') || (ch == '5') ||  -      (ch == '6') || (ch == '7') || (ch == '8') || (ch == '9'); -} - -static inline bool isWordChar(int ch) { -	return ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')); -} - -static int ParseTeXCommand(unsigned int pos, Accessor &styler, char *command) -{ -  int length=0; -  char ch=styler.SafeGetCharAt(pos+1); -   -  if(ch==',' || ch==':' || ch==';' || ch=='%'){ -      command[0]=ch; -      command[1]=0; -	  return 1; -  } - -  // find end -     while(isWordChar(ch) && !isNumber(ch) && ch!='_' && ch!='.' && length<100){ -          command[length]=ch; -          length++; -          ch=styler.SafeGetCharAt(pos+length+1); -     } -      -  command[length]='\0';    -  if(!length) return 0; -  return length+1; -} - -static int classifyFoldPointTeXPaired(const char* s) { -	int lev=0;  -	if (!(isdigit(s[0]) || (s[0] == '.'))){ -		if (strcmp(s, "begin")==0||strcmp(s,"FoldStart")==0|| -			strcmp(s,"abstract")==0||strcmp(s,"unprotect")==0|| -			strcmp(s,"title")==0||strncmp(s,"start",5)==0||strncmp(s,"Start",5)==0|| -			strcmp(s,"documentclass")==0||strncmp(s,"if",2)==0 -			) -			lev=1; -		if (strcmp(s, "end")==0||strcmp(s,"FoldStop")==0|| -			strcmp(s,"maketitle")==0||strcmp(s,"protect")==0|| -			strncmp(s,"stop",4)==0||strncmp(s,"Stop",4)==0|| -			strcmp(s,"fi")==0 -			)  -		lev=-1; -	} -	return lev; -} - -static int classifyFoldPointTeXUnpaired(const char* s) { -	int lev=0;  -	if (!(isdigit(s[0]) || (s[0] == '.'))){ -		if (strcmp(s,"part")==0|| -			strcmp(s,"chapter")==0|| -			strcmp(s,"section")==0|| -			strcmp(s,"subsection")==0|| -			strcmp(s,"subsubsection")==0|| -			strcmp(s,"CJKfamily")==0|| -			strcmp(s,"appendix")==0|| -			strcmp(s,"Topic")==0||strcmp(s,"topic")==0|| -			strcmp(s,"subject")==0||strcmp(s,"subsubject")==0|| -			strcmp(s,"def")==0||strcmp(s,"gdef")==0||strcmp(s,"edef")==0|| -			strcmp(s,"xdef")==0||strcmp(s,"framed")==0|| -			strcmp(s,"frame")==0|| -			strcmp(s,"foilhead")==0||strcmp(s,"overlays")==0||strcmp(s,"slide")==0 -			){ -			    lev=1; -			} -	} -	return lev; -} - -static bool IsTeXCommentLine(int line, Accessor &styler) { -	int pos = styler.LineStart(line); -	int eol_pos = styler.LineStart(line + 1) - 1; -	 -	int startpos = pos; - -	while (startpos<eol_pos){ -		char ch = styler[startpos]; -		if (ch!='%' && ch!=' ') return false; -		else if (ch=='%') return true; -		startpos++; -	}		 - -	return false; -} - -// FoldTeXDoc: borrowed from VisualTeX with modifications - -static void FoldTexDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)  -{ -	bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; -	unsigned int endPos = startPos+length; -	int visibleChars=0; -	int lineCurrent=styler.GetLine(startPos); -	int levelPrev=styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; -	int levelCurrent=levelPrev; -	char chNext=styler[startPos]; -	char buffer[100]=""; -	 -	for (unsigned int i=startPos; i < endPos; i++) { -		char ch=chNext; -		chNext=styler.SafeGetCharAt(i+1); -		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - -        if(ch=='\\') { -            ParseTeXCommand(i, styler, buffer); -			levelCurrent += classifyFoldPointTeXPaired(buffer)+classifyFoldPointTeXUnpaired(buffer); -		} - -		if (levelCurrent > SC_FOLDLEVELBASE && ((ch == '\r' || ch=='\n') && (chNext == '\\'))) { -            ParseTeXCommand(i+1, styler, buffer); -			levelCurrent -= classifyFoldPointTeXUnpaired(buffer); -		} - -	char chNext2; -	char chNext3; -	char chNext4; -	char chNext5; -	chNext2=styler.SafeGetCharAt(i+2); -	chNext3=styler.SafeGetCharAt(i+3); -	chNext4=styler.SafeGetCharAt(i+4); -	chNext5=styler.SafeGetCharAt(i+5); - -	bool atEOfold = (ch == '%') &&  -			(chNext == '%') && (chNext2=='}') &&  -				(chNext3=='}')&& (chNext4=='-')&& (chNext5=='-'); - -	bool atBOfold = (ch == '%') &&  -			(chNext == '%') && (chNext2=='-') &&  -				(chNext3=='-')&& (chNext4=='{')&& (chNext5=='{'); - -	if(atBOfold){ -		levelCurrent+=1; -	} - -	if(atEOfold){ -		levelCurrent-=1; -	} -	 -	if(ch=='\\' && chNext=='['){ -		levelCurrent+=1; -	} -	 -	if(ch=='\\' && chNext==']'){ -		levelCurrent-=1; -	} - -	bool foldComment = styler.GetPropertyInt("fold.comment") != 0; - -	if (foldComment && atEOL && IsTeXCommentLine(lineCurrent, styler)) -        { -            if (lineCurrent==0 && IsTeXCommentLine(lineCurrent + 1, styler) -				) -                levelCurrent++; -            else if (lineCurrent!=0 && !IsTeXCommentLine(lineCurrent - 1, styler) -               && IsTeXCommentLine(lineCurrent + 1, styler) -				) -                levelCurrent++; -            else if (lineCurrent!=0 && IsTeXCommentLine(lineCurrent - 1, styler) && -                     !IsTeXCommentLine(lineCurrent+1, styler)) -                levelCurrent--; -        } - -//---------------------------------------------------------------------------------------------	 -		 -		if (atEOL) { -			int lev = levelPrev; -			if (visibleChars == 0 && foldCompact) -				lev |= SC_FOLDLEVELWHITEFLAG; -			if ((levelCurrent > levelPrev) && (visibleChars > 0)) -				lev |= SC_FOLDLEVELHEADERFLAG; -			if (lev != styler.LevelAt(lineCurrent)) { -				styler.SetLevel(lineCurrent, lev); -			} -			lineCurrent++; -			levelPrev = levelCurrent; -			visibleChars = 0; -		} - -		if (!isspacechar(ch)) -			visibleChars++; -	} - -	// Fill in the real level of the next line, keeping the current flags as they will be filled in later -	int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; -	styler.SetLevel(lineCurrent, levelPrev | flagsNext); -} - - - - -static const char * const texWordListDesc[] = { -    "TeX, eTeX, pdfTeX, Omega", -    "ConTeXt Dutch", -    "ConTeXt English", -    "ConTeXt German", -    "ConTeXt Czech", -    "ConTeXt Italian", -    "ConTeXt Romanian", -	0, -} ; - -LexerModule lmTeX(SCLEX_TEX,   ColouriseTeXDoc, "tex", FoldTexDoc, texWordListDesc); | 
