KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > syntax > jedit > tokenmarker > TeXTokenMarker


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * TeXTokenMarker.java
28  *
29  */

30
31 package org.syntax.jedit.tokenmarker;
32
33 import javax.swing.text.Segment JavaDoc;
34
35 /**
36  * TeX token marker.
37  *
38  * @author Slava Pestov
39  * @version $Id: TeXTokenMarker.java 932 2006-10-20 09:32:45Z gtoffoli $
40  */

41 public class TeXTokenMarker extends TokenMarker
42 {
43     // public members
44
public static final byte BDFORMULA = Token.INTERNAL_FIRST;
45     public static final byte EDFORMULA = (byte)(Token.INTERNAL_FIRST + 1);
46     
47     public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
48     {
49         char[] array = line.array;
50         int offset = line.offset;
51         int lastOffset = offset;
52         int length = line.count + offset;
53         boolean backslash = false;
54 loop: for(int i = offset; i < length; i++)
55         {
56             int i1 = (i+1);
57
58             char c = array[i];
59             // if a backslash is followed immediately
60
// by a non-alpha character, the command at
61
// the non-alpha char. If we have a backslash,
62
// some text, and then a non-alpha char,
63
// the command ends before the non-alpha char.
64
if(Character.isLetter(c))
65             {
66                 backslash = false;
67             }
68             else
69             {
70                 if(backslash)
71                 {
72                     // \<non alpha>
73
// we skip over this character,
74
// hence the `continue'
75
backslash = false;
76                     if(token == Token.KEYWORD2 || token == EDFORMULA)
77                         token = Token.KEYWORD2;
78                     addToken(i1 - lastOffset,token);
79                     lastOffset = i1;
80                     if(token == Token.KEYWORD1)
81                         token = Token.NULL;
82                     continue;
83                 }
84                 else
85                 {
86                     //\blah<non alpha>
87
// we leave the character in
88
// the stream, and it's not
89
// part of the command token
90
if(token == BDFORMULA || token == EDFORMULA)
91                         token = Token.KEYWORD2;
92                     addToken(i - lastOffset,token);
93                     if(token == Token.KEYWORD1)
94                         token = Token.NULL;
95                     lastOffset = i;
96                 }
97             }
98             switch(c)
99             {
100             case '%':
101                 if(backslash)
102                 {
103                     backslash = false;
104                     break;
105                 }
106                 addToken(i - lastOffset,token);
107                 addToken(length - i,Token.COMMENT1);
108                 lastOffset = length;
109                 break loop;
110             case '\\':
111                 backslash = true;
112                 if(token == Token.NULL)
113                 {
114                     token = Token.KEYWORD1;
115                     addToken(i - lastOffset,Token.NULL);
116                     lastOffset = i;
117                 }
118                 break;
119             case '$':
120                 backslash = false;
121                 if(token == Token.NULL) // singe $
122
{
123                     token = Token.KEYWORD2;
124                     addToken(i - lastOffset,Token.NULL);
125                     lastOffset = i;
126                 }
127                 else if(token == Token.KEYWORD1) // \...$
128
{
129                     token = Token.KEYWORD2;
130                     addToken(i - lastOffset,Token.KEYWORD1);
131                     lastOffset = i;
132                 }
133                 else if(token == Token.KEYWORD2) // $$aaa
134
{
135                     if(i - lastOffset == 1 && array[i-1] == '$')
136                     {
137                         token = BDFORMULA;
138                         break;
139                     }
140                     token = Token.NULL;
141                     addToken(i1 - lastOffset,Token.KEYWORD2);
142                     lastOffset = i1;
143                 }
144                 else if(token == BDFORMULA) // $$aaa$
145
{
146                     token = EDFORMULA;
147                 }
148                 else if(token == EDFORMULA) // $$aaa$$
149
{
150                     token = Token.NULL;
151                     addToken(i1 - lastOffset,Token.KEYWORD2);
152                     lastOffset = i1;
153                 }
154                 break;
155             }
156         }
157         if(lastOffset != length)
158             addToken(length - lastOffset,token == BDFORMULA
159                 || token == EDFORMULA ? Token.KEYWORD2 :
160                 token);
161         return (token != Token.KEYWORD1 ? token : Token.NULL);
162     }
163 }
164
Popular Tags