Advertisement
kusayu

Untitled

Oct 14th, 2011
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 8.16 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. #my $tag_matcher =
  4. #    qr{
  5. #        (\*[a-zA-Zа-яА-Я0-9_!?-]+)
  6. #    }x;
  7.  
  8. my $nick_matcher =
  9.     qr{
  10.         (\@[a-zA-Z0-9-]{2,})
  11.     }x;
  12.  
  13. my $post_matcher =
  14.     qr{
  15.         (\#[0-9]{6,}(/[0-9]{1,4})?)
  16.     }x;
  17.  
  18. sub on_start {
  19.     my ($term) = @_;
  20.  
  21.     $term->{have_Clipboard} = eval { require Clipboard; };
  22.     if ($term->{have_Clipboard}) {
  23.         import Clipboard;
  24.     }
  25.  
  26.     $term->{juickopen} = $term->x_resource ("juickLauncher");
  27.  
  28.     ()
  29. }
  30.  
  31. sub on_line_update {
  32.     my ($term, $row) = @_;
  33.  
  34.     my $line = $term->line ($row);
  35.     my $text = $line->t;
  36.  
  37.     while ($text =~ /\s($nick_matcher|$post_matcher)/g) {
  38.         my $rend = $line->r;
  39.  
  40.         if ($term->x_resource ("underlineURLs") eq "true") {
  41.            $_ |= urxvt::RS_Uline
  42.            for @{$rend}[ $-[1] .. $+[1] - 1];
  43.            $line->r ($rend);
  44.         }
  45.     }
  46.  
  47.     ()
  48. }
  49.  
  50. #my $tag_mode_active = 0;
  51. my $nick_mode_active = 0;
  52. my $post_mode_active = 0;
  53. my %mod = ( 'control' => 0, 'shift' => 0 );
  54. my $url_selected = -1;
  55. my @url_db = ();
  56.  
  57. #sub do_scan_for_tag {
  58. #    my ($term) = @_;
  59.  
  60. #    @url_db = ();
  61.  
  62. #    my $row_start = $term->top_row;
  63. #    my $row_end = $term->nrow;
  64.  
  65. #    for (my $row=$row_start; $row<=$row_end; $row++) {
  66.  
  67. #        my $line = $term->line ($row);
  68. #        my $text = $line->t;
  69.  
  70. #        while ($text =~ /\s$tag_matcher/g) {
  71. #            my $rend = $line->r;
  72. #            my $url = $1;
  73.  
  74. #            my %h = ( 'row'      => $row,
  75. #                      'col_from' => $-[1],
  76. #                      'col_to'   => $+[1] - 1,
  77. #                      'url'      => $url);
  78. #            push @url_db, \%h;
  79. #        }
  80. #    }
  81.  
  82. #    return $#url_db + 1;
  83. #}
  84.  
  85. sub do_scan_for_nick {
  86.     my ($term) = @_;
  87.  
  88.     @url_db = ();
  89.  
  90.     my $row_start = $term->top_row;
  91.     my $row_end = $term->nrow;
  92.  
  93.     for (my $row=$row_start; $row<=$row_end; $row++) {
  94.  
  95.         my $line = $term->line ($row);
  96.         my $text = $line->t;
  97.  
  98.         while ($text =~ /\s($nick_matcher)/g) {
  99.             my $rend = $line->r;
  100.             my $url = $1;
  101.  
  102.             my %h = ( 'row'      => $row,
  103.                       'col_from' => $-[1],
  104.                       'col_to'   => $+[1] - 1,
  105.                       'url'      => $url );
  106.             push @url_db, \%h;
  107.         }
  108.     }
  109.  
  110.     return $#url_db + 1;
  111. }
  112.  
  113. sub do_scan_for_post {
  114.     my ($term) = @_;
  115.  
  116.     @url_db = ();
  117.  
  118.     my $row_start = $term->top_row;
  119.     my $row_end = $term->nrow;
  120.  
  121.     for (my $row=$row_start; $row<=$row_end; $row++) {
  122.  
  123.         my $line = $term->line ($row);
  124.         my $text = $line->t;
  125.  
  126.         while ($text =~ /\s($post_matcher)/g) {
  127.             my $rend = $line->r;
  128.             my $url = $1;
  129.  
  130.             my %h = ( 'row'      => $row,
  131.                       'col_from' => $-[1],
  132.                       'col_to'   => $+[1] - 1,
  133.                       'url'      => $url );
  134.             push @url_db, \%h;
  135.         }
  136.     }
  137.  
  138.     return $#url_db + 1;
  139. }
  140.  
  141. sub on_user_command {
  142.     my ($term, $cmd) = @_;
  143.  
  144. #    $cmd eq "juick:activate_tag_mode"
  145. #        and activate_tag_mode($term);
  146.  
  147.     $cmd eq "juick:activate_nick_mode"
  148.         and activate_nick_mode($term);
  149.  
  150.     $cmd eq "juick:activate_post_mode"
  151.         and activate_post_mode($term);
  152.  
  153.     ()
  154. }
  155.  
  156. sub on_key_press {
  157.     my ($term, $event, $keysym, $octets) = @_;
  158.  
  159. #    $tag_mode_active && return 1;
  160.     $nick_mode_active && return 1;
  161.     $post_mode_active && return 1;
  162.  
  163.     ()
  164. }
  165.  
  166. sub on_key_release {
  167.     my ($term, $event, $keysym, $octets) = @_;
  168.  
  169.     if (($nick_mode_active) || ($post_mode_active)) {
  170.  
  171.         my $ch = chr($keysym);
  172.  
  173.         if (($keysym == 65307) || ($ch eq 'q')) {
  174.             deactivate_mode ($term);
  175.             return 1;
  176.  
  177.         } elsif (($keysym == 65293) || ($ch eq 'o')) {
  178.            my $url = get_active_url($term);
  179.            $term->exec_async ($term->{juickopen} . ' ' . $url);
  180.            deactivate_mode ($term);
  181.            return 1;
  182.  
  183.         } elsif (($ch eq 'j') || ($ch eq 'k')) {
  184.            my $dir = ($ch eq 'j') ? 1 : -1;
  185.            move_highlight ($term, $dir);
  186.  
  187.         } elsif ($ch eq 'y') {
  188.             do_copy ($term);
  189.             deactivate_mode ($term);
  190.             return 1;
  191.  
  192.         } elsif ($ch eq 'a') {
  193.            my $url = get_active_url($term);
  194.            $url =~ s/&/\\&/g;
  195.            ($term)->tt_write("$url ");
  196.            deactivate_mode ($term);
  197.            return 1;
  198.  
  199.         } elsif ($ch eq 'p') {
  200.            my $url = get_active_url($term);
  201.            $url =~ s/\/[0-9]*//;
  202.            ($term)->tt_write("S $url");
  203.            deactivate_mode ($term);
  204.            return 1;
  205.  
  206.         } elsif ($ch eq 'u') {
  207.            my $url = get_active_url($term);
  208.            $url =~ s/\/[0-9]*//;
  209.            ($term)->tt_write("U $url");
  210.            deactivate_mode ($term);
  211.            return 1;
  212.  
  213.         } elsif ($ch eq 'i') {
  214.            my $url = get_active_url($term);
  215.            $url =~ s/\/[0-9]*//;
  216.            ($term)->tt_write("$url+");
  217.            deactivate_mode ($term);
  218.            return 1;
  219.  
  220.         } elsif ($ch eq 'r') {
  221.            my $url = get_active_url($term);
  222.            $url =~ s/\/[0-9]*//;
  223.            ($term)->tt_write("! $url");
  224.            deactivate_mode ($term);
  225.            return 1;
  226.  
  227.         } elsif ($ch eq 'd') {
  228.            my $url = get_active_url($term);
  229.            $url =~ s/&/\\&/g;
  230.            ($term)->tt_write("D $url");
  231.            deactivate_mode ($term);
  232.            return 1;
  233.         }
  234.  
  235.         return 1;
  236.     }
  237.  
  238.     ()
  239. }
  240.  
  241. sub get_active_url {
  242.     my ($term) = @_;
  243.     my $max = $#url_db + 1;
  244.  
  245.     return if $url_selected < 0 || $url_selected >= $max;
  246.     return if not defined $url_db[$url_selected];
  247.     my $o = $url_db[$url_selected];
  248.     my %h = %$o;
  249.  
  250.     return $h{url};
  251. }
  252.  
  253. sub do_copy {
  254.     my ($term) = @_;
  255.  
  256.     my $text = get_active_url ($term);
  257.  
  258.     if ($term->{have_Clipboard}) {
  259.         Clipboard->copy($text);
  260.     } else {
  261.         $text =~ s/\(["|><&()]\)/\\$1/;
  262.         system ("echo -n \"$text\" | xclip -i");
  263.     }
  264. }
  265.  
  266. sub move_highlight {
  267.     my ($term, $dir) = @_;
  268.     my $max = $#url_db + 1;
  269.  
  270.     do_highlight ($term, 0);
  271.  
  272.     $url_selected = ($max + $url_selected + $dir) % $max;
  273.  
  274.     do_highlight ($term, 1);
  275.  
  276.     $term->want_refresh;
  277. }
  278.  
  279. sub do_highlight {
  280.     my ($term, $enable) = @_;
  281.     my $max = $#url_db + 1;
  282.  
  283.     return if $url_selected < 0 || $url_selected >= $max;
  284.     return if not defined $url_db[$url_selected];
  285.  
  286.     my $o = $url_db[$url_selected];
  287.     my %h = %$o;
  288.  
  289.     my $row = $h{row};
  290.     my $line = $term->line ($row);
  291.     my $text = $line->t;
  292.     my $rend = $line->r;
  293.  
  294.     if ($enable) {
  295.         $_ |= urxvt::RS_RVid
  296.         for @{$rend}[ $h{col_from} .. $h{col_to}];
  297.  
  298.         # make it visible
  299.         $term->view_start ( $row < 0 ? $row : 0 );
  300.     } else {
  301.         $_ &= ~urxvt::RS_RVid
  302.         for @{$rend}[ $h{col_from} .. $h{col_to}];
  303.     }
  304.  
  305.     $line->r ($rend);
  306. }
  307.  
  308. #sub activate_tag_mode {
  309. #    my ($term) = @_;
  310.  
  311. #    if ($tag_mode_active) {
  312.  
  313. #        move_highlight ($term, -1);
  314.  
  315. #    } elsif ( do_scan_for_tag ($term) ) {
  316.  
  317. #        $term->{save_view_start} = $term->view_start;
  318. #        move_highlight ($term, 0);
  319. #        $tag_mode_active=1 if ($url_selected > -1);
  320. #    }
  321. #}
  322.  
  323. sub activate_nick_mode {
  324.     my ($term) = @_;
  325.  
  326.     if ($nick_mode_active) {
  327.  
  328.         move_highlight ($term, -1);
  329.  
  330.     } elsif ( do_scan_for_nick ($term) ) {
  331.  
  332.         $term->{save_view_start} = $term->view_start;
  333.         move_highlight ($term, 0);
  334.         $nick_mode_active=1 if ($url_selected > -1);
  335.     }
  336. }
  337.  
  338. sub activate_post_mode {
  339.     my ($term) = @_;
  340.  
  341.     if ($post_mode_active) {
  342.  
  343.         move_highlight ($term, -1);
  344.  
  345.     } elsif ( do_scan_for_post ($term) ) {
  346.  
  347.         $term->{save_view_start} = $term->view_start;
  348.         move_highlight ($term, 0);
  349.         $post_mode_active=1 if ($url_selected > -1);
  350.  
  351.     }
  352. }
  353.  
  354. sub deactivate_mode {
  355.     my ($term) = @_;
  356.  
  357.     do_highlight ($term, 0);
  358.  
  359.     $nick_mode_active = 0;
  360. #    $tag_mode_active = 0;
  361.     $post_mode_active = 0;
  362.     $url_selected = -1;
  363.  
  364.     $term->view_start ($term->{save_view_start});
  365.     $term->want_refresh;
  366. }
  367.  
  368.  
  369.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement