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