mirror of https://github.com/gizak/termui.git
fix: #226, unicode strings display in paragraph, table and list
This commit is contained in:
parent
bb0b559103
commit
bbf3bb6797
|
@ -6,6 +6,8 @@ package termui
|
|||
|
||||
import (
|
||||
"image"
|
||||
|
||||
rw "github.com/mattn/go-runewidth"
|
||||
)
|
||||
|
||||
// Cell represents a viewable terminal cell
|
||||
|
@ -65,7 +67,10 @@ func (self *Buffer) Fill(c Cell, rect image.Rectangle) {
|
|||
}
|
||||
|
||||
func (self *Buffer) SetString(s string, style Style, p image.Point) {
|
||||
for i, char := range s {
|
||||
self.SetCell(Cell{char, style}, image.Pt(p.X+i, p.Y))
|
||||
runes := []rune(s)
|
||||
x := 0
|
||||
for _, char := range runes {
|
||||
self.SetCell(Cell{char, style}, image.Pt(p.X+x, p.Y))
|
||||
x += rw.RuneWidth(char)
|
||||
}
|
||||
}
|
||||
|
|
19
utils.go
19
utils.go
|
@ -189,8 +189,9 @@ func CellsToString(cells []Cell) string {
|
|||
func TrimCells(cells []Cell, w int) []Cell {
|
||||
s := CellsToString(cells)
|
||||
s = TrimString(s, w)
|
||||
runes := []rune(s)
|
||||
newCells := []Cell{}
|
||||
for i, r := range s {
|
||||
for i, r := range runes {
|
||||
newCells = append(newCells, Cell{r, cells[i].Style})
|
||||
}
|
||||
return newCells
|
||||
|
@ -212,3 +213,19 @@ func SplitCells(cells []Cell, r rune) [][]Cell {
|
|||
}
|
||||
return splitCells
|
||||
}
|
||||
|
||||
type CellWithX struct {
|
||||
X int
|
||||
Cell Cell
|
||||
}
|
||||
|
||||
func BuildCellChannel(cells []Cell) chan CellWithX {
|
||||
c := make(chan CellWithX, len(cells))
|
||||
index := 0
|
||||
for _, cell := range cells {
|
||||
c <- CellWithX{X: index, Cell: cell}
|
||||
index += rw.RuneWidth(cell.Rune)
|
||||
}
|
||||
close(c)
|
||||
return c
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"image"
|
||||
|
||||
. "github.com/gizak/termui"
|
||||
rw "github.com/mattn/go-runewidth"
|
||||
)
|
||||
|
||||
type List struct {
|
||||
|
@ -57,7 +58,7 @@ func (self *List) Draw(buf *Buffer) {
|
|||
break
|
||||
} else {
|
||||
buf.SetCell(NewCell(cells[j].Rune, style), point)
|
||||
point = point.Add(image.Pt(1, 0))
|
||||
point = point.Add(image.Pt(rw.RuneWidth(cells[j].Rune), 0))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,8 @@ func (self *Paragraph) Draw(buf *Buffer) {
|
|||
break
|
||||
}
|
||||
row = TrimCells(row, self.Inner.Dx())
|
||||
for x, cell := range row {
|
||||
for signal := range BuildCellChannel(row) {
|
||||
x, cell := signal.X, signal.Cell
|
||||
buf.SetCell(cell, image.Pt(x, y).Add(self.Inner.Min))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,7 +74,8 @@ func (self *Table) Draw(buf *Buffer) {
|
|||
col := ParseText(row[j], rowStyle)
|
||||
// draw row cell
|
||||
if len(col) > columnWidths[j] || self.TextAlign == AlignLeft {
|
||||
for k, cell := range col {
|
||||
for signal := range BuildCellChannel(col) {
|
||||
k, cell := signal.X, signal.Cell
|
||||
if k == columnWidths[j] || colXCoordinate+k == self.Inner.Max.X {
|
||||
cell.Rune = ELLIPSES
|
||||
buf.SetCell(cell, image.Pt(colXCoordinate+k-1, yCoordinate))
|
||||
|
@ -86,12 +87,14 @@ func (self *Table) Draw(buf *Buffer) {
|
|||
} else if self.TextAlign == AlignCenter {
|
||||
xCoordinateOffset := (columnWidths[j] - len(col)) / 2
|
||||
stringXCoordinate := xCoordinateOffset + colXCoordinate
|
||||
for k, cell := range col {
|
||||
for signal := range BuildCellChannel(col) {
|
||||
k, cell := signal.X, signal.Cell
|
||||
buf.SetCell(cell, image.Pt(stringXCoordinate+k, yCoordinate))
|
||||
}
|
||||
} else if self.TextAlign == AlignRight {
|
||||
stringXCoordinate := MinInt(colXCoordinate+columnWidths[j], self.Inner.Max.X) - len(col)
|
||||
for k, cell := range col {
|
||||
for signal := range BuildCellChannel(col) {
|
||||
k, cell := signal.X, signal.Cell
|
||||
buf.SetCell(cell, image.Pt(stringXCoordinate+k, yCoordinate))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue