This commit is contained in:
Kovid Goyal
2024-05-07 10:24:14 +05:30
parent 1ce31a339e
commit 688736c4cf
4 changed files with 47 additions and 12 deletions

View File

@@ -220,7 +220,7 @@ func (self *Loop) Println(args ...any) {
func (self *Loop) style_region(style string, start_x, start_y, end_x, end_y int) string {
sgr := self.SprintStyled(style, "|")[2:]
sgr = sgr[:strings.IndexByte(sgr, 'm')]
return fmt.Sprintf("\x1b[%d;%d;%d;%d%s$r", start_y+1, start_x+1, end_y+1, end_x+1, sgr)
return fmt.Sprintf("\x1b[%d;%d;%d;%d;%s$r", start_y+1, start_x+1, end_y+1, end_x+1, sgr)
}
// Apply the specified style to the specified region of the screen (0-based

View File

@@ -24,7 +24,7 @@ type RenderLines struct {
}
var hyperlink_pat = sync.OnceValue(func() *regexp.Regexp {
return regexp.MustCompile("\x1b]8;([^;]*);.*?(\x1b\\\\|\a)")
return regexp.MustCompile("\x1b]8;([^;]*);(.*?)(?:\x1b\\\\|\a)")
})
// Render lines in the specified rectangle. If width > 0 then lines are wrapped
@@ -32,7 +32,7 @@ var hyperlink_pat = sync.OnceValue(func() *regexp.Regexp {
// move cursor is returned. Any internal hyperlinks are added to the
// MouseState.
func (r RenderLines) InRectangle(
lines []string, start_x, start_y, width, height int, mouse_state *MouseState,
lines []string, start_x, start_y, width, height int, mouse_state *MouseState, on_click ...func(id string) error,
) (all_rendered bool, y_after_last_line int, ans string) {
end_y := start_y + height - 1
if end_y < start_y {
@@ -59,23 +59,23 @@ func (r RenderLines) InRectangle(
}
}
commit_hyperlink := func() {
mouse_state.AddCellRegion(hyperlink_state.action, hyperlink_state.start_x, hyperlink_state.start_y, x, y)
commit_hyperlink := func() bool {
if hyperlink_state.action == "" {
return false
}
mouse_state.AddCellRegion(hyperlink_state.action, hyperlink_state.start_x, hyperlink_state.start_y, x, y, on_click...)
hyperlink_state.action = ``
return true
}
add_hyperlink := func(id, url string) {
is_closer := id == "" && url == ""
if is_closer {
if hyperlink_state.action != "" {
commit_hyperlink()
} else {
if !commit_hyperlink() {
buf.WriteString("\x1b]8;;\x1b\\")
}
} else {
if hyperlink_state.action != "" {
commit_hyperlink()
}
commit_hyperlink()
if strings.HasPrefix(url, KittyInternalHyperlinkProtocol+":") {
start_hyperlink(url[len(KittyInternalHyperlinkProtocol)+1:])
} else {