1 package org.jedit.syntax; 2 3 import javax.swing.text.Segment ; 4 5 11 public class XMLTokenMarker extends TokenMarker { 12 public XMLTokenMarker() { 13 } 14 15 public byte markTokensImpl(byte token, Segment line, int lineIndex) { 16 char[] array = line.array; 17 int offset = line.offset; 18 int lastOffset = offset; 19 int length = line.count + offset; 20 21 boolean sk1 = token == Token.KEYWORD1; 23 24 for ( int i = offset; i < length; i++ ) { 25 int ip1 = i+1; 26 char c = array[i]; 27 switch ( token ) { 28 case Token.NULL: switch ( c ) { 30 case '<': 31 addToken(i-lastOffset, token); 32 lastOffset = i; 33 if ( SyntaxUtilities.regionMatches(false, line, ip1, "!--") ) { 34 i += 3; 35 token = Token.COMMENT1; 36 } 37 else if ( array[ip1] == '!' ) { 38 i += 1; 39 token = Token.COMMENT2; 40 } 41 else if ( array[ip1] == '?' ) { 42 i += 1; 43 token = Token.KEYWORD3; 44 } 45 else 46 token = Token.KEYWORD1; 47 break; 48 49 case '&': 50 addToken(i - lastOffset, token); 51 lastOffset = i; 52 token = Token.LABEL; 53 break; 54 } 55 break; 56 57 case Token.KEYWORD1: switch ( c ) { 59 case '>': 60 addToken(ip1-lastOffset, token); 61 lastOffset = ip1; 62 token = Token.NULL; 63 sk1 = false; 64 break; 65 66 case ' ': 67 case '\t': 68 addToken(i-lastOffset, token); 69 lastOffset = i; 70 token = Token.KEYWORD2; 71 sk1 = false; 72 break; 73 74 default: 75 if ( sk1 ) { 76 token = Token.KEYWORD2; 77 sk1 = false; 78 } 79 break; 80 } 81 break; 82 83 case Token.KEYWORD2: switch ( c ) { 85 case '>': 86 addToken(ip1-lastOffset, token); 87 lastOffset = ip1; 88 token = Token.NULL; 89 break; 90 91 case '/': 92 addToken(i-lastOffset, token); 93 lastOffset = i; 94 token = Token.KEYWORD1; 95 break; 96 97 case '=': 98 addToken(i-lastOffset, token); 99 lastOffset = i; 100 token = Token.OPERATOR; 101 } 102 break; 103 104 case Token.OPERATOR: switch ( c ) { 106 case '\"': 107 case '\'': 108 addToken(i-lastOffset, token); 109 lastOffset = i; 110 if ( c == '\"' ) 111 token = Token.LITERAL1; 112 else 113 token = Token.LITERAL2; 114 break; 115 } 116 break; 117 118 case Token.LITERAL1: 119 case Token.LITERAL2: if ( ( token == Token.LITERAL1 && c == '\"' ) 121 || ( token == Token.LITERAL2 && c == '\'' ) ) { 122 addToken(ip1-lastOffset, token); 123 lastOffset = ip1; 124 token = Token.KEYWORD1; 125 } 126 break; 127 128 case Token.LABEL: if ( c == ';' ) { 130 addToken(ip1-lastOffset, token); 131 lastOffset = ip1; 132 token = Token.NULL; 133 break; 134 } 135 break; 136 137 case Token.COMMENT1: if ( SyntaxUtilities.regionMatches(false, line, i, "-->") ) { 139 addToken((i+3)-lastOffset, token); 140 lastOffset = i+3; 141 token = Token.NULL; 142 } 143 break; 144 145 case Token.COMMENT2: if ( SyntaxUtilities.regionMatches(false, line, i, ">") ) { 147 addToken(ip1-lastOffset, token); 148 lastOffset = ip1; 149 token = Token.NULL; 150 } 151 break; 152 153 case Token.KEYWORD3: if ( SyntaxUtilities.regionMatches(false, line, i, "?>") ) { 155 addToken((i+2)-lastOffset, token); 156 lastOffset = i+2; 157 token = Token.NULL; 158 } 159 break; 160 161 default: 162 throw new InternalError ("Invalid state: " + token); 163 } 164 } 165 166 switch ( token ) { 167 case Token.LABEL: 168 addToken(length-lastOffset, Token.INVALID); 169 token = Token.NULL; 170 break; 171 172 default: 173 addToken(length-lastOffset, token); 174 break; 175 } 176 177 return token; 178 } 179 } 180 181 182 | Popular Tags |