1. package chroma
    
  2. 
    
  3. // Coalesce is a Lexer interceptor that collapses runs of common types into a single token.
    
  4. func Coalesce(lexer Lexer) Lexer { return &coalescer{lexer} }
    
  5. 
    
  6. type coalescer struct{ Lexer }
    
  7. 
    
  8. func (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. }