The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Text::Emoticon::MSN;

use strict;
our $VERSION = '0.04';

use Text::Emoticon 0.03;
use base qw(Text::Emoticon);

sub default_config {
    return {
        imgbase => "http://messenger.msn.com/Resource/emoticons",
        xhtml   => 1,
        strict  => 0,
        class   => undef,
    };
}

# Table autogernerated from Emoticons.aspx using
# $_ = join "", <>;
# while (m@(<img src="emoticons/(.*?)">|<span class="bold">(.*?)</span>)@g) {
#   $icon = $2 if $2;
#   ($t = $2) =~ s/'/\\'/;
#   $print qq('$t' => "$icon",\n) if $3;
# }

__PACKAGE__->register_subclass({
':-)' => "regular_smile.gif",
':)' => "regular_smile.gif",
':-D' => "teeth_smile.gif",
':d' => "teeth_smile.gif",
':-O' => "omg_smile.gif",
':o' => "omg_smile.gif",
':-P' => "tongue_smile.gif",
':p' => "tongue_smile.gif",
';-)' => "wink_smile.gif",
';)' => "wink_smile.gif",
':-(' => "sad_smile.gif",
':(' => "sad_smile.gif",
':-S' => "confused_smile.gif",
':s' => "confused_smile.gif",
':-|' => "what_smile.gif",
':|' => "what_smile.gif",
':\'(' => "cry_smile.gif",
':-$' => "red_smile.gif",
':$' => "red_smile.gif",
'(H)' => "shades_smile.gif",
'(h)' => "shades_smile.gif",
':-@' => "angry_smile.gif",
':@' => "angry_smile.gif",
'(A)' => "angel_smile.gif",
'(a)' => "angel_smile.gif",
'(6)' => "devil_smile.gif",
':-#' => "47_47.gif",
'8o|' => "48_48.gif",
'8-|' => "49_49.gif",
'^o)' => "50_50.gif",
':-*' => "51_51.gif",
'+o(' => "52_52.gif",
':^)' => "71_71.gif",
'*-)' => "72_72.gif",
'<:o)' => "74_74.gif",
'8-)' => "75_75.gif",
'|-)' => "77_77.gif",
'(C)' => "coffee.gif",
'(c)' => "coffee.gif",
'(Y)' => "thumbs_up.gif",
'(y)' => "thumbs_up.gif",
'(N)' => "thumbs_down.gif",
'(n)' => "thumbs_down.gif",
'(B)' => "beer_mug.gif",
'(b)' => "beer_mug.gif",
'(D)' => "martini.gif",
'(d)' => "martini.gif",
'(X)' => "girl.gif",
'(x)' => "girl.gif",
'(Z)' => "guy.gif",
'(z)' => "guy.gif",
'({)' => "guy_hug.gif",
'(})' => "girl_hug.gif",
':-[' => "bat.gif",
':[' => "bat.gif",
'(^)' => "cake.gif",
'(L)' => "heart.gif",
'(l)' => "heart.gif",
'(U)' => "broken_heart.gif",
'(u)' => "broken_heart.gif",
'(K)' => "kiss.gif",
'(k)' => "kiss.gif",
'(G)' => "present.gif",
'(g)' => "present.gif",
'(F)' => "rose.gif",
'(f)' => "rose.gif",
'(W)' => "wilted_rose.gif",
'(w)' => "wilted_rose.gif",
'(P)' => "camera.gif",
'(p)' => "camera.gif",
'(~)' => "film.gif",
'(@)' => "cat.gif",
'(&)' => "dog.gif",
'(T)' => "phone.gif",
'(t)' => "phone.gif",
'(I)' => "lightbulb.gif",
'(i)' => "lightbulb.gif",
'(8)' => "note.gif",
'(S)' => "moon.gif",
'(*)' => "star.gif",
'(E)' => "envelope.gif",
'(e)' => "envelope.gif",
'(O)' => "clock.gif",
'(o)' => "clock.gif",
'(M)' => "messenger.gif",
'(m)' => "messenger.gif",
'(sn)' => "53_53.gif",
'(bah)' => "70_70.gif",
'(pl)' => "55_55.gif",
'(||)' => "56_56.gif",
'(pi)' => "57_57.gif",
'(so)' => "58_58.gif",
'(au)' => "59_59.gif",
'(ap)' => "60_60.gif",
'(um)' => "61_61.gif",
'(ip)' => "62_62.gif",
'(co)' => "63_63.gif",
'(mp)' => "64_64.gif",
'(st)' => "66_66.gif",
'(li)' => "73_73.gif",
'(mo)' => "69_69.gif",
});

1;
__END__

=head1 NAME

Text::Emoticon::MSN - Emoticon filter of MSN Messenger

=head1 SYNOPSIS

  use Text::Emoticon::MSN;

  my $emoticon = Text::Emoticon::MSN->new(
      imgbase => "http://example.com/emo",
  );

  my $text = "Yet Another Perl Hacker ;-)";
  print $emoticon->filter($text);

  # it prints
  # Yet Another Perl Hacker <img src="http://example.com/emo/regular_smile.gif" />

=head1 DESCRIPTION

Text::Emoticon::MSN is a text filter that replaces text emoticons like ":-)", ";-P", etc. to the icons of MSN Messenger, detailed in http://messenger.msn.com/Resource/Emoticons.aspx

=head1 METHODS

=over 4

=item new

  $emoticon = Text::Emoticon::MSN->new(
      imgbase => "http://yourhost.example.com/images/emoticons",
      xhtml   => 1,
      class   => "emoticon",
  );

Constructs new Text::Emoticon::MSN object. It accepts two options:

=over 6

=item imgbase

Base URL where icon gif files are located. It defaults to
"http://messenger.msn.com/Resource/emoticons" (the MSN site) but I
don't recommend that, as there's a possibility MSN will ban your site.

=item xhtml

Whether it uses XHTML style img tags. It defaults to 1.

=item class

CSS class used in C<img> tags. It defaults to nothing.

  $emoticon = Text::Emoticon::MSN->new(class => "emo");

will print:

  <img src="blah.gif" class="emo" />
 
=item strict

Whether it will disable smileys with space in them.
defaults to 0.
 
=back

=item filter

  $filtered_text = $emoticon->filter($text);

Filters emoticons in text and returns C<img> tagged text (HTML).

=back

=head1 TODO

=over 4

=item *

Handling original emoticons. (Patches welcome)

=item *

Common API for other Emoticons like Yahoo! (maybe Text::Emoticons)

=back

=head1 AUTHOR

Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 SEE ALSO

http://messenger.msn.com/Resource/Emoticons.aspx

=cut