@@ -2,6 +2,7 @@ package tblfmt
2
2
3
3
import (
4
4
"bufio"
5
+ "bytes"
5
6
"encoding/csv"
6
7
"encoding/json"
7
8
"fmt"
@@ -39,6 +40,9 @@ type TableEncoder struct {
39
40
// lineStyle is the table line style.
40
41
lineStyle LineStyle
41
42
43
+ // rowStyles is the table of row style.
44
+ rowStyles map [[4 ]rune ]rowStyle
45
+
42
46
// formatter handles formatting values prior to output.
43
47
formatter Formatter
44
48
@@ -94,6 +98,7 @@ func NewTableEncoder(resultSet ResultSet, opts ...Option) (Encoder, error) {
94
98
border : 1 ,
95
99
tab : 8 ,
96
100
lineStyle : ASCIILineStyle (),
101
+ rowStyles : make (map [[4 ]rune ]rowStyle ),
97
102
formatter : NewEscapeFormatter (WithHeaderAlign (AlignCenter )),
98
103
summary : DefaultTableSummary (),
99
104
empty : & Value {
@@ -117,6 +122,7 @@ func NewTableEncoder(resultSet ResultSet, opts ...Option) (Encoder, error) {
117
122
enc .lineStyle .Wrap ,
118
123
enc .lineStyle .End ,
119
124
} {
125
+ enc .rowStyles [l ] = enc .rowStyle (l )
120
126
for _ , r := range l {
121
127
if r != 0 && runewidth .RuneWidth (r ) != 1 {
122
128
return nil , ErrInvalidLineStyle
@@ -214,7 +220,7 @@ func (enc *TableEncoder) Encode(w io.Writer) error {
214
220
215
221
// draw end border
216
222
if enc .border >= 2 {
217
- enc .divider (enc .rowStyle ( enc .lineStyle .End ) )
223
+ enc .divider (enc .rowStyles [ enc .lineStyle .End ] )
218
224
}
219
225
}
220
226
@@ -239,7 +245,7 @@ func (enc *TableEncoder) initBuffers() {
239
245
}
240
246
241
247
func (enc * TableEncoder ) encodeVals (vals [][]* Value ) error {
242
- rs := enc .rowStyle ( enc .lineStyle .Row )
248
+ rs := enc .rowStyles [ enc .lineStyle .Row ]
243
249
// print buffered vals
244
250
for i := 0 ; i < len (vals ); i ++ {
245
251
enc .row (vals [i ], rs )
@@ -308,7 +314,7 @@ func (enc *TableEncoder) nextResults() ([][]*Value, error) {
308
314
func (enc * TableEncoder ) calcWidth (vals [][]* Value ) {
309
315
// calc offsets and widths for this batch of rows
310
316
var offset int
311
- rs := enc .rowStyle ( enc .lineStyle .Row )
317
+ rs := enc .rowStyles [ enc .lineStyle .Row ]
312
318
offset += runewidth .StringWidth (string (rs .left ))
313
319
for i , h := range enc .headers {
314
320
if i != 0 {
@@ -339,7 +345,7 @@ func (enc *TableEncoder) calcWidth(vals [][]*Value) {
339
345
}
340
346
341
347
func (enc * TableEncoder ) header () {
342
- rs := enc .rowStyle ( enc .lineStyle .Row )
348
+ rs := enc .rowStyles [ enc .lineStyle .Row ]
343
349
344
350
if enc .title != nil && enc .title .Width != 0 {
345
351
maxWidth := ((enc .tableWidth () - enc .title .Width ) / 2 ) + enc .title .Width
@@ -348,20 +354,20 @@ func (enc *TableEncoder) header() {
348
354
}
349
355
// draw top border
350
356
if enc .border >= 2 && ! enc .inline {
351
- enc .divider (enc .rowStyle ( enc .lineStyle .Top ) )
357
+ enc .divider (enc .rowStyles [ enc .lineStyle .Top ] )
352
358
}
353
359
354
360
// draw the header row with top border style
355
361
if enc .inline {
356
- rs = enc .rowStyle ( enc .lineStyle .Top )
362
+ rs = enc .rowStyles [ enc .lineStyle .Top ]
357
363
}
358
364
359
365
// write header
360
366
enc .row (enc .headers , rs )
361
367
362
368
if ! enc .inline {
363
369
// draw mid divider
364
- enc .divider (enc .rowStyle ( enc .lineStyle .Mid ) )
370
+ enc .divider (enc .rowStyles [ enc .lineStyle .Mid ] )
365
371
}
366
372
}
367
373
@@ -400,14 +406,15 @@ func (enc TableEncoder) rowStyle(r [4]rune) rowStyle {
400
406
middle = string (r [2 ]) + spacer
401
407
}
402
408
403
- return rowStyle {
409
+ rs := rowStyle {
404
410
left : []byte (left ),
405
411
wrapper : []byte (string (enc .lineStyle .Wrap [1 ])),
406
412
middle : []byte (middle ),
407
413
right : []byte (right + string (enc .newline )),
408
- filler : []byte (filler ),
414
+ filler : bytes . Repeat ( []byte (filler ), 8 )[: len ( filler )] ,
409
415
hasWrapping : runewidth .RuneWidth (enc .lineStyle .Row [1 ]) > 0 ,
410
416
}
417
+ return rs
411
418
}
412
419
413
420
// scanAndFormat scans and formats values from the result set.
@@ -449,7 +456,7 @@ func (enc *TableEncoder) divider(rs rowStyle) {
449
456
450
457
// tableWidth calculates total table width.
451
458
func (enc * TableEncoder ) tableWidth () int {
452
- rs := enc .rowStyle ( enc .lineStyle .Mid )
459
+ rs := enc .rowStyles [ enc .lineStyle .Mid ]
453
460
width := runewidth .StringWidth (string (rs .left )) + runewidth .StringWidth (string (rs .right ))
454
461
455
462
for i , w := range enc .maxWidths {
@@ -682,7 +689,7 @@ func (enc *ExpandedEncoder) Encode(w io.Writer) error {
682
689
}
683
690
684
691
func (enc * ExpandedEncoder ) encodeVals (vals [][]* Value ) error {
685
- rs := enc .rowStyle ( enc .lineStyle .Row )
692
+ rs := enc .rowStyles [ enc .lineStyle .Row ]
686
693
// print buffered vals
687
694
for i := 0 ; i < len (vals ); i ++ {
688
695
enc .record (i , vals [i ], rs )
@@ -701,7 +708,7 @@ func (enc *ExpandedEncoder) encodeVals(vals [][]*Value) error {
701
708
702
709
// draw end border
703
710
if enc .border >= 2 && enc .scanCount != 0 {
704
- enc .divider (enc .rowStyle ( enc .lineStyle .End ) )
711
+ enc .divider (enc .rowStyles [ enc .lineStyle .End ] )
705
712
}
706
713
return nil
707
714
}
@@ -732,7 +739,7 @@ func (enc *ExpandedEncoder) EncodeAll(w io.Writer) error {
732
739
}
733
740
734
741
func (enc * ExpandedEncoder ) calcWidth (vals [][]* Value ) {
735
- rs := enc .rowStyle ( enc .lineStyle .Row )
742
+ rs := enc .rowStyles [ enc .lineStyle .Row ]
736
743
737
744
offset := runewidth .StringWidth (string (rs .left ))
738
745
@@ -770,9 +777,9 @@ func (enc *ExpandedEncoder) record(i int, vals []*Value, rs rowStyle) {
770
777
headerRS := rs
771
778
header := enc .recordHeader (i )
772
779
if enc .border != 0 {
773
- headerRS = enc .rowStyle ( enc .lineStyle .Top )
780
+ headerRS = enc .rowStyles [ enc .lineStyle .Top ]
774
781
if i != 0 {
775
- headerRS = enc .rowStyle ( enc .lineStyle .Mid )
782
+ headerRS = enc .rowStyles [ enc .lineStyle .Mid ]
776
783
}
777
784
}
778
785
0 commit comments