KickJava   Java API By Example, From Geeks To Geeks.

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


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  * PHPTokenMarker.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  * PHP token marker.
38  *
39  * @author Clancy Malcolm
40  * @version $Id: PHPTokenMarker.java 932 2006-10-20 09:32:45Z gtoffoli $
41  */

42 public class PHPTokenMarker extends TokenMarker
43 {
44     public static final byte SCRIPT = Token.INTERNAL_FIRST;
45
46     public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
47     {
48         char[] array = line.array;
49         int offset = line.offset;
50         lastOffset = offset;
51         lastKeyword = offset;
52         int length = line.count + offset;
53         boolean backslash = false;
54
55 loop: for(int i = offset; i < length; i++)
56         {
57             int i1 = (i+1);
58
59             char c = array[i];
60             if(c == '\\')
61             {
62                 backslash = !backslash;
63                 continue;
64             }
65
66             switch(token)
67             {
68             case Token.NULL: // HTML text
69
backslash = false;
70                 switch(c)
71                 {
72                 case '<':
73                     addToken(i - lastOffset,token);
74                     lastOffset = lastKeyword = i;
75                     if(SyntaxUtilities.regionMatches(false,
76                         line,i1,"!--"))
77                     {
78                         i += 3;
79                         token = Token.COMMENT1;
80                     }
81                     else if(SyntaxUtilities.regionMatches(
82                         true,line,i1,"?php"))
83                     {
84                         addToken(5,Token.LABEL);
85                         lastOffset = lastKeyword = (i += 4) + 1;
86                         token = SCRIPT;
87                     }
88                     else if(SyntaxUtilities.regionMatches(
89                         true,line,i1,"?"))
90                     {
91                         addToken(2,Token.LABEL);
92                         lastOffset = lastKeyword = (i += 1) + 1;
93                         token = SCRIPT;
94                     }
95                     else if(SyntaxUtilities.regionMatches(
96                         true,line,i1,"script>"))
97                     {
98                         addToken(8,Token.LABEL);
99                         lastOffset = lastKeyword = (i += 7) + 1;
100                         token = SCRIPT;
101                     }
102                     else
103                     {
104                         token = Token.KEYWORD1;
105                     }
106                     break;
107                 case '&':
108                     addToken(i - lastOffset,token);
109                     lastOffset = lastKeyword = i;
110                     token = Token.KEYWORD2;
111                     break;
112                 }
113                 break;
114             case Token.KEYWORD1: // Inside a tag
115
backslash = false;
116                 if(c == '>')
117                 {
118                     addToken(i1 - lastOffset,token);
119                     lastOffset = lastKeyword = i1;
120                     token = Token.NULL;
121                 }
122                 break;
123             case Token.KEYWORD2: // Inside an entity
124
backslash = false;
125                 if(c == ';')
126                 {
127                     addToken(i1 - lastOffset,token);
128                     lastOffset = lastKeyword = i1;
129                     token = Token.NULL;
130                     break;
131                 }
132                 break;
133             case Token.COMMENT1: // Inside a comment
134
backslash = false;
135                 if(SyntaxUtilities.regionMatches(false,line,i,"-->"))
136                 {
137                     addToken(i + 3 - lastOffset,token);
138                     i += 2;
139                     lastOffset = lastKeyword = i + 1;
140                     token = Token.NULL;
141                 }
142                 break;
143             case SCRIPT: // Inside a JavaScript or PHP
144
switch(c)
145                 {
146                 case '<':
147                     backslash = false;
148                     doKeyword(line,i,c);
149                     if(SyntaxUtilities.regionMatches(true,
150                         line,i1,"/script>"))
151                     {
152                         //Ending the script
153
addToken(i - lastOffset,
154                             Token.KEYWORD3);
155                         addToken(9,Token.LABEL);
156                         lastOffset = lastKeyword = (i += 8) + 1;
157                         token = Token.NULL;
158                     }
159                     else
160                     {
161                         // < operator
162
addToken(i - lastOffset,
163                             Token.KEYWORD3);
164                         addToken(1,Token.OPERATOR);
165                         lastOffset = lastKeyword = i1;
166                     }
167                     break;
168                 case '?':
169                     backslash = false;
170                     doKeyword(line, i, c);
171                     if (array[i1] == '>')
172                     {
173                         //Ending the script
174
addToken(i - lastOffset,
175                         Token.KEYWORD3);
176                         addToken(2,Token.LABEL);
177                         lastOffset = lastKeyword = (i += 1) + 1;
178                         token = Token.NULL;
179                     }
180                     else
181                     {
182                         //? operator
183
addToken(i - lastOffset, Token.KEYWORD3);
184                         addToken(1,Token.OPERATOR);
185                         lastOffset = lastKeyword = i1;
186                     }
187                     break;
188                 case '"':
189                     if(backslash)
190                         backslash = false;
191                     else
192                     {
193                         doKeyword(line,i,c);
194                         addToken(i - lastOffset,Token.KEYWORD3);
195                         lastOffset = lastKeyword = i;
196                         token = Token.LITERAL1;
197                     }
198                     break;
199                 case '\'':
200                     if(backslash)
201                         backslash = false;
202                     else
203                     {
204                         doKeyword(line,i,c);
205                         addToken(i - lastOffset,Token.KEYWORD3);
206                         lastOffset = lastKeyword = i;
207                         token = Token.LITERAL2;
208                     }
209                     break;
210                 case '#':
211                     doKeyword(line,i,c);
212                     addToken(i - lastOffset,Token.KEYWORD3);
213                     addToken(length - i,Token.COMMENT2);
214                     lastOffset = lastKeyword = length;
215                     break loop;
216                 case '/':
217                     backslash = false;
218                     doKeyword(line,i,c);
219                     if(length - i > 1) /*This is the same as if(length > i + 1) */
220                     {
221                         addToken(i - lastOffset,Token.KEYWORD3);
222                         lastOffset = lastKeyword = i;
223                         if(array[i1] == '/')
224                         {
225                             addToken(length - i,Token.COMMENT2);
226                             lastOffset = lastKeyword = length;
227                             break loop;
228                         }
229                         else if(array[i1] == '*')
230                         {
231                             token = Token.COMMENT2;
232                         }
233                         else
234                         {
235                             // / operator
236
addToken(i - lastOffset, Token.KEYWORD3);
237                             addToken(1,Token.OPERATOR);
238                             lastOffset = lastKeyword = i1;
239                         }
240                     }
241                     else
242                     {
243                         // / operator
244
addToken(i - lastOffset, Token.KEYWORD3);
245                         addToken(1,Token.OPERATOR);
246                         lastOffset = lastKeyword = i1;
247                     }
248                     break;
249                 default:
250                     backslash = false;
251                     if(!Character.isLetterOrDigit(c)
252                         && c != '_' && c != '$')
253                     {
254                         doKeyword(line,i,c);
255                         if (c != ' ')
256                         {
257                             //assume non alphanumeric characters are operators
258
addToken(i - lastOffset, Token.KEYWORD3);
259                             addToken(1,Token.OPERATOR);
260                             lastOffset = lastKeyword = i1;
261                         }
262                     }
263                     break;
264                 }
265                 break;
266             case Token.LITERAL1: // Script "..."
267
if(backslash)
268                     backslash = false;
269                 else if(c == '"')
270                 {
271                     addToken(i1 - lastOffset,Token.LITERAL1);
272                     lastOffset = lastKeyword = i1;
273                     token = SCRIPT;
274                 }
275                 break;
276             case Token.LITERAL2: // Script '...'
277
if(backslash)
278                     backslash = false;
279                 else if(c == '\'')
280                 {
281                     addToken(i1 - lastOffset,Token.LITERAL1);
282                     lastOffset = lastKeyword = i1;
283                     token = SCRIPT;
284                 }
285                 break;
286             case Token.COMMENT2: // Inside a Script comment
287
backslash = false;
288                 if(c == '*' && length - i > 1 && array[i1] == '/')
289                 {
290                     addToken(i + 2 - lastOffset,Token.COMMENT2);
291                     i += 1;
292                     lastOffset = lastKeyword = i + 1;
293                     token = SCRIPT;
294                 }
295                 break;
296             default:
297                 throw new InternalError JavaDoc("Invalid state: "
298                     + token);
299             }
300         }
301
302         switch(token)
303         {
304         case Token.LITERAL1:
305             addToken(length - lastOffset,Token.LITERAL1);
306             break;
307         case Token.LITERAL2:
308             addToken(length - lastOffset,Token.LITERAL2);
309             break;
310         case Token.KEYWORD2:
311             addToken(length - lastOffset,Token.INVALID);
312             token = Token.NULL;
313             break;
314         case SCRIPT:
315             doKeyword(line,length,'\0');
316             addToken(length - lastOffset,Token.KEYWORD3);
317             break;
318         default:
319             addToken(length - lastOffset,token);
320             break;
321         }
322
323         return token;
324     }
325
326     // private members
327
private static KeywordMap keywords;
328     private int lastOffset;
329     private int lastKeyword;
330
331     static
332     {
333         keywords = new KeywordMap(false);
334         keywords.add("function",Token.KEYWORD2);
335         keywords.add("class",Token.KEYWORD2);
336         keywords.add("var",Token.KEYWORD2);
337         keywords.add("require",Token.KEYWORD2);
338         keywords.add("include",Token.KEYWORD2);
339         keywords.add("else",Token.KEYWORD1);
340         keywords.add("elseif",Token.KEYWORD1);
341         keywords.add("do",Token.KEYWORD1);
342         keywords.add("for",Token.KEYWORD1);
343         keywords.add("if",Token.KEYWORD1);
344         keywords.add("endif",Token.KEYWORD1);
345         keywords.add("in",Token.KEYWORD1);
346         keywords.add("new",Token.KEYWORD1);
347         keywords.add("return",Token.KEYWORD1);
348         keywords.add("while",Token.KEYWORD1);
349         keywords.add("endwhile",Token.KEYWORD1);
350         keywords.add("with",Token.KEYWORD1);
351         keywords.add("break",Token.KEYWORD1);
352         keywords.add("switch",Token.KEYWORD1);
353         keywords.add("case",Token.KEYWORD1);
354         keywords.add("continue",Token.KEYWORD1);
355         keywords.add("default",Token.KEYWORD1);
356         keywords.add("echo",Token.KEYWORD1);
357         keywords.add("false",Token.KEYWORD1);
358         keywords.add("this",Token.KEYWORD1);
359         keywords.add("true",Token.KEYWORD1);
360         keywords.add("array",Token.KEYWORD1);
361         keywords.add("extends",Token.KEYWORD1);
362     }
363
364     private boolean doKeyword(Segment JavaDoc line, int i, char c)
365     {
366         int i1 = i+1;
367
368         int len = i - lastKeyword;
369         byte id = keywords.lookup(line,lastKeyword,len);
370         if(id != Token.NULL)
371         {
372             if(lastKeyword != lastOffset)
373                 addToken(lastKeyword - lastOffset,Token.KEYWORD3);
374             addToken(len,id);
375             lastOffset = i;
376         }
377         lastKeyword = i1;
378         return false;
379     }
380 }
381
Popular Tags