package MT::Plugin::ModTextFilter; use strict; use MT; use MT::Plugin; use MT::Util qw( encode_html ); use vars qw( @ncv_tags @ncv_br_tags ); @ncv_tags = qw( pre textarea table ol dl ul menu dir ); @ncv_br_tags = qw ( blockquote div p h1 h2 h3 h4 h5 h6 form address ); # show plugin information to main menu eval("use Storable;"); if (!$@ && MT->can('add_plugin')) { my $plugin = MT::Plugin->new; $plugin->description('Modified text filter.'); if (MT->version_number >= 3.2) { $plugin->name('Modified Text Filter'); $plugin->version('1.0'); } else { $plugin->name('Modified Text Filter 1.0'); } MT->add_plugin($plugin); } MT->add_text_filter('ModTextFilter' => { label => '改良テキストフィルター', on_format => \&modified_text_filter }); sub modified_text_filter { my $str = shift; my ($pattern, $found, $replace, $tag, $attr, $inner, $tags); $str ||= ''; # convert to html entities while ($str =~ /((\r?\n)?(.*?)(\r?\n)?<\/enchtml>)/s) { $found = quotemeta($1); $replace = encode_html($3); $str =~ s/$found/$replace/; } # pre convert push @ncv_tags, "noconv"; push @ncv_br_tags, "convbr"; my @c_tags; push @c_tags, @ncv_tags; push @c_tags, @ncv_br_tags; $tags = join "|", @c_tags; $pattern = "(<($tags)(.*?)>(.*?))"; while ($str =~ /$pattern/s) { $found = quotemeta($1); $tag = $2; $attr = $3; $inner = $4; $inner =~ s/\r?\n/\@\$\@cr\@\$\@/sg; $inner =~ s/^\@\$\@cr\@\$\@/\@\$\@fcr\@\$\@/; $inner =~ s/\@\$\@cr\@\$\@$/\@\$\@ecr\@\$\@/; $inner =~ s/<(.*?)>//sg; $replace = "${inner}"; $str =~ s/$found/$replace/; } # convert my @paras = split /\r?\n\r?\n/, $str; for my $p (@paras) { if ($p !~ /<\/T($tags)>/g) { $p =~ s/\r?\n/
\n/g; $p = "

\n$p\n

"; } } $str = join "\n\n", @paras; # after convert $tags = join "|", @ncv_tags; $pattern = "((.*?))"; while ($str =~ /$pattern/s) { $found = quotemeta($1); $tag = $2; $attr = $3; $inner = $4; $inner =~ s/\@\$\@cr\@\$\@/\n/g; $inner =~ s//<$1>/sg; $replace = "<${tag}${attr}>${inner}"; $str =~ s/$found/$replace/s; } $tags = join "|", @ncv_br_tags; $pattern = "((.*?))"; while ($str =~ /$pattern/s) { $found = quotemeta($1); $tag = $2; $attr = $3; $inner = $4; $inner =~ s/\@\$\@cr\@\$\@/
\n/g; $inner =~ s//<$1>/sg; $replace = "<${tag}${attr}>${inner}"; $str =~ s/$found/$replace/s; } $str =~ s/\@\$\@fcr\@\$\@/\n/sg; $str =~ s/\@\$\@ecr\@\$\@/\n/sg; $str =~ s/<\/?noconv>\n?//sg; $str =~ s/<\/?convbr>\n?//sg; $str; } 1;