############################################################################### # YaBBC.pm # # $Date: 06.01.16 $ # ############################################################################### # YaBB: Yet another Bulletin Board # # Open-Source Community Software for Webmasters # # Version: YaBB 2.6.13 # # Packaged: June 1, 2016 # # Distributed by: http://www.yabbforum.com # # =========================================================================== # # Copyright (c) 2000-2016 YaBB (www.yabbforum.com) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### no warnings qw(uninitialized once); use CGI::Carp qw(fatalsToBrowser); our $VERSION = '2.6.13'; $yabbcpmver = 'YaBB 2.6.13 $Revision$'; $action ||= q{}; if ( $action eq 'detailedversion' ) { return 1; } LoadLanguage('Post'); $yyYaBBCloaded = 1; sub MakeSmileys { my ($inp) = @_; my $message = join q{}, $inp; my $i = 0; my @HTMLtags; while ( $message =~ s/(<.+?>)/[HTML$i]/sm ) { push @HTMLtags, $1; $i++; } $message =~ s~(\W|^)\[smil(ie|ey)=(\S+?\.(gif|jpg|png|bmp))\]~$1$post_txt{'287'}~gism; $message =~ s~(\W|^);-?\)~$1$post_txt{'292'}~gsm; $message =~ s~(\W|^);D~$1$post_txt{'293'}~gsm; $message =~ s~(\W|^):\x27\(~$1$post_txt{'530'}~gsm; $message =~ s~(\W|^):-/~$1$post_txt{'528'}~gsm; $message =~ s~(\W|^):-X~$1$post_txt{'527'}~gsm; $message =~ s~(\W|^):-\[~$1$post_txt{'526'}~gsm; $message =~ s~(\W|^):-\*~$1$post_txt{'529'}~gsm; $message =~ s~(\W|^)>:\(~$1$post_txt{'288'}~gsm; $message =~ s~(\W|^)::\)~$1$post_txt{'450'}~gsm; $message =~ s~(\W|^):P~$1$post_txt{'451'}~gsm; $message =~ s~(\W|^):-?\)~$1$post_txt{'287'}~gsm; $message =~ s~(\W|^):D~$1$post_txt{'289'}~gsm; $message =~ s~(\W|^):-?\(~$1$post_txt{'291'}~gsm; $message =~ s~(\W|^):o~$1$post_txt{'294'}~gism; $message =~ s~(\W|^)8-\)~$1$post_txt{'295'}~gsm; $message =~ s~(\W|^):-\?~$1$post_txt{'296'}~gsm; $message =~ s~(\W|^)\^_\^~$1$post_txt{'801'}~gsm; $message =~ s~(\W|^):thumb~$1$post_txt{'282'}~gsm; $message =~ s~(\W|^)>:-D~$1$post_txt{'802'}~gsm; my $count = 0; while ($SmilieURL[$count]) { if ( $SmilieURL[$count] =~ /\//ixsm ) { $tmpurl = $SmilieURL[$count]; } else { $tmpurl = qq~$imagesdir/$SmilieURL[$count]~; } $tmpcode = $SmilieCode[$count]; $tmpcode =~ s/&\x2336;/\$/gxsm; $tmpcode =~ s/&\x2364;/\@/gxsm; $message =~ s/\Q$tmpcode\E/$SmilieDescription[$count]/gsm; $count++; } $i = 0; while ( $message =~ s/\[HTML$i\]/$HTMLtags[$i]/xsm ) { $i++; } return $message; } @ycssvalues = qw ( quote quote2 ); $ycssnum = 2; $ycsscounter = 2; $qid_cnt = 0; sub quotemsg { my ( $qauthor, $qlink, $qdate, $qmessage ) = @_; my ( $testauthor, $fqauthor ); $qid = $qauthor . $qid_cnt; $qid_cnt++; if ($qauthor) { $usernames_life_quote{'temp_quote_autor'} = $qauthor; # for display names in Quotes in LivePreview ToChars($qauthor); if ( !-e "$memberdir/$qauthor.vars" ) { # if the file is there it is an unencrypted user ID $qauthor = decloak($qauthor); # if not, decrypt it and see if it is a registered user if ( !-e "$memberdir/$qauthor.vars" ) { # if still not found probably the author is a screen name $testauthor = MemberIndex( 'check_exist', "$qauthor" ); # check if this name exists in the memberlist if ( $testauthor ) { # if it is, load the user id returned $qauthor = $testauthor; LoadUser($qauthor); $fqauthor = ${ $uid . $qauthor }{'realname'}; # set final author var to the current users screen name } else { $fqauthor = decloak($qauthor); # if all fails it is a non-existent real name so decode and assign as screenname } } else { LoadUser($qauthor); # after encoding the user ID was found and loaded, setting the current real name $fqauthor = ${ $uid . $qauthor }{'realname'}; } } else { LoadUser($qauthor); # it was an old style user id which could be loaded and screen name set to final author $fqauthor = ${ $uid . $qauthor }{'realname'}; } $qmessage =~ s/\/me\s+(.*?)(\n|\Z)(.*?)/* $fqauthor<\/span> $1<\/i>$2$3/igsm; } # next 2 lines: for display names in Quotes in LivePreview $usernames_life_quote{ $usernames_life_quote{'temp_quote_autor'} } = $fqauthor; delete $usernames_life_quote{'temp_quote_autor'}; $qmessage = parseimgflash($qmessage); $qdate = timeformat($qdate,0,0,0,1); # generates also the global variable $daytxt $cssbg = $ycssvalues[ ( $ycsscounter % $ycssnum ) ]; $ycsscounter++; if ( $fqauthor eq q{} || $qlink eq q{} || $qdate eq q{} ) { $_ = $post_txt{'601'}; } elsif ( $qlink eq 'impost' ) { $_ = $daytxt ? $post_txt{'600a_d'} : $post_txt{'600a'}; $_ =~ s/AUTHOR2/$scripturl?action=viewprofile;username=$useraccount{$qauthor}/gxsm; } elsif ( $action ne 'imshow' && $action ne 'imsend' && $action ne 'imsend2' ) { $_ = $daytxt ? $post_txt{'600_d'} : $post_txt{'600'}; } else { $_ = $daytxt ? $post_txt{'599_d'} : $post_txt{'599'}; } $_ =~ s/AUTHOR/$fqauthor/gxsm; $_ =~ s/QUOTELINK/$scripturl?num=$qlink/gxsm; $_ =~ s/DATE/$qdate/gxsm; $_ =~ s/QUOTE/$qmessage/gxsm; $_ =~ s/QID/$qid/gxsm; $_ =~ s/QEND//gxsm; return $_; } sub parseimgflash { my ($tmp_message) = @_; $tmp_message =~ s/\[flash\=(\S+?),(\S+?)](\S+?)\[\/flash\]/$display_txt{'769'} ($1 x $2):<\/b> >$3<\/a>/gxsm; my $char_160 = chr 160; my $hardspace = q~ ~; if ( !$showimageinquote || ( ${ $uid . $username }{'hide_img'} && $user_hide_img ) ) { $tmp_message =~ s/\[img (.+?)\]/[img\]/igsm; $tmp_message =~ s/\[img\](?:\s|\t|\n|$hardspace|$char_160)*(http\:\/\/)*(.+?)(?:\s|\t|\n|$hardspace|$char_160)*\[\/img\]/\[url\]$1$2\[\/url\]/igsm; } return $tmp_message; } { my %killhash = ( q{;} => ';', q{!} => '!', q{(} => '(', q{)} => ')', q{-} => '-', q{.} => '.', q{/} => '/', q{:} => ':', q{?} => '?', q{[} => '[', q{\\} => '\', q{]} => ']', q{^} => '^', 'D' => 'D', ); $codecnt = 0; sub codemsg { my ( $code, $class ) = @_; my @codeclass = ( [ 'c++', 'css', 'html', 'java', 'javascript', 'pascal', 'perl', 'php', 'sql', ], [ 'sh_cpp', 'sh_css', 'sh_html', 'sh_java', 'sh_javascript', 'sh_pascal', 'sh_perl', 'sh_php', 'sh_sql', ], [ ' (C++)', ' (CSS)', ' (HTML)', ' (Java)', ' (Javascript)', ' (Pascal)', ' (Perl)', ' (PHP)', ' (SQL)' ], ); my $insclass = 'code'; my $prclass = q{}; foreach my $i ( 0 .. 8 ) { my $img0 = $codeclass[0]->[$i]; my $img1 = $codeclass[1]->[$i]; my $img2 = $codeclass[2]->[$i]; if ( lc $class eq $img0 ) { $insclass = $img1; $prclass = $img2; } } ToChars($code); if ( $code !~ /&\S*;/gsm ) { $code =~ s/;/&\x23059;/gsm; } $code =~ s/([\(\)\-\:\\\/\?\!\]\[\.\^\.D])/$killhash{$1}/gxsm; $code =~ s/\&\#91\;highlight\&\#93\;(.*?)\&\#91\;\&\#47\;highlight\&\#93\;/$1<\/span>/isgxsm; $_ = $post_txt{'602'}; # Thx. to Michael Prager for the improved Code boxes # count lines in code $linecount = () = $code =~ /\n/gxsm; # if more that 20 lines then limit code box height if ( $linecount > 20 ) { $height = 'height: 300px;'; } else { $height = q{}; } # try to display text as it was originally intended $code =~ s/ \  \  \ /\t/igsm; $code =~ s/\ / /igxsm; $code =~ s/\s*?\n\s*?/\[code_br\]/igxsm; # we need to keep normal linebreaks inside
 tag
        $code =~ s/">/\[code_qgt\]/igxsm;
        $codecnt++;
        if ( $guest_media_disallowed && $iamguest ) {
            $prselect = q{};
        }
        else {
            $prselect =
qq~$post_txt{'selectall'}~;
        }

        $code =
