KickJava   Java API By Example, From Geeks To Geeks.

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


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

12
13 import javax.swing.text.Segment JavaDoc;
14
15 /**
16  * PHP token marker.
17  *
18  * @author Clancy Malcolm
19  * @version $Id: PHPTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
20  */

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