File: RegroupingTokenizer.java

package info (click to toggle)
liblessen-java 1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 276 kB
  • sloc: java: 2,981; xml: 31; makefile: 5
file content (93 lines) | stat: -rw-r--r-- 3,187 bytes parent folder | download
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;
            }
        }
    }
}