1 package org.jedit.syntax; 2 3 12 13 import javax.swing.text.Segment ; 14 15 21 public class PHPTokenMarker extends TokenMarker 22 { 23 public static final byte SCRIPT = Token.INTERNAL_FIRST; 24 25 public byte markTokensImpl(byte token, Segment 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: 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: 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: 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: 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: switch(c) 124 { 125 case '<': 126 backslash = false; 127 doKeyword(line,i,c); 128 if(SyntaxUtilities.regionMatches(true, 129 line,i1,"/script>")) 130 { 131 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 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 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 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) 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 addToken(i - lastOffset, Token.KEYWORD3); 216 addToken(1,Token.OPERATOR); 217 lastOffset = lastKeyword = i1; 218 } 219 } 220 else 221 { 222 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 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: 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: 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: 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 ("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 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 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 |