From 2a6767080f9f38c1571d38cc7e269d6b990bd624 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Thu, 11 Jul 2024 17:23:29 -0400 Subject: [PATCH] Drop Tree (#330) * fix: move tree to internal * feat: tree indenter on lists * fix: sublist example * fix: remove tree --- examples/go.mod | 2 -- examples/list/sublist/main.go | 29 ++++++++--------- examples/tree/background/main.go | 41 ------------------------ examples/tree/files/main.go | 28 ---------------- examples/tree/rounded/main.go | 41 ------------------------ examples/tree/simple/main.go | 28 ---------------- examples/tree/styles/main.go | 27 ---------------- {tree => internal/tree}/children.go | 0 {tree => internal/tree}/enumerator.go | 0 {tree => internal/tree}/renderer.go | 0 {tree => internal/tree}/tree.go | 0 {tree => internal/tree}/tree_test.go | 2 +- list/enumerator.go | 46 +++++++++++++++++++++++++++ list/list.go | 37 +++++++++++++++++++-- list/list_test.go | 2 +- 15 files changed, 96 insertions(+), 187 deletions(-) delete mode 100644 examples/tree/background/main.go delete mode 100644 examples/tree/files/main.go delete mode 100644 examples/tree/rounded/main.go delete mode 100644 examples/tree/simple/main.go delete mode 100644 examples/tree/styles/main.go rename {tree => internal/tree}/children.go (100%) rename {tree => internal/tree}/enumerator.go (100%) rename {tree => internal/tree}/renderer.go (100%) rename {tree => internal/tree}/tree.go (100%) rename {tree => internal/tree}/tree_test.go (99%) diff --git a/examples/go.mod b/examples/go.mod index 4ea677a..64150bc 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -4,8 +4,6 @@ go 1.19 replace github.com/charmbracelet/lipgloss => ../ -replace github.com/charmbracelet/lipgloss/tree => ../tree - replace github.com/charmbracelet/lipgloss/list => ../list require ( diff --git a/examples/list/sublist/main.go b/examples/list/sublist/main.go index 56246e1..3f0a48c 100644 --- a/examples/list/sublist/main.go +++ b/examples/list/sublist/main.go @@ -6,7 +6,6 @@ import ( "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/list" "github.com/charmbracelet/lipgloss/table" - "github.com/charmbracelet/lipgloss/tree" "github.com/lucasb-eyer/go-colorful" ) @@ -119,16 +118,16 @@ func main() { Item("Lip Gloss"). Item("Lip Gloss"). Item( - tree.New(). + list.New(). EnumeratorStyle(lipgloss.NewStyle().Foreground(lipgloss.Color(colors[4][0])).MarginRight(1)). - Child("\nStyle Definitions for Nice Terminal Layouts\n─────"). - Child("From Charm"). - Child("https://github.com/charmbracelet/lipgloss"). - Child( - tree.New(). + Item("\nStyle Definitions for Nice Terminal Layouts\n─────"). + Item("From Charm"). + Item("https://github.com/charmbracelet/lipgloss"). + Item( + list.New(). EnumeratorStyle(lipgloss.NewStyle().Foreground(lipgloss.Color(colors[3][0])).MarginRight(1)). - Child("Emperors: Julio-Claudian dynasty"). - Child( + Item("Emperors: Julio-Claudian dynasty"). + Item( lipgloss.NewStyle().Padding(1).Render( list.New( "Augustus", @@ -139,7 +138,7 @@ func main() { ).Enumerator(list.Roman).String(), ), ). - Child( + Item( lipgloss.NewStyle(). Bold(true). Foreground(lipgloss.Color("#FAFAFA")). @@ -151,7 +150,7 @@ func main() { Width(40). Render(history), ). - Child( + Item( table.New(). Width(30). BorderStyle(purple.MarginRight(0)). @@ -174,8 +173,8 @@ func main() { Row("Orange", "2"). Row("Strawberry", "12"), ). - Child("Documents"). - Child( + Item("Documents"). + Item( list.New(). Enumerator(func(_ list.Items, i int) string { if i == 1 { @@ -200,9 +199,9 @@ func main() { Item("Baz Document\n" + faint.Render("10 minutes ago")). Item("Qux Document\n" + faint.Render("1 month ago")), ). - Child("EOF"), + Item("EOF"), ). - Child("go get github.com/charmbracelet/lipgloss/list\n"), + Item("go get github.com/charmbracelet/lipgloss/list\n"), ). Item("See ya later"), ), diff --git a/examples/tree/background/main.go b/examples/tree/background/main.go deleted file mode 100644 index 0955383..0000000 --- a/examples/tree/background/main.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/charmbracelet/lipgloss" - "github.com/charmbracelet/lipgloss/tree" -) - -func main() { - enumeratorStyle := lipgloss.NewStyle(). - Background(lipgloss.Color("0")). - Padding(0, 1) - - headerItemStyle := lipgloss.NewStyle(). - Background(lipgloss.Color("#ee6ff8")). - Foreground(lipgloss.Color("#ecfe65")). - Bold(true). - Padding(0, 1) - - itemStyle := headerItemStyle.Background(lipgloss.Color("0")) - - t := tree.New(). - ItemStyle(itemStyle). - EnumeratorStyle(enumeratorStyle). - Root("# Table of Contents"). - Child( - tree.New(). - Root("## Chapter 1"). - Child("Chapter 1.1"). - Child("Chapter 1.2"), - ). - Child( - tree.New(). - Root("## Chapter 2"). - Child("Chapter 2.1"). - Child("Chapter 2.2"), - ) - - fmt.Println(t) -} diff --git a/examples/tree/files/main.go b/examples/tree/files/main.go deleted file mode 100644 index 2f274ad..0000000 --- a/examples/tree/files/main.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/charmbracelet/lipgloss" - "github.com/charmbracelet/lipgloss/tree" -) - -func main() { - enumeratorStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("240")).PaddingRight(1) - itemStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("99")).Bold(true).PaddingRight(1) - - t := tree.New().Root(".").EnumeratorStyle(enumeratorStyle).ItemStyle(itemStyle) - _ = filepath.Walk(".", func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.IsDir() { - t.Child(tree.New().Root(path)) - } - return nil - }) - - fmt.Println(t) -} diff --git a/examples/tree/rounded/main.go b/examples/tree/rounded/main.go deleted file mode 100644 index 2ab3e6c..0000000 --- a/examples/tree/rounded/main.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/charmbracelet/lipgloss" - "github.com/charmbracelet/lipgloss/tree" -) - -func main() { - itemStyle := lipgloss.NewStyle().MarginRight(1) - enumeratorStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("8")).MarginRight(1) - - t := tree.New(). - Root("Groceries"). - Child( - tree.New(). - Root("Fruits"). - Child( - "Blood Orange", - "Papaya", - "Dragonfruit", - "Yuzu", - ), - tree.New(). - Root("Items"). - Child( - "Cat Food", - "Nutella", - "Powdered Sugar", - ), - tree.New(). - Root("Veggies"). - Child( - "Leek", - "Artichoke", - ), - ).ItemStyle(itemStyle).EnumeratorStyle(enumeratorStyle).Enumerator(tree.RoundedEnumerator) - - fmt.Println(t) -} diff --git a/examples/tree/simple/main.go b/examples/tree/simple/main.go deleted file mode 100644 index f636224..0000000 --- a/examples/tree/simple/main.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/charmbracelet/lipgloss/tree" -) - -func main() { - t := tree.New(). - Root("."). - Child("Item 1"). - Child( - tree.New(). - Root("Item 2"). - Child("Item 2.1"). - Child("Item 2.2"). - Child("Item 2.3"), - ). - Child( - tree.New(). - Root("Item 3"). - Child("Item 3.1"). - Child("Item 3.2"), - ) - - fmt.Println(t) -} diff --git a/examples/tree/styles/main.go b/examples/tree/styles/main.go deleted file mode 100644 index 2a24b36..0000000 --- a/examples/tree/styles/main.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/charmbracelet/lipgloss" - "github.com/charmbracelet/lipgloss/tree" -) - -func main() { - purple := lipgloss.NewStyle().Foreground(lipgloss.Color("99")).MarginRight(1) - pink := lipgloss.NewStyle().Foreground(lipgloss.Color("212")).MarginRight(1) - - t := tree.New(). - Child( - "Glossier", - "Claire’s Boutique", - tree.New(). - Root("Nyx"). - Child("Lip Gloss", "Foundation"). - EnumeratorStyle(pink), - "Mac", - "Milk", - ). - EnumeratorStyle(purple) - fmt.Println(t) -} diff --git a/tree/children.go b/internal/tree/children.go similarity index 100% rename from tree/children.go rename to internal/tree/children.go diff --git a/tree/enumerator.go b/internal/tree/enumerator.go similarity index 100% rename from tree/enumerator.go rename to internal/tree/enumerator.go diff --git a/tree/renderer.go b/internal/tree/renderer.go similarity index 100% rename from tree/renderer.go rename to internal/tree/renderer.go diff --git a/tree/tree.go b/internal/tree/tree.go similarity index 100% rename from tree/tree.go rename to internal/tree/tree.go diff --git a/tree/tree_test.go b/internal/tree/tree_test.go similarity index 99% rename from tree/tree_test.go rename to internal/tree/tree_test.go index d540bcf..654b5b4 100644 --- a/tree/tree_test.go +++ b/internal/tree/tree_test.go @@ -7,9 +7,9 @@ import ( "github.com/aymanbagabas/go-udiff" "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/internal/tree" "github.com/charmbracelet/lipgloss/list" "github.com/charmbracelet/lipgloss/table" - "github.com/charmbracelet/lipgloss/tree" ) func TestTree(t *testing.T) { diff --git a/list/enumerator.go b/list/enumerator.go index 0a42b9d..ce55b1e 100644 --- a/list/enumerator.go +++ b/list/enumerator.go @@ -25,6 +25,22 @@ import ( // Or, define your own. type Enumerator func(items Items, index int) string +// Indenter indents the children of a tree. +// +// Indenters allow for displaying nested tree items with connecting borders +// to sibling nodes. +// +// For example, the default indenter would be: +// +// func TreeIndenter(children Children, index int) string { +// if children.Length()-1 == index { +// return "│ " +// } +// +// return " " +// } +type Indenter func(items Items, index int) string + // Alphabet is the enumeration for alphabetical listing. // // a. Foo @@ -104,3 +120,33 @@ func Asterisk(Items, int) string { func Dash(Items, int) string { return "-" } + +// Tree enumerates a tree. +// +// ├── Foo +// ├── Bar +// ├── Baz +// └── Qux. +func Tree(items Items, index int) string { + if items.Length()-1 == index { + return "└──" + } + return "├──" +} + +// DefaultIndenter indents a tree for nested trees and multiline content. +// +// ├── Foo +// ├── Bar +// │ ├── Qux +// │ ├── Quux +// │ │ ├── Foo +// │ │ └── Bar +// │ └── Quuux +// └── Baz. +func TreeIndenter(items Items, index int) string { + if items.Length()-1 == index { + return " " + } + return "│ " +} diff --git a/list/list.go b/list/list.go index 50459e0..30aa6ed 100644 --- a/list/list.go +++ b/list/list.go @@ -24,7 +24,7 @@ package list import ( "github.com/charmbracelet/lipgloss" - "github.com/charmbracelet/lipgloss/tree" + "github.com/charmbracelet/lipgloss/internal/tree" ) // List represents a list of items that can be displayed. Lists can contain @@ -49,7 +49,9 @@ type List struct{ tree *tree.Tree } // anything you want, really. func New(items ...any) *List { l := &List{tree: tree.New()} - return l.Items(items...).Enumerator(Bullet) + return l.Items(items...). + Enumerator(Bullet). + Indenter(func(Items, int) string { return " " }) } // Items represents the list items. @@ -145,6 +147,36 @@ func (l *List) EnumeratorStyleFunc(f StyleFunc) *List { return l } +// Indenter sets the indenter implementation. This is used to change the way +// the tree is indented. The default indentor places a border connecting sibling +// elements and no border for the last child. +// +// └── Foo +// └── Bar +// └── Baz +// └── Qux +// └── Quux +// +// You can define your own indenter. +// +// func ArrowIndenter(children tree.Children, index int) string { +// return "→ " +// } +// +// → Foo +// → → Bar +// → → → Baz +// → → → → Qux +// → → → → → Quux +func (l *List) Indenter(indenter Indenter) *List { + l.tree.Indenter( + func(children tree.Children, index int) string { + return indenter(children, index) + }, + ) + return l +} + // ItemStyle sets the item style for all items. // // To set the item style conditionally based on the item value or index, @@ -225,6 +257,5 @@ func (l *List) Items(items ...any) *List { // Baz. Baz func (l *List) Enumerator(enumerator Enumerator) *List { l.tree.Enumerator(func(c tree.Children, i int) string { return enumerator(c, i) }) - l.tree.Indenter(func(tree.Children, int) string { return " " }) return l } diff --git a/list/list_test.go b/list/list_test.go index b5a0a94..d745f48 100644 --- a/list/list_test.go +++ b/list/list_test.go @@ -7,8 +7,8 @@ import ( "github.com/aymanbagabas/go-udiff" "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/internal/tree" "github.com/charmbracelet/lipgloss/list" - "github.com/charmbracelet/lipgloss/tree" ) // XXX: can't write multi-line examples if the underlying string uses