Statistics
| Revision:

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

History | View | Annotate | Download (6.47 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
 * HTMLTokenMarker.java - HTML token marker
27
 * Copyright (C) 1998, 1999 Slava Pestov
28
 *
29
 * You may use and modify this package for any purpose. Redistribution is
30
 * permitted, in both source and binary form, provided that this notice
31
 * remains intact in all source distributions of this package.
32
 */
33

    
34
import javax.swing.text.Segment;
35

    
36
/**
37
 * HTML token marker.
38
 *
39
 * @author Slava Pestov
40
 * @version $Id$
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 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("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 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
}