Поправив текст повідомлення.
Можливо ви зможете допомогти знайти помилку в коді?
yabb2rss:
#!/usr/bin/perl -T
#use CGI::Debug;
use strict;
use CGI qw/param/;
use Text::Iconv;
require "./bbcode.pl";
if(param('help'))
{
print <<HELP;
Content-type: text/plain; charset=UTF-8
Usage:
yabb2rss?group=NAME[&group=NAME2&...][&body=yes[&cdata=yes]]
NAME group (board) ID
body=0 don\'t include message body into RSS (default)
body=1 include message body into RSS
cdata=0 don\'t include body into <![CDATA[ ]]> brackets
(default, to work around of the bug in XSLT converter in Mozilla).
cdata=1 include body into <![CDATA[ ]]> brackets
encoding convert text to another encoding , eg. encoding=UTF-8
HELP
exit(0);
}
my @groups=param('group');
my $withDescriptions=param('body');
my $cdata=param('cdata');
my $encoding=param('encoding');
if($encoding ne '' && $encoding=~m/^([a-zA-Z0-9-]+)$/)
{
$encoding=$1;
}else
{
$encoding='koi8-u';
}
my $converter;
if($encoding)
{
$converter=Text::Iconv->new("koi8-u",$encoding);
}
#Для відлагодки
if(scalar(@groups)==0)
{
@groups=qw( test_ph );
}
@groups=map { /([a-zA-Z0-9_]+)/; $1} @groups;
my $boardsdir="Boards";
my $messagesdir="Messages";
print "Content-Type: text/xml; encoding=$encoding\r\n\r\n";
my $doctype='<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd" >';
$doctype='' if(scalar(@groups)>1 or ($withDescriptions and not $cdata));
print <<HEADER;
<?xml version="1.0" encoding="$encoding" ?>
<?xml-stylesheet type="text/xsl" href="/include/rss-view.xsl"?>
$doctype
<rss version="0.91">
HEADER
for my $group(@groups)
{
open(DESC,"<$boardsdir/$group.dat");
my $title=<DESC>; chomp $title;
my $description=<DESC>; chomp $description;
#Конвертує заголовок та текст у вибране кодування
if($encoding)
{
$title=$converter->convert($title);
$description = $converter->convert($description);
}
close(DESC);
print <<CHANEL_HEADER;
<channel>
<title>$title</title>
<link>http://linux.org.ua/cgi-bin/yabb/YaBB.pl?board=$group</link>
<description>$description</description>
<language>uk-ua</language>
<copyright>Copyright 2004, linux.org.ua community</copyright>
<managingEditor>lvm\@mystery.lviv.net</managingEditor>
<webMaster>lvm\@mystery.lviv.net</webMaster>
<image>
<title>linux.org.ua</title>
<url>http://linux.org.ua/lambada-icons/linux-org-ua.gif</url>
<link>http://linux.org.ua/</link>
<width>88</width>
<height>31</height>
</image>
CHANEL_HEADER
#Read posts headers
#FIXME: Мабуть не варто читати більше сотні заголовків за раз
open(POSTS,"<$boardsdir/$group.txt");
my @posts=<POSTS>;
close(POSTS);
@posts=sort {(split('\|',$b,2))[0] <=> (split('\|',$a,2))[0]} @posts;
#Display posts
my $count=0;
for my $line(@posts)
{
chomp $line;
my ($ctime,$subject,$userName,$userEmail,$date,$replies,$login,$icon,$deleted)=split('\|',$line);
next if($deleted);
last if($count++>=10);
$replies.=' '.plural($replies,"коментар","коментарі","коментарів");
my $dateStr=ukrDate($ctime);
if($encoding)
{
$replies=$converter->convert($replies);
$dateStr=$converter->convert($dateStr);
$subject=$converter->convert($subject);
}
if($withDescriptions)
{#Просять включати тіло новини
#Read post body
open(MESSAGES,"<$messagesdir/$ctime.txt");
my $firstMessage=<MESSAGES>;
close(MESSAGES);
my ($subject2,$userName2,$userEmail2,$date2,$login2,$icon2,$attach,$ip,$body,$ns,$mlm,$mlmb,$msf,$mfn)=split('\|',$firstMessage,11);
$body = parseBBCode($body);
$body=~s{(<br />)?<hr />(.*)$}{"<br /><a href=\"YaBB.pl?board=$group;action=display;num=$ctime\" class=\"tail\">...(".length($2)." ".plural(length($2),"символ","символи","символів").").</a>"}se;
$body=~s{ }{}se;
if($encoding)
{
$body = $converter->convert($body);
}
#Просять взяти тіло повідомлення в лапки, як по стандарту
$body="<![CDATA[$body]]>" if($cdata);
print <<ITEM;
<item>
<title>$subject</title>
<link>http://linux.org.ua/cgi-bin/yabb/YaBB.pl?board=$group;action=display;num=$ctime</link>
<description>$body</description>
</item>
ITEM
}else
{
print <<ITEM;
<item>
<title>$subject</title>
<link>http://linux.org.ua/cgi-bin/yabb/YaBB.pl?board=$group;action=display;num=$ctime</link>
</item>
ITEM
}
}
print <<CHANEL_FOOTER;
</channel>
CHANEL_FOOTER
}
print <<FOOTER;
</rss>
FOOTER
bbcode.pl
#!/usr/bin/perl -wT
use strict;
my %bbtags=(
'[b]'=>'<b>', '[/b]'=>'</b>',
'[i]'=>'<i>', '[/i]'=>'</i>',
'[u]'=>'<u>', '[/u]'=>'</u>',
'[s]'=>'<strike>', '[/s]'=>'</strike>',
'[tt]'=>'<code>', '[/tt]'=>'</code>',
'[sub]'=>'<sub>', '[/sub]'=>'</sub>',
'[sup]'=>'<sup>', '[/sup]'=>'</sup>',
'[table]'=>'<table>', '[/table]'=>'</table>',
'[tr]'=>'<tr>', '[/tr]'=>'</tr>',
'[td]'=>'<td>', '[/td]'=>'</td>',
'[quote]'=>'<br /><b>Цитата:</b><div class="msgBody_quote">', '[/quote]'=>'</div>',
'[pre]'=>'<pre>', '[/pre]'=>'</pre>',
'[left]'=>'<div align="left">', '[/left]'=>'</div>',
'[center]'=>'<div align="center">', '[/center]'=>'</div>',
'[right]'=>'<div align="right">', '[/right]'=>'</div>',
'[hr]'=>'<hr />',
'[br]'=>'<br />',
'[black]'=>'<span style="color:black">', '[/black]'=>'</span>',
'[white]'=>'<span style="color:white">', '[/white]'=>'</span>',
'[red]'=>'<span style="color:red">', '[/red]'=>'</span>',
'[green]'=>'<span style="color:green">', '[/green]'=>'</span>',
'[blue]'=>'<span style="color:blue">', '[/blue]'=>'</span>',
);
my %smilleys=(
':)'=>'smiley',
';)'=>'wink',
':D'=>'cheesy',
';D'=>'grin',
'>:('=>'angry',
':('=>'sad',
':o'=>'shocked',
'8)'=>'cool',
'::)'=>'rolleyes',
':P'=>'tongue',
':-['=>'embarassed',
':-X'=>'lipsrsealed',
':-/'=>'undecided',
':-*'=>'kiss',
':\'('=>'cry'
);
sub plural
{
my ($n,$f1,$f2,$f3)=@_;
my $remainder=$n%10;
my $remainder2=$n%100;
return $f3 if($remainder==0 || ($remainder2>=5 && $remainder2<=20));
return $f1 if($remainder==1);
return $f2 if($remainder>=2 && $remainder<=4);
return $f3;
}
sub parseListItems
{
my $txt=shift;
$txt=~s/\[\*\]/<li>/;
$txt=~s/\[\*\]/<\/li><li>/g;
$txt.='</li>';
return $txt;
}
sub prepareCode
{
my $txt=shift;
$txt=~s/\[/[/g; $txt=~s/\]/]/g;
return $txt;
}
sub insertWbrs
{
my $line=shift;
$line=~s{([^\s]{40})}{$1<wbr/>}g;
$line=~s{(\&[a-z0-9#]*)(<wbr/>)([a-z0-9#]*;)}{$1$3$2}gi;
return $line;
}
sub parseBBCode
{
my $body=shift;
$body=~s{\ }{ }g;
$body=~s{\[code\](.*?)\[/code\]}{'<br /><b>Код:</b><div class="msgBody_code">'.prepareCode($1).'</div>'}gse;
$body=~s{(\[/?(b|i|u|s|quote|pre|left|center|right|hr|sub|sup|tt|table|tr|td|black|white|green|red|blue)\])}{$bbtags{$1}}ge;
$body=~s~([^\w\"\=\[\]\<]|[\n\b]|\A)\\*(\w+://[\w\~\.\;\:\,\$\-\+\!\*\?/\=\&\@\#\%]+\.[\w\~\;\:\$\-\+\!\*\?/\=\&\@\#\%]+[\w\~\;\:\$\-\+\!\*\?/\=\&\@\#\%])~$1<a href="$2">$2</a>~isg;
$body=~s{\[url\]([a-zA-Z0-9]+://[^\[]*)\[/url\]}{<a href="$1">$1</a>}g;
$body=~s{\[url\]([^\[]*)\[/url\]}{<a href="http://$1">$1</a>}g;
$body=~s{\[ftp\]([a-zA-Z0-9]+://[^\[]*)\[/ftp\]}{<a href="$1">$1</a>}g;
$body=~s{\[ftp\]([^\[]*)\[/ftp\]}{<a href="ftp://$1">$1</a>}g;
$body=~s{\[email\]([^\[]*)\[/email\]}{<a href="mailto:$1">$1</a>}g;
$body=~s{\[img\]([^\[]*)\[/img\]}{<img src="$1" alt="$1" border="0" />}g;
$body=~s{\[list\](.*?)\[/list\]}{"<ul>".parseListItems($1)."</ul>"}gse;
$body=~s{\[(color)=([^\[\]]*)\](.*?)\[\/\1\]}{<span style="$1:$2;">$3</span>}gs;
$body=~s{\[(font)=([^\[\]]*)\](.*?)\[\/\1\]}{<span style="$1:$2;">$3</span>}gs;
$body=~s{\[size=([^\[\]]*)\](.*?)\[\/size\]}{<font size="$1">$2</font>}gs;
$body=~s{\[link=([^\[\]]*://[^\[\]]*)\](.*?)\[\/link\]}{<a href="$1">$2</a>}gs;
$body=~s{\[link=([^\[\]]*)\](.*?)\[\/link\]}{<a href="http://$1">$2</a>}gs;
$body=~s{\[url=([^\[\]]*://[^\[\]]*)\](.*?)\[\/url\]}{<a href="$1">$2</a>}gs;
$body=~s{\[url=([^\[\]]*)\](.*?)\[\/url\]}{<a href="http://$1">$2</a>}gs;
$body=~s{(\W|\A)(\:\)|;\)|:D|;D|>:\(|:\(|:o|8\)|::\)|:P|:-\[|:-X|:-/|:-\*|:\'\()}{"$1<img src=\"/yabbfiles/Templates/Forum/default/".$smilleys{$2}.".gif\" alt=\"$2\" title=\"$2\" />"}ge;
$body=~s/\[ch(\d{3,}?)\]/&#$1;/ig;
return $body;
}
my @weekDays=("неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота","неділя");
my @months=qw(січня лютого березня квітня травня червня липня серпня вересня жовтня листопада грудня);
sub ukrDate
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(shift);
$year+=1900;
$min="0$min" if($min<10);
$hour="0$hour" if($hour<10);
return "$weekDays[$wday], $mday $months[$mon] $year $hour:$min";
}
1;
PS.
Мій JS в FF мене обматюкав, коли я вставий цей код. Сказав щоб я не використовував російську мову на цьому форумі. :-?