]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
[colorize-nicks] update to 0.4.0
authorAilin Nemui <redacted>
Thu, 14 May 2020 00:17:44 +0000 (02:17 +0200)
committerAilin Nemui <redacted>
Fri, 15 May 2020 07:37:43 +0000 (09:37 +0200)
port to Irssi 1.3 ABI 28

scripts/colorize_nicks.pl

index 41c675f90b19563a294c13ad35e9b585c1db08b7..35cb89510c900b53f10ffb4cc17a8523cfbe03b6 100644 (file)
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.3.7'; # 0887f6607e62b30
+our $VERSION = '0.4.0'; # ed9cb119fc4b3d1
 our %IRSSI = (
     authors     => 'Nei',
     contact     => 'Nei @ anti@conference.jabber.teamidiot.de',
@@ -57,52 +57,69 @@ my @ignore_list;
 
 my $colourer_script;
 
-sub prt_text_issue {
-    my ( $dest,
-        $text,
-        $stripped
-       ) = @_;
+sub _find_colourer {
     my $colourer;
     unless ($colourer_script
                && ($colourer = "Irssi::Script::$colourer_script"->can('get_nick_color2'))) {
-       for my $script (sort map { s/::$//r } grep { /^nickcolor|nm/ } keys %Irssi::Script::) {
+       for my $script (sort map { s/::$//r } keys %Irssi::Script::) {
            if ($colourer = "Irssi::Script::$script"->can('get_nick_color2')) {
                $colourer_script = $script;
                last;
            }
        }
     }
-    return unless $colourer;
+    $colourer
+}
+
+sub _get_chanref {
+    my ($dest) = @_;
     return unless $dest->{level} & MSGLEVEL_PUBLIC;
     return unless defined $dest->{target};
-    my $chanref = ref $dest->{server} && $dest->{server}->channel_find($dest->{target});
-    return unless $chanref;
+    return unless ref $dest->{server};
+    $dest->{server}->channel_find($dest->{target})
+}
+
+sub _colourise_nicks {
+    my ($dest, $chanref, $colourer, @nicks) = @_;
+
     my %nicks = map { $_->[0] => $colourer->($dest->{server}{tag}, $chanref->{name}, $_->[1], 1) }
        grep { defined }
-           map { if (my $nr = $chanref->nick_find($_)) {
-               [ $_ => $nr->{nick} ]
-           } }
-               keys %{ +{ map { $_ => undef } $stripped =~ /$nick_pat/g } };
+       map { if (my $nr = $chanref->nick_find($_)) {
+           [ $_ => $nr->{nick} ]
+       } }
+       keys %{ +{ map { $_ => undef } @nicks } };
     delete @nicks{ @ignore_list };
+
+    my $nick_re = join '|', map { quotemeta } sort { length $b <=> length $a } grep { length $nicks{$_} } keys %nicks;
+
+    (\%nicks, $nick_re)
+}
+
+sub _colourise_form {
+    my ( $text,
+        $skip,
+        $nicks,
+        $nick_re ) = @_;
+    return if $skip < 0;
+
+    my $repeat = Irssi::settings_get_bool('colorize_nicks_repeat_formats');
+
     my @forms = split /((?:$irssi_mumbo|\s|[.,*@%+&!#$()=~'";:?\/><]+(?=$irssi_mumbo|\s))+)/, $text, -1;
     my $ret = '';
     my $fmtstack = '';
-    my $nick_re = join '|', map { quotemeta } sort { length $b <=> length $a } grep { length $nicks{$_} } keys %nicks;
-    my $skip = Irssi::settings_get_int('colorize_nicks_skip_formats');
-    return if $skip < 0;
     while (@forms) {
        my ($t, $form) = splice @forms, 0, 2;
        if ($skip > 0) {
            --$skip;
            $ret .= $t;
            $ret .= $form if defined $form;
-           if (Irssi::settings_get_bool('colorize_nicks_repeat_formats')) {
+           if ($repeat) {
                $fmtstack .= join '', $form =~ /$irssi_mumbo/g if defined $form;
                $fmtstack =~ s/\cDe//g;
            }
        }
        elsif (length $nick_re
-                  && $t =~ s/((?:^|\s)\W{0,3}?)(?<!$nickchar|')($nick_re)(?!$nickchar)/$1$nicks{$2}$2\cDg$fmtstack/g) {
+                  && $t =~ s/((?:^|\s)\W{0,3}?)(?<!$nickchar|')($nick_re)(?!$nickchar)/$1$nicks->{$2}$2\cDg$fmtstack/g) {
            $ret .= "$t\cDg$fmtstack";
            $ret .= $form if defined $form;
            $fmtstack .= join '', $form =~ /$irssi_mumbo/g if defined $form;
@@ -113,7 +130,64 @@ sub prt_text_issue {
            $ret .= $form if defined $form;
        }
     }
-    Irssi::signal_continue($dest, $ret, $stripped);
+
+    $ret
+}
+
+# TXT_OWN_MSG,                                         server->nick, msg, nickmode
+# TXT_OWN_MSG_CHANNEL,                                 server->nick, target, msg, nickmode
+# TXT_PUBMSG_HILIGHT,                                  color, printnick, msg, nickmode
+# TXT_PUBMSG_HILIGHT_CHANNEL,                          color, printnick, target, msg, nickmode
+# for_me ? TXT_PUBMSG_ME : TXT_PUBMSG,                 printnick, msg, nickmode
+# for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL, printnick, target, msg, nickmode
+sub prt_format_issue {
+    my ( $theme,
+        $module,
+        $dest,
+        $format,
+        @args
+       ) = @_;
+    my $chanref = _get_chanref($dest);
+    return unless $chanref;
+    my $colourer = _find_colourer();
+    return unless $colourer;
+
+    my $arg = 1;
+    $arg++ if $format =~ /_channel/;
+    $arg++ if $format =~ /_hilight/;
+
+    utf8::decode($args[$arg]);
+    my $text = $args[$arg];
+    my $stripped = Irssi::strip_codes($text);
+
+    utf8::decode($stripped);
+    my ($nicks, $nick_re) = _colourise_nicks($dest, $chanref, $colourer, $stripped =~ /$nick_pat/g);
+    return unless $nicks;
+
+    $args[$arg] = _colourise_form($text, 0, $nicks, $nick_re);
+    Irssi::signal_continue($theme, $module, $dest, $format, @args)
+           if defined $args[$arg] && $args[$arg] ne $text;
+}
+
+sub prt_text_issue {
+    my ( $dest,
+        $text,
+        $stripped
+       ) = @_;
+    my $chanref = _get_chanref($dest);
+    return unless $chanref;
+    my $colourer = _find_colourer();
+    return unless $colourer;
+
+    utf8::decode($text);
+    utf8::decode($stripped);
+    my ($nicks, $nick_re) = _colourise_nicks($dest, $chanref, $colourer, $stripped =~ /$nick_pat/g);
+    return unless $nicks;
+
+    my $skip = Irssi::settings_get_int('colorize_nicks_skip_formats');
+    my $ret = _colourise_form($text, $skip, $nicks, $nick_re);
+    Irssi::signal_continue($dest, $ret, $stripped)
+           if defined $ret && $ret ne $text;
 }
 
 sub setup_changed {
@@ -124,12 +198,18 @@ sub init {
     setup_changed();
 }
 
-Irssi::signal_add({
-    'print text' => 'prt_text_issue',
-});
+if ((Irssi::parse_special('$abiversion')||0) >= 28) {
+    Irssi::signal_add(
+       'print format' => 'prt_format_issue'
+       );
+} else {
+    Irssi::signal_add(
+       'print text' => 'prt_text_issue'
+    );
+    Irssi::settings_add_int('colorize_nicks', 'colorize_nicks_skip_formats' => 2);
+}
 Irssi::signal_add_last('setup changed' => 'setup_changed');
 
-Irssi::settings_add_int('colorize_nicks', 'colorize_nicks_skip_formats' => 2);
 Irssi::settings_add_str('colorize_nicks', 'colorize_nicks_ignore_list' => '');
 Irssi::settings_add_bool('colorize_nicks', 'colorize_nicks_repeat_formats' => 0);
 
git clone https://git.99rst.org/PROJECT