From e58067a17b1ff52fb82a97e524b4c61dd252c11b Mon Sep 17 00:00:00 2001 From: Sterling Camden Date: Sun, 3 Jul 2011 17:09:14 -0700 Subject: Fix wrapped URLs --- url-picker | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/url-picker b/url-picker index 0895e1d..0dc4e65 100644 --- a/url-picker +++ b/url-picker @@ -19,6 +19,7 @@ sub on_user_command { if ($cmd =~ s/^url-picker\b//) { my $labels = {}; my $hrefs = {}; + my $rowmap = {}; my $num = 0; my $row = 0; my $base_col = 0; @@ -26,15 +27,27 @@ sub on_user_command { my $label_rend = $self->get_rend("label", urxvt::OVERLAY_RSTYLE); my $label_urls = sub { while ($text =~ /$url/g) { - my $col = $-[0] + $base_col; + my $ndx = $-[0]; my $href = $&; - $num++; - my $overlay = $self->overlay( - $col, $row, $self->strwidth($num), 1, $label_rend, 0 - ); - $overlay->set(0,0,$num); - $labels->{$num} = $overlay; - $hrefs->{$num} = $href; + my $col = 0; + for my $key (keys %$rowmap) { + my $value = $rowmap->{$key}; + my ($start, $end) = @$value; + if (($start <= $ndx) && ($end >= $ndx)) { + $row = $key; + $col = $ndx - $start; + last; + } + } + if ($row >= 0) { # must be visible + $num++; + my $overlay = $self->overlay( + $col, $row, $self->strwidth($num), 1, $label_rend, 0 + ); + $overlay->set(0,0,$num); + $labels->{$num} = $overlay; + $hrefs->{$num} = $href; + } } }; my ($brow, $bcol) = $self->selection_beg(); @@ -43,18 +56,21 @@ sub on_user_command { if ($issel) { # restrict to selection if one exists ($row, $base_col) = ($brow - $self->view_start, $bcol); for (split(/\n/, $self->selection())) { - $text = $_; - $label_urls->() if $row >= 0; # must be visible + my $start = length($text) - $base_col; + $text .= $_; + $rowmap->{$row} = [$start, (length($text)-1)]; $base_col = 0; $row++; } } else { # no selection, use visible terminal for (0..($self->nrow - 1)) { $row = $_; - $text = $self->ROW_t($row + $self->view_start); - $label_urls->(); + my $start = length($text); + $text .= $self->ROW_t($row + $self->view_start); + $rowmap->{$row} = [$start, (length($text)-1)]; } } + $label_urls->(); if ($num < 1) { my $desc = $issel ? "in visible selected text" : "on visible screen"; -- cgit v1.2.3