Skip to content

Commit c454a0a

Browse files
authored
feat(tables): add markdown and ascii border style for tables (#480)
1 parent 341996d commit c454a0a

10 files changed

+195
-8
lines changed

โ€ŽREADME.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,42 @@ fmt.Println(t)
467467
> [!WARNING]
468468
> Table `Rows` need to be declared before `Offset` otherwise it does nothing.
469469
470+
### Table Borders
471+
472+
There are helpers to generate tables in markdown or ASCII style:
473+
474+
#### Markdown Table
475+
476+
```go
477+
table.New().Border(lipgloss.MarkdownBorder()).BorderTop(false).BorderBottom(false)
478+
```
479+
480+
```
481+
| LANGUAGE | FORMAL | INFORMAL |
482+
|----------|--------------|-----------|
483+
| Chinese | Nวn hวŽo | Nว hวŽo |
484+
| French | Bonjour | Salut |
485+
| Russian | Zdravstvuyte | Privet |
486+
| Spanish | Hola | ยฟQuรฉ tal? |
487+
```
488+
489+
#### ASCII Table
490+
491+
```go
492+
table.New().Border(lipgloss.ASCIIBorder())
493+
```
494+
495+
```
496+
+----------+--------------+-----------+
497+
| LANGUAGE | FORMAL | INFORMAL |
498+
+----------+--------------+-----------+
499+
| Chinese | Nวn hวŽo | Nว hวŽo |
500+
| French | Bonjour | Salut |
501+
| Russian | Zdravstvuyte | Privet |
502+
| Spanish | Hola | ยฟQuรฉ tal? |
503+
+----------+--------------+-----------+
504+
```
505+
470506
For more on tables see [the docs](https://pkg.go.dev/github.com/charmbracelet/lipgloss?tab=doc) and [examples](https://github.com/charmbracelet/lipgloss/tree/master/examples/table).
471507

472508
## Rendering Lists

โ€Žborders.go

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,19 @@ var (
100100
}
101101

102102
blockBorder = Border{
103-
Top: "โ–ˆ",
104-
Bottom: "โ–ˆ",
105-
Left: "โ–ˆ",
106-
Right: "โ–ˆ",
107-
TopLeft: "โ–ˆ",
108-
TopRight: "โ–ˆ",
109-
BottomLeft: "โ–ˆ",
110-
BottomRight: "โ–ˆ",
103+
Top: "โ–ˆ",
104+
Bottom: "โ–ˆ",
105+
Left: "โ–ˆ",
106+
Right: "โ–ˆ",
107+
TopLeft: "โ–ˆ",
108+
TopRight: "โ–ˆ",
109+
BottomLeft: "โ–ˆ",
110+
BottomRight: "โ–ˆ",
111+
MiddleLeft: "โ–ˆ",
112+
MiddleRight: "โ–ˆ",
113+
Middle: "โ–ˆ",
114+
MiddleTop: "โ–ˆ",
115+
MiddleBottom: "โ–ˆ",
111116
}
112117

113118
outerHalfBlockBorder = Border{
@@ -179,6 +184,38 @@ var (
179184
MiddleTop: " ",
180185
MiddleBottom: " ",
181186
}
187+
188+
markdownBorder = Border{
189+
Top: "-",
190+
Bottom: "-",
191+
Left: "|",
192+
Right: "|",
193+
TopLeft: "|",
194+
TopRight: "|",
195+
BottomLeft: "|",
196+
BottomRight: "|",
197+
MiddleLeft: "|",
198+
MiddleRight: "|",
199+
Middle: "|",
200+
MiddleTop: "|",
201+
MiddleBottom: "|",
202+
}
203+
204+
asciiBorder = Border{
205+
Top: "-",
206+
Bottom: "-",
207+
Left: "|",
208+
Right: "|",
209+
TopLeft: "+",
210+
TopRight: "+",
211+
BottomLeft: "+",
212+
BottomRight: "+",
213+
MiddleLeft: "+",
214+
MiddleRight: "+",
215+
Middle: "+",
216+
MiddleTop: "+",
217+
MiddleBottom: "+",
218+
}
182219
)
183220

184221
// NormalBorder returns a standard-type border with a normal weight and 90
@@ -226,6 +263,21 @@ func HiddenBorder() Border {
226263
return hiddenBorder
227264
}
228265

266+
// MarkdownBorder return a table border in markdown style.
267+
//
268+
// Make sure to disable top and bottom border for the best result. This will
269+
// ensure that the output is valid markdown.
270+
//
271+
// table.New().Border(lipgloss.MarkdownBorder()).BorderTop(false).BorderBottom(false)
272+
func MarkdownBorder() Border {
273+
return markdownBorder
274+
}
275+
276+
// ASCIIBorder returns a table border with ASCII characters.
277+
func ASCIIBorder() Border {
278+
return asciiBorder
279+
}
280+
229281
func (s Style) applyBorder(str string) string {
230282
var (
231283
border = s.getBorderStyle()

โ€Žtable/table_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,6 +1716,44 @@ func stripString(str string) string {
17161716
return strings.Join(lines, "\n")
17171717
}
17181718

1719+
func TestBorderStyles(t *testing.T) {
1720+
rows := [][]string{
1721+
{"Chinese", "Nวn hวŽo", "Nว hวŽo"},
1722+
{"French", "Bonjour", "Salut"},
1723+
{"Japanese", "ใ“ใ‚“ใซใกใฏ", "ใ‚„ใ‚"},
1724+
{"Russian", "Zdravstvuyte", "Privet"},
1725+
{"Spanish", "Hola", "ยฟQuรฉ tal?"},
1726+
}
1727+
1728+
tests := []struct {
1729+
name string
1730+
borderFunc func() lipgloss.Border
1731+
topBottomBorders bool
1732+
}{
1733+
{"NormalBorder", lipgloss.NormalBorder, true},
1734+
{"RoundedBorder", lipgloss.RoundedBorder, true},
1735+
{"BlockBorder", lipgloss.BlockBorder, true},
1736+
{"ThickBorder", lipgloss.ThickBorder, true},
1737+
{"HiddenBorder", lipgloss.HiddenBorder, true},
1738+
{"MarkdownBorder", lipgloss.MarkdownBorder, false},
1739+
{"ASCIIBorder", lipgloss.ASCIIBorder, true},
1740+
}
1741+
1742+
for _, test := range tests {
1743+
t.Run(test.name, func(t *testing.T) {
1744+
table := New().
1745+
StyleFunc(TableStyle).
1746+
Border(test.borderFunc()).
1747+
Headers("LANGUAGE", "FORMAL", "INFORMAL").
1748+
Rows(rows...).
1749+
BorderTop(test.topBottomBorders).
1750+
BorderBottom(test.topBottomBorders)
1751+
1752+
golden.RequireEqual(t, []byte(table.String()))
1753+
})
1754+
}
1755+
}
1756+
17191757
// Examples
17201758

17211759
func ExampleTable_Wrap() {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
+----------+--------------+-----------+
2+
| LANGUAGE | FORMAL | INFORMAL |
3+
+----------+--------------+-----------+
4+
| Chinese | Nวn hวŽo | Nว hวŽo |
5+
| French | Bonjour | Salut |
6+
| Japanese | ใ“ใ‚“ใซใกใฏ | ใ‚„ใ‚ |
7+
| Russian | Zdravstvuyte | Privet |
8+
| Spanish | Hola | ยฟQuรฉ tal? |
9+
+----------+--------------+-----------+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
2+
โ–ˆ LANGUAGE โ–ˆ FORMAL โ–ˆ INFORMAL โ–ˆ
3+
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
4+
โ–ˆ Chinese โ–ˆ Nวn hวŽo โ–ˆ Nว hวŽo โ–ˆ
5+
โ–ˆ French โ–ˆ Bonjour โ–ˆ Salut โ–ˆ
6+
โ–ˆ Japanese โ–ˆ ใ“ใ‚“ใซใกใฏ โ–ˆ ใ‚„ใ‚ โ–ˆ
7+
โ–ˆ Russian โ–ˆ Zdravstvuyte โ–ˆ Privet โ–ˆ
8+
โ–ˆ Spanish โ–ˆ Hola โ–ˆ ยฟQuรฉ tal? โ–ˆ
9+
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
LANGUAGE FORMAL INFORMAL
3+
4+
Chinese Nวn hวŽo Nว hวŽo
5+
French Bonjour Salut
6+
Japanese ใ“ใ‚“ใซใกใฏ ใ‚„ใ‚
7+
Russian Zdravstvuyte Privet
8+
Spanish Hola ยฟQuรฉ tal?
9+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
| LANGUAGE | FORMAL | INFORMAL |
2+
|----------|--------------|-----------|
3+
| Chinese | Nวn hวŽo | Nว hวŽo |
4+
| French | Bonjour | Salut |
5+
| Japanese | ใ“ใ‚“ใซใกใฏ | ใ‚„ใ‚ |
6+
| Russian | Zdravstvuyte | Privet |
7+
| Spanish | Hola | ยฟQuรฉ tal? |
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2+
โ”‚ LANGUAGE โ”‚ FORMAL โ”‚ INFORMAL โ”‚
3+
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
4+
โ”‚ Chinese โ”‚ Nวn hวŽo โ”‚ Nว hวŽo โ”‚
5+
โ”‚ French โ”‚ Bonjour โ”‚ Salut โ”‚
6+
โ”‚ Japanese โ”‚ ใ“ใ‚“ใซใกใฏ โ”‚ ใ‚„ใ‚ โ”‚
7+
โ”‚ Russian โ”‚ Zdravstvuyte โ”‚ Privet โ”‚
8+
โ”‚ Spanish โ”‚ Hola โ”‚ ยฟQuรฉ tal? โ”‚
9+
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
2+
โ”‚ LANGUAGE โ”‚ FORMAL โ”‚ INFORMAL โ”‚
3+
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
4+
โ”‚ Chinese โ”‚ Nวn hวŽo โ”‚ Nว hวŽo โ”‚
5+
โ”‚ French โ”‚ Bonjour โ”‚ Salut โ”‚
6+
โ”‚ Japanese โ”‚ ใ“ใ‚“ใซใกใฏ โ”‚ ใ‚„ใ‚ โ”‚
7+
โ”‚ Russian โ”‚ Zdravstvuyte โ”‚ Privet โ”‚
8+
โ”‚ Spanish โ”‚ Hola โ”‚ ยฟQuรฉ tal? โ”‚
9+
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
2+
โ”ƒ LANGUAGE โ”ƒ FORMAL โ”ƒ INFORMAL โ”ƒ
3+
โ”ฃโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ซ
4+
โ”ƒ Chinese โ”ƒ Nวn hวŽo โ”ƒ Nว hวŽo โ”ƒ
5+
โ”ƒ French โ”ƒ Bonjour โ”ƒ Salut โ”ƒ
6+
โ”ƒ Japanese โ”ƒ ใ“ใ‚“ใซใกใฏ โ”ƒ ใ‚„ใ‚ โ”ƒ
7+
โ”ƒ Russian โ”ƒ Zdravstvuyte โ”ƒ Privet โ”ƒ
8+
โ”ƒ Spanish โ”ƒ Hola โ”ƒ ยฟQuรฉ tal? โ”ƒ
9+
โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›

0 commit comments

Comments
ย (0)