| Foorum documentation | Contained in the Foorum distribution. |
Foorum::Formatter - format content for Foorum
use Foorum::Formatter qw/filter_format/;
my $text = q~ :inlove: [b]Test[/b] [size=14]dsadsad[/size] [url=http://fayland/]da[/url]~;
my $html = filter($text, { format => 'ubb' } );
print $html;
# <img src="/static/images/bbcode/emot/inlove.gif"> <span style="font-weight:bold">Test</span> <span style="font-size:14px">dsadsad</span> <a href="http://fayland/">da</a>
Fayland Lam <fayland at gmail.com>
| Foorum documentation | Contained in the Foorum distribution. |
package Foorum::Formatter; use strict; use warnings; our $VERSION = '1.001000'; use base 'Exporter'; use Foorum::XUtils qw/config/; use vars qw/ @EXPORT_OK $has_text_textile $has_ubb_code $has_text_wiki $has_pod_simple $has_uri_find /; @EXPORT_OK = qw/ filter_format /; sub filter_format { my ( $text, $params ) = @_; my $format = $params->{format} || 'plain'; # don't run eval at beginning, run it when required if ( 'textile' eq $format and not defined $has_text_textile ) { $has_text_textile = eval 'use Text::Textile; 1;'; ## no critic (ProhibitStringyEval) } if ( 'ubb' eq $format and not defined $has_ubb_code ) { $has_ubb_code = eval 'use Foorum::Formatter::BBCode2; 1;'; ## no critic ## no critic (ProhibitStringyEval) } if ( 'wiki' eq $format and not defined $has_text_wiki ) { $has_text_wiki = eval 'use Text::GooglewikiFormat; 1;'; ## no critic ## no critic (ProhibitStringyEval) } if ( 'pod' eq $format and not defined $has_pod_simple ) { $has_pod_simple = eval 'use Foorum::Formatter::Pod; 1;'; ## no critic ## no critic (ProhibitStringyEval) } if ( 'textile' eq $format and $has_text_textile ) { my $formatter = Text::Textile->new(); $formatter->charset('utf-8'); $text = $formatter->process($text); } elsif ( 'ubb' eq $format and $has_ubb_code ) { my $formatter = Foorum::Formatter::BBCode2->new( { linebreaks => 1 } ); $text = $formatter->parse($text); # emot if ( $text =~ /\:\w{2,9}\:/s ) { my @emot_icon = ( 'wink', 'sad', 'biggrin', 'cheesy', 'confused', 'cool', 'angry', 'sads', 'smile', 'smiled', 'unhappy', 'dozingoff', 'blink', 'blush', 'crazy', 'cry', 'bigsmile', 'inlove', 'notify', 'shifty', 'sick', 'sleeping', 'sneaky2', 'tounge', 'unsure', 'wacko', 'why', 'wow', 'mad', 'Oo' ); my $config = config(); my $emot_url = $config->{dir}->{images} . '/bbcode/emot'; foreach my $em (@emot_icon) { next unless ( $text =~ /\:$em\:/s ); $text =~ s/\:$em\:/\<img src=\"$emot_url\/$em.gif\"\>/sg; last unless ( $text =~ /\:\w{2,9}\:/s ); } } } elsif ( 'pod' eq $format and $has_pod_simple ) { my $pod_format = Foorum::Formatter::Pod->new; $text = $pod_format->format($text); } elsif ( 'wiki' eq $format and $has_text_wiki ) { $text =~ s/&/&/gs; $text =~ s/>/>/gs; $text =~ s/</</gs; # replace link sub my $linksub = sub { my ( $link, $opts ) = @_; $opts ||= {}; my $ori_text = $link; ( $link, my $title ) = Text::GooglewikiFormat::find_link_title( $link, $opts ); ( $link, my $is_relative ) = Text::GooglewikiFormat::escape_link( $link, $opts ); unless ($is_relative) { return qq|<a href="$link" rel="nofollow">$title</a>|; } else { return $ori_text; } }; my %tags = %Text::GooglewikiFormat::tags; $tags{link} = $linksub; $text = Text::GooglewikiFormat::format( $text, \%tags ); } elsif ( 'html' eq $format ) { # do nothing? XXX? should we linebreak HTML? } else { $text =~ s/&/&/gs; # no_html $text =~ s|<|<|gs; $text =~ s|>|>|gs; #$text =~ s/'/'/g; #' #$text =~ s/"/"/g; #" $text =~ s|\n|<br />\n|gs; # linebreaks $has_uri_find = eval 'use URI::Find::UTF8; 1;' ## no critic ## no critic (ProhibitStringyEval) if ( not defined $has_uri_find ); if ($has_uri_find) { # find URIs my $finder = URI::Find::UTF8->new( sub { my ( $uri, $orig_uri ) = @_; return qq|<a href="$uri" rel="nofollow">$orig_uri</a>|; } ); $finder->find( \$text ); } } return $text; } 1; __END__