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 | 4890 | caballero | 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 | } |