coalesce.go

 1package chroma
 2
 3// Coalesce is a Lexer interceptor that collapses runs of common types into a single token.
 4func Coalesce(lexer Lexer) Lexer { return &coalescer{lexer} }
 5
 6type coalescer struct{ Lexer }
 7
 8func (d *coalescer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) {
 9	var prev Token
10	it, err := d.Lexer.Tokenise(options, text)
11	if err != nil {
12		return nil, err
13	}
14	return func() Token {
15		for token := it(); token != (EOF); token = it() {
16			if len(token.Value) == 0 {
17				continue
18			}
19			if prev == EOF {
20				prev = token
21			} else {
22				if prev.Type == token.Type && len(prev.Value) < 8192 {
23					prev.Value += token.Value
24				} else {
25					out := prev
26					prev = token
27					return out
28				}
29			}
30		}
31		out := prev
32		prev = EOF
33		return out
34	}, nil
35}