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 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: 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: 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: 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: 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: 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: 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: 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: 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 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 } 284 | Popular Tags |