Thread irssi: mehrere RegEx in einer Zeile traversieren (4 answers)
Opened by Cthulhux at 2013-08-04 17:46

Cthulhux
 2013-08-04 17:46
#169349 #169349
User since
2013-08-04
3 Artikel
BenutzerIn
[default_avatar]
'hoi,

mein IRC-Bot (Sammlung von Perlskripten in irssi) kann unter anderem Wikipedia-Links umwandeln.

Beispiel:

Quote
<ich> Dies ist ein [[Test]].
<bot> http://de.wikipedia.org/wiki/Test


Das klappt auch ganz gut - mit einem einzigen Link. Sobald es mehr werden, funktioniert das aber nicht mehr so recht:

Quote
<ich> Dies ist ein [[Test]] von [[Irssi]].
<bot> http://de.wikipedia.org/wiki/Test_von_Irssi


Wahrscheinlich muss ich da nur irgendwas mit while einbauen, richtig?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use strict;
use Encode qw(encode decode);
use Irssi qw(signal_add);

sub linkify {
    my ($text) = @_;

    $text =~ s/ /_/gm;
    $text =~ s/\[\[|\]\]|\{\{|\}\}//gm;
    return $text;
}

sub wikilink {
    my ($server, $message, $nick, $address, $target) = @_;

    $_ = decode('utf-8',$message);  # recognize umlauts

    if (/\[\[(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^|°|,|`|\/|;|'|\:|\[|\])*\]\]/i {
        my $wplink = linkify($&);
        my $retval = "http://de.wikipedia.org/wiki/" . encode('latin1',$wplink);
        $server->command("MSG $target $retval");
    }
    elsif (/\{\{(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^|°|,|\`|\/|;|'|\:|\[|\])*\}\}/i) {
        my $wplink = linkify($&);
        my $retval = "http://de.wikipedia.org/wiki/Vorlage:" . encode('latin1',$wplink);
        $server->command("MSG $target $retval");
    }

    return 0;
}

signal_add("message public","wikilink");


(Dass da einige irssi-spezifische Erweiterungen drin sind, stört hoffentlich nicht. Das Problem selbst sollte ja auf Perlbasis lösbar sein...?)

Hoffe auf Hilfe.

View full thread irssi: mehrere RegEx in einer Zeile traversieren