package Text::Emoticon;
use strict;
our $VERSION = '0.04';
use UNIVERSAL::require;
my %map;
sub new {
my $class = shift;
if ($class eq __PACKAGE__) {
my $driver = shift;
my $args = @_ == 1 ? $_[0] : {@_};
my $subclass = "Text::Emoticon::$driver";
$subclass->require or die $@;
return bless { %{$subclass->default_config}, %$args }, $subclass;
} else {
my $args = @_ == 1 ? $_[0] : {@_};
return bless { %{$class->default_config}, %$args }, $class;
}
}
sub register_subclass {
my $class = shift;
my($map) = @_;
my $subclass = caller;
$map{$subclass} = $map;
}
sub map { $map{ref($_[0])} }
sub pattern {
my $self = shift;
$self->{re} ||= "(" . join("|", map quotemeta($_), sort { length($b) <=> length($a) } keys %{$self->map}) . ")";
$self->{re};
}
sub filter_one {
my $self = shift;
my($text) = @_;
$self->do_filter($self->map->{$text});
}
sub filter {
my($self, $text) = @_;
return unless defined $text;
my $re = $self->pattern;
if ($self->{strict}) {
$text =~ s{(?do_filter($self->map->{$1})}eg;
} else {
$text =~ s{$re}{$self->do_filter($self->map->{$1})}eg;
}
return $text;
}
sub do_filter {
my($self, $icon) = @_;
my $class = $self->{class} ? qq( class="$self->{class}") : "";
my $xhtml = $self->{xhtml} ? qq( /) : "";
return qq(
);
}
1;
__END__
=head1 NAME
Text::Emoticon - Factory class for Yahoo! and MSN emoticons
=head1 SYNOPSIS
use Text::Emoticon;
my $emoticon = Text::Emoticon->new('MSN', { strict => 1, xhtml => 0 });
print $emoticon->filter('Hello ;)');
=head1 DESCRIPTION
Text::Emoticon is a factory class to dispatch MSN/YIM emoticon
set. It's made to become handy to be used in other applications like
Kwiki/MT plugins.
=head1 AUTHOR
Tatsuhiko Miyagawa Emiyagawa@bulknews.netE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
L, L
=cut