Statistics
| Revision:

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

History | View | Annotate | Download (6.32 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
 * PythonTokenMarker.java - Python token marker
27
 * Copyright (C) 1999 Jonathan Revusky
28
 * 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
 * Python token marker.
39
 *
40
 * @author Jonathan Revusky
41
 * @version $Id$
42
 */
43
public class PythonTokenMarker extends TokenMarker
44
{
45
        private static final byte TRIPLEQUOTE1 = Token.INTERNAL_FIRST;
46
        private static final byte TRIPLEQUOTE2 = Token.INTERNAL_LAST;
47

    
48
        public PythonTokenMarker()
49
        {
50
                this.keywords = getKeywords();
51
        }
52

    
53
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
54
        {
55
                char[] array = line.array;
56
                int offset = line.offset;
57
                lastOffset = offset;
58
                lastKeyword = offset;
59
                int length = line.count + offset;
60
                boolean backslash = false;
61

    
62
loop:                for(int i = offset; i < length; i++)
63
                {
64
                        int i1 = (i+1);
65

    
66
                        char c = array[i];
67
                        if(c == '\\')
68
                        {
69
                                backslash = !backslash;
70
                                continue;
71
                        }
72

    
73
                        switch(token)
74
                        {
75
                        case Token.NULL:
76
                                switch(c)
77
                                {
78
                                case '#':
79
                                        if(backslash)
80
                                                backslash = false;
81
                                        else
82
                                        {
83
                                                doKeyword(line,i,c);
84
                                                addToken(i - lastOffset,token);
85
                                                addToken(length - i,Token.COMMENT1);
86
                                                lastOffset = lastKeyword = length;
87
                                                break loop;
88
                                        }
89
                                        break;
90
                                case '"':
91
                                        doKeyword(line,i,c);
92
                                        if(backslash)
93
                                                backslash = false;
94
                                        else
95
                                        {
96
                                                addToken(i - lastOffset,token);
97
                                                if(SyntaxUtilities.regionMatches(false,
98
                                                        line,i1,"\"\""))
99
                                                {
100
                                                        token = TRIPLEQUOTE1;
101
                                                }
102
                                                else
103
                                                {
104
                                                        token = Token.LITERAL1;
105
                                                }
106
                                                lastOffset = lastKeyword = i;
107
                                        }
108
                                        break;
109
                                case '\'':
110
                                        doKeyword(line,i,c);
111
                                        if(backslash)
112
                                                backslash = false;
113
                                        else
114
                                        {
115
                                                addToken(i - lastOffset,token);
116
                                                if(SyntaxUtilities.regionMatches(false,
117
                                                        line,i1,"''"))
118
                                                {
119
                                                        token = TRIPLEQUOTE2;
120
                                                }
121
                                                else
122
                                                {
123
                                                        token = Token.LITERAL2;
124
                                                }
125
                                                lastOffset = lastKeyword = i;
126
                                        }
127
                                        break;
128
                                default:
129
                                        backslash = false;
130
                                        if(!Character.isLetterOrDigit(c)
131
                                                && c != '_')
132
                                                doKeyword(line,i,c);
133
                                        break;
134
                                }
135
                                break;
136
                        case Token.LITERAL1:
137
                                if(backslash)
138
                                        backslash = false;
139
                                else if(c == '"')
140
                                {
141
                                        addToken(i1 - lastOffset,token);
142
                                        token = Token.NULL;
143
                                        lastOffset = lastKeyword = i1;
144
                                }
145
                                break;
146
                        case Token.LITERAL2:
147
                                if(backslash)
148
                                        backslash = false;
149
                                else if(c == '\'')
150
                                {
151
                                        addToken(i1 - lastOffset,Token.LITERAL1);
152
                                        token = Token.NULL;
153
                                        lastOffset = lastKeyword = i1;
154
                                }
155
                                break;
156
                        case TRIPLEQUOTE1:
157
                                if(backslash)
158
                                        backslash = false;
159
                                else if(SyntaxUtilities.regionMatches(false,
160
                                        line,i,"\"\"\""))
161
                                {
162
                                        addToken((i+=4) - lastOffset,
163
                                                Token.LITERAL1);
164
                                        token = Token.NULL;
165
                                        lastOffset = lastKeyword = i;
166
                                }
167
                                break;
168
                        case TRIPLEQUOTE2:
169
                                if(backslash)
170
                                        backslash = false;
171
                                else if(SyntaxUtilities.regionMatches(false,
172
                                        line,i,"'''"))
173
                                {
174
                                        addToken((i+=4) - lastOffset,
175
                                                Token.LITERAL1);
176
                                        token = Token.NULL;
177
                                        lastOffset = lastKeyword = i;
178
                                }
179
                                break;
180
                        default:
181
                                throw new InternalError("Invalid state: "
182
                                        + token);
183
                        }
184
                }
185

    
186
                switch(token)
187
                {
188
                        case TRIPLEQUOTE1:
189
                        case TRIPLEQUOTE2:
190
                                addToken(length - lastOffset,Token.LITERAL1);
191
                                break;
192
                        case Token.NULL:
193
                                doKeyword(line,length,'\0');
194
                        default:
195
                                addToken(length - lastOffset,token);
196
                                break;
197
                }
198

    
199
                return token;
200
        }
201

    
202
        public static KeywordMap getKeywords()
203
        {
204
                if (pyKeywords == null)
205
                {
206
                        pyKeywords = new KeywordMap(false);
207
                        pyKeywords.add("and",Token.KEYWORD3);
208
                        pyKeywords.add("not",Token.KEYWORD3);
209
                        pyKeywords.add("or",Token.KEYWORD3);
210
                        pyKeywords.add("if",Token.KEYWORD1);
211
                        pyKeywords.add("for",Token.KEYWORD1);
212
                        pyKeywords.add("assert",Token.KEYWORD1);
213
                        pyKeywords.add("break",Token.KEYWORD1);
214
                        pyKeywords.add("continue",Token.KEYWORD1);
215
                        pyKeywords.add("elif",Token.KEYWORD1);
216
                        pyKeywords.add("else",Token.KEYWORD1);
217
                        pyKeywords.add("except",Token.KEYWORD1);
218
                        pyKeywords.add("exec",Token.KEYWORD1);
219
                        pyKeywords.add("finally",Token.KEYWORD1);
220
                        pyKeywords.add("raise",Token.KEYWORD1);
221
                        pyKeywords.add("return",Token.KEYWORD1);
222
                        pyKeywords.add("try",Token.KEYWORD1);
223
                        pyKeywords.add("while",Token.KEYWORD1);
224
                        pyKeywords.add("def",Token.KEYWORD2);
225
                        pyKeywords.add("class",Token.KEYWORD2);
226
                        pyKeywords.add("del",Token.KEYWORD2);
227
                        pyKeywords.add("from",Token.KEYWORD2);
228
                        pyKeywords.add("global",Token.KEYWORD2);
229
                        pyKeywords.add("import",Token.KEYWORD2);
230
                        pyKeywords.add("in",Token.KEYWORD2);
231
                        pyKeywords.add("is",Token.KEYWORD2);
232
                        pyKeywords.add("lambda",Token.KEYWORD2);
233
                        pyKeywords.add("pass",Token.KEYWORD2);
234
                        pyKeywords.add("print",Token.KEYWORD2);
235
                }
236
                return pyKeywords;
237
        }
238

    
239
        // private members
240
        private static KeywordMap pyKeywords;
241

    
242
        private KeywordMap keywords;
243
        private int lastOffset;
244
        private int lastKeyword;
245

    
246
        private boolean doKeyword(Segment line, int i, char c)
247
        {
248
                int i1 = i+1;
249

    
250
                int len = i - lastKeyword;
251
                byte id = keywords.lookup(line,lastKeyword,len);
252
                if(id != Token.NULL)
253
                {
254
                        if(lastKeyword != lastOffset)
255
                                addToken(lastKeyword - lastOffset,Token.NULL);
256
                        addToken(len,id);
257
                        lastOffset = i;
258
                }
259
                lastKeyword = i1;
260
                return false;
261
        }
262
}