charmbracelet / lipgloss

Style definitions for nice terminal layouts 👄
MIT License
8.03k stars 228 forks source link

OSC 8 (hyperlink) supports. #220

Closed tartavull closed 1 month ago

tartavull commented 1 year ago

https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda OSC8 allows for hyperlinks in terminals that support them. But currently even in terminals that support OSC8, it brakes the rest of the formatting provided by lipgloss. I would love to contribute this if I can be offered some guidance.

tomgeorge commented 1 year ago

I have this requirement, too.

It looks like termenv, one of the project dependencies, supports hyperlinks. I haven't looked into it other than glancing at hyperlink.go, but I think one could use that to render a hyperlink.

It would be nice to have it wrapped in lipgloss so I can use the same APIs.

testinfected commented 4 months ago

Hi guys, what's the status of this? Displaying links works but width calculation is all wrong

meowgorithm commented 4 months ago

Hey, @testinfected! In terms of width calculation, I believe it's correct now (we've reworked a lot of the underpinnings):

package main

import (
    "fmt"

    "github.com/charmbracelet/lipgloss"
)

func main() {
    const x = "\x1B]8;;http://charm.sh\x1B\\Hello\x1B]8;;\x1B\\\n"
    fmt.Println(lipgloss.Width(x)) // 5
}

Playground

If not, mind opening a separate issue with code to reproduce?

testinfected commented 4 months ago

Hey @meowgorithm good to know, thank you. I'm displaying an hyperlink in the spinner title, but part of the hyperlink is not visible unless I resize the terminal horizontally.

Let me double check and open a new issue then.

testinfected commented 4 months ago

It seems ok with all the latest versions of the libraries. I guess you can close this issue

Thanks for the quick response :-)

testinfected commented 4 months ago

FYI I had bubbletea 0.25, seems fixed with 0.26.3

meowgorithm commented 4 months ago

Okay awesome, that's good to hear. Bubble Tea v0.26.x and Lip Gloss v0.11.x both use our new low level stuff in /x.

Let's keep this issue open until we add an API for hyperlinks, i.e. something like:

lipgloss.Hyperlink("https://charm.sh/", "Charm!")
meowgorithm commented 4 months ago

Actually, I'd probably implement it on a style for control over the output:

str := lipgloss.NewStyle().
    Foreground(lipgloss.Color(63)).
    Underline(true).
    Hyperlink("https://charm.sh").
    Render("Charm!")
Delta456 commented 4 months ago

I would want to work on this!

meowgorithm commented 4 months ago

@Delta456 urgh, I actually have a hyperlink branch open with most of this in place. I'll open up a PR for it in a few minutes and mention you.

Delta456 commented 4 months ago

@Delta456 urgh, I actually have a hyperlink branch open with most of this in place. I'll open up a PR for it in a few minutes and mention you.

Ah well, no worries! The implementation is almost the same as yours :stars:

meowgorithm commented 4 months ago

Just a note that you can follow progress on this is #313. Getting it right will be a bit more complicated than meets the eye.