@@ -78,9 +78,11 @@ func (n *node) find(val string) *node {
78
78
}
79
79
80
80
func (n * node ) asBytes () []byte {
81
- w := new (bytes.Buffer )
82
- level := 0
83
- var levelsEnded []int
81
+ var (
82
+ w = new (bytes.Buffer )
83
+ levelsEnded []int
84
+ max = computeMaxLevel (0 , n )
85
+ )
84
86
if n .parent == nil {
85
87
w .WriteString (n .val )
86
88
if n .meta != "" {
@@ -91,12 +93,12 @@ func (n *node) asBytes() []byte {
91
93
edge := mid
92
94
if len (n .nodes ) == 0 {
93
95
edge = end
94
- levelsEnded = append (levelsEnded , level )
96
+ levelsEnded = append (levelsEnded , 0 )
95
97
}
96
- dumpVals (w , 0 , levelsEnded , edge , n )
98
+ dumpVals (w , 0 , max , levelsEnded , edge , n )
97
99
}
98
100
if len (n .nodes ) > 0 {
99
- dumpNodes (w , level , levelsEnded , n .nodes )
101
+ dumpNodes (w , 0 , max , levelsEnded , n .nodes )
100
102
}
101
103
102
104
return w .Bytes ()
@@ -115,21 +117,36 @@ func (n *node) lastNode() *node {
115
117
return n .nodes [c - 1 ]
116
118
}
117
119
118
- func dumpNodes (w io.Writer , level int , levelsEnded []int , nodes []* node ) {
120
+ func computeMaxLevel (level int , n * node ) int {
121
+ if n == nil || len (n .nodes ) == 0 {
122
+ return level
123
+ }
124
+ var max int
125
+ for _ , n := range n .nodes {
126
+ m := computeMaxLevel (level + 1 , n )
127
+ if m > max {
128
+ max = m
129
+ }
130
+ }
131
+
132
+ return max
133
+ }
134
+
135
+ func dumpNodes (w io.Writer , level , maxLevel int , levelsEnded []int , nodes []* node ) {
119
136
for i , node := range nodes {
120
137
edge := mid
121
138
if i == len (nodes )- 1 {
122
139
levelsEnded = append (levelsEnded , level )
123
140
edge = end
124
141
}
125
- dumpVals (w , level , levelsEnded , edge , node )
142
+ dumpVals (w , level , maxLevel , levelsEnded , edge , node )
126
143
if len (node .nodes ) > 0 {
127
- dumpNodes (w , level + 1 , levelsEnded , node .nodes )
144
+ dumpNodes (w , level + 1 , maxLevel , levelsEnded , node .nodes )
128
145
}
129
146
}
130
147
}
131
148
132
- func dumpVals (w io.Writer , level int , levelsEnded []int , edge decoration , node * node ) {
149
+ func dumpVals (w io.Writer , level , maxLevel int , levelsEnded []int , edge decoration , node * node ) {
133
150
for i := 0 ; i < level ; i ++ {
134
151
if isEnded (levelsEnded , i ) {
135
152
fmt .Fprint (w , strings .Repeat (" " , indentSize + 1 ))
@@ -140,7 +157,10 @@ func dumpVals(w io.Writer, level int, levelsEnded []int, edge decoration, node *
140
157
141
158
val := dumpVal (level , node )
142
159
if node .meta != "" {
143
- c := 4 - level
160
+ c := maxLevel - level
161
+ if c < 0 {
162
+ c = 0
163
+ }
144
164
fmt .Fprintf (w , "%s %-" + strconv .Itoa (leafMaxWidth + c * 2 )+ "s%s%s\n " , edge , val , strings .Repeat (" " , c ), node .meta )
145
165
return
146
166
}
0 commit comments