KickJava   Java API By Example, From Geeks To Geeks.

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


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

11
12 import javax.swing.text.Segment JavaDoc;
13
14 /**
15  * HTML token marker.
16  *
17  * @author Slava Pestov
18  * @version $Id: HTMLTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
19  */

20 public class HTMLTokenMarker extends TokenMarker
21 {
22    public static final byte JAVASCRIPT = Token.INTERNAL_FIRST;
23
24    public HTMLTokenMarker()
25    {
26       this(true);
27    }
28
29    public HTMLTokenMarker(boolean js)
30    {
31       this.js = js;
32       keywords = JavaScriptTokenMarker.getKeywords();
33    }
34
35    public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
36    {
37       char[] array = line.array;
38       int offset = line.offset;
39       lastOffset = offset;
40       lastKeyword = offset;
41       int length = line.count + offset;
42       boolean backslash = false;
43
44 loop: for(int i = offset; i < length; i++)
45       {
46          int i1 = (i+1);
47
48          char c = array[i];
49          if(c == '\\')
50          {
51             backslash = !backslash;
52             continue;
53          }
54
55          switch(token)
56          {
57          case Token.NULL: // HTML text
58
backslash = false;
59             switch(c)
60             {
61             case '<':
62                addToken(i - lastOffset,token);
63                lastOffset = lastKeyword = i;
64                if(SyntaxUtilities.regionMatches(false,
65                   line,i1,"!--"))
66                {
67                   i += 3;
68                   token = Token.COMMENT1;
69                }
70                else if(js && SyntaxUtilities.regionMatches(
71                   true,line,i1,"script>"))
72                {
73                   addToken(8,Token.KEYWORD1);
74                   lastOffset = lastKeyword = (i += 8);
75                   token = JAVASCRIPT;
76                }
77                else
78                {
79                   token = Token.KEYWORD1;
80                }
81                break;
82             case '&':
83                addToken(i - lastOffset,token);
84                lastOffset = lastKeyword = i;
85                token = Token.KEYWORD2;
86                break;
87             }
88             break;
89          case Token.KEYWORD1: // Inside a tag
90
backslash = false;
91             if(c == '>')
92             {
93                addToken(i1 - lastOffset,token);
94                lastOffset = lastKeyword = i1;
95                token = Token.NULL;
96             }
97             break;
98          case Token.KEYWORD2: // Inside an entity
99
backslash = false;
100             if(c == ';')
101             {
102                addToken(i1 - lastOffset,token);
103                lastOffset = lastKeyword = i1;
104                token = Token.NULL;
105                break;
106             }
107             break;
108          case Token.COMMENT1: // Inside a comment
109
backslash = false;
110             if(SyntaxUtilities.regionMatches(false,line,i,"-->"))
111             {
112                addToken((i + 3) - lastOffset,token);
113                lastOffset = lastKeyword = i + 3;
114                token = Token.NULL;
115             }
116             break;
117          case JAVASCRIPT: // Inside a JavaScript
118
switch(c)
119             {
120             case '<':
121                backslash = false;
122                doKeyword(line,i,c);
123                if(SyntaxUtilities.regionMatches(true,
124                   line,i1,"/script>"))
125                {
126                   addToken(i - lastOffset,
127                      Token.NULL);
128                   addToken(9,Token.KEYWORD1);
129                   lastOffset = lastKeyword = (i += 9);
130                   token = Token.NULL;
131                }
132                break;
133             case '"':
134                if(backslash)
135                   backslash = false;
136                else
137                {
138                   doKeyword(line,i,c);
139                   addToken(i - lastOffset,Token.NULL);
140                   lastOffset = lastKeyword = i;
141                   token = Token.LITERAL1;
142                }
143                break;
144             case '\'':
145                if(backslash)
146                   backslash = false;
147                else
148                {
149                   doKeyword(line,i,c);
150                   addToken(i - lastOffset,Token.NULL);
151                   lastOffset = lastKeyword = i;
152                   token = Token.LITERAL2;
153                }
154                break;
155             case '/':
156                backslash = false;
157                doKeyword(line,i,c);
158                if(length - i > 1)
159                {
160                   addToken(i - lastOffset,Token.NULL);
161                   lastOffset = lastKeyword = i;
162                   if(array[i1] == '/')
163                   {
164                      addToken(length - i,Token.COMMENT2);
165                      lastOffset = lastKeyword = length;
166                      break loop;
167                   }
168                   else if(array[i1] == '*')
169                   {
170                      token = Token.COMMENT2;
171                   }
172                }
173                break;
174             default: backslash = false;
175                if(!Character.isLetterOrDigit(c)
176                   && c != '_')
177                   doKeyword(line,i,c);
178                break;
179             }
180             break;
181          case Token.LITERAL1: // JavaScript "..."
182
if(backslash)
183                backslash = false;
184             else if(c == '"')
185             {
186                addToken(i1 - lastOffset,Token.LITERAL1);
187                lastOffset = lastKeyword = i1;
188                token = JAVASCRIPT;
189             }
190             break;
191          case Token.LITERAL2: // JavaScript '...'
192
if(backslash)
193                backslash = false;
194             else if(c == '\'')
195             {
196                addToken(i1 - lastOffset,Token.LITERAL1);
197                lastOffset = lastKeyword = i1;
198                token = JAVASCRIPT;
199             }
200             break;
201          case Token.COMMENT2: // Inside a JavaScript comment
202
backslash = false;
203             if(c == '*' && length - i > 1 && array[i1] == '/')
204             {
205                addToken((i+=2) - lastOffset,Token.COMMENT2);
206                lastOffset = lastKeyword = i;
207                token = JAVASCRIPT;
208             }
209             break;
210          default:
211             throw new InternalError JavaDoc("Invalid state: "
212                + token);
213          }
214       }
215
216       switch(token)
217       {
218       case Token.LITERAL1:
219       case Token.LITERAL2:
220          addToken(length - lastOffset,Token.INVALID);
221          token = JAVASCRIPT;
222          break;
223       case Token.KEYWORD2:
224          addToken(length - lastOffset,Token.INVALID);
225          token = Token.NULL;
226          break;
227       case JAVASCRIPT:
228          doKeyword(line,length,'\0');
229          addToken(length - lastOffset,Token.NULL);
230          break;
231       default:
232          addToken(length - lastOffset,token);
233          break;
234       }
235
236       return token;
237    }
238
239    // private members
240
private KeywordMap keywords;
241    private boolean js;
242    private int lastOffset;
243    private int lastKeyword;
244
245    private boolean doKeyword(Segment JavaDoc line, int i, char c)
246    {
247       int i1 = i+1;
248
249       int len = i - lastKeyword;
250       byte id = keywords.lookup(line,lastKeyword,len);
251       if(id != Token.NULL)
252       {
253          if(lastKeyword != lastOffset)
254             addToken(lastKeyword - lastOffset,Token.NULL);
255          addToken(len,id);
256          lastOffset = i;
257       }
258       lastKeyword = i1;
259       return false;
260    }
261 }
262
Popular Tags