kwiki-spamwhitelist.pm 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. ##
  2. ## Homepage: http://www.kwiki.org/?KwikiSpamWhitelist
  3. ## Source: http://www.kwiki.org/?CodeKwikiSpamWhitelist
  4. ##
  5. package Kwiki::SpamWhitelist;
  6. use Kwiki::Plugin -Base;
  7. use Kwiki::Formatter;
  8. our $VERSION = '0.0';
  9. const class_id => 'spam_whitelist';
  10. sub register {
  11. my $registry = shift;
  12. $registry->add(preload => $self->class_id);
  13. }
  14. package Kwiki::SpamWhitelist::Mixin;
  15. use mixin 'Spoon::IndexList';
  16. use IO::All;
  17. sub spam_link {
  18. my ($url, $title) = @_;
  19. return unless $url =~ s/^https?:\/\/([^\/]+)/spam:\/\/$1/i;
  20. my $domain = $1;
  21. my $whitelist =
  22. $self->hub->spam_whitelist->plugin_directory . '/whitelist';
  23. my $index = $self->index_list($whitelist);
  24. my $ok = eval { $index->{$domain} };
  25. return 'spam' if $@;
  26. return if $ok;
  27. my $spam_link = qq{<span style="font-weight: bold; background-color: red">&lt;$url&gt;</span>};
  28. $spam_link = qq{<span>$title</span>$spam_link}
  29. unless $title =~ /^http/i;
  30. return $spam_link;
  31. }
  32. package Kwiki::Formatter::TitledHyperLink;
  33. use mixin 'Kwiki::SpamWhitelist::Mixin';
  34. no warnings;
  35. sub html {
  36. my $text = $self->escape_html($self->matched);
  37. my ($title1, $target, $title2) = ($text =~ $self->pattern_start);
  38. $title1 = '' unless defined $title1;
  39. $title2 = '' unless defined $title2;
  40. $target =~ s{^\w+:(?!//)}{};
  41. my $title = $title1 . ' ' . $title2;
  42. $title =~ s/^\s*(.*?)\s*$/$1/;
  43. $title = $target
  44. unless $title =~ /\S/;
  45. return $self->spam_link($target, $title) ||
  46. qq(<a href="$target">$title</a>);
  47. }
  48. package Kwiki::Formatter::HyperLink;
  49. use mixin 'Kwiki::SpamWhitelist::Mixin';
  50. sub html {
  51. my $text = $self->escape_html($self->matched);
  52. return $text if $text =~ s/^!//;
  53. return qq(<img src="$text" />)
  54. if $text =~ /(?:jpe?g|gif|png)$/i;
  55. my $target = $text;
  56. return $self->spam_link($target, $text) ||
  57. qq(<a href="$target">$text</a>);
  58. }