...
1 package chroma
2
3 import "strings"
4
5
6
7
8
9
10 type Iterator func() Token
11
12
13 func (i Iterator) Tokens() []Token {
14 var out []Token
15 for t := i(); t != EOF; t = i() {
16 out = append(out, t)
17 }
18 return out
19 }
20
21
22 func Concaterator(iterators ...Iterator) Iterator {
23 return func() Token {
24 for len(iterators) > 0 {
25 t := iterators[0]()
26 if t != EOF {
27 return t
28 }
29 iterators = iterators[1:]
30 }
31 return EOF
32 }
33 }
34
35
36 func Literator(tokens ...Token) Iterator {
37 return func() Token {
38 if len(tokens) == 0 {
39 return EOF
40 }
41 token := tokens[0]
42 tokens = tokens[1:]
43 return token
44 }
45 }
46
47
48 func SplitTokensIntoLines(tokens []Token) (out [][]Token) {
49 var line []Token
50 for _, token := range tokens {
51 for strings.Contains(token.Value, "\n") {
52 parts := strings.SplitAfterN(token.Value, "\n", 2)
53
54 token.Value = parts[1]
55
56
57 clone := token.Clone()
58 clone.Value = parts[0]
59 line = append(line, clone)
60 out = append(out, line)
61 line = nil
62 }
63 line = append(line, token)
64 }
65 if len(line) > 0 {
66 out = append(out, line)
67 }
68
69 if len(out) > 0 {
70 last := out[len(out)-1]
71 if len(last) == 1 && last[0].Value == "" {
72 out = out[:len(out)-1]
73 }
74 }
75 return
76 }
77
View as plain text