ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/selection-pastebin
(Generate patch)

Comparing rxvt-unicode/src/perl/selection-pastebin (file contents):
Revision 1.3 by root, Tue Jan 17 17:01:54 2006 UTC vs.
Revision 1.21 by root, Sun Jun 10 17:39:54 2012 UTC

1#! perl 1#! perl
2 2
3my $timers = {}; 3#:META:X_RESOURCE:%.cmd:string:the command to run create a new pastebin
4my $pastebin_cmd; 4#:META:X_RESOURCE:%.url:string:the url template for new pastebins
5my $pastebin_url;
6 5
7sub on_start { 6=head1 NAME
8 my ($self) = @_;
9 $pastebin_cmd =
10 $self->x_resource ("selection-pastebin.cmd")
11 or "scp -p % ruth:/var/www/www.ta-sa.org/files/txt/";
12 7
13 $pastebin_url = 8 selection-pastebin - automatic pastebin upload
14 $self->x_resource ("selection-pastebin.url")
15 or "http://www.ta-sa.org/files/txt/";
16 9
17 () 10=head1 DESCRIPTION
18} 11
12This is a little rarely useful extension that uploads the selection as
13textfile to a remote site (or does other things). (The implementation is
14not currently secure for use in a multiuser environment as it writes to
15F</tmp> directly.).
16
17It listens to the C<selection-pastebin:remote-pastebin> keyboard command,
18i.e.
19
20 URxvt.keysym.C-M-e: perl:selection-pastebin:remote-pastebin
21
22Pressing this combination runs a command with C<%> replaced by the name of
23the 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
27And the default is likely not useful to anybody but the few people around
28here :)
29
30The name of the textfile is the hex encoded md5 sum of the selection, so
31the same content should lead to the same filename.
32
33After a successful upload the selection will be replaced by the text given
34in the C<selection-pastebin-url> resource (again, the % is the placeholder
35for the filename):
36
37 URxvt.selection-pastebin.url: http://www.ta-sa.org/files/txt/%
38
39I<Note to xrdb users:> xrdb uses the C preprocessor, which might interpret
40the double C</> characters as comment start. Use C<\057\057> instead,
41which works regardless of whether xrdb is used to parse the resource file
42or not.
43
44=cut
19 45
20sub upload_paste { 46sub upload_paste {
21 my ($self) = @_; 47 my ($self) = @_;
22 48
23 require Digest::MD5; 49 require Digest::MD5;
24 50
25 my $txt = $self->selection; 51 my $txt = $self->selection;
52
53 my $filename = $txt;
54 utf8::encode $filename;
26 my $filename = Digest::MD5::md5_hex ($txt) . ".txt"; 55 $filename = Digest::MD5::md5_hex ($filename) . ".txt";
27 56
28 my $tmpfile = "/tmp/$filename"; 57 my $tmpfile = "/tmp/$filename";
29 58
30 my $msg = "uploaded $filename"; 59 my $msg = "uploaded as $filename";
31 60
32 if (open my $o, ">" . $tmpfile) { 61 if (open my $o, ">:utf8", $tmpfile) {
62 chmod 0644, $tmpfile;
33 print $o $txt; 63 print $o $txt;
34 close $o; 64 close $o;
35 } else { 65 } else {
36 $msg = "couldn't write $tmpfile: $!"; 66 $msg = "couldn't write $tmpfile: $!";
37 } 67 }
38 68
39 my $cmd = $pastebin_cmd; 69 my $cmd = $self->{pastebin_cmd};
40 $cmd =~ s/%/$tmpfile/; 70 $cmd =~ s/%/$tmpfile/;
41 71
42 if (system ($cmd) == 0) { 72 my $pid = $self->exec_async ($cmd);
43 my $url = $pastebin_url;
44 $url =~ s/%/$filename/;
45 73
46 $self->selection ($url); 74 $self->{pw} = urxvt::pw->new->start ($pid)->cb (sub {
47 } else { 75 my (undef, $status) = @_;
48 $msg = "couldn't upload, '$cmd' failed";
49 }
50 76
51 my $ov = $timers->{ov} = $self->overlay (-1, 0, length ($msg), 1, urxvt::OVERLAY_RSTYLE, 0); 77 delete $self->{pw};
52 $ov->set (0, 0, $msg);
53 78
54 $timers->{t1} = 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} =
55 urxvt::timer 95 urxvt::timer
56 ->new 96 ->new
57 ->start ((int urxvt::NOW) + 5) # make sure we update "on" the second
58 ->interval (1) 97 ->after (5)
59 ->cb (sub { delete $timers->{ov}; delete $timers->{t1}; }); 98 ->cb (sub { delete $self->{timer}; undef $ov; });
99 });
60} 100}
61 101
62sub on_keyboard_command { 102sub on_start {
63 my ($self, $cmd) = @_; 103 my ($self) = @_;
64 104
65 $cmd eq "selection-pastebin:remote-pastebin" 105 $self->{pastebin_cmd} = $self->x_resource ("%.cmd")
66 and upload_paste ($self); 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 };
67 114
68 () 115 ()
69} 116}
70 117
118sub 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines