KickJava   Java API By Example, From Geeks To Geeks.

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


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  * HTMLTokenMarker.java
28  *
29  */

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

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