KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jedit > syntax > XMLTokenMarker


1 package org.jedit.syntax;
2
3 import javax.swing.text.Segment JavaDoc;
4
5 /**
6  * XML Token Marker Rewrite
7  *
8  * @author Tom Bradford
9  * @version $Id: XMLTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
10  */

11 public class XMLTokenMarker extends TokenMarker {
12    public XMLTokenMarker() {
13    }
14    
15    public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex) {
16       char[] array = line.array;
17       int offset = line.offset;
18       int lastOffset = offset;
19       int length = line.count + offset;
20       
21       // Ugly hack to handle multi-line tags
22
boolean sk1 = token == Token.KEYWORD1;
23       
24       for ( int i = offset; i < length; i++ ) {
25          int ip1 = i+1;
26          char c = array[i];
27          switch ( token ) {
28             case Token.NULL: // text
29
switch ( c ) {
30                   case '<':
31                      addToken(i-lastOffset, token);
32                      lastOffset = i;
33                      if ( SyntaxUtilities.regionMatches(false, line, ip1, "!--") ) {
34                         i += 3;
35                         token = Token.COMMENT1;
36                      }
37                      else if ( array[ip1] == '!' ) {
38                         i += 1;
39                         token = Token.COMMENT2;
40                      }
41                      else if ( array[ip1] == '?' ) {
42                         i += 1;
43                         token = Token.KEYWORD3;
44                      }
45                      else
46                         token = Token.KEYWORD1;
47                      break;
48                      
49                   case '&':
50                      addToken(i - lastOffset, token);
51                      lastOffset = i;
52                      token = Token.LABEL;
53                      break;
54                }
55                break;
56                
57             case Token.KEYWORD1: // tag
58
switch ( c ) {
59                   case '>':
60                      addToken(ip1-lastOffset, token);
61                      lastOffset = ip1;
62                      token = Token.NULL;
63                      sk1 = false;
64                      break;
65                      
66                   case ' ':
67                   case '\t':
68                      addToken(i-lastOffset, token);
69                      lastOffset = i;
70                      token = Token.KEYWORD2;
71                      sk1 = false;
72                      break;
73                      
74                   default:
75                      if ( sk1 ) {
76                         token = Token.KEYWORD2;
77                         sk1 = false;
78                      }
79                      break;
80                }
81                break;
82
83             case Token.KEYWORD2: // attribute
84
switch ( c ) {
85                    case '>':
86                      addToken(ip1-lastOffset, token);
87                      lastOffset = ip1;
88                      token = Token.NULL;
89                      break;
90                     
91                   case '/':
92                      addToken(i-lastOffset, token);
93                      lastOffset = i;
94                      token = Token.KEYWORD1;
95                      break;
96                      
97                   case '=':
98                      addToken(i-lastOffset, token);
99                      lastOffset = i;
100                      token = Token.OPERATOR;
101                }
102                break;
103                
104             case Token.OPERATOR: // equal for attribute
105
switch ( c ) {
106                   case '\"':
107                   case '\'':
108                      addToken(i-lastOffset, token);
109                      lastOffset = i;
110                      if ( c == '\"' )
111                         token = Token.LITERAL1;
112                      else
113                         token = Token.LITERAL2;
114                      break;
115                }
116                break;
117                
118             case Token.LITERAL1:
119             case Token.LITERAL2: // strings
120
if ( ( token == Token.LITERAL1 && c == '\"' )
121                  || ( token == Token.LITERAL2 && c == '\'' ) ) {
122                   addToken(ip1-lastOffset, token);
123                   lastOffset = ip1;
124                   token = Token.KEYWORD1;
125                }
126                break;
127             
128             case Token.LABEL: // entity
129
if ( c == ';' ) {
130                   addToken(ip1-lastOffset, token);
131                   lastOffset = ip1;
132                   token = Token.NULL;
133                   break;
134                }
135                break;
136                
137             case Token.COMMENT1: // Inside a comment
138
if ( SyntaxUtilities.regionMatches(false, line, i, "-->") ) {
139                   addToken((i+3)-lastOffset, token);
140                   lastOffset = i+3;
141                   token = Token.NULL;
142                }
143                break;
144
145             case Token.COMMENT2: // Inside a declaration
146
if ( SyntaxUtilities.regionMatches(false, line, i, ">") ) {
147                   addToken(ip1-lastOffset, token);
148                   lastOffset = ip1;
149                   token = Token.NULL;
150                }
151                break;
152
153             case Token.KEYWORD3: // Inside a processor instruction
154
if ( SyntaxUtilities.regionMatches(false, line, i, "?>") ) {
155                   addToken((i+2)-lastOffset, token);
156                   lastOffset = i+2;
157                   token = Token.NULL;
158                }
159                break;
160                
161             default:
162                throw new InternalError JavaDoc("Invalid state: " + token);
163          }
164       }
165       
166       switch ( token ) {
167          case Token.LABEL:
168             addToken(length-lastOffset, Token.INVALID);
169             token = Token.NULL;
170             break;
171             
172          default:
173             addToken(length-lastOffset, token);
174             break;
175       }
176       
177       return token;
178    }
179 }
180
181
182
Popular Tags