]> the.earth.li Git - unicode-expand.git/blob - unicode-expand.pl
Collect Unicode expansions together
[unicode-expand.git] / unicode-expand.pl
1 use strict;
2 use warnings;
3
4 use utf8;
5 use Encode qw(decode_utf8);
6 use charnames ();
7
8 use Irssi;
9 our $VERSION = '1.51';
10 our %IRSSI = (
11     authors     => 'Jonathan McDowell',
12     contact     => 'noodles@earth.li',
13     name        => 'unicode-expand',
14     description => 'Expands Unicode characters to include their names',
15     license     => 'Public Domain',
16     changed     => "Sat  5 Jan 15:42:20 GMT 2019",
17     url         => 'http://www.earth.li/gitweb/?p=unicode-expand.git;a=summary',
18     # Also https://github.com/u1f35c/unicode-expand
19 );
20
21 sub expand_message_public {
22     my ($server, $data, $nick, $mask, $target) = @_;
23     Irssi::signal_continue($server, expand($server, $target, $data),
24                            $nick, $mask, $target);
25 }
26
27 sub expand_message_private {
28     my ($server, $data, $nick, $mask) = @_;
29     Irssi::signal_continue($server, expand($server, $nick, $data),
30                            $nick, $mask);
31 }
32
33 sub expand_part {
34     my ($server, $channel, $nick, $mask, $reason) = @_;
35     Irssi::signal_continue($server, $channel, $nick, $mask,
36                            expand($server, $channel, $reason));
37 }
38
39 sub expand_quit {
40     my ($server, $nick, $mask, $reason) = @_;
41     Irssi::signal_continue($server, $nick, $mask,
42                            expand($server, $nick, $reason));
43 }
44
45 sub expand_kick {
46     my ($server, $channel, $nick, $kicker, $mask, $reason) = @_;
47     Irssi::signal_continue($server, $channel, $nick, $kicker, $mask,
48                            expand($server, $channel, $reason));
49 }
50
51 sub expand_topic {
52     my ($server, $channel, $topic, $nick, $mask) = @_;
53     Irssi::signal_continue($server, $channel,
54                            expand($server, $channel, $topic), $nick, $mask);
55 }
56
57 sub expand_char {
58     my ($string) = @_;
59
60     my $expansion = "";
61
62     for my $c (split //,$string) {
63         my $name = charnames::viacode(ord $c);
64         $name = sprintf("{%X}", ord $c) unless defined($name);
65         if (length($expansion) == 0) {
66             $expansion .= $name;
67         } else {
68             $expansion .= "; " . $name;
69         }
70     }
71
72     return $expansion;
73 }
74
75 sub expand {
76     my ($server, $target, $data) = @_;
77
78     $data = decode_utf8($data);
79     $data =~ s{([^\p{Letter}\p{Punctuation}\p{Control}\p{Space}\p{Sc}[:ascii:]]+)}{
80         "${1} [".expand_char($1)."]"
81     }ge;
82
83     return $data;
84 }
85
86 Irssi::signal_add('message public', \&expand_message_public);
87 Irssi::signal_add('message private', \&expand_message_private);
88 Irssi::signal_add('message part', \&expand_part);
89 Irssi::signal_add('message quit', \&expand_quit);
90 Irssi::signal_add('message kick', \&expand_kick);
91 Irssi::signal_add('message topic', \&expand_topic);
92 Irssi::signal_add('message irc action', \&expand_message_public);
93 Irssi::signal_add('message irc notice', \&expand_message_public);