Автор Гілка: RSS закладка не грузиться!  (Прочитано 6108 раз)

zzandy

  • Гість
Добридень, панове,

вже не в перше, збоїть RSS закладка. Пише наступне:

Помилка синтаксичного аналізу XML: невизначена суть
Адреса: http://linux.org.ua/cgi-bin/yabb/yabb2rss?group=novyny&body=1&cdata=1
Рядок 23, символ 16:
<title>Вийшов &nbsp;9-й номер Інтернет журналу Root#UA.</title>
---------------^

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #1 : 2006-07-27 12:19:20 »
Поправив текст повідомлення.

Можливо ви зможете допомогти знайти помилку в коді?

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{&nbsp;}{}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/\[/&#91;/g;  $txt=~s/\]/&#93;/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{\&nbsp;}{ }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 мене обматюкав, коли я вставий цей код. Сказав щоб я не використовував російську мову на цьому форумі.  :-?
« Змінено: 2006-07-27 18:53:00 від lvm »
[Fedora Linux]

zzandy

  • Гість
Re: RSS закладка не грузиться!
« Відповідей #2 : 2006-07-27 17:59:14 »
Вибачте, в мене алергія на perl, але як і в попередні рази проблема в тому, що в заголовки новин потрапляють html-сутності (entities, якто &nbsp;). Можливо, треба $subject обгортати в <![CDATA[ або фільтрувати всі сутності, або якось прилінкувати до xml DTD з html-сутностями.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #3 : 2006-07-27 18:57:33 »
Вибачте, в мене алергія на perl, але як і в попередні рази проблема в тому, що в заголовки новин потрапляють html-сутності (entities, якто &nbsp;). Можливо, треба $subject обгортати в <![CDATA[

Цитую довідку скрипта:
Цитата
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

Цитата
або фільтрувати всі сутності,
>:(

Цитата
або якось прилінкувати до xml DTD з html-сутностями.
Це цікавіше. Треба пошукати в інеті подібні рішення.
[Fedora Linux]

zzandy

  • Гість
Re: RSS закладка не грузиться!
« Відповідей #4 : 2006-07-27 20:13:02 »
Так я не про body кажу (воно то як раз обгортається), а про subject.

На скільки я розумію, проблему з &nbsp; можна вирішити, включивши у xsl наступне:
<!DOCTYPE <кореневий елемент> [
       <!ENTITY nbsp  "&#160;" >
]>

Відсутній GoldenOnline

  • Новачок
  • *
  • дописів: 3
  • Карма: +0/-0
Re: RSS закладка не грузиться!
« Відповідей #5 : 2006-09-06 13:12:59 »
Шановне панство!
Прошу вибачення що втручаюсь. Особисто я не є знавцем Perl, тому, нажаль, не можу допомогти знайти помилку в скріпті.
Проте я спробував перевірити обидві ленти в w3c validator й валідатор виявив помилки в обох. Можливо інформація з валідатора буде корисна для виправлення RSS - зараз RSSOwl не завантажує RSS з Linux.org.ua взагалі.
http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Flinux.org.ua%2Fcgi-bin%2Fyabb%2Fyabb2rss%3Fgroup%3Dnovyny
« Змінено: 2006-09-06 13:14:52 від GoldenOnline »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
[Fedora Linux]

Відсутній GoldenOnline

  • Новачок
  • *
  • дописів: 3
  • Карма: +0/-0
Re: RSS закладка не грузиться!
« Відповідей #7 : 2006-09-06 18:01:27 »
Це вже добре  :)
А як щодо повної версії?

Цитата
Sorry

This feed does not validate.

Source: http://linux.org.ua/cgi-bin/yabb/yabb2rss?group=novyny&body=yes&encoding=utf-8

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #8 : 2006-09-06 18:11:08 »
Так я не про body кажу (воно то як раз обгортається), а про subject.

На скільки я розумію, проблему з &nbsp; можна вирішити, включивши у xsl наступне:
<!DOCTYPE <кореневий елемент> [       <!ENTITY nbsp  "&#160;" >]>

Проблема в тому, що можна використати лише один !DOCTYPE.

Я можу скопіювати і вставити в rss вміст DTD з http://my.netscape.com/publish/formats/rss-0.91.dtd (до речі, там вже описано nbsp) але я не впенений чи це гарна ідея.  :-/

Як альтернативу, я використав заміну &nbsp; на &#160;.
« Змінено: 2006-09-06 18:17:02 від lvm »
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #9 : 2006-09-06 18:20:26 »
Це вже добре  :)
А як щодо повної версії?

Цитата
Sorry

This feed does not validate.

Source: http://linux.org.ua/cgi-bin/yabb/yabb2rss?group=novyny&body=yes&encoding=utf-8

Якщо додати параметр "cdata=1" то все валідується.
[Fedora Linux]

Відсутній GoldenOnline

  • Новачок
  • *
  • дописів: 3
  • Карма: +0/-0
Re: RSS закладка не грузиться!
« Відповідей #10 : 2006-09-06 19:21:22 »
Дуже дякую - все працює!  :D
останнє запитання - чому б ці параметри не додати апріорі?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #11 : 2006-09-07 13:02:54 »
Дуже дякую - все працює!  :D
останнє запитання - чому б ці параметри не додати апріорі?
Текст повідомлення потрібен не всім. Перекодування з koi8-u в utf-8 уповільнює скрипт. Якщо включати текст повідомлення в cdata, то не працює перегляд безпосередньо в Firefox (через XSL Stylesheet).
« Змінено: 2006-09-07 13:03:40 від lvm »
[Fedora Linux]

zzandy

  • Гість
Re: RSS закладка не грузиться!
« Відповідей #12 : 2006-09-13 11:00:17 »
Не хочу ніого напружувати, але ЗНОВУ НЕ ГРУЗИТЬСЯ RSS. На цей раз щось нове: Misconfiguretion error.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: RSS закладка не грузиться!
« Відповідей #13 : 2006-09-26 12:26:46 »
Не хочу ніого напружувати, але ЗНОВУ НЕ ГРУЗИТЬСЯ RSS. На цей раз щось нове: Misconfiguretion error.

Злапав Михайла в асьці й зміг поправити. Але перекодування з KOI8-U в інші кодування довелося вимкнути, так як там зараз немає потрібного модуля.
[Fedora Linux]

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: RSS закладка не грузиться!
« Відповідей #14 : 2007-12-24 21:41:19 »
Залишок гілки відрізано, тепер він тут.