1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
package com.metaweb.lessen.tokenizers;
import com.metaweb.lessen.tokens.ComponentColor;
import com.metaweb.lessen.tokens.NumericToken;
import com.metaweb.lessen.tokens.Token;
import com.metaweb.lessen.tokens.Token.Type;
public class RegroupingTokenizer implements Tokenizer {
final protected BufferedTokenizer _tokenizer;
protected Token _token;
public RegroupingTokenizer(Tokenizer tokenizer) {
_tokenizer = new BufferedTokenizer(tokenizer);
_token = _tokenizer.getToken();
resolve();
}
@Override
public Token getToken() {
return _token;
}
@Override
public void next() {
_tokenizer.next();
_token = _tokenizer.getToken();
resolve();
}
protected Token eatWhitespaceAndComment(StringBuffer sb) {
Token t;
while ((t = _tokenizer.getToken()) != null && (t.type == Type.Whitespace || t.type == Type.Comment)) {
sb.append(t.text);
_tokenizer.next();
}
return t;
}
protected void resolve() {
if (_token != null) {
if (_token.type == Type.Function &&
(_token.text.equals("rgb(") || _token.text.equals("rgba("))) {
int tokenStart = _token.start;
StringBuffer sb = new StringBuffer();
sb.append(_token.text);
_tokenizer.next();
_token = eatWhitespaceAndComment(sb);
NumericToken[] components = new NumericToken[4];
int component = 0;
while (component < components.length &&
_token != null &&
_token instanceof NumericToken &&
(_token.type == Type.Percentage || _token.type == Type.Number)
) {
components[component++] = (NumericToken) _token;
sb.append(_token.text);
_tokenizer.next();
_token = eatWhitespaceAndComment(sb);
if (_token != null && _token.type == Type.Delimiter && _token.text.equals(",")) {
sb.append(_token.text);
_tokenizer.next();
_token = eatWhitespaceAndComment(sb);
}
}
if (_token != null && _token.type == Type.Delimiter && _token.text.equals(")")) {
sb.append(_token.text);
// don't eat the ). the next time next() is called, it'll do that
}
String text = sb.toString();
Token newToken = new ComponentColor(
tokenStart,
tokenStart += text.length(),
text,
components[0],
components[1],
components[2],
components[3]
);
_token = newToken;
}
}
}
}
|