From 65b731f48463ebeb87e5b6e3be621f8195ac0625 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sat, 28 Sep 2024 12:04:32 +0200 Subject: [PATCH] Bump gocui --- go.mod | 2 +- go.sum | 4 +- vendor/github.com/jesseduffield/gocui/view.go | 61 +++++++++++++++++++ vendor/modules.txt | 2 +- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6836caeb9..95587f286 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/integrii/flaggy v1.4.0 github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d - github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7 + github.com/jesseduffield/gocui v0.3.1-0.20240928100326-393cf89a5d3f github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e diff --git a/go.sum b/go.sum index 77fc93c8b..12ce5def9 100644 --- a/go.sum +++ b/go.sum @@ -188,8 +188,8 @@ github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 h1:EQP2Tv8T github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d h1:bO+OmbreIv91rCe8NmscRwhFSqkDJtzWCPV4Y+SQuXE= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d/go.mod h1:nGNEErzf+NRznT+N2SWqmHnDnF9aLgANB1CUNEan09o= -github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7 h1:QeLCKRAt4T6sBg5tSrOc4OojCuAcPxUA+4vNMPY4aH4= -github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7/go.mod h1:XtEbqCbn45keRXEu+OMZkjN5gw6AEob59afsgHjokZ8= +github.com/jesseduffield/gocui v0.3.1-0.20240928100326-393cf89a5d3f h1:ZzsAUDwPFLPITKLcJpMSqt/3rERdI8YRZKr2l0plrls= +github.com/jesseduffield/gocui v0.3.1-0.20240928100326-393cf89a5d3f/go.mod h1:XtEbqCbn45keRXEu+OMZkjN5gw6AEob59afsgHjokZ8= github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 h1:jmpr7KpX2+2GRiE91zTgfq49QvgiqB0nbmlwZ8UnOx0= github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10/go.mod h1:aA97kHeNA+sj2Hbki0pvLslmE4CbDyhBeSSTUUnOuVo= github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 h1:CDuQmfOjAtb1Gms6a1p5L2P8RhbLUq5t8aL7PiQd2uY= diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go index b84405e4a..c3e183a87 100644 --- a/vendor/github.com/jesseduffield/gocui/view.go +++ b/vendor/github.com/jesseduffield/gocui/view.go @@ -183,6 +183,10 @@ type View struct { // if true, the user can scroll all the way past the last item until it appears at the top of the view CanScrollPastBottom bool + // if true, the view will automatically recognize https: URLs in the content written to it and render + // them as hyperlinks + AutoRenderHyperLinks bool + // if true, the view will underline hyperlinks only when the cursor is on // them; otherwise, they will always be underlined UnderlineHyperLinksOnlyOnHover bool @@ -780,6 +784,7 @@ func (v *View) writeRunes(p []rune) { for _, r := range p { switch r { case '\n': + v.autoRenderHyperlinksInCurrentLine() if c, ok := v.readCell(v.wx+1, v.wy); !ok || c.chr == 0 { v.writeCells(v.wx, v.wy, []cell{{ chr: 0, @@ -793,6 +798,7 @@ func (v *View) writeRunes(p []rune) { v.lines = append(v.lines, nil) } case '\r': + v.autoRenderHyperlinksInCurrentLine() if c, ok := v.readCell(v.wx, v.wy); !ok || c.chr == 0 { v.writeCells(v.wx, v.wy, []cell{{ chr: 0, @@ -829,6 +835,61 @@ func (v *View) writeString(s string) { v.writeRunes([]rune(s)) } +func findSubstring(line []cell, substringToFind []rune) int { + for i := 0; i < len(line)-len(substringToFind); i++ { + for j := 0; j < len(substringToFind); j++ { + if line[i+j].chr != substringToFind[j] { + break + } + if j == len(substringToFind)-1 { + return i + } + } + } + return -1 +} + +func (v *View) autoRenderHyperlinksInCurrentLine() { + if !v.AutoRenderHyperLinks { + return + } + + // We need a heuristic to find the end of a hyperlink. Searching for the + // first character that is not a valid URI character is not quite good + // enough, because in markdown it's common to have a hyperlink followed by a + // ')', so we want to stop there. Hopefully URLs containing ')' are uncommon + // enough that this is not a problem. + lineEndCharacters := map[rune]bool{ + '\000': true, + ' ': true, + '\n': true, + '>': true, + '"': true, + ')': true, + } + line := v.lines[v.wy] + start := 0 + for { + linkStart := findSubstring(line[start:], []rune("https://")) + if linkStart == -1 { + break + } + linkStart += start + link := "" + linkEnd := linkStart + for ; linkEnd < len(line); linkEnd++ { + if _, ok := lineEndCharacters[line[linkEnd].chr]; ok { + break + } + link += string(line[linkEnd].chr) + } + for i := linkStart; i < linkEnd; i++ { + v.lines[v.wy][i].hyperlink = link + } + start = linkEnd + } +} + // parseInput parses char by char the input written to the View. It returns nil // while processing ESC sequences. Otherwise, it returns a cell slice that // contains the processed data. diff --git a/vendor/modules.txt b/vendor/modules.txt index 0405dfd40..720f145a6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -172,7 +172,7 @@ github.com/jesseduffield/go-git/v5/utils/merkletrie/filesystem github.com/jesseduffield/go-git/v5/utils/merkletrie/index github.com/jesseduffield/go-git/v5/utils/merkletrie/internal/frame github.com/jesseduffield/go-git/v5/utils/merkletrie/noder -# github.com/jesseduffield/gocui v0.3.1-0.20240906064314-bfab49c720d7 +# github.com/jesseduffield/gocui v0.3.1-0.20240928100326-393cf89a5d3f ## explicit; go 1.12 github.com/jesseduffield/gocui # github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10