Quote<ich> Dies ist ein [[Test]].
<bot> http://de.wikipedia.org/wiki/Test
Quote<ich> Dies ist ein [[Test]] von [[Irssi]].
<bot> http://de.wikipedia.org/wiki/Test_von_Irssi
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");
2013-08-04T15:46:22 CthulhuxCode (perl): (dl )1 2 3 4 5if (/\[\[(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^|°|,|`|\/|;|'|\:|\[|\])*\]\]/i { my $wplink = linkify($&); my $retval = "http://de.wikipedia.org/wiki/" . encode('latin1',$wplink); $server->command("MSG $target $retval"); }
2013-08-04T16:58:10 RaubtierIn beiden Regexps benutzt du den *, dieser matcht also so viele Zeichen wie möglich und sucht dann also praktisch von hinten die passenden ]] oder }}. Du möchtest die aber von vorne suchen, also die ersten ]] hinter den [[, d.h. du musst hier statt des * ein *? verwenden.
2013-08-04T16:58:10 RaubtierUnd als zweites kannst du das if durch while ersetzen.
Quote<ich> oder ein [[Doctor]] (evtl. [[Doctor Who]]).
<bot> http://de.wikipedia.org/wiki/Doctor
<bot> http://de.wikipedia.org/wiki/Doctor
<bot> http://de.wikipedia.org/wiki/Doctor
<bot> http://de.wikipedia.org/wiki/Doctor
<bot> http://de.wikipedia.org/wiki/Doctor
<ich> äh
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 33 34 35 36 37 38
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 while (/\[\[(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^,|`|\/|;|'|\:|\[|\])*?\]\]/i) { # is linky there? return if $server->channel_find($target)->nick_find_mask("*linky"); my $wplink = linkify($&); my $retval = "http://de.wikipedia.org/wiki/" . encode('latin1',$wplink); $server->command("MSG $target $retval"); } while (/\{\{(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^,|\`|\/|;|'|\:|\[|\])*?\}\}/i) { # is linky there? return if $server->channel_find($target)->nick_find_mask("*linky"); 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");
2013-08-04T16:58:10 RaubtierDie Ausdrücke sehen unnötig kompliziert aus. Wenn du mehrere Zeichen erlauben willst, kannst du statt a|b|c|d einfach [abcd] schreiben (und wenn die Zeichen zusammenhängen, geht auch [a-d].
2013-08-04T16:58:10 Raubtierdein linkify machst ja eigentlich auch nicht einen Link, wie der Name vermuten lassen würde, sondern entfernt ja diese nur.
2013-08-04T16:58:10 RaubtierUnd ich finde es angenehmer, das gefundene mit () einzufangen und dann $1 zu nehmen statt $&