Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_Build_897 / libraries / libIverUtiles / src / com / iver / utiles / console / jedit / TeXTokenMarker.java @ 10444

History | View | Annotate | Download (3.33 KB)

1
package com.iver.utiles.console.jedit;
2
/*
3
 * TeXTokenMarker.java - TeX/LaTeX/AMS-TeX token marker
4
 * Copyright (C) 1998 Slava Pestov
5
 *
6
 * You may use and modify this package for any purpose. Redistribution is
7
 * permitted, in both source and binary form, provided that this notice
8
 * remains intact in all source distributions of this package.
9
 */
10

    
11
import javax.swing.text.Segment;
12

    
13
/**
14
 * TeX token marker.
15
 *
16
 * @author Slava Pestov
17
 * @version $Id$
18
 */
19
public class TeXTokenMarker extends TokenMarker
20
{
21
        // public members
22
        public static final byte BDFORMULA = Token.INTERNAL_FIRST;
23
        public static final byte EDFORMULA = (byte)(Token.INTERNAL_FIRST + 1);
24
        
25
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
26
        {
27
                char[] array = line.array;
28
                int offset = line.offset;
29
                int lastOffset = offset;
30
                int length = line.count + offset;
31
                boolean backslash = false;
32
loop:                for(int i = offset; i < length; i++)
33
                {
34
                        int i1 = (i+1);
35

    
36
                        char c = array[i];
37
                        // if a backslash is followed immediately
38
                        // by a non-alpha character, the command at
39
                        // the non-alpha char. If we have a backslash,
40
                        // some text, and then a non-alpha char,
41
                        // the command ends before the non-alpha char.
42
                        if(Character.isLetter(c))
43
                        {
44
                                backslash = false;
45
                        }
46
                        else
47
                        {
48
                                if(backslash)
49
                                {
50
                                        // \<non alpha>
51
                                        // we skip over this character,
52
                                        // hence the `continue'
53
                                        backslash = false;
54
                                        if(token == Token.KEYWORD2 || token == EDFORMULA)
55
                                                token = Token.KEYWORD2;
56
                                        addToken(i1 - lastOffset,token);
57
                                        lastOffset = i1;
58
                                        if(token == Token.KEYWORD1)
59
                                                token = Token.NULL;
60
                                        continue;
61
                                }
62
                                else
63
                                {
64
                                        //\blah<non alpha>
65
                                        // we leave the character in
66
                                        // the stream, and it's not
67
                                        // part of the command token
68
                                        if(token == BDFORMULA || token == EDFORMULA)
69
                                                token = Token.KEYWORD2;
70
                                        addToken(i - lastOffset,token);
71
                                        if(token == Token.KEYWORD1)
72
                                                token = Token.NULL;
73
                                        lastOffset = i;
74
                                }
75
                        }
76
                        switch(c)
77
                        {
78
                        case '%':
79
                                if(backslash)
80
                                {
81
                                        backslash = false;
82
                                        break;
83
                                }
84
                                addToken(i - lastOffset,token);
85
                                addToken(length - i,Token.COMMENT1);
86
                                lastOffset = length;
87
                                break loop;
88
                        case '\\':
89
                                backslash = true;
90
                                if(token == Token.NULL)
91
                                {
92
                                        token = Token.KEYWORD1;
93
                                        addToken(i - lastOffset,Token.NULL);
94
                                        lastOffset = i;
95
                                }
96
                                break;
97
                        case '$':
98
                                backslash = false;
99
                                if(token == Token.NULL) // singe $
100
                                {
101
                                        token = Token.KEYWORD2;
102
                                        addToken(i - lastOffset,Token.NULL);
103
                                        lastOffset = i;
104
                                }
105
                                else if(token == Token.KEYWORD1) // \...$
106
                                {
107
                                        token = Token.KEYWORD2;
108
                                        addToken(i - lastOffset,Token.KEYWORD1);
109
                                        lastOffset = i;
110
                                }
111
                                else if(token == Token.KEYWORD2) // $$aaa
112
                                {
113
                                        if(i - lastOffset == 1 && array[i-1] == '$')
114
                                        {
115
                                                token = BDFORMULA;
116
                                                break;
117
                                        }
118
                                        token = Token.NULL;
119
                                        addToken(i1 - lastOffset,Token.KEYWORD2);
120
                                        lastOffset = i1;
121
                                }
122
                                else if(token == BDFORMULA) // $$aaa$
123
                                {
124
                                        token = EDFORMULA;
125
                                }
126
                                else if(token == EDFORMULA) // $$aaa$$
127
                                {
128
                                        token = Token.NULL;
129
                                        addToken(i1 - lastOffset,Token.KEYWORD2);
130
                                        lastOffset = i1;
131
                                }
132
                                break;
133
                        }
134
                }
135
                if(lastOffset != length)
136
                        addToken(length - lastOffset,token == BDFORMULA
137
                                || token == EDFORMULA ? Token.KEYWORD2 :
138
                                token);
139
                return (token != Token.KEYWORD1 ? token : Token.NULL);
140
        }
141
}