1 package org.jedit.syntax; 2 3 11 12 import javax.swing.text.Segment ; 13 14 20 public class HTMLTokenMarker extends TokenMarker 21 { 22 public static final byte JAVASCRIPT = Token.INTERNAL_FIRST; 23 24 public HTMLTokenMarker() 25 { 26 this(true); 27 } 28 29 public HTMLTokenMarker(boolean js) 30 { 31 this.js = js; 32 keywords = JavaScriptTokenMarker.getKeywords(); 33 } 34 35 public byte markTokensImpl(byte token, Segment line, int lineIndex) 36 { 37 char[] array = line.array; 38 int offset = line.offset; 39 lastOffset = offset; 40 lastKeyword = offset; 41 int length = line.count + offset; 42 boolean backslash = false; 43 44 loop: for(int i = offset; i < length; i++) 45 { 46 int i1 = (i+1); 47 48 char c = array[i]; 49 if(c == '\\') 50 { 51 backslash = !backslash; 52 continue; 53 } 54 55 switch(token) 56 { 57 case Token.NULL: backslash = false; 59 switch(c) 60 { 61 case '<': 62 addToken(i - lastOffset,token); 63 lastOffset = lastKeyword = i; 64 if(SyntaxUtilities.regionMatches(false, 65 line,i1,"!--")) 66 { 67 i += 3; 68 token = Token.COMMENT1; 69 } 70 else if(js && SyntaxUtilities.regionMatches( 71 true,line,i1,"script>")) 72 { 73 addToken(8,Token.KEYWORD1); 74 lastOffset = lastKeyword = (i += 8); 75 token = JAVASCRIPT; 76 } 77 else 78 { 79 token = Token.KEYWORD1; 80 } 81 break; 82 case '&': 83 addToken(i - lastOffset,token); 84 lastOffset = lastKeyword = i; 85 token = Token.KEYWORD2; 86 break; 87 } 88 break; 89 case Token.KEYWORD1: backslash = false; 91 if(c == '>') 92 { 93 addToken(i1 - lastOffset,token); 94 lastOffset = lastKeyword = i1; 95 token = Token.NULL; 96 } 97 break; 98 case Token.KEYWORD2: backslash = false; 100 if(c == ';') 101 { 102 addToken(i1 - lastOffset,token); 103 lastOffset = lastKeyword = i1; 104 token = Token.NULL; 105 break; 106 } 107 break; 108 case Token.COMMENT1: backslash = false; 110 if(SyntaxUtilities.regionMatches(false,line,i,"-->")) 111 { 112 addToken((i + 3) - lastOffset,token); 113 lastOffset = lastKeyword = i + 3; 114 token = Token.NULL; 115 } 116 break; 117 case JAVASCRIPT: switch(c) 119 { 120 case '<': 121 backslash = false; 122 doKeyword(line,i,c); 123 if(SyntaxUtilities.regionMatches(true, 124 line,i1,"/script>")) 125 { 126 addToken(i - lastOffset, 127 Token.NULL); 128 addToken(9,Token.KEYWORD1); 129 lastOffset = lastKeyword = (i += 9); 130 token = Token.NULL; 131 } 132 break; 133 case '"': 134 if(backslash) 135 backslash = false; 136 else 137 { 138 doKeyword(line,i,c); 139 addToken(i - lastOffset,Token.NULL); 140 lastOffset = lastKeyword = i; 141 token = Token.LITERAL1; 142 } 143 break; 144 case '\'': 145 if(backslash) 146 backslash = false; 147 else 148 { 149 doKeyword(line,i,c); 150 addToken(i - lastOffset,Token.NULL); 151 lastOffset = lastKeyword = i; 152 token = Token.LITERAL2; 153 } 154 break; 155 case '/': 156 backslash = false; 157 doKeyword(line,i,c); 158 if(length - i > 1) 159 { 160 addToken(i - lastOffset,Token.NULL); 161 lastOffset = lastKeyword = i; 162 if(array[i1] == '/') 163 { 164 addToken(length - i,Token.COMMENT2); 165 lastOffset = lastKeyword = length; 166 break loop; 167 } 168 else if(array[i1] == '*') 169 { 170 token = Token.COMMENT2; 171 } 172 } 173 break; 174 default: backslash = false; 175 if(!Character.isLetterOrDigit(c) 176 && c != '_') 177 doKeyword(line,i,c); 178 break; 179 } 180 break; 181 case Token.LITERAL1: if(backslash) 183 backslash = false; 184 else if(c == '"') 185 { 186 addToken(i1 - lastOffset,Token.LITERAL1); 187 lastOffset = lastKeyword = i1; 188 token = JAVASCRIPT; 189 } 190 break; 191 case Token.LITERAL2: if(backslash) 193 backslash = false; 194 else if(c == '\'') 195 { 196 addToken(i1 - lastOffset,Token.LITERAL1); 197 lastOffset = lastKeyword = i1; 198 token = JAVASCRIPT; 199 } 200 break; 201 case Token.COMMENT2: backslash = false; 203 if(c == '*' && length - i > 1 && array[i1] == '/') 204 { 205 addToken((i+=2) - lastOffset,Token.COMMENT2); 206 lastOffset = lastKeyword = i; 207 token = JAVASCRIPT; 208 } 209 break; 210 default: 211 throw new InternalError ("Invalid state: " 212 + token); 213 } 214 } 215 216 switch(token) 217 { 218 case Token.LITERAL1: 219 case Token.LITERAL2: 220 addToken(length - lastOffset,Token.INVALID); 221 token = JAVASCRIPT; 222 break; 223 case Token.KEYWORD2: 224 addToken(length - lastOffset,Token.INVALID); 225 token = Token.NULL; 226 break; 227 case JAVASCRIPT: 228 doKeyword(line,length,'\0'); 229 addToken(length - lastOffset,Token.NULL); 230 break; 231 default: 232 addToken(length - lastOffset,token); 233 break; 234 } 235 236 return token; 237 } 238 239 private KeywordMap keywords; 241 private boolean js; 242 private int lastOffset; 243 private int lastKeyword; 244 245 private boolean doKeyword(Segment line, int i, char c) 246 { 247 int i1 = i+1; 248 249 int len = i - lastKeyword; 250 byte id = keywords.lookup(line,lastKeyword,len); 251 if(id != Token.NULL) 252 { 253 if(lastKeyword != lastOffset) 254 addToken(lastKeyword - lastOffset,Token.NULL); 255 addToken(len,id); 256 lastOffset = i; 257 } 258 lastKeyword = i1; 259 return false; 260 } 261 } 262 | Popular Tags |