Skip to content

Commit

Permalink
Break hyperlink parameters into separate methods
Browse files Browse the repository at this point in the history
  • Loading branch information
meowgorithm committed Jun 4, 2024
1 parent 5ed623a commit ee87556
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 70 deletions.
61 changes: 52 additions & 9 deletions get.go
Original file line number Diff line number Diff line change
Expand Up @@ -414,10 +414,16 @@ func (s Style) GetTransform() func(string) string {
return s.getAsTransform(transformKey)
}

// GetHyperlink returns the hyperlink set on the style. If no hyperlink is set
// the empty string and nil is returned.
// GetHyperlink returns the hyperlink URL set on the style. If no hyperlink is
// set the empty string and nil is returned.
func (s Style) GetHyperlink() string {
return s.getAsHyperlink(hyperlinkKey)
return s.getAsHyperlinkURL(hyperlinkURLKey)
}

// GetHyperlink returns the hyperlink URL set on the style. If no hyperlink is
// set the empty string and nil is returned.
func (s Style) GetHyperlinkParams() map[string]string {
return s.getAsHyperlinkParams(hyperlinkParamsKey)
}

// Returns whether or not the given property is set.
Expand Down Expand Up @@ -532,18 +538,20 @@ func (s Style) getAsTransform(k propKey) func(string) string {
return s.transform
}

// getAsHyperlink returns the hyperlink URL set on the style. No other
// parameters will be returned.
func (s Style) getAsHyperlink(k propKey) string {
func (s Style) getAsHyperlinkURL(k propKey) string {
if !s.isSet(k) {
return ""
}

if len(s.hyperlink) == 0 {
return ""
return s.hyperlinkURL
}

func (s Style) getAsHyperlinkParams(k propKey) map[string]string {
if !s.isSet(k) {
return nil
}

return s.hyperlink[0]
return decodeHyperlinkParams(s.hyperlinkParams)
}

// Split a string into lines, additionally returning the size of the widest
Expand All @@ -560,3 +568,38 @@ func getLines(s string) (lines []string, widest int) {

return lines, widest
}

func encodeHyperlinkParams(m map[string]string) string {
if len(m) == 0 {
return ""
}

var parts []string
for k, v := range m {
parts = append(parts, k+"="+v)
}

return strings.Join(parts, ";")
}

func decodeHyperlinkParams(s string) map[string]string {
if len(s) == 0 {
return nil
}

parts := strings.Split(s, ";")
if len(parts) == 0 {
return nil
}

m := make(map[string]string)
for _, p := range parts {
kv := strings.Split(p, "=")
if len(kv) != 2 {
continue
}
m[kv[0]] = kv[1]
}

return m
}
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ go 1.18
require (
github.com/aymanbagabas/go-udiff v0.2.0
github.com/charmbracelet/x/ansi v0.1.1
github.com/hashicorp/uuid v0.0.0-20230117211644-212010c9d616
github.com/muesli/termenv v0.15.2
github.com/rivo/uniseg v0.4.7
)
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp
github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA=
github.com/charmbracelet/x/ansi v0.1.1 h1:CGAduulr6egay/YVbGc8Hsu8deMg1xZ/bkaXTPi1JDk=
github.com/charmbracelet/x/ansi v0.1.1/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
github.com/hashicorp/uuid v0.0.0-20230117211644-212010c9d616 h1:XVHNaBfj9Dp+skr2rRHK3GdgF0m/tsCc/ClnBKrlN0k=
github.com/hashicorp/uuid v0.0.0-20230117211644-212010c9d616/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
Expand Down
45 changes: 0 additions & 45 deletions hyperlink_test.go

This file was deleted.

32 changes: 21 additions & 11 deletions set.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package lipgloss

import "github.com/hashicorp/uuid"

// Set a value on the underlying rules map.
func (s *Style) set(key propKey, value interface{}) {
// We don't allow negative integers on any of our other values, so just keep
Expand Down Expand Up @@ -67,8 +65,10 @@ func (s *Style) set(key propKey, value interface{}) {
s.tabWidth = value.(int)
case transformKey:
s.transform = value.(func(string) string)
case hyperlinkKey:
s.hyperlink = value.([]string)
case hyperlinkURLKey:
s.hyperlinkURL = value.(string)
case hyperlinkParamsKey:
s.hyperlinkParams = value.(string)
default:
if v, ok := value.(bool); ok { //nolint:nestif
if v {
Expand Down Expand Up @@ -149,8 +149,10 @@ func (s *Style) setFrom(key propKey, i Style) {
s.set(tabWidthKey, i.tabWidth)
case transformKey:
s.set(transformKey, i.transform)
case hyperlinkKey:
s.set(hyperlinkKey, i.hyperlink)
case hyperlinkURLKey:
s.set(hyperlinkURLKey, i.hyperlinkURL)
case hyperlinkParamsKey:
s.set(hyperlinkParamsKey, i.hyperlinkParams)
default:
// Set attributes for set bool properties
s.set(key, i.attrs)
Expand Down Expand Up @@ -699,16 +701,24 @@ func (s Style) Transform(fn func(string) string) Style {
// a no way to detect if hyperlinks are supported. If hyperlinks are not
// the text will still render as normal.
//
// Hyperlinks in terminal emulators can contain an ID. This is important for
// ensuring that when long links are wrapped and broken apart they are still
// understood as a single hyperlink. In Lip Gloss, this ID is set
// automatically.
// Hyperlinks in terminal emulators can optionally contain parameters. To set
// those see [Style.hyperlinkParams].
func (s Style) Hyperlink(url string) Style {
if url == "" {
return s
}

s.set(hyperlinkKey, []string{url, "id", uuid.GenerateUUID()})
s.set(hyperlinkURLKey, url)
return s
}

// HyperlinkParams sets parameters for a hyperlink, such as an ID. If no
// URL is set via [Style.Hyperlink], hyperlink parameters will be ignored.
func (s Style) HyperlinkParams(p map[string]string) Style {
if p == nil {
return s
}
s.set(hyperlinkParamsKey, encodeHyperlinkParams(p))
return s
}

Expand Down
6 changes: 4 additions & 2 deletions style.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ const (

transformKey

hyperlinkKey
hyperlinkURLKey
hyperlinkParamsKey
)

// props is a set of properties.
Expand Down Expand Up @@ -160,7 +161,8 @@ type Style struct {

transform func(string) string

hyperlink []string
hyperlinkURL string
hyperlinkParams string
}

// joinString joins a list of strings into a single string separated with a
Expand Down

0 comments on commit ee87556

Please sign in to comment.