You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

coalesce.go 780B

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