qq~
$code\[code_br][code_br]
~; $_ =~ s/XSELECTX/$prselect/gxsm; $_ =~ s/XLANGX/$prclass/gxsm; $_ =~ s/CODE/$code/gxsm; return $_; } sub noparse { my ($noubbc) = @_; $noubbc =~ s/([!\(\)\-\.\/:\?\[\\\]\^D])/$killhash{$1}/gxsm; return $noubbc; } } sub imagemsg { my ( $rest, $attribut, $url, $type ) = @_; # use or kill urls $url =~ s/\[url\](.*?)\[\/url\]/$1/igxsm; $url =~ s/\[link\](.*?)\[\/link\]/$1/igxsm; $url =~ s/\[url\s*=\s*(.*?)\s*.*?\].*?\[\/url\]/$1/igxsm; $url =~ s/\[link\s*=\s*(.*?)\s*.*?\].*?\[\/link\]/$1/igxsm; $url =~ s/\[url.*?\/url\]//igxsm; $url =~ s/\[link.*?\/link\]//igxsm; my $char_160 = chr 160; $url =~ s/\s|\?| |$char_160//gxsm; if ( $url !~ /^http.+\.(gif|jpg|jpeg|png|bmp)$/ixsm ) { return $rest . $url; } my %parameter; FromHTML($attribut); $attribut =~ s/(\s|$char_160)+/ /gxsm; local *altconv = sub { my ( $attfirst, $attalt, $attlast ) = @_; $attalt =~ s/\s/_/gxsm; $attfirst . qq~ alt=$attalt $attlast~; }; $attribut =~ s/(.*?)alt=(.+?)(\s\S+=|\Z)/ altconv($1,$2,$3)/eisgxm; foreach ( split / +/sm, $attribut ) { my ( $key, $value ) = split /=/sm, $_; $value =~ s/[\x22\x27]//gxsm; $parameter{$key} = $value; } my $use_greybox = $img_greybox; if ( $action eq 'ajxmessage' || $action eq 'ajximmessage' || $action eq 'ajxcal' ) { $parameter{'name'} = q~class="liveimg" name="post_liveimg_resize"~; $use_greybox = 0; } elsif ( $action eq 'eventcal' ) { $parameter{'name'} = q~id="post_img_resize"~; } else { $parameter{'name'} = $type ? q~id="signat_img_resize"~ : q~id="post_img_resize"~; } $parameter{'alt'} =~ s/[<>"]/*/gxsm; $parameter{'alt'} =~ s/_/ /gxsm; if ( $url =~ /([^\/]+?)$/xsm ) { $parameter{'alt'} ||= $1; } $parameter{'align'} =~ s/[^a-z]//igxsm; $parameter{'width'} =~ s/\D//gxsm; $parameter{'height'} =~ s/\D//gxsm; if ( $parameter{'align'} ) { $parameter{'align'} = qq~ style="vertical-align:$parameter{'align'}"~; } if ( $parameter{'width'} ) { $parameter{'width'} = qq~ width="$parameter{'width'}"~; } if ( $parameter{'height'} ) { $parameter{'height'} = qq~ height="$parameter{'height'}"~; } my $linkedimg = $rest =~ /\[url[^\[]*\]\s*$/ism ? 1 : 0; return $rest . ( ( !$linkedimg && $use_greybox ) ? qq~~ : q{} ) . qq~$parameter{'alt'}~ . ( ( !$linkedimg && $img_greybox ) ? '' : q{} ); } #greybox image bug fixed; sub DoUBBC { my ($image_type) = @_; $ycsscounter = 2; if ( $ns && $ns eq 'NS' || $message =~ s/\x23nosmileys//isgm ) { return $message; } if ( ${ $uid . $username }{'hide_img'} && $user_hide_img ) { $message = parseimgflash($message); } $message =~ s/\[noparse\](.*?)(\[\/noparse\]|$)/noparse($1)/eisgm; $message =~ s/\[reason\](.+?)\[\/reason\]//igsm; $message =~ s/\[code\]/ \[code\]/igsm; $message =~ s/\[\/code\]/ \[\/code\]/igsm; $message =~ s/\[quote\]/ \[quote\]/igsm; $message =~ s/\[\/quote\]/ \[\/quote\]/igsm; $message =~ s/\[glow\]/ \[glow\]/igsm; $message =~ s/\[\/glow\]/ \[\/glow\]/igsm; $message =~ s/
|
/\n/igsm; $message =~ s/
\x1f|
\x1f/\n/igsm; $message =~ s/\[code\s*(.*?)\]\n*(.+?)\n*\[\/code\]/codemsg($2,$1)/eisgm; # [code] must come at first! At least before image transformation! $message =~ s/\[([^\]\[]{0,30})\n([^\]\[]{0,30})\]/\[$1$2\]/gsm; $message =~ s/\[\/([^\]\[]{0,30})\n([^\]\[]{0,30})\]/\[\/$1$2\]/gsm; #$message =~ s~(\w+://[^<>\s\n\"\]\[]+)\n([^<>\s\n\"\]\[]+)~$1\n$2~g; $message =~ s/\[b\](.*?)\[\/b\]/$1<\/b>/isgm; $message =~ s/\[i\](.*?)\[\/i\]/$1<\/i>/isgm; $message =~ s/\[u\](.*?)\[\/u\]/$1<\/span>/isgm; $message =~ s/\[s\](.*?)\[\/s\]/$1<\/span>/isgm; $message =~ s/\[glb\](.*?)\[\/glb\]/
$1<\/div>/isgm; # $message =~ #s/( | )*\[move\](.*?)\[\/move\]/
$2<\/div>/isg; $message =~ s/( | )*\[move\](.*?)\[\/move\]/$2<\/marquee>/isgm; # Quote message while ( $message =~ s/\[quote(\s+author=(.*?)\s+link=(.*?)\s+date=(.*?)\s*)?\]\n*(.*?)\n*\[\/quote\]/ quotemsg($2,$3,$4,$5) /eisgm ){} # Images in message. Must come behind "Quote message" due to $showimageinquote in "emsg -> &parseimgflash while ( $message =~ s/(\[url[^\[]*\]\s*)?\[img(.*?)\](.*?)\[\/img\]/ imagemsg($1,$2,$3,$image_type) /eisgm ) { } $message =~ s/\[color=([A-Za-z0-9# ]+)\](.+?)\[\/color\]/$2<\/span>/isgm; $message =~ s/\[black\](.*?)\[\/black\]/$1<\/span>/isgm; $message =~ s/\[white\](.*?)\[\/white\]/$1<\/span>/isgm; $message =~ s/\[red\](.*?)\[\/red\]/$1<\/span>/isgm; $message =~ s/\[green\](.*?)\[\/green\]/$1<\/span>/isgm; $message =~ s/\[blue\](.*?)\[\/blue\]/$1<\/span>/isgm; $message =~ s/\[timestamp\=([\d]{9,10})\]/timeformat($1)/eisgm; $message =~ s/\[font=([A-Za-z0-9# -]+)\](.+?)\[\/font\]/$2<\/span>/isgm; while ( $message =~ s/\[size=([A-Za-z0-9# ]+)\](.+?)\[\/size\]/sizefont($1,$2)/eisgm ) { } $message =~ s/\[tt\](.*?)\[\/tt\]/$1<\/span>/isgm; $message =~ s/\[left\](.*?)\[\/left\]/
$1<\/div>/isgm; $message =~ s/\[center\](.*?)\[\/center\]/
$1<\/div>/isgm; $message =~ s/\[right\](.*?)\[\/right\]/
$1<\/div>/isgm; $message =~ s/\[justify\](.*?)\[\/justify\]/
$1<\/div>/isgm; $message =~ s/\[sub\](.*?)\[\/sub\]/$1<\/sub>/isgm; $message =~ s/\[sup\](.*?)\[\/sup\]/$1<\/sup>/isgm; $message =~ s/\[fixed\](.*?)\[\/fixed\]/$1<\/span>/isgm; $message =~ s/\[hr\]\n/
/gsm; $message =~ s/\[hr\]/
/gsm; $message =~ s/\[br\]/\n/igsm; ## code moved ## $message =~ s/\[highlight\](.*?)\[\/highlight\]/$1<\/span>/isgm; $message =~ s/\[url=\s*(.+?)\s*\]\s*(.+?)\s*\[\/url\]/format_url2($1, $2)/eisgm; $message =~ s/\[url\]\s*(\S+?)\s*\[\/url\]/format_url3($1)/eisgm; $message =~ s/(dereferer\;url\=http\:\/\/.*?)\x23(\S+?\")/$1;anch=$2/isgm; if ($autolinkurls) { $message =~ s/\[url\]\s*([^\[]+)\s*\[\/url\]/[url]$1\[\/url]/gsm; $message =~ s/\[link\]\s*([^\[]+)\s*\[\/link\]/[link]$1\[\/link]/gsm; $message =~ s/\[news\](\S+?)\[\/news\]/$1<\/a>/isgm; $message =~ s/\[gopher\](\S+?)\[\/gopher\]/$1<\/a>/isgm; $message =~ s/">/\x22>/gxsm; $message =~ s/(\[\*\])/ $1/gsm; $message =~ s/(\[\/list\])/ $1/gsm; $message =~ s/(\[\/td\])/ $1/gsm; $message =~ s/(\[\/td\])/ $1/gsm; $message =~ s/\\S+?\<\/\S+?\>)]+?)\.(?:[\w\~\.\;\:\,\$\-\+\!\*\?\/\=\&\@\#\%\(\)\[\]\x80-\xFF]{1,})+?)/format_url($1,$2)/eisgm; $message =~ s/([^\"\=\[\]\/\:\.\-(\:\/\/\w+)]|[\n\b]|\"\;|\[quote.*?\]|\[edit\]|\[highlight\]|\[\*\]|\[td\]|\A|\()\\*(www\.[^\.](?:[\w\~\;\:\,\$\-\+\!\*\?\/\=\&\@\#\%\(\)\[\](?:\<\S+?\>\S+?\<\/\S+?\>)]+?)\.(?:[\w\~\.\;\:\,\$\-\+\!\*\?\/\=\&\@\#\%\(\)\[\]\x80-\xFF]{1,})+?)/format_url($1,$2)/eisgm; $message =~ s/\$2<\/a>/isgm; $message =~ s/\[url=\s*(.+?)\]\s*(.+?)\s*\[\/url\]/$2<\/a>/isgm; $message =~ s/\[link\]\s*www\.\s*(.+?)\s*\[\/link\]/www.$1<\/a>/isgm; $message =~ s/\[link=\s*(\w+\:\/\/.+?)\](.+?)\s*\[\/link\]/$2<\/a>/isgm; $message =~ s/\[link=\s*(.+?)\]\s*(.+?)\s*\[\/link\]/$2<\/a>/isgm; $message =~ s/\[link\]\s*(.+?)\s*\[\/link\]/$1<\/a>/isgm; $message =~ s/\[ftp\]\s*(.+?)\s*\[\/ftp\]/$1<\/a>/isgm; } else { $message =~ s/\[url=\s*(\S\w+\:\/\/\S+?)\s*\](.+?)\[\/url\]/$2<\/a>/isgm; $message =~ s/\[url=\s*(\S+?)\](.+?)\s*\[\/url\]/$2<\/a>/isgm; $message =~ s/\[link\]\s*www\.(\S+?)\s*\[\/link\]/www.$1<\/a>/isgm; $message =~ s/\[link=\s*(\S\w+\:\/\/\S+?)\s*\](.+?)\[\/link\]/$2<\/a>/isgm; $message =~ s/\[link=\s*(\S+?)\](.+?)\s*\[\/link\]/$2<\/a>/isgm; $message =~ s/\[link\]\s*(\S+?)\s*\[\/link\]/$1<\/a>/isgm; $message =~ s/\[ftp\]\s*(ftp:\/\/)?(.+?)\s*\[\/ftp\]/$1$2<\/a>/isgm; } ## code moved ## $message =~ s/\[email\]\s*(\S+?\@\S+?)\s*\[\/email\]/$1<\/a>/isgm; $message =~ s/\[email=\s*(\S+?\@\S+?)\](.*?)\[\/email\]/$2<\/a>/isgm; local *editsmsg = sub { my ($edittext) = @_; $formedit = qq~$post_txt{'603'}:
$1
~; return $formedit; }; while ( $message =~ s/\[edit\]\n*(.*?)\n*\[\/edit\]/editsmsg($1)/eisgm ) { } $message =~ s/\/me\s+(.*)/* $displayname<\/span> $1/igxsm; if ( $message =~ /\[media/sm || $message =~ /\[flash/sm ) { require Sources::MediaCenter; $message =~ s/\[flash\](.*?)\[\/flash\]/\[media\]$1\[\/media\]/isgm; # convert old flash tags to media tags while ( $message =~ s/\[flash\s*(.*?)\]\n*(.*?)\n*\[\/flash\]/flashconvert($2,$1)/eisgm ) { } # convert old flash tags to media tags while ( $message =~ s/\[media\]\n*(.*?)\n*\[\/media\]/myembed($1)/eisgm ) { } while ( $message =~ s/\[media\s*(.*?)\]\n*(.*?)\n*\[\/media\]/myembed($2,$1)/eisgm ){ } $message =~ s/media:/http:/igxsm; } if ( $guest_media_disallowed && $iamguest ) { if ($action) { $act = qq~;sesredir=action\~$action~; } else { $act = qq~;sesredir=num\~$curnum~; } my $oops = qq~ $maintxt{'41'}
$maintxt{'34'}~; if ( $regtype ) { $oops .= qq~ $maintxt{'42'} $maintxt{'97'}~; } $oops .= qq~ $maintxt{'42a'}~; $showattach = q{}; $showattachhr = q{}; $attachment =~ s//[oops]/gsm; $attachment =~ s/\[oops\]/$oops/gsm; if ( !$movedflag ) { $message =~ s//[oops]/gsm; $message =~ s/\[oops\]/$oops/gsm; } $message = MakeSmileys($message); $message =~ s/\s*\[\*\]/<\/li>
  • /isgm; $message =~ s/\[olist\]/
      /isgm; $message =~ s/\s*\[\/olist\]/<\/li><\/ol>/isgm; $message =~ s/<\/li>
        /
          /isgm; $message =~ s/
            <\/li>/
              /isgm; $message =~ s/\[list\]/
                /isgm; $message =~ s/\[list (.+?)\]/
                  /isgm; $message =~ s/\s*\[\/list\]/<\/li><\/ul>/isgm; $message =~ s/<\/li>
                    /
                      /isgm; $message =~ s/
                        <\/li>/
                          /isgm; $message =~ s/<\/li>
                            /
                              /isgm; $message =~ s/
                                <\/li>/
                                  /isgm; $message =~ s/\[pre\](.+?)\[\/pre\]/'
                                  ' . dopre($1) . '<\/pre>'/isegm;
                                  
                                      if ( $message =~ m/\[table\](?:.*?)\[\/table\]/ism ) {
                                          while ( $message =~
                                  s/(.*?)\[table\](.*?)\[\/table\](.*?)<\/marquee>/$1$2<\/table>$3<\/marquee>/sm ) { }
                                          while ( $message =~
                                  s/(.*?)\[table\](.*?)<\/marquee>(.*?)\[\/table\]/$1\[\/\/table\]$2<\/marquee>$3\[\/\/table\]/sm ) { }
                                          while ( $message =~
                                  s/\[table\](.*?)(.*?)\[\/table\](.*?)<\/marquee>/\[\/\/table\]$1$2\[\/\/table\]$3<\/marquee>/sm ) { }
                                          $message =~
                                  s/\n{0,1}\[table\]\n*(.+?)\n*\[\/table\]\n{0,1}/
                                  $1<\/table>/isgm; while ( $message =~ s/\(.*?)\n*\[tr\]\n*(.*?)\n*\[\/tr\]\n*(.*?)\<\/table\>/
                                  $1$2<\/tr>$3<\/table>/ism ) { } while ( $message =~ s/\(.*?)\n*\[td\]\n{0,1}(.*?)\n{0,1}\[\/td\]\n*(.*?)\<\/tr\>/$1
                                  $2<\/td>$3<\/tr>/ism ) { } $message =~ s/((?:(?!|<\/tr>|
                                  |<\/td>||<\/table>).)*)/
                                  /isgm; $message =~ s/((?:(?!|<\/tr>|
                                  |<\/td>||<\/table>).)*)|<\/tr>|
                                  /
                                  /isgm; $message =~ s/<\/td>((?:(?!
                                  |<\/td>||<\/table>).)*)|<\/tr>|
                                  /<\/td>/isgm; $message =~ s/<\/td>((?:(?!
                                  |<\/td>||<\/table>).)*)<\/tr>/<\/td><\/tr>/isgm; $message =~ s/<\/td>((?!|<\/tr>|
                                  |<\/td>||<\/table>).*?)|<\/tr>|
                                  /<\/td>/isgm; $message =~ s/<\/td>((?!
                                  |<\/td>||<\/table>).*?)<\/tr>/<\/td><\/tr>/isgm; $message =~ s/<\/tr>((?:(?!|<\/tr>|
                                  |<\/td>||<\/table>).)*)/<\/tr>/isgm; $message =~ s/<\/tr>((?:(?!|<\/tr>|
                                  |<\/td>||<\/table>).)*)<\/table>/<\/tr><\/table>/isgm; } while ( $message =~ s/]*?)\n([^>]*)>//sm ) { } while ( $message =~ s/]*)>([^<]*?)\n([^<]*)<\/a>/$2$3<\/a>/sm ) { } while ( $message =~ s/]*?)&([^>]*)>//sm ) { } $message =~ s/\[\&table(.*?)\]//gsm; $message =~ s/\[\/\&table\]/<\/table>/gsm; $message =~ s/\n/
                                  /igsm; $message =~ s/\[code_br\]/\n/igsm; $message =~ s/\[code_qgt\]/">/igsm; return $message; } sub DoUBBCTo { # Does UBBC to $_[0] using DoUBBC and keeps $message the same ($message) = @_; my $messagecopy = $message; DoUBBC(); my $returnthis = $message; $message = $messagecopy; return $returnthis; } 1;