Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.utils / src / main / java / org / gvsig / utils / console / jedit / PHPTokenMarker.java @ 40561

History | View | Annotate | Download (9.36 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * 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, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.utils.console.jedit;
25
/*
26
 * PHPTokenMarker.java - Token marker for PHP
27
 * Copyright (C) 1999 Clancy Malcolm
28
 * Based on HTMLTokenMarker.java Copyright (C) 1998, 1999 Slava Pestov
29
 *
30
 * You may use and modify this package for any purpose. Redistribution is
31
 * permitted, in both source and binary form, provided that this notice
32
 * remains intact in all source distributions of this package.
33
 */
34

    
35
import javax.swing.text.Segment;
36

    
37
/**
38
 * PHP token marker.
39
 *
40
 * @author Clancy Malcolm
41
 * @version $Id$
42
 */
43
public class PHPTokenMarker extends TokenMarker
44
{
45
        public static final byte SCRIPT = Token.INTERNAL_FIRST;
46

    
47
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
48
        {
49
                char[] array = line.array;
50
                int offset = line.offset;
51
                lastOffset = offset;
52
                lastKeyword = offset;
53
                int length = line.count + offset;
54
                boolean backslash = false;
55

    
56
loop:                for(int i = offset; i < length; i++)
57
                {
58
                        int i1 = (i+1);
59

    
60
                        char c = array[i];
61
                        if(c == '\\')
62
                        {
63
                                backslash = !backslash;
64
                                continue;
65
                        }
66

    
67
                        switch(token)
68
                        {
69
                        case Token.NULL: // HTML text
70
                                backslash = false;
71
                                switch(c)
72
                                {
73
                                case '<':
74
                                        addToken(i - lastOffset,token);
75
                                        lastOffset = lastKeyword = i;
76
                                        if(SyntaxUtilities.regionMatches(false,
77
                                                line,i1,"!--"))
78
                                        {
79
                                                i += 3;
80
                                                token = Token.COMMENT1;
81
                                        }
82
                                        else if(SyntaxUtilities.regionMatches(
83
                                                true,line,i1,"?php"))
84
                                        {
85
                                                addToken(5,Token.LABEL);
86
                                                lastOffset = lastKeyword = (i += 4) + 1;
87
                                                token = SCRIPT;
88
                                        }
89
                                        else if(SyntaxUtilities.regionMatches(
90
                                                true,line,i1,"?"))
91
                                        {
92
                                                addToken(2,Token.LABEL);
93
                                                lastOffset = lastKeyword = (i += 1) + 1;
94
                                                token = SCRIPT;
95
                                        }
96
                                        else if(SyntaxUtilities.regionMatches(
97
                                                true,line,i1,"script>"))
98
                                        {
99
                                                addToken(8,Token.LABEL);
100
                                                lastOffset = lastKeyword = (i += 7) + 1;
101
                                                token = SCRIPT;
102
                                        }
103
                                        else
104
                                        {
105
                                                token = Token.KEYWORD1;
106
                                        }
107
                                        break;
108
                                case '&':
109
                                        addToken(i - lastOffset,token);
110
                                        lastOffset = lastKeyword = i;
111
                                        token = Token.KEYWORD2;
112
                                        break;
113
                                }
114
                                break;
115
                        case Token.KEYWORD1: // Inside a tag
116
                                backslash = false;
117
                                if(c == '>')
118
                                {
119
                                        addToken(i1 - lastOffset,token);
120
                                        lastOffset = lastKeyword = i1;
121
                                        token = Token.NULL;
122
                                }
123
                                break;
124
                        case Token.KEYWORD2: // Inside an entity
125
                                backslash = false;
126
                                if(c == ';')
127
                                {
128
                                        addToken(i1 - lastOffset,token);
129
                                        lastOffset = lastKeyword = i1;
130
                                        token = Token.NULL;
131
                                        break;
132
                                }
133
                                break;
134
                        case Token.COMMENT1: // Inside a comment
135
                                backslash = false;
136
                                if(SyntaxUtilities.regionMatches(false,line,i,"-->"))
137
                                {
138
                                        addToken(i + 3 - lastOffset,token);
139
                                        i += 2;
140
                                        lastOffset = lastKeyword = i + 1;
141
                                        token = Token.NULL;
142
                                }
143
                                break;
144
                        case SCRIPT: // Inside a JavaScript or PHP
145
                                switch(c)
146
                                {
147
                                case '<':
148
                                        backslash = false;
149
                                        doKeyword(line,i,c);
150
                                        if(SyntaxUtilities.regionMatches(true,
151
                                                line,i1,"/script>"))
152
                                        {
153
                                                //Ending the script
154
                                                addToken(i - lastOffset,
155
                                                        Token.KEYWORD3);
156
                                                addToken(9,Token.LABEL);
157
                                                lastOffset = lastKeyword = (i += 8) + 1;
158
                                                token = Token.NULL;
159
                                        }
160
                                        else
161
                                        {
162
                                                // < operator
163
                                                addToken(i - lastOffset,
164
                                                        Token.KEYWORD3);
165
                                                addToken(1,Token.OPERATOR);
166
                                                lastOffset = lastKeyword = i1;
167
                                        }
168
                                        break;
169
                                case '?':
170
                                        backslash = false;
171
                                        doKeyword(line, i, c);
172
                                        if (array[i1] == '>')
173
                                        {
174
                                                //Ending the script
175
                                                addToken(i - lastOffset,
176
                                                Token.KEYWORD3);
177
                                                addToken(2,Token.LABEL);
178
                                                lastOffset = lastKeyword = (i += 1) + 1;
179
                                                token = Token.NULL;
180
                                        }
181
                                        else
182
                                        {
183
                                                //? operator
184
                                                addToken(i - lastOffset, Token.KEYWORD3);
185
                                                addToken(1,Token.OPERATOR);
186
                                                lastOffset = lastKeyword = i1;
187
                                        }
188
                                        break;
189
                                case '"':
190
                                        if(backslash)
191
                                                backslash = false;
192
                                        else
193
                                        {
194
                                                doKeyword(line,i,c);
195
                                                addToken(i - lastOffset,Token.KEYWORD3);
196
                                                lastOffset = lastKeyword = i;
197
                                                token = Token.LITERAL1;
198
                                        }
199
                                        break;
200
                                case '\'':
201
                                        if(backslash)
202
                                                backslash = false;
203
                                        else
204
                                        {
205
                                                doKeyword(line,i,c);
206
                                                addToken(i - lastOffset,Token.KEYWORD3);
207
                                                lastOffset = lastKeyword = i;
208
                                                token = Token.LITERAL2;
209
                                        }
210
                                        break;
211
                                case '#':
212
                                        doKeyword(line,i,c);
213
                                        addToken(i - lastOffset,Token.KEYWORD3);
214
                                        addToken(length - i,Token.COMMENT2);
215
                                        lastOffset = lastKeyword = length;
216
                                        break loop;
217
                                case '/':
218
                                        backslash = false;
219
                                        doKeyword(line,i,c);
220
                                        if(length - i > 1)  /*This is the same as if(length > i + 1) */
221
                                        {
222
                                                addToken(i - lastOffset,Token.KEYWORD3);
223
                                                lastOffset = lastKeyword = i;
224
                                                if(array[i1] == '/')
225
                                                {
226
                                                        addToken(length - i,Token.COMMENT2);
227
                                                        lastOffset = lastKeyword = length;
228
                                                        break loop;
229
                                                }
230
                                                else if(array[i1] == '*')
231
                                                {
232
                                                        token = Token.COMMENT2;
233
                                                }
234
                                                else
235
                                                {
236
                                                        // / operator
237
                                                        addToken(i - lastOffset, Token.KEYWORD3);
238
                                                        addToken(1,Token.OPERATOR);
239
                                                        lastOffset = lastKeyword = i1;
240
                                                }
241
                                         }
242
                                        else
243
                                        {
244
                                                // / operator
245
                                                addToken(i - lastOffset, Token.KEYWORD3);
246
                                                addToken(1,Token.OPERATOR);
247
                                                lastOffset = lastKeyword = i1;
248
                                        }
249
                                        break;
250
                                default:
251
                                        backslash = false;
252
                                        if(!Character.isLetterOrDigit(c)
253
                                                && c != '_' && c != '$')
254
                                        {
255
                                                doKeyword(line,i,c);
256
                                                if (c != ' ')
257
                                                {
258
                                                        //assume non alphanumeric characters are operators
259
                                                        addToken(i - lastOffset, Token.KEYWORD3);
260
                                                        addToken(1,Token.OPERATOR);
261
                                                        lastOffset = lastKeyword = i1;
262
                                                }
263
                                        }
264
                                        break;
265
                                }
266
                                break;
267
                        case Token.LITERAL1: // Script "..."
268
                                if(backslash)
269
                                        backslash = false;
270
                                else if(c == '"')
271
                                {
272
                                        addToken(i1 - lastOffset,Token.LITERAL1);
273
                                        lastOffset = lastKeyword = i1;
274
                                        token = SCRIPT;
275
                                }
276
                                break;
277
                        case Token.LITERAL2: // Script '...'
278
                                if(backslash)
279
                                        backslash = false;
280
                                else if(c == '\'')
281
                                {
282
                                        addToken(i1 - lastOffset,Token.LITERAL1);
283
                                        lastOffset = lastKeyword = i1;
284
                                        token = SCRIPT;
285
                                }
286
                                break;
287
                        case Token.COMMENT2: // Inside a Script comment
288
                                backslash = false;
289
                                if(c == '*' && length - i > 1 && array[i1] == '/')
290
                                {
291
                                        addToken(i + 2 - lastOffset,Token.COMMENT2);
292
                                        i += 1;
293
                                        lastOffset = lastKeyword = i + 1;
294
                                        token = SCRIPT;
295
                                }
296
                                break;
297
                        default:
298
                                throw new InternalError("Invalid state: "
299
                                        + token);
300
                        }
301
                }
302

    
303
                switch(token)
304
                {
305
                case Token.LITERAL1:
306
                        addToken(length - lastOffset,Token.LITERAL1);
307
                        break;
308
                case Token.LITERAL2:
309
                        addToken(length - lastOffset,Token.LITERAL2);
310
                        break;
311
                case Token.KEYWORD2:
312
                        addToken(length - lastOffset,Token.INVALID);
313
                        token = Token.NULL;
314
                        break;
315
                case SCRIPT:
316
                        doKeyword(line,length,'\0');
317
                        addToken(length - lastOffset,Token.KEYWORD3);
318
                        break;
319
                default:
320
                        addToken(length - lastOffset,token);
321
                        break;
322
                }
323

    
324
                return token;
325
        }
326

    
327
        // private members
328
        private static KeywordMap keywords;
329
        private int lastOffset;
330
        private int lastKeyword;
331

    
332
        static
333
        {
334
                keywords = new KeywordMap(false);
335
                keywords.add("function",Token.KEYWORD2);
336
                keywords.add("class",Token.KEYWORD2);
337
                keywords.add("var",Token.KEYWORD2);
338
                keywords.add("require",Token.KEYWORD2);
339
                keywords.add("include",Token.KEYWORD2);
340
                keywords.add("else",Token.KEYWORD1);
341
                keywords.add("elseif",Token.KEYWORD1);
342
                keywords.add("do",Token.KEYWORD1);
343
                keywords.add("for",Token.KEYWORD1);
344
                keywords.add("if",Token.KEYWORD1);
345
                keywords.add("endif",Token.KEYWORD1);
346
                keywords.add("in",Token.KEYWORD1);
347
                keywords.add("new",Token.KEYWORD1);
348
                keywords.add("return",Token.KEYWORD1);
349
                keywords.add("while",Token.KEYWORD1);
350
                keywords.add("endwhile",Token.KEYWORD1);
351
                keywords.add("with",Token.KEYWORD1);
352
                keywords.add("break",Token.KEYWORD1);
353
                keywords.add("switch",Token.KEYWORD1);
354
                keywords.add("case",Token.KEYWORD1);
355
                keywords.add("continue",Token.KEYWORD1);
356
                keywords.add("default",Token.KEYWORD1);
357
                keywords.add("echo",Token.KEYWORD1);
358
                keywords.add("false",Token.KEYWORD1);
359
                keywords.add("this",Token.KEYWORD1);
360
                keywords.add("true",Token.KEYWORD1);
361
                keywords.add("array",Token.KEYWORD1);
362
                keywords.add("extends",Token.KEYWORD1);
363
        }
364

    
365
        private boolean doKeyword(Segment line, int i, char c)
366
        {
367
                int i1 = i+1;
368

    
369
                int len = i - lastKeyword;
370
                byte id = keywords.lookup(line,lastKeyword,len);
371
                if(id != Token.NULL)
372
                {
373
                        if(lastKeyword != lastOffset)
374
                                addToken(lastKeyword - lastOffset,Token.KEYWORD3);
375
                        addToken(len,id);
376
                        lastOffset = i;
377
                }
378
                lastKeyword = i1;
379
                return false;
380
        }
381
}