ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/selection-pastebin
Revision: 1.26
Committed: Mon Jun 9 19:54:26 2014 UTC (9 years, 11 months ago) by sf-exg
Branch: MAIN
CVS Tags: rxvt-unicode-rel-9_29, rxvt-unicode-rel-9_26, rxvt-unicode-rel-9_25, rxvt-unicode-rel-9_22, rxvt-unicode-rel-9_21, rxvt-unicode-rel-9_30, HEAD
Changes since 1.25: +10 -0 lines
Log Message:
Restore on_user_command hooks for backward compatibility.

File Contents

# Content
1 #! perl
2
3 #:META:RESOURCE:%.cmd:string:the command to run create a new pastebin
4 #:META:RESOURCE:%.url:string:the url template for new pastebins
5
6 =head1 NAME
7
8 selection-pastebin - automatic pastebin upload
9
10 =head1 EXAMPLES
11
12 URxvt.keysym.C-M-e: selection-pastebin:remote-pastebin
13
14 =head1 DESCRIPTION
15
16 This is a little rarely useful extension that uploads the selection as
17 textfile to a remote site (or does other things). (The implementation is
18 not currently secure for use in a multiuser environment as it writes to
19 F</tmp> directly.).
20
21 It listens to the C<selection-pastebin:remote-pastebin> action, which,
22 when activated, runs a command with C<%> replaced by the name of the
23 textfile. This command can be set via a resource:
24
25 URxvt.selection-pastebin.cmd: rsync -apP % ruth:/var/www/www.ta-sa.org/files/txt/.
26
27 And the default is likely not useful to anybody but the few people around
28 here :)
29
30 The name of the textfile is the hex encoded md5 sum of the selection, so
31 the same content should lead to the same filename.
32
33 After a successful upload the selection will be replaced by the text given
34 in the C<selection-pastebin-url> resource (again, the % is the placeholder
35 for the filename):
36
37 URxvt.selection-pastebin.url: http://www.ta-sa.org/files/txt/%
38
39 I<Note to xrdb users:> xrdb uses the C preprocessor, which might interpret
40 the double C</> characters as comment start. Use C<\057\057> instead,
41 which works regardless of whether xrdb is used to parse the resource file
42 or not.
43
44 =cut
45
46 sub upload_paste {
47 my ($self) = @_;
48
49 require Digest::MD5;
50
51 my $txt = $self->selection;
52
53 my $filename = $txt;
54 utf8::encode $filename;
55 $filename = Digest::MD5::md5_hex ($filename) . ".txt";
56
57 my $tmpfile = "/tmp/$filename";
58
59 my $msg = "uploaded as $filename";
60
61 if (open my $o, ">:utf8", $tmpfile) {
62 chmod 0644, $tmpfile;
63 print $o $txt;
64 close $o;
65 } else {
66 $msg = "couldn't write $tmpfile: $!";
67 }
68
69 my $cmd = $self->{pastebin_cmd};
70 $cmd =~ s/%/$tmpfile/;
71
72 my $pid = $self->exec_async ($cmd);
73
74 $self->{pw} = urxvt::pw->new->start ($pid)->cb (sub {
75 my (undef, $status) = @_;
76
77 delete $self->{pw};
78
79 if ($status) {
80 $status >>= 8;
81 $msg = "ERROR: command returned status $status";
82 } else {
83 my $url = $self->{pastebin_url};
84 $url =~ s/%/$filename/;
85
86 $self->selection ($url);
87 }
88
89 unlink $tmpfile;
90
91 my $ov = $self->overlay (-1, 0, $self->strwidth ($msg), 1, urxvt::OVERLAY_RSTYLE, 0);
92 $ov->set (0, 0, $msg);
93
94 $self->{timer} =
95 urxvt::timer
96 ->new
97 ->after (5)
98 ->cb (sub { delete $self->{timer}; undef $ov; });
99 });
100 }
101
102 sub on_start {
103 my ($self) = @_;
104
105 $self->{pastebin_cmd} = $self->x_resource ("%.cmd")
106 || "rcp -p % ruth:/var/www/www.ta-sa.org/files/txt/";
107
108 $self->{pastebin_url} = $self->x_resource ("%.url")
109 || "http://www.ta-sa.org/files/txt/%";
110
111 push @{ $self->{term}{selection_popup_hook} }, sub {
112 ("pastebin upload" => sub { $self->upload_paste })
113 };
114
115 ()
116 }
117
118 sub on_user_command {
119 my ($self, $cmd) = @_;
120
121 if ($cmd eq "selection-pastebin:remote-pastebin") {
122 $self->upload_paste;
123 }
124
125 ()
126 }
127
128 sub on_action {
129 my ($self, $action) = @_;
130
131 $action eq "remote-pastebin"
132 and $self->upload_paste;
133
134 ()
135 }
136